Diagrammi dei flussi principali del sistema — Ultimo aggiornamento: 24/03/2026
Panoramica end-to-end: dai fornitori allo store Shopify.
flowchart LR
subgraph FORNITORI["Fornitori"]
IMA["IMA"]
FOC["Focelda"]
TDS["TD Synnex"]
XPR["Xpress"]
ESP["Esprinet"]
end
subgraph IMPORT["Import n8n"]
WF_IMP["Workflow Import\nschedulati"]
end
subgraph DATABASE["Database Supabase"]
PROD[("prodotti\n398K righe")]
MV[("prodotti_shopify\n47.7K prodotti")]
end
subgraph PRICING["Pricing 04:00/16:00"]
ALG["Algoritmo Pricing"]
end
subgraph SHOPIFY["Shopify 05:00/17:00"]
SYNC["Sync Prezzi e Stock"]
STORE["Store MonosTech"]
end
IMA --> WF_IMP
FOC --> WF_IMP
TDS --> WF_IMP
XPR --> WF_IMP
ESP --> WF_IMP
WF_IMP --> PROD
PROD --> ALG
ALG --> MV
MV --> SYNC
SYNC --> STORE
Sequenza completa della pipeline che gira alle 04:00 e alle 16:00.
flowchart TD
START(["04:00 / 16:00\nTrigger schedulato"]) --> PEAK{"Peak Mode\nattivo?"}
PEAK -->|Si| PEAK_RULES["Applica regole restrittive\naffidabilita maggiore 80%, lead time ridotto"]
PEAK -->|No| NORMAL["Regole normali"]
PEAK_RULES --> AUTO_HOLD
NORMAL --> AUTO_HOLD
AUTO_HOLD["fn_auto_risolvi_hold\nRisolvi HOLD piu vecchi di 3 giorni"] --> SNAPSHOT
SNAPSHOT["fn_snapshot_prezzi\nSalva delta variazioni"] --> CLEANUP
CLEANUP["fn_cleanup_storico\nPulizia dati oltre 365gg"] --> ANTIERR
ANTIERR["fn_controlli_anti_errore\nPS-01, PS-02, PS-03"] --> REFRESH
REFRESH["fn_refresh_e_rileva_cambiamenti\nREFRESH vista materializzata"] --> POST
POST["fn_controlli_post_pricing\nPS-04, PS-05"] --> KEEPA
KEEPA["fn_popola_keepa_coda\nAccoda EAN per Keepa"] --> LOG
LOG["fn_log_decisioni\nAudit trail 5%"] --> TELEGRAM
TELEGRAM["Report Telegram\nRiepilogo alert e stato"] --> END_P(["Fine"])
I 7 controlli automatici che proteggono da errori nei prezzi dei fornitori.
flowchart TD
PREZZO["Prezzo ricevuto\ndal fornitore"] --> PS01
PS01{"PS-01\nRange assoluto?"}
PS01 -->|Fuori range| PS01_ACT["CRITICAL\nFornitore escluso"]
PS01 -->|OK| PS02
PS02{"PS-02\nVariazione vs\nmedia 30gg?"}
PS02 -->|Oltre 40%| PS02_CRIT["CRITICAL\nFornitore escluso"]
PS02 -->|Oltre 25%| PS02_HOLD["HOLD\nPrezzo congelato"]
PS02 -->|OK| PS03
PS03{"PS-03\nOutlier vs\nmediana fornitori?"}
PS03 -->|Estrema + non in promo| PS03_ACT["CRITICAL\nFornitore escluso"]
PS03 -->|Estrema + in promo| PS03_INFO["INFO\nSolo log, non escluso"]
PS03 -->|Moderata| PS03_WARN["WARNING\nLog + alert"]
PS03 -->|OK| REFRESH_MV
REFRESH_MV["Refresh Vista Materializzata\nSelezione fornitore + calcolo prezzo"] --> PS04
PS04{"PS-04\nMargine almeno 9%?"}
PS04 -->|No| PS04_ACT["CRITICAL\nProdotto in DRAFT"]
PS04 -->|Si| PS05
PS05{"PS-05\nVariazione prezzo\nShopify?"}
PS05 -->|Oltre 20%| PS05_HOLD["HOLD\nPrezzo congelato"]
PS05 -->|Oltre 10%| PS05_WARN["WARNING\nLog + alert"]
PS05 -->|OK| PUBBLICA["Prezzo pubblicato\nsu Shopify"]
style PS01_ACT fill:#fee2e2,stroke:#dc2626
style PS02_CRIT fill:#fee2e2,stroke:#dc2626
style PS03_ACT fill:#fee2e2,stroke:#dc2626
style PS03_INFO fill:#e8f0fe,stroke:#1a56db
style PS04_ACT fill:#fee2e2,stroke:#dc2626
style PS02_HOLD fill:#ede9fe,stroke:#7c3aed
style PS05_HOLD fill:#ede9fe,stroke:#7c3aed
style PS03_WARN fill:#fffbeb,stroke:#d97706
style PS05_WARN fill:#fffbeb,stroke:#d97706
style PUBBLICA fill:#dcfce7,stroke:#16a34a
Come il sistema sceglie il miglior fornitore per ogni prodotto e calcola il prezzo.
flowchart TD
EAN["Prodotto con EAN\nofferto da N fornitori"] --> FILTRO
FILTRO["Filtra fornitori:\n- non esclusi\n- non end-of-life\n- prezzo positivo\n- categoria mappata"] --> LANDED
LANDED["Calcola landed cost\nper ogni fornitore:\nprezzo acquisto + costo trasporto"] --> RANK
RANK{"Peak Mode?"}
RANK -->|No| RANK_NORM["Ranking normale:\n1. Giacenza positiva\n2. Landed cost minore\n3. Affidabilita maggiore\n4. Lead time minore"]
RANK -->|Si| RANK_PEAK["Ranking peak:\n1. Giacenza positiva\n2. Affidabilita oltre 80%\n3. Lead time ridotto\n4. Fido disponibile\n5. Landed cost minore"]
RANK_NORM --> BEST["Fornitore selezionato"]
RANK_PEAK --> BEST
BEST --> PREZZO_CALC{"Tipo pricing?"}
PREZZO_CALC -->|LISTINO o QUOTAZIONE| BRAND_PRICE["Prezzo brand\nda brand_policy"]
PREZZO_CALC -->|Con EAN + Amazon| AMAZON_CAP["Target: costo +20%\nCap: Amazon -9%\nFloor: costo +9%"]
PREZZO_CALC -->|Senza EAN| MARGINE["Costo + 20% margine"]
PREZZO_CALC -->|COSTO_MARGINE| CUSTOM["Margine personalizzato\nda brand_policy"]
style BEST fill:#dbeafe,stroke:#1a56db
style BRAND_PRICE fill:#dcfce7,stroke:#16a34a
style AMAZON_CAP fill:#dcfce7,stroke:#16a34a
style MARGINE fill:#dcfce7,stroke:#16a34a
style CUSTOM fill:#dcfce7,stroke:#16a34a
Le tre operazioni parallele che sincronizzano lo store Shopify con il database.
flowchart TD
START(["05:00 / 17:00\nTrigger schedulato"]) --> TOKEN
TOKEN["Verifica/Rinnova\nToken Shopify"] --> BRANCH
BRANCH --> SYNC_UPD
BRANCH --> SYNC_NEW
BRANCH --> SYNC_ORPHAN
subgraph PARALLELO["Tre branch parallele"]
SYNC_UPD["Sync cambiamenti\nProdotti con hash diverso\nagggiorna prezzo/stock"]
SYNC_NEW["Import nuovi\nProdotti in MV ma non\nin shopify_sync_stato\ncrea su Shopify"]
SYNC_ORPHAN["Gestione orfani\nProdotti in sync_stato\nma non in MV\nazzera stock Shopify"]
end
SYNC_UPD --> LOG_S
SYNC_NEW --> LOG_S
SYNC_ORPHAN --> LOG_S
LOG_S["Log operazioni\nin shopify_sync_log"] --> END_S(["Fine"])
TD Synnex è il più complesso, con 4 file separati. Gli altri fornitori seguono lo stesso schema ma con un solo file.
flowchart TD
TRIGGER(["Trigger schedulato"]) --> ORCH
ORCH["Orchestratore\nImportazione Tdsynnex SQL"] --> DL1
ORCH --> DL2
ORCH --> DL3
ORCH --> DL4
DL1["Download Material File\ncatalogo prodotti"] --> PROC1["Processa batch\nMaterialFile SQL"]
DL2["Download Prices\nprezzi"] --> PROC2["Processa batch\nPrices SQL"]
DL3["Download Stock\ndisponibilita"] --> PROC3["Processa batch\nStock SQL"]
DL4["Download Weights\npesi"] --> PROC4["Processa batch\nWeights SQL"]
PROC1 --> UPSERT
PROC2 --> UPSERT
PROC3 --> UPSERT
PROC4 --> UPSERT
UPSERT[("UPSERT in tabella prodotti\nON CONFLICT fornitore, sku\nDO UPDATE")] --> END_I(["Fine"])
Come vengono generati, classificati e gestiti gli alert del sistema.
flowchart LR
subgraph SORGENTI["Sorgenti alert"]
PRICING["Algoritmo Pricing\nPS-01 a PS-05"]
VERIFICA["Verifica Shopify vs DB"]
PEAK["Check Peak Mode"]
end
subgraph CLASSIFICAZIONE["Classificazione"]
WARNING["WARNING\nSolo informativo"]
HOLD["HOLD\nPrezzo congelato"]
CRITICAL["CRITICAL\nFornitore escluso\no prodotto DRAFT"]
end
subgraph AZIONI["Azioni"]
LOG_A[("pricing_alerts\nLog nel DB")]
TELEGRAM_A["Report Telegram\nBot monostestacv_bot"]
AUTO["Azioni automatiche\nEsclusione / Congelamento"]
end
PRICING --> WARNING
PRICING --> HOLD
PRICING --> CRITICAL
VERIFICA --> TELEGRAM_A
PEAK --> TELEGRAM_A
WARNING --> LOG_A
WARNING --> TELEGRAM_A
HOLD --> LOG_A
HOLD --> TELEGRAM_A
HOLD --> AUTO
CRITICAL --> LOG_A
CRITICAL --> TELEGRAM_A
CRITICAL --> AUTO
style WARNING fill:#fffbeb,stroke:#d97706
style HOLD fill:#ede9fe,stroke:#7c3aed
style CRITICAL fill:#fee2e2,stroke:#dc2626
| Simbolo | Significato |
|---|---|
| Rettangolo | Operazione / processo |
| Rombo | Decisione / condizione |
| Cilindro | Tabella / database |
| Stadio arrotondato | Inizio / fine flusso |
| Riquadro tratteggiato | Raggruppamento logico |
| Rosso | CRITICAL — blocco o esclusione |
| Viola | HOLD — prezzo congelato, richiede revisione |
| Giallo | WARNING — solo informativo |
| Verde | OK — operazione completata con successo |
MonosTech — Flussi Decisionali — Ultimo aggiornamento: 24/03/2026