246 lines
8.2 KiB
Python
246 lines
8.2 KiB
Python
"""
|
|
Script per creare un ordine mock con 4 ingredienti per testare la UI.
|
|
Inserisce direttamente nei database senza passare dalla pipeline (no scraping).
|
|
|
|
Uso: uv run python scripts/create_mock_order.py
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
|
|
# Aggiungi il path del progetto
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
|
|
|
from pif_compiler.functions.db_utils import (
|
|
db_connect, upsert_cliente, insert_ordine, aggiorna_stato_ordine,
|
|
update_ordine_cliente, upsert_ingrediente
|
|
)
|
|
from pif_compiler.classes.models import (
|
|
StatoOrdine, Ingredient, DapInfo, CosingInfo, ToxIndicator, Toxicity, Esposition
|
|
)
|
|
from pif_compiler.classes.main_workflow import Project, ProjectIngredient
|
|
|
|
|
|
def ensure_preset_exists(preset_name="Test Preset"):
|
|
"""Verifica che il preset esista, altrimenti lo crea."""
|
|
preset = Esposition.get_by_name(preset_name)
|
|
if preset:
|
|
print(f"Preset '{preset_name}' già esistente")
|
|
return preset
|
|
|
|
print(f"Creazione preset '{preset_name}'...")
|
|
preset = Esposition(
|
|
preset_name=preset_name,
|
|
tipo_prodotto="Crema corpo",
|
|
luogo_applicazione="Corpo",
|
|
esp_normali=["Dermal"],
|
|
esp_secondarie=["Oral"],
|
|
esp_nano=[],
|
|
sup_esposta=15670,
|
|
freq_applicazione=1,
|
|
qta_giornaliera=7.82,
|
|
ritenzione=1.0
|
|
)
|
|
result = preset.save_to_postgres()
|
|
if result:
|
|
print(f"Preset creato con id_preset={result}")
|
|
else:
|
|
print("ERRORE: impossibile creare il preset")
|
|
sys.exit(1)
|
|
return preset
|
|
|
|
|
|
def create_mock_ingredients():
|
|
"""Crea ingredienti mock con dati finti di tossicologia e DAP."""
|
|
|
|
# GLYCERIN (56-81-5) — con NOAEL
|
|
glycerin = Ingredient(
|
|
cas="56-81-5",
|
|
inci=["GLYCERIN"],
|
|
dap_info=DapInfo(
|
|
cas="56-81-5",
|
|
molecular_weight=92.09,
|
|
log_pow=-1.76,
|
|
tpsa=60.69,
|
|
melting_point=18.0
|
|
),
|
|
cosing_info=[CosingInfo(
|
|
cas=["56-81-5"],
|
|
common_names=["Glycerol"],
|
|
inci=["GLYCERIN"],
|
|
annex=[],
|
|
functionName=["Humectant", "Solvent", "Skin conditioning"],
|
|
otherRestrictions=[],
|
|
cosmeticRestriction=None
|
|
)],
|
|
toxicity=Toxicity(
|
|
cas="56-81-5",
|
|
indicators=[
|
|
ToxIndicator(
|
|
indicator="NOAEL", value=1000, unit="mg/kg bw/day",
|
|
route="oral", toxicity_type="repeated_dose_toxicity",
|
|
ref="https://chem.echa.europa.eu/100.003.264"
|
|
),
|
|
ToxIndicator(
|
|
indicator="LD50", value=12600, unit="mg/kg bw",
|
|
route="oral", toxicity_type="acute_toxicity",
|
|
ref="https://chem.echa.europa.eu/100.003.264"
|
|
)
|
|
]
|
|
)
|
|
)
|
|
|
|
# CETYL ALCOHOL (36653-82-4) — con NOAEL
|
|
cetyl = Ingredient(
|
|
cas="36653-82-4",
|
|
inci=["CETYL ALCOHOL"],
|
|
dap_info=DapInfo(
|
|
cas="36653-82-4",
|
|
molecular_weight=242.44,
|
|
log_pow=6.83,
|
|
tpsa=20.23,
|
|
melting_point=49.0
|
|
),
|
|
cosing_info=[CosingInfo(
|
|
cas=["36653-82-4"],
|
|
common_names=["Cetyl alcohol", "1-Hexadecanol"],
|
|
inci=["CETYL ALCOHOL"],
|
|
annex=[],
|
|
functionName=["Emollient", "Emulsifying", "Opacifying"],
|
|
otherRestrictions=[],
|
|
cosmeticRestriction=None
|
|
)],
|
|
toxicity=Toxicity(
|
|
cas="36653-82-4",
|
|
indicators=[
|
|
ToxIndicator(
|
|
indicator="NOAEL", value=1000, unit="mg/kg bw/day",
|
|
route="oral", toxicity_type="repeated_dose_toxicity",
|
|
ref="https://chem.echa.europa.eu/100.004.098"
|
|
)
|
|
]
|
|
)
|
|
)
|
|
|
|
# TOCOPHEROL (59-02-9) — con LOAEL
|
|
tocopherol = Ingredient(
|
|
cas="59-02-9",
|
|
inci=["TOCOPHEROL"],
|
|
dap_info=DapInfo(
|
|
cas="59-02-9",
|
|
molecular_weight=430.71,
|
|
log_pow=10.51,
|
|
tpsa=29.46,
|
|
melting_point=3.0
|
|
),
|
|
cosing_info=[CosingInfo(
|
|
cas=["59-02-9"],
|
|
common_names=["alpha-Tocopherol"],
|
|
inci=["TOCOPHEROL"],
|
|
annex=[],
|
|
functionName=["Antioxidant", "Skin conditioning"],
|
|
otherRestrictions=[],
|
|
cosmeticRestriction=None
|
|
)],
|
|
toxicity=Toxicity(
|
|
cas="59-02-9",
|
|
indicators=[
|
|
ToxIndicator(
|
|
indicator="LOAEL", value=500, unit="mg/kg bw/day",
|
|
route="oral", toxicity_type="repeated_dose_toxicity",
|
|
ref="https://chem.echa.europa.eu/100.000.375"
|
|
)
|
|
]
|
|
)
|
|
)
|
|
|
|
# Salva ogni ingrediente su MongoDB + PostgreSQL
|
|
for ing in [glycerin, cetyl, tocopherol]:
|
|
mongo_id = ing.save()
|
|
print(f"Ingrediente {ing.cas} ({ing.inci[0]}) salvato (mongo_id={mongo_id})")
|
|
|
|
return glycerin, cetyl, tocopherol
|
|
|
|
|
|
def create_mock_order(preset, glycerin, cetyl, tocopherol):
|
|
"""Crea un ordine mock completo."""
|
|
|
|
# 1. Upsert cliente
|
|
client_name = "Cosmetica Test Srl"
|
|
id_cliente = upsert_cliente(client_name)
|
|
print(f"Cliente '{client_name}' → id_cliente={id_cliente}")
|
|
|
|
# 2. JSON ordine grezzo
|
|
raw_json = {
|
|
"client_name": client_name,
|
|
"product_name": "Crema Idratante Test",
|
|
"preset_esposizione": preset.preset_name,
|
|
"ingredients": [
|
|
{"inci": "AQUA", "cas": "", "percentage": 70.0, "is_colorante": False, "skip_tox": True},
|
|
{"inci": "GLYCERIN", "cas": "56-81-5", "percentage": 15.0, "is_colorante": False, "skip_tox": False},
|
|
{"inci": "CETYL ALCOHOL", "cas": "36653-82-4", "percentage": 10.0, "is_colorante": False, "skip_tox": False},
|
|
{"inci": "TOCOPHEROL", "cas": "59-02-9", "percentage": 5.0, "is_colorante": False, "skip_tox": False},
|
|
]
|
|
}
|
|
|
|
# 3. Salva su MongoDB orders
|
|
orders_col = db_connect(collection_name='orders')
|
|
result = orders_col.insert_one(raw_json.copy())
|
|
uuid_ordine = str(result.inserted_id)
|
|
print(f"Ordine salvato su MongoDB: uuid_ordine={uuid_ordine}")
|
|
|
|
# 4. Inserisci in PostgreSQL ordini
|
|
id_ordine = insert_ordine(uuid_ordine, id_cliente)
|
|
print(f"Ordine inserito in PostgreSQL: id_ordine={id_ordine}")
|
|
|
|
# 5. Aggiorna stato a ARRICCHITO
|
|
update_ordine_cliente(id_ordine, id_cliente)
|
|
aggiorna_stato_ordine(id_ordine, int(StatoOrdine.ARRICCHITO))
|
|
print(f"Stato ordine aggiornato a ARRICCHITO ({StatoOrdine.ARRICCHITO})")
|
|
|
|
# 6. Crea progetto con ingredienti arricchiti
|
|
project = Project(
|
|
order_id=id_ordine,
|
|
product_name="Crema Idratante Test",
|
|
client_name=client_name,
|
|
esposition=preset,
|
|
ingredients=[
|
|
ProjectIngredient(cas=None, inci="AQUA", percentage=70.0, skip_tox=True),
|
|
ProjectIngredient(cas="56-81-5", inci="GLYCERIN", percentage=15.0, ingredient=glycerin),
|
|
ProjectIngredient(cas="36653-82-4", inci="CETYL ALCOHOL", percentage=10.0, ingredient=cetyl),
|
|
ProjectIngredient(cas="59-02-9", inci="TOCOPHEROL", percentage=5.0, ingredient=tocopherol),
|
|
]
|
|
)
|
|
|
|
# 7. Salva il progetto (MongoDB + PostgreSQL)
|
|
uuid_progetto = project.save()
|
|
print(f"Progetto salvato: uuid_progetto={uuid_progetto}")
|
|
|
|
print("\n" + "=" * 60)
|
|
print("MOCK ORDER CREATO CON SUCCESSO")
|
|
print("=" * 60)
|
|
print(f" id_ordine: {id_ordine}")
|
|
print(f" uuid_ordine: {uuid_ordine}")
|
|
print(f" uuid_progetto: {uuid_progetto}")
|
|
print(f" cliente: {client_name}")
|
|
print(f" prodotto: Crema Idratante Test")
|
|
print(f" preset: {preset.preset_name}")
|
|
print(f" ingredienti: 4 (AQUA, GLYCERIN, CETYL ALCOHOL, TOCOPHEROL)")
|
|
print(f" stato: ARRICCHITO ({StatoOrdine.ARRICCHITO})")
|
|
print("=" * 60)
|
|
|
|
return id_ordine
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("Creazione ordine mock...")
|
|
print()
|
|
|
|
# 1. Assicura che il preset esista
|
|
preset = ensure_preset_exists()
|
|
|
|
# 2. Crea ingredienti mock
|
|
glycerin, cetyl, tocopherol = create_mock_ingredients()
|
|
|
|
# 3. Crea l'ordine
|
|
create_mock_order(preset, glycerin, cetyl, tocopherol)
|