183 lines
8.6 KiB
Python
183 lines
8.6 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
Script to add sample recipes for testing
|
||
|
|
"""
|
||
|
|
import asyncio
|
||
|
|
import os
|
||
|
|
import sys
|
||
|
|
from datetime import datetime
|
||
|
|
from decimal import Decimal
|
||
|
|
|
||
|
|
# Add the app directory to Python path
|
||
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), 'app'))
|
||
|
|
|
||
|
|
from core.database import get_db_session
|
||
|
|
from repositories.recipe_repository import RecipeRepository
|
||
|
|
from schemas.recipes import RecipeCreate, RecipeIngredientCreate
|
||
|
|
|
||
|
|
# Sample tenant ID - you should replace this with a real tenant ID from your system
|
||
|
|
SAMPLE_TENANT_ID = "946206b3-7446-436b-b29d-f265b28d9ff5"
|
||
|
|
|
||
|
|
# Sample finished product IDs - you should replace these with real product IDs from your system
|
||
|
|
SAMPLE_PRODUCT_IDS = [
|
||
|
|
"550e8400-e29b-41d4-a716-446655440001", # Pan Integral
|
||
|
|
"550e8400-e29b-41d4-a716-446655440002", # Croissant
|
||
|
|
"550e8400-e29b-41d4-a716-446655440003", # Tarta de Manzana
|
||
|
|
"550e8400-e29b-41d4-a716-446655440004", # Magdalenas
|
||
|
|
]
|
||
|
|
|
||
|
|
# Sample ingredient IDs - you should replace these with real ingredient IDs from your system
|
||
|
|
SAMPLE_INGREDIENT_IDS = [
|
||
|
|
"660e8400-e29b-41d4-a716-446655440001", # Harina integral
|
||
|
|
"660e8400-e29b-41d4-a716-446655440002", # Agua
|
||
|
|
"660e8400-e29b-41d4-a716-446655440003", # Levadura
|
||
|
|
"660e8400-e29b-41d4-a716-446655440004", # Sal
|
||
|
|
"660e8400-e29b-41d4-a716-446655440005", # Harina de fuerza
|
||
|
|
"660e8400-e29b-41d4-a716-446655440006", # Mantequilla
|
||
|
|
"660e8400-e29b-41d4-a716-446655440007", # Leche
|
||
|
|
"660e8400-e29b-41d4-a716-446655440008", # Azúcar
|
||
|
|
"660e8400-e29b-41d4-a716-446655440009", # Manzanas
|
||
|
|
"660e8400-e29b-41d4-a716-446655440010", # Huevos
|
||
|
|
"660e8400-e29b-41d4-a716-446655440011", # Limón
|
||
|
|
"660e8400-e29b-41d4-a716-446655440012", # Canela
|
||
|
|
]
|
||
|
|
|
||
|
|
async def add_sample_recipes():
|
||
|
|
"""Add sample recipes to the database"""
|
||
|
|
async with get_db_session() as session:
|
||
|
|
recipe_repo = RecipeRepository(session)
|
||
|
|
|
||
|
|
sample_recipes = [
|
||
|
|
{
|
||
|
|
"name": "Pan de Molde Integral",
|
||
|
|
"recipe_code": "PAN001",
|
||
|
|
"finished_product_id": SAMPLE_PRODUCT_IDS[0],
|
||
|
|
"description": "Pan integral artesanal con semillas, perfecto para desayunos saludables.",
|
||
|
|
"category": "bread",
|
||
|
|
"difficulty_level": 2,
|
||
|
|
"yield_quantity": 1,
|
||
|
|
"yield_unit": "units",
|
||
|
|
"prep_time_minutes": 120,
|
||
|
|
"cook_time_minutes": 35,
|
||
|
|
"total_time_minutes": 155,
|
||
|
|
"is_signature_item": False,
|
||
|
|
"target_margin_percentage": Decimal("40.0"),
|
||
|
|
"ingredients": [
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[0], "quantity": 500, "unit": "g", "is_optional": False, "ingredient_order": 1},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[1], "quantity": 300, "unit": "ml", "is_optional": False, "ingredient_order": 2},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[2], "quantity": 10, "unit": "g", "is_optional": False, "ingredient_order": 3},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[3], "quantity": 8, "unit": "g", "is_optional": False, "ingredient_order": 4},
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "Croissants de Mantequilla",
|
||
|
|
"recipe_code": "CRO001",
|
||
|
|
"finished_product_id": SAMPLE_PRODUCT_IDS[1],
|
||
|
|
"description": "Croissants franceses tradicionales con laminado de mantequilla.",
|
||
|
|
"category": "pastry",
|
||
|
|
"difficulty_level": 3,
|
||
|
|
"yield_quantity": 12,
|
||
|
|
"yield_unit": "units",
|
||
|
|
"prep_time_minutes": 480,
|
||
|
|
"cook_time_minutes": 20,
|
||
|
|
"total_time_minutes": 500,
|
||
|
|
"is_signature_item": True,
|
||
|
|
"target_margin_percentage": Decimal("52.8"),
|
||
|
|
"ingredients": [
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[4], "quantity": 500, "unit": "g", "is_optional": False, "ingredient_order": 1},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[5], "quantity": 250, "unit": "g", "is_optional": False, "ingredient_order": 2},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[6], "quantity": 150, "unit": "ml", "is_optional": False, "ingredient_order": 3},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[7], "quantity": 50, "unit": "g", "is_optional": False, "ingredient_order": 4},
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "Tarta de Manzana",
|
||
|
|
"recipe_code": "TAR001",
|
||
|
|
"finished_product_id": SAMPLE_PRODUCT_IDS[2],
|
||
|
|
"description": "Tarta casera de manzana con canela y masa quebrada.",
|
||
|
|
"category": "cake",
|
||
|
|
"difficulty_level": 1,
|
||
|
|
"yield_quantity": 8,
|
||
|
|
"yield_unit": "portions",
|
||
|
|
"prep_time_minutes": 45,
|
||
|
|
"cook_time_minutes": 40,
|
||
|
|
"total_time_minutes": 85,
|
||
|
|
"is_signature_item": False,
|
||
|
|
"target_margin_percentage": Decimal("65.0"),
|
||
|
|
"ingredients": [
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[8], "quantity": 1000, "unit": "g", "is_optional": False, "ingredient_order": 1},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[0], "quantity": 250, "unit": "g", "is_optional": False, "ingredient_order": 2},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[5], "quantity": 125, "unit": "g", "is_optional": False, "ingredient_order": 3},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[7], "quantity": 100, "unit": "g", "is_optional": False, "ingredient_order": 4},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[11], "quantity": 5, "unit": "g", "is_optional": True, "ingredient_order": 5},
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "Magdalenas de Limón",
|
||
|
|
"recipe_code": "MAG001",
|
||
|
|
"finished_product_id": SAMPLE_PRODUCT_IDS[3],
|
||
|
|
"description": "Magdalenas suaves y esponjosas con ralladura de limón.",
|
||
|
|
"category": "pastry",
|
||
|
|
"difficulty_level": 1,
|
||
|
|
"yield_quantity": 12,
|
||
|
|
"yield_unit": "units",
|
||
|
|
"prep_time_minutes": 20,
|
||
|
|
"cook_time_minutes": 25,
|
||
|
|
"total_time_minutes": 45,
|
||
|
|
"is_signature_item": False,
|
||
|
|
"target_margin_percentage": Decimal("57.8"),
|
||
|
|
"ingredients": [
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[0], "quantity": 200, "unit": "g", "is_optional": False, "ingredient_order": 1},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[9], "quantity": 3, "unit": "units", "is_optional": False, "ingredient_order": 2},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[7], "quantity": 150, "unit": "g", "is_optional": False, "ingredient_order": 3},
|
||
|
|
{"ingredient_id": SAMPLE_INGREDIENT_IDS[10], "quantity": 2, "unit": "units", "is_optional": False, "ingredient_order": 4},
|
||
|
|
]
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
for recipe_data in sample_recipes:
|
||
|
|
try:
|
||
|
|
# Prepare ingredients
|
||
|
|
ingredients = [
|
||
|
|
RecipeIngredientCreate(**ing_data)
|
||
|
|
for ing_data in recipe_data.pop("ingredients")
|
||
|
|
]
|
||
|
|
|
||
|
|
# Create recipe
|
||
|
|
recipe_create = RecipeCreate(
|
||
|
|
**recipe_data,
|
||
|
|
ingredients=ingredients
|
||
|
|
)
|
||
|
|
|
||
|
|
# Check if recipe already exists
|
||
|
|
existing_recipes = await recipe_repo.search_recipes(
|
||
|
|
tenant_id=SAMPLE_TENANT_ID,
|
||
|
|
search_term=recipe_data["name"]
|
||
|
|
)
|
||
|
|
|
||
|
|
recipe_exists = any(
|
||
|
|
recipe.name == recipe_data["name"]
|
||
|
|
for recipe in existing_recipes
|
||
|
|
)
|
||
|
|
|
||
|
|
if not recipe_exists:
|
||
|
|
recipe = await recipe_repo.create_recipe(
|
||
|
|
tenant_id=SAMPLE_TENANT_ID,
|
||
|
|
recipe_data=recipe_create
|
||
|
|
)
|
||
|
|
print(f"✅ Created recipe: {recipe.name}")
|
||
|
|
else:
|
||
|
|
print(f"⏭️ Recipe already exists: {recipe_data['name']}")
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print(f"❌ Error creating recipe {recipe_data['name']}: {e}")
|
||
|
|
|
||
|
|
await session.commit()
|
||
|
|
print(f"\n🎉 Sample recipes setup completed!")
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print("🧁 Adding sample recipes to database...")
|
||
|
|
print(f"📍 Tenant ID: {SAMPLE_TENANT_ID}")
|
||
|
|
print("=" * 50)
|
||
|
|
|
||
|
|
asyncio.run(add_sample_recipes())
|