196 lines
8.0 KiB
Python
196 lines
8.0 KiB
Python
# -*- coding: utf8 -*-
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import (
|
|
scoped_session,
|
|
sessionmaker,
|
|
)
|
|
from zope.sqlalchemy import (
|
|
ZopeTransactionExtension,
|
|
mark_changed
|
|
)
|
|
|
|
from datetime import *
|
|
import transaction
|
|
import os
|
|
|
|
from ..views.default import (
|
|
to_int,
|
|
)
|
|
|
|
|
|
def execute_query(request, query, params):
|
|
"""Execute query and mark session as changed"""
|
|
request.dbsession.execute(query, params)
|
|
mark_changed(request.dbsession)
|
|
transaction.commit()
|
|
|
|
def get_devis_byName(request, societe, name):
|
|
numero = to_int(name)
|
|
|
|
if numero > 0:
|
|
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
|
|
FROM devis WHERE societe=:societe AND no_id >=:name AND web = 'W' LIMIT 300;;""" % (societe, name)
|
|
elif len(name) == 0:
|
|
query = """SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol, nochantier, web
|
|
FROM devis WHERE societe=:societe AND web = 'W' ORDER BY no_id DESC LIMIT 300;"""
|
|
else:
|
|
query = """(SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, nopol , nochantier, web
|
|
FROM devis WHERE societe=:societe AND c_nom LIKE ':name%' AND web = 'W' LIMIT 500)"""
|
|
results = request.dbsession.execute(query, {'societe': societe, 'name': name}).fetchall()
|
|
return results
|
|
|
|
def get_devfac_by_no(request,nodossier):
|
|
# lire devis, facture ou proforma
|
|
|
|
societe = nodossier[0:2]
|
|
type_doc = nodossier[3:5]
|
|
no_id = nodossier[5:]
|
|
|
|
if type_doc == 'DE':
|
|
query = """
|
|
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
|
|
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
|
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
|
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
|
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
|
elif type_doc == 'FA':
|
|
query = """
|
|
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
|
|
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
|
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
|
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
|
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
|
else:
|
|
query = """
|
|
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
|
|
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
|
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
|
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
|
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
|
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
|
return results
|
|
|
|
def get_devis_lig_by_no(request,nodossier):
|
|
|
|
societe = nodossier[0:2]
|
|
type_doc = nodossier[3:5]
|
|
no_id = nodossier[5:]
|
|
|
|
if type_doc == 'DE':
|
|
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;"
|
|
elif type_doc == 'FA':
|
|
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;"
|
|
else:
|
|
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;"
|
|
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
|
|
return results
|
|
|
|
def get_devis_lignes_by_no(request, nodossier, nolig):
|
|
societe = nodossier[0:2]
|
|
type_doc = nodossier[3:5]
|
|
no_id = nodossier[5:]
|
|
|
|
if nolig == '0':
|
|
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id;"
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
|
|
else:
|
|
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=:nolig;"
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id, 'nolig': nolig}).first()
|
|
return results
|
|
|
|
|
|
def insert_devis_from_dossier(request, nodossier, logged_in):
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[3:]
|
|
|
|
query = "CALL spINS_DEVIS_FROM_DOSSIER(:societe, 'DDW', :no_id, :logged_in);"
|
|
results = request.dbsession.execute(query,{'societe': societe, 'no_id': no_id, 'logged_in': logged_in}).first()
|
|
return results
|
|
|
|
def get_devis_by_no(request,nodossier):
|
|
# lire devis, facture ou proforma
|
|
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[5:]
|
|
|
|
query = """
|
|
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
|
|
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
|
|
INNER JOIN p_cabinet a ON d.cabinet = a.code
|
|
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
|
|
WHERE d.societe = :societe and d.no_id=:no_id;"""
|
|
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
|
return results
|
|
|
|
def update_devis_ligne(request, nodossier, nolig, new_values):
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[5:]
|
|
# formater les champs
|
|
s = ''
|
|
for param in new_values.keys():
|
|
if s:
|
|
s += ",%s=:%s" % (param, param)
|
|
else:
|
|
s = "%s=:%s" % (param, param)
|
|
|
|
if nolig == '0':
|
|
query = "INSERT INTO devis_lignes SET %s" % s
|
|
else:
|
|
new_values['societe'] = societe
|
|
new_values['no_id'] = no_id
|
|
new_values['nolig'] = nolig
|
|
query = "UPDATE devis_lignes SET %s WHERE societe = :societe and no_id=:no_id and nolig = :nolig;" % s
|
|
# import pdb;pdb.set_trace()
|
|
execute_query(request, query, new_values)
|
|
|
|
def sum_devis_totaux(request, nodossier):
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[5:]
|
|
|
|
query = """UPDATE devis SET totalht = (SELECT SUM(mtht) FROM devis_lignes WHERE societe=:societe AND no_id=:no_id),
|
|
totaltva = ROUND(totalht * tauxtva / 100,2),
|
|
totalttc = totalht + totaltva
|
|
WHERE societe=:societe AND no_id=:no_id;"""
|
|
execute_query(request, query, {'societe': societe, 'no_id': no_id})
|
|
|
|
def delete_devis_ligne(request, nodossier, nolig):
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[5:]
|
|
|
|
query = "DELETE FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=%s;"
|
|
execute_query(request, query, {'societe': societe, 'no_id': no_id})
|
|
|
|
def move_devis_ligne(request, nodossier, nolig, move):
|
|
societe = nodossier[0:2]
|
|
no_id = nodossier[5:]
|
|
|
|
# get max no ligne du devis
|
|
query = "SELECT count(*) AS max_no FROM devis_lignes WHERE societe = :societe and no_id=:no_id;"
|
|
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
|
|
max_no = results.max_no + 1
|
|
|
|
step = 0
|
|
if move == 'up':
|
|
# déplacement vers le haut
|
|
if nolig > 1:
|
|
step = -1
|
|
else:
|
|
# déplacement vers le haut
|
|
if nolig < max_no:
|
|
step = +1
|
|
|
|
if step != 0:
|
|
# déplacer le suivant ou précédent vers la fin
|
|
query = """UPDATE devis_lignes SET nolig = :max_no WHERE societe = :societe and no_id=:no_id and nolig = :nolig + :step;"""
|
|
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no, 'step': step})
|
|
# permuter avec le suivant ou précédent
|
|
query = """UPDATE devis_lignes SET nolig = nolig + :step WHERE societe = :societe and no_id=:no_id and nolig = :nolig;"""
|
|
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'step': step})
|
|
# remettre le précédent ou suivant à la place de la ligne déplacée
|
|
query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;"""
|
|
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no})
|