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”:
- Devono essere in stato “active”
- La data fine deve essere postumo alla data fine del layout attualmente attivo
Il layout attualmente nello stato “Active” dovrà avere questi requisiti:
- La data di inizio deve essere precedente alla data odierna
- Deve essere il layout con la data di inizio piĂą vicina a quella attuale
- La data fine deve essere postuma alla data odierna