""" 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)