feat: Meshy.ai — raw cost in cout_fixe, margin in variable, per-job margin %
Deploy via Portainer / deploy (push) Successful in 1s

This commit is contained in:
Jo
2026-07-16 14:54:13 +02:00
parent 15ae5c5d77
commit 0619559190
4 changed files with 60 additions and 34 deletions
+26 -19
View File
@@ -258,7 +258,7 @@ def init_db():
('ha_poll_interval','60'),
('meshy_annual_cost','200.0'),
('meshy_monthly_credits','1000'),
('meshy_cost_multiplier','1.0'),
('meshy_default_margin_pct','30.0'),
]
conn.executemany('INSERT OR IGNORE INTO settings VALUES (?,?)', defaults)
@@ -308,6 +308,7 @@ def init_db():
'ALTER TABLE jobs ADD COLUMN meshy_enabled INTEGER DEFAULT 0',
'ALTER TABLE jobs ADD COLUMN meshy_credits_used INTEGER DEFAULT 0',
'ALTER TABLE jobs ADD COLUMN meshy_cost REAL DEFAULT 0',
'ALTER TABLE jobs ADD COLUMN meshy_margin_pct REAL DEFAULT 0',
]
for sql in migrations:
try:
@@ -463,7 +464,7 @@ def parse_3mf(file_stream):
def calc(weight_g, print_time_s, design_mult, gross_margin_pct, discount_pct,
price_per_kg_override=None, s=None, pieces_per_plate=1,
meshy_enabled=False, meshy_credits_used=0):
meshy_enabled=False, meshy_credits_used=0, meshy_margin_pct=0.0):
"""
Moteur de pricing principal — calcule le prix de vente d'une pièce.
@@ -516,20 +517,21 @@ def calc(weight_g, print_time_s, design_mult, gross_margin_pct, discount_pct,
wear = printer_w + nozzle_w + plate_w
elec = s['printer_power_kw'] * (print_time_s / 3600) * s['electricity_price_kwh'] / pieces_per_plate
# Coût Meshy.ai (génération IA) — pro-raté par crédits utilisés
meshy_unit = 0.0
meshy_billed = 0.0
# Coût Meshy.ai — coût brut dans cout_fixe, marge spécifique dans total_marge
meshy_unit = 0.0
meshy_raw = 0.0
meshy_margin_amount = 0.0
if meshy_enabled and meshy_credits_used > 0:
_meshy_annual = float(s.get('meshy_annual_cost', 200.0))
_meshy_credits = float(s.get('meshy_monthly_credits', 1000)) or 1
_meshy_mult = float(s.get('meshy_cost_multiplier', 1.0))
meshy_unit = _meshy_annual / 12 / _meshy_credits
meshy_billed = meshy_credits_used * meshy_unit * _meshy_mult
_meshy_annual = float(s.get('meshy_annual_cost', 200.0))
_meshy_credits = float(s.get('meshy_monthly_credits', 1000)) or 1
meshy_unit = _meshy_annual / 12 / _meshy_credits
meshy_raw = meshy_credits_used * meshy_unit
meshy_margin_amount = meshy_raw * (meshy_margin_pct / 100)
cout_fixe = mat + mat_margin + wear + elec
sous_total = cout_fixe + handling + design + meshy_billed
cout_fixe = mat + mat_margin + wear + elec + meshy_raw
sous_total = cout_fixe + handling + design
margin = sous_total * (gross_margin_pct / 100)
total_marge= handling + design + meshy_billed + margin
total_marge= handling + design + meshy_margin_amount + margin
prix_ht = cout_fixe + total_marge
cot_rate = s.get('cotisations_rate_pct', 12.3) / 100
@@ -574,7 +576,8 @@ def calc(weight_g, print_time_s, design_mult, gross_margin_pct, discount_pct,
'tva_amount': round(tva_amount, 4),
'prix_ht_net': round(prix_ht_net, 4),
'prix_ttc': round(prix_ttc, 4),
'meshy_cost': round(meshy_billed, 4),
'meshy_cost': round(meshy_raw, 4),
'meshy_margin_amount': round(meshy_margin_amount, 4),
'meshy_unit_cost': round(meshy_unit, 6),
'tax_amount': round(cot_amount + vfl_amount + other_taxes_amount, 4),
'final_price': round(final, 2),
@@ -1332,22 +1335,24 @@ def new_job():
meshy_enabled_v = bool(request.form.get('meshy_enabled'))
meshy_credits_v = max(0, int(request.form.get('meshy_credits_used', 0) or 0))
meshy_margin_v = max(0.0, float(request.form.get('meshy_margin_pct', 0) or 0))
r = calc(weight_g, print_time_s, design_mult, gross_margin, discount,
price_kg, s, pieces_per_plate,
meshy_enabled=meshy_enabled_v, meshy_credits_used=meshy_credits_v)
meshy_enabled=meshy_enabled_v, meshy_credits_used=meshy_credits_v,
meshy_margin_pct=meshy_margin_v)
conn.execute('''INSERT INTO jobs(client_id,material_id,machine_profile_id,handling_profile_id,
material_profile_id,pricing_profile_id,project_id,source_file,source_nc_path,plate_name,name,description,
meshy_enabled,meshy_credits_used,meshy_cost,
meshy_enabled,meshy_credits_used,meshy_cost,meshy_margin_pct,
weight_g,print_time_s,design_multiplier,gross_margin_pct,discount_pct,
pieces_per_plate,order_qty,
material_cost,material_margin,design_cost,handling_cost,wear_cost,electricity_cost,
cout_fixe,total_marge,subtotal,margin_amount,marge_pct_on_ht,
cotisations_amount,vfl_amount,tva_amount,other_taxes_amount,tax_amount,
price_per_piece,final_price,notes)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
(client_id,material_id,machine_pid,handling_pid,material_pid,pricing_pid,project_id,
source_file,source_nc_path,plate_name,request.form['name'],request.form.get('description',''),
int(meshy_enabled_v),meshy_credits_v,r['meshy_cost'],
int(meshy_enabled_v),meshy_credits_v,r['meshy_cost'],meshy_margin_v,
weight_g,print_time_s,design_mult,gross_margin,discount,
pieces_per_plate,order_qty,
r['material_cost'],r['material_margin'],r['design_cost'],r['handling_cost'],
@@ -1713,6 +1718,7 @@ def api_calculate():
print_time_s = int(d.get('hours',0))*3600 + int(d.get('minutes',0))*60
meshy_enabled = bool(d.get('meshy_enabled', False))
meshy_credits = max(0, int(d.get('meshy_credits_used', 0)))
meshy_margin_p = max(0.0, float(d.get('meshy_margin_pct', 0)))
result = calc(
weight_g=float(d['weight_g']),
@@ -1722,7 +1728,8 @@ def api_calculate():
discount_pct=float(d.get('discount_pct',0)),
price_per_kg_override=price_kg, s=s,
pieces_per_plate=pieces_per_plate,
meshy_enabled=meshy_enabled, meshy_credits_used=meshy_credits)
meshy_enabled=meshy_enabled, meshy_credits_used=meshy_credits,
meshy_margin_pct=meshy_margin_p)
# Multi-piece extras
nb_plateaux = math.ceil(order_qty / pieces_per_plate)