Initial commit - production deployment

This commit is contained in:
2026-01-21 17:17:16 +01:00
commit c23d00dd92
2289 changed files with 638440 additions and 0 deletions

View File

@@ -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"
}
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"recipes": [],
"recipe_ingredients": [],
"recipe_instructions": []
}

View File

@@ -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
}
]
}

View File

@@ -0,0 +1,4 @@
{
"purchase_orders": [],
"purchase_order_items": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"orchestration_run": null,
"alerts": []
}

View File

@@ -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"
}
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"recipes": [],
"recipe_ingredients": [],
"recipe_instructions": []
}

View File

@@ -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
}
]
}

View File

@@ -0,0 +1,4 @@
{
"purchase_orders": [],
"purchase_order_items": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"orchestration_run": null,
"alerts": []
}

View File

@@ -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"
}
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"recipes": [],
"recipe_ingredients": [],
"recipe_instructions": []
}

View File

@@ -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
}
]
}

View File

@@ -0,0 +1,4 @@
{
"purchase_orders": [],
"purchase_order_items": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"orchestration_run": null,
"alerts": []
}

View File

@@ -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"
}
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"recipes": [],
"recipe_ingredients": [],
"recipe_instructions": []
}

View File

@@ -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
}
]
}

View File

@@ -0,0 +1,4 @@
{
"purchase_orders": [],
"purchase_order_items": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"orchestration_run": null,
"alerts": []
}

View File

@@ -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"
}
}

View File

@@ -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"
}
]
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,5 @@
{
"recipes": [],
"recipe_ingredients": [],
"recipe_instructions": []
}

View File

@@ -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
}
]
}

View File

@@ -0,0 +1,4 @@
{
"purchase_orders": [],
"purchase_order_items": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -0,0 +1,4 @@
{
"orchestration_run": null,
"alerts": []
}

View 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"
}
]
}

View 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"
}
]
}

File diff suppressed because it is too large Load Diff

View 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
}
]
}

View 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
}
]
}

View 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
}
]
}

View 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"
}
]
}

View 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": []
}

View File

@@ -0,0 +1,3 @@
{
"sales_data": []
}

View File

@@ -0,0 +1,4 @@
{
"forecasts": [],
"prediction_batches": []
}

View 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"
}
]
}

View 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"
}
]
}

View 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
}
}

View 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"
}
]
}

File diff suppressed because it is too large Load Diff

View 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
}
]
}

View 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"
]
}
]
}

File diff suppressed because it is too large Load Diff

View 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"
}
]
}

View 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"
}
]
}

View 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"
}
]
}

View 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"
}
]
}

View 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"
}

View 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"
}

View 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()

View 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()

View 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()

View 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
}
]
}

View 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
}

View 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"]
}
}
]
}

View 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
}

View 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
}

View 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
}

View 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
}

View File

@@ -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
}

View 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"]
}
}
]
}

View 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
}

View 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
}

View 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
}

View 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
}

View 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
}