Flussi Decisionali MonosTech

Diagrammi dei flussi principali del sistema — Ultimo aggiornamento: 24/03/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"] --> 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

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: 24/03/2026