diff --git a/docs/development/ZENTRAL.md b/docs/development/ZENTRAL.md
index 94ffac4..4ee8f2d 100644
--- a/docs/development/ZENTRAL.md
+++ b/docs/development/ZENTRAL.md
@@ -6,3 +6,7 @@ File riassuntivo dello stato di sviluppo di Zentral.
- [2025-12-02 Rebranding Apollinare to Zentral](./log/2025-12-02_rebranding.md) - **Completato**
- Rinomina completa del progetto (Backend & Frontend).
+- [2025-12-03 UI Restructuring](./devlog/2025-12-03_ui_restructuring.md) - **Completato**
+ - Ristrutturazione interfaccia: Sidebar a 2 livelli, Tabs, SearchBar.
+- [2025-12-03 Backend Fix](./devlog/2025-12-03_backend_fix.md) - **Completato**
+ - Fix mancata migrazione database e avvio backend.
diff --git a/docs/development/devlog/2025-12-03_backend_fix.md b/docs/development/devlog/2025-12-03_backend_fix.md
new file mode 100644
index 0000000..9b748ba
--- /dev/null
+++ b/docs/development/devlog/2025-12-03_backend_fix.md
@@ -0,0 +1,17 @@
+# Backend Fix - Sync Model Changes
+
+## Problem
+The backend was failing to start with a `System.InvalidOperationException` because the `ZentralDbContext` model had pending changes that were not captured in a migration.
+
+## Solution
+1. Created a new migration `SyncModelChanges` to synchronize the database schema with the code.
+ - Command: `dotnet ef migrations add SyncModelChanges --project Zentral.Infrastructure --startup-project Zentral.API`
+2. Updated the database.
+ - Command: `dotnet ef database update --project Zentral.Infrastructure --startup-project Zentral.API`
+
+## Status
+- [x] Create Migration
+- [x] Update Database
+- [x] Verify Backend Startup
+
+The backend now starts correctly and listens on the configured port.
diff --git a/docs/development/devlog/2025-12-03_ui_restructuring.md b/docs/development/devlog/2025-12-03_ui_restructuring.md
new file mode 100644
index 0000000..6b9786a
--- /dev/null
+++ b/docs/development/devlog/2025-12-03_ui_restructuring.md
@@ -0,0 +1,53 @@
+# UI Restructuring Plan
+
+## Objective
+Restructure the graphical interface according to the guidelines:
+- 2-level sidebar (Apps -> Functions).
+- Top search bar.
+- Tabbed interface for the main viewport.
+- Responsive design.
+
+## Components to Create/Update
+
+### 1. TabContext (`src/frontend/src/contexts/TabContext.tsx`)
+- **State**:
+ - `tabs`: Array of `{ id: string, path: string, label: string, icon?: ReactNode }`.
+ - `activeTabPath`: string.
+- **Actions**:
+ - `openTab(tab)`: Adds tab if not exists, sets as active.
+ - `closeTab(path)`: Removes tab. If active, switches to neighbor.
+ - `setActiveTab(path)`: Updates active tab.
+- **Persistence**: Save `tabs` and `activeTabPath` to `localStorage`.
+
+### 2. TabsBar (`src/frontend/src/components/TabsBar.tsx`)
+- Renders the list of open tabs using MUI `Tabs` or a custom horizontal list.
+- Handles click (navigate) and close actions.
+- Mobile: Show as a popup or scrollable bar.
+
+### 3. Sidebar (`src/frontend/src/components/Sidebar.tsx`)
+- Refactor existing Drawer content.
+- Implement nested lists (Accordion style) for Modules.
+- Structure:
+ - **Core**: Dashboard, Calendar, Events, Clients, Location, Articles, Resources.
+ - **Warehouse**: Dashboard, Articles, Locations, Movements, Stock, Inventory.
+ - **Purchases**: Suppliers, Orders.
+ - **Sales**: Orders.
+ - **Production**: Dashboard, Orders, BOM, Work Centers, Cycles, MRP.
+ - **Admin**: Modules, Auto Codes, Custom Fields.
+
+### 4. SearchBar (`src/frontend/src/components/SearchBar.tsx`)
+- Input field in AppBar.
+- Filters available menu items.
+- On selection, opens the corresponding tab.
+
+### 5. Layout (`src/frontend/src/components/Layout.tsx`)
+- Integrate `Sidebar`, `SearchBar`, and `TabsBar`.
+- Ensure responsive behavior.
+
+## Execution Steps
+1. Create `TabContext`.
+2. Create `TabsBar`.
+3. Refactor `Layout` to include `TabsBar` and use `TabContext`.
+4. Create `Sidebar` with nested structure.
+5. Create `SearchBar` and integrate into `Layout`.
+6. Verify functionality.
diff --git a/src/backend/Zentral.Infrastructure/Data/warehouse_tables.sql b/src/backend/Zentral.Infrastructure/Data/warehouse_tables.sql
deleted file mode 100644
index eeae9d7..0000000
--- a/src/backend/Zentral.Infrastructure/Data/warehouse_tables.sql
+++ /dev/null
@@ -1,421 +0,0 @@
--- =====================================================
--- APOLLINARE WAREHOUSE MODULE - DATABASE TABLES
--- SQLite
--- =====================================================
-
--- Magazzini
-CREATE TABLE IF NOT EXISTS WarehouseLocations (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- Code TEXT NOT NULL UNIQUE,
- Name TEXT NOT NULL,
- Description TEXT,
- Address TEXT,
- City TEXT,
- Province TEXT,
- PostalCode TEXT,
- Country TEXT DEFAULT 'Italia',
- Type INTEGER NOT NULL DEFAULT 0,
- IsDefault INTEGER NOT NULL DEFAULT 0,
- IsActive INTEGER NOT NULL DEFAULT 1,
- SortOrder INTEGER NOT NULL DEFAULT 0,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT
-);
-
-CREATE INDEX IF NOT EXISTS IX_WarehouseLocations_Code ON WarehouseLocations(Code);
-CREATE INDEX IF NOT EXISTS IX_WarehouseLocations_IsDefault ON WarehouseLocations(IsDefault);
-CREATE INDEX IF NOT EXISTS IX_WarehouseLocations_IsActive ON WarehouseLocations(IsActive);
-
--- Categorie Articoli
-CREATE TABLE IF NOT EXISTS WarehouseArticleCategories (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- Code TEXT NOT NULL UNIQUE,
- Name TEXT NOT NULL,
- Description TEXT,
- ParentCategoryId INTEGER,
- Level INTEGER NOT NULL DEFAULT 0,
- FullPath TEXT,
- Icon TEXT,
- Color TEXT,
- DefaultValuationMethod INTEGER,
- SortOrder INTEGER NOT NULL DEFAULT 0,
- IsActive INTEGER NOT NULL DEFAULT 1,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ParentCategoryId) REFERENCES WarehouseArticleCategories(Id) ON DELETE RESTRICT
-);
-
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticleCategories_Code ON WarehouseArticleCategories(Code);
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticleCategories_ParentCategoryId ON WarehouseArticleCategories(ParentCategoryId);
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticleCategories_FullPath ON WarehouseArticleCategories(FullPath);
-
--- Articoli Magazzino
-CREATE TABLE IF NOT EXISTS WarehouseArticles (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- Code TEXT NOT NULL UNIQUE,
- Description TEXT NOT NULL,
- ShortDescription TEXT,
- Barcode TEXT,
- ManufacturerCode TEXT,
- CategoryId INTEGER,
- UnitOfMeasure TEXT NOT NULL DEFAULT 'PZ',
- SecondaryUnitOfMeasure TEXT,
- UnitConversionFactor REAL,
- StockManagement INTEGER NOT NULL DEFAULT 0,
- IsBatchManaged INTEGER NOT NULL DEFAULT 0,
- IsSerialManaged INTEGER NOT NULL DEFAULT 0,
- HasExpiry INTEGER NOT NULL DEFAULT 0,
- ExpiryWarningDays INTEGER,
- MinimumStock REAL,
- MaximumStock REAL,
- ReorderPoint REAL,
- ReorderQuantity REAL,
- LeadTimeDays INTEGER,
- ValuationMethod INTEGER,
- StandardCost REAL,
- LastPurchaseCost REAL,
- WeightedAverageCost REAL,
- BaseSellingPrice REAL,
- Weight REAL,
- Volume REAL,
- Width REAL,
- Height REAL,
- Depth REAL,
- Image BLOB,
- ImageMimeType TEXT,
- IsActive INTEGER NOT NULL DEFAULT 1,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (CategoryId) REFERENCES WarehouseArticleCategories(Id) ON DELETE SET NULL
-);
-
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticles_Code ON WarehouseArticles(Code);
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticles_Barcode ON WarehouseArticles(Barcode);
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticles_CategoryId ON WarehouseArticles(CategoryId);
-CREATE INDEX IF NOT EXISTS IX_WarehouseArticles_IsActive ON WarehouseArticles(IsActive);
-
--- Partite/Lotti
-CREATE TABLE IF NOT EXISTS ArticleBatches (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ArticleId INTEGER NOT NULL,
- BatchNumber TEXT NOT NULL,
- ProductionDate TEXT,
- ExpiryDate TEXT,
- SupplierBatch TEXT,
- SupplierId INTEGER,
- UnitCost REAL,
- InitialQuantity REAL NOT NULL DEFAULT 0,
- CurrentQuantity REAL NOT NULL DEFAULT 0,
- ReservedQuantity REAL NOT NULL DEFAULT 0,
- Status INTEGER NOT NULL DEFAULT 0,
- QualityStatus INTEGER,
- LastQualityCheckDate TEXT,
- Certifications TEXT,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE,
- UNIQUE(ArticleId, BatchNumber)
-);
-
-CREATE INDEX IF NOT EXISTS IX_ArticleBatches_ArticleId_BatchNumber ON ArticleBatches(ArticleId, BatchNumber);
-CREATE INDEX IF NOT EXISTS IX_ArticleBatches_ExpiryDate ON ArticleBatches(ExpiryDate);
-CREATE INDEX IF NOT EXISTS IX_ArticleBatches_Status ON ArticleBatches(Status);
-
--- Seriali/Matricole
-CREATE TABLE IF NOT EXISTS ArticleSerials (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ArticleId INTEGER NOT NULL,
- BatchId INTEGER,
- SerialNumber TEXT NOT NULL,
- ManufacturerSerial TEXT,
- ProductionDate TEXT,
- WarrantyExpiryDate TEXT,
- CurrentWarehouseId INTEGER,
- Status INTEGER NOT NULL DEFAULT 0,
- UnitCost REAL,
- SupplierId INTEGER,
- CustomerId INTEGER,
- SoldDate TEXT,
- SalesReference TEXT,
- Attributes TEXT,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE,
- FOREIGN KEY (BatchId) REFERENCES ArticleBatches(Id) ON DELETE SET NULL,
- FOREIGN KEY (CurrentWarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE SET NULL,
- UNIQUE(ArticleId, SerialNumber)
-);
-
-CREATE INDEX IF NOT EXISTS IX_ArticleSerials_ArticleId_SerialNumber ON ArticleSerials(ArticleId, SerialNumber);
-CREATE INDEX IF NOT EXISTS IX_ArticleSerials_Status ON ArticleSerials(Status);
-CREATE INDEX IF NOT EXISTS IX_ArticleSerials_CurrentWarehouseId ON ArticleSerials(CurrentWarehouseId);
-
--- Barcode aggiuntivi
-CREATE TABLE IF NOT EXISTS ArticleBarcodes (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ArticleId INTEGER NOT NULL,
- Barcode TEXT NOT NULL UNIQUE,
- Type INTEGER NOT NULL DEFAULT 0,
- Description TEXT,
- Quantity REAL NOT NULL DEFAULT 1,
- IsPrimary INTEGER NOT NULL DEFAULT 0,
- IsActive INTEGER NOT NULL DEFAULT 1,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE
-);
-
-CREATE INDEX IF NOT EXISTS IX_ArticleBarcodes_Barcode ON ArticleBarcodes(Barcode);
-CREATE INDEX IF NOT EXISTS IX_ArticleBarcodes_ArticleId ON ArticleBarcodes(ArticleId);
-
--- Giacenze
-CREATE TABLE IF NOT EXISTS StockLevels (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ArticleId INTEGER NOT NULL,
- WarehouseId INTEGER NOT NULL,
- BatchId INTEGER,
- Quantity REAL NOT NULL DEFAULT 0,
- ReservedQuantity REAL NOT NULL DEFAULT 0,
- OnOrderQuantity REAL NOT NULL DEFAULT 0,
- StockValue REAL,
- UnitCost REAL,
- LastMovementDate TEXT,
- LastInventoryDate TEXT,
- LocationCode TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE,
- FOREIGN KEY (WarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE CASCADE,
- FOREIGN KEY (BatchId) REFERENCES ArticleBatches(Id) ON DELETE SET NULL,
- UNIQUE(ArticleId, WarehouseId, BatchId)
-);
-
-CREATE INDEX IF NOT EXISTS IX_StockLevels_ArticleId_WarehouseId_BatchId ON StockLevels(ArticleId, WarehouseId, BatchId);
-CREATE INDEX IF NOT EXISTS IX_StockLevels_WarehouseId ON StockLevels(WarehouseId);
-CREATE INDEX IF NOT EXISTS IX_StockLevels_LocationCode ON StockLevels(LocationCode);
-
--- Causali Movimento
-CREATE TABLE IF NOT EXISTS MovementReasons (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- Code TEXT NOT NULL UNIQUE,
- Description TEXT NOT NULL,
- MovementType INTEGER NOT NULL,
- StockSign INTEGER NOT NULL,
- RequiresExternalReference INTEGER NOT NULL DEFAULT 0,
- RequiresValuation INTEGER NOT NULL DEFAULT 1,
- UpdatesAverageCost INTEGER NOT NULL DEFAULT 1,
- IsSystem INTEGER NOT NULL DEFAULT 0,
- IsActive INTEGER NOT NULL DEFAULT 1,
- SortOrder INTEGER NOT NULL DEFAULT 0,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT
-);
-
-CREATE INDEX IF NOT EXISTS IX_MovementReasons_Code ON MovementReasons(Code);
-CREATE INDEX IF NOT EXISTS IX_MovementReasons_MovementType ON MovementReasons(MovementType);
-CREATE INDEX IF NOT EXISTS IX_MovementReasons_IsActive ON MovementReasons(IsActive);
-
--- Movimenti di Magazzino (Testata)
-CREATE TABLE IF NOT EXISTS StockMovements (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- DocumentNumber TEXT NOT NULL UNIQUE,
- MovementDate TEXT NOT NULL,
- Type INTEGER NOT NULL,
- ReasonId INTEGER,
- SourceWarehouseId INTEGER,
- DestinationWarehouseId INTEGER,
- ExternalReference TEXT,
- ExternalDocumentType INTEGER,
- SupplierId INTEGER,
- CustomerId INTEGER,
- Status INTEGER NOT NULL DEFAULT 0,
- ConfirmedDate TEXT,
- ConfirmedBy TEXT,
- TotalValue REAL,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ReasonId) REFERENCES MovementReasons(Id) ON DELETE SET NULL,
- FOREIGN KEY (SourceWarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE RESTRICT,
- FOREIGN KEY (DestinationWarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE RESTRICT
-);
-
-CREATE INDEX IF NOT EXISTS IX_StockMovements_DocumentNumber ON StockMovements(DocumentNumber);
-CREATE INDEX IF NOT EXISTS IX_StockMovements_MovementDate ON StockMovements(MovementDate);
-CREATE INDEX IF NOT EXISTS IX_StockMovements_Type ON StockMovements(Type);
-CREATE INDEX IF NOT EXISTS IX_StockMovements_Status ON StockMovements(Status);
-CREATE INDEX IF NOT EXISTS IX_StockMovements_ExternalReference ON StockMovements(ExternalReference);
-
--- Movimenti di Magazzino (Righe)
-CREATE TABLE IF NOT EXISTS StockMovementLines (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- MovementId INTEGER NOT NULL,
- LineNumber INTEGER NOT NULL,
- ArticleId INTEGER NOT NULL,
- BatchId INTEGER,
- SerialId INTEGER,
- Quantity REAL NOT NULL,
- UnitOfMeasure TEXT NOT NULL DEFAULT 'PZ',
- UnitCost REAL,
- LineValue REAL,
- SourceLocationCode TEXT,
- DestinationLocationCode TEXT,
- ExternalLineReference TEXT,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (MovementId) REFERENCES StockMovements(Id) ON DELETE CASCADE,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE RESTRICT,
- FOREIGN KEY (BatchId) REFERENCES ArticleBatches(Id) ON DELETE SET NULL,
- FOREIGN KEY (SerialId) REFERENCES ArticleSerials(Id) ON DELETE SET NULL,
- UNIQUE(MovementId, LineNumber)
-);
-
-CREATE INDEX IF NOT EXISTS IX_StockMovementLines_MovementId_LineNumber ON StockMovementLines(MovementId, LineNumber);
-CREATE INDEX IF NOT EXISTS IX_StockMovementLines_ArticleId ON StockMovementLines(ArticleId);
-CREATE INDEX IF NOT EXISTS IX_StockMovementLines_BatchId ON StockMovementLines(BatchId);
-CREATE INDEX IF NOT EXISTS IX_StockMovementLines_SerialId ON StockMovementLines(SerialId);
-
--- Valorizzazione Magazzino per Periodo
-CREATE TABLE IF NOT EXISTS StockValuations (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ValuationDate TEXT NOT NULL,
- Period INTEGER NOT NULL,
- ArticleId INTEGER NOT NULL,
- WarehouseId INTEGER,
- Quantity REAL NOT NULL DEFAULT 0,
- Method INTEGER NOT NULL DEFAULT 0,
- UnitCost REAL NOT NULL DEFAULT 0,
- TotalValue REAL NOT NULL DEFAULT 0,
- InboundQuantity REAL NOT NULL DEFAULT 0,
- InboundValue REAL NOT NULL DEFAULT 0,
- OutboundQuantity REAL NOT NULL DEFAULT 0,
- OutboundValue REAL NOT NULL DEFAULT 0,
- IsClosed INTEGER NOT NULL DEFAULT 0,
- ClosedDate TEXT,
- ClosedBy TEXT,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE,
- FOREIGN KEY (WarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE SET NULL,
- UNIQUE(Period, ArticleId, WarehouseId)
-);
-
-CREATE INDEX IF NOT EXISTS IX_StockValuations_Period_ArticleId_WarehouseId ON StockValuations(Period, ArticleId, WarehouseId);
-CREATE INDEX IF NOT EXISTS IX_StockValuations_ValuationDate ON StockValuations(ValuationDate);
-CREATE INDEX IF NOT EXISTS IX_StockValuations_IsClosed ON StockValuations(IsClosed);
-
--- Layer Valorizzazione FIFO/LIFO
-CREATE TABLE IF NOT EXISTS StockValuationLayers (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- ArticleId INTEGER NOT NULL,
- WarehouseId INTEGER NOT NULL,
- BatchId INTEGER,
- LayerDate TEXT NOT NULL,
- SourceMovementId INTEGER,
- OriginalQuantity REAL NOT NULL DEFAULT 0,
- RemainingQuantity REAL NOT NULL DEFAULT 0,
- UnitCost REAL NOT NULL DEFAULT 0,
- IsExhausted INTEGER NOT NULL DEFAULT 0,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE CASCADE,
- FOREIGN KEY (WarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE CASCADE,
- FOREIGN KEY (BatchId) REFERENCES ArticleBatches(Id) ON DELETE SET NULL,
- FOREIGN KEY (SourceMovementId) REFERENCES StockMovements(Id) ON DELETE SET NULL
-);
-
-CREATE INDEX IF NOT EXISTS IX_StockValuationLayers_ArticleId_WarehouseId_LayerDate ON StockValuationLayers(ArticleId, WarehouseId, LayerDate);
-CREATE INDEX IF NOT EXISTS IX_StockValuationLayers_IsExhausted ON StockValuationLayers(IsExhausted);
-
--- Inventari Fisici (Testata)
-CREATE TABLE IF NOT EXISTS InventoryCounts (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- Code TEXT NOT NULL UNIQUE,
- Description TEXT NOT NULL,
- InventoryDate TEXT NOT NULL,
- WarehouseId INTEGER,
- CategoryId INTEGER,
- Type INTEGER NOT NULL DEFAULT 0,
- Status INTEGER NOT NULL DEFAULT 0,
- StartDate TEXT,
- EndDate TEXT,
- ConfirmedDate TEXT,
- ConfirmedBy TEXT,
- AdjustmentMovementId INTEGER,
- PositiveDifferenceValue REAL,
- NegativeDifferenceValue REAL,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (WarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE SET NULL,
- FOREIGN KEY (CategoryId) REFERENCES WarehouseArticleCategories(Id) ON DELETE SET NULL,
- FOREIGN KEY (AdjustmentMovementId) REFERENCES StockMovements(Id) ON DELETE SET NULL
-);
-
-CREATE INDEX IF NOT EXISTS IX_InventoryCounts_Code ON InventoryCounts(Code);
-CREATE INDEX IF NOT EXISTS IX_InventoryCounts_InventoryDate ON InventoryCounts(InventoryDate);
-CREATE INDEX IF NOT EXISTS IX_InventoryCounts_Status ON InventoryCounts(Status);
-
--- Inventari Fisici (Righe)
-CREATE TABLE IF NOT EXISTS InventoryCountLines (
- Id INTEGER PRIMARY KEY AUTOINCREMENT,
- InventoryCountId INTEGER NOT NULL,
- ArticleId INTEGER NOT NULL,
- WarehouseId INTEGER NOT NULL,
- BatchId INTEGER,
- LocationCode TEXT,
- TheoreticalQuantity REAL NOT NULL DEFAULT 0,
- CountedQuantity REAL,
- UnitCost REAL,
- CountedAt TEXT,
- CountedBy TEXT,
- SecondCountQuantity REAL,
- SecondCountBy TEXT,
- Notes TEXT,
- CreatedAt TEXT,
- CreatedBy TEXT,
- UpdatedAt TEXT,
- UpdatedBy TEXT,
- FOREIGN KEY (InventoryCountId) REFERENCES InventoryCounts(Id) ON DELETE CASCADE,
- FOREIGN KEY (ArticleId) REFERENCES WarehouseArticles(Id) ON DELETE RESTRICT,
- FOREIGN KEY (WarehouseId) REFERENCES WarehouseLocations(Id) ON DELETE RESTRICT,
- FOREIGN KEY (BatchId) REFERENCES ArticleBatches(Id) ON DELETE SET NULL,
- UNIQUE(InventoryCountId, ArticleId, WarehouseId, BatchId)
-);
-
-CREATE INDEX IF NOT EXISTS IX_InventoryCountLines_InventoryCountId_ArticleId ON InventoryCountLines(InventoryCountId, ArticleId, WarehouseId, BatchId);
-CREATE INDEX IF NOT EXISTS IX_InventoryCountLines_ArticleId ON InventoryCountLines(ArticleId);
diff --git a/src/backend/Zentral.Infrastructure/Migrations/20251202233615_SyncModelChanges.Designer.cs b/src/backend/Zentral.Infrastructure/Migrations/20251202233615_SyncModelChanges.Designer.cs
new file mode 100644
index 0000000..51e98a8
--- /dev/null
+++ b/src/backend/Zentral.Infrastructure/Migrations/20251202233615_SyncModelChanges.Designer.cs
@@ -0,0 +1,4354 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Zentral.Infrastructure.Data;
+
+#nullable disable
+
+namespace Zentral.Infrastructure.Migrations
+{
+ [DbContext(typeof(ZentralDbContext))]
+ [Migration("20251202233615_SyncModelChanges")]
+ partial class SyncModelChanges
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.0");
+
+ modelBuilder.Entity("Zentral.Domain.Entities.AppModule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("BasePrice")
+ .HasPrecision(18, 2)
+ .HasColumnType("TEXT");
+
+ b.Property("Code")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Dependencies")
+ .HasColumnType("TEXT");
+
+ b.Property("Description")
+ .HasColumnType("TEXT");
+
+ b.Property("Icon")
+ .HasColumnType("TEXT");
+
+ b.Property("IsAvailable")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsCore")
+ .HasColumnType("INTEGER");
+
+ b.Property("MonthlyMultiplier")
+ .HasPrecision(5, 2)
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("RoutePath")
+ .HasColumnType("TEXT");
+
+ b.Property("SortOrder")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Code")
+ .IsUnique();
+
+ b.HasIndex("SortOrder");
+
+ b.ToTable("AppModules");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.Articolo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Attivo")
+ .HasColumnType("INTEGER");
+
+ b.Property("CategoriaId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codice")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CodiceAlternativo")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Immagine")
+ .HasColumnType("BLOB");
+
+ b.Property("MimeType")
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaDisponibile")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaStdA")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaStdB")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaStdS")
+ .HasColumnType("TEXT");
+
+ b.Property("TipoMaterialeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UnitaMisura")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CategoriaId");
+
+ b.HasIndex("Codice")
+ .IsUnique();
+
+ b.HasIndex("TipoMaterialeId");
+
+ b.ToTable("Articoli");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.AutoCode", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Description")
+ .HasColumnType("TEXT");
+
+ b.Property("EntityCode")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("EntityName")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("IsEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsReadOnly")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastResetMonth")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastResetYear")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastSequence")
+ .HasColumnType("INTEGER");
+
+ b.Property("ModuleCode")
+ .HasColumnType("TEXT");
+
+ b.Property("Pattern")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Prefix")
+ .HasColumnType("TEXT");
+
+ b.Property("ResetSequenceMonthly")
+ .HasColumnType("INTEGER");
+
+ b.Property("ResetSequenceYearly")
+ .HasColumnType("INTEGER");
+
+ b.Property("SortOrder")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityCode")
+ .IsUnique();
+
+ b.HasIndex("ModuleCode");
+
+ b.ToTable("AutoCodes");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.Cliente", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Attivo")
+ .HasColumnType("INTEGER");
+
+ b.Property("Cap")
+ .HasColumnType("TEXT");
+
+ b.Property("Citta")
+ .HasColumnType("TEXT");
+
+ b.Property("Codice")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CodiceAlternativo")
+ .HasColumnType("TEXT");
+
+ b.Property("CodiceDestinatario")
+ .HasColumnType("TEXT");
+
+ b.Property("CodiceFiscale")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Email")
+ .HasColumnType("TEXT");
+
+ b.Property("Indirizzo")
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("PartitaIva")
+ .HasColumnType("TEXT");
+
+ b.Property("Pec")
+ .HasColumnType("TEXT");
+
+ b.Property("Provincia")
+ .HasColumnType("TEXT");
+
+ b.Property("RagioneSociale")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Telefono")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PartitaIva");
+
+ b.HasIndex("RagioneSociale");
+
+ b.ToTable("Clienti");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.CodiceCategoria", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Attivo")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codice")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CoeffA")
+ .HasColumnType("TEXT");
+
+ b.Property("CoeffB")
+ .HasColumnType("TEXT");
+
+ b.Property("CoeffS")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("CodiciCategoria");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.Configurazione", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Chiave")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("Valore")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Chiave")
+ .IsUnique();
+
+ b.ToTable("Configurazioni");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.CustomFieldDefinition", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("DefaultValue")
+ .HasColumnType("TEXT");
+
+ b.Property("Description")
+ .HasColumnType("TEXT");
+
+ b.Property("EntityName")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("FieldName")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("IsActive")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsRequired")
+ .HasColumnType("INTEGER");
+
+ b.Property("Label")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("OptionsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Placeholder")
+ .HasColumnType("TEXT");
+
+ b.Property("SortOrder")
+ .HasColumnType("INTEGER");
+
+ b.Property("Type")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("ValidationRegex")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityName");
+
+ b.HasIndex("EntityName", "FieldName")
+ .IsUnique();
+
+ b.ToTable("CustomFieldDefinitions");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.Evento", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ClienteId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codice")
+ .HasColumnType("TEXT");
+
+ b.Property("Confermato")
+ .HasColumnType("INTEGER");
+
+ b.Property("CostoPersona")
+ .HasColumnType("TEXT");
+
+ b.Property("CostoTotale")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("DataEvento")
+ .HasColumnType("TEXT");
+
+ b.Property("DataScadenzaPreventivo")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .HasColumnType("TEXT");
+
+ b.Property("LocationId")
+ .HasColumnType("INTEGER");
+
+ b.Property("NoteAllestimento")
+ .HasColumnType("TEXT");
+
+ b.Property("NoteCliente")
+ .HasColumnType("TEXT");
+
+ b.Property("NoteCucina")
+ .HasColumnType("TEXT");
+
+ b.Property("NoteInterne")
+ .HasColumnType("TEXT");
+
+ b.Property("NumeroOspiti")
+ .HasColumnType("INTEGER");
+
+ b.Property("NumeroOspitiAdulti")
+ .HasColumnType("INTEGER");
+
+ b.Property("NumeroOspitiBambini")
+ .HasColumnType("INTEGER");
+
+ b.Property("NumeroOspitiBuffet")
+ .HasColumnType("INTEGER");
+
+ b.Property("NumeroOspitiSeduti")
+ .HasColumnType("INTEGER");
+
+ b.Property("OraFine")
+ .HasColumnType("TEXT");
+
+ b.Property("OraInizio")
+ .HasColumnType("TEXT");
+
+ b.Property("Saldo")
+ .HasColumnType("TEXT");
+
+ b.Property("Stato")
+ .HasColumnType("INTEGER");
+
+ b.Property("TipoEventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TotaleAcconti")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClienteId");
+
+ b.HasIndex("Codice");
+
+ b.HasIndex("DataEvento");
+
+ b.HasIndex("LocationId");
+
+ b.HasIndex("Stato");
+
+ b.HasIndex("TipoEventoId");
+
+ b.ToTable("Eventi");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoAcconto", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AConferma")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("DataPagamento")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Importo")
+ .HasColumnType("TEXT");
+
+ b.Property("MetodoPagamento")
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("Ordine")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.ToTable("EventiAcconti");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoAllegato", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Contenuto")
+ .HasColumnType("BLOB");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MimeType")
+ .HasColumnType("TEXT");
+
+ b.Property("NomeFile")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.ToTable("EventiAllegati");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoAltroCosto", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AliquotaIva")
+ .HasColumnType("TEXT");
+
+ b.Property("ApplicaIva")
+ .HasColumnType("INTEGER");
+
+ b.Property("CostoUnitario")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("Descrizione")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Ordine")
+ .HasColumnType("INTEGER");
+
+ b.Property("Quantita")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.ToTable("EventiAltriCosti");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoDegustazione", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Completata")
+ .HasColumnType("INTEGER");
+
+ b.Property("CostoDegustazione")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("DataDegustazione")
+ .HasColumnType("TEXT");
+
+ b.Property("Detraibile")
+ .HasColumnType("INTEGER");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Luogo")
+ .HasColumnType("TEXT");
+
+ b.Property("Menu")
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("NumeroPaganti")
+ .HasColumnType("INTEGER");
+
+ b.Property("NumeroPersone")
+ .HasColumnType("INTEGER");
+
+ b.Property("Ora")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.ToTable("EventiDegustazioni");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoDettaglioOspiti", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CostoUnitario")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("Numero")
+ .HasColumnType("INTEGER");
+
+ b.Property("Ordine")
+ .HasColumnType("INTEGER");
+
+ b.Property("Sconto")
+ .HasColumnType("TEXT");
+
+ b.Property("TipoOspiteId")
+ .HasColumnType("INTEGER");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.HasIndex("TipoOspiteId");
+
+ b.ToTable("EventiDettaglioOspiti");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoDettaglioPrelievo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArticoloId")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaCalcolata")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaEffettiva")
+ .HasColumnType("TEXT");
+
+ b.Property("QtaRichiesta")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArticoloId");
+
+ b.HasIndex("EventoId");
+
+ b.ToTable("EventiDettaglioPrelievo");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.EventoDettaglioRisorsa", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Costo")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("EventoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("OraFine")
+ .HasColumnType("TEXT");
+
+ b.Property("OraInizio")
+ .HasColumnType("TEXT");
+
+ b.Property("OreLavoro")
+ .HasColumnType("TEXT");
+
+ b.Property("RisorsaId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Ruolo")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("UpdatedBy")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EventoId");
+
+ b.HasIndex("RisorsaId");
+
+ b.ToTable("EventiDettaglioRisorse");
+ });
+
+ modelBuilder.Entity("Zentral.Domain.Entities.Location", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Attivo")
+ .HasColumnType("INTEGER");
+
+ b.Property("Cap")
+ .HasColumnType("TEXT");
+
+ b.Property("Citta")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedAt")
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedBy")
+ .HasColumnType("TEXT");
+
+ b.Property("CustomFieldsJson")
+ .HasColumnType("TEXT");
+
+ b.Property("DistanzaKm")
+ .HasColumnType("TEXT");
+
+ b.Property("Email")
+ .HasColumnType("TEXT");
+
+ b.Property("Indirizzo")
+ .HasColumnType("TEXT");
+
+ b.Property("Nome")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Note")
+ .HasColumnType("TEXT");
+
+ b.Property("Provincia")
+ .HasColumnType("TEXT");
+
+ b.Property