def creation_lignes(subedition, subgeneraux, consolidation): """ génération des lignes de données du bilan :param subedition: paramètres d'édition :param subgeneraux: paramètres généraux :param consolidation: classe de consolidation des données des bilans :return: lignes de données du bilan """ lignes = [] for code_client, client in sorted(consolidation.clients.items()): numbers = {} for id_compte, compte in client['comptes'].items(): numbers[id_compte] = compte['num_compte'] for id_compte, num_compte in sorted(numbers.items(), key=lambda x: x[1]): compte = client['comptes'][id_compte] if compte['subs'] > 0: ligne = [subedition.annee_fin_general, subedition.mois_fin_general, code_client, client['sap'], client['abrev'], client['nom'], client['type'], client['nature'], id_compte, num_compte, compte['intitule'], compte['type'], compte['t3'], Outils.format_2_dec(compte['s-mt'])] for categorie in subgeneraux.codes_d3(): ligne.append(Outils.format_2_dec(compte['s-' + categorie + 't'])) ligne += [Outils.format_2_dec(compte['subs'])] lignes.append(ligne) return lignes
def creation_lignes(edition, sommes, clients, generaux, acces, livraisons, comptes, categories, prestations): """ génération des lignes de données du détail :param edition: paramètres d'édition :param sommes: sommes calculées :param clients: clients importés :param generaux: paramètres généraux :param acces: accès importés :param livraisons: livraisons importées :param comptes: comptes importés :param categories: catégories importées :param prestations: prestations importées :return: lignes de données du détail """ if sommes.calculees == 0: info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer le détail des coûts" Outils.affiche_message(info) return None lignes = [] for code_client in sorted(sommes.sommes_clients.keys()): client = clients.donnees[code_client] if code_client in sommes.sommes_comptes: sclo = sommes.sommes_comptes[code_client] comptes_utilises = Outils.comptes_in_somme(sclo, comptes) base_client = [edition.annee, edition.mois, code_client, client['code_sap'], client['abrev_labo'], 'U', client['nature']] for id_compte, num_compte in sorted(comptes_utilises.items(), key=lambda x: x[1]): compte = comptes.donnees[id_compte] base_compte = base_client + [id_compte, num_compte, compte['intitule'], compte['type_subside']] if code_client in acces.sommes and id_compte in acces.sommes[code_client]['categories']: som_cats = acces.sommes[code_client]['categories'][id_compte]['machine'] for id_categorie, som_cat in sorted(som_cats.items()): duree = som_cat['duree_hp'] + som_cat['duree_hc'] ligne = base_compte + ['M', id_categorie, categories.donnees[id_categorie]['intitule'], duree, som_cat['mo'], 0, 0, 0, 0, "", "", "", "", "", "", ""] lignes.append(ligne) if code_client in livraisons.sommes and id_compte in livraisons.sommes[code_client]: somme = livraisons.sommes[code_client][id_compte] for article in generaux.articles_d3: if article.code_d in somme: for no_prestation, sip in sorted(somme[article.code_d].items()): prestation = prestations.prestation_de_num(no_prestation) ligne = base_compte + [article.code_d, "", "", "", "", "", "", "", "", article.intitule_court, no_prestation, sip['nom'], Outils.format_2_dec(sip['montantx']), Outils.format_2_dec(sip['rabais']), prestation['categ_stock'], prestation['affiliation']] lignes.append(ligne) return lignes
def table_prix_lvr_jd(code_client, id_compte, intitule_compte, sco, sommes_livraisons, generaux): """ Prix LVR J/D - Table Compte Récap Prestations livrées/code D :param code_client: code du client concerné :param id_compte: id du compte concerné :param intitule_compte: intitulé du compte concerné :param sco: sommes compte calculées :param sommes_livraisons: sommes des livraisons importées :param generaux: paramètres généraux :return: table au format latex """ if code_client in sommes_livraisons and id_compte in sommes_livraisons[code_client]: somme = sommes_livraisons[code_client][id_compte] structure = r'''{|l|r|c|r|r|r|}''' legende = r'''Consommables et autres prestations''' contenu_prests = "" for article in generaux.articles_d3: if article.code_d in somme and sco['sommes_cat_m'][article.code_d] > 0: if contenu_prests != "": contenu_prests += r''' \multicolumn{6}{c}{} \\ ''' contenu_prests += r''' \hline \multicolumn{1}{|l|}{ \textbf{''' + intitule_compte + " - " + Latex.echappe_caracteres(article.intitule_long) + r''' }} & \multicolumn{1}{c|}{Quantité} & Unité & \multicolumn{1}{c|}{P.U.} & \multicolumn{1}{c|}{Montant} & \multicolumn{1}{c|}{Rabais} \\ \hline ''' for no_prestation, sip in sorted(somme[article.code_d].items()): if sip['montant'] > 0: dico_prestations = {'nom': Latex.echappe_caracteres(sip['nom']), 'num': no_prestation, 'quantite': "%.1f" % sip['quantite'], 'unite': Latex.echappe_caracteres(sip['unite']), 'pn': Outils.format_2_dec(sip['pn']), 'montant': Outils.format_2_dec(sip['montant']), 'rabais': Outils.format_2_dec(sip['rabais'])} contenu_prests += r''' %(num)s - %(nom)s & \hspace{5mm} %(quantite)s & %(unite)s & %(pn)s & %(montant)s & %(rabais)s \\ \hline ''' % dico_prestations dico_prestations = {'montant': Outils.format_2_dec(sco['sommes_cat_m'][article.code_d]), 'rabais': Outils.format_2_dec(sco['sommes_cat_r'][article.code_d])} contenu_prests += r''' \multicolumn{4}{|r|}{Total} & %(montant)s & %(rabais)s \\ \hline ''' % dico_prestations return Latex.tableau(contenu_prests, structure, legende) else: return ""
def table_prix_cae_jk(code_client, id_compte, intitule_compte, sco, sommes_acces, categories): """ Prix CAE J/K - Table Compte Récap Procédés/Catégorie Machine :param code_client: code du client concerné :param id_compte: id du compte concerné :param intitule_compte: intitulé du compte concerné :param sco: sommes compte calculées :param sommes_acces: sommes des accès importés :param categories: catégories importées :return: table au format latex """ if code_client in sommes_acces and id_compte in sommes_acces[code_client]['comptes'] and sco['somme_j_mk'] > 0: structure = r'''{|l|c|c|r|r|}''' legende = r'''Services''' contenu = r''' \hline \textbf{''' + intitule_compte + r'''} & Unité & Quantité & \multicolumn{1}{c|}{PU} & \multicolumn{1}{c|}{Montant} \\ \hline ''' for cat, som_cat in sorted(sommes_acces[code_client]['categories'][id_compte].items()): for id_categorie, cats in sorted(som_cat.items()): montant = cats['mk'] unite = categories.donnees[id_categorie]['unite'] if unite == 'hh_mm': quantite = Outils.format_heure(cats['quantite']) else: quantite = cats['quantite'] if montant > 0: dico_cat = {'intitule': Latex.echappe_caracteres(categories.donnees[id_categorie]['intitule']), 'pk': Outils.format_2_dec(cats['pk']), 'unite': Latex.echappe_caracteres(unite), 'quantite': quantite, 'mk': Outils.format_2_dec(montant)} contenu += r''' %(intitule)s & %(unite)s & %(quantite)s & %(pk)s & %(mk)s \\ \hline ''' % dico_cat dico_cat = {'mkj': Outils.format_2_dec(sco['somme_j_mk'])} contenu += r''' \multicolumn{4}{|r|}{Total} & %(mkj)s \\ \hline ''' % dico_cat return Latex.tableau(contenu, structure, legende) else: return ""
def creation_lignes(edition, sommes, clients, generaux, acces, livraisons, comptes, reservations): """ génération des lignes de données du bilan :param edition: paramètres d'édition :param sommes: sommes calculées :param clients: clients importés :param generaux: paramètres généraux :param acces: accès importés :param livraisons: livraisons importées :param comptes: comptes importés :param reservations: réservations importées :return: lignes de données du bilan """ if sommes.calculees == 0: info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer le bilan mensuel" Outils.affiche_message(info) return None lignes = [] for code_client in sorted(sommes.sommes_clients.keys()): scl = sommes.sommes_clients[code_client] client = clients.donnees[code_client] nature = generaux.code_ref_par_code_n(client['nature']) reference = nature + str(edition.annee)[2:] + Outils.mois_string( edition.mois) + "." + code_client if edition.version > 0: reference += "-" + str(edition.version) users, cptes = BilanMensuel.utilisateurs_et_comptes( acces, livraisons, code_client, comptes, reservations) nb_u = len(users) nb_c = len(cptes) rht = client['rh'] * scl['dht'] ligne = [ edition.annee, edition.mois, reference, code_client, client['code_sap'], client['abrev_labo'], client['nom_labo'], 'U', client['nature'], scl['em'], scl['er'], nb_u, nb_c, Outils.format_2_dec(scl['mat']), Outils.format_2_dec(scl['mot']), Outils.format_2_dec(rht), scl['e'], Outils.format_2_dec(scl['r']), Outils.format_2_dec(scl['mt']) ] for categorie in generaux.codes_d3(): ligne.append(Outils.format_2_dec(scl['tot_cat'][categorie])) ligne += [ Outils.format_2_dec(scl['somme_t']), Outils.format_2_dec(scl['somme_t_mb']) ] lignes.append(ligne) return lignes
def table_prix_xaj(scl, generaux, contenu_prix_xaj): """ Prix XA/J - Table Client Récap Articles/Compte :param scl: sommes client calculées :param generaux: paramètres généraux :param contenu_prix_xaj: contenu généré de la table :return: table au format latex """ structure = r'''{|l|l|r|r|''' legende = r'''Récapitulatif des projets''' contenu = r''' \hline Projet & Type & \multicolumn{1}{c|}{Procédés}''' for article in generaux.articles_d3: structure += r'''r|''' contenu += r''' & \multicolumn{1}{c|}{ ''' + Latex.echappe_caracteres(article.intitule_court) + r'''}''' structure += r'''}''' contenu += r'''& \multicolumn{1}{c|}{Total} \\ \hline ''' contenu += contenu_prix_xaj dico = {'procedes': Outils.format_2_dec(scl['mt']), 'total': Outils.format_2_dec((scl['somme_t']-scl['r']-scl['e']))} contenu += r'''Total article & & %(procedes)s''' % dico for categorie in generaux.codes_d3(): contenu += r''' & ''' + Outils.format_2_dec(scl['tot_cat'][categorie]) contenu += r'''& %(total)s \\ \hline ''' % dico return Latex.long_tableau(contenu, structure, legende)
def creation_lignes(edition, sommes, clients, generaux, comptes): """ génération des lignes de données du bilan :param edition: paramètres d'édition :param sommes: sommes calculées :param clients: clients importés :param generaux: paramètres généraux :param comptes: comptes importés :return: lignes de données du bilan """ if sommes.calculees == 0: info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer le bilan des comptes" Outils.affiche_message(info) return None lignes = [] for code_client in sorted(sommes.sommes_clients.keys()): if code_client in sommes.sommes_comptes: client = clients.donnees[code_client] nature = generaux.code_ref_par_code_n(client['nature']) reference = nature + str(edition.annee)[2:] + Outils.mois_string(edition.mois) + "." + code_client if edition.version > 0: reference += "-" + str(edition.version) comptes_utilises = Outils.comptes_in_somme(sommes.sommes_comptes[code_client], comptes) for id_compte, num_compte in sorted(comptes_utilises.items(), key=lambda x: x[1]): compte = comptes.donnees[id_compte] sco = sommes.sommes_comptes[code_client][id_compte] ligne = [edition.annee, edition.mois, reference, code_client, client['code_sap'], client['abrev_labo'], client['nom_labo'], 'U', client['nature'], id_compte, num_compte, compte['intitule'], compte['type_subside'], 0, 0, Outils.format_2_dec(client['rh'] * sco['somme_j_dhi']), Outils.format_2_dec(sco['mj'])] total = sco['mj'] for categorie in generaux.codes_d3(): total += sco['tot_cat'][categorie] ligne.append(Outils.format_2_dec(sco['tot_cat'][categorie])) ligne += [Outils.format_2_dec(total), Outils.format_2_dec(client['bh'] * sco['somme_j_dhi'])] lignes.append(ligne) return lignes
def creation_lignes(subedition, subgeneraux, consolidation): """ génération des lignes de données du bilan :param subedition: paramètres d'édition :param subgeneraux: paramètres généraux :param consolidation: classe de consolidation des données des bilans :return: lignes de données du bilan """ lignes = [] for code_client, client in sorted(consolidation.clients.items()): ligne = [ subedition.annee_fin_general, subedition.mois_fin_general, code_client, client['sap'], client['abrev'], client['nom'], client['type'], client['nature'], client['bonus'], Outils.format_2_dec(client['subs_m']) ] for categorie in subgeneraux.codes_d3(): ligne.append( Outils.format_2_dec(client['subs_' + categorie + 't'])) ligne += [Outils.format_2_dec(client['subs'])] lignes.append(ligne) return lignes
def table_prix_xf(scl, generaux, filtre, contenu_prix_xf): """ Prix XF - Table Client Récap Postes de la facture :param scl: sommes client calculées :param generaux: paramètres généraux :param filtre: si nul pour code n :param contenu_prix_xf: contenu généré de la table :return: table au format latex """ brut = scl['rm'] + scl['somme_t_mm'] + scl['em'] for cat, tt in scl['sommes_cat_m'].items(): brut += tt if scl['somme_t'] > 0 or (filtre == "NON" and brut > 0): structure = r'''{|c|l|r|r|r|}''' legende = r'''Récapitulatif des postes de la facture''' dico = {'emom': Outils.format_2_dec(scl['em']), 'emor': Outils.format_2_dec(scl['er']), 'emo': Outils.format_2_dec(scl['e']), 'resm': Outils.format_2_dec(scl['rm']), 'resr': Outils.format_2_dec(scl['rr']), 'res': Outils.format_2_dec(scl['r']), 'int_emo': Latex.echappe_caracteres(generaux.articles[0].intitule_long), 'int_res': Latex.echappe_caracteres(generaux.articles[1].intitule_long), 'p_emo': generaux.poste_emolument, 'p_res': generaux.poste_reservation} contenu = r''' \hline N. Poste & Poste & \multicolumn{1}{c|}{Montant} & \multicolumn{1}{c|}{Rabais} & \multicolumn{1}{c|}{Total} \\ \hline''' if scl['em'] > 0 and not (filtre == "OUI" and scl['e'] == 0): contenu += r''' %(p_emo)s & %(int_emo)s & %(emom)s & %(emor)s & %(emo)s \\ \hline''' % dico if scl['rm'] > 0 and not (filtre == "OUI" and scl['r'] == 0): contenu += r''' %(p_res)s & %(int_res)s & %(resm)s & %(resr)s & %(res)s \\ \hline ''' % dico contenu += contenu_prix_xf contenu += r'''\multicolumn{4}{|r|}{Total} & ''' + Outils.format_2_dec(scl['somme_t']) + r'''\\ \hline ''' return Latex.long_tableau(contenu, structure, legende) else: return ""
def table_prix_ja(sco, generaux): """ Prix JA - Table Compte Récap Articles :param sco: sommes compte calculées :param generaux: paramètres généraux :return: table au format latex """ structure = r'''{|l|r|r|r|}''' legende = r'''Récapitulatif des articles du projet''' contenu = r''' \cline{2-4} \multicolumn{1}{r|}{} & \multicolumn{1}{c|}{Montant} & \multicolumn{1}{c|}{Rabais} & \multicolumn{1}{c|}{Net} \\ \hline''' if sco['somme_j_mm'] > 0: dico = {'mm': Outils.format_2_dec(sco['somme_j_mm']), 'mr': Outils.format_2_dec(sco['somme_j_mr']), 'mj': Outils.format_2_dec(sco['mj']), 'int_proc': Latex.echappe_caracteres(generaux.articles[2].intitule_long)} contenu += r''' %(int_proc)s & %(mm)s & %(mr)s & %(mj)s \\ \hline ''' % dico total = sco['mj'] for article in generaux.articles_d3: total += sco['tot_cat'][article.code_d] if sco['sommes_cat_m'][article.code_d]: dico = {'intitule': Latex.echappe_caracteres(article.intitule_long), 'cmj': Outils.format_2_dec(sco['sommes_cat_m'][article.code_d]), 'crj': Outils.format_2_dec(sco['sommes_cat_r'][article.code_d]), 'cj': Outils.format_2_dec(sco['tot_cat'][article.code_d])} contenu += r''' %(intitule)s & %(cmj)s & %(crj)s & %(cj)s \\ \hline ''' % dico contenu += r'''\multicolumn{3}{|r|}{Total} & ''' + Outils.format_2_dec(total) + r'''\\ \hline ''' return Latex.tableau(contenu, structure, legende)
def contenu_client(code_client, consolidation, subgeneraux, subedition): """ création du contenu de l'annexe pour un client :param code_client: code du client pour l'annexe :param consolidation: classe de consolidation des données des bilans :param subgeneraux: paramètres généraux :param subedition: paramètres d'édition """ contenu = "" client = consolidation.clients[code_client] reference = "SUBS" + str(subedition.annee_fin_general)[2:] + \ Outils.mois_string(subedition.mois_fin_general) + "." + code_client debut = Outils.mois_nom(subedition.mois_debut_general) + " " + str( subedition.annee_debut_general) fin = Outils.mois_nom(subedition.mois_fin_general) + " " + str( subedition.annee_fin_general) dic_section = { 'code': code_client, 'code_sap': Latex.echappe_caracteres(client['sap']), 'nom': Latex.echappe_caracteres(client['abrev']), 'ref': reference, 'date_debut': debut, 'date_fin': fin } contenu += r''' \fakesection{%(ref)s \hspace*{4cm} Client %(code)s - %(code_sap)s - %(nom)s - %(date_debut)s - %(date_fin)s} {} ''' % dic_section contenu_recap_compte = "" contenu_detail_compte = "" inc_4 = 0 taille_d3 = len(subgeneraux.articles_d3) numbers = {} for id_compte, compte in client['comptes'].items(): numbers[id_compte] = compte['num_compte'] for id_compte, num_compte in sorted(numbers.items(), key=lambda x: x[1]): compte = client['comptes'][id_compte] # ## COMPTE # ## ligne 3 if compte['subs'] > 0: dico_recap_compte = { 'numero': num_compte, 'intitule': Latex.echappe_caracteres(compte['intitule']), 'code': Latex.echappe_caracteres(compte['id_sub']), 'type_s': Latex.echappe_caracteres(compte['type_s']), 'type_p': Latex.echappe_caracteres(compte['type_p']), 'montant': Outils.format_2_dec(compte['subs']) } contenu_recap_compte += r''' %(numero)s & %(intitule)s & %(code)s & %(type_s)s & %(type_p)s & %(montant)s \\ \hline ''' % dico_recap_compte # ## partie 4 if compte['subs'] > 0: dico_detail_compte = { 'taille': (4 + taille_d3), 'numero': num_compte, 'intitule': Latex.echappe_caracteres(compte['intitule']), 'type': Latex.echappe_caracteres(compte['type']) } if inc_4 > 0: contenu_detail_compte += r''' \multicolumn{%(taille)s}{c}{} \\ \noalign{\penalty-5000} ''' % dico_detail_compte else: inc_4 = 1 contenu_detail_compte += r''' \hline \multicolumn{%(taille)s}{|c|}{%(numero)s - %(intitule)s - %(type)s} \\* \hline Année & Mois & \multicolumn{1}{c|}{Coûts Procédés} ''' % dico_detail_compte for article in subgeneraux.articles_d3: contenu_detail_compte += r''' & \multicolumn{1}{c|}{ ''' + Latex.echappe_caracteres( article.intitule_court) + r'''}''' for a, annee in sorted(compte['annees'].items()): for m, mois in sorted(annee['mois'].items()): dico = { 'annee': a, 'mois': m, 'mj': Outils.format_2_dec(mois['mj']) } contenu_detail_compte += r'''\\* \hline %(annee)s & %(mois)s & %(mj)s ''' % dico for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec( mois[d3 + 'j']) dico_detail_compte = { 'm_mois': compte['m_mois'], 'm_compte': compte['m_compte'], 'mt': Outils.format_2_dec(compte['mt']), 'mt_p': Outils.format_2_dec(compte['mt_p']), 's-mt': Outils.format_2_dec(compte['s-mt']) } contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Total période} & %(mt)s ''' % dico_detail_compte for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec(compte[d3 + 't']) contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Plafond par mois} & %(m_mois)s ''' % dico_detail_compte for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec(compte[d3 + '_mois']) contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Total des montants plafonnés} & %(mt_p)s ''' % dico_detail_compte for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec(compte[d3 + 't_p']) contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Plafond par compte} & %(m_compte)s ''' % dico_detail_compte for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec(compte[d3 + '_compte']) contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Subsides} & %(s-mt)s ''' % dico_detail_compte for d3 in subgeneraux.codes_d3(): contenu_detail_compte += r''' & ''' + Outils.format_2_dec(compte['s-' + d3 + 't']) dico_detail_compte = { 'taille': (2 + len(subgeneraux.articles_d3)), 'subs': Outils.format_2_dec(compte['subs']) } contenu_detail_compte += r'''\\* \hline \multicolumn{2}{|l|}{Total subsides} & \multicolumn{%(taille)s}{r|}{%(subs)s} \\ \hline ''' % dico_detail_compte # ## 1 structure_total = r'''{|c|l|l|r|}''' contenu_total = r''' \hline Code OP & \multicolumn{1}{c|}{Poste} & \multicolumn{1}{c|}{Prestation} & \multicolumn{1}{c|}{Montant} \\ \hline ''' base = client['nature'] + str(subedition.annee_fin_general)[2:] + \ Outils.mois_string(subedition.mois_fin_general) if client['bonus'] > 0: poste = Latex.echappe_caracteres( subgeneraux.article_t_indice('2').texte_t_long) prestation = Latex.echappe_caracteres( subgeneraux.articles[0].intitule_long) op = subgeneraux.article_t_indice( '2').code_t + base + subgeneraux.articles[0].code_d dico = { 'op': op, 'poste': poste, 'prestation': prestation, 'montant': Outils.format_2_dec(client['bonus']) } contenu_total += r''' %(op)s & %(poste)s & %(prestation)s & %(montant)s \\ \hline ''' % dico for t3, client_t3 in sorted(client['codes'].items()): poste = subgeneraux.article_t(t3).texte_t_long if client_t3['sm'] > 0: prestation = Latex.echappe_caracteres( subgeneraux.articles[0].intitule_long) op = t3 + base + subgeneraux.articles[0].code_d dico = { 'op': op, 'poste': poste, 'prestation': prestation, 'montant': Outils.format_2_dec(client_t3['sm']) } contenu_total += r''' %(op)s & %(poste)s & %(prestation)s & %(montant)s \\ \hline ''' % dico for article in subgeneraux.articles_d3: if client_t3['s' + article.code_d] > 0: prestation = Latex.echappe_caracteres( article.intitule_long) op = t3 + base + article.code_d dico = { 'op': op, 'poste': poste, 'prestation': prestation, 'montant': Outils.format_2_dec(client_t3['s' + article.code_d]) } contenu_total += r''' %(op)s & %(poste)s & %(prestation)s & %(montant)s \\ \hline ''' % dico total = Outils.format_2_dec(client['subs'] + client['bonus']) contenu_total += r''' \multicolumn{3}{|r|}{TOTAL} & ''' + total + r''' \\ \hline ''' legende_total = r'''Table 1 - Récapitulatif des bonus et subsides''' contenu += Latex.tableau(contenu_total, structure_total, legende_total) # ## 2 if client['bonus'] > 0: structure_bonus = r'''{|c|c|l|r|}''' contenu_bonus = r''' \hline Année & Mois & \multicolumn{1}{c|}{Code} & \multicolumn{1}{c|}{Montant} \\ \hline ''' for a, annee in sorted(client['annees'].items()): for m, mois in sorted(annee['mois'].items()): code = Latex.echappe_caracteres( subgeneraux.article_t_indice('2').texte_t_court) dico = { 'annee': a, 'mois': m, 'bj': mois['bj'], 'code': code } contenu_bonus += r''' %(annee)s & %(mois)s & %(code)s & %(bj)s \\ \hline ''' % dico contenu_bonus += r''' \multicolumn{3}{|r|}{TOTAL} & ''' + str( client['bonus']) + r''' \\ \hline ''' legende_bonus = r'''Table 2 - Bonus d'utilisation en heures creuses''' contenu += Latex.tableau(contenu_bonus, structure_bonus, legende_bonus) else: contenu += Latex.tableau_vide( r'''Table 2 vide : Pas de bonus d'utilisation en heures creuses''' ) if client['subs'] > 0: # ## 3 structure_recap = r'''{|r|l|l|l|l|r|}''' contenu_recap = r''' \hline \multicolumn{1}{|c|}{N. compte} & \multicolumn{1}{c|}{Intitulé compte} & \multicolumn{1}{c|}{Code} & \multicolumn{1}{c|}{Type Subsides} & \multicolumn{1}{c|}{Type projet} & \multicolumn{1}{c|}{Montant} \\ \hline ''' contenu_recap += contenu_recap_compte contenu_recap += r''' \multicolumn{5}{|r|}{TOTAL} & ''' + Outils.format_2_dec( client['subs']) + r''' \\ \hline ''' legende_recap = r'''Table 3 - Récapitulatif des subsides par compte''' contenu += Latex.tableau(contenu_recap, structure_recap, legende_recap) # ## 4 structure_detail = r'''{|>{\centering}p{1.5cm}|c|r|r|''' for i in range(taille_d3): structure_detail += r'''r|''' structure_detail += r'''}''' legende_detail = r'''Table 4 - Détail des subsides''' contenu += Latex.long_tableau(contenu_detail_compte, structure_detail, legende_detail) else: contenu += Latex.tableau_vide( r'''Table 3 vide : Pas de subsides''') return contenu
def annexes(sommes, clients, edition, livraisons, acces, machines, reservations, comptes, paramannexe, generaux, users, categories, docpdf): """ création des annexes :param sommes: sommes calculées :param clients: clients importés :param edition: paramètres d'édition :param livraisons: livraisons importées :param acces: accès importés :param machines: machines importées :param reservations: réservations importées :param comptes: comptes importés :param paramannexe: paramètres d'annexe :param generaux: paramètres généraux :param users: users importés :param categories: catégories importées :param docpdf: paramètres d'ajout de document pdf """ if sommes.calculees == 0: info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer les annexes" Outils.affiche_message(info) return for code_client, scl in sommes.sommes_clients.items(): code_client = Latex.echappe_caracteres(code_client) client = clients.donnees[code_client] nature = Latex.echappe_caracteres( generaux.code_ref_par_code_n(client['nature'])) av_hc = Latex.echappe_caracteres( generaux.avantage_hc_par_code_n(client['nature'])) reference = nature + str(edition.annee)[2:] + Outils.mois_string( edition.mois) + "." + code_client if edition.version > 0: reference += "-" + str(edition.version) filtre = generaux.filtrer_article_nul_par_code_n(client['nature']) contenu_prix_xaj = "" contenu_prix_xf = "" inc_fact = 1 contenu_prix_lvr_xdj_tab = {} for article in generaux.articles_d3: contenu_prix_lvr_xdj_tab[article.code_d] = "" contenu_projets = "" contenu_details = "" todo = {} for donnee in paramannexe.donnees: if generaux.code_ref_par_code_n(client['nature']) == "INT": todo[donnee['nom']] = donnee['int'] elif client['mode'] == "MAIL": todo[donnee['nom']] = donnee['ext_mail'] else: todo[donnee['nom']] = donnee['ext_postal'] if code_client in sommes.sommes_comptes: comptes_utilises = Outils.comptes_in_somme( sommes.sommes_comptes[code_client], comptes) for id_compte, num_compte in sorted(comptes_utilises.items(), key=lambda x: x[1]): id_compte = Latex.echappe_caracteres(id_compte) # ## COMPTE sco = sommes.sommes_comptes[code_client][id_compte] compte = comptes.donnees[id_compte] intitule_compte = Latex.echappe_caracteres( compte['numero'] + " - " + compte['intitule']) # ## ligne Prix XF - Table Client Récap Postes de la facture if sco['c1'] > 0 and not (filtre == "OUI" and sco['c2'] == 0): poste = inc_fact * 10 intitule = Latex.echappe_caracteres( intitule_compte + " - " + generaux.articles[2].intitule_long) if sco['somme_j_mm'] > 0 and not (filtre == "OUI" and sco['mj'] == 0): dico_prix_xf = { 'intitule': intitule, 'poste': str(poste), 'mm': Outils.format_2_dec(sco['somme_j_mm']), 'mr': Outils.format_2_dec(sco['somme_j_mr']), 'mj': Outils.format_2_dec(sco['mj']) } contenu_prix_xf += r''' %(poste)s & %(intitule)s & %(mm)s & %(mr)s & %(mj)s \\ \hline ''' % dico_prix_xf poste += 1 for article in generaux.articles_d3: categorie = article.code_d if sco['sommes_cat_m'][categorie] > 0 and not ( filtre == "OUI" and sco['tot_cat'][article.code_d] == 0): intitule = Latex.echappe_caracteres( intitule_compte + " - " + article.intitule_long) dico_prix_xf = { 'intitule': intitule, 'poste': str(poste), 'mm': Outils.format_2_dec( sco['sommes_cat_m'][article.code_d]), 'mr': Outils.format_2_dec( sco['sommes_cat_r'][article.code_d]), 'mj': Outils.format_2_dec( sco['tot_cat'][article.code_d]) } contenu_prix_xf += r''' %(poste)s & %(intitule)s & %(mm)s & %(mr)s & %(mj)s \\ \hline ''' % dico_prix_xf poste += 1 inc_fact += 1 # ## ligne Prix XA/J - Table Client Récap Articles/Compte total = sco['mj'] dico_prix_xaj = { 'compte': intitule_compte, 'type': Latex.echappe_caracteres(compte['type_subside']), 'procede': Outils.format_2_dec(sco['mj']) } ligne = r'''%(compte)s & %(type)s & %(procede)s ''' % dico_prix_xaj for categorie in generaux.codes_d3(): total += sco['tot_cat'][categorie] ligne += r''' & ''' + Outils.format_2_dec( sco['tot_cat'][categorie]) if total > 0: dico_prix_xaj['total'] = Outils.format_2_dec(total) ligne += r'''& %(total)s \\ \hline ''' % dico_prix_xaj contenu_prix_xaj += ligne # ## ligne Prix LVR X/D/J - Table Client Récap Prestations livr./code D/Compte if code_client in livraisons.sommes and id_compte in livraisons.sommes[ code_client]: for article in generaux.articles_d3: if article.code_d in livraisons.sommes[ code_client][id_compte]: if contenu_prix_lvr_xdj_tab[ article.code_d] == "": contenu_prix_lvr_xdj_tab[ article.code_d] = r''' \cline{2-4} \multicolumn{1}{c}{} & \multicolumn{3}{|c|}{ ''' + Latex.echappe_caracteres( article.intitule_long) + r'''} \\ \hline Compte & Montant & Rabais & Montant net \\ \hline ''' dico_prest_client = { 'intitule': intitule_compte, 'cmj': Outils.format_2_dec( sco['sommes_cat_m'][article.code_d]), 'crj': Outils.format_2_dec( sco['sommes_cat_r'][article.code_d]), 'cj': Outils.format_2_dec( sco['tot_cat'][article.code_d]) } contenu_prix_lvr_xdj_tab[ article.code_d] += r''' %(intitule)s & %(cmj)s & %(crj)s & %(cj)s \\ \hline ''' % dico_prest_client # ## ann_pro_titre = "Récapitulatif du projet : " + intitule_compte contenu_projets += Annexes.titre_annexe( client, edition, generaux, reference, ann_pro_titre, "Annexe facture") contenu_projets += Annexes.section(client, generaux, reference, ann_pro_titre) contenu_projets += TablesAnnexes.table_prix_ja( sco, generaux) contenu_projets += TablesAnnexes.table_prix_cae_jk( code_client, id_compte, intitule_compte, sco, acces.sommes, categories) contenu_projets += TablesAnnexes.table_prix_lvr_jd( code_client, id_compte, intitule_compte, sco, livraisons.sommes, generaux) if av_hc == "RABAIS": contenu_projets += TablesAnnexes.table_prix_jdmu( code_client, id_compte, intitule_compte, sco, acces.sommes, machines, users) contenu_projets += r'''\clearpage''' ann_det_titre = "Annexe détaillée du projet : " + intitule_compte contenu_details += Annexes.titre_annexe( client, edition, generaux, reference, ann_det_titre, "Annexe facture") contenu_details += Annexes.section(client, generaux, reference, ann_det_titre) contenu_details += TablesAnnexes.table_tps_cae_jkmu( code_client, id_compte, intitule_compte, users, machines, categories, acces) if code_client in livraisons.sommes and id_compte in livraisons.sommes[ code_client]: contenu_details += TablesAnnexes.table_qte_lvr_jdu( code_client, id_compte, intitule_compte, generaux, livraisons, users) contenu_details += r'''\clearpage''' # ## compte contenu_cae_xmu = TablesAnnexes.contenu_tps_m_cae_xmu( code_client, scl, acces.sommes, machines, users, comptes) suffixe = "_" + str(edition.annee) + "_" + Outils.mois_string( edition.mois) + "_" suffixe += str(edition.version) + "_" + code_client # ## Début des tableaux pdfs_annexes = {} if scl['somme_t'] > 0: if todo['Annexe-client'] != "NO": contenu_annexe_client = Annexes.entete(edition) contenu_annexe_client += Annexes.titre_annexe( client, edition, generaux, reference, "Récapitulatif pour le client", "Annexe facture") contenu_annexe_client += Annexes.section( client, generaux, reference, "Récapitulatif pour le client") contenu_annexe_client += TablesAnnexes.table_prix_xf( scl, generaux, filtre, contenu_prix_xf) contenu_annexe_client += TablesAnnexes.table_prix_xaj( scl, generaux, contenu_prix_xaj) if av_hc == "BONUS": contenu_annexe_client += TablesAnnexes.table_points_xbmu( code_client, scl, acces.sommes, machines, users) contenu_annexe_client += TablesAnnexes.table_prix_xrmu( code_client, scl, reservations.sommes, machines, users) contenu_annexe_client += r'''\end{document}''' Latex.creer_latex_pdf('Annexe-client' + suffixe, contenu_annexe_client) pdfs_annexes['Annexe-client'] = [ 'Annexe-client' + suffixe + ".pdf" ] if not contenu_projets == "" and todo['Annexe-projets'] != "NO": contenu_annexe_projets = Annexes.entete(edition) contenu_annexe_projets += contenu_projets contenu_annexe_projets += r'''\end{document}''' Latex.creer_latex_pdf('Annexe-projets' + suffixe, contenu_annexe_projets) pdfs_annexes['Annexe-projets'] = [ 'Annexe-projets' + suffixe + ".pdf" ] if todo['Annexe-détails'] != "NO": contenu_details_2 = "" if code_client in reservations.sommes or contenu_cae_xmu != "": contenu_details_2 += Annexes.titre_annexe( client, edition, generaux, reference, "Annexe détaillée des pénalités de réservation", "Annexe facture") contenu_details_2 += Annexes.section( client, generaux, reference, "Annexe détaillée des pénalités de réservation") contenu_details_2 += TablesAnnexes.table_tps_penares_xmu( code_client, scl, acces.sommes, reservations.sommes, machines, users) contenu_details_2 += TablesAnnexes.table_tps_m_cae_xmu( code_client, acces, contenu_cae_xmu) contenu_details_2 += TablesAnnexes.table_tps_res_xmu( code_client, reservations, machines, users) if not contenu_details == "" or not contenu_details_2 == "": contenu_annexe_details = Annexes.entete(edition) contenu_annexe_details += contenu_details contenu_annexe_details += contenu_details_2 contenu_annexe_details += r'''\end{document}''' Latex.creer_latex_pdf('Annexe-détails' + suffixe, contenu_annexe_details) pdfs_annexes['Annexe-détails'] = [ 'Annexe-détails' + suffixe + ".pdf" ] if docpdf is not None and todo['Annexe-pièces'] != "NO": pdfs = docpdf.pdfs_pour_client(client, 'Annexe-pièces') if pdfs is not None and len(pdfs) > 0: nom_pdf = 'Annexe-pièces' + suffixe pieces = [nom_pdf + '.pdf'] texte = "" for pos, docs in sorted(pdfs.items()): for doc in docs: texte += str(pos) + r''' \hspace*{5cm} ''' + Latex.echappe_caracteres( doc['nom']) + r''' \\ ''' pieces.append(doc['chemin']) contenu_annexe_pieces = Annexes.entete(edition) contenu_annexe_pieces += Annexes.titre_annexe( client, edition, generaux, reference, "Documents contractuels et informatifs", "Annexe facture") contenu_annexe_pieces += Annexes.section( client, generaux, reference, "Documents contractuels et informatifs") contenu_annexe_pieces += texte contenu_annexe_pieces += r'''\end{document}''' Latex.creer_latex_pdf(nom_pdf, contenu_annexe_pieces) pdfs_annexes['Annexe-pièces'] = pieces if docpdf is not None and todo['Annexe-interne'] != "NO": pdfs = docpdf.pdfs_pour_client(client, 'Annexe-interne') if pdfs is not None and len(pdfs) > 0: nom_pdf = 'Annexe-interne-anntemp' pieces = [nom_pdf + '.pdf'] texte = "" for pos, docs in sorted(pdfs.items()): for doc in docs: texte += str(pos) + r''' \hspace*{5cm} ''' + Latex.echappe_caracteres( doc['nom']) + r''' \\ ''' pieces.append(doc['chemin']) contenu_annexe_interne_a = Annexes.entete(edition) contenu_annexe_interne_a += Annexes.titre_annexe( client, edition, generaux, reference, "Documents contractuels et informatifs", "Annexe interne") contenu_annexe_interne_a += Annexes.section( client, generaux, reference, "Annexe interne / Documents contractuels et informatifs" ) contenu_annexe_interne_a += texte contenu_annexe_interne_a += r'''\end{document}''' Latex.creer_latex_pdf(nom_pdf, contenu_annexe_interne_a) pdfs_annexes['Annexe-interne'] = pieces for donnee in paramannexe.donnees: if donnee['nom'] in pdfs_annexes: if len(pdfs_annexes[donnee['nom']]) > 1: Latex.concatenation_pdfs(donnee['nom'] + suffixe, pdfs_annexes[donnee['nom']]) Latex.finaliser_pdf(donnee['nom'] + suffixe, donnee['chemin']) if donnee['nom'] == 'Annexe-projets': lignes = RecaProjet.creation_lignes( edition, sommes.sommes_comptes[code_client], client, generaux, acces, livraisons, comptes, categories) RecaProjet.recap(donnee['dossier_pdf'], donnee['nom'] + suffixe, lignes) files = [f for f in os.listdir('.') if os.path.isfile(f)] for f in files: if f.endswith('anntemp.pdf'): os.unlink(f)
def table_prix_xrmu(code_client, scl, sommes_reservations, machines, users): """ Prix XR/M/U - Table Client Récap Pénalités Réservations/Machine/user :param code_client: code du client concerné :param scl: sommes client calculées :param sommes_reservations: sommes des réservations importées :param machines: machines importées :param users: users importés :return: table au format latex """ if scl['rm'] > 0: structure = r'''{|l|c|c|r|r|}''' legende = r'''Récapitulatif des pénalités de réservation''' contenu = r''' \cline{3-5} \multicolumn{2}{l|}{} & \multicolumn{1}{c|}{Pénalités} & \multicolumn{1}{c|}{PU} & \multicolumn{1}{c|}{Montant} \\ \cline{3-5} \multicolumn{2}{l|}{} & \multicolumn{1}{c|}{Durée} & \multicolumn{1}{c|}{CHF/h} & \multicolumn{1}{c|}{CHF} \\ \hline ''' somme = sommes_reservations[code_client] machines_reservees = Outils.machines_in_somme(somme, machines) for id_categorie, mics in sorted(machines_reservees.items()): for nom_machine, id_machine in sorted(mics.items()): scm = scl['res'][id_machine] contenu_hp = "" contenu_hc = "" dico_machine = {'machine': Latex.echappe_caracteres(nom_machine), 'duree_hp': Outils.format_heure(scm['tot_hp']), 'pu_hp': Outils.format_2_dec(somme[id_machine]['pu_hp']), 'montant_hp': Outils.format_2_dec(scm['mont_hp']), 'duree_hc': Outils.format_heure(scm['tot_hc']), 'pu_hc': Outils.format_2_dec(somme[id_machine]['pu_hc']), 'montant_hc': Outils.format_2_dec(scm['mont_hc'])} if scm['mont_hp'] > 0: contenu_hp += r''' %(machine)s & HP & %(duree_hp)s & %(pu_hp)s & %(montant_hp)s \\ \hline ''' % dico_machine if scm['mont_hc'] > 0: contenu_hc += r''' %(machine)s & HC & %(duree_hc)s & %(pu_hc)s & %(montant_hc)s \\ \hline ''' % dico_machine utilisateurs = Outils.utilisateurs_in_somme(somme[id_machine]['users'], users) for nom, upi in sorted(utilisateurs.items()): for prenom, ids in sorted(upi.items()): for id_user in sorted(ids): smu = scm['users'][id_user] dico_user = {'user': Latex.echappe_caracteres(nom + " " + prenom), 'duree_hp': Outils.format_heure(smu['tot_hp']), 'duree_hc': Outils.format_heure(smu['tot_hc'])} if scm['mont_hp'] > 0 and smu['tot_hp'] > 0: contenu_hp += r''' \hspace{5mm} %(user)s & HP & %(duree_hp)s \hspace{5mm} & & \\ \hline ''' % dico_user if scm['mont_hc'] > 0 and smu['tot_hc'] > 0: contenu_hc += r''' \hspace{5mm} %(user)s & HC & %(duree_hc)s \hspace{5mm} & & \\ \hline ''' % dico_user contenu += contenu_hp contenu += contenu_hc dico = {'penalite_d': Outils.format_2_dec(scl['rm_d']), 'penalite': Outils.format_2_dec(scl['rm']), 'rabais': Outils.format_2_dec(scl['rr']), 'total': Outils.format_2_dec(scl['r'])} contenu += r''' \multicolumn{4}{|r|}{Arrondi} & %(penalite_d)s \\ \hline \multicolumn{4}{|r|}{Total} & %(penalite)s \\ \hline \multicolumn{4}{|r|}{Rabais} & %(rabais)s \\ \hline \multicolumn{4}{|r|}{\textbf{Total à payer}} & %(total)s \\ \hline ''' % dico return Latex.long_tableau(contenu, structure, legende) else: return ""
def table_prix_jdmu(code_client, id_compte, intitule_compte, sco, sommes_acces, machines, users): """ Prix JD/M/U - Table Compte Déductions HC (Rabais) par Machine :param code_client: code du client concerné :param id_compte: id du compte concerné :param intitule_compte: intitulé du compte concerné :param sco: sommes compte calculées :param sommes_acces: sommes des accès importés :param machines: machines importées :param users: users importés :return: table au format latex """ if sco['somme_j_dhi'] > 0 and code_client in sommes_acces and id_compte in sommes_acces[code_client]['comptes']: structure = r'''{|l|c|r|r|}''' legende = r'''Rabais d’utilisation de machines en heures creuses''' contenu = r''' \hline \multicolumn{2}{|l|}{\textbf{''' + intitule_compte + r'''}} & \multicolumn{1}{c|}{Temps Mach.} & \multicolumn{1}{c|}{Rabais (CHF)} \\ \hline ''' somme = sommes_acces[code_client]['comptes'][id_compte] machines_utilisees = Outils.machines_in_somme(somme, machines) for id_categorie, mics in sorted(machines_utilisees.items()): for nom_machine, id_machine in sorted(mics.items()): if somme[id_machine]['dhi'] > 0: dico_machine = {'machine': Latex.echappe_caracteres(nom_machine), 'hc': Outils.format_heure(somme[id_machine]['duree_hc']), 'dhi': Outils.format_2_dec(somme[id_machine]['dhi'])} contenu += r''' \hspace{2mm} %(machine)s & HC & %(hc)s & %(dhi)s \\ \hline ''' % dico_machine utilisateurs = Outils.utilisateurs_in_somme(somme[id_machine]['users'], users) for nom, upi in sorted(utilisateurs.items()): for prenom, ids in sorted(upi.items()): for id_user in sorted(ids): smu = somme[id_machine]['users'][id_user] if smu['duree_hc'] > 0: dico_user = {'user': Latex.echappe_caracteres(nom + " " + prenom), 'hc': Outils.format_heure(smu['duree_hc'])} contenu += r''' \hspace{5mm} %(user)s & HC & %(hc)s \hspace{5mm} & \\ \hline ''' % dico_user dico = {'rabais_d': Outils.format_2_dec(sco['somme_j_dhi_d']), 'rabais': Outils.format_2_dec(sco['somme_j_dhi'])} contenu += r''' \multicolumn{3}{|r|}{Arrondi} & %(rabais_d)s \\ \hline \multicolumn{3}{|r|}{Total} & %(rabais)s \\ \hline ''' % dico return Latex.long_tableau(contenu, structure, legende) else: return ""
def table_qte_lvr_jdu(code_client, id_compte, intitule_compte, generaux, livraisons, users): """ Qté LVR J/D/U - Table Compte Détail Quantités livrées/Prestation (code D)/User :param code_client: code du client concerné :param id_compte: id du compte concerné :param intitule_compte: intitulé du compte concerné :param generaux: paramètres généraux :param livraisons: livraisons importées :param users: users importés :return: table au format latex """ structure = r'''{|l|c|c|c|}''' legende = r'''Détails des prestations livrées''' contenu = r''' ''' i = 0 somme = livraisons.sommes[code_client][id_compte] for article in generaux.articles_d3: if article.code_d in somme: if i == 0: i += 1 else: contenu += r'''\multicolumn{4}{c}{} \\ ''' contenu += r''' \hline \multicolumn{1}{|l|}{ \textbf{''' + intitule_compte + " - " + Latex.echappe_caracteres(article.intitule_long) + r''' }} & Quantité & Unité & Rabais \\ \hline ''' for no_prestation, sip in sorted(somme[article.code_d].items()): dico_prestations = {'nom': Latex.echappe_caracteres(sip['nom']), 'num': no_prestation, 'quantite': "%.1f" % sip['quantite'], 'unite': Latex.echappe_caracteres(sip['unite']), 'rabais': Outils.format_2_dec(sip['rabais'])} contenu += r''' %(num)s - %(nom)s & \hspace{5mm} %(quantite)s & %(unite)s & \hspace{5mm} %(rabais)s \\ \hline ''' % dico_prestations utilisateurs = Outils.utilisateurs_in_somme(sip['users'], users) for nom, upi in sorted(utilisateurs.items()): for prenom, ids in sorted(upi.items()): for id_user in sorted(ids): spu = sip['users'][id_user] dico_user = {'user': Latex.echappe_caracteres(nom + " " + prenom), 'quantite': "%.1f" % spu['quantite'], 'unite': Latex.echappe_caracteres(sip['unite']), 'rabais': Outils.format_2_dec(spu['rabais'])} contenu += r''' \hspace{5mm} %(user)s & %(quantite)s & %(unite)s & %(rabais)s \\ \hline ''' % dico_user for pos in spu['data']: liv = livraisons.donnees[pos] rem = "" dl = "" if liv['remarque'] != "": rem = "; Remarque : " + liv['remarque'] if liv['date_livraison'] != "": dl = "Dt livraison: " + liv['date_livraison'] + ";" op = users.donnees[liv['id_operateur']] dico_pos = {'date_liv': Latex.echappe_caracteres(dl), 'quantite': "%.1f" % liv['quantite'], 'rabais': Outils.format_2_dec(liv['rabais_r']), 'id': Latex.echappe_caracteres(liv['id_livraison']), 'unite': Latex.echappe_caracteres(sip['unite']), 'responsable': Latex.echappe_caracteres(op['prenom'] + " " + op['nom']), 'commande': Latex.echappe_caracteres(liv['date_commande']), 'remarque': Latex.echappe_caracteres(rem)} contenu += r''' \hspace{10mm} %(date_liv)s N. livraison: %(id)s & %(quantite)s \hspace{5mm} & %(unite)s & %(rabais)s \hspace{5mm} \\ \hspace{10mm} \scalebox{.8}{Commande: %(commande)s; Resp: %(responsable)s%(remarque)s} & & & \\ \hline ''' % dico_pos return Latex.long_tableau(contenu, structure, legende)