- 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>
80 lines
4.0 KiB
SQL
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).
|