nis2-agile/docs/sql/033_suppliers_category_source.sql
DevEnv nis2-agile 5c7ed9abcb [FIX] Import fornitori: valida scope org di category_id + allinea header migrazioni 032/033
- bulkUpsertSuppliers: il ramo category_id esplicito (import API/CSV) ora verifica
  che la categoria sia un preset (org 0) o della stessa org, come gia' fa il ramo
  category_slug. Evita di scrivere suppliers.category_id di un'altra org (dato sporco
  cross-org). Finding review multi-agente (MINORE, correttezza dati).
- docs/sql/032,033: header "PROPOSTA DI DESIGN (NON applicata)" -> "APPLICATA su
  produzione 2026-05-31" (sono effettivamente applicate). Evita confusione operativa.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 11:16:43 +02:00

80 lines
4.0 KiB
SQL

-- ============================================================================
-- Migration 033 - suppliers: categoria, provenienza import, soft-delete (guard)
-- ----------------------------------------------------------------------------
-- APPLICATA su produzione (host MySQL) il 2026-05-31. Idempotente: ri-eseguibile.
--
-- Estende suppliers per il nuovo modulo questionari/import:
-- - category_id : FK supplier_categories (classificazione fornitore)
-- - external_ref : ID nel sistema sorgente (dedup import API/CSV)
-- - source : ENUM('manual','csv','api') provenienza del record
-- - deleted_at : soft-delete -- GIA PRESENTE da mig 006; aggiunto solo se assente
-- + UNIQUE(organization_id, external_ref) per upsert idempotente.
--
-- NOTA REALE: suppliers.deleted_at e stato aggiunto dalla migration 006.
-- Questo script lo riaggiunge SOLO se mancante. Nessuna duplicazione.
--
-- IMPORTANTE: MySQL 8 Ubuntu NON supporta "ADD COLUMN IF NOT EXISTS".
-- Procedura idempotente su information_schema. DELIMITER -> usare "source".
-- mysql -h localhost nis2_agile_db -e "source docs/sql/033_suppliers_category_source.sql"
-- ============================================================================
DELIMITER //
DROP PROCEDURE IF EXISTS _mig033 //
CREATE PROCEDURE _mig033()
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers' AND COLUMN_NAME='category_id') THEN
ALTER TABLE suppliers ADD COLUMN category_id INT NULL
COMMENT 'FK supplier_categories: classificazione fornitore' AFTER service_type;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers' AND COLUMN_NAME='external_ref') THEN
ALTER TABLE suppliers ADD COLUMN external_ref VARCHAR(190) NULL
COMMENT 'ID fornitore nel sistema sorgente (dedup import API/CSV)' AFTER vat_number;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers' AND COLUMN_NAME='source') THEN
ALTER TABLE suppliers ADD COLUMN source ENUM('manual','csv','api') NOT NULL DEFAULT 'manual'
COMMENT 'Provenienza del record fornitore' AFTER external_ref;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers' AND COLUMN_NAME='deleted_at') THEN
ALTER TABLE suppliers ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL AFTER updated_at;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers'
AND CONSTRAINT_NAME='fk_supplier_category' AND CONSTRAINT_TYPE='FOREIGN KEY') THEN
ALTER TABLE suppliers ADD CONSTRAINT fk_supplier_category
FOREIGN KEY (category_id) REFERENCES supplier_categories(id) ON DELETE SET NULL;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers'
AND INDEX_NAME='uq_supplier_external_ref') THEN
ALTER TABLE suppliers ADD UNIQUE KEY uq_supplier_external_ref (organization_id, external_ref);
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='suppliers'
AND INDEX_NAME='idx_suppliers_not_deleted') THEN
ALTER TABLE suppliers ADD INDEX idx_suppliers_not_deleted (organization_id, deleted_at);
END IF;
END //
DELIMITER ;
CALL _mig033();
DROP PROCEDURE IF EXISTS _mig033;
-- ROLLBACK (manuale):
-- ALTER TABLE suppliers
-- DROP FOREIGN KEY fk_supplier_category,
-- DROP INDEX uq_supplier_external_ref,
-- DROP INDEX idx_suppliers_not_deleted,
-- DROP COLUMN category_id,
-- DROP COLUMN external_ref,
-- DROP COLUMN source;
-- -- NB: NON droppare deleted_at (di proprieta della mig 006).