Chapter 11 / 40

Sodiwin schema — the 21 tables

Status: Planned — waiting for Florian to sign off on the spec and run the first nightly dump. The canonical specification is ~/sodimo/firstweek/friday-progress/email-jack-sodiwin-spec.md, sent to Jack on 2026-04-17.

Each table below is exported from Sodiwin as a full nightly snapshot. There is no incremental export, no filter, no commercial exclusion: if a row exists in Sodiwin it lands in the CSV. The file-format rules are fixed — changing any of them breaks every downstream parser.


File format.

ParameterValue
Field separator;
EncodingISO-8859-1 / Windows-1252
DatesDD/MM/YYYY
Decimal separator,
Line endingCRLF
Row 1column headers

Atomic deposit. Each file is uploaded as <name>.csv.partial, then renamed to <name>.csv once the transfer completes. The ETL never reads a .partial file — the rename is the commit. An empty table still gets a file (header row only); a missing file is treated as a failure and pages Paul.

Schedule. Nightly at 02:30 Europe/Paris, seven days a week. Deposit is expected to complete before 02:50. Three retries spaced 60 seconds apart; on final failure an email goes to paul@sodimo.eu with the log attached.


Path layout on the NAS.

/volume1/sodiwin-dumps/<slug>/<YYYY-MM-DD>_<slug>.csv

Example: /volume1/sodiwin-dumps/base-clients/2026-04-18_base-clients.csv.


The 21 tables. Slugs (folder and filename prefix) are English-lowercase-hyphenated; Sodiwin source-table names stay verbatim French — downstream tooling keys off the source names, so translating them would break the read path.

SlugSodiwin source tablePurpose
base-articlesBaseArticlesProduct catalog — every SKU, brand, unit, pricing tier, stock-keeping flag
base-clientsBaseClientsCustomer master — contacts, billing, payment terms, routing, statistics
base-prospectsBaseProspectsProspect master — pre-customer records not yet converted to a BaseClients row
base-fournisseursBaseFournisseursSupplier master — contacts, banking, factoring, purchasing stats
base-collabbaseCollabInternal staff roster — sales reps, purchasing agents, drivers, identities referenced by other tables
base-tarifsbaseTarifsCustomer-specific pricing overrides layered on top of catalog prices
base-objectifbaseObjectifSales objectives per rep, per customer, per period
base-stocks-depbasestocksdepStock levels per depot — live quantities across Sodimo warehouses
base-lots-depBaseLotsdepStock lots per depot — batch and lot-level traceability for regulated products
base-devisBaseDevisSales quotes — drafts and sent, including expired and refused
base-commandes-ventesBaseCommandesVentesSales orders — order headers and lines, including cancelled
base-bon-livraisonBaseBonLivraisonDelivery notes — what physically shipped, per customer, per date
base-ventesBaseventesSales ledger — invoiced revenue, posted to accounting
base-encoursBaseencoursAccounts receivable — outstanding amounts by customer and aging bucket
base-commandes-achatBaseCommandesAchatPurchase orders — order headers and lines to suppliers
base-receptionsBaseReceptionsGoods receipts — what physically arrived from suppliers
base-achatsBaseachatsPurchases ledger — posted supplier invoices
base-demande-de-prixBaseDemandeDePrixRequest-for-quote records to suppliers
base-echeancesBaseecheancesPayment due dates — customer and supplier installments
base-reglementsbaseReglementsPayments received and issued — matched against Baseecheances
recettes-par-niveaurecettes_par_niveauRevenue aggregated per hierarchy level — category, family, brand

Periscope — what each dump contains.

Every column of the source table, every row, no temporal filter. The full history is re-exported every night. No projection, no aggregation, no derived calculation — the files are raw Pervasive.SQL tables as they exist that morning.


Width of the main reference tables.

The Sodiwin export Florian shared on 2026-02-17 was a subset for three tables. The nightly dump must be wider than that reference. The spec lists the columns that must be included even though they were absent from the February file.

base-clients — reference: Sodiwin’s standard liste_tiers report (~130 columns). Thirty-five columns absent from the Feb 17 file must be included:

tel, tel2, tel4, fax, portable, contact2, contact3, edcont, iban, bic, rib, rum, rumdate, factor, cfactor, enfactor, ixnlat, ixnlng, abc, freqcmd, groupe, centrale, collectif, encde, enbl, entraite, encheque, reliquat, rfa, rfa1, rfa2, rfa3, rfac, rfac1, rfac2, rfac3, crfa1, crfa2, crfa3, phonefq, phonedate, phonepar, phoneobjet, rue1, rue2, rue3, siret, l0, l1, l2, l2a, nomfac, paysliv, lieufonc, lieufonc2, lieufonc3, tournee2, tourordre, condliv, datemodif, usermodif.

base-fournisseurs — same logic: full width of the supplier-side liste_tiers report.

base-articles — reference: full width of BaseArticles. Forty-seven columns absent from the Feb 17 file must be included, among them: rupture, sous_rupt, rup1, rup2, rup3, librup1, librup2, librup3, activit, cb_colis, c_profond, c_volume, codart2, nomart2.

General rule. Any column that appears in a standard Sodiwin report Sodimo uses today must appear in the corresponding table dump. If it is in liste_tiers, it is in base-clients. If it is in stats_articles, it is in base-articles. The February export is a reference point, not a whitelist.


Schema changes.

If Sodiwin renames, removes, or adds a column, Florian notifies Thomas by email before the change reaches production. Column additions pass through without breaking parsers. Renames and deletions break parsers and require coordinated handling on both sides.


Why this chapter is in the manual.

Sodiwin is a black box (Chapter 14). The 21 CSVs are the entire contract between Sodiwin and everything Sodimo runs downstream — D1, the AI layer, the CRM, the nightly brief. A change to this list or to the file format is the only event that can break the data pipeline from upstream; every other failure mode lives on our side and is recoverable from D1 Time Travel (Chapter 23).