Improve the production frontend 3
This commit is contained in:
@@ -1,142 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Add real recipes using actual inventory data
|
|
||||||
TENANT_ID="c464fb3e-7af2-46e6-9e43-85318f34199a"
|
|
||||||
USER_ID="550e8400-e29b-41d4-a716-446655440000" # User UUID format
|
|
||||||
API_BASE="http://localhost:8009"
|
|
||||||
|
|
||||||
echo "🧁 Adding real recipes with actual inventory data..."
|
|
||||||
echo "📍 Tenant ID: $TENANT_ID"
|
|
||||||
echo "🌐 API Base: $API_BASE"
|
|
||||||
echo "=" | tr -d '\n' && printf '%.0s=' {1..50} && echo
|
|
||||||
|
|
||||||
# Real finished product IDs from inventory
|
|
||||||
CROISSANT_ID="c9a049b7-d1ae-4bf5-99cc-ed2c46f0a509"
|
|
||||||
NAPOLITANA_ID="72c1020f-64be-4b42-8857-e774908204d9"
|
|
||||||
PALMERA_ID="9e888a05-9dda-488b-a06c-0c60a4479e67"
|
|
||||||
PAN_TOSTADO_ID="368fba0e-8ec5-4048-a2f1-79b63f9e11cf"
|
|
||||||
|
|
||||||
# Real ingredient IDs from inventory
|
|
||||||
HARINA_TRIGO_ID="1e1d496f-c041-4f42-82a9-2ae7837c9231" # Harina de Trigo
|
|
||||||
LEVADURA_ID="de2f0852-75f5-4b18-8f0e-7c707f79a9f9" # Levadura Fresca
|
|
||||||
MANTEQUILLA_ID="89e6224a-a055-4148-a2f1-86a5091becec" # Mantequilla
|
|
||||||
|
|
||||||
# Recipe 1: Croissant de Mantequilla
|
|
||||||
echo "Creating Recipe 1: Croissant de Mantequilla..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-H "x-user-id: $USER_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Croissant de Mantequilla",
|
|
||||||
"recipe_code": "CRO001",
|
|
||||||
"finished_product_id": "'$CROISSANT_ID'",
|
|
||||||
"description": "Croissant clásico francés con mantequilla, hojaldrado perfecto y textura crujiente",
|
|
||||||
"category": "pastry",
|
|
||||||
"difficulty_level": 3,
|
|
||||||
"yield_quantity": 12,
|
|
||||||
"yield_unit": "units",
|
|
||||||
"prep_time_minutes": 240,
|
|
||||||
"cook_time_minutes": 18,
|
|
||||||
"total_time_minutes": 258,
|
|
||||||
"is_signature_item": true,
|
|
||||||
"target_margin_percentage": 65.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$HARINA_TRIGO_ID'", "quantity": 500, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$MANTEQUILLA_ID'", "quantity": 300, "unit": "g", "is_optional": false, "ingredient_order": 2},
|
|
||||||
{"ingredient_id": "'$LEVADURA_ID'", "quantity": 12, "unit": "g", "is_optional": false, "ingredient_order": 3}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 2: Napolitana de Chocolate
|
|
||||||
echo "Creating Recipe 2: Napolitana de Chocolate..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-H "x-user-id: $USER_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Napolitana de Chocolate",
|
|
||||||
"recipe_code": "NAP001",
|
|
||||||
"finished_product_id": "'$NAPOLITANA_ID'",
|
|
||||||
"description": "Hojaldre relleno de chocolate, dulce y crujiente, perfecto para merienda",
|
|
||||||
"category": "pastry",
|
|
||||||
"difficulty_level": 2,
|
|
||||||
"yield_quantity": 8,
|
|
||||||
"yield_unit": "units",
|
|
||||||
"prep_time_minutes": 45,
|
|
||||||
"cook_time_minutes": 20,
|
|
||||||
"total_time_minutes": 65,
|
|
||||||
"is_signature_item": false,
|
|
||||||
"target_margin_percentage": 70.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$HARINA_TRIGO_ID'", "quantity": 300, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$MANTEQUILLA_ID'", "quantity": 200, "unit": "g", "is_optional": false, "ingredient_order": 2}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 3: Palmera de Azúcar
|
|
||||||
echo "Creating Recipe 3: Palmera de Azúcar..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-H "x-user-id: $USER_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Palmera de Azúcar",
|
|
||||||
"recipe_code": "PAL001",
|
|
||||||
"finished_product_id": "'$PALMERA_ID'",
|
|
||||||
"description": "Palmera de hojaldre con azúcar caramelizado, dulce y crujiente",
|
|
||||||
"category": "pastry",
|
|
||||||
"difficulty_level": 2,
|
|
||||||
"yield_quantity": 10,
|
|
||||||
"yield_unit": "units",
|
|
||||||
"prep_time_minutes": 30,
|
|
||||||
"cook_time_minutes": 15,
|
|
||||||
"total_time_minutes": 45,
|
|
||||||
"is_signature_item": false,
|
|
||||||
"target_margin_percentage": 75.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$HARINA_TRIGO_ID'", "quantity": 400, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$MANTEQUILLA_ID'", "quantity": 150, "unit": "g", "is_optional": false, "ingredient_order": 2}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 4: Pan Tostado Artesanal
|
|
||||||
echo "Creating Recipe 4: Pan Tostado Artesanal..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-H "x-user-id: $USER_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Pan Tostado Artesanal",
|
|
||||||
"recipe_code": "PAN001",
|
|
||||||
"finished_product_id": "'$PAN_TOSTADO_ID'",
|
|
||||||
"description": "Pan artesanal con corteza crujiente y miga tierna, perfecto para tostadas",
|
|
||||||
"category": "bread",
|
|
||||||
"difficulty_level": 2,
|
|
||||||
"yield_quantity": 2,
|
|
||||||
"yield_unit": "units",
|
|
||||||
"prep_time_minutes": 180,
|
|
||||||
"cook_time_minutes": 35,
|
|
||||||
"total_time_minutes": 215,
|
|
||||||
"is_signature_item": true,
|
|
||||||
"target_margin_percentage": 60.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$HARINA_TRIGO_ID'", "quantity": 600, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$LEVADURA_ID'", "quantity": 15, "unit": "g", "is_optional": false, "ingredient_order": 2}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n🎉 Real recipes creation completed!"
|
|
||||||
echo "✅ Created recipes for existing products:"
|
|
||||||
echo " • Croissant de Mantequilla"
|
|
||||||
echo " • Napolitana de Chocolate"
|
|
||||||
echo " • Palmera de Azúcar"
|
|
||||||
echo " • Pan Tostado Artesanal"
|
|
||||||
echo ""
|
|
||||||
echo "🔗 All recipes are linked to real products and ingredients from inventory!"
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Add sample recipes using the API
|
|
||||||
TENANT_ID="c464fb3e-7af2-46e6-9e43-85318f34199a"
|
|
||||||
API_BASE="http://localhost:8009"
|
|
||||||
|
|
||||||
echo "🧁 Adding sample recipes via API..."
|
|
||||||
echo "📍 Tenant ID: $TENANT_ID"
|
|
||||||
echo "🌐 API Base: $API_BASE"
|
|
||||||
echo "=" | tr -d '\n' && printf '%.0s=' {1..50} && echo
|
|
||||||
|
|
||||||
# Sample finished product IDs (these should exist in your system)
|
|
||||||
PRODUCT_ID_1="550e8400-e29b-41d4-a716-446655440001"
|
|
||||||
PRODUCT_ID_2="550e8400-e29b-41d4-a716-446655440002"
|
|
||||||
PRODUCT_ID_3="550e8400-e29b-41d4-a716-446655440003"
|
|
||||||
PRODUCT_ID_4="550e8400-e29b-41d4-a716-446655440004"
|
|
||||||
|
|
||||||
# Sample ingredient IDs (these should exist in your system)
|
|
||||||
ING_ID_1="660e8400-e29b-41d4-a716-446655440001" # Harina integral
|
|
||||||
ING_ID_2="660e8400-e29b-41d4-a716-446655440002" # Agua
|
|
||||||
ING_ID_3="660e8400-e29b-41d4-a716-446655440003" # Levadura
|
|
||||||
ING_ID_4="660e8400-e29b-41d4-a716-446655440004" # Sal
|
|
||||||
ING_ID_5="660e8400-e29b-41d4-a716-446655440005" # Harina de fuerza
|
|
||||||
ING_ID_6="660e8400-e29b-41d4-a716-446655440006" # Mantequilla
|
|
||||||
ING_ID_7="660e8400-e29b-41d4-a716-446655440007" # Leche
|
|
||||||
ING_ID_8="660e8400-e29b-41d4-a716-446655440008" # Azúcar
|
|
||||||
ING_ID_9="660e8400-e29b-41d4-a716-446655440009" # Manzanas
|
|
||||||
ING_ID_10="660e8400-e29b-41d4-a716-446655440010" # Huevos
|
|
||||||
ING_ID_11="660e8400-e29b-41d4-a716-446655440011" # Limón
|
|
||||||
|
|
||||||
# Recipe 1: Pan de Molde Integral
|
|
||||||
echo "Creating Recipe 1: Pan de Molde Integral..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Pan de Molde Integral",
|
|
||||||
"recipe_code": "PAN001",
|
|
||||||
"finished_product_id": "'$PRODUCT_ID_1'",
|
|
||||||
"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": 40.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$ING_ID_1'", "quantity": 500, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$ING_ID_2'", "quantity": 300, "unit": "ml", "is_optional": false, "ingredient_order": 2},
|
|
||||||
{"ingredient_id": "'$ING_ID_3'", "quantity": 10, "unit": "g", "is_optional": false, "ingredient_order": 3},
|
|
||||||
{"ingredient_id": "'$ING_ID_4'", "quantity": 8, "unit": "g", "is_optional": false, "ingredient_order": 4}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 2: Croissants de Mantequilla
|
|
||||||
echo "Creating Recipe 2: Croissants de Mantequilla..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Croissants de Mantequilla",
|
|
||||||
"recipe_code": "CRO001",
|
|
||||||
"finished_product_id": "'$PRODUCT_ID_2'",
|
|
||||||
"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": 52.8,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$ING_ID_5'", "quantity": 500, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$ING_ID_6'", "quantity": 250, "unit": "g", "is_optional": false, "ingredient_order": 2},
|
|
||||||
{"ingredient_id": "'$ING_ID_7'", "quantity": 150, "unit": "ml", "is_optional": false, "ingredient_order": 3},
|
|
||||||
{"ingredient_id": "'$ING_ID_8'", "quantity": 50, "unit": "g", "is_optional": false, "ingredient_order": 4}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 3: Tarta de Manzana
|
|
||||||
echo "Creating Recipe 3: Tarta de Manzana..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Tarta de Manzana",
|
|
||||||
"recipe_code": "TAR001",
|
|
||||||
"finished_product_id": "'$PRODUCT_ID_3'",
|
|
||||||
"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": 65.0,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$ING_ID_9'", "quantity": 1000, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$ING_ID_1'", "quantity": 250, "unit": "g", "is_optional": false, "ingredient_order": 2},
|
|
||||||
{"ingredient_id": "'$ING_ID_6'", "quantity": 125, "unit": "g", "is_optional": false, "ingredient_order": 3},
|
|
||||||
{"ingredient_id": "'$ING_ID_8'", "quantity": 100, "unit": "g", "is_optional": false, "ingredient_order": 4}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n"
|
|
||||||
|
|
||||||
# Recipe 4: Magdalenas de Limón
|
|
||||||
echo "Creating Recipe 4: Magdalenas de Limón..."
|
|
||||||
curl -X POST "$API_BASE/api/v1/recipes/" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "x-tenant-id: $TENANT_ID" \
|
|
||||||
-d '{
|
|
||||||
"name": "Magdalenas de Limón",
|
|
||||||
"recipe_code": "MAG001",
|
|
||||||
"finished_product_id": "'$PRODUCT_ID_4'",
|
|
||||||
"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": 57.8,
|
|
||||||
"ingredients": [
|
|
||||||
{"ingredient_id": "'$ING_ID_1'", "quantity": 200, "unit": "g", "is_optional": false, "ingredient_order": 1},
|
|
||||||
{"ingredient_id": "'$ING_ID_10'", "quantity": 3, "unit": "units", "is_optional": false, "ingredient_order": 2},
|
|
||||||
{"ingredient_id": "'$ING_ID_8'", "quantity": 150, "unit": "g", "is_optional": false, "ingredient_order": 3},
|
|
||||||
{"ingredient_id": "'$ING_ID_11'", "quantity": 2, "unit": "units", "is_optional": false, "ingredient_order": 4}
|
|
||||||
]
|
|
||||||
}'
|
|
||||||
|
|
||||||
echo -e "\n\n🎉 Sample recipes creation completed!"
|
|
||||||
@@ -145,6 +145,12 @@
|
|||||||
"cashier": "Cajero",
|
"cashier": "Cajero",
|
||||||
"assistant": "Asistente"
|
"assistant": "Asistente"
|
||||||
},
|
},
|
||||||
|
"global_roles": {
|
||||||
|
"user": "Usuario",
|
||||||
|
"admin": "Administrador",
|
||||||
|
"manager": "Gestor",
|
||||||
|
"super_admin": "Super Administrador"
|
||||||
|
},
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"read": "Lectura",
|
"read": "Lectura",
|
||||||
"write": "Escritura",
|
"write": "Escritura",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { useCurrentTenant } from '../../../../stores';
|
|||||||
import { useToast } from '../../../../hooks/ui/useToast';
|
import { useToast } from '../../../../hooks/ui/useToast';
|
||||||
import { useAuthProfile, useUpdateProfile, useChangePassword } from '../../../../api/hooks/auth';
|
import { useAuthProfile, useUpdateProfile, useChangePassword } from '../../../../api/hooks/auth';
|
||||||
import { subscriptionService, type UsageSummary, type AvailablePlans } from '../../../../api';
|
import { subscriptionService, type UsageSummary, type AvailablePlans } from '../../../../api';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
interface ProfileFormData {
|
interface ProfileFormData {
|
||||||
first_name: string;
|
first_name: string;
|
||||||
@@ -78,6 +79,7 @@ interface NotificationPreferences {
|
|||||||
|
|
||||||
const ProfilePage: React.FC = () => {
|
const ProfilePage: React.FC = () => {
|
||||||
const user = useAuthUser();
|
const user = useAuthUser();
|
||||||
|
const { t } = useTranslation('auth');
|
||||||
const { addToast } = useToast();
|
const { addToast } = useToast();
|
||||||
|
|
||||||
const { data: profile, isLoading: profileLoading, error: profileError } = useAuthProfile();
|
const { data: profile, isLoading: profileLoading, error: profileError } = useAuthProfile();
|
||||||
@@ -596,6 +598,11 @@ const ProfilePage: React.FC = () => {
|
|||||||
{profileData.first_name} {profileData.last_name}
|
{profileData.first_name} {profileData.last_name}
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-text-secondary">{profileData.email}</p>
|
<p className="text-text-secondary">{profileData.email}</p>
|
||||||
|
{user?.role && (
|
||||||
|
<p className="text-sm text-text-tertiary mt-1">
|
||||||
|
{t(`global_roles.${user.role}`)}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
<div className="flex items-center gap-2 mt-2">
|
<div className="flex items-center gap-2 mt-2">
|
||||||
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
|
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
|
||||||
<span className="text-sm text-text-tertiary">En línea</span>
|
<span className="text-sm text-text-tertiary">En línea</span>
|
||||||
|
|||||||
@@ -1,302 +0,0 @@
|
|||||||
-- Insert real recipes using actual inventory data
|
|
||||||
-- Tenant ID: c464fb3e-7af2-46e6-9e43-85318f34199a
|
|
||||||
-- User email for created_by: fsdfsdfs@sdfsdf.com
|
|
||||||
|
|
||||||
-- Real finished product IDs from inventory:
|
|
||||||
-- Croissant: c9a049b7-d1ae-4bf5-99cc-ed2c46f0a509
|
|
||||||
-- Napolitana: 72c1020f-64be-4b42-8857-e774908204d9
|
|
||||||
-- Palmera: 9e888a05-9dda-488b-a06c-0c60a4479e67
|
|
||||||
-- Pan Tostado: 368fba0e-8ec5-4048-a2f1-79b63f9e11cf
|
|
||||||
|
|
||||||
-- Real ingredient IDs from inventory:
|
|
||||||
-- Harina de Trigo: 1e1d496f-c041-4f42-82a9-2ae7837c9231
|
|
||||||
-- Levadura Fresca: de2f0852-75f5-4b18-8f0e-7c707f79a9f9
|
|
||||||
-- Mantequilla: 89e6224a-a055-4148-a2f1-86a5091becec
|
|
||||||
|
|
||||||
BEGIN;
|
|
||||||
|
|
||||||
-- Recipe 1: Croissant de Mantequilla
|
|
||||||
INSERT INTO recipes (
|
|
||||||
id, tenant_id, name, recipe_code, version, finished_product_id,
|
|
||||||
description, category, difficulty_level, yield_quantity, yield_unit,
|
|
||||||
prep_time_minutes, cook_time_minutes, total_time_minutes,
|
|
||||||
estimated_cost_per_unit, target_margin_percentage, suggested_selling_price,
|
|
||||||
batch_size_multiplier, status, is_signature_item, is_seasonal,
|
|
||||||
created_at, updated_at, created_by
|
|
||||||
) VALUES (
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
'Croissant de Mantequilla',
|
|
||||||
'CRO001',
|
|
||||||
'1.0',
|
|
||||||
'c9a049b7-d1ae-4bf5-99cc-ed2c46f0a509',
|
|
||||||
'Croissant clásico francés con mantequilla, hojaldrado perfecto y textura crujiente',
|
|
||||||
'pastry',
|
|
||||||
3,
|
|
||||||
12,
|
|
||||||
'UNITS',
|
|
||||||
240,
|
|
||||||
18,
|
|
||||||
258,
|
|
||||||
1.25,
|
|
||||||
65.0,
|
|
||||||
3.38,
|
|
||||||
1.0,
|
|
||||||
'ACTIVE',
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
NOW(),
|
|
||||||
NOW(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Get the recipe ID for ingredients
|
|
||||||
INSERT INTO recipe_ingredients (
|
|
||||||
id, tenant_id, recipe_id, ingredient_id, quantity, unit,
|
|
||||||
is_optional, ingredient_order
|
|
||||||
) VALUES
|
|
||||||
-- Harina de Trigo
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'CRO001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'1e1d496f-c041-4f42-82a9-2ae7837c9231',
|
|
||||||
0.5,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
1
|
|
||||||
),
|
|
||||||
-- Mantequilla
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'CRO001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'89e6224a-a055-4148-a2f1-86a5091becec',
|
|
||||||
0.3,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
2
|
|
||||||
),
|
|
||||||
-- Levadura Fresca
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'CRO001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'de2f0852-75f5-4b18-8f0e-7c707f79a9f9',
|
|
||||||
0.012,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
3
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Recipe 2: Napolitana de Chocolate
|
|
||||||
INSERT INTO recipes (
|
|
||||||
id, tenant_id, name, recipe_code, version, finished_product_id,
|
|
||||||
description, category, difficulty_level, yield_quantity, yield_unit,
|
|
||||||
prep_time_minutes, cook_time_minutes, total_time_minutes,
|
|
||||||
estimated_cost_per_unit, target_margin_percentage, suggested_selling_price,
|
|
||||||
batch_size_multiplier, status, is_signature_item, is_seasonal,
|
|
||||||
created_at, updated_at, created_by
|
|
||||||
) VALUES (
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
'Napolitana de Chocolate',
|
|
||||||
'NAP001',
|
|
||||||
'1.0',
|
|
||||||
'72c1020f-64be-4b42-8857-e774908204d9',
|
|
||||||
'Hojaldre relleno de chocolate, dulce y crujiente, perfecto para merienda',
|
|
||||||
'pastry',
|
|
||||||
2,
|
|
||||||
8,
|
|
||||||
'UNITS',
|
|
||||||
45,
|
|
||||||
20,
|
|
||||||
65,
|
|
||||||
2.00,
|
|
||||||
70.0,
|
|
||||||
6.67,
|
|
||||||
1.0,
|
|
||||||
'ACTIVE',
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
NOW(),
|
|
||||||
NOW(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Ingredients for Napolitana
|
|
||||||
INSERT INTO recipe_ingredients (
|
|
||||||
id, tenant_id, recipe_id, ingredient_id, quantity, unit,
|
|
||||||
is_optional, ingredient_order
|
|
||||||
) VALUES
|
|
||||||
-- Harina de Trigo
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'NAP001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'1e1d496f-c041-4f42-82a9-2ae7837c9231',
|
|
||||||
0.3,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
1
|
|
||||||
),
|
|
||||||
-- Mantequilla
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'NAP001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'89e6224a-a055-4148-a2f1-86a5091becec',
|
|
||||||
0.2,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Recipe 3: Palmera de Azúcar
|
|
||||||
INSERT INTO recipes (
|
|
||||||
id, tenant_id, name, recipe_code, version, finished_product_id,
|
|
||||||
description, category, difficulty_level, yield_quantity, yield_unit,
|
|
||||||
prep_time_minutes, cook_time_minutes, total_time_minutes,
|
|
||||||
estimated_cost_per_unit, target_margin_percentage, suggested_selling_price,
|
|
||||||
batch_size_multiplier, status, is_signature_item, is_seasonal,
|
|
||||||
created_at, updated_at, created_by
|
|
||||||
) VALUES (
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
'Palmera de Azúcar',
|
|
||||||
'PAL001',
|
|
||||||
'1.0',
|
|
||||||
'9e888a05-9dda-488b-a06c-0c60a4479e67',
|
|
||||||
'Palmera de hojaldre con azúcar caramelizado, dulce y crujiente',
|
|
||||||
'pastry',
|
|
||||||
2,
|
|
||||||
10,
|
|
||||||
'UNITS',
|
|
||||||
30,
|
|
||||||
15,
|
|
||||||
45,
|
|
||||||
1.80,
|
|
||||||
75.0,
|
|
||||||
7.20,
|
|
||||||
1.0,
|
|
||||||
'ACTIVE',
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
NOW(),
|
|
||||||
NOW(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Ingredients for Palmera
|
|
||||||
INSERT INTO recipe_ingredients (
|
|
||||||
id, tenant_id, recipe_id, ingredient_id, quantity, unit,
|
|
||||||
is_optional, ingredient_order
|
|
||||||
) VALUES
|
|
||||||
-- Harina de Trigo
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'PAL001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'1e1d496f-c041-4f42-82a9-2ae7837c9231',
|
|
||||||
0.4,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
1
|
|
||||||
),
|
|
||||||
-- Mantequilla
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'PAL001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'89e6224a-a055-4148-a2f1-86a5091becec',
|
|
||||||
0.15,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Recipe 4: Pan Tostado Artesanal
|
|
||||||
INSERT INTO recipes (
|
|
||||||
id, tenant_id, name, recipe_code, version, finished_product_id,
|
|
||||||
description, category, difficulty_level, yield_quantity, yield_unit,
|
|
||||||
prep_time_minutes, cook_time_minutes, total_time_minutes,
|
|
||||||
estimated_cost_per_unit, target_margin_percentage, suggested_selling_price,
|
|
||||||
batch_size_multiplier, status, is_signature_item, is_seasonal,
|
|
||||||
created_at, updated_at, created_by
|
|
||||||
) VALUES (
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
'Pan Tostado Artesanal',
|
|
||||||
'PAN001',
|
|
||||||
'1.0',
|
|
||||||
'368fba0e-8ec5-4048-a2f1-79b63f9e11cf',
|
|
||||||
'Pan artesanal con corteza crujiente y miga tierna, perfecto para tostadas',
|
|
||||||
'bread',
|
|
||||||
2,
|
|
||||||
2,
|
|
||||||
'UNITS',
|
|
||||||
180,
|
|
||||||
35,
|
|
||||||
215,
|
|
||||||
3.50,
|
|
||||||
60.0,
|
|
||||||
9.33,
|
|
||||||
1.0,
|
|
||||||
'ACTIVE',
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
NOW(),
|
|
||||||
NOW(),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- Ingredients for Pan Tostado
|
|
||||||
INSERT INTO recipe_ingredients (
|
|
||||||
id, tenant_id, recipe_id, ingredient_id, quantity, unit,
|
|
||||||
is_optional, ingredient_order
|
|
||||||
) VALUES
|
|
||||||
-- Harina de Trigo
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'PAN001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'1e1d496f-c041-4f42-82a9-2ae7837c9231',
|
|
||||||
0.6,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
1
|
|
||||||
),
|
|
||||||
-- Levadura Fresca
|
|
||||||
(
|
|
||||||
gen_random_uuid(),
|
|
||||||
'c464fb3e-7af2-46e6-9e43-85318f34199a',
|
|
||||||
(SELECT id FROM recipes WHERE recipe_code = 'PAN001' AND tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'),
|
|
||||||
'de2f0852-75f5-4b18-8f0e-7c707f79a9f9',
|
|
||||||
0.015,
|
|
||||||
'KILOGRAMS',
|
|
||||||
false,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
COMMIT;
|
|
||||||
|
|
||||||
-- Verify the data was inserted
|
|
||||||
SELECT
|
|
||||||
r.name,
|
|
||||||
r.recipe_code,
|
|
||||||
r.category,
|
|
||||||
r.difficulty_level,
|
|
||||||
r.yield_quantity,
|
|
||||||
r.yield_unit,
|
|
||||||
r.total_time_minutes,
|
|
||||||
r.estimated_cost_per_unit,
|
|
||||||
r.suggested_selling_price,
|
|
||||||
r.is_signature_item,
|
|
||||||
COUNT(ri.id) as ingredient_count
|
|
||||||
FROM recipes r
|
|
||||||
LEFT JOIN recipe_ingredients ri ON r.id = ri.recipe_id
|
|
||||||
WHERE r.tenant_id = 'c464fb3e-7af2-46e6-9e43-85318f34199a'
|
|
||||||
GROUP BY r.id, r.name, r.recipe_code, r.category, r.difficulty_level,
|
|
||||||
r.yield_quantity, r.yield_unit, r.total_time_minutes,
|
|
||||||
r.estimated_cost_per_unit, r.suggested_selling_price, r.is_signature_item
|
|
||||||
ORDER BY r.created_at DESC;
|
|
||||||
@@ -235,7 +235,6 @@ async def get_nearby_tenants_enhanced(
|
|||||||
return tenants
|
return tenants
|
||||||
|
|
||||||
@router.put("/tenants/{tenant_id}", response_model=TenantResponse)
|
@router.put("/tenants/{tenant_id}", response_model=TenantResponse)
|
||||||
@track_endpoint_metrics("tenant_update")
|
|
||||||
async def update_tenant_enhanced(
|
async def update_tenant_enhanced(
|
||||||
update_data: TenantUpdate,
|
update_data: TenantUpdate,
|
||||||
tenant_id: UUID = Path(..., description="Tenant ID"),
|
tenant_id: UUID = Path(..., description="Tenant ID"),
|
||||||
|
|||||||
Reference in New Issue
Block a user