Initial commit - production deployment
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"location": {
|
||||
"id": "A0000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Madrid - Salamanca",
|
||||
"location_code": "MAD",
|
||||
"city": "Madrid",
|
||||
"zone": "Salamanca",
|
||||
"address": "Calle de Serrano, 48",
|
||||
"postal_code": "28001",
|
||||
"country": "España",
|
||||
"latitude": 40.4284,
|
||||
"longitude": -3.6847,
|
||||
"status": "ACTIVE",
|
||||
"opening_hours": "07:00-21:00",
|
||||
"daily_capacity": 2500,
|
||||
"storage_capacity_kg": 1500,
|
||||
"created_at": "2024-06-01T00:00:00Z",
|
||||
"enterprise_location": true,
|
||||
"location_type": "retail",
|
||||
"staff_count": 12,
|
||||
"description": "Premium location in upscale Salamanca district"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "68c1b366-a760-5c63-89bc-fafed412bafe",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Gerente Madrid - Salamanca",
|
||||
"email": "gerente.a0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "f21eac29-4810-5778-84d5-388c57d7d1aa",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Empleado Madrid - Salamanca",
|
||||
"email": "empleado.a0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "member",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"stock": [
|
||||
{
|
||||
"id": "965d50e9-c9dd-420f-a6e3-06bbd39186f4",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "MAD-PRO-20250116-001",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 32.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 32.0,
|
||||
"storage_location": "Madrid - Salamanca - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "80d9e71d-7468-47f9-b74c-1d7190cbfd46",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "MAD-PRO-20250116-002",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 36.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 36.0,
|
||||
"storage_location": "Madrid - Salamanca - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "6f4b9fc2-15a4-471b-abb0-734c0b814a64",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000003",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "MAD-PRO-20250116-003",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 40.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 40.0,
|
||||
"storage_location": "Madrid - Salamanca - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "e02147f2-86c4-48f7-9109-73775f997798",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "MAD-PRO-20250116-004",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 44.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 44.0,
|
||||
"storage_location": "Madrid - Salamanca - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
}
|
||||
],
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"sku": "HAR-T55-ENT-001",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo refinada tipo 55, ideal para panes tradicionales y bollería",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.78,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 700.0,
|
||||
"reorder_point": 1050.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T65",
|
||||
"sku": "HAR-T65-ENT-002",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo semi-integral tipo 65, perfecta para panes rústicos",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.87,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 560.0,
|
||||
"reorder_point": 840.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Fuerza W300",
|
||||
"sku": "HAR-FUE-003",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de gran fuerza W300, ideal para masas con alta hidratación",
|
||||
"brand": "Harinas Premium - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.06,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 350.0,
|
||||
"reorder_point": 560.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina Integral de Trigo",
|
||||
"sku": "HAR-INT-004",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina integral 100% con salvado, rica en fibra",
|
||||
"brand": "Bio Cereales - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.1,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 420.0,
|
||||
"reorder_point": 630.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recipes": [],
|
||||
"recipe_ingredients": [],
|
||||
"recipe_instructions": []
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"suppliers": []
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"equipment": [],
|
||||
"quality_check_templates": [],
|
||||
"quality_checks": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "50000001-0000-4000-a000-000000000001",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-A000-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 50,
|
||||
"quantity_good": 50,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 25.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "50000002-0000-4000-a000-000000000001",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-A000-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 60,
|
||||
"quantity_good": 60,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 30.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"purchase_orders": [],
|
||||
"purchase_order_items": []
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar - Madrid",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina - Madrid",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
}
|
||||
],
|
||||
"customer_orders": [],
|
||||
"order_items": []
|
||||
}
|
||||
@@ -0,0 +1,379 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "dde67992-5abc-4557-b927-0bd8fea21c38",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 0m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 0m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7791177b-72f3-4c7a-8af6-31b1f69c97a5",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 3m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 3m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "928e27ba-76e5-4e86-8dda-c85bde2666ba",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 6m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 6m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "8cb0f672-7b98-4fb8-8d40-c6157df9ac33",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 9m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 9m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "1bd14e1c-7cff-4502-a2b8-1c5a4cb2ef6b",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 12m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 12m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "ada4985e-242e-45aa-9ed7-2197360f765b",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 15m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 15m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a8954875-de31-4c2a-b4dc-0995cc918284",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 18m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 18m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "c8ddb626-bae7-4ab7-9e84-0d7bdd873607",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 21m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 21m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a1a326e6-2194-42dd-bede-77ebcbebc5ec",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 24m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 24m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f95d7a80-13fe-4d48-b0ef-231e7e826f56",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 27m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 27m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "5c5cfa90-816b-4f9b-a04e-132470143533",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 30m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 30m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a25b4c22-bedb-48ed-83d9-1660e4c5d174",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 33m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 33m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "86bd4fb8-138d-4d4e-8174-55b61627460b",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 36m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 36m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "21a15b7d-1ee9-4809-9ad0-15da0372cb63",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 39m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 39m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "cb6ab4c0-205f-4a17-959f-56e9fbbfb353",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 42m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 42m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "d3995f7e-fa21-48c9-bd77-9f296d936907",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 45m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 2.9,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 45m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "911efb88-a1fa-449a-8470-35a0e0517a3f",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 48m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 2.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 48m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a15316e1-4ae4-4684-be06-b8e30165889b",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 51m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 5.54,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 51m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "0b912be6-8ba4-4071-888d-acbb85e2bd34",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 54m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 18.7,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 54m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "2f6604b3-ecbe-4846-b901-94bbbaef5e48",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 57m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 8.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 57m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7fb34ca8-3b8b-4007-a6fc-7e32d72bf198",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 60m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 60m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "277c663d-2e14-4dee-ba17-38cf26cc9736",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 63m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 63m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "91bd5c55-1273-42b9-9530-054704a356df",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 66m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 66m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "5f58dd35-ea0c-49cd-864f-2fd0c55a0b9e",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 69m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 69m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "70defcf2-c89f-47fd-ab4d-d2af07611baf",
|
||||
"tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 72m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 72m",
|
||||
"notes": "Venta local en Madrid - Salamanca",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orchestration_run": null,
|
||||
"alerts": []
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"location": {
|
||||
"id": "B0000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Barcelona - Eixample",
|
||||
"location_code": "BCN",
|
||||
"city": "Barcelona",
|
||||
"zone": "Eixample",
|
||||
"address": "Passeig de Gràcia, 92",
|
||||
"postal_code": "08008",
|
||||
"country": "España",
|
||||
"latitude": 41.3947,
|
||||
"longitude": 2.1616,
|
||||
"status": "ACTIVE",
|
||||
"opening_hours": "07:00-21:00",
|
||||
"daily_capacity": 3000,
|
||||
"storage_capacity_kg": 2000,
|
||||
"created_at": "2024-06-01T00:00:00Z",
|
||||
"enterprise_location": true,
|
||||
"location_type": "retail",
|
||||
"staff_count": 15,
|
||||
"description": "High-volume tourist and local area in central Barcelona"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "c2563327-897b-506f-ac17-e7484cbee154",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Gerente Barcelona - Eixample",
|
||||
"email": "gerente.b0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "42909c80-9479-5adb-9b98-8fe32cbedab9",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Empleado Barcelona - Eixample",
|
||||
"email": "empleado.b0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "member",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"stock": [
|
||||
{
|
||||
"id": "4f94abdc-fcc1-45f7-8f4a-bc0781b983d1",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BCN-PRO-20250116-001",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 48.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 48.0,
|
||||
"storage_location": "Barcelona - Eixample - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "f1abe185-4ab8-400f-ab34-204843f65b4e",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BCN-PRO-20250116-002",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 54.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 54.0,
|
||||
"storage_location": "Barcelona - Eixample - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "bde1a1c7-08a9-4de2-bce4-823bf0d8f58e",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000003",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BCN-PRO-20250116-003",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 60.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 60.0,
|
||||
"storage_location": "Barcelona - Eixample - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "90cbc91b-2853-430a-bc8c-50498b823ffb",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BCN-PRO-20250116-004",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 66.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 66.0,
|
||||
"storage_location": "Barcelona - Eixample - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
}
|
||||
],
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"sku": "HAR-T55-ENT-001",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo refinada tipo 55, ideal para panes tradicionales y bollería",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.78,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 700.0,
|
||||
"reorder_point": 1050.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T65",
|
||||
"sku": "HAR-T65-ENT-002",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo semi-integral tipo 65, perfecta para panes rústicos",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.87,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 560.0,
|
||||
"reorder_point": 840.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Fuerza W300",
|
||||
"sku": "HAR-FUE-003",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de gran fuerza W300, ideal para masas con alta hidratación",
|
||||
"brand": "Harinas Premium - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.06,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 350.0,
|
||||
"reorder_point": 560.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina Integral de Trigo",
|
||||
"sku": "HAR-INT-004",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina integral 100% con salvado, rica en fibra",
|
||||
"brand": "Bio Cereales - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.1,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 420.0,
|
||||
"reorder_point": 630.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recipes": [],
|
||||
"recipe_ingredients": [],
|
||||
"recipe_instructions": []
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"suppliers": []
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"equipment": [],
|
||||
"quality_check_templates": [],
|
||||
"quality_checks": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "50000001-0000-4000-a000-000000000001",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-B000-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 50,
|
||||
"quantity_good": 50,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 25.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "50000002-0000-4000-a000-000000000001",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-B000-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 60,
|
||||
"quantity_good": 60,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 30.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"purchase_orders": [],
|
||||
"purchase_order_items": []
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar - Barcelona",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Barcelona",
|
||||
"postal_code": "08013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina - Barcelona",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Barcelona",
|
||||
"postal_code": "08012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
}
|
||||
],
|
||||
"customer_orders": [],
|
||||
"order_items": []
|
||||
}
|
||||
@@ -0,0 +1,529 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "c98c079b-58c0-4604-8dd6-3857ffad5d0a",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 0m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 0m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "fefa3670-b349-42a1-9ff5-ef4f8b6d2b9f",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 3m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 3m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "330fe4a8-519f-416b-82bf-b723bc46940a",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 6m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 6m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "87c3e0d2-a2cd-4601-a761-b843439bfa37",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 9m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 9m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "8e2c025d-d24c-4045-a661-bf15634d09e4",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 12m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 12m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7a38ebd1-6751-4200-9dd5-ff0d02a346eb",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 15m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 15m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "5c230de0-d3b6-45c8-96eb-e3b08b6ff1d0",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 18m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 18m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "942c135e-742d-4170-a77a-a890457c9c7f",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 21m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 21m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "0952fb16-4269-457f-97a9-f673f79a1046",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 24m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 24m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "d1f2dff4-e324-4631-b65e-1a5bb06e49a0",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 27m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 27m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "863d7175-d174-4401-a0eb-b1e1b13f5e3f",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 30m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 30m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "19ff40eb-eb0e-435d-9e79-62a882875d2d",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 33m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 33m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "486d90b8-370e-4e4f-993c-173be441e459",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 36m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 36m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "2c289f03-4a5c-4636-8292-cce140baed66",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 39m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 39m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "ed80ba2c-3765-4270-bbc5-5d04769d586f",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 42m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 42m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7715cee7-d6d9-4731-ac97-14df72c1d9ad",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 45m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 2.9,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 45m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "326a2a4a-69b7-4c2d-9770-70ff34ada0b3",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 48m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 2.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 48m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6978a848-65de-4dc5-848b-4ecf2f684ef8",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 51m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 5.54,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 51m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a005099c-e795-40cc-bea4-2ed5f6cbbfdd",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 54m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 18.7,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 54m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6230d526-b341-4edc-b77c-0203a9d09f57",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 57m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 8.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 57m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "89ce02df-c236-4e1b-801c-2a8da9615541",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 60m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 60m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "5363a886-64bc-4c23-b592-9293a3021bce",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 63m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 63m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f078cbdb-d798-4b62-944b-dbe48d69917b",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 66m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 66m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "9f07234b-4ac5-49f6-8c11-4854a6fef024",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 69m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 69m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "27615e7d-814f-43a4-8c6d-2e8fb5735d20",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 72m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 72m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6d391efa-8d6a-4912-b80f-8dd870280c37",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 75m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 75m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6ac6070b-5bda-4b6b-8bc6-fd03f9119fe5",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 78m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 78m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "c37a3242-f986-4fda-9461-1ae38783e0f1",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 81m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 81m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "9879bc0d-1708-4525-af11-cac205f81ce9",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 84m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 84m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "c2eb8c92-5262-4a7c-b4a7-ef68b5a7ee82",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 87m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 87m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "9cf70fb9-c6be-43c3-b076-5cd51ff94d75",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 90m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 90m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "b57716d8-2a99-4f63-bdf3-eb07876d3502",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 93m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 93m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "4c296e49-6b77-41ae-8a48-7341fd43a4b3",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 96m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 96m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a4a17323-86b9-44d7-843b-6cd542c0c0ed",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 99m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 99m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "027b8eb5-da87-4c2b-b951-8934c1f0153f",
|
||||
"tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 102m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 102m",
|
||||
"notes": "Venta local en Barcelona - Eixample",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orchestration_run": null,
|
||||
"alerts": []
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"location": {
|
||||
"id": "C0000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Valencia - Ruzafa",
|
||||
"location_code": "VLC",
|
||||
"city": "Valencia",
|
||||
"zone": "Ruzafa",
|
||||
"address": "Calle de Sueca, 25",
|
||||
"postal_code": "46006",
|
||||
"country": "España",
|
||||
"latitude": 39.4623,
|
||||
"longitude": -0.3645,
|
||||
"status": "ACTIVE",
|
||||
"opening_hours": "07:00-21:00",
|
||||
"daily_capacity": 2000,
|
||||
"storage_capacity_kg": 1200,
|
||||
"created_at": "2024-06-01T00:00:00Z",
|
||||
"enterprise_location": true,
|
||||
"location_type": "retail",
|
||||
"staff_count": 10,
|
||||
"description": "Trendy artisan neighborhood with focus on quality"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "f60e7eaf-dc10-5751-a76e-413e92bc0067",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Gerente Valencia - Ruzafa",
|
||||
"email": "gerente.c0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "7902d30b-6098-5100-b790-7786198605a8",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Empleado Valencia - Ruzafa",
|
||||
"email": "empleado.c0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "member",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"stock": [
|
||||
{
|
||||
"id": "66ee65db-e2a2-4483-9d53-9faf36f75e29",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "VLC-PRO-20250116-001",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 24.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 24.0,
|
||||
"storage_location": "Valencia - Ruzafa - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "f84ee2f1-7dc4-409c-a1bd-4b246771988c",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "VLC-PRO-20250116-002",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 27.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 27.0,
|
||||
"storage_location": "Valencia - Ruzafa - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "7f663dc0-07bf-4762-bb47-4c112810fd87",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000003",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "VLC-PRO-20250116-003",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 30.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 30.0,
|
||||
"storage_location": "Valencia - Ruzafa - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "5ade7edd-b8a7-4a0a-843a-a99f91121806",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "VLC-PRO-20250116-004",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 33.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 33.0,
|
||||
"storage_location": "Valencia - Ruzafa - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
}
|
||||
],
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"sku": "HAR-T55-ENT-001",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo refinada tipo 55, ideal para panes tradicionales y bollería",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.78,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 700.0,
|
||||
"reorder_point": 1050.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T65",
|
||||
"sku": "HAR-T65-ENT-002",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo semi-integral tipo 65, perfecta para panes rústicos",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.87,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 560.0,
|
||||
"reorder_point": 840.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Fuerza W300",
|
||||
"sku": "HAR-FUE-003",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de gran fuerza W300, ideal para masas con alta hidratación",
|
||||
"brand": "Harinas Premium - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.06,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 350.0,
|
||||
"reorder_point": 560.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina Integral de Trigo",
|
||||
"sku": "HAR-INT-004",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina integral 100% con salvado, rica en fibra",
|
||||
"brand": "Bio Cereales - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.1,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 420.0,
|
||||
"reorder_point": 630.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recipes": [],
|
||||
"recipe_ingredients": [],
|
||||
"recipe_instructions": []
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"suppliers": []
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"equipment": [],
|
||||
"quality_check_templates": [],
|
||||
"quality_checks": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "50000001-0000-4000-a000-000000000001",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-C000-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 50,
|
||||
"quantity_good": 50,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 25.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "50000002-0000-4000-a000-000000000001",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-C000-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 60,
|
||||
"quantity_good": 60,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 30.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"purchase_orders": [],
|
||||
"purchase_order_items": []
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar - Valencia",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Valencia",
|
||||
"postal_code": "46013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina - Valencia",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Valencia",
|
||||
"postal_code": "46012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
}
|
||||
],
|
||||
"customer_orders": [],
|
||||
"order_items": []
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "3cdfda6a-37c2-485e-99f3-39ee905bd5ee",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 0m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 0m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "07ae1a79-867c-49e4-a320-09410a08e359",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 3m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 3m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "0cef9b51-ef2e-40ff-a488-568d82f5c6e6",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 6m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 6m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "0a9af98d-2fd6-47da-bf85-a7c2ef365afb",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 9m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 9m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "73165b4b-fd89-424f-9e1c-3ecc216f8d60",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 12m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 12m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "0f8537bd-afe4-43c3-bea6-eea73e19c2e9",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 15m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 15m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f6981442-7321-453c-a49c-1f3d729c6ad8",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 18m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 18m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "8e733da7-28ca-496d-8bc7-310ed6ccfbd2",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 21m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 21m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f757e392-0f3e-453d-a6c8-2baad7dc91e8",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 24m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 24m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "90c194a8-926b-4a32-8e38-65824578b0c0",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 27m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 27m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "8874a2ce-e6b8-4b65-a5ee-4ab8f5b726c6",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 30m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 30m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "3fc14bee-6819-4b94-ab2d-3f4bd6b72c87",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 33m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 33m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "89421fb3-e5c6-4e9d-94b2-a660999b63b6",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 36m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 36m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "d804e2d4-5ac6-43d1-8438-f70b6cf18ff2",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 39m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 39m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "662934e8-084b-4a7f-ac5f-31ef65abb042",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 42m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 42m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "e7b8712b-0d00-44cc-981d-66af15603bd9",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 45m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 2.9,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 45m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f501da6f-1a09-4c47-a2e7-61061ba96a1c",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 48m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 2.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 48m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "140e74cf-882e-48a0-b083-06a266067147",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 51m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 5.54,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 51m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "f4f940e6-83a5-4399-9fb3-8ad72ba11140",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 54m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 18.7,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 54m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "e4f17a2d-87b8-4f7f-901d-463341e3919b",
|
||||
"tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 57m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 8.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 57m",
|
||||
"notes": "Venta local en Valencia - Ruzafa",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orchestration_run": null,
|
||||
"alerts": []
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"location": {
|
||||
"id": "D0000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Seville - Triana",
|
||||
"location_code": "SEV",
|
||||
"city": "Seville",
|
||||
"zone": "Triana",
|
||||
"address": "Calle Betis, 15",
|
||||
"postal_code": "41010",
|
||||
"country": "España",
|
||||
"latitude": 37.3828,
|
||||
"longitude": -6.0026,
|
||||
"status": "ACTIVE",
|
||||
"opening_hours": "07:00-21:00",
|
||||
"daily_capacity": 1800,
|
||||
"storage_capacity_kg": 1000,
|
||||
"created_at": "2024-06-01T00:00:00Z",
|
||||
"enterprise_location": true,
|
||||
"location_type": "retail",
|
||||
"staff_count": 9,
|
||||
"description": "Traditional Andalusian location with local specialties"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "0b06b4a6-4d5b-5f62-8a66-76a2a7c4510d",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Gerente Seville - Triana",
|
||||
"email": "gerente.d0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "281b76ff-3b06-557d-b2a5-3757d874a85f",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Empleado Seville - Triana",
|
||||
"email": "empleado.d0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "member",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"stock": [
|
||||
{
|
||||
"id": "11bf4708-93b9-4249-a582-32d366ee1e13",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "SEV-PRO-20250116-001",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 28.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 28.0,
|
||||
"storage_location": "Seville - Triana - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "b806a1fd-aa88-40cd-aac5-7cf075029b39",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "SEV-PRO-20250116-002",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 31.5,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 31.5,
|
||||
"storage_location": "Seville - Triana - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "4f9f63ff-979f-4bf3-bff0-2a287504614c",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000003",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "SEV-PRO-20250116-003",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 35.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 35.0,
|
||||
"storage_location": "Seville - Triana - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "518e55d1-8d99-4634-9bbc-9edf61ec3a93",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "SEV-PRO-20250116-004",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 38.5,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 38.5,
|
||||
"storage_location": "Seville - Triana - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
}
|
||||
],
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"sku": "HAR-T55-ENT-001",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo refinada tipo 55, ideal para panes tradicionales y bollería",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.78,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 700.0,
|
||||
"reorder_point": 1050.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T65",
|
||||
"sku": "HAR-T65-ENT-002",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo semi-integral tipo 65, perfecta para panes rústicos",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.87,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 560.0,
|
||||
"reorder_point": 840.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Fuerza W300",
|
||||
"sku": "HAR-FUE-003",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de gran fuerza W300, ideal para masas con alta hidratación",
|
||||
"brand": "Harinas Premium - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.06,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 350.0,
|
||||
"reorder_point": 560.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina Integral de Trigo",
|
||||
"sku": "HAR-INT-004",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina integral 100% con salvado, rica en fibra",
|
||||
"brand": "Bio Cereales - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.1,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 420.0,
|
||||
"reorder_point": 630.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recipes": [],
|
||||
"recipe_ingredients": [],
|
||||
"recipe_instructions": []
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"suppliers": []
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"equipment": [],
|
||||
"quality_check_templates": [],
|
||||
"quality_checks": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "50000001-0000-4000-a000-000000000001",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-D000-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 50,
|
||||
"quantity_good": 50,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 25.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "50000002-0000-4000-a000-000000000001",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-D000-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 60,
|
||||
"quantity_good": 60,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 30.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"purchase_orders": [],
|
||||
"purchase_order_items": []
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar - Seville",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Seville",
|
||||
"postal_code": "41013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina - Seville",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Seville",
|
||||
"postal_code": "41012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
}
|
||||
],
|
||||
"customer_orders": [],
|
||||
"order_items": []
|
||||
}
|
||||
@@ -0,0 +1,274 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "0a141dbd-fd05-4686-8996-a9e122b83440",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 0m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 0m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "ee377244-f94f-4679-b6dd-eecdd554b6ef",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 3m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 3m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6ecade43-3bb3-4ce1-ab16-0705c215d9bd",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 6m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 6m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "b9a3d1b9-90a7-4efb-bc5d-8a3e7b9c5fdd",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 9m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 9m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "1287736a-08d8-4d77-8de3-55b82427dc5e",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 12m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 12m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "e6bcfc7d-00b5-4af5-8783-2f9e47fadfb8",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 15m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 15m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "3ca59ae9-750d-4f4a-a8ad-d9d6b334ec51",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 18m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 18m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "fdd72396-5243-4bc7-a2f4-f0fb0531098d",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 21m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 21m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7aed7d6f-51c7-472a-9a60-730de1b59a4a",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 24m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 24m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "59f0511c-b8f6-4163-b0a0-3689cd12d0c9",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 27m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 27m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "9667e561-46c9-459b-aaaa-cb54167a59f6",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 30m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 30m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "22d24b17-d63d-45d4-92ba-36087ff1eb8b",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 33m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 33m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "644a08ba-c78e-4e18-9f32-6cf89a0c3087",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 36m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 36m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "2c0d30b4-d038-4106-aa94-547e2544e103",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 39m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 39m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "e6a10396-acdb-4ed7-9b77-f9e8b124e071",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 42m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 42m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "fcddb2ce-a3b4-43b6-b6bb-775a3a9b82e2",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 45m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 2.9,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 45m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a3e4973c-6a34-4bfb-b32b-26860de7b5d8",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 48m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 2.71,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 48m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "7ea27a36-819f-475d-a621-915e282c4502",
|
||||
"tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 51m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 5.54,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 51m",
|
||||
"notes": "Venta local en Seville - Triana",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orchestration_run": null,
|
||||
"alerts": []
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"location": {
|
||||
"id": "E0000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Bilbao - Casco Viejo",
|
||||
"location_code": "BIL",
|
||||
"city": "Bilbao",
|
||||
"zone": "Casco Viejo",
|
||||
"address": "Calle Somera, 8",
|
||||
"postal_code": "48005",
|
||||
"country": "España",
|
||||
"latitude": 43.2567,
|
||||
"longitude": -2.9272,
|
||||
"status": "ACTIVE",
|
||||
"opening_hours": "07:00-21:00",
|
||||
"daily_capacity": 1500,
|
||||
"storage_capacity_kg": 900,
|
||||
"created_at": "2024-06-01T00:00:00Z",
|
||||
"enterprise_location": true,
|
||||
"location_type": "retail",
|
||||
"staff_count": 8,
|
||||
"description": "Basque region location with focus on quality and local culture"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "944f50dd-b6d8-57a1-af87-20bfc1052c75",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Gerente Bilbao - Casco Viejo",
|
||||
"email": "gerente.e0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "26e92f43-d03c-5fd7-99da-c54b319f8cb3",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Empleado Bilbao - Casco Viejo",
|
||||
"email": "empleado.e0000000-0000-4000-a000-000000000001@panaderiaartesana.es",
|
||||
"role": "member",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
{
|
||||
"stock": [
|
||||
{
|
||||
"id": "e85b30cf-832f-4491-a646-156dd52e9e39",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BIL-PRO-20250116-001",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 20.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 20.0,
|
||||
"storage_location": "Bilbao - Casco Viejo - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "d117af21-52d9-4015-aa85-4ff260f5c88c",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BIL-PRO-20250116-002",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 22.5,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 22.5,
|
||||
"storage_location": "Bilbao - Casco Viejo - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "c3c5ffa9-33bc-4a5d-9cfe-981541799ed5",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000003",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BIL-PRO-20250116-003",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 25.0,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 25.0,
|
||||
"storage_location": "Bilbao - Casco Viejo - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
},
|
||||
{
|
||||
"id": "269aaab9-06c3-4bdc-8277-5a3c659f4346",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"production_stage": "raw_ingredient",
|
||||
"quality_status": "APPROVED",
|
||||
"expiration_date": "BASE_TS + 1d 6h",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BIL-PRO-20250116-004",
|
||||
"created_at": "BASE_TS - 6h",
|
||||
"current_quantity": 27.5,
|
||||
"reserved_quantity": 0.0,
|
||||
"available_quantity": 27.5,
|
||||
"storage_location": "Bilbao - Casco Viejo - Display Area",
|
||||
"updated_at": "BASE_TS - 6h",
|
||||
"is_available": true,
|
||||
"is_expired": false
|
||||
}
|
||||
],
|
||||
"ingredients": [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"sku": "HAR-T55-ENT-001",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo refinada tipo 55, ideal para panes tradicionales y bollería",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.78,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 700.0,
|
||||
"reorder_point": 1050.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Trigo T65",
|
||||
"sku": "HAR-T65-ENT-002",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de trigo semi-integral tipo 65, perfecta para panes rústicos",
|
||||
"brand": "Molinos San José - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 0.87,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 560.0,
|
||||
"reorder_point": 840.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina de Fuerza W300",
|
||||
"sku": "HAR-FUE-003",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina de gran fuerza W300, ideal para masas con alta hidratación",
|
||||
"brand": "Harinas Premium - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.06,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 350.0,
|
||||
"reorder_point": 560.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Harina Integral de Trigo",
|
||||
"sku": "HAR-INT-004",
|
||||
"barcode": null,
|
||||
"product_type": "INGREDIENT",
|
||||
"ingredient_category": "FLOUR",
|
||||
"product_category": "BREAD",
|
||||
"subcategory": null,
|
||||
"description": "Harina integral 100% con salvado, rica en fibra",
|
||||
"brand": "Bio Cereales - Enterprise Grade",
|
||||
"unit_of_measure": "KILOGRAMS",
|
||||
"package_size": null,
|
||||
"average_cost": 1.1,
|
||||
"last_purchase_price": null,
|
||||
"standard_cost": null,
|
||||
"low_stock_threshold": 420.0,
|
||||
"reorder_point": 630.0,
|
||||
"reorder_quantity": null,
|
||||
"max_stock_level": null,
|
||||
"shelf_life_days": null,
|
||||
"display_life_hours": null,
|
||||
"best_before_hours": null,
|
||||
"storage_instructions": null,
|
||||
"central_baker_product_code": null,
|
||||
"delivery_days": null,
|
||||
"minimum_order_quantity": null,
|
||||
"pack_size": null,
|
||||
"is_active": true,
|
||||
"is_perishable": false,
|
||||
"allergen_info": [
|
||||
"gluten"
|
||||
],
|
||||
"nutritional_info": null,
|
||||
"produced_locally": false,
|
||||
"recipe_id": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "ae38accc-1ad4-410d-adbc-a55630908924"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"recipes": [],
|
||||
"recipe_ingredients": [],
|
||||
"recipe_instructions": []
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"suppliers": []
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"equipment": [],
|
||||
"quality_check_templates": [],
|
||||
"quality_checks": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "50000001-0000-4000-a000-000000000001",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-E000-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 50,
|
||||
"quantity_good": 50,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 25.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "50000002-0000-4000-a000-000000000001",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-E000-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 60,
|
||||
"quantity_good": 60,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 30.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 50.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"purchase_orders": [],
|
||||
"purchase_order_items": []
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar - Bilbao",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Bilbao",
|
||||
"postal_code": "48013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina - Bilbao",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Bilbao",
|
||||
"postal_code": "48012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
}
|
||||
],
|
||||
"customer_orders": [],
|
||||
"order_items": []
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "6b021d81-0f78-4dda-af68-6ddbc721c06a",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 0m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 1.8,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 0m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "bee94849-b27c-4741-b896-491af67f24db",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 3m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 4.16,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 3m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "8e97a063-4ca4-4fc5-b2fc-9dd94ce04678",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 6m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 14.96,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 6m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "fb310fd1-27f9-4821-9d34-d1eeef8356dc",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 13h 9m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 7.26,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 13h 9m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "682a5f61-fdba-4bd5-8c1f-7e173a690521",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 12h 12m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 5.41,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 12h 12m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "b20f6751-39a1-4329-a5c9-29a71403cc4b",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 11h 15m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 2.77,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 11h 15m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "1b0f403f-e2cc-4bd7-8349-7d646dfb435b",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 10h 18m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 11.22,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 10h 18m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6ac8c158-ead3-4fe3-8dc6-010ddc9803c9",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 9h 21m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 5.81,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 9h 21m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "e2cf5f55-71eb-489d-ae01-307cd08a0d6c",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 8h 24m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 4.51,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 8h 24m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "58fb2270-4375-4d9c-9b6d-7a8fa38c2d22",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 7h 27m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 8.32,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 7h 27m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a354222f-8635-491a-a0da-b81e887bb205",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 6h 30m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 2,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 7.48,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 6h 30m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "ada5c135-4d10-431d-8f92-a7828c8ef6d4",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 5h 33m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity_sold": 3,
|
||||
"unit_price": 1.45,
|
||||
"total_revenue": 4.36,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 5h 33m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "9c01f80b-546d-4195-abb7-2a864b6c3720",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 16h 36m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity_sold": 4,
|
||||
"unit_price": 0.9,
|
||||
"total_revenue": 3.61,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"created_at": "BASE_TS - 16h 36m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "5054f48f-53c5-40ff-bee6-1138c6185803",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 15h 39m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity_sold": 5,
|
||||
"unit_price": 1.39,
|
||||
"total_revenue": 6.93,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 15h 39m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "60849ef7-7214-46cd-91ef-2c05f902cc6f",
|
||||
"tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"sale_date": "BASE_TS - 14h 42m",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity_sold": 6,
|
||||
"unit_price": 3.74,
|
||||
"total_revenue": 22.44,
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"created_at": "BASE_TS - 14h 42m",
|
||||
"notes": "Venta local en Bilbao - Casco Viejo",
|
||||
"enterprise_location_sale": true,
|
||||
"date": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"orchestration_run": null,
|
||||
"alerts": []
|
||||
}
|
||||
114
shared/demo/fixtures/enterprise/parent/01-tenant.json
Normal file
114
shared/demo/fixtures/enterprise/parent/01-tenant.json
Normal file
@@ -0,0 +1,114 @@
|
||||
{
|
||||
"tenant": {
|
||||
"id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Panadería Artesana España - Central",
|
||||
"subscription_tier": "enterprise",
|
||||
"tenant_type": "parent",
|
||||
"email": "central@panaderiaartesana.es",
|
||||
"subdomain": "artesana-central",
|
||||
"description": "Central production facility and parent tenant for Panadería Artesana España multi-location bakery chain",
|
||||
"is_active": true,
|
||||
"created_at": "2024-01-01T00:00:00Z",
|
||||
"updated_at": "2024-01-01T00:00:00Z"
|
||||
},
|
||||
"owner": {
|
||||
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"name": "Director",
|
||||
"email": "director@panaderiaartesana.es",
|
||||
"role": "owner"
|
||||
},
|
||||
"subscription": {
|
||||
"id": "80000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"plan": "enterprise",
|
||||
"status": "active",
|
||||
"monthly_price": 1999.0,
|
||||
"billing_cycle": "monthly",
|
||||
"max_users": 50,
|
||||
"max_locations": 20,
|
||||
"max_products": 5000,
|
||||
"features": {
|
||||
"multi_location_management": true,
|
||||
"centralized_inventory": true,
|
||||
"centralized_production": true,
|
||||
"bulk_procurement": true,
|
||||
"advanced_analytics": true,
|
||||
"custom_reporting": true,
|
||||
"api_access": true,
|
||||
"priority_support": true,
|
||||
"cross_location_optimization": true,
|
||||
"distribution_management": true
|
||||
},
|
||||
"trial_ends_at": "BASE_TS+60d",
|
||||
"next_billing_date": "BASE_TS+30d",
|
||||
"stripe_subscription_id": null,
|
||||
"stripe_customer_id": null,
|
||||
"cancelled_at": null,
|
||||
"cancellation_effective_date": null,
|
||||
"created_at": "BASE_TS-90d",
|
||||
"updated_at": "BASE_TS-1d",
|
||||
"is_tenant_linked": true
|
||||
},
|
||||
"children": [
|
||||
{
|
||||
"id": "A0000000-0000-4000-a000-000000000001",
|
||||
"name": "Madrid - Salamanca",
|
||||
"base_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"location": {
|
||||
"city": "Madrid",
|
||||
"zone": "Salamanca",
|
||||
"latitude": 40.4284,
|
||||
"longitude": -3.6847
|
||||
},
|
||||
"description": "Premium location in upscale Salamanca district"
|
||||
},
|
||||
{
|
||||
"id": "B0000000-0000-4000-a000-000000000001",
|
||||
"name": "Barcelona - Eixample",
|
||||
"base_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"location": {
|
||||
"city": "Barcelona",
|
||||
"zone": "Eixample",
|
||||
"latitude": 41.3947,
|
||||
"longitude": 2.1616
|
||||
},
|
||||
"description": "High-volume tourist and local area in central Barcelona"
|
||||
},
|
||||
{
|
||||
"id": "C0000000-0000-4000-a000-000000000001",
|
||||
"name": "Valencia - Ruzafa",
|
||||
"base_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"location": {
|
||||
"city": "Valencia",
|
||||
"zone": "Ruzafa",
|
||||
"latitude": 39.4623,
|
||||
"longitude": -0.3645
|
||||
},
|
||||
"description": "Trendy artisan neighborhood with focus on quality"
|
||||
},
|
||||
{
|
||||
"id": "D0000000-0000-4000-a000-000000000001",
|
||||
"name": "Seville - Triana",
|
||||
"base_tenant_id": "D0000000-0000-4000-a000-000000000001",
|
||||
"location": {
|
||||
"city": "Seville",
|
||||
"zone": "Triana",
|
||||
"latitude": 37.3828,
|
||||
"longitude": -6.0026
|
||||
},
|
||||
"description": "Traditional Andalusian location with local specialties"
|
||||
},
|
||||
{
|
||||
"id": "E0000000-0000-4000-a000-000000000001",
|
||||
"name": "Bilbao - Casco Viejo",
|
||||
"base_tenant_id": "E0000000-0000-4000-a000-000000000001",
|
||||
"location": {
|
||||
"city": "Bilbao",
|
||||
"zone": "Casco Viejo",
|
||||
"latitude": 43.2567,
|
||||
"longitude": -2.9272
|
||||
},
|
||||
"description": "Basque region location with focus on quality and local culture"
|
||||
}
|
||||
]
|
||||
}
|
||||
274
shared/demo/fixtures/enterprise/parent/02-auth.json
Normal file
274
shared/demo/fixtures/enterprise/parent/02-auth.json
Normal file
@@ -0,0 +1,274 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Director",
|
||||
"full_name": "Director",
|
||||
"email": "director@panaderiaartesana.es",
|
||||
"role": "owner",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"updated_at": "BASE_TS - 365d"
|
||||
},
|
||||
{
|
||||
"id": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Produccion",
|
||||
"email": "produccion@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 300d",
|
||||
"updated_at": "BASE_TS - 300d"
|
||||
},
|
||||
{
|
||||
"id": "9d04ab32-8b7f-4f71-b88f-d7bf1452a010",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Compras",
|
||||
"email": "compras@panaderiaartesana.es",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 280d",
|
||||
"updated_at": "BASE_TS - 280d"
|
||||
},
|
||||
{
|
||||
"id": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "calidad@panaderiaartesana.es",
|
||||
"first_name": "Jos\u00e9",
|
||||
"last_name": "Mart\u00ednez",
|
||||
"role": "admin",
|
||||
"department": "quality",
|
||||
"position": "Responsable de Calidad",
|
||||
"phone": "+34 916 123 459",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 250d",
|
||||
"permissions": [
|
||||
"quality_control",
|
||||
"batch_approve",
|
||||
"quality_reports"
|
||||
],
|
||||
"name": "Jos\u00e9 Mart\u00ednez",
|
||||
"updated_at": "BASE_TS - 250d"
|
||||
},
|
||||
{
|
||||
"id": "f6c54d0f-5899-4952-ad94-7a492c07167a",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "logistica@panaderiaartesana.es",
|
||||
"first_name": "Laura",
|
||||
"last_name": "L\u00f3pez",
|
||||
"role": "admin",
|
||||
"department": "logistics",
|
||||
"position": "Coordinadora de Log\u00edstica",
|
||||
"phone": "+34 916 123 460",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 230d",
|
||||
"permissions": [
|
||||
"distribution_manage",
|
||||
"inventory_view",
|
||||
"order_manage"
|
||||
],
|
||||
"name": "Laura L\u00f3pez",
|
||||
"updated_at": "BASE_TS - 230d"
|
||||
},
|
||||
{
|
||||
"id": "77621701-e794-48d9-87d7-dc8db905efc0",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "maestro1@panaderiaartesana.es",
|
||||
"first_name": "Antonio",
|
||||
"last_name": "S\u00e1nchez",
|
||||
"role": "admin",
|
||||
"department": "production",
|
||||
"position": "Maestro Panadero Principal",
|
||||
"phone": "+34 916 123 461",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 320d",
|
||||
"permissions": [
|
||||
"recipe_manage",
|
||||
"production_manage",
|
||||
"training"
|
||||
],
|
||||
"name": "Antonio S\u00e1nchez",
|
||||
"updated_at": "BASE_TS - 320d"
|
||||
},
|
||||
{
|
||||
"id": "f21dadbf-a37e-4f53-86e6-b5f34a0c792f",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "maestro2@panaderiaartesana.es",
|
||||
"first_name": "Isabel",
|
||||
"last_name": "Ruiz",
|
||||
"role": "admin",
|
||||
"department": "production",
|
||||
"position": "Maestra Panadera Senior",
|
||||
"phone": "+34 916 123 462",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 280d",
|
||||
"permissions": [
|
||||
"recipe_manage",
|
||||
"production_manage",
|
||||
"training"
|
||||
],
|
||||
"name": "Isabel Ruiz",
|
||||
"updated_at": "BASE_TS - 280d"
|
||||
},
|
||||
{
|
||||
"id": "701cb9d2-6049-4bb9-8d3a-1b3bd3aae45f",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "almacen1@panaderiaartesana.es",
|
||||
"first_name": "Francisco",
|
||||
"last_name": "Moreno",
|
||||
"role": "admin",
|
||||
"department": "warehouse",
|
||||
"position": "Supervisor de Almac\u00e9n",
|
||||
"phone": "+34 916 123 463",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 200d",
|
||||
"permissions": [
|
||||
"inventory_manage",
|
||||
"stock_receive",
|
||||
"stock_transfer"
|
||||
],
|
||||
"name": "Francisco Moreno",
|
||||
"updated_at": "BASE_TS - 200d"
|
||||
},
|
||||
{
|
||||
"id": "a98bbee4-96fa-4840-9eb7-1f35c6e83a36",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "almacen2@panaderiaartesana.es",
|
||||
"first_name": "Carmen",
|
||||
"last_name": "Jim\u00e9nez",
|
||||
"role": "admin",
|
||||
"department": "warehouse",
|
||||
"position": "Supervisora de Almac\u00e9n Turno Noche",
|
||||
"phone": "+34 916 123 464",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"permissions": [
|
||||
"inventory_manage",
|
||||
"stock_receive",
|
||||
"stock_transfer"
|
||||
],
|
||||
"name": "Carmen Jim\u00e9nez",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "022fba62-ff2a-4a38-b345-42228e11f04a",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "analisis@panaderiaartesana.es",
|
||||
"first_name": "David",
|
||||
"last_name": "Gonz\u00e1lez",
|
||||
"role": "admin",
|
||||
"department": "operations",
|
||||
"position": "Analista de Operaciones",
|
||||
"phone": "+34 916 123 465",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 150d",
|
||||
"permissions": [
|
||||
"reports_view",
|
||||
"analytics_view",
|
||||
"forecasting_view"
|
||||
],
|
||||
"name": "David Gonz\u00e1lez",
|
||||
"updated_at": "BASE_TS - 150d"
|
||||
},
|
||||
{
|
||||
"id": "ba2ce42e-efd7-46a6-aa09-d9f9afc1c63f",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "mantenimiento@panaderiaartesana.es",
|
||||
"first_name": "Pedro",
|
||||
"last_name": "D\u00edaz",
|
||||
"role": "admin",
|
||||
"department": "maintenance",
|
||||
"position": "T\u00e9cnico de Mantenimiento",
|
||||
"phone": "+34 916 123 466",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 200d",
|
||||
"permissions": [
|
||||
"equipment_view",
|
||||
"maintenance_log"
|
||||
],
|
||||
"name": "Pedro D\u00edaz",
|
||||
"updated_at": "BASE_TS - 200d"
|
||||
},
|
||||
{
|
||||
"id": "ba8ca79b-b81e-4fe9-b064-e58a34bf0fa3",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "turno.dia@panaderiaartesana.es",
|
||||
"first_name": "Rosa",
|
||||
"last_name": "Navarro",
|
||||
"role": "admin",
|
||||
"department": "production",
|
||||
"position": "Supervisora Turno D\u00eda",
|
||||
"phone": "+34 916 123 467",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 180d",
|
||||
"permissions": [
|
||||
"production_view",
|
||||
"batch_create",
|
||||
"staff_manage"
|
||||
],
|
||||
"name": "Rosa Navarro",
|
||||
"updated_at": "BASE_TS - 180d"
|
||||
},
|
||||
{
|
||||
"id": "75e92fec-e052-4e90-bd96-804eed44926c",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "turno.tarde@panaderiaartesana.es",
|
||||
"first_name": "Manuel",
|
||||
"last_name": "Torres",
|
||||
"role": "admin",
|
||||
"department": "production",
|
||||
"position": "Supervisor Turno Tarde",
|
||||
"phone": "+34 916 123 468",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 160d",
|
||||
"permissions": [
|
||||
"production_view",
|
||||
"batch_create",
|
||||
"staff_manage"
|
||||
],
|
||||
"name": "Manuel Torres",
|
||||
"updated_at": "BASE_TS - 160d"
|
||||
},
|
||||
{
|
||||
"id": "6fec3a43-f83d-47c3-b760-54105fcbf7f1",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "turno.noche@panaderiaartesana.es",
|
||||
"first_name": "Luc\u00eda",
|
||||
"last_name": "Romero",
|
||||
"role": "admin",
|
||||
"department": "production",
|
||||
"position": "Supervisora Turno Noche",
|
||||
"phone": "+34 916 123 469",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 140d",
|
||||
"permissions": [
|
||||
"production_view",
|
||||
"batch_create",
|
||||
"staff_manage"
|
||||
],
|
||||
"name": "Luc\u00eda Romero",
|
||||
"updated_at": "BASE_TS - 140d"
|
||||
},
|
||||
{
|
||||
"id": "743fd2c8-58b8-4431-a49f-085e0c284ff0",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"email": "it@panaderiaartesana.es",
|
||||
"first_name": "Javier",
|
||||
"last_name": "Vargas",
|
||||
"role": "admin",
|
||||
"department": "it",
|
||||
"position": "Administrador de Sistemas",
|
||||
"phone": "+34 916 123 470",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS - 200d",
|
||||
"permissions": [
|
||||
"system_admin",
|
||||
"user_manage",
|
||||
"settings_manage"
|
||||
],
|
||||
"name": "Javier Vargas",
|
||||
"updated_at": "BASE_TS - 200d"
|
||||
}
|
||||
]
|
||||
}
|
||||
15531
shared/demo/fixtures/enterprise/parent/03-inventory.json
Normal file
15531
shared/demo/fixtures/enterprise/parent/03-inventory.json
Normal file
File diff suppressed because it is too large
Load Diff
848
shared/demo/fixtures/enterprise/parent/04-recipes.json
Normal file
848
shared/demo/fixtures/enterprise/parent/04-recipes.json
Normal file
@@ -0,0 +1,848 @@
|
||||
{
|
||||
"recipes": [
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Baguette Francesa Tradicional",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"description": "Baguette francesa tradicional con corteza crujiente y miga alveolada. Perfecta para acompa\u00f1ar cualquier comida.",
|
||||
"category": "Panes",
|
||||
"cuisine_type": "Francesa",
|
||||
"difficulty_level": 2,
|
||||
"yield_quantity": 10.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 20,
|
||||
"cook_time_minutes": 25,
|
||||
"total_time_minutes": 165,
|
||||
"rest_time_minutes": 120,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Amasado",
|
||||
"description": "Mezclar harina, agua, sal y levadura. Amasar durante 15 minutos hasta obtener una masa lisa y el\u00e1stica.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Primera Fermentaci\u00f3n",
|
||||
"description": "Dejar reposar la masa en un recipiente tapado durante 60 minutos a temperatura ambiente (22-24\u00b0C).",
|
||||
"duration_minutes": 60
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Divisi\u00f3n y Formado",
|
||||
"description": "Dividir la masa en 10 piezas de 250g cada una. Formar las baguettes d\u00e1ndoles la forma alargada caracter\u00edstica.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Segunda Fermentaci\u00f3n",
|
||||
"description": "Colocar las baguettes en un lienzo enharinado y dejar fermentar 60 minutos m\u00e1s.",
|
||||
"duration_minutes": 60
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Gre\u00f1ado y Horneado",
|
||||
"description": "Hacer cortes diagonales en la superficie con una cuchilla. Hornear a 240\u00b0C con vapor inicial durante 25 minutos.",
|
||||
"duration_minutes": 25
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "Es crucial usar vapor al inicio del horneado para lograr una corteza crujiente. La temperatura del agua debe estar entre 18-20\u00b0C.",
|
||||
"storage_instructions": "Consumir el mismo d\u00eda de producci\u00f3n. Se puede congelar despu\u00e9s del horneado.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"enterprise_standard": true,
|
||||
"centrally_produced": true
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Croissant de Mantequilla Artesanal",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"description": "Croissant de mantequilla con laminado perfecto y textura hojaldrada. Elaboraci\u00f3n artesanal con mantequilla de alta calidad.",
|
||||
"category": "Boller\u00eda",
|
||||
"cuisine_type": "Francesa",
|
||||
"difficulty_level": 4,
|
||||
"yield_quantity": 12.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 45,
|
||||
"cook_time_minutes": 18,
|
||||
"total_time_minutes": 333,
|
||||
"rest_time_minutes": 270,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Preparaci\u00f3n de la Masa Base",
|
||||
"description": "Mezclar todos los ingredientes excepto la mantequilla de laminado. Amasar hasta obtener una masa homog\u00e9nea.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Reposo en Fr\u00edo",
|
||||
"description": "Envolver la masa en film y refrigerar durante 2 horas.",
|
||||
"duration_minutes": 120
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Laminado",
|
||||
"description": "Extender la masa en rect\u00e1ngulo. Colocar la mantequilla en el centro y hacer 3 dobleces sencillos con 30 minutos de reposo entre cada uno.",
|
||||
"duration_minutes": 90
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Formado",
|
||||
"description": "Extender a 3mm de grosor, cortar tri\u00e1ngulos y enrollar para formar los croissants.",
|
||||
"duration_minutes": 25
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Fermentaci\u00f3n Final",
|
||||
"description": "Dejar fermentar a 26\u00b0C durante 2-3 horas hasta que dupliquen su volumen.",
|
||||
"duration_minutes": 150
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"title": "Horneado",
|
||||
"description": "Pintar con huevo batido y hornear a 200\u00b0C durante 18 minutos hasta dorar.",
|
||||
"duration_minutes": 18
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "La mantequilla para laminar debe estar a 15-16\u00b0C, flexible pero no blanda. Trabajar en ambiente fresco.",
|
||||
"storage_instructions": "Consumir el d\u00eda de producci\u00f3n. Se puede congelar la masa formada antes de la fermentaci\u00f3n final.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"enterprise_standard": true,
|
||||
"centrally_produced": true
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Pan de Pueblo con Masa Madre",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"description": "Hogaza de pan r\u00fastico elaborada con masa madre natural. Corteza gruesa y miga densa con sabor ligeramente \u00e1cido.",
|
||||
"category": "Panes Artesanales",
|
||||
"cuisine_type": "Espa\u00f1ola",
|
||||
"difficulty_level": 3,
|
||||
"yield_quantity": 4.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 30,
|
||||
"cook_time_minutes": 45,
|
||||
"total_time_minutes": 435,
|
||||
"rest_time_minutes": 360,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Autolisis",
|
||||
"description": "Mezclar harinas y agua, dejar reposar 30 minutos para desarrollar el gluten.",
|
||||
"duration_minutes": 30
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Incorporaci\u00f3n de Masa Madre y Sal",
|
||||
"description": "A\u00f1adir la masa madre y la sal. Amasar suavemente hasta integrar completamente.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Fermentaci\u00f3n en Bloque con Pliegues",
|
||||
"description": "Realizar 4 series de pliegues cada 30 minutos durante las primeras 2 horas. Luego dejar reposar 2 horas m\u00e1s.",
|
||||
"duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Divisi\u00f3n y Preformado",
|
||||
"description": "Dividir en 4 piezas de 800g. Preformar en bolas y dejar reposar 30 minutos.",
|
||||
"duration_minutes": 30
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Formado Final",
|
||||
"description": "Formar las hogazas d\u00e1ndoles tensi\u00f3n superficial. Colocar en banneton o lienzo enharinado.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"title": "Fermentaci\u00f3n Final",
|
||||
"description": "Dejar fermentar a temperatura ambiente durante 2 horas o en fr\u00edo durante la noche.",
|
||||
"duration_minutes": 120
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"title": "Horneado",
|
||||
"description": "Hacer cortes en la superficie. Hornear a 230\u00b0C con vapor inicial durante 45 minutos.",
|
||||
"duration_minutes": 45
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "La masa madre debe estar activa y en su punto \u00f3ptimo. La temperatura final de la masa debe ser 24-25\u00b0C.",
|
||||
"storage_instructions": "Se conserva hasta 5-7 d\u00edas en bolsa de papel. Mejora al segundo d\u00eda.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"enterprise_standard": true,
|
||||
"centrally_produced": true
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Napolitana de Chocolate",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"description": "Boller\u00eda de hojaldre rectangular rellena de chocolate. Cl\u00e1sico de las panader\u00edas espa\u00f1olas.",
|
||||
"category": "Boller\u00eda",
|
||||
"cuisine_type": "Espa\u00f1ola",
|
||||
"difficulty_level": 3,
|
||||
"yield_quantity": 16.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 40,
|
||||
"cook_time_minutes": 15,
|
||||
"total_time_minutes": 325,
|
||||
"rest_time_minutes": 270,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Masa Base y Laminado",
|
||||
"description": "Preparar masa de hojaldre siguiendo el mismo proceso que los croissants.",
|
||||
"duration_minutes": 180
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Corte y Formado",
|
||||
"description": "Extender la masa y cortar rect\u00e1ngulos de 10x15cm. Colocar barritas de chocolate en el centro.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Sellado",
|
||||
"description": "Doblar la masa sobre s\u00ed misma para cubrir el chocolate. Sellar bien los bordes.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Fermentaci\u00f3n",
|
||||
"description": "Dejar fermentar a 26\u00b0C durante 90 minutos.",
|
||||
"duration_minutes": 90
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Horneado",
|
||||
"description": "Pintar con huevo y hornear a 190\u00b0C durante 15 minutos.",
|
||||
"duration_minutes": 15
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "El chocolate debe ser de buena calidad para un mejor resultado. No sobrecargar de chocolate.",
|
||||
"storage_instructions": "Consumir preferiblemente el d\u00eda de producci\u00f3n.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": false,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"enterprise_standard": true,
|
||||
"centrally_produced": true
|
||||
}
|
||||
],
|
||||
"recipe_ingredients": [
|
||||
{
|
||||
"id": "473debdb-ab7c-4a79-9b41-985715695710",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 1000.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "tamizada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Secos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "545c7899-d893-41f4-a839-963235f128cd",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 650.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "temperatura ambiente",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "L\u00edquidos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "4e9ec9cc-6339-4191-bad5-c52b604106c9",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 20.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Secos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "f89b85f2-e18e-451a-8048-668bcfb6bc51",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 15.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "desmenuzada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Fermentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "5e25c0c8-17b9-4db1-b099-8dc459def206",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 500.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "89a9872d-4bf4-469f-8c84-37f7bf0c9a92",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000012",
|
||||
"quantity": 120.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "tibia",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "1843a05b-d3dd-4963-afa1-1c76fcd6922f",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 80.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "af984d98-3b75-458f-8fdd-02699dc33e9d",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000032",
|
||||
"quantity": 50.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "b09b738f-d24c-4dde-be76-6b88ea99511e",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 10.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "119496cd-e7e3-40a4-b298-09a434b679fc",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 20.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 6,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "c8fe9422-3000-42b4-a74a-cb00b6277130",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 25.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "en la masa",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 7,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "107a15bf-d2df-4e25-95fe-aee64febf112",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 250.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "para laminar (15-16\u00b0C)",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 8,
|
||||
"ingredient_group": "Laminado",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "242e8508-3adf-4b11-b482-33d740bd5397",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"quantity": 800.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Harinas",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "ea701cf5-0c6b-45aa-9519-e4dc42a40662",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"quantity": 200.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Harinas",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "3a4f0c61-8451-42fe-b3bc-4b0f4527af87",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000023",
|
||||
"quantity": 300.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "activa y alimentada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Fermentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "ededf3a3-b58a-4f10-8d12-324aa3400349",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 650.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "temperatura ambiente",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "L\u00edquidos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "93177be7-24e5-4e97-8d46-df373d6a04bc",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 22.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Condimentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "c27a4fbb-d451-4a14-b0e2-09e5cbd07bad",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 500.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "dd8a0784-ead1-483b-b183-21c71b692a7d",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 300.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Laminado",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "6434bf78-48e5-469d-a8d0-6f4dbe5c69ca",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000041",
|
||||
"quantity": 200.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "en barritas",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Relleno",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "38661b92-03e9-4dcd-ac90-86832eee9455",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000032",
|
||||
"quantity": 60.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "1ff5fb46-3361-4978-b248-a6b3bb6592f7",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 10.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "aa85612a-f99b-4c8b-a100-08ae4a9898a5",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 15.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 6,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "33c542c8-bf36-4041-957f-765bf28cc68a",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000012",
|
||||
"quantity": 150.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 7,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
}
|
||||
]
|
||||
}
|
||||
207
shared/demo/fixtures/enterprise/parent/05-suppliers.json
Normal file
207
shared/demo/fixtures/enterprise/parent/05-suppliers.json
Normal file
@@ -0,0 +1,207 @@
|
||||
{
|
||||
"suppliers": [
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Harinas del Norte",
|
||||
"supplier_code": "SUP-HARINA-001",
|
||||
"business_name": "Harinas del Norte S.L.",
|
||||
"tax_id": "B12345678",
|
||||
"contact_person": "Jos\u00e9 Mart\u00ednez (Cuentas Enterprise)",
|
||||
"email": "pedidos@harinasdelnorte.es",
|
||||
"phone": "+34 945 123 456",
|
||||
"address": "Pol. Industrial Norte, Calle 5",
|
||||
"city": "Vitoria-Gasteiz",
|
||||
"postal_code": "01000",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.5,
|
||||
"payment_terms": "60_DAYS",
|
||||
"minimum_order_amount": 200.0,
|
||||
"lead_time_days": 2,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"flour",
|
||||
"bread_improvers"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Basque Country",
|
||||
"Navarra"
|
||||
],
|
||||
"enterprise_account": false
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "L\u00e1cteos Gipuzkoa",
|
||||
"supplier_code": "SUP-LACTEO-001",
|
||||
"business_name": "L\u00e1cteos Gipuzkoa S.A.",
|
||||
"tax_id": "B87654321",
|
||||
"contact_person": "Mar\u00eda L\u00f3pez (Cuentas Enterprise)",
|
||||
"email": "ventas@lacteosgipuzkoa.com",
|
||||
"phone": "+34 943 234 567",
|
||||
"address": "Calle Urola, 12",
|
||||
"city": "Donostia-San Sebasti\u00e1n",
|
||||
"postal_code": "20001",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.8,
|
||||
"payment_terms": "30_DAYS",
|
||||
"minimum_order_amount": 150.0,
|
||||
"lead_time_days": 1,
|
||||
"contract_start_date": "2024-03-15T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"milk",
|
||||
"butter",
|
||||
"cream"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Basque Country",
|
||||
"Cantabria"
|
||||
],
|
||||
"enterprise_account": false
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Frutas Frescas",
|
||||
"supplier_code": "SUP-FRUTA-001",
|
||||
"business_name": "Frutas Frescas S.L.",
|
||||
"tax_id": "B23456789",
|
||||
"contact_person": "Carlos Ruiz (Cuentas Enterprise)",
|
||||
"email": "info@frutasfrescas.es",
|
||||
"phone": "+34 915 345 678",
|
||||
"address": "Mercado Central, Pabell\u00f3n 3",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.2,
|
||||
"payment_terms": "30_DAYS",
|
||||
"minimum_order_amount": 100.0,
|
||||
"lead_time_days": 1,
|
||||
"contract_start_date": "2024-06-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"fruits",
|
||||
"vegetables",
|
||||
"citrus"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Toledo",
|
||||
"Guadalajara"
|
||||
],
|
||||
"enterprise_account": false
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Sal de Mar",
|
||||
"supplier_code": "SUP-SAL-001",
|
||||
"business_name": "Sal de Mar S.A.",
|
||||
"tax_id": "B34567890",
|
||||
"contact_person": "Ana Mart\u00ednez (Cuentas Enterprise)",
|
||||
"email": "ventas@saldemar.com",
|
||||
"phone": "+34 965 456 789",
|
||||
"address": "Calle Salinera, 8",
|
||||
"city": "Alicante",
|
||||
"postal_code": "03001",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.7,
|
||||
"payment_terms": "60_DAYS",
|
||||
"minimum_order_amount": 50.0,
|
||||
"lead_time_days": 3,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"salt",
|
||||
"sea_salt",
|
||||
"gourmet_salt"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Valencia",
|
||||
"Murcia"
|
||||
],
|
||||
"enterprise_account": false
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Envases Pro",
|
||||
"supplier_code": "SUP-ENVASE-001",
|
||||
"business_name": "Envases Pro S.L.",
|
||||
"tax_id": "B45678901",
|
||||
"contact_person": "Luis G\u00f3mez (Cuentas Enterprise)",
|
||||
"email": "comercial@envasespro.es",
|
||||
"phone": "+34 932 345 678",
|
||||
"address": "Calle Industrial, 15",
|
||||
"city": "Barcelona",
|
||||
"postal_code": "08019",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.0,
|
||||
"payment_terms": "60_DAYS",
|
||||
"minimum_order_amount": 300.0,
|
||||
"lead_time_days": 5,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"packaging",
|
||||
"bags",
|
||||
"boxes"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Barcelona",
|
||||
"Zaragoza"
|
||||
],
|
||||
"enterprise_account": false
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Levaduras Spain",
|
||||
"supplier_code": "SUP-LEVADURA-001",
|
||||
"business_name": "Levaduras Spain S.A.",
|
||||
"tax_id": "B56789012",
|
||||
"contact_person": "Sof\u00eda Fern\u00e1ndez (Cuentas Enterprise)",
|
||||
"email": "ventas@levadurasspain.com",
|
||||
"phone": "+34 976 567 890",
|
||||
"address": "Calle Fermentaci\u00f3n, 3",
|
||||
"city": "Zaragoza",
|
||||
"postal_code": "50001",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.9,
|
||||
"payment_terms": "60_DAYS",
|
||||
"minimum_order_amount": 100.0,
|
||||
"lead_time_days": 2,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"yeast",
|
||||
"baking_yeast",
|
||||
"dry_yeast"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Zaragoza",
|
||||
"Navarra"
|
||||
],
|
||||
"enterprise_account": false
|
||||
}
|
||||
]
|
||||
}
|
||||
532
shared/demo/fixtures/enterprise/parent/06-production.json
Normal file
532
shared/demo/fixtures/enterprise/parent/06-production.json
Normal file
@@ -0,0 +1,532 @@
|
||||
{
|
||||
"equipment": [
|
||||
{
|
||||
"id": "6ad0f2c5-bacb-49e9-b6e3-7e56dbf72b2b",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Horno Rotativo Industrial 1",
|
||||
"manufacturer": "Wiesheu",
|
||||
"model": "MATADOR M8 Rack Oven",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea 1",
|
||||
"iot_enabled": false,
|
||||
"type": "oven",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 15d",
|
||||
"next_maintenance_date": "BASE_TS + 75d",
|
||||
"capacity": 320,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "20fce716-1db8-4a9b-beb9-5cba1095e349",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Horno Rotativo Industrial 2",
|
||||
"manufacturer": "Wiesheu",
|
||||
"model": "MATADOR M8 Rack Oven",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea 1",
|
||||
"iot_enabled": false,
|
||||
"type": "oven",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 10d",
|
||||
"next_maintenance_date": "BASE_TS + 80d",
|
||||
"capacity": 320,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "b91e6fff-3df2-4634-bd3a-c8b6e310b262",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Horno Rotativo Industrial 3",
|
||||
"manufacturer": "Wachtel",
|
||||
"model": "Piccolo Rack Oven",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea 2",
|
||||
"iot_enabled": false,
|
||||
"type": "oven",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 8d",
|
||||
"next_maintenance_date": "BASE_TS + 82d",
|
||||
"capacity": 240,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6892d6d5-5918-4164-8b5a-4ec305d80001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Amasadora Industrial 1",
|
||||
"manufacturer": "Diosna",
|
||||
"model": "W240 Spiral Mixer",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea Mezcla",
|
||||
"iot_enabled": false,
|
||||
"type": "mixer",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 12d",
|
||||
"next_maintenance_date": "BASE_TS + 78d",
|
||||
"capacity": 240,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "3333fc20-ee58-4ca7-aad7-be336b94abdb",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Amasadora Industrial 2",
|
||||
"manufacturer": "Diosna",
|
||||
"model": "W240 Spiral Mixer",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea Mezcla",
|
||||
"iot_enabled": false,
|
||||
"type": "mixer",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 14d",
|
||||
"next_maintenance_date": "BASE_TS + 76d",
|
||||
"capacity": 240,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "19239b69-d93e-475f-8632-f77823e1b583",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Fermentadora Industrial 1",
|
||||
"manufacturer": "Sveba Dahlen",
|
||||
"model": "P-Series Proofer",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea Fermentaci\u00f3n",
|
||||
"iot_enabled": false,
|
||||
"type": "proofer",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 20d",
|
||||
"next_maintenance_date": "BASE_TS + 70d",
|
||||
"capacity": 200,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "6da854c6-77b7-49b9-887e-6177442aebbb",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Divisora Autom\u00e1tica",
|
||||
"manufacturer": "Benier",
|
||||
"model": "Multi Divider Pro",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea Divisi\u00f3n",
|
||||
"iot_enabled": false,
|
||||
"type": "other",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 18d",
|
||||
"next_maintenance_date": "BASE_TS + 72d",
|
||||
"capacity": 3000,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "a0b631a2-a36b-417e-8926-e97304319649",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Laminadora Industrial",
|
||||
"manufacturer": "Rondo",
|
||||
"model": "Doge 630 Sheeter",
|
||||
"status": "OPERATIONAL",
|
||||
"location": "Central Production - \u00c1rea Laminado",
|
||||
"iot_enabled": false,
|
||||
"type": "other",
|
||||
"install_date": "BASE_TS",
|
||||
"last_maintenance_date": "BASE_TS - 22d",
|
||||
"next_maintenance_date": "BASE_TS + 68d",
|
||||
"capacity": 150,
|
||||
"serial_number": null,
|
||||
"firmware_version": null,
|
||||
"maintenance_interval_days": 90,
|
||||
"efficiency_percentage": null,
|
||||
"uptime_percentage": null,
|
||||
"energy_usage_kwh": null,
|
||||
"power_kw": null,
|
||||
"weight_kg": null,
|
||||
"current_temperature": null,
|
||||
"target_temperature": null,
|
||||
"iot_protocol": null,
|
||||
"iot_endpoint": null,
|
||||
"iot_port": null,
|
||||
"iot_connection_status": null,
|
||||
"iot_last_connected": null,
|
||||
"supports_realtime": false,
|
||||
"poll_interval_seconds": null,
|
||||
"temperature_zones": null,
|
||||
"supports_humidity": false,
|
||||
"supports_energy_monitoring": false,
|
||||
"supports_remote_control": false,
|
||||
"is_active": true,
|
||||
"notes": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
}
|
||||
],
|
||||
"quality_checks": [
|
||||
{
|
||||
"id": "70000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"batch_id": "40000000-0000-0000-0000-000000000001",
|
||||
"check_type": "visual_inspection",
|
||||
"check_time": "2025-01-08T14:30:00Z",
|
||||
"checker_id": "50000000-0000-0000-0000-000000000007",
|
||||
"quality_score": 9.5,
|
||||
"pass_fail": true,
|
||||
"defect_count": 2,
|
||||
"defect_types": [
|
||||
{
|
||||
"defect_type": "burnt",
|
||||
"quantity": 2.0,
|
||||
"severity": "minor"
|
||||
}
|
||||
],
|
||||
"check_notes": "Excelente aspecto y textura, 2 unidades con quemaduras leves (dentro de tolerancia)",
|
||||
"corrective_actions": null,
|
||||
"created_at": "BASE_TS - 7d 8h 30m",
|
||||
"updated_at": "BASE_TS - 7d 8h 45m"
|
||||
},
|
||||
{
|
||||
"id": "70000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"batch_id": "40000000-0000-0000-0000-000000000002",
|
||||
"check_type": "dimensional_check",
|
||||
"check_time": "2025-01-08T14:45:00Z",
|
||||
"checker_id": "50000000-0000-0000-0000-000000000007",
|
||||
"quality_score": 9.2,
|
||||
"pass_fail": true,
|
||||
"defect_count": 3,
|
||||
"defect_types": [
|
||||
{
|
||||
"defect_type": "misshapen",
|
||||
"quantity": 3.0,
|
||||
"severity": "minor"
|
||||
}
|
||||
],
|
||||
"check_notes": "Buen desarrollo y laminado, 3 unidades con forma irregular (dentro de tolerancia)",
|
||||
"corrective_actions": null,
|
||||
"created_at": "BASE_TS - 7d 8h 45m",
|
||||
"updated_at": "BASE_TS - 7d 9h"
|
||||
},
|
||||
{
|
||||
"id": "70000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"batch_id": "40000000-0000-0000-0000-000000000001",
|
||||
"check_type": "taste_test",
|
||||
"check_time": "2025-01-09T14:30:00Z",
|
||||
"checker_id": "50000000-0000-0000-0000-000000000007",
|
||||
"quality_score": 6.5,
|
||||
"pass_fail": false,
|
||||
"defect_count": 10,
|
||||
"defect_types": [
|
||||
{
|
||||
"defect_type": "off_taste",
|
||||
"quantity": 10.0,
|
||||
"severity": "major"
|
||||
}
|
||||
],
|
||||
"check_notes": "\u26a0\ufe0f CRITICAL: Sabor amargo en el chocolate, posible problema con proveedor de cacao",
|
||||
"corrective_actions": [
|
||||
"Lote puesto en cuarentena",
|
||||
"Notificado proveedor de chocolate",
|
||||
"Programada nueva prueba con muestra diferente"
|
||||
],
|
||||
"created_at": "BASE_TS - 6d 8h 30m",
|
||||
"updated_at": "BASE_TS - 6d 9h"
|
||||
},
|
||||
{
|
||||
"id": "70000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"batch_id": "40000000-0000-0000-0000-000000000001",
|
||||
"check_type": "visual_inspection",
|
||||
"check_time": "BASE_TS + 0h",
|
||||
"checker_id": null,
|
||||
"quality_score": 0.0,
|
||||
"pass_fail": false,
|
||||
"defect_count": 0,
|
||||
"defect_types": null,
|
||||
"check_notes": "\u26a0\ufe0f PENDING: Control de calidad programado para lote en producci\u00f3n",
|
||||
"corrective_actions": null,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
}
|
||||
],
|
||||
"quality_check_templates": [],
|
||||
"batches": [
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"batch_number": "BATCH-ENT-0001",
|
||||
"status": "completed",
|
||||
"quantity_produced": 100,
|
||||
"quantity_good": 100,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 1d",
|
||||
"expiration_date": "BASE_TS + 3d",
|
||||
"production_line": "Linea 1",
|
||||
"shift": "morning",
|
||||
"produced_by": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 1d",
|
||||
"updated_at": "BASE_TS - 1d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 50.0,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity_used": 10.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Baguette Tradicional",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 100.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"batch_number": "BATCH-ENT-0002",
|
||||
"status": "completed",
|
||||
"quantity_produced": 150,
|
||||
"quantity_good": 150,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 2d",
|
||||
"expiration_date": "BASE_TS + 2d",
|
||||
"production_line": "Linea 2",
|
||||
"shift": "morning",
|
||||
"produced_by": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 2d",
|
||||
"updated_at": "BASE_TS - 2d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 60.0,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity_used": 12.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Croissant de Mantequilla",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 100.0,
|
||||
"planned_duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"batch_number": "BATCH-ENT-0003",
|
||||
"status": "completed",
|
||||
"quantity_produced": 200,
|
||||
"quantity_good": 200,
|
||||
"quantity_defective": 0,
|
||||
"production_date": "BASE_TS - 3d",
|
||||
"expiration_date": "BASE_TS + 1d",
|
||||
"production_line": "Linea 3",
|
||||
"shift": "morning",
|
||||
"produced_by": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"approved_by": "80765906-0074-4206-8f58-5867df1975fd",
|
||||
"created_at": "BASE_TS - 3d",
|
||||
"updated_at": "BASE_TS - 3d",
|
||||
"is_active": true,
|
||||
"ingredients": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity_used": 70.0,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity_used": 14.0,
|
||||
"unit": "kg"
|
||||
}
|
||||
],
|
||||
"product_name": "Pan de Pueblo con Masa Madre",
|
||||
"planned_start_time": "BASE_TS",
|
||||
"planned_end_time": "BASE_TS + 4h",
|
||||
"actual_start_time": "BASE_TS - 1d",
|
||||
"actual_end_time": "BASE_TS - 1d + 4h",
|
||||
"planned_quantity": 100.0,
|
||||
"planned_duration_minutes": 240
|
||||
}
|
||||
]
|
||||
}
|
||||
795
shared/demo/fixtures/enterprise/parent/07-procurement.json
Normal file
795
shared/demo/fixtures/enterprise/parent/07-procurement.json
Normal file
@@ -0,0 +1,795 @@
|
||||
{
|
||||
"purchase_orders": [
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-0000000000c1",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-LATE-0001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"order_date": "BASE_TS - 1d",
|
||||
"status": "confirmed",
|
||||
"priority": "high",
|
||||
"required_delivery_date": "BASE_TS - 4h",
|
||||
"estimated_delivery_date": "BASE_TS - 4h",
|
||||
"expected_delivery_date": "BASE_TS - 4h",
|
||||
"subtotal": 558.0,
|
||||
"tax_amount": 117.18,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 4866.26,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "URGENTE: Entrega en almac\u00e9n trasero",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"sent_to_supplier_at": "BASE_TS - 1d",
|
||||
"supplier_confirmation_date": "BASE_TS - 23h",
|
||||
"supplier_reference": "SUP-REF-LATE-001",
|
||||
"notes": "\u26a0\ufe0f EDGE CASE: Delivery should have arrived 4 hours ago - will trigger red supplier delay alert",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55"
|
||||
],
|
||||
"product_count": 1,
|
||||
"current_stock": 15,
|
||||
"required_stock": 150,
|
||||
"days_until_stockout": 1,
|
||||
"threshold_percentage": 20,
|
||||
"stock_percentage": 10
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "high",
|
||||
"impact_days": 1,
|
||||
"affected_products": [
|
||||
"Baguette Tradicional",
|
||||
"Pan de Pueblo"
|
||||
],
|
||||
"estimated_lost_orders": 25
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"delivery_delayed": true,
|
||||
"delay_hours": 4
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-UPCOMING-0001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"order_date": "BASE_TS - 1h",
|
||||
"status": "confirmed",
|
||||
"priority": "medium",
|
||||
"required_delivery_date": "BASE_TS + 2h30m",
|
||||
"estimated_delivery_date": "BASE_TS + 2h30m",
|
||||
"expected_delivery_date": "BASE_TS + 2h30m",
|
||||
"subtotal": 324.2,
|
||||
"tax_amount": 68.08,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 2885.96,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener refrigerado",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"sent_to_supplier_at": "BASE_TS - 1h",
|
||||
"supplier_confirmation_date": "BASE_TS - 30m",
|
||||
"supplier_reference": "SUP-REF-UPCOMING-001",
|
||||
"notes": "\u26a0\ufe0f EDGE CASE: Delivery expected in 2.5 hours - will show in upcoming deliveries",
|
||||
"reasoning_data": {
|
||||
"type": "production_requirement",
|
||||
"parameters": {
|
||||
"supplier_name": "L\u00e1cteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal",
|
||||
"Leche Entera"
|
||||
],
|
||||
"product_count": 2,
|
||||
"production_batches": 3,
|
||||
"required_by_date": "tomorrow morning"
|
||||
},
|
||||
"consequence": {
|
||||
"type": "production_delay",
|
||||
"severity": "high",
|
||||
"impact": "blocked_production"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"upcoming_delivery": true,
|
||||
"hours_until_delivery": 2.5
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 801.0,
|
||||
"tax_amount": 168.21,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 6924.47,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en almac\u00e9n trasero",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-REF-2025-001",
|
||||
"notes": "Pedido habitual semanal de harinas",
|
||||
"reasoning_data": {
|
||||
"type": "safety_stock_replenishment",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55",
|
||||
"Harina de Trigo T65",
|
||||
"Harina de Centeno",
|
||||
"Sal Marina Fina"
|
||||
],
|
||||
"product_count": 4,
|
||||
"current_safety_stock": 120,
|
||||
"target_safety_stock": 300,
|
||||
"reorder_point": 150
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "medium",
|
||||
"impact": "reduced_buffer"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"recurring_order": true,
|
||||
"schedule": "weekly"
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 7d",
|
||||
"required_delivery_date": "BASE_TS - 2d",
|
||||
"estimated_delivery_date": "BASE_TS - 2d",
|
||||
"expected_delivery_date": "BASE_TS - 2d",
|
||||
"sent_to_supplier_at": "BASE_TS - 7d",
|
||||
"supplier_confirmation_date": "BASE_TS - 6d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-002",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 573.6,
|
||||
"tax_amount": 120.46,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 4998.42,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener refrigerado",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "LGIPUZ-2025-042",
|
||||
"notes": "Pedido de l\u00e1cteos para producci\u00f3n semanal",
|
||||
"reasoning_data": {
|
||||
"type": "forecast_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "L\u00e1cteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal 82% MG"
|
||||
],
|
||||
"product_count": 1,
|
||||
"forecast_period_days": 7,
|
||||
"total_demand": 80,
|
||||
"forecast_confidence": 88
|
||||
},
|
||||
"consequence": {
|
||||
"type": "insufficient_supply",
|
||||
"severity": "medium",
|
||||
"impact_days": 7
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"forecast_confidence": 0.88,
|
||||
"ai_assisted": true,
|
||||
"perishable_goods": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 5d",
|
||||
"required_delivery_date": "BASE_TS - 1d",
|
||||
"estimated_delivery_date": "BASE_TS - 1d",
|
||||
"expected_delivery_date": "BASE_TS - 1d",
|
||||
"sent_to_supplier_at": "BASE_TS - 5d",
|
||||
"supplier_confirmation_date": "BASE_TS - 4d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-003",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000003",
|
||||
"status": "pending_approval",
|
||||
"priority": "high",
|
||||
"subtotal": 490.0,
|
||||
"tax_amount": 102.9,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 24.5,
|
||||
"total_amount": 4118.8,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Requiere inspecci\u00f3n de calidad",
|
||||
"delivery_contact": "Pedro Calidad",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"notes": "Pedido urgente para nueva l\u00ednea de productos ecol\u00f3gicos - Requiere aprobaci\u00f3n del gerente",
|
||||
"reasoning_data": {
|
||||
"type": "supplier_contract",
|
||||
"parameters": {
|
||||
"supplier_name": "Productos Ecol\u00f3gicos del Norte",
|
||||
"product_names": [
|
||||
"Harina de Espelta Ecol\u00f3gica"
|
||||
],
|
||||
"product_count": 1,
|
||||
"contract_terms": "certified_supplier",
|
||||
"contract_quantity": 200.0,
|
||||
"current_stock": 186.36,
|
||||
"reorder_point": 50.0
|
||||
},
|
||||
"consequence": {
|
||||
"type": "quality_assurance",
|
||||
"severity": "medium",
|
||||
"impact": "new_product_line_delay"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "manual",
|
||||
"ai_assisted": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 3d",
|
||||
"required_delivery_date": "BASE_TS + 1d",
|
||||
"estimated_delivery_date": "BASE_TS + 2d",
|
||||
"expected_delivery_date": "BASE_TS + 2d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-004-URGENT",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"status": "confirmed",
|
||||
"priority": "urgent",
|
||||
"subtotal": 1130.5,
|
||||
"tax_amount": 237.41,
|
||||
"shipping_cost": 15.0,
|
||||
"discount_amount": 52.0,
|
||||
"total_amount": 9316.3,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "URGENTE - Entrega antes de las 10:00 AM",
|
||||
"delivery_contact": "Isabel Producci\u00f3n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-URGENT-2025-005",
|
||||
"notes": "EDGE CASE: Entrega retrasada - debi\u00f3 llegar hace 4 horas. Stock cr\u00edtico de harina",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55",
|
||||
"Levadura Fresca"
|
||||
],
|
||||
"product_count": 2,
|
||||
"current_stock": 0,
|
||||
"required_stock": 1000,
|
||||
"days_until_stockout": 0,
|
||||
"threshold_percentage": 20,
|
||||
"stock_percentage": 0
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "critical",
|
||||
"impact_days": 0,
|
||||
"affected_products": [
|
||||
"Baguette Tradicional",
|
||||
"Croissant"
|
||||
],
|
||||
"estimated_lost_orders": 50
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"delivery_delayed": true,
|
||||
"delay_hours": 4
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000006",
|
||||
"order_date": "BASE_TS - 0.5d",
|
||||
"required_delivery_date": "BASE_TS - 0.167d",
|
||||
"estimated_delivery_date": "BASE_TS + 0.083d",
|
||||
"expected_delivery_date": "BASE_TS - 0.167d",
|
||||
"sent_to_supplier_at": "BASE_TS - 0.5d",
|
||||
"supplier_confirmation_date": "BASE_TS - 0.4d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000007",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-007",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 488.5,
|
||||
"tax_amount": 102.58,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 4277.63,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en horario de ma\u00f1ana",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-REF-2025-007",
|
||||
"notes": "Pedido de ingredientes especiales para l\u00ednea premium - Entregado hace 5 d\u00edas",
|
||||
"reasoning_data": {
|
||||
"type": "seasonal_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "Ingredientes Premium del Sur",
|
||||
"product_names": [
|
||||
"Chocolate Negro 70% Cacao",
|
||||
"Almendras Laminadas",
|
||||
"Pasas de Corinto"
|
||||
],
|
||||
"product_count": 3,
|
||||
"season": "winter",
|
||||
"expected_demand_increase_pct": 35
|
||||
},
|
||||
"consequence": {
|
||||
"type": "missed_opportunity",
|
||||
"severity": "medium",
|
||||
"impact": "lost_seasonal_sales"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"premium_line": true,
|
||||
"seasonal": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 7d",
|
||||
"required_delivery_date": "BASE_TS - 5d",
|
||||
"estimated_delivery_date": "BASE_TS - 5d",
|
||||
"expected_delivery_date": "BASE_TS - 5d",
|
||||
"sent_to_supplier_at": "BASE_TS - 7d",
|
||||
"supplier_confirmation_date": "BASE_TS - 6d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-005",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"status": "draft",
|
||||
"priority": "normal",
|
||||
"subtotal": 303.7,
|
||||
"tax_amount": 63.78,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 2712.36,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Llamar antes de entregar",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"notes": "Pedido planificado para reposici\u00f3n semanal",
|
||||
"reasoning_data": {
|
||||
"type": "forecast_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "Ingredientes Premium del Sur",
|
||||
"product_names": [
|
||||
"Specialty ingredients"
|
||||
],
|
||||
"product_count": 1,
|
||||
"forecast_period_days": 7,
|
||||
"total_demand": 280,
|
||||
"forecast_confidence": 82
|
||||
},
|
||||
"consequence": {
|
||||
"type": "insufficient_supply",
|
||||
"severity": "low",
|
||||
"impact_days": 7
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"forecast_confidence": 0.82,
|
||||
"ai_assisted": true,
|
||||
"draft_order": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS",
|
||||
"required_delivery_date": "BASE_TS + 3d",
|
||||
"estimated_delivery_date": "BASE_TS + 3d",
|
||||
"expected_delivery_date": "BASE_TS + 3d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-006",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"status": "sent_to_supplier",
|
||||
"priority": "high",
|
||||
"subtotal": 219.9,
|
||||
"tax_amount": 46.18,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 2002.56,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener cadena de fr\u00edo - Entrega urgente para producci\u00f3n",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"notes": "\u23f0 EDGE CASE: Entrega esperada en 6 horas - mantequilla para producci\u00f3n de croissants de ma\u00f1ana",
|
||||
"reasoning_data": {
|
||||
"type": "production_requirement",
|
||||
"parameters": {
|
||||
"supplier_name": "L\u00e1cteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal 82% MG"
|
||||
],
|
||||
"product_count": 1,
|
||||
"production_batches": 5,
|
||||
"required_by_date": "tomorrow 06:00"
|
||||
},
|
||||
"consequence": {
|
||||
"type": "production_delay",
|
||||
"severity": "high",
|
||||
"impact": "blocked_production"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"urgent_production": true,
|
||||
"hours_until_needed": 12
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000006",
|
||||
"order_date": "BASE_TS - 0.5d",
|
||||
"required_delivery_date": "BASE_TS + 0.25d",
|
||||
"estimated_delivery_date": "BASE_TS + 0.25d",
|
||||
"expected_delivery_date": "BASE_TS + 0.25d",
|
||||
"sent_to_supplier_at": "BASE_TS - 0.5d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000008",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"po_number": "PO-2025-008",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"order_date": "BASE_TS - 0.25d",
|
||||
"status": "pending_approval",
|
||||
"priority": "medium",
|
||||
"required_delivery_date": "BASE_TS + 2d",
|
||||
"estimated_delivery_date": "BASE_TS + 2d",
|
||||
"expected_delivery_date": "BASE_TS + 2d",
|
||||
"subtotal": 220.0,
|
||||
"tax_amount": 46.2,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 2003.4,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panader\u00eda, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en almac\u00e9n seco - Zona A",
|
||||
"delivery_contact": "Carlos Almac\u00e9n",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"notes": "Reposici\u00f3n de ingredientes b\u00e1sicos - Stock bajo en az\u00facar",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Distribuciones Alimentarias del Sur",
|
||||
"product_names": [
|
||||
"Az\u00facar Blanco Refinado"
|
||||
],
|
||||
"product_count": 1,
|
||||
"current_stock": 24.98,
|
||||
"required_stock": 120.0,
|
||||
"days_until_stockout": 3,
|
||||
"threshold_percentage": 66,
|
||||
"stock_percentage": 20
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "medium",
|
||||
"impact_days": 3,
|
||||
"affected_products": [
|
||||
"Croissants",
|
||||
"Napolitanas",
|
||||
"Pan Dulce"
|
||||
],
|
||||
"estimated_lost_orders": 15
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
}
|
||||
],
|
||||
"purchase_order_items": [
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 500.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.85,
|
||||
"line_total": 460.0,
|
||||
"received_quantity": 500.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Harina de Trigo T65",
|
||||
"product_code": "HAR-T65-002",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.9,
|
||||
"line_total": 196.0,
|
||||
"received_quantity": 200.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000005",
|
||||
"product_name": "Harina de Centeno",
|
||||
"product_code": "HAR-CEN-005",
|
||||
"ordered_quantity": 100.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 1.06,
|
||||
"line_total": 115.0,
|
||||
"received_quantity": 100.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000031",
|
||||
"product_name": "Sal Marina Fina",
|
||||
"product_code": "BAS-SAL-001",
|
||||
"ordered_quantity": 50.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.55,
|
||||
"line_total": 30.0,
|
||||
"received_quantity": 50.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000002",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 80.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 6.6,
|
||||
"line_total": 573.6,
|
||||
"received_quantity": 80.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000004",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 1000.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.84,
|
||||
"line_total": 910.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 1000.0,
|
||||
"notes": "URGENTE - Stock cr\u00edtico"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000007",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000004",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000021",
|
||||
"product_name": "Levadura Fresca de Panader\u00eda",
|
||||
"product_code": "LEV-FRE-001",
|
||||
"ordered_quantity": 50.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 4.06,
|
||||
"line_total": 220.5,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 50.0,
|
||||
"notes": "Stock agotado - prioridad m\u00e1xima"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000008",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000006",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 30.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 6.74,
|
||||
"line_total": 219.9,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 30.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000009",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000041",
|
||||
"product_name": "Chocolate Negro 70% Cacao",
|
||||
"product_code": "ESP-CHO-001",
|
||||
"ordered_quantity": 20.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 14.26,
|
||||
"line_total": 310.0,
|
||||
"received_quantity": 20.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000010",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000042",
|
||||
"product_name": "Almendras Laminadas",
|
||||
"product_code": "ESP-ALM-002",
|
||||
"ordered_quantity": 15.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 8.19,
|
||||
"line_total": 133.5,
|
||||
"received_quantity": 15.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000011",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000043",
|
||||
"product_name": "Pasas de Corinto",
|
||||
"product_code": "ESP-PAS-003",
|
||||
"ordered_quantity": 10.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 4.14,
|
||||
"line_total": 45.0,
|
||||
"received_quantity": 10.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a1",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c1",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 600.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.86,
|
||||
"line_total": 558.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 600.0,
|
||||
"notes": "URGENTE - Pedido retrasado 4 horas"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a2",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 35.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 6.59,
|
||||
"line_total": 250.6,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 35.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a3",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000012",
|
||||
"product_name": "Leche Entera Fresca",
|
||||
"product_code": "LAC-LEC-002",
|
||||
"ordered_quantity": 80.0,
|
||||
"unit_of_measure": "liters",
|
||||
"unit_price": 0.85,
|
||||
"line_total": 73.6,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 80.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a4",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000003",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000006",
|
||||
"product_name": "Harina de Espelta Ecol\u00f3gica",
|
||||
"product_code": "HAR-ESP-006",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 2.25,
|
||||
"line_total": 490.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 200.0,
|
||||
"notes": "Ingrediente ecol\u00f3gico certificado para nueva l\u00ednea"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a5",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000005",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000041",
|
||||
"product_name": "Chocolate Negro 70% Cacao",
|
||||
"product_code": "ESP-CHO-001",
|
||||
"ordered_quantity": 15.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 14.26,
|
||||
"line_total": 232.5,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 15.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a6",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000005",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000042",
|
||||
"product_name": "Almendras Laminadas",
|
||||
"product_code": "ESP-ALM-002",
|
||||
"ordered_quantity": 8.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 8.19,
|
||||
"line_total": 71.2,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 8.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a7",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000008",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000032",
|
||||
"product_name": "Az\u00facar Blanco Refinado",
|
||||
"product_code": "BAS-AZU-002",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 1.01,
|
||||
"line_total": 220.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 200.0,
|
||||
"notes": "Reposici\u00f3n stock bajo - Nivel cr\u00edtico detectado"
|
||||
}
|
||||
]
|
||||
}
|
||||
200
shared/demo/fixtures/enterprise/parent/08-orders.json
Normal file
200
shared/demo/fixtures/enterprise/parent/08-orders.json
Normal file
@@ -0,0 +1,200 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "A0000000-0000-4000-a000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Madrid - Salamanca",
|
||||
"customer_type": "WHOLESALE",
|
||||
"email": "mad@panaderiaartesana.es",
|
||||
"phone": "+34 910 123 400",
|
||||
"address": "Calle de Serrano, 48",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28001",
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"customer_code": "CUST-0001",
|
||||
"contact_person": "N/A",
|
||||
"total_orders": 0,
|
||||
"total_spent": 0.0,
|
||||
"status": "ACTIVE",
|
||||
"country": "Espa\u00f1a",
|
||||
"notes": ""
|
||||
},
|
||||
{
|
||||
"id": "B0000000-0000-4000-a000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Barcelona - Eixample",
|
||||
"customer_type": "WHOLESALE",
|
||||
"email": "bcn@panaderiaartesana.es",
|
||||
"phone": "+34 911 123 401",
|
||||
"address": "Passeig de Gr\u00e0cia, 92",
|
||||
"city": "Barcelona",
|
||||
"postal_code": "08008",
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"customer_code": "CUST-0001",
|
||||
"contact_person": "N/A",
|
||||
"total_orders": 0,
|
||||
"total_spent": 0.0,
|
||||
"status": "ACTIVE",
|
||||
"country": "Espa\u00f1a",
|
||||
"notes": ""
|
||||
},
|
||||
{
|
||||
"id": "C0000000-0000-4000-a000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Valencia - Ruzafa",
|
||||
"customer_type": "WHOLESALE",
|
||||
"email": "vlc@panaderiaartesana.es",
|
||||
"phone": "+34 912 123 402",
|
||||
"address": "Calle de Sueca, 25",
|
||||
"city": "Valencia",
|
||||
"postal_code": "46006",
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"customer_code": "CUST-0001",
|
||||
"contact_person": "N/A",
|
||||
"total_orders": 0,
|
||||
"total_spent": 0.0,
|
||||
"status": "ACTIVE",
|
||||
"country": "Espa\u00f1a",
|
||||
"notes": ""
|
||||
},
|
||||
{
|
||||
"id": "D0000000-0000-4000-a000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Seville - Triana",
|
||||
"customer_type": "WHOLESALE",
|
||||
"email": "sev@panaderiaartesana.es",
|
||||
"phone": "+34 913 123 403",
|
||||
"address": "Calle Betis, 15",
|
||||
"city": "Seville",
|
||||
"postal_code": "41010",
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"customer_code": "CUST-0001",
|
||||
"contact_person": "N/A",
|
||||
"total_orders": 0,
|
||||
"total_spent": 0.0,
|
||||
"status": "ACTIVE",
|
||||
"country": "Espa\u00f1a",
|
||||
"notes": ""
|
||||
},
|
||||
{
|
||||
"id": "E0000000-0000-4000-a000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"name": "Bilbao - Casco Viejo",
|
||||
"customer_type": "WHOLESALE",
|
||||
"email": "bil@panaderiaartesana.es",
|
||||
"phone": "+34 914 123 404",
|
||||
"address": "Calle Somera, 8",
|
||||
"city": "Bilbao",
|
||||
"postal_code": "48005",
|
||||
"created_at": "BASE_TS - 365d",
|
||||
"customer_code": "CUST-0001",
|
||||
"contact_person": "N/A",
|
||||
"total_orders": 0,
|
||||
"total_spent": 0.0,
|
||||
"status": "ACTIVE",
|
||||
"country": "Espa\u00f1a",
|
||||
"notes": ""
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis G\u00f3mez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafeter\u00eda La Esquina",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28012",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"customer_code": "CUST-003",
|
||||
"name": "Hotel Madrid Plaza",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Carlos Fern\u00e1ndez",
|
||||
"email": "compras@hotelmadridplaza.com",
|
||||
"phone": "+34 914 567 890",
|
||||
"address": "Calle Gran V\u00eda, 25",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "Espa\u00f1a",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 28,
|
||||
"total_spent": 2150.5,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Hotel chain - large volume orders"
|
||||
}
|
||||
],
|
||||
"order_items": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000101",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"order_id": "60000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 250.0,
|
||||
"unit_price": 2.12,
|
||||
"total_price": 125.0,
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000102",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"order_id": "60000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 60.0,
|
||||
"unit_price": 3.19,
|
||||
"total_price": 45.0,
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000199",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"order_id": "60000000-0000-0000-0000-000000000099",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 375.0,
|
||||
"unit_price": 2.08,
|
||||
"total_price": 183.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Urgent delivery - priority processing"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000103",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"order_id": "60000000-0000-0000-0000-000000000100",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 100.0,
|
||||
"unit_price": 2.76,
|
||||
"total_price": 65.0,
|
||||
"created_at": "BASE_TS"
|
||||
}
|
||||
],
|
||||
"customer_orders": []
|
||||
}
|
||||
3
shared/demo/fixtures/enterprise/parent/09-sales.json
Normal file
3
shared/demo/fixtures/enterprise/parent/09-sales.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"sales_data": []
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"forecasts": [],
|
||||
"prediction_batches": []
|
||||
}
|
||||
185
shared/demo/fixtures/enterprise/parent/11-orchestrator.json
Normal file
185
shared/demo/fixtures/enterprise/parent/11-orchestrator.json
Normal file
@@ -0,0 +1,185 @@
|
||||
{
|
||||
"orchestration_run": {
|
||||
"id": "90000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"run_number": "ENT-ORCH-20250116-001",
|
||||
"status": "completed",
|
||||
"run_type": "daily_enterprise",
|
||||
"started_at": "BASE_TS - 1d 16h",
|
||||
"completed_at": "BASE_TS - 1d 15h30m",
|
||||
"duration_seconds": 1800,
|
||||
"trigger_type": "scheduled",
|
||||
"trigger_source": "system",
|
||||
"created_at": "BASE_TS - 1d 16h",
|
||||
"updated_at": "BASE_TS - 1d 15h30m",
|
||||
"notes": "Enterprise multi-location orchestration - Last successful run",
|
||||
"locations_coordinated": 5
|
||||
},
|
||||
"orchestration_results": {
|
||||
"production_batches_created": 45,
|
||||
"production_batches_completed": 38,
|
||||
"production_batches_in_progress": 7,
|
||||
"purchase_orders_created": 8,
|
||||
"purchase_orders_approved": 6,
|
||||
"purchase_orders_pending_approval": 2,
|
||||
"inventory_updates": 125,
|
||||
"stock_alerts_generated": 5,
|
||||
"quality_checks_performed": 42,
|
||||
"delivery_schedules_updated": 15,
|
||||
"forecasts_generated": 45,
|
||||
"ai_insights_posted": 12,
|
||||
"notifications_sent": 28,
|
||||
"errors_encountered": 0,
|
||||
"warnings_generated": 3,
|
||||
"cross_location_optimizations": 8
|
||||
},
|
||||
"multi_location_coordination": {
|
||||
"distribution_schedules": [
|
||||
{
|
||||
"from_location": "central",
|
||||
"to_location": "madrid-salamanca",
|
||||
"scheduled_delivery": "BASE_TS + 6h",
|
||||
"products": 12,
|
||||
"total_units": 850
|
||||
},
|
||||
{
|
||||
"from_location": "central",
|
||||
"to_location": "barcelona-eixample",
|
||||
"scheduled_delivery": "BASE_TS + 8h",
|
||||
"products": 15,
|
||||
"total_units": 1200
|
||||
},
|
||||
{
|
||||
"from_location": "central",
|
||||
"to_location": "valencia-ruzafa",
|
||||
"scheduled_delivery": "BASE_TS + 7h",
|
||||
"products": 10,
|
||||
"total_units": 650
|
||||
},
|
||||
{
|
||||
"from_location": "central",
|
||||
"to_location": "seville-triana",
|
||||
"scheduled_delivery": "BASE_TS + 10h",
|
||||
"products": 9,
|
||||
"total_units": 550
|
||||
},
|
||||
{
|
||||
"from_location": "central",
|
||||
"to_location": "bilbao-casco-viejo",
|
||||
"scheduled_delivery": "BASE_TS + 12h",
|
||||
"products": 8,
|
||||
"total_units": 480
|
||||
}
|
||||
],
|
||||
"cross_location_alerts": [
|
||||
{
|
||||
"alert_type": "MULTI_LOCATION_LOW_STOCK",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"affected_locations": [
|
||||
"barcelona-eixample",
|
||||
"valencia-ruzafa"
|
||||
],
|
||||
"severity": "WARNING",
|
||||
"central_action": "Emergency procurement triggered",
|
||||
"priority_delivery_to": "barcelona-eixample"
|
||||
},
|
||||
{
|
||||
"alert_type": "QUALITY_ISSUE_RECALL",
|
||||
"product_name": "Levadura Fresca batch #CENTRAL-LEV-20250115",
|
||||
"affected_locations": [
|
||||
"madrid-salamanca",
|
||||
"seville-triana"
|
||||
],
|
||||
"severity": "CRITICAL",
|
||||
"action_taken": "Recall initiated, replacement batch scheduled"
|
||||
}
|
||||
],
|
||||
"inventory_optimization": {
|
||||
"surplus_transfers": [
|
||||
{
|
||||
"product": "Croissants",
|
||||
"from": "madrid-salamanca",
|
||||
"to": "bilbao-casco-viejo",
|
||||
"quantity": 120,
|
||||
"reason": "Madrid over-production, Bilbao shortage"
|
||||
}
|
||||
],
|
||||
"production_reallocation": [
|
||||
{
|
||||
"original_location": "barcelona-eixample",
|
||||
"new_location": "central",
|
||||
"reason": "Barcelona oven maintenance",
|
||||
"products_affected": [
|
||||
"Pan Rústico",
|
||||
"Baguette"
|
||||
],
|
||||
"quantity": 200
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ai_insights": {
|
||||
"enterprise_optimization": [
|
||||
{
|
||||
"insight_type": "CROSS_LOCATION_DEMAND_PATTERN",
|
||||
"description": "Barcelona demand peaks 2 hours before Madrid - adjust production scheduling",
|
||||
"confidence": 0.91,
|
||||
"potential_savings": "8% waste reduction",
|
||||
"affected_locations": [
|
||||
"barcelona-eixample",
|
||||
"madrid-salamanca"
|
||||
]
|
||||
},
|
||||
{
|
||||
"insight_type": "BULK_PROCUREMENT_OPPORTUNITY",
|
||||
"description": "Consolidate flour orders across all locations for 12% additional volume discount",
|
||||
"confidence": 0.89,
|
||||
"potential_savings": "€2,400/month",
|
||||
"recommended_action": "Increase central procurement by 15%"
|
||||
},
|
||||
{
|
||||
"insight_type": "DISTRIBUTION_ROUTE_OPTIMIZATION",
|
||||
"description": "Combined Valencia-Barcelona route saves 3 hours delivery time",
|
||||
"confidence": 0.94,
|
||||
"potential_savings": "€800/month fuel costs",
|
||||
"recommended_action": "Implement combined route 3x/week"
|
||||
}
|
||||
]
|
||||
},
|
||||
"system_state": {
|
||||
"last_successful_run": "BASE_TS - 1d 16h",
|
||||
"next_scheduled_run": "BASE_TS + 8h",
|
||||
"system_health": "healthy",
|
||||
"api_availability": 99.8,
|
||||
"database_performance": "optimal",
|
||||
"integration_status": "all_connected",
|
||||
"enterprise_features_active": true,
|
||||
"multi_location_sync_status": "synchronized"
|
||||
},
|
||||
"alerts": [
|
||||
{
|
||||
"alert_type": "OVERDUE_BATCH",
|
||||
"severity": "high",
|
||||
"message": "Production should have started 2 hours ago - BATCH-LATE-0001",
|
||||
"created_at": "BASE_TS",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"alert_scope": "enterprise"
|
||||
},
|
||||
{
|
||||
"alert_type": "DELAYED_DELIVERY",
|
||||
"severity": "high",
|
||||
"message": "Supplier delivery 4 hours late - PO-LATE-0001",
|
||||
"created_at": "BASE_TS",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"alert_scope": "enterprise"
|
||||
},
|
||||
{
|
||||
"alert_type": "CRITICAL_STOCK",
|
||||
"severity": "critical",
|
||||
"message": "Harina T55 below reorder point with NO pending PO",
|
||||
"created_at": "BASE_TS",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"alert_scope": "enterprise"
|
||||
}
|
||||
]
|
||||
}
|
||||
172
shared/demo/fixtures/enterprise/parent/12-distribution.json
Normal file
172
shared/demo/fixtures/enterprise/parent/12-distribution.json
Normal file
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"delivery_routes": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"route_number": "MAD-BCN-001",
|
||||
"route_date": "BASE_TS + 2h",
|
||||
"vehicle_id": "VEH-MAD-01",
|
||||
"driver_id": "d2e3f4a5-b6c7-48d9-e0f1-a2b3c4d5e6f7",
|
||||
"total_distance_km": 620.5,
|
||||
"estimated_duration_minutes": 480,
|
||||
"status": "planned",
|
||||
"route_sequence": [
|
||||
{
|
||||
"stop_number": 1,
|
||||
"location_id": "80000000-0000-4000-a000-000000000001",
|
||||
"location_name": "Panadería Central - Madrid",
|
||||
"estimated_arrival": "BASE_TS + 2h",
|
||||
"actual_arrival": null,
|
||||
"latitude": 40.4168,
|
||||
"longitude": -3.7038
|
||||
},
|
||||
{
|
||||
"stop_number": 2,
|
||||
"location_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"location_name": "Madrid Centro",
|
||||
"estimated_arrival": "BASE_TS + 6h",
|
||||
"actual_arrival": null,
|
||||
"latitude": 40.4168,
|
||||
"longitude": -3.7038
|
||||
},
|
||||
{
|
||||
"stop_number": 3,
|
||||
"location_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"location_name": "Barcelona Gràcia",
|
||||
"estimated_arrival": "BASE_TS + 10h",
|
||||
"actual_arrival": null,
|
||||
"latitude": 41.4036,
|
||||
"longitude": 2.1561
|
||||
}
|
||||
],
|
||||
"notes": "Daily delivery route from Madrid to Barcelona with stop at Madrid Centro"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"route_number": "MAD-VLC-001",
|
||||
"route_date": "BASE_TS + 3h",
|
||||
"vehicle_id": "VEH-MAD-02",
|
||||
"driver_id": "ae38accc-1ad4-410d-adbc-a55630908924",
|
||||
"total_distance_km": 355.3,
|
||||
"estimated_duration_minutes": 300,
|
||||
"status": "planned",
|
||||
"route_sequence": [
|
||||
{
|
||||
"stop_number": 1,
|
||||
"location_id": "80000000-0000-4000-a000-000000000001",
|
||||
"location_name": "Panadería Central - Madrid",
|
||||
"estimated_arrival": "BASE_TS + 3h",
|
||||
"actual_arrival": null,
|
||||
"latitude": 40.4168,
|
||||
"longitude": -3.7038
|
||||
},
|
||||
{
|
||||
"stop_number": 2,
|
||||
"location_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"location_name": "Valencia Ruzafa",
|
||||
"estimated_arrival": "BASE_TS + 7h",
|
||||
"actual_arrival": null,
|
||||
"latitude": 39.4623,
|
||||
"longitude": -0.3645
|
||||
}
|
||||
],
|
||||
"notes": "Daily delivery route from Madrid to Valencia"
|
||||
}
|
||||
],
|
||||
"shipments": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000101",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"child_tenant_id": "A0000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"delivery_route_id": "60000000-0000-0000-0000-000000000001",
|
||||
"shipment_number": "SHIP-MAD-001",
|
||||
"shipment_date": "BASE_TS + 2h30m",
|
||||
"status": "pending",
|
||||
"items": [
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Pan de Cristal",
|
||||
"quantity": 150,
|
||||
"unit": "units",
|
||||
"weight_kg": 30.0
|
||||
},
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Baguette Tradicional",
|
||||
"quantity": 200,
|
||||
"unit": "units",
|
||||
"weight_kg": 40.0
|
||||
}
|
||||
],
|
||||
"total_weight_kg": 70.0,
|
||||
"estimated_delivery_time": "BASE_TS + 6h30m",
|
||||
"actual_delivery_time": null,
|
||||
"notes": "Daily bread delivery to Madrid Centro"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000102",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"child_tenant_id": "B0000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000002",
|
||||
"delivery_route_id": "60000000-0000-0000-0000-000000000001",
|
||||
"shipment_number": "SHIP-BCN-001",
|
||||
"shipment_date": "BASE_TS + 2h45m",
|
||||
"status": "pending",
|
||||
"items": [
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"product_name": "Croissant",
|
||||
"quantity": 300,
|
||||
"unit": "units",
|
||||
"weight_kg": 45.0
|
||||
},
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"product_name": "Pain au Chocolat",
|
||||
"quantity": 250,
|
||||
"unit": "units",
|
||||
"weight_kg": 37.5
|
||||
}
|
||||
],
|
||||
"total_weight_kg": 82.5,
|
||||
"estimated_delivery_time": "BASE_TS + 10h30m",
|
||||
"actual_delivery_time": null,
|
||||
"notes": "Pastry delivery to Barcelona Gràcia"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000103",
|
||||
"tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"parent_tenant_id": "80000000-0000-4000-a000-000000000001",
|
||||
"child_tenant_id": "C0000000-0000-4000-a000-000000000001",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000003",
|
||||
"delivery_route_id": "60000000-0000-0000-0000-000000000002",
|
||||
"shipment_number": "SHIP-VLC-001",
|
||||
"shipment_date": "BASE_TS + 3h30m",
|
||||
"status": "pending",
|
||||
"items": [
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000005",
|
||||
"product_name": "Ensaimada",
|
||||
"quantity": 100,
|
||||
"unit": "units",
|
||||
"weight_kg": 25.0
|
||||
},
|
||||
{
|
||||
"product_id": "20000000-0000-0000-0000-000000000006",
|
||||
"product_name": "Tarta de Santiago",
|
||||
"quantity": 50,
|
||||
"unit": "units",
|
||||
"weight_kg": 15.0
|
||||
}
|
||||
],
|
||||
"total_weight_kg": 40.0,
|
||||
"estimated_delivery_time": "BASE_TS + 7h45m",
|
||||
"actual_delivery_time": null,
|
||||
"notes": "Specialty pastry delivery to Valencia Ruzafa"
|
||||
}
|
||||
]
|
||||
}
|
||||
50
shared/demo/fixtures/professional/01-tenant.json
Normal file
50
shared/demo/fixtures/professional/01-tenant.json
Normal file
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"tenant": {
|
||||
"id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Panadería Artesana Madrid - Demo",
|
||||
"subdomain": "demo-artesana",
|
||||
"email": "demo.professional@panaderiaartesana.com",
|
||||
"subscription_tier": "professional",
|
||||
"tenant_type": "standalone",
|
||||
"description": "Professional tier demo tenant for bakery operations",
|
||||
"is_active": true,
|
||||
"created_at": "2025-01-15T06:00:00Z",
|
||||
"updated_at": "2025-01-15T06:00:00Z"
|
||||
},
|
||||
"owner": {
|
||||
"id": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "María García López",
|
||||
"email": "maria.garcia@panaderiaartesana.com",
|
||||
"role": "owner"
|
||||
},
|
||||
"subscription": {
|
||||
"id": "80000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"plan": "professional",
|
||||
"status": "active",
|
||||
"monthly_price": 299.00,
|
||||
"billing_cycle": "monthly",
|
||||
"max_users": 10,
|
||||
"max_locations": 3,
|
||||
"max_products": 500,
|
||||
"features": {
|
||||
"production_planning": true,
|
||||
"procurement_management": true,
|
||||
"inventory_management": true,
|
||||
"sales_analytics": true,
|
||||
"multi_location": true,
|
||||
"advanced_reporting": true,
|
||||
"api_access": true,
|
||||
"priority_support": true
|
||||
},
|
||||
"trial_ends_at": "BASE_TS+30d",
|
||||
"next_billing_date": "BASE_TS+30d",
|
||||
"stripe_subscription_id": null,
|
||||
"stripe_customer_id": null,
|
||||
"cancelled_at": null,
|
||||
"cancellation_effective_date": null,
|
||||
"created_at": "BASE_TS-30d",
|
||||
"updated_at": "BASE_TS-30d",
|
||||
"is_tenant_linked": true
|
||||
}
|
||||
}
|
||||
74
shared/demo/fixtures/professional/02-auth.json
Normal file
74
shared/demo/fixtures/professional/02-auth.json
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"users": [
|
||||
{
|
||||
"id": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "María García López",
|
||||
"email": "maria.garcia@panaderiaartesana.com",
|
||||
"role": "owner",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Juan Panadero",
|
||||
"email": "juan.panadero@panaderiaartesana.com",
|
||||
"role": "baker",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Ana Ventas",
|
||||
"email": "ana.ventas@panaderiaartesana.com",
|
||||
"role": "sales",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Pedro Calidad",
|
||||
"email": "pedro.calidad@panaderiaartesana.com",
|
||||
"role": "quality_control",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Laura Admin",
|
||||
"email": "laura.admin@panaderiaartesana.com",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Carlos Almacén",
|
||||
"email": "carlos.almacen@panaderiaartesana.com",
|
||||
"role": "warehouse",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Isabel Producción",
|
||||
"email": "isabel.produccion@panaderiaartesana.com",
|
||||
"role": "production_manager",
|
||||
"is_active": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS"
|
||||
}
|
||||
]
|
||||
}
|
||||
15999
shared/demo/fixtures/professional/03-inventory.json
Normal file
15999
shared/demo/fixtures/professional/03-inventory.json
Normal file
File diff suppressed because it is too large
Load Diff
840
shared/demo/fixtures/professional/04-recipes.json
Normal file
840
shared/demo/fixtures/professional/04-recipes.json
Normal file
@@ -0,0 +1,840 @@
|
||||
{
|
||||
"recipes": [
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Baguette Francesa Tradicional",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"description": "Baguette francesa tradicional con corteza crujiente y miga alveolada. Perfecta para acompañar cualquier comida.",
|
||||
"category": "Panes",
|
||||
"cuisine_type": "Francesa",
|
||||
"difficulty_level": 2,
|
||||
"yield_quantity": 10.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 20,
|
||||
"cook_time_minutes": 25,
|
||||
"total_time_minutes": 165,
|
||||
"rest_time_minutes": 120,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Amasado",
|
||||
"description": "Mezclar harina, agua, sal y levadura. Amasar durante 15 minutos hasta obtener una masa lisa y elástica.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Primera Fermentación",
|
||||
"description": "Dejar reposar la masa en un recipiente tapado durante 60 minutos a temperatura ambiente (22-24°C).",
|
||||
"duration_minutes": 60
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "División y Formado",
|
||||
"description": "Dividir la masa en 10 piezas de 250g cada una. Formar las baguettes dándoles la forma alargada característica.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Segunda Fermentación",
|
||||
"description": "Colocar las baguettes en un lienzo enharinado y dejar fermentar 60 minutos más.",
|
||||
"duration_minutes": 60
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Greñado y Horneado",
|
||||
"description": "Hacer cortes diagonales en la superficie con una cuchilla. Hornear a 240°C con vapor inicial durante 25 minutos.",
|
||||
"duration_minutes": 25
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "Es crucial usar vapor al inicio del horneado para lograr una corteza crujiente. La temperatura del agua debe estar entre 18-20°C.",
|
||||
"storage_instructions": "Consumir el mismo día de producción. Se puede congelar después del horneado.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Croissant de Mantequilla Artesanal",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"description": "Croissant de mantequilla con laminado perfecto y textura hojaldrada. Elaboración artesanal con mantequilla de alta calidad.",
|
||||
"category": "Bollería",
|
||||
"cuisine_type": "Francesa",
|
||||
"difficulty_level": 4,
|
||||
"yield_quantity": 12.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 45,
|
||||
"cook_time_minutes": 18,
|
||||
"total_time_minutes": 333,
|
||||
"rest_time_minutes": 270,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Preparación de la Masa Base",
|
||||
"description": "Mezclar todos los ingredientes excepto la mantequilla de laminado. Amasar hasta obtener una masa homogénea.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Reposo en Frío",
|
||||
"description": "Envolver la masa en film y refrigerar durante 2 horas.",
|
||||
"duration_minutes": 120
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Laminado",
|
||||
"description": "Extender la masa en rectángulo. Colocar la mantequilla en el centro y hacer 3 dobleces sencillos con 30 minutos de reposo entre cada uno.",
|
||||
"duration_minutes": 90
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Formado",
|
||||
"description": "Extender a 3mm de grosor, cortar triángulos y enrollar para formar los croissants.",
|
||||
"duration_minutes": 25
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Fermentación Final",
|
||||
"description": "Dejar fermentar a 26°C durante 2-3 horas hasta que dupliquen su volumen.",
|
||||
"duration_minutes": 150
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"title": "Horneado",
|
||||
"description": "Pintar con huevo batido y hornear a 200°C durante 18 minutos hasta dorar.",
|
||||
"duration_minutes": 18
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "La mantequilla para laminar debe estar a 15-16°C, flexible pero no blanda. Trabajar en ambiente fresco.",
|
||||
"storage_instructions": "Consumir el día de producción. Se puede congelar la masa formada antes de la fermentación final.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Pan de Pueblo con Masa Madre",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"description": "Hogaza de pan rústico elaborada con masa madre natural. Corteza gruesa y miga densa con sabor ligeramente ácido.",
|
||||
"category": "Panes Artesanales",
|
||||
"cuisine_type": "Española",
|
||||
"difficulty_level": 3,
|
||||
"yield_quantity": 4.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 30,
|
||||
"cook_time_minutes": 45,
|
||||
"total_time_minutes": 435,
|
||||
"rest_time_minutes": 360,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Autolisis",
|
||||
"description": "Mezclar harinas y agua, dejar reposar 30 minutos para desarrollar el gluten.",
|
||||
"duration_minutes": 30
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Incorporación de Masa Madre y Sal",
|
||||
"description": "Añadir la masa madre y la sal. Amasar suavemente hasta integrar completamente.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Fermentación en Bloque con Pliegues",
|
||||
"description": "Realizar 4 series de pliegues cada 30 minutos durante las primeras 2 horas. Luego dejar reposar 2 horas más.",
|
||||
"duration_minutes": 240
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "División y Preformado",
|
||||
"description": "Dividir en 4 piezas de 800g. Preformar en bolas y dejar reposar 30 minutos.",
|
||||
"duration_minutes": 30
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Formado Final",
|
||||
"description": "Formar las hogazas dándoles tensión superficial. Colocar en banneton o lienzo enharinado.",
|
||||
"duration_minutes": 15
|
||||
},
|
||||
{
|
||||
"step": 6,
|
||||
"title": "Fermentación Final",
|
||||
"description": "Dejar fermentar a temperatura ambiente durante 2 horas o en frío durante la noche.",
|
||||
"duration_minutes": 120
|
||||
},
|
||||
{
|
||||
"step": 7,
|
||||
"title": "Horneado",
|
||||
"description": "Hacer cortes en la superficie. Hornear a 230°C con vapor inicial durante 45 minutos.",
|
||||
"duration_minutes": 45
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "La masa madre debe estar activa y en su punto óptimo. La temperatura final de la masa debe ser 24-25°C.",
|
||||
"storage_instructions": "Se conserva hasta 5-7 días en bolsa de papel. Mejora al segundo día.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": true,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
},
|
||||
{
|
||||
"id": "30000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Napolitana de Chocolate",
|
||||
"recipe_code": null,
|
||||
"version": "1.0",
|
||||
"finished_product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"description": "Bollería de hojaldre rectangular rellena de chocolate. Clásico de las panaderías españolas.",
|
||||
"category": "Bollería",
|
||||
"cuisine_type": "Española",
|
||||
"difficulty_level": 3,
|
||||
"yield_quantity": 16.0,
|
||||
"yield_unit": "units",
|
||||
"prep_time_minutes": 40,
|
||||
"cook_time_minutes": 15,
|
||||
"total_time_minutes": 325,
|
||||
"rest_time_minutes": 270,
|
||||
"estimated_cost_per_unit": null,
|
||||
"last_calculated_cost": null,
|
||||
"cost_calculation_date": null,
|
||||
"target_margin_percentage": null,
|
||||
"suggested_selling_price": null,
|
||||
"instructions": {
|
||||
"steps": [
|
||||
{
|
||||
"step": 1,
|
||||
"title": "Masa Base y Laminado",
|
||||
"description": "Preparar masa de hojaldre siguiendo el mismo proceso que los croissants.",
|
||||
"duration_minutes": 180
|
||||
},
|
||||
{
|
||||
"step": 2,
|
||||
"title": "Corte y Formado",
|
||||
"description": "Extender la masa y cortar rectángulos de 10x15cm. Colocar barritas de chocolate en el centro.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 3,
|
||||
"title": "Sellado",
|
||||
"description": "Doblar la masa sobre sí misma para cubrir el chocolate. Sellar bien los bordes.",
|
||||
"duration_minutes": 20
|
||||
},
|
||||
{
|
||||
"step": 4,
|
||||
"title": "Fermentación",
|
||||
"description": "Dejar fermentar a 26°C durante 90 minutos.",
|
||||
"duration_minutes": 90
|
||||
},
|
||||
{
|
||||
"step": 5,
|
||||
"title": "Horneado",
|
||||
"description": "Pintar con huevo y hornear a 190°C durante 15 minutos.",
|
||||
"duration_minutes": 15
|
||||
}
|
||||
]
|
||||
},
|
||||
"preparation_notes": "El chocolate debe ser de buena calidad para un mejor resultado. No sobrecargar de chocolate.",
|
||||
"storage_instructions": "Consumir preferiblemente el día de producción.",
|
||||
"serves_count": null,
|
||||
"nutritional_info": null,
|
||||
"allergen_info": null,
|
||||
"dietary_tags": null,
|
||||
"batch_size_multiplier": 1.0,
|
||||
"minimum_batch_size": null,
|
||||
"maximum_batch_size": null,
|
||||
"optimal_production_temperature": null,
|
||||
"optimal_humidity": null,
|
||||
"quality_check_configuration": null,
|
||||
"status": "ACTIVE",
|
||||
"is_seasonal": false,
|
||||
"season_start_month": null,
|
||||
"season_end_month": null,
|
||||
"is_signature_item": false,
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"updated_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
}
|
||||
],
|
||||
"recipe_ingredients": [
|
||||
{
|
||||
"id": "473debdb-ab7c-4a79-9b41-985715695710",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 1000.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "tamizada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Secos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "545c7899-d893-41f4-a839-963235f128cd",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 650.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "temperatura ambiente",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Líquidos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "4e9ec9cc-6339-4191-bad5-c52b604106c9",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 20.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Secos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "f89b85f2-e18e-451a-8048-668bcfb6bc51",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000001",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 15.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "desmenuzada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Fermentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "5e25c0c8-17b9-4db1-b099-8dc459def206",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 500.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "89a9872d-4bf4-469f-8c84-37f7bf0c9a92",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000012",
|
||||
"quantity": 120.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "tibia",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "1843a05b-d3dd-4963-afa1-1c76fcd6922f",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 80.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "af984d98-3b75-458f-8fdd-02699dc33e9d",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000032",
|
||||
"quantity": 50.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "b09b738f-d24c-4dde-be76-6b88ea99511e",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 10.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "119496cd-e7e3-40a4-b298-09a434b679fc",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 20.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 6,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "c8fe9422-3000-42b4-a74a-cb00b6277130",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 25.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "en la masa",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 7,
|
||||
"ingredient_group": "Masa base",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "107a15bf-d2df-4e25-95fe-aee64febf112",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000002",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 250.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "para laminar (15-16°C)",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 8,
|
||||
"ingredient_group": "Laminado",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "242e8508-3adf-4b11-b482-33d740bd5397",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"quantity": 800.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Harinas",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "ea701cf5-0c6b-45aa-9519-e4dc42a40662",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000004",
|
||||
"quantity": 200.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Harinas",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "3a4f0c61-8451-42fe-b3bc-4b0f4527af87",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000023",
|
||||
"quantity": 300.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "activa y alimentada",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Fermentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "ededf3a3-b58a-4f10-8d12-324aa3400349",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000033",
|
||||
"quantity": 650.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "temperatura ambiente",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Líquidos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "93177be7-24e5-4e97-8d46-df373d6a04bc",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000003",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 22.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Condimentos",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "c27a4fbb-d451-4a14-b0e2-09e5cbd07bad",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"quantity": 500.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 1,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "dd8a0784-ead1-483b-b183-21c71b692a7d",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"quantity": 300.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 2,
|
||||
"ingredient_group": "Laminado",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "6434bf78-48e5-469d-a8d0-6f4dbe5c69ca",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000041",
|
||||
"quantity": 200.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": "en barritas",
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 3,
|
||||
"ingredient_group": "Relleno",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "38661b92-03e9-4dcd-ac90-86832eee9455",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000032",
|
||||
"quantity": 60.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 4,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "1ff5fb46-3361-4978-b248-a6b3bb6592f7",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"quantity": 10.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 5,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "aa85612a-f99b-4c8b-a100-08ae4a9898a5",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"quantity": 15.0,
|
||||
"unit": "g",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 6,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
},
|
||||
{
|
||||
"id": "33c542c8-bf36-4041-957f-765bf28cc68a",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"recipe_id": "30000000-0000-0000-0000-000000000004",
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000012",
|
||||
"quantity": 150.0,
|
||||
"unit": "ml",
|
||||
"quantity_in_base_unit": null,
|
||||
"alternative_quantity": null,
|
||||
"alternative_unit": null,
|
||||
"preparation_method": null,
|
||||
"ingredient_notes": null,
|
||||
"is_optional": false,
|
||||
"ingredient_order": 7,
|
||||
"ingredient_group": "Masa",
|
||||
"substitution_options": null,
|
||||
"substitution_ratio": null,
|
||||
"unit_cost": null,
|
||||
"total_cost": null,
|
||||
"cost_updated_at": null
|
||||
}
|
||||
]
|
||||
}
|
||||
201
shared/demo/fixtures/professional/05-suppliers.json
Normal file
201
shared/demo/fixtures/professional/05-suppliers.json
Normal file
@@ -0,0 +1,201 @@
|
||||
{
|
||||
"suppliers": [
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Harinas del Norte",
|
||||
"supplier_code": "SUP-HARINA-001",
|
||||
"business_name": "Harinas del Norte S.L.",
|
||||
"tax_id": "B12345678",
|
||||
"contact_person": "José Martínez",
|
||||
"email": "pedidos@harinasdelnorte.es",
|
||||
"phone": "+34 945 123 456",
|
||||
"address": "Pol. Industrial Norte, Calle 5",
|
||||
"city": "Vitoria-Gasteiz",
|
||||
"postal_code": "01000",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.5,
|
||||
"payment_terms": "30_DAYS",
|
||||
"minimum_order_amount": 200.0,
|
||||
"lead_time_days": 2,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"flour",
|
||||
"bread_improvers"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Basque Country",
|
||||
"Navarra"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Lácteos Gipuzkoa",
|
||||
"supplier_code": "SUP-LACTEO-001",
|
||||
"business_name": "Lácteos Gipuzkoa S.A.",
|
||||
"tax_id": "B87654321",
|
||||
"contact_person": "María López",
|
||||
"email": "ventas@lacteosgipuzkoa.com",
|
||||
"phone": "+34 943 234 567",
|
||||
"address": "Calle Urola, 12",
|
||||
"city": "Donostia-San Sebastián",
|
||||
"postal_code": "20001",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.8,
|
||||
"payment_terms": "15_DAYS",
|
||||
"minimum_order_amount": 150.0,
|
||||
"lead_time_days": 1,
|
||||
"contract_start_date": "2024-03-15T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"milk",
|
||||
"butter",
|
||||
"cream"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Basque Country",
|
||||
"Cantabria"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Frutas Frescas",
|
||||
"supplier_code": "SUP-FRUTA-001",
|
||||
"business_name": "Frutas Frescas S.L.",
|
||||
"tax_id": "B23456789",
|
||||
"contact_person": "Carlos Ruiz",
|
||||
"email": "info@frutasfrescas.es",
|
||||
"phone": "+34 915 345 678",
|
||||
"address": "Mercado Central, Pabellón 3",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.2,
|
||||
"payment_terms": "7_DAYS",
|
||||
"minimum_order_amount": 100.0,
|
||||
"lead_time_days": 1,
|
||||
"contract_start_date": "2024-06-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"fruits",
|
||||
"vegetables",
|
||||
"citrus"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Toledo",
|
||||
"Guadalajara"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Sal de Mar",
|
||||
"supplier_code": "SUP-SAL-001",
|
||||
"business_name": "Sal de Mar S.A.",
|
||||
"tax_id": "B34567890",
|
||||
"contact_person": "Ana Martínez",
|
||||
"email": "ventas@saldemar.com",
|
||||
"phone": "+34 965 456 789",
|
||||
"address": "Calle Salinera, 8",
|
||||
"city": "Alicante",
|
||||
"postal_code": "03001",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.7,
|
||||
"payment_terms": "30_DAYS",
|
||||
"minimum_order_amount": 50.0,
|
||||
"lead_time_days": 3,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"salt",
|
||||
"sea_salt",
|
||||
"gourmet_salt"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Valencia",
|
||||
"Murcia"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Envases Pro",
|
||||
"supplier_code": "SUP-ENVASE-001",
|
||||
"business_name": "Envases Pro S.L.",
|
||||
"tax_id": "B45678901",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "comercial@envasespro.es",
|
||||
"phone": "+34 932 345 678",
|
||||
"address": "Calle Industrial, 15",
|
||||
"city": "Barcelona",
|
||||
"postal_code": "08019",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.0,
|
||||
"payment_terms": "60_DAYS",
|
||||
"minimum_order_amount": 300.0,
|
||||
"lead_time_days": 5,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"packaging",
|
||||
"bags",
|
||||
"boxes"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Barcelona",
|
||||
"Zaragoza"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"name": "Levaduras Spain",
|
||||
"supplier_code": "SUP-LEVADURA-001",
|
||||
"business_name": "Levaduras Spain S.A.",
|
||||
"tax_id": "B56789012",
|
||||
"contact_person": "Sofía Fernández",
|
||||
"email": "ventas@levadurasspain.com",
|
||||
"phone": "+34 976 567 890",
|
||||
"address": "Calle Fermentación, 3",
|
||||
"city": "Zaragoza",
|
||||
"postal_code": "50001",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"rating": 4.9,
|
||||
"payment_terms": "30_DAYS",
|
||||
"minimum_order_amount": 100.0,
|
||||
"lead_time_days": 2,
|
||||
"contract_start_date": "2024-01-01T00:00:00Z",
|
||||
"contract_end_date": "2025-12-31T23:59:59Z",
|
||||
"created_at": "BASE_TS",
|
||||
"specialties": [
|
||||
"yeast",
|
||||
"baking_yeast",
|
||||
"dry_yeast"
|
||||
],
|
||||
"delivery_areas": [
|
||||
"Madrid",
|
||||
"Zaragoza",
|
||||
"Navarra"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
5877
shared/demo/fixtures/professional/06-production.json
Normal file
5877
shared/demo/fixtures/professional/06-production.json
Normal file
File diff suppressed because it is too large
Load Diff
795
shared/demo/fixtures/professional/07-procurement.json
Normal file
795
shared/demo/fixtures/professional/07-procurement.json
Normal file
@@ -0,0 +1,795 @@
|
||||
{
|
||||
"purchase_orders": [
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-0000000000c1",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-LATE-0001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"order_date": "BASE_TS - 1d",
|
||||
"status": "confirmed",
|
||||
"priority": "high",
|
||||
"required_delivery_date": "BASE_TS - 4h",
|
||||
"estimated_delivery_date": "BASE_TS - 4h",
|
||||
"expected_delivery_date": "BASE_TS - 4h",
|
||||
"subtotal": 558.0,
|
||||
"tax_amount": 117.18,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 695.18,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "URGENTE: Entrega en almacén trasero",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"sent_to_supplier_at": "BASE_TS - 1d",
|
||||
"supplier_confirmation_date": "BASE_TS - 23h",
|
||||
"supplier_reference": "SUP-REF-LATE-001",
|
||||
"notes": "⚠️ EDGE CASE: Delivery should have arrived 4 hours ago - will trigger red supplier delay alert",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55"
|
||||
],
|
||||
"product_count": 1,
|
||||
"current_stock": 15,
|
||||
"required_stock": 150,
|
||||
"days_until_stockout": 1,
|
||||
"threshold_percentage": 20,
|
||||
"stock_percentage": 10
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "high",
|
||||
"impact_days": 1,
|
||||
"affected_products": [
|
||||
"Baguette Tradicional",
|
||||
"Pan de Pueblo"
|
||||
],
|
||||
"estimated_lost_orders": 25
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"delivery_delayed": true,
|
||||
"delay_hours": 4
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-UPCOMING-0001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"order_date": "BASE_TS - 1h",
|
||||
"status": "confirmed",
|
||||
"priority": "medium",
|
||||
"required_delivery_date": "BASE_TS + 2h30m",
|
||||
"estimated_delivery_date": "BASE_TS + 2h30m",
|
||||
"expected_delivery_date": "BASE_TS + 2h30m",
|
||||
"subtotal": 324.2,
|
||||
"tax_amount": 68.08,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 412.28,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener refrigerado",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"sent_to_supplier_at": "BASE_TS - 1h",
|
||||
"supplier_confirmation_date": "BASE_TS - 30m",
|
||||
"supplier_reference": "SUP-REF-UPCOMING-001",
|
||||
"notes": "⚠️ EDGE CASE: Delivery expected in 2.5 hours - will show in upcoming deliveries",
|
||||
"reasoning_data": {
|
||||
"type": "production_requirement",
|
||||
"parameters": {
|
||||
"supplier_name": "Lácteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal",
|
||||
"Leche Entera"
|
||||
],
|
||||
"product_count": 2,
|
||||
"production_batches": 3,
|
||||
"required_by_date": "tomorrow morning"
|
||||
},
|
||||
"consequence": {
|
||||
"type": "production_delay",
|
||||
"severity": "high",
|
||||
"impact": "blocked_production"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"upcoming_delivery": true,
|
||||
"hours_until_delivery": 2.5
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 801.0,
|
||||
"tax_amount": 168.21,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 989.21,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en almacén trasero",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-REF-2025-001",
|
||||
"notes": "Pedido habitual semanal de harinas",
|
||||
"reasoning_data": {
|
||||
"type": "safety_stock_replenishment",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55",
|
||||
"Harina de Trigo T65",
|
||||
"Harina de Centeno",
|
||||
"Sal Marina Fina"
|
||||
],
|
||||
"product_count": 4,
|
||||
"current_safety_stock": 120,
|
||||
"target_safety_stock": 300,
|
||||
"reorder_point": 150
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "medium",
|
||||
"impact": "reduced_buffer"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"recurring_order": true,
|
||||
"schedule": "weekly"
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 7d",
|
||||
"required_delivery_date": "BASE_TS - 2d",
|
||||
"estimated_delivery_date": "BASE_TS - 2d",
|
||||
"expected_delivery_date": "BASE_TS - 2d",
|
||||
"sent_to_supplier_at": "BASE_TS - 7d",
|
||||
"supplier_confirmation_date": "BASE_TS - 6d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-002",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 573.6,
|
||||
"tax_amount": 120.46,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 714.06,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener refrigerado",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "LGIPUZ-2025-042",
|
||||
"notes": "Pedido de lácteos para producción semanal",
|
||||
"reasoning_data": {
|
||||
"type": "forecast_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "Lácteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal 82% MG"
|
||||
],
|
||||
"product_count": 1,
|
||||
"forecast_period_days": 7,
|
||||
"total_demand": 80,
|
||||
"forecast_confidence": 88
|
||||
},
|
||||
"consequence": {
|
||||
"type": "insufficient_supply",
|
||||
"severity": "medium",
|
||||
"impact_days": 7
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"forecast_confidence": 0.88,
|
||||
"ai_assisted": true,
|
||||
"perishable_goods": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 5d",
|
||||
"required_delivery_date": "BASE_TS - 1d",
|
||||
"estimated_delivery_date": "BASE_TS - 1d",
|
||||
"expected_delivery_date": "BASE_TS - 1d",
|
||||
"sent_to_supplier_at": "BASE_TS - 5d",
|
||||
"supplier_confirmation_date": "BASE_TS - 4d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-003",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000003",
|
||||
"status": "pending_approval",
|
||||
"priority": "high",
|
||||
"subtotal": 490.0,
|
||||
"tax_amount": 102.9,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 24.5,
|
||||
"total_amount": 588.4,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Requiere inspección de calidad",
|
||||
"delivery_contact": "Pedro Calidad",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"notes": "Pedido urgente para nueva línea de productos ecológicos - Requiere aprobación del gerente",
|
||||
"reasoning_data": {
|
||||
"type": "supplier_contract",
|
||||
"parameters": {
|
||||
"supplier_name": "Productos Ecológicos del Norte",
|
||||
"product_names": [
|
||||
"Harina de Espelta Ecológica"
|
||||
],
|
||||
"product_count": 1,
|
||||
"contract_terms": "certified_supplier",
|
||||
"contract_quantity": 200.0,
|
||||
"current_stock": 186.36,
|
||||
"reorder_point": 50.0
|
||||
},
|
||||
"consequence": {
|
||||
"type": "quality_assurance",
|
||||
"severity": "medium",
|
||||
"impact": "new_product_line_delay"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "manual",
|
||||
"ai_assisted": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 3d",
|
||||
"required_delivery_date": "BASE_TS + 1d",
|
||||
"estimated_delivery_date": "BASE_TS + 2d",
|
||||
"expected_delivery_date": "BASE_TS + 2d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-004-URGENT",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"status": "confirmed",
|
||||
"priority": "urgent",
|
||||
"subtotal": 1130.5,
|
||||
"tax_amount": 237.41,
|
||||
"shipping_cost": 15.0,
|
||||
"discount_amount": 52.0,
|
||||
"total_amount": 1330.9,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "URGENTE - Entrega antes de las 10:00 AM",
|
||||
"delivery_contact": "Isabel Producción",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-URGENT-2025-005",
|
||||
"notes": "EDGE CASE: Entrega retrasada - debió llegar hace 4 horas. Stock crítico de harina",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"product_names": [
|
||||
"Harina de Trigo T55",
|
||||
"Levadura Fresca"
|
||||
],
|
||||
"product_count": 2,
|
||||
"current_stock": 0,
|
||||
"required_stock": 1000,
|
||||
"days_until_stockout": 0,
|
||||
"threshold_percentage": 20,
|
||||
"stock_percentage": 0
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "critical",
|
||||
"impact_days": 0,
|
||||
"affected_products": [
|
||||
"Baguette Tradicional",
|
||||
"Croissant"
|
||||
],
|
||||
"estimated_lost_orders": 50
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"delivery_delayed": true,
|
||||
"delay_hours": 4
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000006",
|
||||
"order_date": "BASE_TS - 0.5d",
|
||||
"required_delivery_date": "BASE_TS - 0.167d",
|
||||
"estimated_delivery_date": "BASE_TS + 0.083d",
|
||||
"expected_delivery_date": "BASE_TS - 0.167d",
|
||||
"sent_to_supplier_at": "BASE_TS - 0.5d",
|
||||
"supplier_confirmation_date": "BASE_TS - 0.4d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000007",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-007",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"status": "completed",
|
||||
"priority": "normal",
|
||||
"subtotal": 488.5,
|
||||
"tax_amount": 102.58,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 611.09,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en horario de mañana",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"supplier_reference": "SUP-REF-2025-007",
|
||||
"notes": "Pedido de ingredientes especiales para línea premium - Entregado hace 5 días",
|
||||
"reasoning_data": {
|
||||
"type": "seasonal_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "Ingredientes Premium del Sur",
|
||||
"product_names": [
|
||||
"Chocolate Negro 70% Cacao",
|
||||
"Almendras Laminadas",
|
||||
"Pasas de Corinto"
|
||||
],
|
||||
"product_count": 3,
|
||||
"season": "winter",
|
||||
"expected_demand_increase_pct": 35
|
||||
},
|
||||
"consequence": {
|
||||
"type": "missed_opportunity",
|
||||
"severity": "medium",
|
||||
"impact": "lost_seasonal_sales"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"premium_line": true,
|
||||
"seasonal": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS - 7d",
|
||||
"required_delivery_date": "BASE_TS - 5d",
|
||||
"estimated_delivery_date": "BASE_TS - 5d",
|
||||
"expected_delivery_date": "BASE_TS - 5d",
|
||||
"sent_to_supplier_at": "BASE_TS - 7d",
|
||||
"supplier_confirmation_date": "BASE_TS - 6d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-005",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"status": "draft",
|
||||
"priority": "normal",
|
||||
"subtotal": 303.7,
|
||||
"tax_amount": 63.78,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 387.48,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Llamar antes de entregar",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"notes": "Pedido planificado para reposición semanal",
|
||||
"reasoning_data": {
|
||||
"type": "forecast_demand",
|
||||
"parameters": {
|
||||
"supplier_name": "Ingredientes Premium del Sur",
|
||||
"product_names": [
|
||||
"Specialty ingredients"
|
||||
],
|
||||
"product_count": 1,
|
||||
"forecast_period_days": 7,
|
||||
"total_demand": 280,
|
||||
"forecast_confidence": 82
|
||||
},
|
||||
"consequence": {
|
||||
"type": "insufficient_supply",
|
||||
"severity": "low",
|
||||
"impact_days": 7
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"forecast_confidence": 0.82,
|
||||
"ai_assisted": true,
|
||||
"draft_order": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005",
|
||||
"order_date": "BASE_TS",
|
||||
"required_delivery_date": "BASE_TS + 3d",
|
||||
"estimated_delivery_date": "BASE_TS + 3d",
|
||||
"expected_delivery_date": "BASE_TS + 3d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-006",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"status": "sent_to_supplier",
|
||||
"priority": "high",
|
||||
"subtotal": 219.9,
|
||||
"tax_amount": 46.18,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 286.08,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Mantener cadena de frío - Entrega urgente para producción",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": false,
|
||||
"notes": "⏰ EDGE CASE: Entrega esperada en 6 horas - mantequilla para producción de croissants de mañana",
|
||||
"reasoning_data": {
|
||||
"type": "production_requirement",
|
||||
"parameters": {
|
||||
"supplier_name": "Lácteos Gipuzkoa",
|
||||
"product_names": [
|
||||
"Mantequilla sin Sal 82% MG"
|
||||
],
|
||||
"product_count": 1,
|
||||
"production_batches": 5,
|
||||
"required_by_date": "tomorrow 06:00"
|
||||
},
|
||||
"consequence": {
|
||||
"type": "production_delay",
|
||||
"severity": "high",
|
||||
"impact": "blocked_production"
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true,
|
||||
"urgent_production": true,
|
||||
"hours_until_needed": 12
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000006",
|
||||
"order_date": "BASE_TS - 0.5d",
|
||||
"required_delivery_date": "BASE_TS + 0.25d",
|
||||
"estimated_delivery_date": "BASE_TS + 0.25d",
|
||||
"expected_delivery_date": "BASE_TS + 0.25d",
|
||||
"sent_to_supplier_at": "BASE_TS - 0.5d"
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000008",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"po_number": "PO-2025-008",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000004",
|
||||
"order_date": "BASE_TS - 0.25d",
|
||||
"status": "pending_approval",
|
||||
"priority": "medium",
|
||||
"required_delivery_date": "BASE_TS + 2d",
|
||||
"estimated_delivery_date": "BASE_TS + 2d",
|
||||
"expected_delivery_date": "BASE_TS + 2d",
|
||||
"subtotal": 220.0,
|
||||
"tax_amount": 46.2,
|
||||
"shipping_cost": 20.0,
|
||||
"discount_amount": 0.0,
|
||||
"total_amount": 286.2,
|
||||
"currency": "EUR",
|
||||
"delivery_address": "Calle Panadería, 45, 28001 Madrid",
|
||||
"delivery_instructions": "Entrega en almacén seco - Zona A",
|
||||
"delivery_contact": "Carlos Almacén",
|
||||
"delivery_phone": "+34 910 123 456",
|
||||
"requires_approval": true,
|
||||
"notes": "Reposición de ingredientes básicos - Stock bajo en azúcar",
|
||||
"reasoning_data": {
|
||||
"type": "low_stock_detection",
|
||||
"parameters": {
|
||||
"supplier_name": "Distribuciones Alimentarias del Sur",
|
||||
"product_names": [
|
||||
"Azúcar Blanco Refinado"
|
||||
],
|
||||
"product_count": 1,
|
||||
"current_stock": 24.98,
|
||||
"required_stock": 120.0,
|
||||
"days_until_stockout": 3,
|
||||
"threshold_percentage": 66,
|
||||
"stock_percentage": 20
|
||||
},
|
||||
"consequence": {
|
||||
"type": "stockout_risk",
|
||||
"severity": "medium",
|
||||
"impact_days": 3,
|
||||
"affected_products": [
|
||||
"Croissants",
|
||||
"Napolitanas",
|
||||
"Pan Dulce"
|
||||
],
|
||||
"estimated_lost_orders": 15
|
||||
},
|
||||
"metadata": {
|
||||
"trigger_source": "orchestrator_auto",
|
||||
"ai_assisted": true
|
||||
}
|
||||
},
|
||||
"created_by": "50000000-0000-0000-0000-000000000005"
|
||||
}
|
||||
],
|
||||
"purchase_order_items": [
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 500.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.92,
|
||||
"line_total": 460.0,
|
||||
"received_quantity": 500.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Harina de Trigo T65",
|
||||
"product_code": "HAR-T65-002",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.98,
|
||||
"line_total": 196.0,
|
||||
"received_quantity": 200.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000005",
|
||||
"product_name": "Harina de Centeno",
|
||||
"product_code": "HAR-CEN-005",
|
||||
"ordered_quantity": 100.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 1.15,
|
||||
"line_total": 115.0,
|
||||
"received_quantity": 100.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000001",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000031",
|
||||
"product_name": "Sal Marina Fina",
|
||||
"product_code": "BAS-SAL-001",
|
||||
"ordered_quantity": 50.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.6,
|
||||
"line_total": 30.0,
|
||||
"received_quantity": 50.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000002",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 80.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 7.17,
|
||||
"line_total": 573.6,
|
||||
"received_quantity": 80.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000006",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000004",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 1000.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.91,
|
||||
"line_total": 910.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 1000.0,
|
||||
"notes": "URGENTE - Stock crítico"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000007",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000004",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000021",
|
||||
"product_name": "Levadura Fresca de Panadería",
|
||||
"product_code": "LEV-FRE-001",
|
||||
"ordered_quantity": 50.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 4.41,
|
||||
"line_total": 220.5,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 50.0,
|
||||
"notes": "Stock agotado - prioridad máxima"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000008",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000006",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 30.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 7.33,
|
||||
"line_total": 219.9,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 30.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000009",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000041",
|
||||
"product_name": "Chocolate Negro 70% Cacao",
|
||||
"product_code": "ESP-CHO-001",
|
||||
"ordered_quantity": 20.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 15.5,
|
||||
"line_total": 310.0,
|
||||
"received_quantity": 20.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000010",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000042",
|
||||
"product_name": "Almendras Laminadas",
|
||||
"product_code": "ESP-ALM-002",
|
||||
"ordered_quantity": 15.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 8.9,
|
||||
"line_total": 133.5,
|
||||
"received_quantity": 15.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-000000000011",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000007",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000043",
|
||||
"product_name": "Pasas de Corinto",
|
||||
"product_code": "ESP-PAS-003",
|
||||
"ordered_quantity": 10.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 4.5,
|
||||
"line_total": 45.0,
|
||||
"received_quantity": 10.0,
|
||||
"remaining_quantity": 0.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a1",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c1",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"product_code": "HAR-T55-001",
|
||||
"ordered_quantity": 600.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 0.93,
|
||||
"line_total": 558.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 600.0,
|
||||
"notes": "URGENTE - Pedido retrasado 4 horas"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a2",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"product_code": "LAC-MAN-001",
|
||||
"ordered_quantity": 35.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 7.16,
|
||||
"line_total": 250.6,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 35.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a3",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-0000000000c2",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000012",
|
||||
"product_name": "Leche Entera Fresca",
|
||||
"product_code": "LAC-LEC-002",
|
||||
"ordered_quantity": 80.0,
|
||||
"unit_of_measure": "liters",
|
||||
"unit_price": 0.92,
|
||||
"line_total": 73.6,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 80.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a4",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000003",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000006",
|
||||
"product_name": "Harina de Espelta Ecológica",
|
||||
"product_code": "HAR-ESP-006",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 2.45,
|
||||
"line_total": 490.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 200.0,
|
||||
"notes": "Ingrediente ecológico certificado para nueva línea"
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a5",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000005",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000041",
|
||||
"product_name": "Chocolate Negro 70% Cacao",
|
||||
"product_code": "ESP-CHO-001",
|
||||
"ordered_quantity": 15.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 15.5,
|
||||
"line_total": 232.5,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 15.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a6",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000005",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000042",
|
||||
"product_name": "Almendras Laminadas",
|
||||
"product_code": "ESP-ALM-002",
|
||||
"ordered_quantity": 8.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 8.9,
|
||||
"line_total": 71.2,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 8.0
|
||||
},
|
||||
{
|
||||
"id": "51000000-0000-0000-0000-0000000000a7",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"purchase_order_id": "50000000-0000-0000-0000-000000000008",
|
||||
"inventory_product_id": "10000000-0000-0000-0000-000000000032",
|
||||
"product_name": "Azúcar Blanco Refinado",
|
||||
"product_code": "BAS-AZU-002",
|
||||
"ordered_quantity": 200.0,
|
||||
"unit_of_measure": "kilograms",
|
||||
"unit_price": 1.1,
|
||||
"line_total": 220.0,
|
||||
"received_quantity": 0.0,
|
||||
"remaining_quantity": 200.0,
|
||||
"notes": "Reposición stock bajo - Nivel crítico detectado"
|
||||
}
|
||||
]
|
||||
}
|
||||
306
shared/demo/fixtures/professional/08-orders.json
Normal file
306
shared/demo/fixtures/professional/08-orders.json
Normal file
@@ -0,0 +1,306 @@
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_code": "CUST-001",
|
||||
"name": "Restaurante El Buen Yantar",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Luis Gómez",
|
||||
"email": "compras@buenyantar.es",
|
||||
"phone": "+34 912 345 678",
|
||||
"address": "Calle Mayor, 45",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 45,
|
||||
"total_spent": 3250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale customer - weekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_code": "CUST-002",
|
||||
"name": "Cafetería La Esquina",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Marta Ruiz",
|
||||
"email": "cafeteria@laesquina.com",
|
||||
"phone": "+34 913 456 789",
|
||||
"address": "Plaza del Sol, 12",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28012",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 12,
|
||||
"total_spent": 850.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail customer - biweekly orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_code": "CUST-003",
|
||||
"name": "Hotel Madrid Plaza",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Carlos Fernández",
|
||||
"email": "compras@hotelmadridplaza.com",
|
||||
"phone": "+34 914 567 890",
|
||||
"address": "Calle Gran Vía, 25",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28013",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 28,
|
||||
"total_spent": 2150.5,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Hotel chain - large volume orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000004",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_code": "CUST-004",
|
||||
"name": "Panadería Los Nogales",
|
||||
"customer_type": "RETAIL",
|
||||
"contact_person": "Ana López",
|
||||
"email": "panaderia@losnogales.es",
|
||||
"phone": "+34 915 678 901",
|
||||
"address": "Calle Alcala, 120",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28009",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 8,
|
||||
"total_spent": 620.4,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Local bakery - frequent small orders"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000005",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_code": "CUST-005",
|
||||
"name": "Supermercado EcoMarket",
|
||||
"customer_type": "WHOLESALE",
|
||||
"contact_person": "Pedro Martínez",
|
||||
"email": "compras@ecomarket.es",
|
||||
"phone": "+34 916 789 012",
|
||||
"address": "Avenida América, 35",
|
||||
"city": "Madrid",
|
||||
"postal_code": "28002",
|
||||
"country": "España",
|
||||
"status": "ACTIVE",
|
||||
"total_orders": 15,
|
||||
"total_spent": 1250.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Organic supermarket chain - premium products"
|
||||
}
|
||||
],
|
||||
"customer_orders": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000001",
|
||||
"order_number": "ORD-20250115-001",
|
||||
"order_date": "BASE_TS - 1d 5h",
|
||||
"delivery_date": "BASE_TS + 3h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 125.5,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular weekly order"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000002",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000002",
|
||||
"order_number": "ORD-20250115-002",
|
||||
"order_date": "BASE_TS - 1d 8h",
|
||||
"delivery_date": "BASE_TS + 4h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 45.2,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Small retail order"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000099",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000001",
|
||||
"order_number": "ORD-URGENT-001",
|
||||
"order_date": "BASE_TS + 1h",
|
||||
"delivery_date": "BASE_TS + 2h 30m",
|
||||
"status": "PENDING",
|
||||
"total_amount": 185.75,
|
||||
"is_urgent": true,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Urgent order - special event at restaurant",
|
||||
"reasoning_data": {
|
||||
"type": "urgent_delivery",
|
||||
"parameters": {
|
||||
"event_type": "special_event",
|
||||
"required_time": "2025-01-15T08:30:00Z",
|
||||
"priority": "high"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000100",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000005",
|
||||
"order_number": "ORD-20250115-003",
|
||||
"order_date": "BASE_TS + 2h",
|
||||
"delivery_date": "BASE_TS + 4h",
|
||||
"status": "PENDING",
|
||||
"total_amount": 215.5,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Regular wholesale order - organic products",
|
||||
"reasoning_data": {
|
||||
"type": "standard_delivery",
|
||||
"parameters": {
|
||||
"delivery_window": "morning",
|
||||
"priority": "medium"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"order_items": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000101",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"order_id": "60000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 50.0,
|
||||
"unit_price": 2.5,
|
||||
"total_price": 125.0,
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000102",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"order_id": "60000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 12.0,
|
||||
"unit_price": 3.75,
|
||||
"total_price": 45.0,
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000199",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"order_id": "60000000-0000-0000-0000-000000000099",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 75.0,
|
||||
"unit_price": 2.45,
|
||||
"total_price": 183.75,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Urgent delivery - priority processing"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000103",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"order_id": "60000000-0000-0000-0000-000000000100",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 20.0,
|
||||
"unit_price": 3.25,
|
||||
"total_price": 65.0,
|
||||
"created_at": "BASE_TS"
|
||||
}
|
||||
],
|
||||
"completed_orders": [
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000201",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000001",
|
||||
"order_number": "ORD-20250114-001",
|
||||
"order_date": "BASE_TS - 2d 4h",
|
||||
"delivery_date": "BASE_TS - 2d 6h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 150.25,
|
||||
"created_at": "BASE_TS - 2d 4h",
|
||||
"notes": "Regular weekly order - delivered on time"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000202",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000003",
|
||||
"order_number": "ORD-20250114-002",
|
||||
"order_date": "BASE_TS - 2d 8h",
|
||||
"delivery_date": "BASE_TS - 1d 2h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 225.75,
|
||||
"created_at": "BASE_TS - 2d 8h",
|
||||
"notes": "Hotel order - large quantity for breakfast service"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000203",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000002",
|
||||
"order_number": "ORD-20250113-001",
|
||||
"order_date": "BASE_TS - 3d 3h",
|
||||
"delivery_date": "BASE_TS - 3d 5h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 55.5,
|
||||
"created_at": "BASE_TS - 3d 3h",
|
||||
"notes": "Small retail order - delivered on time"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000204",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000004",
|
||||
"order_number": "ORD-20250113-002",
|
||||
"order_date": "BASE_TS - 3d 5h",
|
||||
"delivery_date": "BASE_TS - 3d 8h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 42.75,
|
||||
"created_at": "BASE_TS - 3d 5h",
|
||||
"notes": "Local bakery order - small quantity"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000205",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000005",
|
||||
"order_number": "ORD-20250112-001",
|
||||
"order_date": "BASE_TS - 4d 4h",
|
||||
"delivery_date": "BASE_TS - 4d 10h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 185.25,
|
||||
"created_at": "BASE_TS - 4d 4h",
|
||||
"notes": "Organic supermarket order - premium products"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000206",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000001",
|
||||
"order_number": "ORD-20250111-001",
|
||||
"order_date": "BASE_TS - 5d 2h",
|
||||
"delivery_date": "BASE_TS - 5d 4h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 135.5,
|
||||
"created_at": "BASE_TS - 5d 2h",
|
||||
"notes": "Regular wholesale order - delivered on time"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000207",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000003",
|
||||
"order_number": "ORD-20250110-001",
|
||||
"order_date": "BASE_TS - 6d 9h",
|
||||
"delivery_date": "BASE_TS - 5d 1h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 195.75,
|
||||
"created_at": "BASE_TS - 6d 9h",
|
||||
"notes": "Hotel order - evening delivery for next morning"
|
||||
},
|
||||
{
|
||||
"id": "60000000-0000-0000-0000-000000000208",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"customer_id": "60000000-0000-0000-0000-000000000002",
|
||||
"order_number": "ORD-20250109-001",
|
||||
"order_date": "BASE_TS - 7d 4h",
|
||||
"delivery_date": "BASE_TS - 7d 6h",
|
||||
"status": "DELIVERED",
|
||||
"total_amount": 48.25,
|
||||
"created_at": "BASE_TS - 7d 4h",
|
||||
"notes": "Small retail order - delivered on time"
|
||||
}
|
||||
]
|
||||
}
|
||||
620
shared/demo/fixtures/professional/09-sales.json
Normal file
620
shared/demo/fixtures/professional/09-sales.json
Normal file
@@ -0,0 +1,620 @@
|
||||
{
|
||||
"sales_data": [
|
||||
{
|
||||
"id": "SALES-202501-2287",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 51.11,
|
||||
"unit_price": 6.92,
|
||||
"total_amount": 335.29,
|
||||
"sales_date": "BASE_TS - 7d 4h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 7d 4h",
|
||||
"updated_at": "BASE_TS - 7d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1536",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 48.29,
|
||||
"unit_price": 3.81,
|
||||
"total_amount": 267.17,
|
||||
"sales_date": "BASE_TS - 7d 6h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 7d 6h",
|
||||
"updated_at": "BASE_TS - 7d 6h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7360",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 28.45,
|
||||
"unit_price": 6.04,
|
||||
"total_amount": 209.32,
|
||||
"sales_date": "BASE_TS - 7d 3h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 7d 3h",
|
||||
"updated_at": "BASE_TS - 7d 3h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-2548",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 28.42,
|
||||
"unit_price": 3.79,
|
||||
"total_amount": 201.24,
|
||||
"sales_date": "BASE_TS - 7d 4h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 7d 4h",
|
||||
"updated_at": "BASE_TS - 7d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-5636",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 25.07,
|
||||
"unit_price": 6.12,
|
||||
"total_amount": 184.07,
|
||||
"sales_date": "BASE_TS - 7d 4h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 7d 4h",
|
||||
"updated_at": "BASE_TS - 7d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6202",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 26.71,
|
||||
"unit_price": 2.97,
|
||||
"total_amount": 113.78,
|
||||
"sales_date": "BASE_TS - 6d 23h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 6d 23h",
|
||||
"updated_at": "BASE_TS - 6d 23h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-0751",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 26.69,
|
||||
"unit_price": 6.47,
|
||||
"total_amount": 190.52,
|
||||
"sales_date": "BASE_TS - 6d 4h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 6d 4h",
|
||||
"updated_at": "BASE_TS - 6d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7429",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 29.68,
|
||||
"unit_price": 6.31,
|
||||
"total_amount": 139.19,
|
||||
"sales_date": "BASE_TS - 6d 7h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 6d 7h",
|
||||
"updated_at": "BASE_TS - 6d 7h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1170",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 22.88,
|
||||
"unit_price": 6.15,
|
||||
"total_amount": 80.7,
|
||||
"sales_date": "BASE_TS - 6d 8h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 6d 8h",
|
||||
"updated_at": "BASE_TS - 6d 8h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-9126",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 32.61,
|
||||
"unit_price": 3.82,
|
||||
"total_amount": 144.97,
|
||||
"sales_date": "BASE_TS - 4d 23h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 23h",
|
||||
"updated_at": "BASE_TS - 4d 23h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6573",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 40.54,
|
||||
"unit_price": 4.11,
|
||||
"total_amount": 152.66,
|
||||
"sales_date": "BASE_TS - 5d 0h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 5d 0h",
|
||||
"updated_at": "BASE_TS - 5d 0h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6483",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 33.25,
|
||||
"unit_price": 7.81,
|
||||
"total_amount": 211.39,
|
||||
"sales_date": "BASE_TS - 5d 1h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 5d 1h",
|
||||
"updated_at": "BASE_TS - 5d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-9578",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 22.4,
|
||||
"unit_price": 5.07,
|
||||
"total_amount": 134.46,
|
||||
"sales_date": "BASE_TS - 5d 4h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 5d 4h",
|
||||
"updated_at": "BASE_TS - 5d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-8086",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 26.22,
|
||||
"unit_price": 3.05,
|
||||
"total_amount": 72.96,
|
||||
"sales_date": "BASE_TS - 5d 5h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 5d 5h",
|
||||
"updated_at": "BASE_TS - 5d 5h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6917",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 22.98,
|
||||
"unit_price": 6.08,
|
||||
"total_amount": 110.52,
|
||||
"sales_date": "BASE_TS - 5d 0h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 5d 0h",
|
||||
"updated_at": "BASE_TS - 5d 0h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-0189",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 22.12,
|
||||
"unit_price": 6.58,
|
||||
"total_amount": 70.51,
|
||||
"sales_date": "BASE_TS - 4d 23h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 23h",
|
||||
"updated_at": "BASE_TS - 4d 23h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7434",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 26.8,
|
||||
"unit_price": 2.52,
|
||||
"total_amount": 183.11,
|
||||
"sales_date": "BASE_TS - 4d 3h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 3h",
|
||||
"updated_at": "BASE_TS - 4d 3h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-8318",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 37.72,
|
||||
"unit_price": 7.98,
|
||||
"total_amount": 291.3,
|
||||
"sales_date": "BASE_TS - 4d 0h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 0h",
|
||||
"updated_at": "BASE_TS - 4d 0h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6127",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 31.83,
|
||||
"unit_price": 7.08,
|
||||
"total_amount": 182.56,
|
||||
"sales_date": "BASE_TS - 4d 5h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 5h",
|
||||
"updated_at": "BASE_TS - 4d 5h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-5039",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 15.31,
|
||||
"unit_price": 3.94,
|
||||
"total_amount": 60.42,
|
||||
"sales_date": "BASE_TS - 4d 2h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 2h",
|
||||
"updated_at": "BASE_TS - 4d 2h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1134",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 15.82,
|
||||
"unit_price": 8.37,
|
||||
"total_amount": 90.09,
|
||||
"sales_date": "BASE_TS - 4d 6h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 6h",
|
||||
"updated_at": "BASE_TS - 4d 6h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-2706",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 20.17,
|
||||
"unit_price": 4.09,
|
||||
"total_amount": 156.0,
|
||||
"sales_date": "BASE_TS - 4d 2h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 4d 2h",
|
||||
"updated_at": "BASE_TS - 4d 2h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6538",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 38.0,
|
||||
"unit_price": 8.47,
|
||||
"total_amount": 243.18,
|
||||
"sales_date": "BASE_TS - 3d 1h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 1h",
|
||||
"updated_at": "BASE_TS - 3d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1050",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 34.63,
|
||||
"unit_price": 4.53,
|
||||
"total_amount": 208.83,
|
||||
"sales_date": "BASE_TS - 3d 5h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 5h",
|
||||
"updated_at": "BASE_TS - 3d 5h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-0965",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 31.37,
|
||||
"unit_price": 3.87,
|
||||
"total_amount": 248.81,
|
||||
"sales_date": "BASE_TS - 3d 6h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 6h",
|
||||
"updated_at": "BASE_TS - 3d 6h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7954",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 35.52,
|
||||
"unit_price": 3.79,
|
||||
"total_amount": 116.99,
|
||||
"sales_date": "BASE_TS - 3d 4h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 4h",
|
||||
"updated_at": "BASE_TS - 3d 4h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1589",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity": 27.73,
|
||||
"unit_price": 6.45,
|
||||
"total_amount": 128.29,
|
||||
"sales_date": "BASE_TS - 3d 5h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 5h",
|
||||
"updated_at": "BASE_TS - 3d 5h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1613",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity": 28.29,
|
||||
"unit_price": 2.86,
|
||||
"total_amount": 194.33,
|
||||
"sales_date": "BASE_TS - 3d 7h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 7h",
|
||||
"updated_at": "BASE_TS - 3d 7h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-2297",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"quantity": 21.65,
|
||||
"unit_price": 5.03,
|
||||
"total_amount": 90.3,
|
||||
"sales_date": "BASE_TS - 3d 3h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 3d 3h",
|
||||
"updated_at": "BASE_TS - 3d 3h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-8857",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 21.19,
|
||||
"unit_price": 7.52,
|
||||
"total_amount": 176.21,
|
||||
"sales_date": "BASE_TS - 2d 1h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 1h",
|
||||
"updated_at": "BASE_TS - 2d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-6571",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 24.31,
|
||||
"unit_price": 7.91,
|
||||
"total_amount": 84.79,
|
||||
"sales_date": "BASE_TS - 2d 2h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 2h",
|
||||
"updated_at": "BASE_TS - 2d 2h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7455",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 22.89,
|
||||
"unit_price": 4.21,
|
||||
"total_amount": 152.86,
|
||||
"sales_date": "BASE_TS - 2d 0h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 0h",
|
||||
"updated_at": "BASE_TS - 2d 0h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-3112",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 26.89,
|
||||
"unit_price": 4.28,
|
||||
"total_amount": 223.54,
|
||||
"sales_date": "BASE_TS - 2d 2h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 2h",
|
||||
"updated_at": "BASE_TS - 2d 2h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7812",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 15.28,
|
||||
"unit_price": 5.52,
|
||||
"total_amount": 116.36,
|
||||
"sales_date": "BASE_TS - 2d 10h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 10h",
|
||||
"updated_at": "BASE_TS - 2d 10h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-3045",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 19.55,
|
||||
"unit_price": 2.91,
|
||||
"total_amount": 56.85,
|
||||
"sales_date": "BASE_TS - 2d 9h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 9h",
|
||||
"updated_at": "BASE_TS - 2d 9h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-4034",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 14.0,
|
||||
"unit_price": 5.97,
|
||||
"total_amount": 38.34,
|
||||
"sales_date": "BASE_TS - 2d 3h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 3h",
|
||||
"updated_at": "BASE_TS - 2d 3h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-5184",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"quantity": 17.55,
|
||||
"unit_price": 8.11,
|
||||
"total_amount": 65.38,
|
||||
"sales_date": "BASE_TS - 2d 5h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 2d 5h",
|
||||
"updated_at": "BASE_TS - 2d 5h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-7492",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 32.64,
|
||||
"unit_price": 4.4,
|
||||
"total_amount": 228.85,
|
||||
"sales_date": "BASE_TS - 1d 1h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 1d 1h",
|
||||
"updated_at": "BASE_TS - 1d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-1639",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 37.66,
|
||||
"unit_price": 2.94,
|
||||
"total_amount": 142.3,
|
||||
"sales_date": "BASE_TS - 0d 23h",
|
||||
"sales_channel": "wholesale",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 0d 23h",
|
||||
"updated_at": "BASE_TS - 0d 23h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-4003",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"quantity": 44.93,
|
||||
"unit_price": 4.72,
|
||||
"total_amount": 154.86,
|
||||
"sales_date": "BASE_TS - 0d 23h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 0d 23h",
|
||||
"updated_at": "BASE_TS - 0d 23h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-9087",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 27.58,
|
||||
"unit_price": 4.3,
|
||||
"total_amount": 178.72,
|
||||
"sales_date": "BASE_TS - 1d 1h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 1d 1h",
|
||||
"updated_at": "BASE_TS - 1d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-9065",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 23.07,
|
||||
"unit_price": 3.43,
|
||||
"total_amount": 96.68,
|
||||
"sales_date": "BASE_TS - 1d 6h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "transfer",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 1d 6h",
|
||||
"updated_at": "BASE_TS - 1d 6h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-4326",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 25.55,
|
||||
"unit_price": 5.53,
|
||||
"total_amount": 102.37,
|
||||
"sales_date": "BASE_TS - 1d 1h",
|
||||
"sales_channel": "in_store",
|
||||
"payment_method": "cash",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 1d 1h",
|
||||
"updated_at": "BASE_TS - 1d 1h"
|
||||
},
|
||||
{
|
||||
"id": "SALES-202501-0723",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"quantity": 28.73,
|
||||
"unit_price": 2.52,
|
||||
"total_amount": 204.74,
|
||||
"sales_date": "BASE_TS - 1d 0h",
|
||||
"sales_channel": "online",
|
||||
"payment_method": "card",
|
||||
"customer_id": "50000000-0000-0000-0000-000000000001",
|
||||
"created_at": "BASE_TS - 1d 0h",
|
||||
"updated_at": "BASE_TS - 1d 0h"
|
||||
}
|
||||
]
|
||||
}
|
||||
352
shared/demo/fixtures/professional/10-forecasting.json
Normal file
352
shared/demo/fixtures/professional/10-forecasting.json
Normal file
@@ -0,0 +1,352 @@
|
||||
{
|
||||
"forecasts": [
|
||||
{
|
||||
"id": "559ad124-ce3f-4cfa-8f24-9ad447d8a236",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-16T06:00:00Z",
|
||||
"predicted_quantity": 22.91,
|
||||
"confidence_percentage": 90.8,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.8% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "23e13d19-90d3-47ec-bac1-7f561041571f",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-16T06:00:00Z",
|
||||
"predicted_quantity": 21.23,
|
||||
"confidence_percentage": 91.8,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.8% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "02c052ae-b45d-4ec0-91f1-b140c22ee086",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-16T06:00:00Z",
|
||||
"predicted_quantity": 18.65,
|
||||
"confidence_percentage": 88.1,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.1% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "7ea9daba-bced-44d5-9595-66e6a482154e",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-16T06:00:00Z",
|
||||
"predicted_quantity": 8.8,
|
||||
"confidence_percentage": 89.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "10bf8324-66a1-4776-b08c-5a55a3a86cb4",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-17T06:00:00Z",
|
||||
"predicted_quantity": 20.16,
|
||||
"confidence_percentage": 91.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "8133e0de-0431-4392-97ad-b5e0b385431a",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-17T06:00:00Z",
|
||||
"predicted_quantity": 26.32,
|
||||
"confidence_percentage": 89.4,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.4% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "4bc052cb-dae1-4f06-815e-d822e843ae5c",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-17T06:00:00Z",
|
||||
"predicted_quantity": 21.04,
|
||||
"confidence_percentage": 89.4,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.4% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "4d29380e-5ed4-466d-a421-1871149b0cf0",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-17T06:00:00Z",
|
||||
"predicted_quantity": 11.55,
|
||||
"confidence_percentage": 91.9,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.9% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "9794cffd-2bc6-4461-8ff6-f97bcb5ef94c",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-18T06:00:00Z",
|
||||
"predicted_quantity": 38.56,
|
||||
"confidence_percentage": 88.9,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.9% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "e6e5f60e-ac4e-43dc-9ed5-0140f5e1eaef",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-18T06:00:00Z",
|
||||
"predicted_quantity": 18.69,
|
||||
"confidence_percentage": 88.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "57bbc0fb-14a4-4688-8ef8-f1bcf31b449e",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-18T06:00:00Z",
|
||||
"predicted_quantity": 14.94,
|
||||
"confidence_percentage": 91.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "a1b48396-f046-4a8c-bbbf-1c0c64da942b",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-18T06:00:00Z",
|
||||
"predicted_quantity": 12.55,
|
||||
"confidence_percentage": 90.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "c3a89c08-0382-41bc-9be6-cc0fe5822b63",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-19T06:00:00Z",
|
||||
"predicted_quantity": 32.6,
|
||||
"confidence_percentage": 88.6,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.6% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "a7746915-f4bb-459f-9b11-7dd5cc161e19",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-19T06:00:00Z",
|
||||
"predicted_quantity": 24.8,
|
||||
"confidence_percentage": 88.2,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.2% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "96731957-9727-424d-8227-3d1bf51800ca",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-19T06:00:00Z",
|
||||
"predicted_quantity": 15.83,
|
||||
"confidence_percentage": 91.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "19737618-eb42-47c0-8ad4-7e37f913a78a",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-19T06:00:00Z",
|
||||
"predicted_quantity": 9.15,
|
||||
"confidence_percentage": 91.5,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.5% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "b4c3b4ad-6487-49d5-9663-56046f577332",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-20T06:00:00Z",
|
||||
"predicted_quantity": 25.4,
|
||||
"confidence_percentage": 89.6,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.6% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "31b217eb-d71c-457a-8915-692dc701a6b9",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-20T06:00:00Z",
|
||||
"predicted_quantity": 17.2,
|
||||
"confidence_percentage": 91.1,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.1% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "a32d777c-7052-4ba1-b55b-7cc0dc3cfc3d",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-20T06:00:00Z",
|
||||
"predicted_quantity": 15.3,
|
||||
"confidence_percentage": 90.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "2db7d1d2-7b38-4ebb-b408-c9e0b6884c22",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-20T06:00:00Z",
|
||||
"predicted_quantity": 12.89,
|
||||
"confidence_percentage": 88.1,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.1% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "b5887602-7f9c-485b-b50d-0e60dd153780",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-21T06:00:00Z",
|
||||
"predicted_quantity": 35.39,
|
||||
"confidence_percentage": 90.3,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.3% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "696498b2-20a7-48cb-a597-d689be7c729f",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-21T06:00:00Z",
|
||||
"predicted_quantity": 26.46,
|
||||
"confidence_percentage": 90.4,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.4% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "b3c83939-52b7-4811-ac91-6fdc24d4ae0f",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-21T06:00:00Z",
|
||||
"predicted_quantity": 16.23,
|
||||
"confidence_percentage": 89.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "d3ca5707-9eee-4880-ac45-766f0e058492",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-21T06:00:00Z",
|
||||
"predicted_quantity": 13.47,
|
||||
"confidence_percentage": 91.6,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.6% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "0f67f70f-2d7e-43f2-b5dd-52659b06e578",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"forecast_date": "2025-01-22T06:00:00Z",
|
||||
"predicted_quantity": 21.2,
|
||||
"confidence_percentage": 89.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 89.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "ba4bc024-6440-4fcf-b6c4-f1773aaa3f24",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"forecast_date": "2025-01-22T06:00:00Z",
|
||||
"predicted_quantity": 24.48,
|
||||
"confidence_percentage": 90.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 90.7% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "cb6bfe90-1962-4ca1-b389-9d583780598d",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"forecast_date": "2025-01-22T06:00:00Z",
|
||||
"predicted_quantity": 25.48,
|
||||
"confidence_percentage": 88.8,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 88.8% (seed=42)"
|
||||
},
|
||||
{
|
||||
"id": "76c39f91-82cc-4bce-a91c-1e57e29e3461",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"product_id": "20000000-0000-0000-0000-000000000004",
|
||||
"forecast_date": "2025-01-22T06:00:00Z",
|
||||
"predicted_quantity": 10.32,
|
||||
"confidence_percentage": 91.7,
|
||||
"forecast_type": "daily",
|
||||
"created_at": "BASE_TS",
|
||||
"updated_at": "BASE_TS",
|
||||
"notes": "Forecast accuracy: 91.7% (seed=42)"
|
||||
}
|
||||
],
|
||||
"prediction_batches": [
|
||||
{
|
||||
"id": "80000000-0000-0000-0000-000000001001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"batch_id": "20250116-001",
|
||||
"prediction_date": "BASE_TS",
|
||||
"status": "COMPLETED",
|
||||
"total_forecasts": 4,
|
||||
"created_at": "BASE_TS",
|
||||
"notes": "Daily forecasting batch"
|
||||
}
|
||||
]
|
||||
}
|
||||
291
shared/demo/fixtures/professional/11-orchestrator.json
Normal file
291
shared/demo/fixtures/professional/11-orchestrator.json
Normal file
@@ -0,0 +1,291 @@
|
||||
{
|
||||
"orchestration_run": {
|
||||
"id": "90000000-0000-0000-0000-000000000001",
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"run_number": "ORCH-20250114-001",
|
||||
"status": "completed",
|
||||
"run_type": "daily",
|
||||
"started_at": "BASE_TS - 1d 16h",
|
||||
"completed_at": "BASE_TS - 1d 15h45m",
|
||||
"duration_seconds": 900,
|
||||
"trigger_type": "scheduled",
|
||||
"trigger_source": "system",
|
||||
"created_at": "BASE_TS - 1d 16h",
|
||||
"updated_at": "BASE_TS - 1d 15h45m",
|
||||
"notes": "Nightly orchestration run - Last successful execution before demo session"
|
||||
},
|
||||
"orchestration_results": {
|
||||
"production_batches_created": 18,
|
||||
"production_batches_completed": 15,
|
||||
"production_batches_in_progress": 3,
|
||||
"purchase_orders_created": 6,
|
||||
"purchase_orders_approved": 4,
|
||||
"purchase_orders_pending_approval": 2,
|
||||
"inventory_updates": 25,
|
||||
"stock_alerts_generated": 3,
|
||||
"quality_checks_performed": 12,
|
||||
"delivery_schedules_updated": 4,
|
||||
"forecasts_generated": 10,
|
||||
"ai_insights_posted": 5,
|
||||
"notifications_sent": 8,
|
||||
"errors_encountered": 0,
|
||||
"warnings_generated": 2
|
||||
},
|
||||
"run_metadata": {
|
||||
"purchase_orders": [
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000001",
|
||||
"status": "completed",
|
||||
"delivery_date": "BASE_TS - 2d",
|
||||
"items": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"quantity": 500.0,
|
||||
"unit": "kilograms"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Harina de Trigo T65",
|
||||
"quantity": 200.0,
|
||||
"unit": "kilograms"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000005",
|
||||
"product_name": "Harina de Centeno",
|
||||
"quantity": 100.0,
|
||||
"unit": "kilograms"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000031",
|
||||
"product_name": "Sal Marina Fina",
|
||||
"quantity": 50.0,
|
||||
"unit": "kilograms"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000002",
|
||||
"status": "completed",
|
||||
"delivery_date": "BASE_TS - 1d",
|
||||
"items": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000011",
|
||||
"product_name": "Mantequilla sin Sal 82% MG",
|
||||
"quantity": 80.0,
|
||||
"unit": "kilograms"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "50000000-0000-0000-0000-000000000004",
|
||||
"status": "confirmed",
|
||||
"delivery_date": "BASE_TS + 1d",
|
||||
"items": [
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"quantity": 1000.0,
|
||||
"unit": "kilograms"
|
||||
},
|
||||
{
|
||||
"ingredient_id": "10000000-0000-0000-0000-000000000021",
|
||||
"product_name": "Levadura Fresca de Panadería",
|
||||
"quantity": 50.0,
|
||||
"unit": "kilograms"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"production_batches": [
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000001",
|
||||
"product_id": "20000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Baguette Francesa Tradicional",
|
||||
"status": "COMPLETED",
|
||||
"scheduled_date": "BASE_TS - 1d 16h",
|
||||
"quantity": 98.0,
|
||||
"unit": "units"
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000002",
|
||||
"product_id": "20000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Croissant de Mantequilla Artesanal",
|
||||
"status": "COMPLETED",
|
||||
"scheduled_date": "BASE_TS - 1d 15h",
|
||||
"quantity": 115.0,
|
||||
"unit": "units"
|
||||
},
|
||||
{
|
||||
"id": "40000000-0000-0000-0000-000000000003",
|
||||
"product_id": "20000000-0000-0000-0000-000000000003",
|
||||
"product_name": "Pan de Pueblo con Masa Madre",
|
||||
"status": "COMPLETED",
|
||||
"scheduled_date": "BASE_TS - 1d 14h",
|
||||
"quantity": 80.0,
|
||||
"unit": "units"
|
||||
}
|
||||
]
|
||||
},
|
||||
"production_coordination": {
|
||||
"batches_synchronized": [
|
||||
{
|
||||
"batch_id": "40000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Baguette Francesa Tradicional",
|
||||
"quantity": 98.0,
|
||||
"status": "COMPLETED",
|
||||
"coordinated_with_po": "50000000-0000-0000-0000-000000000001",
|
||||
"flour_consumed": 50.0,
|
||||
"yeast_consumed": 2.0,
|
||||
"butter_consumed": 1.5
|
||||
},
|
||||
{
|
||||
"batch_id": "40000000-0000-0000-0000-000000000002",
|
||||
"product_name": "Croissant de Mantequilla Artesanal",
|
||||
"quantity": 115.0,
|
||||
"status": "COMPLETED",
|
||||
"coordinated_with_po": "50000000-0000-0000-0000-000000000002",
|
||||
"flour_consumed": 30.0,
|
||||
"yeast_consumed": 1.5,
|
||||
"butter_consumed": 15.0
|
||||
},
|
||||
{
|
||||
"batch_id": "40000000-0000-0000-0000-000000000003",
|
||||
"product_name": "Pan de Pueblo con Masa Madre",
|
||||
"quantity": 80.0,
|
||||
"status": "COMPLETED",
|
||||
"coordinated_with_po": "50000000-0000-0000-0000-000000000001",
|
||||
"flour_consumed": 40.0,
|
||||
"yeast_consumed": 1.0
|
||||
}
|
||||
],
|
||||
"production_alerts": [
|
||||
{
|
||||
"alert_type": "LOW_STOCK",
|
||||
"product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"current_stock": 150.0,
|
||||
"threshold": 200.0,
|
||||
"severity": "WARNING",
|
||||
"related_po": "50000000-0000-0000-0000-000000000004"
|
||||
},
|
||||
{
|
||||
"alert_type": "DELAYED_DELIVERY",
|
||||
"product_id": "10000000-0000-0000-0000-000000000001",
|
||||
"product_name": "Harina de Trigo T55",
|
||||
"expected_delivery": "BASE_TS - 1d 4h",
|
||||
"actual_delivery": "BASE_TS - 1d 8h",
|
||||
"delay_hours": 4,
|
||||
"severity": "CRITICAL",
|
||||
"related_po": "50000000-0000-0000-0000-000000000004",
|
||||
"impacted_batches": [
|
||||
"40000000-0000-0000-0000-0000000000a3"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"procurement_coordination": {
|
||||
"purchase_orders_processed": [
|
||||
{
|
||||
"po_id": "50000000-0000-0000-0000-000000000001",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"status": "completed",
|
||||
"total_amount": 1053.5,
|
||||
"items_received": 3,
|
||||
"items_pending": 0,
|
||||
"delivery_status": "on_time"
|
||||
},
|
||||
{
|
||||
"po_id": "50000000-0000-0000-0000-000000000002",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000002",
|
||||
"supplier_name": "Lácteos Gipuzkoa",
|
||||
"status": "completed",
|
||||
"total_amount": 402.2,
|
||||
"items_received": 1,
|
||||
"items_pending": 0,
|
||||
"delivery_status": "on_time"
|
||||
},
|
||||
{
|
||||
"po_id": "50000000-0000-0000-0000-000000000004",
|
||||
"supplier_id": "40000000-0000-0000-0000-000000000001",
|
||||
"supplier_name": "Harinas del Norte",
|
||||
"status": "confirmed",
|
||||
"total_amount": 1427.0,
|
||||
"items_received": 0,
|
||||
"items_pending": 2,
|
||||
"delivery_status": "delayed",
|
||||
"delay_hours": 4,
|
||||
"urgency": "high"
|
||||
}
|
||||
],
|
||||
"procurement_alerts": [
|
||||
{
|
||||
"alert_type": "PO_APPROVAL_ESCALATION",
|
||||
"po_id": "50000000-0000-0000-0000-000000000003",
|
||||
"supplier_name": "Eco-Proveedores",
|
||||
"status": "pending_approval",
|
||||
"age_hours": 72,
|
||||
"severity": "WARNING",
|
||||
"reason": "Auto-approval threshold not met"
|
||||
}
|
||||
]
|
||||
},
|
||||
"inventory_synchronization": {
|
||||
"stock_updates": 25,
|
||||
"low_stock_alerts": 3,
|
||||
"expiration_alerts": 1,
|
||||
"stock_movements": 15,
|
||||
"inventory_accuracy": 98.5
|
||||
},
|
||||
"ai_insights": {
|
||||
"yield_improvement_suggestions": 2,
|
||||
"waste_reduction_opportunities": 1,
|
||||
"demand_forecasting_updates": 3,
|
||||
"procurement_optimization": 2,
|
||||
"production_scheduling": 1
|
||||
},
|
||||
"system_state": {
|
||||
"last_successful_run": "BASE_TS - 1d 16h",
|
||||
"next_scheduled_run": "BASE_TS + 16h",
|
||||
"system_health": "healthy",
|
||||
"api_availability": 100.0,
|
||||
"database_performance": "optimal",
|
||||
"integration_status": "all_connected"
|
||||
},
|
||||
"results": {
|
||||
"ingredients_created": 25,
|
||||
"stock_entries_created": 25,
|
||||
"batches_created": 0,
|
||||
"sales_created": 44,
|
||||
"forecasts_created": 28,
|
||||
"consumptions_calculated": 81,
|
||||
"critical_stock_items": 8,
|
||||
"active_alerts": 8,
|
||||
"forecasting_accuracy": 90.5,
|
||||
"cross_reference_errors": 0,
|
||||
"cross_reference_warnings": 0
|
||||
},
|
||||
"alerts": [
|
||||
{
|
||||
"alert_type": "OVERDUE_BATCH",
|
||||
"severity": "high",
|
||||
"message": "Production should have started 2 hours ago - BATCH-LATE-0001",
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"alert_type": "DELAYED_DELIVERY",
|
||||
"severity": "high",
|
||||
"message": "Supplier delivery 4 hours late - PO-LATE-0001",
|
||||
"created_at": "BASE_TS"
|
||||
},
|
||||
{
|
||||
"alert_type": "CRITICAL_STOCK",
|
||||
"severity": "critical",
|
||||
"message": "Harina T55 below reorder point with NO pending PO",
|
||||
"created_at": "BASE_TS"
|
||||
}
|
||||
],
|
||||
"completed_at": "BASE_TS",
|
||||
"status": "completed"
|
||||
}
|
||||
18
shared/demo/fixtures/professional/12-distribution.json
Normal file
18
shared/demo/fixtures/professional/12-distribution.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"delivery_routes": [],
|
||||
"vehicles": [],
|
||||
"drivers": [],
|
||||
"delivery_schedules": [],
|
||||
"route_optimization_config": {
|
||||
"enabled": false,
|
||||
"algorithm": "basic",
|
||||
"constraints": {
|
||||
"max_distance_km": 50,
|
||||
"max_duration_minutes": 180,
|
||||
"vehicle_capacity_kg": 500
|
||||
}
|
||||
},
|
||||
"tenant_id": "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6",
|
||||
"is_active": false,
|
||||
"description": "Professional tier demo - basic distribution setup for single location bakery"
|
||||
}
|
||||
209
shared/demo/fixtures/professional/enhance_procurement_data.py
Executable file
209
shared/demo/fixtures/professional/enhance_procurement_data.py
Executable file
@@ -0,0 +1,209 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Enhance Procurement Data for AI Insights
|
||||
Adds purchase order items with price trends to enable procurement insights
|
||||
"""
|
||||
|
||||
import json
|
||||
import random
|
||||
from pathlib import Path
|
||||
|
||||
# Set seed for reproducibility
|
||||
random.seed(42)
|
||||
|
||||
# Price trend data (realistic price movements over 90 days)
|
||||
INGREDIENTS_WITH_TRENDS = [
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000001",
|
||||
"name": "Harina de Trigo T55",
|
||||
"base_price": 0.85,
|
||||
"trend": 0.08, # 8% increase over 90 days
|
||||
"variability": 0.02,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000002",
|
||||
"name": "Harina de Trigo T65",
|
||||
"base_price": 0.95,
|
||||
"trend": 0.06, # 6% increase
|
||||
"variability": 0.02,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000011",
|
||||
"name": "Mantequilla sin Sal",
|
||||
"base_price": 6.50,
|
||||
"trend": 0.12, # 12% increase (highest)
|
||||
"variability": 0.05,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000012",
|
||||
"name": "Leche Entera Fresca",
|
||||
"base_price": 0.95,
|
||||
"trend": -0.03, # 3% decrease (seasonal surplus)
|
||||
"variability": 0.02,
|
||||
"unit": "L"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000021",
|
||||
"name": "Levadura Fresca",
|
||||
"base_price": 4.20,
|
||||
"trend": 0.04, # 4% increase
|
||||
"variability": 0.03,
|
||||
"unit": "kg"
|
||||
},
|
||||
{
|
||||
"id": "10000000-0000-0000-0000-000000000032",
|
||||
"name": "Azúcar Blanco",
|
||||
"base_price": 1.10,
|
||||
"trend": 0.02, # 2% increase (stable)
|
||||
"variability": 0.01,
|
||||
"unit": "kg"
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def calculate_price(ingredient, days_ago):
|
||||
"""
|
||||
Calculate price based on linear trend + random variability
|
||||
|
||||
Args:
|
||||
ingredient: Dict with base_price, trend, variability
|
||||
days_ago: Number of days in the past
|
||||
|
||||
Returns:
|
||||
Price at that point in time
|
||||
"""
|
||||
# Apply trend proportionally based on how far back in time
|
||||
# If trend is 8% over 90 days, price 45 days ago had 4% increase from base
|
||||
trend_factor = 1 + (ingredient["trend"] * (90 - days_ago) / 90)
|
||||
|
||||
# Add random variability
|
||||
variability = random.uniform(-ingredient["variability"], ingredient["variability"])
|
||||
|
||||
price = ingredient["base_price"] * trend_factor * (1 + variability)
|
||||
return round(price, 2)
|
||||
|
||||
|
||||
def parse_days_ago(order_date_str):
|
||||
"""Parse order_date to extract days ago"""
|
||||
if 'BASE_TS' in order_date_str:
|
||||
if '- ' in order_date_str:
|
||||
# Extract number from "BASE_TS - 1d" or "BASE_TS - 1h"
|
||||
parts = order_date_str.split('- ')[1]
|
||||
if 'd' in parts:
|
||||
try:
|
||||
return int(parts.split('d')[0])
|
||||
except:
|
||||
pass
|
||||
elif 'h' in parts:
|
||||
# Hours - treat as 0 days
|
||||
return 0
|
||||
elif '+ ' in order_date_str:
|
||||
# Future date - treat as 0 days ago (current price)
|
||||
return 0
|
||||
return 30 # Default fallback
|
||||
|
||||
|
||||
def add_items_to_pos():
|
||||
"""Add items arrays to purchase orders with realistic price trends"""
|
||||
|
||||
fixture_path = Path(__file__).parent / "07-procurement.json"
|
||||
|
||||
print("🔧 Enhancing Procurement Data for AI Insights...")
|
||||
print()
|
||||
|
||||
# Load existing data
|
||||
with open(fixture_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
pos = data.get('purchase_orders', [])
|
||||
print(f"📦 Found {len(pos)} purchase orders")
|
||||
print()
|
||||
|
||||
items_added = 0
|
||||
|
||||
for i, po in enumerate(pos):
|
||||
# Parse order date to get days ago
|
||||
order_date_str = po.get('order_date', 'BASE_TS - 1d')
|
||||
days_ago = parse_days_ago(order_date_str)
|
||||
|
||||
# Select 2-4 random ingredients for this PO
|
||||
num_items = random.randint(2, 4)
|
||||
selected_ingredients = random.sample(INGREDIENTS_WITH_TRENDS, k=num_items)
|
||||
|
||||
items = []
|
||||
po_subtotal = 0.0
|
||||
|
||||
for ingredient in selected_ingredients:
|
||||
# Calculate price at this point in time
|
||||
unit_price = calculate_price(ingredient, days_ago)
|
||||
|
||||
# Order quantity (realistic for ingredient type)
|
||||
if ingredient["unit"] == "kg":
|
||||
quantity = random.randint(100, 500)
|
||||
else: # Liters
|
||||
quantity = random.randint(50, 200)
|
||||
|
||||
total_price = round(quantity * unit_price, 2)
|
||||
po_subtotal += total_price
|
||||
|
||||
items.append({
|
||||
"ingredient_id": ingredient["id"],
|
||||
"ingredient_name": ingredient["name"],
|
||||
"ordered_quantity": float(quantity),
|
||||
"unit": ingredient["unit"],
|
||||
"unit_price": unit_price,
|
||||
"total_price": total_price,
|
||||
"received_quantity": None,
|
||||
"status": "pending" if po.get('status') != 'delivered' else "received"
|
||||
})
|
||||
|
||||
# Add items to PO
|
||||
po['items'] = items
|
||||
|
||||
# Update PO totals to match items
|
||||
po['subtotal'] = round(po_subtotal, 2)
|
||||
tax_rate = 0.21 # 21% IVA in Spain
|
||||
po['tax_amount'] = round(po_subtotal * tax_rate, 2)
|
||||
po['shipping_cost'] = 15.0 if po_subtotal < 500 else 20.0
|
||||
po['total_amount'] = round(po['subtotal'] + po['tax_amount'] + po['shipping_cost'], 2)
|
||||
|
||||
items_added += len(items)
|
||||
|
||||
print(f" ✓ PO-{i+1} ({order_date_str}): {len(items)} items, €{po['total_amount']:.2f} total")
|
||||
|
||||
# Save back
|
||||
with open(fixture_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print()
|
||||
print("=" * 60)
|
||||
print("✅ PROCUREMENT DATA ENHANCEMENT COMPLETE")
|
||||
print("=" * 60)
|
||||
print()
|
||||
print(f"📊 SUMMARY:")
|
||||
print(f" • Purchase orders enhanced: {len(pos)}")
|
||||
print(f" • Total items added: {items_added}")
|
||||
print(f" • Average items per PO: {items_added / len(pos):.1f}")
|
||||
print()
|
||||
print("🎯 PRICE TRENDS ADDED:")
|
||||
for ing in INGREDIENTS_WITH_TRENDS:
|
||||
direction = "↑" if ing["trend"] > 0 else "↓"
|
||||
print(f" {direction} {ing['name']}: {ing['trend']*100:+.1f}% over 90 days")
|
||||
print()
|
||||
print("🚀 PROCUREMENT INSIGHTS READY:")
|
||||
print(" ✓ Price Forecaster: Can detect trends & recommend actions")
|
||||
print(" ✓ Supplier Performance: Can analyze delivery reliability")
|
||||
print(" ✓ Cost Optimizer: Can identify bulk buying opportunities")
|
||||
print()
|
||||
print("Next steps:")
|
||||
print(" 1. Create new demo session")
|
||||
print(" 2. Wait 60 seconds for AI models")
|
||||
print(" 3. Check for procurement insights (expect 1-2)")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
add_items_to_pos()
|
||||
208
shared/demo/fixtures/professional/fix_procurement_structure.py
Normal file
208
shared/demo/fixtures/professional/fix_procurement_structure.py
Normal file
@@ -0,0 +1,208 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Fix Procurement Data Structure and Add Realistic Price Trends
|
||||
|
||||
Issues to fix:
|
||||
1. Remove nested 'items' arrays from purchase_orders (wrong structure)
|
||||
2. Use existing purchase_order_items table structure at root level
|
||||
3. Add price trends to existing PO items
|
||||
4. Align PO items with actual inventory stock conditions
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
import random
|
||||
|
||||
# Set seed for reproducibility
|
||||
random.seed(42)
|
||||
|
||||
# Price trend data (realistic price movements over time)
|
||||
# These match the 6 ingredients we track in inventory
|
||||
PRICE_TRENDS = {
|
||||
"10000000-0000-0000-0000-000000000001": { # Harina T55
|
||||
"name": "Harina de Trigo T55",
|
||||
"base_price": 0.85,
|
||||
"current_price": 0.92, # +8% over 90 days
|
||||
"trend": 0.08
|
||||
},
|
||||
"10000000-0000-0000-0000-000000000002": { # Harina T65
|
||||
"name": "Harina de Trigo T65",
|
||||
"base_price": 0.95,
|
||||
"current_price": 1.01, # +6%
|
||||
"trend": 0.06
|
||||
},
|
||||
"10000000-0000-0000-0000-000000000011": { # Mantequilla
|
||||
"name": "Mantequilla sin Sal",
|
||||
"base_price": 6.50,
|
||||
"current_price": 7.28, # +12% (highest increase)
|
||||
"trend": 0.12
|
||||
},
|
||||
"10000000-0000-0000-0000-000000000012": { # Leche
|
||||
"name": "Leche Entera Fresca",
|
||||
"base_price": 0.95,
|
||||
"current_price": 0.92, # -3% (seasonal surplus)
|
||||
"trend": -0.03
|
||||
},
|
||||
"10000000-0000-0000-0000-000000000021": { # Levadura
|
||||
"name": "Levadura Fresca",
|
||||
"base_price": 4.20,
|
||||
"current_price": 4.37, # +4%
|
||||
"trend": 0.04
|
||||
},
|
||||
"10000000-0000-0000-0000-000000000032": { # Azúcar
|
||||
"name": "Azúcar Blanco",
|
||||
"base_price": 1.10,
|
||||
"current_price": 1.12, # +2% (stable)
|
||||
"trend": 0.02
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def calculate_price_for_date(ingredient_id: str, days_ago: int) -> float:
|
||||
"""Calculate historical price based on trend"""
|
||||
if ingredient_id not in PRICE_TRENDS:
|
||||
return None
|
||||
|
||||
trend_data = PRICE_TRENDS[ingredient_id]
|
||||
base = trend_data["base_price"]
|
||||
total_trend = trend_data["trend"]
|
||||
|
||||
# Apply trend proportionally
|
||||
# If 90 days trend is +8%, then 45 days ago had +4% from base
|
||||
trend_factor = 1 + (total_trend * (90 - days_ago) / 90)
|
||||
|
||||
# Add small variability (±2%)
|
||||
variability = random.uniform(-0.02, 0.02)
|
||||
|
||||
price = base * trend_factor * (1 + variability)
|
||||
return round(price, 2)
|
||||
|
||||
|
||||
def parse_days_ago(date_str: str) -> int:
|
||||
"""Parse BASE_TS marker to extract days ago"""
|
||||
if not date_str or 'BASE_TS' not in date_str:
|
||||
return 30
|
||||
|
||||
if '- ' in date_str:
|
||||
parts = date_str.split('- ')[1].strip()
|
||||
if 'd' in parts:
|
||||
try:
|
||||
return int(parts.split('d')[0])
|
||||
except:
|
||||
pass
|
||||
elif 'h' in parts:
|
||||
return 0 # Same day
|
||||
elif '+ ' in date_str:
|
||||
return 0 # Future order, use current price
|
||||
|
||||
return 0 # BASE_TS alone = today
|
||||
|
||||
|
||||
def main():
|
||||
fixture_path = Path(__file__).parent / "07-procurement.json"
|
||||
|
||||
print("🔧 Fixing Procurement Data Structure...")
|
||||
print()
|
||||
|
||||
# Load existing data
|
||||
with open(fixture_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
purchase_orders = data.get('purchase_orders', [])
|
||||
po_items = data.get('purchase_order_items', [])
|
||||
|
||||
print(f"📦 Found {len(purchase_orders)} purchase orders")
|
||||
print(f"📋 Found {len(po_items)} PO items")
|
||||
print()
|
||||
|
||||
# Step 1: Remove nested 'items' arrays from POs (wrong structure)
|
||||
items_removed = 0
|
||||
for po in purchase_orders:
|
||||
if 'items' in po:
|
||||
items_removed += len(po['items'])
|
||||
del po['items']
|
||||
|
||||
if items_removed > 0:
|
||||
print(f"✓ Removed {items_removed} nested items arrays (wrong structure)")
|
||||
print()
|
||||
|
||||
# Step 2: Update existing PO items with realistic price trends
|
||||
items_updated = 0
|
||||
|
||||
for item in po_items:
|
||||
ingredient_id = item.get('inventory_product_id')
|
||||
|
||||
if ingredient_id in PRICE_TRENDS:
|
||||
# Find the PO to get order date
|
||||
po_id = item.get('purchase_order_id')
|
||||
po = next((p for p in purchase_orders if p['id'] == po_id), None)
|
||||
|
||||
if po:
|
||||
order_date = po.get('order_date', 'BASE_TS')
|
||||
days_ago = parse_days_ago(order_date)
|
||||
|
||||
# Calculate price for that date
|
||||
historical_price = calculate_price_for_date(ingredient_id, days_ago)
|
||||
|
||||
if historical_price:
|
||||
# Update item with historical price
|
||||
ordered_qty = float(item.get('ordered_quantity', 0))
|
||||
item['unit_price'] = historical_price
|
||||
item['line_total'] = round(ordered_qty * historical_price, 2)
|
||||
|
||||
items_updated += 1
|
||||
|
||||
print(f"✓ Updated {items_updated} PO items with price trends")
|
||||
print()
|
||||
|
||||
# Step 3: Recalculate PO totals based on updated items
|
||||
for po in purchase_orders:
|
||||
po_id = po['id']
|
||||
po_items_for_this_po = [item for item in po_items if item.get('purchase_order_id') == po_id]
|
||||
|
||||
if po_items_for_this_po:
|
||||
# Calculate subtotal from items
|
||||
subtotal = sum(float(item.get('line_total', 0)) for item in po_items_for_this_po)
|
||||
tax_rate = 0.21 # 21% IVA in Spain
|
||||
tax = subtotal * tax_rate
|
||||
|
||||
# Keep existing shipping cost or default
|
||||
shipping = float(po.get('shipping_cost', 15.0 if subtotal < 500 else 20.0))
|
||||
discount = float(po.get('discount_amount', 0.0))
|
||||
|
||||
total = subtotal + tax + shipping - discount
|
||||
|
||||
po['subtotal'] = round(subtotal, 2)
|
||||
po['tax_amount'] = round(tax, 2)
|
||||
po['shipping_cost'] = round(shipping, 2)
|
||||
po['discount_amount'] = round(discount, 2)
|
||||
po['total_amount'] = round(total, 2)
|
||||
|
||||
print(f"✓ Recalculated totals for {len(purchase_orders)} purchase orders")
|
||||
print()
|
||||
|
||||
# Save fixed data
|
||||
with open(fixture_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print("=" * 60)
|
||||
print("✅ PROCUREMENT STRUCTURE FIXED")
|
||||
print("=" * 60)
|
||||
print()
|
||||
print("🎯 Changes Applied:")
|
||||
print(f" • Removed {items_removed} incorrectly nested items")
|
||||
print(f" • Updated {items_updated} PO items with price trends")
|
||||
print(f" • Recalculated {len(purchase_orders)} PO totals")
|
||||
print()
|
||||
print("📊 Price Trends Applied:")
|
||||
for ing_id, data in PRICE_TRENDS.items():
|
||||
direction = "↑" if data["trend"] > 0 else "↓"
|
||||
print(f" {direction} {data['name']}: {data['trend']*100:+.1f}%")
|
||||
print()
|
||||
print("✅ Data structure now matches PurchaseOrderItem model")
|
||||
print("✅ Price trends enable procurement AI insights")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
296
shared/demo/fixtures/professional/generate_ai_insights_data.py
Normal file
296
shared/demo/fixtures/professional/generate_ai_insights_data.py
Normal file
@@ -0,0 +1,296 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate AI Insights Data for Professional Demo
|
||||
Adds realistic stock movements and production worker data to enable AI insight generation
|
||||
"""
|
||||
|
||||
import json
|
||||
import random
|
||||
from datetime import datetime, timedelta
|
||||
from uuid import uuid4, UUID
|
||||
from typing import List, Dict, Any
|
||||
|
||||
# Set random seed for reproducibility
|
||||
random.seed(42)
|
||||
|
||||
# Key ingredients that need demand history (matching actual IDs in 03-inventory.json)
|
||||
KEY_INGREDIENTS = [
|
||||
{"id": "10000000-0000-0000-0000-000000000001", "name": "Harina de Trigo T55", "avg_daily": 45.0, "variability": 0.3, "unit_cost": 0.85},
|
||||
{"id": "10000000-0000-0000-0000-000000000002", "name": "Harina de Trigo T65", "avg_daily": 35.0, "variability": 0.25, "unit_cost": 0.95},
|
||||
{"id": "10000000-0000-0000-0000-000000000003", "name": "Harina de Fuerza W300", "avg_daily": 25.0, "variability": 0.35, "unit_cost": 1.15},
|
||||
{"id": "10000000-0000-0000-0000-000000000011", "name": "Mantequilla sin Sal", "avg_daily": 8.5, "variability": 0.35, "unit_cost": 6.50},
|
||||
{"id": "10000000-0000-0000-0000-000000000012", "name": "Leche Entera Fresca", "avg_daily": 18.0, "variability": 0.3, "unit_cost": 0.95},
|
||||
{"id": "10000000-0000-0000-0000-000000000014", "name": "Huevos Frescos", "avg_daily": 5.5, "variability": 0.4, "unit_cost": 3.80},
|
||||
{"id": "10000000-0000-0000-0000-000000000021", "name": "Levadura Fresca", "avg_daily": 3.5, "variability": 0.4, "unit_cost": 4.20},
|
||||
{"id": "10000000-0000-0000-0000-000000000031", "name": "Sal Marina Fina", "avg_daily": 2.8, "variability": 0.2, "unit_cost": 1.50},
|
||||
{"id": "10000000-0000-0000-0000-000000000032", "name": "Azúcar Blanco", "avg_daily": 12.0, "variability": 0.3, "unit_cost": 1.10},
|
||||
{"id": "10000000-0000-0000-0000-000000000013", "name": "Nata para Montar", "avg_daily": 4.2, "variability": 0.35, "unit_cost": 2.80},
|
||||
]
|
||||
|
||||
# Workers with different skill levels (matching users in 02-auth.json)
|
||||
WORKERS = [
|
||||
{"id": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6", "name": "María García (Owner - Master Baker)", "skill_level": 0.98, "shift": "morning"}, # Expert
|
||||
{"id": "50000000-0000-0000-0000-000000000001", "name": "Juan Panadero (Baker)", "skill_level": 0.95, "shift": "morning"}, # Very skilled
|
||||
{"id": "50000000-0000-0000-0000-000000000006", "name": "Isabel Producción (Production Manager)", "skill_level": 0.90, "shift": "afternoon"}, # Experienced
|
||||
{"id": "50000000-0000-0000-0000-000000000005", "name": "Carlos Almacén (Warehouse - Occasional Baker)", "skill_level": 0.78, "shift": "afternoon"}, # Learning
|
||||
]
|
||||
|
||||
TENANT_ID = "a1b2c3d4-e5f6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
|
||||
|
||||
def generate_stock_movements(days: int = 90) -> List[Dict[str, Any]]:
|
||||
"""Generate realistic stock movements for AI insights"""
|
||||
movements = []
|
||||
|
||||
# Generate PRODUCTION_USE movements (daily consumption)
|
||||
for day in range(days, 0, -1):
|
||||
for ingredient in KEY_INGREDIENTS:
|
||||
# Skip some days randomly (not every ingredient used every day)
|
||||
if random.random() < 0.15: # 15% chance to skip
|
||||
continue
|
||||
|
||||
# Calculate quantity with variability
|
||||
base_qty = ingredient["avg_daily"]
|
||||
variability = ingredient["variability"]
|
||||
quantity = base_qty * random.uniform(1 - variability, 1 + variability)
|
||||
|
||||
# Reduce usage on weekends (lower production)
|
||||
date_offset = f"BASE_TS - {day}d"
|
||||
day_of_week = (90 - day) % 7 # Approximate day of week
|
||||
if day_of_week in [5, 6]: # Weekend
|
||||
quantity *= 0.6
|
||||
|
||||
# Round to 2 decimals
|
||||
quantity = round(quantity, 2)
|
||||
|
||||
movement = {
|
||||
"id": str(uuid4()),
|
||||
"tenant_id": TENANT_ID,
|
||||
"ingredient_id": ingredient["id"],
|
||||
"stock_id": None,
|
||||
"movement_type": "PRODUCTION_USE",
|
||||
"quantity": quantity,
|
||||
"unit_cost": ingredient["unit_cost"],
|
||||
"total_cost": round(quantity * ingredient["unit_cost"], 2),
|
||||
"quantity_before": None,
|
||||
"quantity_after": None,
|
||||
"movement_date": date_offset,
|
||||
"reason_code": "production_consumption",
|
||||
"notes": f"Daily production usage - {ingredient['name']}",
|
||||
"created_at": date_offset,
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
}
|
||||
movements.append(movement)
|
||||
|
||||
# Generate PURCHASE movements (supplier deliveries - weekly/bi-weekly)
|
||||
for ingredient in KEY_INGREDIENTS:
|
||||
# Calculate delivery frequency based on usage
|
||||
weekly_usage = ingredient["avg_daily"] * 7
|
||||
delivery_qty = weekly_usage * 2 # 2 weeks of stock
|
||||
|
||||
# Bi-weekly deliveries over 90 days = ~6-7 deliveries
|
||||
num_deliveries = 6
|
||||
delivery_interval = days // num_deliveries
|
||||
|
||||
for delivery_num in range(num_deliveries):
|
||||
day_offset = days - (delivery_num * delivery_interval) - random.randint(0, 3)
|
||||
if day_offset < 1:
|
||||
continue
|
||||
|
||||
# Add some variability to delivery quantity
|
||||
qty = delivery_qty * random.uniform(0.9, 1.1)
|
||||
qty = round(qty, 2)
|
||||
|
||||
movement = {
|
||||
"id": str(uuid4()),
|
||||
"tenant_id": TENANT_ID,
|
||||
"ingredient_id": ingredient["id"],
|
||||
"stock_id": None,
|
||||
"movement_type": "PURCHASE",
|
||||
"quantity": qty,
|
||||
"unit_cost": ingredient["unit_cost"],
|
||||
"total_cost": round(qty * ingredient["unit_cost"], 2),
|
||||
"quantity_before": None,
|
||||
"quantity_after": None,
|
||||
"movement_date": f"BASE_TS - {day_offset}d",
|
||||
"reason_code": "supplier_delivery",
|
||||
"notes": f"Weekly delivery from supplier - {ingredient['name']}",
|
||||
"created_at": f"BASE_TS - {day_offset}d",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
}
|
||||
movements.append(movement)
|
||||
|
||||
# Add occasional stockout events (0 inventory remaining)
|
||||
# Add 5-8 stockout PRODUCTION_USE movements
|
||||
for _ in range(random.randint(5, 8)):
|
||||
ingredient = random.choice(KEY_INGREDIENTS)
|
||||
day_offset = random.randint(1, days)
|
||||
|
||||
movement = {
|
||||
"id": str(uuid4()),
|
||||
"tenant_id": TENANT_ID,
|
||||
"ingredient_id": ingredient["id"],
|
||||
"stock_id": None,
|
||||
"movement_type": "PRODUCTION_USE",
|
||||
"quantity": round(ingredient["avg_daily"] * 1.3, 2), # Higher than usual
|
||||
"unit_cost": ingredient["unit_cost"],
|
||||
"total_cost": round(ingredient["avg_daily"] * 1.3 * ingredient["unit_cost"], 2),
|
||||
"quantity_before": round(ingredient["avg_daily"] * 0.8, 2),
|
||||
"quantity_after": 0.0, # Stockout!
|
||||
"movement_date": f"BASE_TS - {day_offset}d",
|
||||
"reason_code": "production_consumption_stockout",
|
||||
"notes": f"STOCKOUT - Ran out of {ingredient['name']} during production",
|
||||
"created_at": f"BASE_TS - {day_offset}d",
|
||||
"created_by": "c1a2b3c4-d5e6-47a8-b9c0-d1e2f3a4b5c6"
|
||||
}
|
||||
movements.append(movement)
|
||||
|
||||
return movements
|
||||
|
||||
|
||||
def add_worker_data_to_batches(batches: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
"""Add staff_assigned and completed_at to production batches"""
|
||||
updated_batches = []
|
||||
|
||||
for batch in batches:
|
||||
# Skip if no yield data (can't assign skill-based worker)
|
||||
if batch.get("yield_percentage") is None:
|
||||
updated_batches.append(batch)
|
||||
continue
|
||||
|
||||
# Assign worker based on yield (better yields = better workers)
|
||||
yield_pct = batch["yield_percentage"]
|
||||
|
||||
if yield_pct >= 95:
|
||||
# Expert workers for high yields
|
||||
worker = random.choice(WORKERS[:2])
|
||||
elif yield_pct >= 90:
|
||||
# Experienced workers
|
||||
worker = random.choice(WORKERS[1:3])
|
||||
elif yield_pct >= 85:
|
||||
# Competent workers
|
||||
worker = random.choice(WORKERS[2:4])
|
||||
else:
|
||||
# Junior workers for lower yields
|
||||
worker = random.choice(WORKERS[3:])
|
||||
|
||||
# Add staff_assigned
|
||||
if "staff_assigned" not in batch or not isinstance(batch["staff_assigned"], list):
|
||||
batch["staff_assigned"] = []
|
||||
batch["staff_assigned"].append(worker["id"])
|
||||
|
||||
# Calculate completed_at from actual_start_time + planned_duration_minutes
|
||||
if batch.get("actual_start_time") and batch.get("planned_duration_minutes"):
|
||||
# Parse the BASE_TS offset
|
||||
start_time_str = batch["actual_start_time"]
|
||||
duration_mins = batch["planned_duration_minutes"]
|
||||
|
||||
# Add duration to start time with some variability
|
||||
actual_duration = duration_mins * random.uniform(0.95, 1.15) # +/- 15% variability
|
||||
|
||||
# Parse the start time offset to calculate completion time
|
||||
# Format: "BASE_TS - 6d 7h 30m" or "BASE_TS - 6d 7h"
|
||||
if "BASE_TS" in start_time_str:
|
||||
# Extract the offset parts
|
||||
# Convert duration to hours for easier calculation
|
||||
duration_hours = actual_duration / 60.0
|
||||
|
||||
# Parse existing offset
|
||||
parts = start_time_str.replace("BASE_TS", "").strip()
|
||||
# Simple approach: just add the duration to the hours component
|
||||
# Example: "- 6d 7h 30m" -> add 3.5h -> "- 6d 10h 30m" (approximately)
|
||||
|
||||
# For simplicity, create a new timestamp offset
|
||||
# Don't try to parse complex string, just create a note field
|
||||
batch["actual_duration_minutes"] = round(actual_duration, 1)
|
||||
# Don't set completed_at - let the system calculate it if needed
|
||||
|
||||
updated_batches.append(batch)
|
||||
|
||||
return updated_batches
|
||||
|
||||
|
||||
def main():
|
||||
"""Generate and update JSON files with AI insights data"""
|
||||
print("🔧 Generating AI Insights Data for Professional Demo...")
|
||||
print()
|
||||
|
||||
# 1. Generate stock movements
|
||||
print("📊 Generating stock movements...")
|
||||
stock_movements = generate_stock_movements(days=90)
|
||||
usage_count = len([m for m in stock_movements if m["movement_type"] == "PRODUCTION_USE"])
|
||||
in_count = len([m for m in stock_movements if m["movement_type"] == "PURCHASE"])
|
||||
stockout_count = len([m for m in stock_movements if m.get("quantity_after") == 0.0])
|
||||
|
||||
print(f" ✓ Generated {len(stock_movements)} stock movements")
|
||||
print(f" - PRODUCTION_USE movements: {usage_count}")
|
||||
print(f" - PURCHASE movements (deliveries): {in_count}")
|
||||
print(f" - Stockout events: {stockout_count}")
|
||||
print()
|
||||
|
||||
# 2. Load and update inventory JSON
|
||||
print("📦 Updating 03-inventory.json...")
|
||||
with open("/Users/urtzialfaro/Documents/bakery-ia/shared/demo/fixtures/professional/03-inventory.json", "r") as f:
|
||||
inventory_data = json.load(f)
|
||||
|
||||
# Append new movements to existing ones
|
||||
existing_movements = inventory_data.get("stock_movements", [])
|
||||
print(f" - Existing movements: {len(existing_movements)}")
|
||||
inventory_data["stock_movements"] = existing_movements + stock_movements
|
||||
print(f" - Total movements: {len(inventory_data['stock_movements'])}")
|
||||
|
||||
# Save updated inventory
|
||||
with open("/Users/urtzialfaro/Documents/bakery-ia/shared/demo/fixtures/professional/03-inventory.json", "w") as f:
|
||||
json.dump(inventory_data, f, indent=2, ensure_ascii=False)
|
||||
print(" ✓ Updated inventory file")
|
||||
print()
|
||||
|
||||
# 3. Load and update production JSON
|
||||
print("🏭 Updating 06-production.json...")
|
||||
with open("/Users/urtzialfaro/Documents/bakery-ia/shared/demo/fixtures/professional/06-production.json", "r") as f:
|
||||
production_data = json.load(f)
|
||||
|
||||
# Update production batches with worker data
|
||||
original_batches = production_data.get("batches", [])
|
||||
print(f" - Total batches: {len(original_batches)}")
|
||||
|
||||
updated_batches = add_worker_data_to_batches(original_batches)
|
||||
batches_with_workers = len([b for b in updated_batches if b.get("staff_assigned") and len(b.get("staff_assigned", [])) > 0])
|
||||
batches_with_completion = len([b for b in updated_batches if b.get("completed_at")])
|
||||
|
||||
production_data["batches"] = updated_batches
|
||||
print(f" - Batches with worker_id: {batches_with_workers}")
|
||||
print(f" - Batches with completed_at: {batches_with_completion}")
|
||||
|
||||
# Save updated production
|
||||
with open("/Users/urtzialfaro/Documents/bakery-ia/shared/demo/fixtures/professional/06-production.json", "w") as f:
|
||||
json.dump(production_data, f, indent=2, ensure_ascii=False)
|
||||
print(" ✓ Updated production file")
|
||||
print()
|
||||
|
||||
# 4. Summary
|
||||
print("=" * 60)
|
||||
print("✅ AI INSIGHTS DATA GENERATION COMPLETE")
|
||||
print("=" * 60)
|
||||
print()
|
||||
print("📊 DATA ADDED:")
|
||||
print(f" • Stock movements (PRODUCTION_USE): {usage_count} records (90 days)")
|
||||
print(f" • Stock movements (PURCHASE): {in_count} deliveries")
|
||||
print(f" • Stockout events: {stockout_count}")
|
||||
print(f" • Worker assignments: {batches_with_workers} batches")
|
||||
print(f" • Completion timestamps: {batches_with_completion} batches")
|
||||
print()
|
||||
print("🎯 AI INSIGHTS READINESS:")
|
||||
print(" ✓ Safety Stock Optimizer: READY (90 days demand data)")
|
||||
print(" ✓ Yield Predictor: READY (worker data added)")
|
||||
print(" ✓ Sustainability Metrics: READY (existing waste data)")
|
||||
print()
|
||||
print("🚀 Next steps:")
|
||||
print(" 1. Test demo session creation")
|
||||
print(" 2. Verify AI insights generation")
|
||||
print(" 3. Check insight quality in frontend")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
82
shared/demo/metadata/cross_refs_map.json
Normal file
82
shared/demo/metadata/cross_refs_map.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"description": "Map of cross-service references for validation",
|
||||
"references": [
|
||||
{
|
||||
"from_service": "production",
|
||||
"from_entity": "ProductionBatch",
|
||||
"from_field": "product_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"to_filter": {"product_type": "FINISHED_PRODUCT"},
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "production",
|
||||
"from_entity": "ProductionBatch",
|
||||
"from_field": "recipe_id",
|
||||
"to_service": "recipes",
|
||||
"to_entity": "Recipe",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"from_service": "recipes",
|
||||
"from_entity": "RecipeIngredient",
|
||||
"from_field": "ingredient_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"to_filter": {"product_type": "INGREDIENT"},
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "inventory",
|
||||
"from_entity": "Stock",
|
||||
"from_field": "supplier_id",
|
||||
"to_service": "suppliers",
|
||||
"to_entity": "Supplier",
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"from_service": "procurement",
|
||||
"from_entity": "PurchaseOrder",
|
||||
"from_field": "supplier_id",
|
||||
"to_service": "suppliers",
|
||||
"to_entity": "Supplier",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "procurement",
|
||||
"from_entity": "PurchaseOrderItem",
|
||||
"from_field": "inventory_product_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "orders",
|
||||
"from_entity": "OrderItem",
|
||||
"from_field": "product_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"to_filter": {"product_type": "FINISHED_PRODUCT"},
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "sales",
|
||||
"from_entity": "SalesData",
|
||||
"from_field": "product_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"to_filter": {"product_type": "FINISHED_PRODUCT"},
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"from_service": "forecasting",
|
||||
"from_entity": "Forecast",
|
||||
"from_field": "product_id",
|
||||
"to_service": "inventory",
|
||||
"to_entity": "Ingredient",
|
||||
"to_filter": {"product_type": "FINISHED_PRODUCT"},
|
||||
"required": true
|
||||
}
|
||||
]
|
||||
}
|
||||
102
shared/demo/schemas/forecasting/forecast.schema.json
Normal file
102
shared/demo/schemas/forecasting/forecast.schema.json
Normal file
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Forecast",
|
||||
"description": "Schema for demand forecast data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"product_id",
|
||||
"forecast_date",
|
||||
"predicted_quantity",
|
||||
"confidence_score",
|
||||
"forecast_horizon_days",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the forecast"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"product_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Product identifier"
|
||||
},
|
||||
"forecast_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Forecast date"
|
||||
},
|
||||
"predicted_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Predicted quantity"
|
||||
},
|
||||
"confidence_score": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 1,
|
||||
"description": "Confidence score (0-1)"
|
||||
},
|
||||
"forecast_horizon_days": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"description": "Forecast horizon in days"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"enterprise_forecast": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level forecast"
|
||||
},
|
||||
"forecast_type": {
|
||||
"type": "string",
|
||||
"description": "Type of forecast"
|
||||
},
|
||||
"contract_reference": {
|
||||
"type": "string",
|
||||
"description": "Contract reference"
|
||||
},
|
||||
"customer_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Customer identifier"
|
||||
},
|
||||
"delivery_locations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Delivery locations"
|
||||
},
|
||||
"reasoning_data": {
|
||||
"type": "object",
|
||||
"description": "Reasoning data for special forecasts",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Reasoning type"
|
||||
},
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"description": "Reasoning parameters"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
181
shared/demo/schemas/inventory/ingredient.schema.json
Normal file
181
shared/demo/schemas/inventory/ingredient.schema.json
Normal file
@@ -0,0 +1,181 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/inventory/ingredient/v1",
|
||||
"type": "object",
|
||||
"title": "Ingredient",
|
||||
"description": "Ingredient or finished product for demo cloning",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique ingredient identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 255
|
||||
},
|
||||
"sku": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"barcode": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 50
|
||||
},
|
||||
"product_type": {
|
||||
"type": "string",
|
||||
"enum": ["ingredient", "finished_product"],
|
||||
"description": "Type of product in inventory"
|
||||
},
|
||||
"ingredient_category": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["flour", "yeast", "dairy", "eggs", "sugar", "fats", "salt", "spices", "additives", "packaging", "cleaning", "other"]
|
||||
},
|
||||
"product_category": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["bread", "croissants", "pastries", "cakes", "cookies", "muffins", "sandwiches", "seasonal", "beverages", "other_products"]
|
||||
},
|
||||
"subcategory": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"description": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"brand": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"unit_of_measure": {
|
||||
"type": "string",
|
||||
"enum": ["kg", "g", "l", "ml", "units", "pcs", "pkg", "bags", "boxes"]
|
||||
},
|
||||
"package_size": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"average_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"last_purchase_price": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"standard_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"low_stock_threshold": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"reorder_point": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"reorder_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"max_stock_level": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"shelf_life_days": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"display_life_hours": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"best_before_hours": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"storage_instructions": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"central_baker_product_code": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"delivery_days": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 20
|
||||
},
|
||||
"minimum_order_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"pack_size": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"is_active": {
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"is_perishable": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"allergen_info": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
"nutritional_info": {
|
||||
"type": ["object", "null"]
|
||||
},
|
||||
"produced_locally": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"recipe_id": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to recipes.Recipe for local production"
|
||||
},
|
||||
"created_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"created_by": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "name", "product_type", "unit_of_measure", "is_active", "is_perishable", "produced_locally"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {"product_type": {"const": "finished_product"}}
|
||||
},
|
||||
"then": {
|
||||
"required": ["product_category"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {"product_type": {"const": "ingredient"}}
|
||||
},
|
||||
"then": {
|
||||
"required": ["ingredient_category"]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
159
shared/demo/schemas/inventory/stock.schema.json
Normal file
159
shared/demo/schemas/inventory/stock.schema.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/inventory/stock/v1",
|
||||
"type": "object",
|
||||
"title": "Stock",
|
||||
"description": "Stock levels and batch tracking for demo cloning",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique stock identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"ingredient_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Reference to inventory.Ingredient"
|
||||
},
|
||||
"supplier_id": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to suppliers.Supplier"
|
||||
},
|
||||
"batch_number": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"lot_number": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"supplier_batch_ref": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"production_stage": {
|
||||
"type": "string",
|
||||
"enum": ["raw_ingredient", "par_baked", "fully_baked", "prepared_dough", "frozen_product"],
|
||||
"default": "raw_ingredient"
|
||||
},
|
||||
"transformation_reference": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"current_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"default": 0
|
||||
},
|
||||
"reserved_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"default": 0
|
||||
},
|
||||
"available_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"default": 0
|
||||
},
|
||||
"received_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"expiration_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"best_before_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"original_expiration_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"transformation_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"final_expiration_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"unit_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"total_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"storage_location": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"warehouse_zone": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 50
|
||||
},
|
||||
"shelf_position": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 50
|
||||
},
|
||||
"requires_refrigeration": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"requires_freezing": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"storage_temperature_min": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"storage_temperature_max": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"storage_humidity_max": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"shelf_life_days": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"storage_instructions": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"is_available": {
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"is_expired": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"quality_status": {
|
||||
"type": "string",
|
||||
"enum": ["good", "damaged", "expired", "quarantined"],
|
||||
"default": "good"
|
||||
},
|
||||
"created_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "ingredient_id", "current_quantity", "reserved_quantity", "available_quantity",
|
||||
"is_available", "is_expired", "quality_status"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
137
shared/demo/schemas/orders/customer.schema.json
Normal file
137
shared/demo/schemas/orders/customer.schema.json
Normal file
@@ -0,0 +1,137 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Customer",
|
||||
"description": "Schema for customer data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"customer_code",
|
||||
"name",
|
||||
"customer_type",
|
||||
"contact_person",
|
||||
"email",
|
||||
"phone",
|
||||
"address",
|
||||
"city",
|
||||
"postal_code",
|
||||
"country",
|
||||
"status",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the customer"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"customer_code": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Customer code"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100,
|
||||
"description": "Customer name"
|
||||
},
|
||||
"customer_type": {
|
||||
"type": "string",
|
||||
"enum": ["RETAIL", "WHOLESALE", "ENTERPRISE", "ONLINE"],
|
||||
"description": "Customer type"
|
||||
},
|
||||
"contact_person": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100,
|
||||
"description": "Primary contact person"
|
||||
},
|
||||
"email": {
|
||||
"type": "string",
|
||||
"format": "email",
|
||||
"description": "Contact email"
|
||||
},
|
||||
"phone": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 20,
|
||||
"description": "Contact phone number"
|
||||
},
|
||||
"address": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 200,
|
||||
"description": "Street address"
|
||||
},
|
||||
"city": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "City"
|
||||
},
|
||||
"postal_code": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 10,
|
||||
"description": "Postal code"
|
||||
},
|
||||
"country": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Country"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["ACTIVE", "INACTIVE", "PENDING", "SUSPENDED"],
|
||||
"description": "Customer status"
|
||||
},
|
||||
"total_orders": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"description": "Total orders placed"
|
||||
},
|
||||
"total_spent": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Total amount spent in EUR"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"enterprise_customer": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level customer"
|
||||
},
|
||||
"contract_type": {
|
||||
"type": "string",
|
||||
"description": "Contract type"
|
||||
},
|
||||
"annual_volume_commitment": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Annual volume commitment"
|
||||
},
|
||||
"delivery_locations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Delivery locations"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
116
shared/demo/schemas/orders/customer_order.schema.json
Normal file
116
shared/demo/schemas/orders/customer_order.schema.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "CustomerOrder",
|
||||
"description": "Schema for customer order data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"customer_id",
|
||||
"order_number",
|
||||
"order_date",
|
||||
"delivery_date",
|
||||
"status",
|
||||
"total_amount",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the customer order"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"customer_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Customer identifier"
|
||||
},
|
||||
"order_number": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Order number"
|
||||
},
|
||||
"order_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Order date"
|
||||
},
|
||||
"delivery_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Delivery date"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["DRAFT", "PENDING", "PROCESSING", "DELIVERED", "CANCELLED", "REJECTED"],
|
||||
"description": "Order status"
|
||||
},
|
||||
"total_amount": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Total order amount in EUR"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"is_urgent": {
|
||||
"type": "boolean",
|
||||
"description": "Urgent order flag"
|
||||
},
|
||||
"enterprise_order": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level order"
|
||||
},
|
||||
"contract_reference": {
|
||||
"type": "string",
|
||||
"description": "Contract reference"
|
||||
},
|
||||
"delivery_locations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"location": {
|
||||
"type": "string"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"delivery_time": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Delivery locations"
|
||||
},
|
||||
"reasoning_data": {
|
||||
"type": "object",
|
||||
"description": "Reasoning data for urgent orders",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Reasoning type"
|
||||
},
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"description": "Reasoning parameters"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
104
shared/demo/schemas/procurement/purchase_order.schema.json
Normal file
104
shared/demo/schemas/procurement/purchase_order.schema.json
Normal file
@@ -0,0 +1,104 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "PurchaseOrder",
|
||||
"description": "Schema for purchase order data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"po_number",
|
||||
"supplier_id",
|
||||
"order_date",
|
||||
"expected_delivery_date",
|
||||
"status",
|
||||
"total_amount",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the purchase order"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"po_number": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Purchase order number"
|
||||
},
|
||||
"supplier_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Supplier identifier"
|
||||
},
|
||||
"order_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Order date"
|
||||
},
|
||||
"expected_delivery_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Expected delivery date"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["DRAFT", "PENDING", "APPROVED", "DELIVERED", "CANCELLED", "REJECTED"],
|
||||
"description": "Purchase order status"
|
||||
},
|
||||
"total_amount": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Total order amount in EUR"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"reasoning_data": {
|
||||
"type": "object",
|
||||
"description": "Reasoning data for urgent orders",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Reasoning type"
|
||||
},
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"description": "Reasoning parameters"
|
||||
}
|
||||
}
|
||||
},
|
||||
"enterprise_order": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level order"
|
||||
},
|
||||
"contract_reference": {
|
||||
"type": "string",
|
||||
"description": "Contract reference"
|
||||
},
|
||||
"payment_terms": {
|
||||
"type": "string",
|
||||
"description": "Payment terms"
|
||||
},
|
||||
"delivery_location": {
|
||||
"type": "string",
|
||||
"description": "Delivery location"
|
||||
},
|
||||
"incoterms": {
|
||||
"type": "string",
|
||||
"description": "International commercial terms"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "PurchaseOrderItem",
|
||||
"description": "Schema for purchase order item data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"po_id",
|
||||
"ingredient_id",
|
||||
"quantity",
|
||||
"unit_price",
|
||||
"total_price",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the purchase order item"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"po_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Purchase order identifier"
|
||||
},
|
||||
"ingredient_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Ingredient identifier"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Quantity ordered"
|
||||
},
|
||||
"unit_price": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Unit price in EUR"
|
||||
},
|
||||
"total_price": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Total price in EUR"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"enterprise_item": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level item"
|
||||
},
|
||||
"delivery_schedule": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"delivery_date": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0
|
||||
},
|
||||
"location": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": "Delivery schedule"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
261
shared/demo/schemas/production/batch.schema.json
Normal file
261
shared/demo/schemas/production/batch.schema.json
Normal file
@@ -0,0 +1,261 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/production/batch/v1",
|
||||
"type": "object",
|
||||
"title": "ProductionBatch",
|
||||
"description": "Production batch for demo cloning",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique batch identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"batch_number": {
|
||||
"type": "string",
|
||||
"pattern": "^BATCH-[0-9]{8}-[A-Z0-9]{6}$",
|
||||
"description": "Unique batch code"
|
||||
},
|
||||
"product_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to inventory.Ingredient (type=FINISHED_PRODUCT)"
|
||||
},
|
||||
"product_name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 255
|
||||
},
|
||||
"recipe_id": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to recipes.Recipe"
|
||||
},
|
||||
"planned_start_time": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "ISO 8601 datetime with timezone"
|
||||
},
|
||||
"planned_end_time": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"planned_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0.1,
|
||||
"description": "Quantity in product's unit of measure"
|
||||
},
|
||||
"planned_duration_minutes": {
|
||||
"type": "integer",
|
||||
"minimum": 1
|
||||
},
|
||||
"actual_start_time": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time",
|
||||
"description": "Set when status becomes IN_PROGRESS"
|
||||
},
|
||||
"actual_end_time": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time",
|
||||
"description": "Set when status becomes COMPLETED"
|
||||
},
|
||||
"actual_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"actual_duration_minutes": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["PENDING", "IN_PROGRESS", "COMPLETED", "CANCELLED", "ON_HOLD", "QUALITY_CHECK", "FAILED"],
|
||||
"default": "PENDING"
|
||||
},
|
||||
"priority": {
|
||||
"type": "string",
|
||||
"enum": ["LOW", "MEDIUM", "HIGH", "URGENT"],
|
||||
"default": "MEDIUM"
|
||||
},
|
||||
"current_process_stage": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["mixing", "proofing", "shaping", "baking", "cooling", "packaging", "finishing", null]
|
||||
},
|
||||
"process_stage_history": {
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"stage": {"type": "string"},
|
||||
"timestamp": {"type": "string", "format": "date-time"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"pending_quality_checks": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
"completed_quality_checks": {
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"stage": {"type": "string"},
|
||||
"score": {"type": "number"},
|
||||
"timestamp": {"type": "string", "format": "date-time"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"estimated_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"actual_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"labor_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"material_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"overhead_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"yield_percentage": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 100
|
||||
},
|
||||
"quality_score": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 10
|
||||
},
|
||||
"waste_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"defect_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"waste_defect_type": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["burnt", "misshapen", "underproofed", "temperature_issues", "expired", null]
|
||||
},
|
||||
"equipment_used": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string", "format": "uuid"},
|
||||
"minItems": 1,
|
||||
"description": "Array of Equipment IDs"
|
||||
},
|
||||
"staff_assigned": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string", "format": "uuid"}
|
||||
},
|
||||
"station_id": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 50
|
||||
},
|
||||
"order_id": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to orders.CustomerOrder"
|
||||
},
|
||||
"forecast_id": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to forecasting.Forecast"
|
||||
},
|
||||
"is_rush_order": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"is_special_recipe": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"is_ai_assisted": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"production_notes": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"quality_notes": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"delay_reason": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 255
|
||||
},
|
||||
"cancellation_reason": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 255
|
||||
},
|
||||
"reasoning_data": {
|
||||
"type": ["object", "null"],
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["forecast_demand", "customer_order", "stock_replenishment"]
|
||||
},
|
||||
"parameters": {"type": "object"},
|
||||
"urgency": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"level": {"type": "string"},
|
||||
"ready_by_time": {"type": "string"},
|
||||
"customer_commitment": {"type": "boolean"}
|
||||
}
|
||||
},
|
||||
"metadata": {"type": "object"}
|
||||
}
|
||||
},
|
||||
"created_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"completed_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "batch_number", "product_id", "product_name",
|
||||
"planned_start_time", "planned_end_time", "planned_quantity",
|
||||
"planned_duration_minutes", "status", "priority"
|
||||
],
|
||||
"additionalProperties": false,
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {"status": {"const": "IN_PROGRESS"}}
|
||||
},
|
||||
"then": {
|
||||
"required": ["actual_start_time"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": {"status": {"const": "COMPLETED"}}
|
||||
},
|
||||
"then": {
|
||||
"required": ["actual_start_time", "actual_end_time", "actual_quantity"]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
169
shared/demo/schemas/production/equipment.schema.json
Normal file
169
shared/demo/schemas/production/equipment.schema.json
Normal file
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/production/equipment/v1",
|
||||
"type": "object",
|
||||
"title": "Equipment",
|
||||
"description": "Production equipment for demo cloning",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique equipment identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 255
|
||||
},
|
||||
"type": {
|
||||
"type": "string",
|
||||
"enum": ["oven", "mixer", "proofer", "freezer", "packaging", "other"]
|
||||
},
|
||||
"model": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"serial_number": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"location": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 255
|
||||
},
|
||||
"manufacturer": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"firmware_version": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 50
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["OPERATIONAL", "MAINTENANCE", "DOWN", "WARNING"],
|
||||
"default": "OPERATIONAL"
|
||||
},
|
||||
"install_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"last_maintenance_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"next_maintenance_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"maintenance_interval_days": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"efficiency_percentage": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 100
|
||||
},
|
||||
"uptime_percentage": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 100
|
||||
},
|
||||
"energy_usage_kwh": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"power_kw": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"capacity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"weight_kg": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"current_temperature": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"target_temperature": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"iot_enabled": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"iot_protocol": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["rest_api", "opc_ua", "mqtt", "modbus", "custom"]
|
||||
},
|
||||
"iot_endpoint": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 500
|
||||
},
|
||||
"iot_port": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1,
|
||||
"maximum": 65535
|
||||
},
|
||||
"iot_connection_status": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["connected", "disconnected", "error", "unknown"]
|
||||
},
|
||||
"iot_last_connected": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"supports_realtime": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"poll_interval_seconds": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"temperature_zones": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"supports_humidity": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"supports_energy_monitoring": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"supports_remote_control": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"is_active": {
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"notes": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"created_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "name", "type", "status", "is_active"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
191
shared/demo/schemas/recipes/recipe.schema.json
Normal file
191
shared/demo/schemas/recipes/recipe.schema.json
Normal file
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/recipes/recipe/v1",
|
||||
"type": "object",
|
||||
"title": "Recipe",
|
||||
"description": "Recipe for demo cloning",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique recipe identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 255
|
||||
},
|
||||
"recipe_code": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"version": {
|
||||
"type": "string",
|
||||
"default": "1.0"
|
||||
},
|
||||
"finished_product_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to inventory.Ingredient (product_type=finished_product)"
|
||||
},
|
||||
"description": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"category": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"cuisine_type": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"difficulty_level": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"maximum": 5,
|
||||
"default": 1
|
||||
},
|
||||
"yield_quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0.1
|
||||
},
|
||||
"yield_unit": {
|
||||
"type": "string",
|
||||
"enum": ["g", "kg", "ml", "l", "cups", "tbsp", "tsp", "units", "pieces", "%"]
|
||||
},
|
||||
"prep_time_minutes": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"cook_time_minutes": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"total_time_minutes": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"rest_time_minutes": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"estimated_cost_per_unit": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"last_calculated_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"cost_calculation_date": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"target_margin_percentage": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 100
|
||||
},
|
||||
"suggested_selling_price": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"instructions": {
|
||||
"type": ["object", "null"]
|
||||
},
|
||||
"preparation_notes": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"storage_instructions": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"serves_count": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1
|
||||
},
|
||||
"nutritional_info": {
|
||||
"type": ["object", "null"]
|
||||
},
|
||||
"allergen_info": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
"dietary_tags": {
|
||||
"type": ["array", "null"],
|
||||
"items": {"type": "string"}
|
||||
},
|
||||
"batch_size_multiplier": {
|
||||
"type": "number",
|
||||
"minimum": 0.1,
|
||||
"default": 1.0
|
||||
},
|
||||
"minimum_batch_size": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0.1
|
||||
},
|
||||
"maximum_batch_size": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0.1
|
||||
},
|
||||
"optimal_production_temperature": {
|
||||
"type": ["number", "null"]
|
||||
},
|
||||
"optimal_humidity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0,
|
||||
"maximum": 100
|
||||
},
|
||||
"quality_check_configuration": {
|
||||
"type": ["object", "null"]
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["DRAFT", "ACTIVE", "TESTING", "ARCHIVED", "DISCONTINUED"],
|
||||
"default": "DRAFT"
|
||||
},
|
||||
"is_seasonal": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"season_start_month": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1,
|
||||
"maximum": 12
|
||||
},
|
||||
"season_end_month": {
|
||||
"type": ["integer", "null"],
|
||||
"minimum": 1,
|
||||
"maximum": 12
|
||||
},
|
||||
"is_signature_item": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"created_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
},
|
||||
"created_by": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid"
|
||||
},
|
||||
"updated_by": {
|
||||
"type": ["string", "null"],
|
||||
"format": "uuid"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "name", "finished_product_id", "yield_quantity", "yield_unit",
|
||||
"status", "is_seasonal", "is_signature_item", "batch_size_multiplier"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
100
shared/demo/schemas/recipes/recipe_ingredient.schema.json
Normal file
100
shared/demo/schemas/recipes/recipe_ingredient.schema.json
Normal file
@@ -0,0 +1,100 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schemas.bakery-ia.com/demo/recipes/recipe_ingredient/v1",
|
||||
"type": "object",
|
||||
"title": "RecipeIngredient",
|
||||
"description": "Ingredient required for a recipe",
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique recipe ingredient identifier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant owner (replaced during cloning)"
|
||||
},
|
||||
"recipe_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Reference to recipes.Recipe"
|
||||
},
|
||||
"ingredient_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Cross-service ref to inventory.Ingredient"
|
||||
},
|
||||
"quantity": {
|
||||
"type": "number",
|
||||
"minimum": 0.001
|
||||
},
|
||||
"unit": {
|
||||
"type": "string",
|
||||
"enum": ["g", "kg", "ml", "l", "cups", "tbsp", "tsp", "units", "pieces", "%"]
|
||||
},
|
||||
"quantity_in_base_unit": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"alternative_quantity": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"alternative_unit": {
|
||||
"type": ["string", "null"],
|
||||
"enum": ["g", "kg", "ml", "l", "cups", "tbsp", "tsp", "units", "pieces", "%"]
|
||||
},
|
||||
"preparation_method": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 255
|
||||
},
|
||||
"ingredient_notes": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"is_optional": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"ingredient_order": {
|
||||
"type": "integer",
|
||||
"minimum": 1,
|
||||
"default": 1
|
||||
},
|
||||
"ingredient_group": {
|
||||
"type": ["string", "null"],
|
||||
"maxLength": 100
|
||||
},
|
||||
"substitution_options": {
|
||||
"type": ["array", "null"],
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"ingredient_id": {"type": "string", "format": "uuid"},
|
||||
"name": {"type": "string"},
|
||||
"ratio": {"type": "number"}
|
||||
}
|
||||
}
|
||||
},
|
||||
"substitution_ratio": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0.1
|
||||
},
|
||||
"unit_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"total_cost": {
|
||||
"type": ["number", "null"],
|
||||
"minimum": 0
|
||||
},
|
||||
"cost_updated_at": {
|
||||
"type": ["string", "null"],
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "tenant_id", "recipe_id", "ingredient_id", "quantity", "unit", "ingredient_order"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
103
shared/demo/schemas/sales/sales_data.schema.json
Normal file
103
shared/demo/schemas/sales/sales_data.schema.json
Normal file
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "SalesData",
|
||||
"description": "Schema for sales data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"sale_date",
|
||||
"product_id",
|
||||
"quantity_sold",
|
||||
"unit_price",
|
||||
"total_revenue",
|
||||
"sales_channel",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the sales record"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"sale_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Sale date"
|
||||
},
|
||||
"product_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Product identifier"
|
||||
},
|
||||
"quantity_sold": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Quantity sold"
|
||||
},
|
||||
"unit_price": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Unit price in EUR"
|
||||
},
|
||||
"total_revenue": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Total revenue in EUR"
|
||||
},
|
||||
"sales_channel": {
|
||||
"type": "string",
|
||||
"enum": ["IN_STORE", "ONLINE", "WHOLESALE", "ENTERPRISE", "OTHER"],
|
||||
"description": "Sales channel"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"notes": {
|
||||
"type": "string",
|
||||
"description": "Additional notes"
|
||||
},
|
||||
"enterprise_sale": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level sale"
|
||||
},
|
||||
"customer_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Customer identifier"
|
||||
},
|
||||
"contract_reference": {
|
||||
"type": "string",
|
||||
"description": "Contract reference"
|
||||
},
|
||||
"delivery_locations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Delivery locations"
|
||||
},
|
||||
"reasoning_data": {
|
||||
"type": "object",
|
||||
"description": "Reasoning data for special sales",
|
||||
"properties": {
|
||||
"type": {
|
||||
"type": "string",
|
||||
"description": "Reasoning type"
|
||||
},
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"description": "Reasoning parameters"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
183
shared/demo/schemas/suppliers/supplier.schema.json
Normal file
183
shared/demo/schemas/suppliers/supplier.schema.json
Normal file
@@ -0,0 +1,183 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Supplier",
|
||||
"description": "Schema for supplier data in Bakery-IA system",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"tenant_id",
|
||||
"name",
|
||||
"supplier_code",
|
||||
"business_name",
|
||||
"tax_id",
|
||||
"contact_person",
|
||||
"email",
|
||||
"phone",
|
||||
"address",
|
||||
"city",
|
||||
"postal_code",
|
||||
"country",
|
||||
"status",
|
||||
"rating",
|
||||
"payment_terms",
|
||||
"minimum_order_amount",
|
||||
"lead_time_days",
|
||||
"contract_start_date",
|
||||
"contract_end_date",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Unique identifier for the supplier"
|
||||
},
|
||||
"tenant_id": {
|
||||
"type": "string",
|
||||
"format": "uuid",
|
||||
"description": "Tenant identifier"
|
||||
},
|
||||
"name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100,
|
||||
"description": "Supplier name"
|
||||
},
|
||||
"supplier_code": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Supplier code"
|
||||
},
|
||||
"business_name": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100,
|
||||
"description": "Legal business name"
|
||||
},
|
||||
"tax_id": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 20,
|
||||
"description": "Tax identification number"
|
||||
},
|
||||
"contact_person": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 100,
|
||||
"description": "Primary contact person"
|
||||
},
|
||||
"email": {
|
||||
"type": "string",
|
||||
"format": "email",
|
||||
"description": "Contact email"
|
||||
},
|
||||
"phone": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 20,
|
||||
"description": "Contact phone number"
|
||||
},
|
||||
"address": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 200,
|
||||
"description": "Street address"
|
||||
},
|
||||
"city": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "City"
|
||||
},
|
||||
"postal_code": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 10,
|
||||
"description": "Postal code"
|
||||
},
|
||||
"country": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"maxLength": 50,
|
||||
"description": "Country"
|
||||
},
|
||||
"status": {
|
||||
"type": "string",
|
||||
"enum": ["ACTIVE", "INACTIVE", "PENDING", "SUSPENDED"],
|
||||
"description": "Supplier status"
|
||||
},
|
||||
"rating": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 5,
|
||||
"description": "Supplier rating (0-5)"
|
||||
},
|
||||
"payment_terms": {
|
||||
"type": "string",
|
||||
"enum": ["7_DAYS", "15_DAYS", "30_DAYS", "60_DAYS", "90_DAYS"],
|
||||
"description": "Payment terms"
|
||||
},
|
||||
"minimum_order_amount": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Minimum order amount in EUR"
|
||||
},
|
||||
"lead_time_days": {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"description": "Lead time in days"
|
||||
},
|
||||
"contract_start_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Contract start date"
|
||||
},
|
||||
"contract_end_date": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Contract end date"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time",
|
||||
"description": "Creation timestamp"
|
||||
},
|
||||
"specialties": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Product specialties"
|
||||
},
|
||||
"delivery_areas": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "Delivery areas"
|
||||
},
|
||||
"enterprise_contract": {
|
||||
"type": "boolean",
|
||||
"description": "Enterprise-level contract"
|
||||
},
|
||||
"contract_type": {
|
||||
"type": "string",
|
||||
"description": "Type of contract"
|
||||
},
|
||||
"annual_volume_commitment": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"description": "Annual volume commitment"
|
||||
},
|
||||
"preferred_supplier": {
|
||||
"type": "boolean",
|
||||
"description": "Preferred supplier status"
|
||||
},
|
||||
"organic_certified": {
|
||||
"type": "boolean",
|
||||
"description": "Organic certification"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
Reference in New Issue
Block a user