🎉 T-wiki 1.3.0 is released

BACK-ENDProgettiMagazzino GraficoAnalisi

Magazzino Grafico

Premessa

In questo documento la parola Layout intende i json prodotti dalla libreria KonvaJS
Ogni negozio potrĂ  avere un singolo layout attivo.
Non possono esserci molteplici magazzini per negozio a causa di come è strutturato il database Zeus.

Obiettivo

Avere una tabella dove vengono salvati i json dei layout del magazzino grafico.
I layout saranno molteplici per magazzino, ipotizzando che l’utente abbia la necessità di:

  • Creare un draft di un magazzino; (es. creazione di un futuro aggiornamento del magazzino)
  • Mantenere lo storico dei layout di un magazzino.

Ipotesi di implementazione

Logica di base

CHIAVE FISICA:
Come chiave fisica è consigliato l’utilizzo di UNIQUEIDENTIFIER (Guid in c#) per le logiche Edge che necessitano di merge di dati. (nel nostro caso quando vi è una situazione negozio → centrale)

CHIAVE LOGICA:
Per chiave logica si intende una chiave di univocità al di fuori della chiave fisica. Questo è la base dello sviluppo con architettura DDD ed è una fondamentale per l’integrità dei dati.
La chiave logica sarĂ  composta da:

  • IDNegozio (NumeroPunto)
  • IDAzienda

Idea di sviluppo

Per lo sviluppo di questa funzionalità si ipotizza l’utilizzo di una struttura a tabella singola che conterrà la Lista dei vari layout separati per stato (draft, published, archived e scheduled) .
Lo stato archived servirà per il mantenimento dello storico delle modifiche. L’utente avrà comunque la possibilità di eliminare completamente il layout.

DDL

Layout Magazzino Grafico

CREATE OR ALTER FUNCTION dbo.fIsJson ( @S AS NVARCHAR(MAX) ) RETURNS BIT AS
BEGIN
    IF LTRIM(RTRIM(ISNULL(@S,''))) <> '' 
        AND (
                LTRIM(RTRIM(@S)) LIKE '{%}'       -- Oggetto JSON
                OR LTRIM(RTRIM(@S)) LIKE '[%]'    -- Array JSON
            )
            RETURN 1;
    RETURN 0;
END;
GO
 
CREATE TABLE [dbo].[mag_MagazzinoGrafico] (
    -- GUID Autogenerato
    IDMagazzinoGrafico      UNIQUEIDENTIFIER
                            DEFAULT NEWSEQUENTIALID()   NOT NULL, 
 
    -- FK verso cfg_punti
    NumeroPunto             INT             NOT NULL, 
    IDAzienda               INT             NOT NULL,
 
    -- Versione del layout gestita a codice
    -- Singola versione attiva (1) per magazzino, gestita dall'indice
    Versione                INT             NOT NULL,
 
    -- LOV di stato del layout
    -- Draft -> fornito dal client
    -- Active/Archived/Scheduled -> gestito a codice dagli endpoint ed un worker per i layout schedulati
    Stato                   TINYINT         DEFAULT (0)   NOT NULL,       -- 0:'Draft'| 1:'Active' | 2:'Archived' | 3:'Scheduled'
 
    -- Colonne per la tabella temporale così da avere uno scheduling di futuri layout (solo per le scheduled)
    AttivoDa                DATETIME        DEFAULT GETDATE()   NOT NULL,
    AttivoA                 DATETIME        NOT NULL,
 
    Layout                  NVARCHAR(MAX)   NOT NULL,
 
    ImmagineBlueprint       VARBINARY(MAX)  NULL,
    Note                    NVARCHAR(MAX)   NULL,
 
    -- bit di lock in caso di modifiche
    InModifica              BIT             NOT NULL,
 
    -- Data in ticks per ordinare i layout durante il processo dello scheduler
    Ultima_Verifica         BIGINT          NULL DEFAULT (0), 
 
    DataCreazione           DATETIME        DEFAULT GETDATE()   NOT NULL,
    UtenteCreazione         NVARCHAR(50)    NOT NULL,
    DataAggiornamento       DATETIME        DEFAULT GETDATE()   NOT NULL,
    UtenteAggiornamento     NVARCHAR(50)    NOT NULL,
 
    CONSTRAINT [PK_mag_MagazzinoGrafico] PRIMARY KEY ( [IDMagazzinoGrafico] ASC, [NumeroPunto] ASC, [IDAzienda] ASC, [Versione] ASC )
);
GO
 
-- Indice di univocitĂ  per i layout attivi
-- Un layoutId può avere solo una versione attiva
CREATE UNIQUE NONCLUSTERED INDEX UX_mag_MagazzinoGrafico_PuntoAzienda
    ON [dbo].[mag_MagazzinoGrafico] ( [NumeroPunto] ASC, [IDAzienda] ASC )  
    WHERE [Stato] = 1
    ON [PRIMARY];
GO
 
-- Constraint per evitare che vengano inseriti dati non di tipo JSON
ALTER TABLE [dbo].[mag_MagazzinoGrafico] WITH NOCHECK
    ADD CONSTRAINT [CK_mag_MagazzinoGrafico_Layout_JSON]
    CHECK ( [dbo].[fISJSON]([Layout]) = 1 );
GO
 
ALTER TABLE [dbo].[mag_MagazzinoGrafico]
    CHECK CONSTRAINT [CK_mag_MagazzinoGrafico_Layout_JSON];
GO 
 
-- Constraint per evitare che vengano inseriti dati non di tipo JSON
-- Non utilizzata per questioni di retrocompatibilitĂ 
ALTER TABLE dbo.mag_MagazzinoGrafico WITH NOCHECK ADD CONSTRAINT CK_LMG_IsJson CHECK ((isjson([Layout])=(1)));

Use cases

Inserimento nuovo layout

Entrata nella modalitĂ  di modifica

Inserimento nuova versione

Pubblicazione layout in draft

Archiviazione layout

Modifica dati layout

Dati modificabili

  • Note righe
  • Data attivazione layout in scheduling

Cancellazione Layout

Scheduling worker

I layout con queste caratteristiche verranno spostati nello stato “Scheduled”:

  1. Devono essere in stato “active”
  2. La data fine deve essere postumo alla data fine del layout attualmente attivo

Il layout attualmente nello stato “Active” dovrà avere questi requisiti:

  1. La data di inizio deve essere precedente alla data odierna
  2. Deve essere il layout con la data di inizio piĂą vicina a quella attuale
  3. La data fine deve essere postuma alla data odierna