feat: export Indy — selection commandes, CSV produits/services, acronyme client
Deploy via Portainer / deploy (push) Successful in 0s
Deploy via Portainer / deploy (push) Successful in 0s
This commit is contained in:
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user