/* Patch Python WMS: ordine di prelievo per singola picking list Prerequisito: - eseguire prima apply_pickinglist_days_filter_patch.sql, che espone DataDocumento nelle viste operative Python. Effetti: - crea una tabella Python-only con la sequenza personalizzata per Documento; - crea una vista Python-only con l'ordine effettivo condiviso da backoffice e barcode; - senza configurazione applica il default: Non scaff. prima degli scaffali; - con configurazione applica i gruppi scelti e accoda in modo sicuro quelli mancanti; - non modifica tabelle, viste o stored procedure legacy usate dal programma C#. */ SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER ON; GO IF OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') IS NULL BEGIN CREATE TABLE dbo.py_PickingListPrelievoSequenza ( ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_py_PickingListPrelievoSequenza PRIMARY KEY, Documento varchar(50) NOT NULL, GruppoChiave varchar(160) NOT NULL, GruppoEtichetta varchar(100) NOT NULL, Ordine int NOT NULL, InsUtente varchar(50) NULL, InsDataOra datetime2(0) NOT NULL CONSTRAINT DF_py_PickingListPrelievoSequenza_InsDataOra DEFAULT SYSDATETIME(), ModUtente varchar(50) NULL, ModDataOra datetime2(0) NULL, DelUtente varchar(50) NULL, DelDataOra datetime2(0) NULL, CONSTRAINT CK_py_PickingListPrelievoSequenza_Ordine CHECK (Ordine >= 0) ); END GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') AND name = N'UX_py_PickingListPrelievoSequenza_DocGruppo' ) BEGIN CREATE UNIQUE INDEX UX_py_PickingListPrelievoSequenza_DocGruppo ON dbo.py_PickingListPrelievoSequenza (Documento, GruppoChiave) WHERE DelDataOra IS NULL; END GO IF NOT EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.py_PickingListPrelievoSequenza', N'U') AND name = N'UX_py_PickingListPrelievoSequenza_DocOrdine' ) BEGIN CREATE UNIQUE INDEX UX_py_PickingListPrelievoSequenza_DocOrdine ON dbo.py_PickingListPrelievoSequenza (Documento, Ordine) WHERE DelDataOra IS NULL; END GO CREATE OR ALTER VIEW dbo.py_ViewPackingListPrelievo AS WITH Gruppi AS ( SELECT pl.*, CASE WHEN pl.Cella = 1000 THEN 'NON_SCAFF' ELSE CONCAT( 'M:', pl.Magazzino, '|A:', pl.Area, '|C:', LTRIM(RTRIM( CASE WHEN CHARINDEX(' - ', pl.Ubicazione) > 0 THEN LEFT(pl.Ubicazione, CHARINDEX(' - ', pl.Ubicazione) - 1) ELSE pl.Ubicazione END )) ) END AS GruppoPrelievoChiave, CASE WHEN pl.Cella = 1000 THEN 'Non scaff.' ELSE LTRIM(RTRIM( CASE WHEN CHARINDEX(' - ', pl.Ubicazione) > 0 THEN LEFT(pl.Ubicazione, CHARINDEX(' - ', pl.Ubicazione) - 1) ELSE pl.Ubicazione END )) END AS GruppoPrelievo, CASE WHEN pl.Cella = 1000 THEN 0 ELSE 1000 + ISNULL(pl.Ordinamento, 99999) END AS OrdineGruppoDefault FROM dbo.py_ViewPackingListRestante AS pl ), Sequenza AS ( SELECT g.*, s.Ordine AS OrdineGruppoConfigurato, CASE WHEN EXISTS ( SELECT 1 FROM dbo.py_PickingListPrelievoSequenza AS any_s WHERE any_s.Documento COLLATE Latin1_General_CI_AS = CAST(g.Documento AS varchar(50)) COLLATE Latin1_General_CI_AS AND any_s.DelDataOra IS NULL ) THEN 1 ELSE 0 END AS HaSequenzaPersonalizzata FROM Gruppi AS g LEFT JOIN dbo.py_PickingListPrelievoSequenza AS s ON s.Documento COLLATE Latin1_General_CI_AS = CAST(g.Documento AS varchar(50)) COLLATE Latin1_General_CI_AS AND s.GruppoChiave COLLATE Latin1_General_CI_AS = g.GruppoPrelievoChiave COLLATE Latin1_General_CI_AS AND s.DelDataOra IS NULL ) SELECT Sequenza.*, CASE WHEN OrdineGruppoConfigurato IS NOT NULL THEN OrdineGruppoConfigurato WHEN HaSequenzaPersonalizzata = 1 THEN 100000 + OrdineGruppoDefault ELSE OrdineGruppoDefault END AS OrdinePrelievoGruppo FROM Sequenza; GO PRINT 'Patch sequenza prelievo Python applicata.'; GO