015 — External Integrations and System Dependencies¶
Integration Landscape¶
flowchart TB
SYS["SAMTIA B2B Platform"]
subgraph RT["Runtime — required"]
PG[("PostgreSQL")]
FS[("Odoo filestore")]
SMTP[["SMTP relay"]]
end
subgraph HOST["Hosting"]
SH[["Odoo.sh"]]
CF[["Cloudflare Workers<br/>production portal"]]
REG[["Private Docker registry<br/>+ internal server 192.168.2.32"]]
end
subgraph BUILD["Build / delivery only"]
GIT[["Git — B2B submodule + ERP repo"]]
GH[["GitHub — CI/CD trigger"]]
AZ[["Azure DevOps — PRs"]]
end
SYS --> PG
SYS --> FS
SYS --> SMTP
SYS -.-> SH
SYS -.-> CF
SYS -.-> REG
SYS -.-> GIT
SYS -.-> GH
SYS -.-> AZ
There are no inbound third-party integrations. No payment gateway, no ERP-to-ERP feed, no shipping carrier, no analytics SDK, no external identity provider. The platform is self-contained: Odoo is the system of record, and the portal is its only client.
The single outbound runtime dependency is SMTP.
Runtime Dependencies¶
| Dependency | Criticality | Used for | Failure impact |
|---|---|---|---|
| PostgreSQL | Fatal | All persistence | Platform down |
| Cloudflare Workers | Fatal (production only) | Serves the live portal at b2b.samtia.com |
The production storefront and AMP are unreachable; the Odoo ERP Back Office and the non-production portals are unaffected |
| Odoo filestore | Fatal | Product media, attachments, generated PDFs | Images and documents fail; orders still work |
| SMTP relay | High | Password-reset codes, invitations, quotation delivery, account-manager alerts | Self-service password reset and invitations stop working; quotations are still created but not delivered by e-mail |
| Odoo bus / WebSocket endpoint | Medium | Chat, presence, live notifications | Real-time features degrade; REST paths are unaffected |
Platform Dependencies¶
| Dependency | Version / detail | Notes |
|---|---|---|
| Odoo | 19.0 | Community modules only in the dependency list |
Python package qrcode |
— | Declared as an external dependency; required for invitation QR generation |
wkhtmltopdf |
— | Standard Odoo requirement for the quotation and invitation PDFs |
| Node.js | Next.js 15 / React 19 toolchain | Build-time |
| Docker + buildx | linux/amd64 target |
Portal builds run from Apple Silicon via buildx |
Odoo modules depended on¶
base · mail · portal · product · website_sale · sale · crm · contacts ·
calendar · im_livechat · spreadsheet_dashboard · partnership
partnership is the least obvious: its res.partner.grade model is reused as Customer
Segments, the platform's customer segmentation and default-pricing dimension.
Optional companion module¶
lp_auto_refresh — not a declared dependency. Without it the ERP Back Office auto-refresh bus
messages are emitted and ignored; lists simply do not refresh on their own.
Frontend Third-Party Libraries (production bundle)¶
| Library | Purpose |
|---|---|
| Next.js 15 / React 19 | Application framework |
| Zustand | State management |
| Axios | HTTP client |
| PrimeReact + PrimeIcons | Data tables, menus, icons |
| Radix UI | Accessible primitives (dialog, select, dropdown, checkbox, radio, tooltip, label) |
| Tailwind CSS 4 | Styling |
| TanStack React Query | Async data utilities |
| Framer Motion | Animation |
| Konva / react-konva / use-image | Canvas-based image handling |
| Quill | Rich-text editing |
| XLSX | Spreadsheet export |
| Zod | Schema validation |
| date-fns | Date handling |
| react-i18next | Present as a dependency; the portals ship English only and no translation catalogue is loaded |
| lucide-react / react-icons | Icon sets |
Dev-time only: ESLint, Prettier, Husky, lint-staged, commitlint, Vitest, Playwright, Storybook, Wrangler, OpenNext.
Delivery-Time Dependencies¶
| Dependency | Role |
|---|---|
| Git submodule relationship | The B2B module reaches Odoo.sh only through the ERP main repo |
| Odoo.sh | Builds, hosts and runs all five backend environments |
| Cloudflare Workers (OpenNext + Wrangler) | Hosts and continuously deploys the production portal at b2b.samtia.com. A runtime dependency, not just a build tool |
GitHub (LaplaceSoftware/next_ecommerce) |
The CI/CD trigger — a push to main rebuilds and redeploys production |
| Azure DevOps | Pull requests for both repos (no CLI integration — PR links are shared manually) |
Private Docker registry on 192.168.2.32 |
Serves portal images to the four non-production stacks |
Dependency Risk Register¶
| Risk | Exposure | Mitigation in place |
|---|---|---|
| Odoo.sh WebSocket gateway behaviour | Chat, presence and notifications break in ways that do not reproduce on-premises | Subscribe-first protocol, string-channel message mirroring, HTTP presence heartbeat, stale-presence cron |
| SMTP outage | Self-service password reset and invitations blocked | Login itself is unaffected; an administrator can reset a password from the ERP Back Office |
| Odoo major-version upgrade | Deep inheritance of sale.order, mail.message, discuss.channel, mail.presence |
Customisations are concentrated in a small number of models; the API envelope insulates the portal from ORM changes |
partnership module changes |
Customer segments and default pricing depend on it | Isolated to res.partner.grade usage |
| Two independently versioned halves | A portal build can outrun its backend | Release files record both head commits; deploy backend first |
| Ungated production CI/CD | A push to GitHub main reaches live customers within minutes, with no approval step, while the matching backend change still has three Odoo.sh promotions to clear |
Process only — validate on staging-b2b / pre-prod and confirm the backend has reached Odoo.sh production before pushing. Nothing in the pipeline enforces this |
| Two git remotes with different roles | Merging on Azure DevOps does not deploy; pushing to GitHub does | Documented in 014; no technical safeguard |
| Single shared database | A tenancy bug is a cross-customer data exposure | Mandatory company scoping in every API method (see 007) |