Diagrammi dei flussi principali del sistema — Ultimo aggiornamento: 19/08/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\n3 priorità: prezzi Shopify,\ncatalogo disponibile, resto"] --> 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
Come il Tool Ordini Amazon costruisce le opzioni per ogni riga ordine: fonte merce e modalità di spedizione sono concetti separati, le combinazioni ammesse vivono nella tabella regole_fonte_spedizione (modificabile da NocoDB). La scelta finale è sempre dell’operatore.
flowchart TD
RIGA(["Riga ordine Amazon"]) --> MATCH["Abbinamento prodotto\ncorrezione manuale, ASIN/EAN,\npart number, catalogo Amazon,\nKeepa, somiglianza"]
MATCH --> FONTI{"Dove è disponibile\nla merce?"}
FONTI -->|"Catalogo fornitori"| FORN["Opzioni fornitore\nIMA, TD Synnex, Xpress,\nFocelda, V-Valley"]
FONTI -->|"Giacenza in deposito\nEsprinet"| DEP["Conto deposito\n2 opzioni:\ngestione Esprinet /\nritiro contratto nostro"]
FONTI -->|"Giacenza in\nsede Monos"| MONOS["Sede Monos\nspedizione contratto\nnostro BRT/GLS"]
FORN --> PREZZO["Prezzo effettivo:\nmigliore tra listino,\npromozione valida e\nprezzo BID (prezzi_bid)"]
PREZZO --> REGOLE[("regole_fonte_spedizione\n+ tariffe fornitori_spedizione")]
DEP --> REGOLE
MONOS --> REGOLE
REGOLE --> CALC["Calcolo per opzione:\ncosto merce + trasporto\n(nolo + carburante) +\naccessori + commissioni"]
CALC --> RANK["Ranking: prima i controlli\ndi attendibilita, poi il profitto\n+ stato operativo\n+ freschezza dato"]
RANK --> OPER(["Operatore sceglie\ne ordina"])
OPER -.->|"Conferma (1 click)\no scelta con motivazione"| SCELTA[("tool_amazon_scelte\nscelta manuale registrata")]
SCELTA -.->|"riga = gia gestita\nnelle analisi successive"| RIGA
style DEP fill:#fffbeb,stroke:#d97706
style MONOS fill:#dbeafe,stroke:#1a56db
style REGOLE fill:#f3e8ff,stroke:#7c3aed
style SCELTA fill:#f3e8ff,stroke:#7c3aed
Note:
il costo del conto deposito è il prezzo d’acquisto reale (certificato dalle fatture riconciliate, oppure stimato — in tal caso l’opzione non viene mai raccomandata automaticamente);
le giacenze sede Monos provengono dal registro di magazzino, che somma le fatture d’acquisto e sottrae quelle di vendita; le vendite il cui prodotto non è stato riconosciuto con certezza restano in coda di revisione e non hanno ancora scalato la giacenza;
il trasporto a contratto nostro confronta GLS, BRT e FedEx sia in Italia (FedEx vince nella fascia 3–20 kg, e per Calabria/Sicilia/Sardegna vale un listino dedicato riconosciuto dal CAP) sia all’estero (tariffe reali per paese, isole riconosciute dal CAP), dove le opzioni solo-Italia (V-Valley, deposito gestione Esprinet) non sono disponibili e — se nessun corriere copre la spedizione (peso o paese/CAP fuori tariffario) — l’opzione è “fuori copertura corriere” e non viene mai raccomandata;
ogni opzione mostra la data di aggiornamento di prezzo/disponibilità (oltre la soglia critica di 30 giorni l’opzione non è mai raccomandata);
una fonte con giacenza 0 resta visibile ma non viene mai raccomandata automaticamente; se nessuna fonte ha merce, la riga lo dichiara esplicitamente;
a parità di attendibilità del dato la classifica è guidata dal profitto, e quando la fonte più rapida rende sensibilmente meno di un’alternativa dai tempi compatibili la riga lo segnala (soglie configurabili in NocoDB);
la scelta manuale di una fonte diversa dalla raccomandata si registra dal tool con motivazione obbligatoria e riappare alle analisi successive (Runbook §4.6);
il prezzo merce è il migliore tra listino (con eco-contributi), promozione valida per date e quantità e prezzo BID riservato (Runbook §4.8) — un ordine al prezzo BID TD Synnex richiede nota d’ordine e validazione del personale TD;
le commissioni Amazon sono chieste per riga a Product Fees API e messe in cache: sono l’unica fonte, e una riga per cui Amazon non risponde resta In verifica senza commissione e senza profitto, mai con un importo stimato;
la consegna promessa al cliente (via getOrders) confronta la data promessa con l’arrivo stimato della fonte raccomandata: se il margine scende sotto la soglia la riga va in Avviso con badge RITARDO;
gli ordini in valuta diversa dall’euro si convertono con i cambi ufficiali BCE aggiornati ogni notte: se i cambi non sono disponibili o sono scaduti la riga resta In verifica senza conversione, mai con un cambio inventato.
| 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: 19/08/2026