Files
2023-06-22 10:34:18 +02:00

361 lines
20 KiB
Python

# -*- coding: utf8 -*-
from .default import (
execute_query,
)
def generer_brouillard(request, logged_in, date_fin):
""" Générer le brouillard jusqu'à la date de fin
PHASE 1 :
- Lire les comptes clients valorisés dans la période
- Cumuler les écritures de réglement et de ventes par TVA et Agences dans T_ECRITURES
PHASE 2 :
- remplir le libellé pour des comptes de ventes
PHASE 3 :
- Générer les écritures dans T_SYBEL"
"""
message = ""
mtTVA_encaisse = 0
# RAZ la table T_SYBEL pour extraire les écritures comptable
delete_t_sybel(request, logged_in)
# lire la societe CERRA pour mémoriser ses paramètres
query = "CALL spGet_SOCIETES('C');"
soc = request.dbsession.execute(query).first()
szCompteAux = soc.CPTE_AUX
szCompteTVA = soc.CPTE_TVA
szJournalVente = soc.JNL_VTE
query = """SELECT c.*, t.taux as TTVA, a.JNL_BNQ, a.CPT_BNQ, a.CENTRE FROM eleves_cpt c
INNER JOIN p_tva t ON c.ctva = t.code
INNER JOIN p_agences a ON c.agence = a.code
WHERE c.exporte_le IS NULL AND c.date_valeur <= :date_fin AND societe='C' AND cd_cli > 100000
AND c.credit + c.mtval <> 0 ORDER BY c.date_valeur"""
ecritures = request.dbsession.execute(query, {'date_fin': date_fin.strftime("%Y-%m-%d")}).fetchall()
for ecr in ecritures:
# contrôler la date de valeur : ne doit pas être en dehors du mois sélectionné
dateValeur = ecr.DATE_VALEUR
if dateValeur.month != date_fin.month :
message = "Une écriture du %s de %s - %s est hors des limites de l'export. Impossible de continuer." % \
(dateValeur.strftime("%d-%m-%Y"), ecr.CD_CLI, ecr.NOM)
return message
# origine de l'élève
nOrigine = str(ecr.CD_CLI)[0:1]
sDateValeur = dateValeur.strftime("%Y-%m-%d")
# écriture de réglement
if ecr.MODE_REGL > 0:
# règlement ESP, CHQ, CB, CBW ?
# import pdb;pdb.set_trace()
if ecr.MODE_REGL <= 4:
query = "CALL spUPD_T_ECRITURES(:logged_in, 'BNQ_D', :agence, :mode_regl,0, :date_valeur, :credit);"
execute_query(request, query, {'logged_in': logged_in, 'agence': ecr.AGENCE, 'mode_regl': ecr.MODE_REGL,
'date_valeur': sDateValeur, 'credit': ecr.CREDIT})
# TVA exo
# query = "CALL spUPD_T_ECRITURES(:logged_in, 'BNQ_C', :agence, 0, :origine, :date_valeur, :credit);"
# execute_query(request, query, {'logged_in': logged_in, 'agence': ecr.AGENCE, 'origine': nOrigine,
# 'date_valeur': sDateValeur, 'credit': ecr.MT2})
# TVA 1
query = "CALL spUPD_T_ECRITURES(:logged_in, 'BNQ_C', :agence, 1, :origine, :date_valeur, :credit);"
execute_query(request, query, {'logged_in': logged_in, 'agence': ecr.AGENCE, 'origine': nOrigine,
'date_valeur': sDateValeur, 'credit': ecr.MT3})
# TVA 2
query = "CALL spUPD_T_ECRITURES(:logged_in, 'BNQ_C', :agence, 2, :origine, :date_valeur, :credit);"
execute_query(request, query, {'logged_in': logged_in, 'agence': ecr.AGENCE, 'origine': nOrigine,
'date_valeur': sDateValeur, 'credit': ecr.MT1})
# Mode=5 : Prêt 1 € ?
if ecr.MODE_REGL == 5:
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '13', :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '411000',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '13', :date_valeur, :compte, :centre, :lib, :credit, 'D', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '512200',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
# Mode=6 : virement compte à compte ?
if ecr.MODE_REGL == 6:
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '12', :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '411000',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '12', :date_valeur, :compte, :centre, :lib, :credit, 'D', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '581000',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
# Mode=7 : virement ?
if ecr.MODE_REGL == 7:
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '10', :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '411000',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '10', :date_valeur, :compte, :centre, :lib, :credit, 'D', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '512000',
'centre': 'CNORM' + nOrigine, 'lib': ecr.INTITULE[:25], 'credit': ecr.CREDIT, 'ref': 'VIRT' + str(ecr.CD_CLI)})
# Mode=8 : remboursement ?
if ecr.MODE_REGL == 8:
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '13', :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '411000',
'centre': 'CNORM' + nOrigine, 'lib':'REMBOURSEMENT ' + ecr.NOM[:11], 'credit': ecr.CREDIT, 'ref': 'REMB' + str(ecr.CD_CLI)})
query = "CALL spINS_T_SYBEL(:logged_in, 'C', '13', :date_valeur, :compte, :centre, :lib, :credit, 'D', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'date_valeur': sDateValeur, 'compte': '512000',
'centre': 'CNORM' + nOrigine, 'lib': 'REMBOURSEMENT ' + ecr.NOM[:11], 'credit': ecr.CREDIT, 'ref': 'REMB' + str(ecr.CD_CLI)})
# Mode=9 : impayés ?
if ecr.MODE_REGL == 9:
query = "CALL spINS_T_SYBEL(:logged_in, 'C', :jnl_bnq, :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'jnl_bnq': ecr.JNL_BNQ, 'date_valeur': sDateValeur, 'compte': '411000',
'centre': 'CNORM' + nOrigine, 'lib': 'IMPAYE ' + ecr.NOM[:18], 'credit': ecr.CREDIT, 'ref': 'IMPA' + str(ecr.CD_CLI)})
query = "CALL spINS_T_SYBEL(:logged_in, 'C', :jnl_bnq, :date_valeur, :compte, :centre, :lib, :credit, 'D', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'jnl_bnq': ecr.JNL_BNQ, 'date_valeur': sDateValeur, 'compte': ecr.CPT_BNQ,
'centre': 'CNORM' + nOrigine, 'lib': 'IMPAYE ' + ecr.NOM[:18], 'credit': ecr.CREDIT, 'ref': 'IMPA' + str(ecr.CD_CLI)})
else:
# === cumuler les ecritures de VENTES si no compte saisi
if ecr.COMPTE:
# import pdb;pdb.set_trace()
# cumuler ecriture de vente
query = "CALL spUPD_T_ECRITURES(:logged_in, 'VTE_D', :origine, :ctva, 0, :date_valeur, :mtval);"
execute_query(request, query, {'logged_in': logged_in, 'origine': nOrigine, 'ctva': ecr.CTVA,
'date_valeur': date_fin.strftime("%Y-%m-%d"), 'mtval': ecr.MTVAL})
# compte déja crée ?
query = "CALL spGET_T_SYBEL(:logged_in,'C', :vte, :date_fin, :compte, :centre);"
item = request.dbsession.execute(query, {'logged_in': logged_in, 'vte': szJournalVente, 'date_fin': date_fin.strftime("%Y-%m-%d"),
'compte': ecr.COMPTE, 'centre': ecr.CENTRE}).first()
if item:
OldMontant = item.MONTANT
else:
# non, creer
query = "CALL spINS_T_SYBEL(:logged_in, 'C', :jnl, :date_valeur, :compte, :centre, :lib, :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'jnl': szJournalVente, 'date_valeur': date_fin.strftime("%Y-%m-%d"),
'compte': ecr.COMPTE, 'centre': ecr.CENTRE, 'lib': ecr.INTITULE[:25], 'credit': 0, 'ref': 'AEM-' + date_fin.strftime("%d%m%y")})
OldMontant = 0
# cumuler le montant HT et cumuler le total TVA
mtHT = round(ecr.MTVAL / (1 + (ecr.TTVA / 100)), 2)
mtTVA_encaisse += ecr.MTVAL- mtHT
query = "CALL spUPD_T_SYBEL(:logged_in, 'C', :jnl, :date_valeur, :compte, :centre, :credit);"
execute_query(request, query, {'logged_in': logged_in, 'jnl': szJournalVente, 'date_valeur': date_fin.strftime("%Y-%m-%d"),
'compte': ecr.COMPTE, 'centre': ecr.CENTRE, 'credit': OldMontant + mtHT})
# PHASE 2 :
# - remplir le libellé pour des comptes de ventes
query = "UPDATE t_sybel INNER JOIN p_comptes c ON t_sybel.compte = c.code SET t_sybel.libelle = c.libelle WHERE t_sybel.compte > 700000;"
execute_query(request, query, {})
# remplir le libellé pour le type 'BNQ_D'
query = """UPDATE t_ecritures t INNER JOIN P_AGENCES a ON t.agence = a.code INNER JOIN P_MODE_REGL m ON t.code1 = m.code
SET t.libelle = CONCAT('REM ', m.lib4, ' Ag:', t.agence), t.compte = a.cpt_bnq, t.journal=a.jnl_bnq
WHERE user = :logged_in AND t.type='BNQ_D';"""
execute_query(request, query, {'logged_in': logged_in})
# import pdb; pdb.set_trace()
# remplir le libellé pour le type 'BNQ_C'
query = """UPDATE t_ecritures t INNER JOIN P_AGENCES a ON t.agence = a.code INNER JOIN P_TVA m ON t.code1 = m.code
SET t.libelle = CONCAT('REGLEM ', m.lib4, ' Ag:', t.agence), t.compte = CONCAT('C',m.lib4,t.code2), t.journal=a.jnl_bnq
WHERE user = :logged_in AND t.type='BNQ_C'; """
execute_query(request, query, {'logged_in': logged_in})
# remplir le libellé pour le type 'VTE_D'
query = """UPDATE t_ecritures t INNER JOIN P_AGENCES a ON t.agence = a.code INNER JOIN P_TVA m ON t.code1 = m.code
SET t.libelle = CONCAT('VENTE ', m.lib4, ' Ag:', t.agence), t.compte = CONCAT('C',m.lib4,t.agence), t.journal=a.jnl_bnq
WHERE user = :logged_in AND t.type='VTE_D';"""
execute_query(request, query, {'logged_in': logged_in})
# PHASE 3 :
# - Générer les écritures dans T_SYBEL"
query = "CALL spGEN_T_SYBEL(:logged_in, 'C', :jnl, :compte, :ref);"
execute_query(request, query, {'logged_in': logged_in, 'jnl': szJournalVente, 'compte': szCompteAux, 'ref': 'AEM-' + date_fin.strftime("%d%m%y")})
# - Générer la ligne TVA ENCAISSE
query = "CALL spINS_T_SYBEL(:logged_in, 'C', :jnl, :date_valeur, :compte, '', 'TVA COLLECTE', :credit, 'C', :ref);"
execute_query(request, query, {'logged_in': logged_in, 'jnl': szJournalVente, 'date_valeur': date_fin.strftime("%Y-%m-%d"), 'compte': szCompteTVA,
'credit': mtTVA_encaisse, 'ref': 'AEM-' + date_fin.strftime("%d%m%y")})
return message
def get_brouillard(request, logged_in):
query = "SELECT * FROM t_sybel WHERE user=:logged_in ORDER BY journal, date, compte, centre;";
results = request.dbsession.execute(query, {'logged_in': logged_in})
return results.fetchall()
def generer_export(request, logged_in, path_fichier):
# ouvrir le fichier export compta, encodage ANSI
fichier = open(path_fichier, mode="w", newline='\r\n', encoding="cp1252")
# ecrire la ligne d'entete
fichier.write("CERRA MARIETTON" + '\n')
# Lire les écritures extraites
ecritures = get_brouillard(request, logged_in)
for ecr in ecritures:
# si montant < 0, le rendre positif et inverser le sens
montant = ecr.MONTANT
sens = ecr.SENS
if montant < 0:
montant *= -1
if sens == "C":
sens = "D"
else:
sens = "C"
# nouvelle ligne, longueur = 104 charactères
ligne1 = ''
# code Journal (3 car.)
ligne1 += ecr.JOURNAL.ljust(3)
# date de pièce (format jjmmaa)
ligne1 += ecr.DATE.strftime("%d%m%y")
# type de pièce (2 car.)
ligne1 += "OD"
# compte général (13 caractères)
ligne1 += ecr.COMPTE.ljust(13)
# compte auxilliare ou analytique
if len(ecr.CENTRE) > 0:
# compte auxilliaire ?
if ecr.COMPTE[:3] == "411":
ligne1 += "X" + ecr.CENTRE.ljust(13)
else:
ligne1 += " "*14
else:
ligne1 += " "*14
# Référence de l'écriture (13 caractères vides)
ligne1 += ecr.REFERENCE.ljust(13)
# libelle (25 caractères)
ligne1 += ecr.LIBELLE.ljust(26)
# date echeance (format jj/mm/aa)
ligne1 += ecr.DATE.strftime("%d%m%y")
# sens : D=Débit, C=Crédit)
ligne1 += sens
# montant (20 caractères)
szmontant = "%0.2f" % montant
ligne1 += szmontant.rjust(20)
# centre anal. et compte non auxilliaire ?
if len(ecr.CENTRE) > 0 and ecr.COMPTE[:3] != "411":
# écrire la ligne generale
fichier.write(ligne1 + 'N\n')
# puis préparer la ligne analytique
ligne1 = ligne1[0:24] + "A" + ecr.CENTRE.ljust(13) + ligne1[38:]
# ecrire la ligne 1
fichier.write(ligne1 + 'N\n')
fichier.close()
return
def update_cpt_export(request, date_fin):
# marquer les lignes de compte exportées
query = """UPDATE eleves_cpt SET modif_le=modif_le, exporte_le = CURRENT_DATE()
WHERE exporte_le IS NULL AND date_valeur <= :date_fin AND cd_cli > 100000 AND credit + mtval <> 0;"""
execute_query(request, query, {'date_fin': date_fin.strftime("%Y-%m-%d")})
def delete_t_sybel(request, userid):
"""supprimer le fichier extraction"""
query = "CALL spDel_T_SYBEL(:userid);"
execute_query(request, query, {'userid': userid})
def get_caisse(request, agence, date):
query = """SELECT c.*, e.permis_demande, CONCAT(m.code,'-',m.lib4) AS lib4 FROM eleves_cpt c
INNER JOIN eleves e ON c.cd_cli = e.cd_cli
INNER JOIN p_mode_regl m ON c.mode_regl = m.code
WHERE c.agence=:agence AND c.date=:date AND c.credit <> 0 ORDER BY c.mode_regl, c.cd_cli;"""
results = request.dbsession.execute(query, {'agence': agence, 'date': date.strftime('%Y-%m-%d')}).fetchall()
return results
def update_contrats_auto(request, agence, logged_in):
query = "CALL spUpd_SOLDER_CONTRAT_B(:agence, :logged_in);"
results = request.dbsession.execute(query, {'agence': agence, 'logged_in': logged_in})
return results.first()
def update_contrats_moto(request, agence, logged_in):
query = "CALL spUpd_SOLDER_CONTRAT_2R(:agence, :logged_in);"
results = request.dbsession.execute(query, {'agence': agence, 'logged_in': logged_in})
return results.first()
def generer_balance(request, logged_in, permis, date_debut, date_fin):
# Générer la balance CLIENTS
# Noter date heure du début et critères de la génération
criteres = permis + ', du ' + date_debut.strftime('%d-%m-%Y') + ' au ' + date_fin.strftime('%d-%m-%Y')
query = "UPDATE societes SET balance_debut=NOW(), balance_fin=NULL, balance_criteres=:criteres WHERE CODE = 'C';"
execute_query(request, query, {'criteres': criteres})
# RAZ la table T_G_LIVRE pour extraire les eleves de cet examen
query = "TRUNCATE t_g_livre;"
execute_query(request, query, {})
# Créer une ligne pour tous les ELEVES non cloturés, inactif et dont le compte est positif
query = """INSERT INTO t_g_livre (user,societe,cat,agence,cd_cli,intitule,formule,solde,credit,mtval)
SELECT :logged_in, societe, permis_demande, LEFT(CAST(cd_cli AS CHAR), 1), cd_cli, LEFT(nompren, 30), formule, 0, 0, 0
FROM ELEVES WHERE agence > 0 AND societe='C' AND permis_demande = :permis;"""
execute_query(request, query, {'logged_in': logged_in, 'permis': permis})
# MAJ le solde et le total des montants valeur et credit
query = "SELECT * FROM t_g_livre WHERE user = :logged_in;"
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
for item in results:
# calculer le solde avant période
query = "SELECT COALESCE(SUM(credit-mtval),0) AS solde FROM eleves_cpt WHERE cd_cli=:cd_cli AND date_valeur < :date_debut;"
res = request.dbsession.execute(query, {'cd_cli': item.CD_CLI, 'date_debut': date_debut.strftime("%Y-%m-%d")}).first()
if res:
solde = res.solde
else:
solde = 0
# calculer les totaux credit et mtval de la période
query = """SELECT COALESCE(SUM(credit),0) AS credit, COALESCE(SUM(mtval),0) AS mtval
FROM eleves_cpt WHERE cd_cli=:cd_cli AND date_valeur >= :date_debut AND date_valeur <= :date_fin;"""
res = request.dbsession.execute(query, {'cd_cli': item.CD_CLI, 'date_debut': date_debut.strftime("%Y-%m-%d"), 'date_fin': date_fin.strftime("%Y-%m-%d")}).first()
if res:
credit = res.credit
mtval = res.mtval
else:
credit = 0
mtval = 0
if solde != 0 or credit != 0 or mtval != 0:
query = "UPDATE t_g_livre SET solde=:solde, credit=:credit, mtval=:mtval WHERE user=:logged_in AND cd_cli=:cd_cli;"
execute_query(request, query, {'logged_in': logged_in, 'cd_cli': item.CD_CLI,
'solde': solde, 'credit': credit, 'mtval': mtval})
else:
query = "DELETE FROM t_g_livre WHERE user=:logged_in AND cd_cli=:cd_cli;"
execute_query(request, query, {'logged_in': logged_in, 'cd_cli': item.CD_CLI})
# Noter date heure du début génération
query = "UPDATE societes SET balance_fin=NOW() WHERE CODE = 'C';"
execute_query(request, query, {})
def get_balance(request, logged_in):
query = "SELECT * FROM t_g_livre WHERE user = :logged_in ORDER BY user, agence, cd_cli;"
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
return results
def get_recap(request, cd_mon1, cd_mon2, date1, date2):
# lire les activités de moniteurs de date à date
# ignorer les activités non imputables (NePasRelancer <> 0)
query = """
SELECT m.NOM, c.CD_MON, c.INTITULE, c.REF, c.STATUT, sum(c.QTE) AS SUM_QTE FROM eleves_cpt c
INNER JOIN moniteurs m ON c.CD_MON = m.CD_MON
INNER JOIN eleves e ON c.CD_CLI = e.CD_CLI
WHERE c.CD_MON >= :cd_mon1 AND c.CD_MON <= :cd_mon2 AND c.DATE >= :date1 AND c.DATE <= :date2 AND
c.NoPlan > 0 AND e.NePasRelancer = 0
GROUP BY m.NOM, c.REF, c.STATUT;"""
results = request.dbsession.execute(query, {'cd_mon1': cd_mon1, 'cd_mon2': cd_mon2, 'date1': date1 ,'date2': date2}).fetchall()
return results
def get_moniteurs_byCode(request):
query = "SELECT * FROM moniteurs ORDER BY cd_mon;"
results = request.dbsession.execute(query)
return results.fetchall()
def get_dates_balance(request):
query = "SELECT * FROM societes WHERE CODE = 'C';"
results = request.dbsession.execute(query).first()
return results.balance_debut, results.balance_fin, results.balance_criteres