feat: export Indy — selection commandes, CSV produits/services, acronyme client
Deploy via Portainer / deploy (push) Successful in 0s

This commit is contained in:
Jo
2026-07-17 00:15:26 +02:00
parent 38fc4ed565
commit a82dcc0c92
4 changed files with 339 additions and 9 deletions
+27 -5
View File
@@ -309,6 +309,7 @@ def init_db():
'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',
'ALTER TABLE clients ADD COLUMN acronyme TEXT DEFAULT ""',
]
for sql in migrations:
try:
@@ -845,10 +846,11 @@ def new_client():
if request.method == 'POST':
def _int(k): return int(request.form[k]) if request.form.get(k) else None
conn.execute('''INSERT INTO clients
(name,email,notes,default_machine_profile_id,default_handling_profile_id,
(name,acronyme,email,notes,default_machine_profile_id,default_handling_profile_id,
default_material_profile_id,default_pricing_profile_id)
VALUES(?,?,?,?,?,?,?)''',
(request.form['name'], request.form.get('email',''), request.form.get('notes',''),
VALUES(?,?,?,?,?,?,?,?)''',
(request.form['name'], request.form.get('acronyme','').upper().strip(),
request.form.get('email',''), request.form.get('notes',''),
_int('default_machine_profile_id'), _int('default_handling_profile_id'),
_int('default_material_profile_id'), _int('default_pricing_profile_id')))
conn.commit(); conn.close()
@@ -863,10 +865,11 @@ def edit_client(id):
client = conn.execute('SELECT * FROM clients WHERE id=?',(id,)).fetchone()
if request.method == 'POST':
def _int(k): return int(request.form[k]) if request.form.get(k) else None
conn.execute('''UPDATE clients SET name=?,email=?,notes=?,
conn.execute('''UPDATE clients SET name=?,acronyme=?,email=?,notes=?,
default_machine_profile_id=?,default_handling_profile_id=?,
default_material_profile_id=?,default_pricing_profile_id=? WHERE id=?''',
(request.form['name'], request.form.get('email',''), request.form.get('notes',''),
(request.form['name'], request.form.get('acronyme','').upper().strip(),
request.form.get('email',''), request.form.get('notes',''),
_int('default_machine_profile_id'), _int('default_handling_profile_id'),
_int('default_material_profile_id'), _int('default_pricing_profile_id'), id))
conn.commit(); conn.close()
@@ -897,6 +900,25 @@ def delete_client(id):
conn.commit(); conn.close()
return redirect(url_for('clients'))
@app.route('/export/indy')
def export_indy():
"""Page d'export des commandes au format Indy (produits/services)."""
conn = get_db()
jobs = conn.execute('''
SELECT j.id, j.name, j.created_at, j.final_price, j.discount_pct,
j.tva_amount, j.order_qty, j.pieces_per_plate, j.plate_name,
j.description,
c.name as client_name, c.acronyme as client_acronyme
FROM jobs j
LEFT JOIN clients c ON j.client_id = c.id
ORDER BY j.created_at DESC
''').fetchall()
s = get_settings()
tva_pct = float(s.get('tva_rate_pct', 20.0))
conn.close()
return render_template('export_indy.html', jobs=jobs, tva_pct=tva_pct)
# ─── Projets ──────────────────────────────────────────────────────────────────
@app.route('/projects')