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.
| Parameter | Value |
|---|---|
| Field separator | ; |
| Encoding | ISO-8859-1 / Windows-1252 |
| Dates | DD/MM/YYYY |
| Decimal separator | , |
| Line ending | CRLF |
| Row 1 | column 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.
| Slug | Sodiwin source table | Purpose |
|---|---|---|
base-articles | BaseArticles | Product catalog — every SKU, brand, unit, pricing tier, stock-keeping flag |
base-clients | BaseClients | Customer master — contacts, billing, payment terms, routing, statistics |
base-prospects | BaseProspects | Prospect master — pre-customer records not yet converted to a BaseClients row |
base-fournisseurs | BaseFournisseurs | Supplier master — contacts, banking, factoring, purchasing stats |
base-collab | baseCollab | Internal staff roster — sales reps, purchasing agents, drivers, identities referenced by other tables |
base-tarifs | baseTarifs | Customer-specific pricing overrides layered on top of catalog prices |
base-objectif | baseObjectif | Sales objectives per rep, per customer, per period |
base-stocks-dep | basestocksdep | Stock levels per depot — live quantities across Sodimo warehouses |
base-lots-dep | BaseLotsdep | Stock lots per depot — batch and lot-level traceability for regulated products |
base-devis | BaseDevis | Sales quotes — drafts and sent, including expired and refused |
base-commandes-ventes | BaseCommandesVentes | Sales orders — order headers and lines, including cancelled |
base-bon-livraison | BaseBonLivraison | Delivery notes — what physically shipped, per customer, per date |
base-ventes | Baseventes | Sales ledger — invoiced revenue, posted to accounting |
base-encours | Baseencours | Accounts receivable — outstanding amounts by customer and aging bucket |
base-commandes-achat | BaseCommandesAchat | Purchase orders — order headers and lines to suppliers |
base-receptions | BaseReceptions | Goods receipts — what physically arrived from suppliers |
base-achats | Baseachats | Purchases ledger — posted supplier invoices |
base-demande-de-prix | BaseDemandeDePrix | Request-for-quote records to suppliers |
base-echeances | Baseecheances | Payment due dates — customer and supplier installments |
base-reglements | baseReglements | Payments received and issued — matched against Baseecheances |
recettes-par-niveau | recettes_par_niveau | Revenue 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).