Flussi Decisionali MonosTech

Diagrammi dei flussi principali del sistema — Ultimo aggiornamento: 19/08/2026

1. Flusso Generale del Sistema

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

2. Pipeline Pricing Giornaliero

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"])

3. Controlli Anti-Errore Prezzo

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

4. Selezione Fornitore

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

5. Sync Shopify

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"])

6. Import Fornitore (esempio TD Synnex)

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"])

7. Flusso Alert e Notifiche

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

8. Scelta Fonte per Ordini Amazon

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.

Legenda

SimboloSignificato
RettangoloOperazione / processo
RomboDecisione / condizione
CilindroTabella / database
Stadio arrotondatoInizio / fine flusso
Riquadro tratteggiatoRaggruppamento logico
RossoCRITICAL — blocco o esclusione
ViolaHOLD — prezzo congelato, richiede revisione
GialloWARNING — solo informativo
VerdeOK — operazione completata con successo

MonosTech — Flussi Decisionali — Ultimo aggiornamento: 19/08/2026