[{"data":1,"prerenderedAt":295},["ShallowReactive",2],{"navigation_docs_en":3,"-en-architecture-stack":78,"-en-architecture-stack-surround":290},[4,14,40,54,60,66,72],{"title":5,"path":6,"stem":7,"children":8},"The essentials","/en/proposition","en/1.proposition/1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Your need, understood","/en/proposition/comprehension","en/1.proposition/2.comprehension",{"title":15,"path":16,"stem":17,"children":18},"Overview","/en/architecture","en/2.architecture/1.index",[19,20,24,28,32,36],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23},"Technical choices","/en/architecture/stack","en/2.architecture/2.stack",{"title":25,"path":26,"stem":27},"Security & compliance","/en/architecture/securite","en/2.architecture/3.securite",{"title":29,"path":30,"stem":31},"The modules","/en/architecture/modules","en/2.architecture/4.modules",{"title":33,"path":34,"stem":35},"Partner integration","/en/architecture/partenaires","en/2.architecture/5.partenaires",{"title":37,"path":38,"stem":39},"Information system","/en/architecture/systeme-information","en/2.architecture/6.systeme-information",{"title":41,"path":42,"stem":43,"children":44},"The plan","/en/roadmap","en/4.roadmap/1.index",[45,46,50],{"title":41,"path":42,"stem":43},{"title":47,"path":48,"stem":49},"The method","/en/roadmap/methodologie","en/4.roadmap/2.methodologie",{"title":51,"path":52,"stem":53},"The budget","/en/roadmap/budget","en/4.roadmap/3.budget",{"title":55,"path":56,"stem":57,"children":58},"Vortex-Soft","/en/equipe","en/5.equipe/1.index",[59],{"title":55,"path":56,"stem":57},{"title":61,"path":62,"stem":63,"children":64},"Specification","/en/cdc","en/6.cdc/1.index",[65],{"title":61,"path":62,"stem":63},{"title":67,"path":68,"stem":69,"children":70},"Infrastructure","/en/infrastructure","en/7.infrastructure/1.index",[71],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75,"children":76},"Mockups","/en/maquette","en/8.maquette/1.index",[77],{"title":73,"path":74,"stem":75},{"id":79,"title":21,"badge":80,"body":81,"category":80,"description":283,"extension":284,"links":80,"meta":285,"navigation":287,"path":22,"seo":288,"stem":23,"tags":80,"__hash__":289},"docs_en/en/2.architecture/2.stack.md",null,{"type":82,"value":83,"toc":274},"minimark",[84,89,97,108,114,121,125,128,179,183,186,189,193,196,215,219],[85,86,88],"h2",{"id":87},"why-go-and-postgresql","Why Go and PostgreSQL",[90,91,92,96],"p",{},[93,94,95],"strong",{},"Go"," produces a single binary, with no virtual machine and no system dependencies: deploying and updating comes down to replacing one file. Its concurrency model is safe by construction, which matters when several counters write at once.",[90,98,99,102,103,107],{},[93,100,101],{},"PostgreSQL"," brings what an accounting system cannot do without: real ACID transactions, deferred constraints checked at ",[104,105,106],"code",{},"COMMIT",", row-level isolation in the database itself, and point-in-time recovery.",[90,109,110,113],{},[93,111,112],{},"Redis"," is only a fast path: idempotency, till locks, rate limiting. PostgreSQL remains the source of truth — if Redis goes down the system slows, it does not lie.",[90,115,116,117,120],{},"We use ",[93,118,119],{},"pgx and sqlc"," rather than an ORM. On financial code we want to read the SQL being executed, not guess it.",[85,122,124],{"id":123},"money-is-never-stored-as-a-floating-point-number","Money is never stored as a floating-point number",[90,126,127],{},"This is the detail that separates an accounting system from a management application.",[129,130,131,147,154,165,172],"ul",{},[132,133,134,135,138,139,142,143,146],"li",{},"Amounts are ",[93,136,137],{},"64-bit integers in minor units",". Never ",[104,140,141],{},"float64",", never ",[104,144,145],{},"REAL"," in the database.",[132,148,149,150,153],{},"Rates are ",[104,151,152],{},"NUMERIC(10,6)",".",[132,155,156,159,160,164],{},[93,157,158],{},"XAF and XOF have no decimal"," — the minor unit ",[161,162,163],"em",{},"is"," the franc. But commission rates produce fractions.",[132,166,167,168,171],{},"So every commission calculation produces a ",[93,169,170],{},"rounding remainder, explicitly posted"," to a dedicated account. Without it the balance drifts by one franc per operation, and three months later nobody knows where the gap came from.",[132,173,174,175,178],{},"No entry ever mixes two currencies: an XAF ↔ XOF conversion is ",[93,176,177],{},"two entries"," linked by an FX position account.",[85,180,182],{"id":181},"the-life-of-an-operation","The life of an operation",[184,185],"amtm-request-flow",{},[90,187,188],{},"Step 3 is the most important and the least visible: on an unstable network, it is what guarantees that a teller retrying after a dropped connection does not create a second operation.",[85,190,192],{"id":191},"degraded-mode-is-a-normal-case","Degraded mode is a normal case",[90,194,195],{},"The network will go down. The architecture treats that as normal, not exceptional:",[129,197,198,205,212],{},[132,199,200,201,204],{},"The counter is a ",[93,202,203],{},"PWA"," with a local queue; till and entry operations remain possible offline.",[132,206,207,208,211],{},"Every operation carries a ",[93,209,210],{},"client-generated UUID"," used as the idempotency key. On reconnection the server deduplicates natively — no exotic conflict resolution, no CRDTs.",[132,213,214],{},"Still barred while offline: any operation requiring real-time partner validation, and any breach of the local float ceiling.",[85,216,218],{"id":217},"what-we-do-not-use","What we do not use",[220,221,222,235],"table",{},[223,224,225],"thead",{},[226,227,228,232],"tr",{},[229,230,231],"th",{},"Ruled out",[229,233,234],{},"Why",[236,237,238,247,255,266],"tbody",{},[226,239,240,244],{},[241,242,243],"td",{},"Kafka / message bus",[241,245,246],{},"Oversized; one more piece of infrastructure to operate",[226,248,249,252],{},[241,250,251],{},"Micro-services",[241,253,254],{},"Operating cost with no return at this volume",[226,256,257,260],{},[241,258,259],{},"Elasticsearch",[241,261,262,265],{},[104,263,264],{},"pg_trgm"," is enough for fuzzy sanctions-list matching",[226,267,268,271],{},[241,269,270],{},"Kubernetes at launch",[241,272,273],{},"Docker on one server; migrate the day load justifies it",{"title":275,"searchDepth":276,"depth":276,"links":277},"",2,[278,279,280,281,282],{"id":87,"depth":276,"text":88},{"id":123,"depth":276,"text":124},{"id":181,"depth":276,"text":182},{"id":191,"depth":276,"text":192},{"id":217,"depth":276,"text":218},"Every technology justified by a constraint of your trade.","md",{"icon":286},"lucide:cpu",true,{"title":21,"description":283},"ErBvd8gI5tfnrjHsxLHHOWUpncY22mYWD2yQfFm4rZI",[291,293],{"title":15,"path":16,"stem":17,"description":292,"children":-1},"A modular monolith, sized to be operated without an ops team.",{"title":25,"path":26,"stem":27,"description":294,"children":-1},"Tamper-evident audit trail, split of duties, KYC/AML — the level your trade requires.",1787177558584]