示例#1
0
    def mise_a_jour(edition, clients, dossier_source, dossier_destination, maj, f_html_sections):
        """
        modification des résumés mensuels au niveau du client dont la facture est modifiée 
        :param edition: paramètres d'édition
        :param clients: clients importés
        :param dossier_source: Une instance de la classe dossier.DossierSource
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param maj: données modifiées pour le client pour les différents fichiers
        :param f_html_sections: section html modifiée pour le client
        """
        if len(maj) != len(Resumes.fichiers):
            info = "Résumés : erreur taille tableau"
            Outils.affiche_message(info)
            return

        for i in range(len(Resumes.fichiers)):
            fichier_complet = Resumes.fichiers[i] + "_" + str(edition.annee) + "_" + \
                              Outils.mois_string(edition.mois) + ".csv"
            donnees_csv = Resumes.ouvrir_csv_sans_client(
                dossier_source, fichier_complet, edition.client_unique, Resumes.positions[i])
            with dossier_destination.writer(fichier_complet) as fichier_writer:
                for ligne in donnees_csv:
                    fichier_writer.writerow(ligne)
                for ligne in maj[i]:
                    fichier_writer.writerow(ligne)

        ticket_complet = "ticket_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + ".html"
        section = list(f_html_sections.values())[0]
        nom_client = clients.donnees[edition.client_unique]['abrev_labo'] + " (" + edition.client_unique + ")"
        Resumes.maj_ticket(dossier_source, dossier_destination, ticket_complet, section, edition.client_unique,
                           nom_client)
示例#2
0
    def annuler(suffixe, client_unique, mois, annee, dossier_source,
                dossier_destination, dossier_source_backup):
        """
        annulation de modification des résumés mensuels au niveau du client dont la facture est supprimée
        :param suffixe: suffixe dossier version
        :param client_unique: client concerné
        :param mois: mois concerné
        :param annee: année concernée
        :param dossier_source: Une instance de la classe dossier.DossierSource
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param dossier_source_backup: Une instance de la classe dossier.DossierSource pour récupérer les
                                        données à remettre
        """
        for i in range(len(Resumes.fichiers)):
            fichier_backup = Resumes.fichiers[i] + "_" + str(
                annee) + "_" + Outils.mois_string(mois) + suffixe + ".csv"
            donnees_backup = Resumes.ouvrir_csv_seulement_client(
                dossier_source_backup, fichier_backup, client_unique,
                Resumes.positions[i])

            fichier_complet = Resumes.fichiers[i] + "_" + str(
                annee) + "_" + Outils.mois_string(mois) + ".csv"
            donnees_csv = Resumes.ouvrir_csv_sans_client(
                dossier_source, fichier_complet, client_unique,
                Resumes.positions[i])
            with dossier_destination.writer(fichier_complet) as fichier_writer:
                for ligne in donnees_csv:
                    fichier_writer.writerow(ligne)
                for ligne in donnees_backup:
                    fichier_writer.writerow(ligne)

        ticket_backup = "ticket_" + str(annee) + "_" + Outils.mois_string(
            mois) + suffixe + ".html"
        ticket_backup_texte = dossier_source_backup.string_lire(ticket_backup)
        index1, index2 = Resumes.section_position(ticket_backup_texte,
                                                  client_unique)
        section = ""
        if index1 is not None:
            section = ticket_backup_texte[index1:index2]

        nom_client = ""
        index1, index2, clients_liste_backup = Resumes.select_clients(
            ticket_backup_texte)
        for nom in clients_liste_backup:
            if client_unique in nom:
                nom_client = nom
                break
        ticket_complet = "ticket_" + str(annee) + "_" + Outils.mois_string(
            mois) + ".html"

        Resumes.maj_ticket(dossier_source, dossier_destination, ticket_complet,
                           section, client_unique, nom_client)
示例#3
0
 def base(edition, dossier_source, dossier_destination):
     """
     création des résumés statistiques mensuels
     :param edition: paramètres d'édition
     :param dossier_source: Une instance de la classe dossier.DossierSource
     :param dossier_destination: Une instance de la classe dossier.DossierDestination
     """
     for fichier in Resumes.fichiers:
         fichier_complet = fichier + "_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois)
         dossier_destination.ecrire(fichier_complet + ".csv", dossier_source.lire(fichier_complet + "_0.csv"))
     ticket_complet = "ticket_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois)
     ticket_texte = dossier_source.string_lire(ticket_complet + "_0.html")
     ticket_texte = ticket_texte.replace("..", ".")
     dossier_destination.string_ecrire(ticket_complet + ".html", ticket_texte)
示例#4
0
    def cae(dossier_destination, edition, lignes):
        """
        création du récapitulatif des accès machines
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param lignes: lignes de données du récapitulatif
        """

        nom = "cae_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                edition.annee, edition.mois, "Id-Compte", "Numéro de compte",
                "Intitulé compte", "Code Type Compte", "Code Type Subsides",
                "Code Client Facture", "Abrev. Labo", "Id-User", "Nom User",
                "Prénom User", "Id-Machine", "Nom Machine", "Id-Categ-cout",
                "Intitulé catégorie coût", "Date et Heure login",
                "Durée machine HP", "Durée machine HC", "Durée opérateur",
                "Id-Opérateur", "Prénom Nom opérateur", "Remarque opérateur",
                "Remarque staff"
            ]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#5
0
    def lvr(dossier_destination, edition, lignes):
        """
        création du récapitulatif des livraisons
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param lignes: lignes de données du récapitulatif
        """
        nom = "lvr_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                edition.annee, edition.mois, "Id-Compte", "Numéro de compte",
                "Intitulé compte", "Code Type Compte", "Code Type Subsides",
                "Code Client Facture", "Abrev. Labo", "Id-User", "Nom User",
                "Prénom User", "Id-Prestation", "Numéro de prestation",
                "Désignation prestation", "Date de livraison",
                "Quantité livrée", "Unité de livraison", "Rabais [CHF]",
                "ID-Opérateur", "Opérateur", "ID-Livraison",
                "Date et Heure de la commande",
                "Date et Heure de la prise en charge", "Remarque"
            ]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#6
0
    def nos(dossier_destination, edition, lignes):
        """
        création du récapitulatif des no show
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param lignes: lignes de données du récapitulatif
        """
        nom = "noshow_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                edition.annee, edition.mois, "Date et Heure début de slot",
                "HP/HC", "Id-Machine", "Nom Machine", "Id-Categ-cout",
                "Intitulé catégorie coût", "Id-User", "Nom User",
                "Prénom User", "Id-Compte", "Numéro de compte",
                "Intitulé compte", "Code Client Facture", "Abrev. Labo",
                "Nb heures pénalité"
            ]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#7
0
    def ligne_facture(generaux, article, poste, net, rabais, op_centre, consommateur, edition):
        """
        retourne une ligne de facturation formatée

        :param generaux: paramètres généraux
        :param article: Une instance de la classe generaux.Article
        :param poste: indice de poste
        :param net: montant net
        :param rabais: rabais sur le montant
        :param op_centre: centre d'opération
        :param consommateur: consommateur
        :param edition: paramètres d'édition
        :return: ligne de facturation formatée
        """
        net = "%.2f" % net
        rabais = "%.2f" % rabais
        if rabais == 0:
            rabais = ""
        code_op = generaux.code_t + op_centre + article.code_d
        date_livraison = str(edition.annee) + Outils.mois_string(edition.mois) + str(edition.dernier_jour)

        return [poste, "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                "", "", "", "", "", "", article.code_sap, "", article.quantite,
                article.unite, article.type_prix, net,
                article.type_rabais, rabais, date_livraison, generaux.centre_financier, "",
                generaux.fonds, "", "", code_op, "", "", "", article.texte_sap,
                consommateur]
示例#8
0
    def ligne_tableau(article, poste, net, rabais, consommateur, edition):
        """
        retourne une ligne de tableau html

        :param article: Une instance de la classe generaux.Article
        :param poste: indice de poste
        :param net: montant net
        :param rabais: rabais sur le montant
        :param consommateur: consommateur
        :param edition: paramètres d'édition
        :return: ligne de tableau html
        """
        montant = net - rabais
        date_livraison = str(edition.dernier_jour) + "." + Outils.mois_string(edition.mois) + "." + str(edition.annee)
        description = article.code_d + " : " + article.code_sap
        dico_tab = {'poste': poste, 'date': date_livraison, 'descr': description,
                    'texte': article.texte_sap, 'nom': Latex.echappe_caracteres(consommateur),
                    'unit': article.unite, 'quantity': article.quantite,
                    'unit_p': "%.2f" % net, 'discount': "%.2f" % rabais, 'net': "%.2f" % montant}
        ligne = r'''<tr>
            <td> %(poste)s </td><td> %(date)s </td><td> %(nom)s </td><td> %(descr)s <br /> %(texte)s </td>
            <td> %(unit)s </td><td id="toright"> %(quantity)s </td><td id="toright"> %(unit_p)s </td>
            <td id="toright"> %(discount)s </td><td id="toright"> %(net)s </td>
            </tr>
            ''' % dico_tab
        return ligne
示例#9
0
    def detail(dossier_destination, edition, lignes):
        """
        création du détail des coûts
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param lignes: lignes de données du détail
        """

        nom = "detail_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                "Année", "Mois", "Code Client Facture", "Code Client SAP",
                "Abrev. Labo", "type client", "nature client", "Id-Compte",
                "Numéro de compte", "Intitulé compte", "Code Type Compte",
                "code_d", "Id-categorie", "Intitulé catégorie",
                "Durée machines (min)", "Durée main d'oeuvre (min)", "-", "-",
                "-", "-", "intitule_court", "N. prestation", "Intitulé",
                "Montant", "Rabais", "Catégorie Stock", "Affiliation"
            ]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#10
0
    def bilan(dossier_destination, edition, generaux, lignes):
        """
        création du bilan
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param generaux: paramètres généraux
        :param lignes: lignes de données du bilan
        """

        nom = "bilan-comptes_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
              str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = ["année", "mois", "référence", "code client", "code client sap", "abrév. labo", "nom labo",
                     "type client", "nature client", "id-compte", "numéro compte", "intitulé compte",
                     "code type compte", "-", "-", "rabais", "mj"]
            for categorie in generaux.codes_d3():
                ligne.append(categorie + "j")
            ligne += ["somme-j", "bonus"]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#11
0
    def ligne_facture(generaux, article, poste, net, rabais, op_centre,
                      consommateur, edition):
        """
        retourne une ligne de facturation formatée

        :param generaux: paramètres généraux
        :param article: Une instance de la classe generaux.Article
        :param poste: indice de poste
        :param net: montant net
        :param rabais: rabais sur le montant
        :param op_centre: centre d'opération
        :param consommateur: consommateur
        :param edition: paramètres d'édition
        :return: ligne de facturation formatée
        """
        net = "%.2f" % net
        rabais = "%.2f" % rabais
        if rabais == 0:
            rabais = ""
        code_op = generaux.code_t + op_centre + article.code_d
        date_livraison = str(edition.annee) + Outils.mois_string(
            edition.mois) + str(edition.dernier_jour)

        return [
            poste, "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
            article.code_sap, "", article.quantite, article.unite,
            article.type_prix, net, article.type_rabais, rabais,
            date_livraison, generaux.centre_financier, "", generaux.fonds, "",
            "", code_op, "", "", "", article.texte_sap,
            Latex.echappe_caracteres(consommateur)
        ]
示例#12
0
    def bilan(dossier_destination, edition, generaux, lignes):
        """
        création du bilan
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param generaux: paramètres généraux
        :param lignes: lignes de données du bilan
        """

        nom = "bilan_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                "année", "mois", "référence", "code client", "code client sap",
                "abrév. labo", "nom labo", "type client", "nature client",
                "Em base", "rabais Em", "nb utilisateurs", "nb comptes", "MAt",
                "MOt", "DHt", "Et", "Rt", "Mt"
            ]
            for categorie in generaux.codes_d3():
                ligne.append(categorie + "t")
            ligne += ["total facturé HT", "Bonus Ht"]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#13
0
    def supprimer_ticket(client_unique, mois, annee, dossier_source,
                         dossier_destination):
        """
        suppression des résumés mensuels au niveau du client
        :param client_unique: client concerné
        :param mois: mois concerné
        :param annee: année concernée
        :param dossier_source: Une instance de la classe dossier.DossierSource
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        """
        ticket_complet = "ticket_" + str(annee) + "_" + Outils.mois_string(
            mois) + ".html"
        ticket_texte = dossier_source.string_lire(ticket_complet)
        index1, index2 = Resumes.section_position(ticket_texte, client_unique)
        if index1 is not None:
            ticket_texte = ticket_texte[:index1] + ticket_texte[index2:]
            ticket_texte = ticket_texte.replace("..", ".")

        index1, index2, clients_liste = Resumes.select_clients(ticket_texte)
        if index1 is not None:
            nouveau_select = r'''<select name="client" onchange="changeClient(this)">'''
            i = 0
            for nom in clients_liste:
                if client_unique not in nom:
                    nouveau_select += r'''<option value="''' + str(i) + r'''">''' + \
                                      str(nom) + r'''</option>'''
                    i += 1
            nouveau_select += r'''</select>'''
            texte = ticket_texte[:index1] + nouveau_select + ticket_texte[
                index2:]
            texte = texte.replace("..", ".")
            dossier_destination.string_ecrire(ticket_complet, texte)
示例#14
0
    def res(dossier_destination, edition, lignes):
        """
        création du récapitulatif des réservations
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param lignes: lignes de données du récapitulatif
        """
        nom = "res_" + str(edition.annee) + "_" + Outils.mois_string(
            edition.mois) + "_" + str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        nom += ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                edition.annee, edition.mois, "Id-Compte", "Numéro de compte",
                "Intitulé compte", "Code Type Compte", "Code Type Subsides",
                "Code Client Facture", "Abrev. Labo", "Id-User", "Nom User",
                "Prénom User", "Id-Machine", "Nom Machine",
                "Date et Heure début de slot", "Durée du slot réservé HP",
                "Durée du slot réservé HC", "Durée ouvrée",
                "Date et Heure de réservation", "Date et Heure de suppression"
            ]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#15
0
 def __init__(self, edition):
     """
     initialisation des données et stockage des paramètres d'édition
     :param edition: paramètres d'édition
     """
     super().__init__(edition)
     self.nom = "Bilan-usage_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + ".csv"
示例#16
0
    def bilan(dossier_destination, subedition, subgeneraux, lignes):
        """
        création du bilan
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param subedition: paramètres d'édition
        :param subgeneraux: paramètres généraux
        :param lignes: lignes de données du bilan
        """

        nom = "bilan-subsides_" + str(subedition.annee_fin_general) + "_" + \
              Outils.mois_string(subedition.mois_fin_general) + ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = [
                "année", "mois", "code client", "code client sap",
                "abrév. labo", "nom labo", "type client", "nature client",
                "Bonus", "Subsides Mt"
            ]
            for categorie in subgeneraux.codes_d3():
                ligne.append("Subsides " + categorie + "t")
            ligne += ["total Subsides"]
            fichier_writer.writerow(ligne)

            for ligne in lignes:
                fichier_writer.writerow(ligne)
示例#17
0
    def ligne_tableau(article, poste, net, rabais, consommateur, edition):
        """
        retourne une ligne de tableau html

        :param article: Une instance de la classe generaux.Article
        :param poste: indice de poste
        :param net: montant net
        :param rabais: rabais sur le montant
        :param consommateur: consommateur
        :param edition: paramètres d'édition
        :return: ligne de tableau html
        """
        montant = net - rabais
        date_livraison = str(edition.dernier_jour) + "." + Outils.mois_string(
            edition.mois) + "." + str(edition.annee)
        description = article.code_d + " : " + article.code_sap
        dico_tab = {
            'poste': poste,
            'date': date_livraison,
            'descr': description,
            'texte': article.texte_sap,
            'nom': Latex.echappe_caracteres(consommateur),
            'unit': article.unite,
            'quantity': article.quantite,
            'unit_p': "%.2f" % net,
            'discount': "%.2f" % rabais,
            'net': "%.2f" % montant
        }
        ligne = r'''<tr>
            <td> %(poste)s </td><td> %(date)s </td><td> %(nom)s </td><td> %(descr)s <br /> %(texte)s </td>
            <td> %(unit)s </td><td id="toright"> %(quantity)s </td><td id="toright"> %(unit_p)s </td>
            <td id="toright"> %(discount)s </td><td id="toright"> %(net)s </td>
            </tr>
            ''' % dico_tab
        return ligne
示例#18
0
    def creation_annexes(sommes, clients, edition, livraisons, acces, machines, reservations, prestations, comptes,
                         dossier_annexe, plateforme, prefixe, coefprests, coefmachines, generaux, garde):
        """
        création des annexes techniques
        :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 prestations: prestations importées
        :param comptes: comptes importés
        :param dossier_annexe: nom du dossier dans lequel enregistrer les annexes
        :param plateforme: OS utilisé
        :param prefixe: prefixe de nom des annexes
        :param coefprests: coefficients prestations importés
        :param coefmachines: coefficients machines importés
        :param generaux: paramètres généraux
        :param garde: titre page de garde
        """

        if sommes.calculees == 0:
            info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer les annexes"
            print(info)
            Outils.affiche_message(info)
            return

        for code_client in sommes.sommes_clients.keys():
            contenu = Latex.entete(plateforme)
            contenu += r'''\usepackage[margin=10mm, includefoot]{geometry}
                \usepackage{multirow}
                \usepackage{longtable}
                \usepackage{dcolumn}
                \usepackage{changepage}
                \usepackage[scriptsize]{caption}

                \begin{document}
                \renewcommand{\arraystretch}{1.5}
                '''
            contenu += r'''
                \vspace*{8cm}
                \begin{adjustwidth}{5cm}{}
                \Large\textsc{''' + garde + r'''}\newline\newline'''
            nom = Latex.echappe_caracteres(clients.donnees[code_client]['abrev_labo'])
            code_sap = clients.donnees[code_client]['code_sap']

            contenu += code_client + " - " + code_sap + " - " + nom + r'''\newpage
                \end{adjustwidth}'''
            contenu += Annexes.contenu_client(sommes, clients, code_client, edition, livraisons, acces, machines,
                                              reservations, prestations, comptes, coefprests, coefmachines, generaux)
            contenu += r'''\end{document}'''

            nom = prefixe + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
                  str(edition.version) + "_" + code_client

            Latex.creer_latex_pdf(nom, contenu, dossier_annexe)
示例#19
0
    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
示例#20
0
    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'],
                        Outils.format_2_dec(sco['somme_j_mai']),
                        Outils.format_2_dec(sco['somme_j_moi']),
                        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
示例#21
0
 def __init__(self, edition):
     """
     initialisation des données et stockage des paramètres d'édition
     :param edition: paramètres d'édition
     """
     super().__init__(edition)
     self.version = edition.version
     self.unique = edition.client_unique
     self.nom = ""
     self.dossier = ""
     self.chemin = "./"
     self.prefixe = "Annexe-subsides_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
         str(edition.version)
示例#22
0
 def __init__(self, edition):
     """
     initialisation des données et stockage des paramètres d'édition
     :param edition: paramètres d'édition
     """
     super().__init__(edition)
     self.version = edition.version
     self.nom = "Transaction_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
         str(edition.version)
     if edition.version > 0:
         self.nom += "_" + str(edition.client_unique)
     self.nom += ".csv"
     self.comptabilises = {}
示例#23
0
 def ligne_tableau(self, article, poste, net, rabais, consommateur, edition):
     montant = net - rabais
     date_livraison = str(edition.dernier_jour) + "." + Outils.mois_string(edition.mois) + "." + str(edition.annee)
     description = article.code_d + " : " + article.code_sap
     dico_tab = {'poste': poste, 'date': date_livraison, 'descr': description,
                 'texte': article.texte_sap, 'nom': Latex.echappe_caracteres(consommateur),
                 'unit': article.unite, 'quantity': article.quantite,
                 'unit_p': "%.2f" % net, 'discount': "%.2f" % rabais, 'net': "%.2f" % montant}
     ligne = r'''<tr>
         <td> %(poste)s </td><td> %(date)s </td><td> %(nom)s </td><td> %(descr)s <br /> %(texte)s </td>
         <td> %(unit)s </td><td id="toright"> %(quantity)s </td><td id="toright"> %(unit_p)s </td>
         <td id="toright"> %(discount)s </td><td id="toright"> %(net)s </td>
         </tr>
         ''' % dico_tab
     return ligne
示例#24
0
 def ref_client(self, generaux, client):
     """
     ajout de la référence et des valeurs issues du client
     :param generaux: paramètres généraux
     :param client: client de la transaction
     :return tableau contenant la référence et les valeurs du client
     """
     code_ref = generaux.code_ref_par_code_n(client['nature'])
     reference = code_ref + str(self.annee)[2:] + Outils.mois_string(
         self.mois) + "." + client['code']
     if self.version > 0:
         reference += "-" + str(self.version)
     return [
         reference, client['code'], client['code_sap'],
         client['abrev_labo'], client['nature'],
         generaux.intitule_n_par_code_n(client['nature'])
     ]
示例#25
0
    def supprimer(client_unique, mois, annee, dossier_source,
                  dossier_destination):
        """
        suppression des résumés mensuels au niveau du client
        :param client_unique: client concerné
        :param mois: mois concerné
        :param annee: année concernée
        :param dossier_source: Une instance de la classe dossier.DossierSource
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        """

        for i in range(len(Resumes.fichiers)):
            fichier_complet = Resumes.fichiers[i] + "_" + str(
                annee) + "_" + Outils.mois_string(mois) + ".csv"
            donnees_csv = Resumes.ouvrir_csv_sans_client(
                dossier_source, fichier_complet, client_unique,
                Resumes.positions[i])
            with dossier_destination.writer(fichier_complet) as fichier_writer:
                for ligne in donnees_csv:
                    fichier_writer.writerow(ligne)
        Resumes.supprimer_ticket(client_unique, mois, annee, dossier_source,
                                 dossier_destination)
示例#26
0
    def mise_a_jour(self, edition, dossier_source, dossier_destination,
                    maj_trans):
        """
        modification des résumés mensuels au niveau du client dont la facture est modifiée
        :param edition: paramètres d'édition
        :param dossier_source: Une instance de la classe dossier.DossierSource
        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :param maj_trans: données modifiées pour le client pour les transactions
        """
        fichier_trans = "Transaction_" + str(
            edition.annee) + "_" + Outils.mois_string(edition.mois) + ".csv"
        donnees_csv = Resumes.ouvrir_csv_sans_client(dossier_source,
                                                     fichier_trans,
                                                     edition.client_unique, 3)
        with dossier_destination.writer(fichier_trans) as fichier_writer:
            for ligne in donnees_csv:
                fichier_writer.writerow(ligne)

            for key in maj_trans.valeurs.keys():
                valeur = maj_trans.valeurs[key]
                ligne = [self.annee, self.mois]
                for i in range(2, len(self.cles)):
                    ligne.append(valeur[self.cles[i]])
                fichier_writer.writerow(ligne)
示例#27
0
verification = Verification()

if verification.verification_date(edition, acces, clients, coefmachines,
                                  coefprests, comptes, livraisons, machines,
                                  prestations, reservations) > 0:
    sys.exit("Erreur dans les dates")

if verification.verification_cohérence(
        generaux, edition, acces, clients, coefmachines, coefprests, comptes,
        livraisons, machines, prestations, reservations) > 0:
    sys.exit("Erreur dans la cohérence")

dossier_enregistrement = Outils.chemin_dossier(
    [generaux.chemin, edition.annee,
     Outils.mois_string(edition.mois)], plateforme, generaux)
dossier_lien = Outils.lien_dossier(
    [generaux.lien, edition.annee,
     Outils.mois_string(edition.mois)], plateforme, generaux)
livraisons.calcul_montants(prestations, coefprests, comptes, clients,
                           verification)
reservations.calcul_montants(machines, coefmachines, comptes, clients,
                             verification)
acces.calcul_montants(machines, coefmachines, comptes, clients, verification)

sommes = Sommes(verification, generaux)
sommes.calculer_toutes(livraisons, reservations, acces, prestations, comptes,
                       clients, machines)

if edition.version == '0':
    dossier_csv = Outils.chemin_dossier([dossier_enregistrement, "csv_0"],
示例#28
0
 def __init__(self, dossier_source, edition):
     self.nom_fichier = "granted_" + str(
         edition.annee) + "_" + Outils.mois_string(edition.mois -
                                                   1) + ".csv"
     super().__init__(dossier_source)
示例#29
0
    def factures(self, sommes, destination, edition, generaux, clients,
                 comptes, paramannexe):
        """
        génère la facture sous forme de csv
        
        :param sommes: sommes calculées
        :param destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param generaux: paramètres généraux
        :param clients: clients importés
        :param comptes: comptes importés
        :param paramannexe: paramètres d'annexe
        :return: données du combolist et des sections
        """

        if sommes.calculees == 0:
            info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer la facture"
            Outils.affiche_message(info)
            return

        nom_facture = "facture_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
                      str(edition.version)
        if edition.version > 0:
            nom_facture += "_" + str(edition.client_unique)
        if self.prod2qual:
            nom_facture += "_qualite.csv"
        else:
            nom_facture += ".csv"

        with destination.writer(nom_facture) as fichier_writer:
            fichier_writer.writerow([
                "Poste", "Système d'origine", "Type de document de vente",
                "Organisation commerciale", "Canal de distribution",
                "Secteur d'activité", "", "", "Client", "Nom 2 du client",
                "Nom 3 du client", "Adresse e-mail du client", "Client",
                "Client", "Client", "Devise", "Mode d'envoi",
                "Référence de la facture", "", "", "Texte d'entête",
                "Lien réseau vers l'annexe client .pdf", "Document interne",
                "Lien réseau vers l'annexe projets .pdf", "Document interne",
                "Lien réseau vers l'annexe détails .pdf", "Document interne",
                "Lien réseau vers l'annexe pièces .pdf", "Document interne",
                "Lien réseau vers l'annexe interne .pdf", "Document interne",
                "Article", "", "Quantité", "Unité de quantité", "Type de prix",
                "Prix net du poste", "Type de rabais",
                "Valeur rabais du poste", "Date de livraison",
                "Centre financier", "", "Fonds à créditer", "", "",
                "Code opération", "", "", "", "Texte libre du poste", "Nom"
            ])

            combo_list = {}

            for code_client in sorted(sommes.sommes_clients.keys()):
                poste = 0
                scl = sommes.sommes_clients[code_client]
                client = clients.donnees[code_client]

                if scl['somme_t'] == 0:
                    continue

                code_sap = client['code_sap']
                if self.prod2qual and not (
                        self.prod2qual.code_client_existe(code_sap)):
                    continue

                if client['nature'] == "I":
                    genre = generaux.code_int
                else:
                    genre = generaux.code_ext
                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)

                filtre = generaux.filtrer_article_nul_par_code_n(
                    client['nature'])

                if self.prod2qual:
                    code_sap_traduit = self.prod2qual.traduire_code_client(
                        code_sap)
                else:
                    code_sap_traduit = code_sap
                dico_contenu = {
                    'code': code_client,
                    'abrev': client['abrev_labo'],
                    'nom': client['nom_labo'],
                    'dest': client['dest'],
                    'ref': client['ref'],
                    'ref_fact': reference,
                    'texte': generaux.entete
                }
                contenu_client = r'''<section id="%(code)s"><div id="entete"> %(code)s <br />
                    %(abrev)s <br />
                    %(nom)s <br />
                    %(dest)s <br />
                    %(ref)s <br />
                    </div><br />
                    %(ref_fact)s <br /><br />
                    %(texte)s <br />
                    ''' % dico_contenu

                contenu_client += r'''<table id="tableau">
                    <tr>
                    <td>Item </td><td> Date </td><td> Name </td><td> Description </td><td> Unit </td><td> Quantity </td>
                    <td> Unit Price <br /> [CHF] </td><td> Discount </td><td> Net amount <br /> [CHF] </td>
                    </tr>
                    '''

                ligne = [
                    poste, generaux.origine, genre, generaux.commerciale,
                    generaux.canal, generaux.secteur, "", "", code_sap_traduit,
                    client['dest'], client['ref'], client['email'],
                    code_sap_traduit, code_sap_traduit, code_sap_traduit,
                    generaux.devise, client['mode'], reference, "", "",
                    generaux.entete
                ]
                for donnee in paramannexe.donnees:
                    nom_annexe = donnee['nom'] + "_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + \
                                 "_" + str(edition.version) + "_" + code_client + ".pdf"
                    ligne.append(donnee['lien'] + nom_annexe)
                    if generaux.code_ref_par_code_n(client['nature']) == "INT":
                        ligne.append(donnee['int'])
                    elif client['mode'] == "MAIL":
                        ligne.append(donnee['ext_mail'])
                    else:
                        ligne.append(donnee['ext_postal'])

                fichier_writer.writerow(ligne)

                op_centre = client['nature'] + str(
                    edition.annee)[2:] + Outils.mois_string(edition.mois)

                if scl['em'] > 0 and not (filtre == "OUI" and scl['e'] == 0):
                    poste = generaux.poste_emolument
                    fichier_writer.writerow(
                        self.ligne_facture(generaux, generaux.articles[0],
                                           poste, scl['em'], scl['er'],
                                           op_centre, "", edition))
                    contenu_client += self.ligne_tableau(
                        generaux.articles[0], poste, scl['em'], scl['er'], "",
                        edition)

                if scl['rm'] > 0 and not (filtre == "OUI" and scl['r'] == 0):
                    poste = generaux.poste_reservation
                    fichier_writer.writerow(
                        self.ligne_facture(generaux, generaux.articles[1],
                                           poste, scl['rm'], scl['rr'],
                                           op_centre, "", edition))
                    contenu_client += self.ligne_tableau(
                        generaux.articles[1], poste, scl['rm'], scl['rr'], "",
                        edition)

                inc = 1

                if code_client in sommes.sommes_comptes:
                    sclo = sommes.sommes_comptes[code_client]
                    comptes_utilises = Outils.comptes_in_somme(sclo, comptes)

                    for id_compte, num_compte in sorted(
                            comptes_utilises.items(), key=lambda x: x[1]):
                        sco = sclo[id_compte]
                        compte = comptes.donnees[id_compte]
                        if sco['c1'] > 0 and not (filtre == "OUI"
                                                  and sco['c2'] == 0):
                            poste = inc * 10
                            if sco['somme_j_mm'] > 0 and not (
                                    filtre == "OUI" and sco['mj'] == 0):
                                fichier_writer.writerow(
                                    self.ligne_facture(
                                        generaux, generaux.articles[2], poste,
                                        sco['somme_j_mm'], sco['somme_j_mr'],
                                        op_centre, compte['numero'] + " - " +
                                        compte['intitule'], edition))
                                contenu_client += self.ligne_tableau(
                                    generaux.articles[2], poste,
                                    sco['somme_j_mm'], sco['somme_j_mr'],
                                    compte['numero'] + " - " +
                                    compte['intitule'], edition)
                                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):
                                    fichier_writer.writerow(
                                        self.ligne_facture(
                                            generaux, article, poste,
                                            sco['sommes_cat_m'][categorie],
                                            sco['sommes_cat_r'][categorie],
                                            op_centre, compte['numero'] +
                                            " - " + compte['intitule'],
                                            edition))
                                    contenu_client += self.ligne_tableau(
                                        article, poste,
                                        sco['sommes_cat_m'][categorie],
                                        sco['sommes_cat_r'][categorie],
                                        compte['numero'] + " - " +
                                        compte['intitule'], edition)
                                    poste += 1
                            inc += 1
                contenu_client += r'''
                    <tr><td colspan="8" id="toright">Net amount [CHF] : </td><td id="toright">
                    ''' + "%.2f" % scl['somme_t'] + r'''</td></tr>
                    </table>
                    '''
                contenu_client += r'''<table><tr>'''
                for donnee in paramannexe.donnees:
                    nom_annexe = donnee['nom'] + "_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) \
                                 + "_" + str(edition.version) + "_" + code_client + ".pdf"
                    dossier_annexe = "../" + donnee[
                        'dossier'] + "/" + nom_annexe
                    chemin_annexe = donnee['chemin'] + "/" + nom_annexe

                    if not os.path.isfile(chemin_annexe):
                        continue

                    contenu_client += r'''<td><a href="''' + dossier_annexe + r'''" target="new">''' + nom_annexe + r'''
                        </a></td>'''
                contenu_client += r'''</tr></table>'''
                contenu_client += "</section>"
                combo_list[client['abrev_labo'] + " (" + code_client +
                           ")"] = contenu_client
        self.creer_html(destination, combo_list, edition)
        return combo_list
示例#30
0
generaux = Generaux(dossier_source)

if pe_present:
    edition = Edition(dossier_source)
    paramannexe = Paramannexe(dossier_source)

    if edition.version > 0 and edition.client_unique == generaux.code_cfact_centre:
        chemin = generaux.chemin_propre
    elif edition.filigrane != "":
        chemin = generaux.chemin_filigrane
    else:
        chemin = generaux.chemin
    dossier_enregistrement = Outils.chemin(
        [chemin, edition.annee,
         Outils.mois_string(edition.mois)], generaux)
    existe = Outils.existe(dossier_enregistrement, True)
    dossier_lien = Outils.lien_dossier(
        [generaux.lien, edition.annee,
         Outils.mois_string(edition.mois)], generaux)

    if edition.version == 0:
        if existe:
            msg = "Le répertoire " + dossier_enregistrement + " existe déjà !"
            Outils.affiche_message(msg)
            sys.exit("Erreur sur le répértoire")
        dossier_csv = Outils.chemin([dossier_enregistrement, "csv_0"],
                                    generaux)
        Outils.existe(dossier_csv, True)
    else:
        dossier_csv = Outils.chemin([
示例#31
0
    def bilan(dossier_destination, edition, sommes, clients, generaux, acces, reservations, livraisons,
              comptes):
        """
        création du bilan

        :param dossier_destination: Une instance de la classe dossier.DossierDestination
        :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 reservations: réservations importés
        :param livraisons: livraisons importées
        :param comptes: comptes importés
        """

        if sommes.calculees == 0:
            info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer le bilan mensuel"
            print(info)
            Outils.affiche_message(info)
            return

        nom = "bilan_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
              str(edition.version) + ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = ["année", "mois", "référence", "code client", "code client sap", "abrév. labo", "nom labo",
                     "type client", "nature client", "Em base", "somme EQ", "rabais Em", "règle", "nb utilisateurs",
                     "nb tot comptes", "nb comptes cat 1", "nb comptes cat 2", "nb comptes cat 3", "nb comptes cat 4",
                     "total M cat 1", "total M cat 2", "total M cat 3", "total M cat 4", "MAt", "MOt", "DSt", "DHt",
                     "Et", "Rt", "Mt"]
            for categorie in generaux.codes_d3():
                ligne.append(categorie + "t")
            ligne.append("total facturé HT")
            fichier_writer.writerow(ligne)

            for code_client in sorted(sommes.sommes_clients.keys()):
                scl = sommes.sommes_clients[code_client]
                sca = sommes.sommes_categories[code_client]
                client = clients.donnees[code_client]
                nature = generaux.nature_client_par_code_n(client['type_labo'])
                reference = nature + str(edition.annee)[2:] + Outils.mois_string(edition.mois) + "." + code_client
                nb_u = len(BilanMensuel.utilisateurs(acces, livraisons, reservations, code_client))
                cptes = BilanMensuel.comptes(acces, livraisons, reservations, code_client)
                cat = {'1': 0, '2': 0, '3': 0, '4': 0}
                nb_c = 0
                for cpte in cptes:
                    nb_c += 1
                    cat[comptes.donnees[cpte]['categorie']] += 1

                mk = {'1': 0, '2': 0, '3': 0, '4': 0}
                for num in mk.keys():
                    if num in sca:
                        mk[num] = sca[num]['mk']

                total = scl['somme_t'] + scl['e']

                ligne = [edition.annee, edition.mois, reference, code_client, client['code_sap'], client['abrev_labo'],
                         client['nom_labo'], 'U', client['type_labo'], scl['em'], "%.2f" % scl['somme_eq'], scl['er'],
                         client['emol_sans_activite'], nb_u, nb_c, cat['1'], cat['2'], cat['3'], cat['4'],
                         "%.2f" % mk['1'], "%.2f" % mk['2'], "%.2f" % mk['3'], "%.2f" % mk['4'], "%.2f" % scl['mat'],
                         scl['mot'], scl['dst'], scl['dht'], scl['e'], scl['r'], "%.2f" % scl['mt']]
                for categorie in generaux.codes_d3():
                    ligne.append(scl['tot_cat'][categorie])
                ligne.append("%.2f" % total)
                fichier_writer.writerow(ligne)
示例#32
0
    def factures(self, sommes, destination, edition, generaux, clients, comptes,
                 lien_annexes, lien_annexes_techniques, annexes, annexes_techniques):
        """
        génère la facture sous forme de csv
        :param sommes: sommes calculées
        :param destination: Une instance de la classe dossier.DossierDestination
        :param edition: paramètres d'édition
        :param generaux: paramètres généraux
        :param clients: clients importés
        :param comptes: comptes importés
        :param lien_annexes: lien au dossier contenant les annexes
        :param lien_annexes_techniques: lien au dossier contenant les annexes techniques
        :param annexes: dossier contenant les annexes
        :param annexes_techniques: dossier contenant les annexes techniques
        """

        if sommes.calculees == 0:
            info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer la facture"
            print(info)
            Outils.affiche_message(info)
            return

        if self.prod2qual:
            suffixe = "_qualite.csv"
        else:
            suffixe = ".csv"
        nom = "facture_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
              str(edition.version) + suffixe
        with destination.writer(nom) as fichier_writer:
            fichier_writer.writerow(["Poste", "Système d'origine", "Type de document de vente",
                                     "Organisation commerciale", "Canal de distribution", "Secteur d'activité",
                                     "Agence commerciale", "Groupe de vendeurs", "Donneur d'ordre",
                                     "Nom 2 du donneur d'ordre", "Nom 3 du donneur d'ordre", "Adresse e-mail",
                                     "Client facturé", "Payeur", "Client livré", "Devise", "Mode d'envoi",
                                     "Numéro de la commande d'achat du client", "Date de livraison E/Tsouhaitée",
                                     "Nom émetteur", "Textes", "Lien réseau 01", "Doc interne", "Lien réseau 02",
                                     "Doc interne", "Lien réseau 03", "Doc interne", "Lien réseau 04", "Doc interne",
                                     "Lien réseau 05", "Doc interne", "Article",
                                     "Désignation du poste d'une commande client", "Quantité cible en unité de vente",
                                     "Unité de quantité cible", "Type de prix net", "Prix net du poste",
                                     "Type de rabais poste", "Valeur rabais poste", "Date de livraison poste souhaitée",
                                     "Centre financier émetteur", "Compte budgétaire émetteur", "Fonds émetteur",
                                     "OTP émetteur", "Numéro d'ordre interne émetteur", "Code OP émetteur",
                                     "Affaire émetteur", "Demande de voyage émetteur", "Matricule émetteur", "Textes",
                                     "Nom consommateur interne de la prestation", "Fonds récepteur 01",
                                     "Proportion fonds récepteur 01", "OTP récepteur fonds 01",
                                     "Numéro d'ordre interne récepteur fonds 01", "Code OP récepteur fonds 01",
                                     "Affaire récepteur 01", "Demande de voyage récepteur fonds 01",
                                     "Matricule récepteur fonds 01", "Fonds récepteur 02",
                                     "Proportion fonds récepteur 02", "OTP récepteur fonds 02",
                                     "Numéro d'ordre interne récepteur fonds 02", "Code OP récepteur fonds 02",
                                     "Affaire récepteur 02", "Demande de voyage récepteur fonds 02",
                                     "Matricule récepteur fonds 02", "Fonds récepteur 03",
                                     "Proportion fonds récepteur 03", "OTP récepteur fonds 03",
                                     "Numéro d'ordre interne récepteur fonds 03", "Code OP récepteur fonds 03",
                                     "Affaire récepteur 03", "Demande de voyage récepteur fonds 03",
                                     "Matricule récepteur fonds 03", "Fonds récepteur 04",
                                     "Proportion fonds récepteur 04", "OTP récepteur fonds 04",
                                     "Numéro d'ordre interne récepteur fonds 04", "Code OP récepteur fonds 04",
                                     "Affaire récepteur 04", "Demande de voyage récepteur fonds 04",
                                     "Matricule récepteur fonds 04", "Fonds récepteur 05",
                                     "Proportion fonds récepteur 05", "OTP récepteur fonds 05",
                                     "Numéro d'ordre interne récepteur fonds 05", "Code OP récepteur fonds 05",
                                     "Affaire récepteur 05", "Demande de voyage récepteur fonds 05",
                                     "Matricule récepteur fonds 05"])

            contenu = ""
            combo_list = []

            for code_client in sorted(sommes.sommes_clients.keys()):
                poste = 0
                scl = sommes.sommes_clients[code_client]
                client = clients.donnees[code_client]

                tot = scl['somme_t_mm']
                for categorie in generaux.codes_d3():
                    tot += scl['sommes_cat_m'][categorie]
                if tot == 0 and scl['e'] == 0:
                    continue
    
                code_sap = client['code_sap']
                if self.prod2qual and not (self.prod2qual.code_client_existe(code_sap)):
                    continue
    
                if client['type_labo'] == "I":
                    genre = generaux.code_int
                else:
                    genre = generaux.code_ext
                nature = generaux.nature_client_par_code_n(client['type_labo'])
                reference = nature + str(edition.annee)[2:] + Outils.mois_string(edition.mois) + "." + code_client
                if edition.version != "0":
                    reference += "-" + edition.version
    
                nom_annexe = "annexe_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + \
                              "_" + str(edition.version) + "_" + code_client + ".pdf"
                lien_annexe = lien_annexes + nom_annexe
                dossier_annexe = "../" + annexes + "/" + nom_annexe
    
                nom_annexe_technique = "annexeT_" + str(edition.annee) + "_" + \
                                        Outils.mois_string(edition.mois) + "_" + str(edition.version) + "_" + \
                                        code_client + ".pdf"
                lien_annexe_technique = lien_annexes_techniques + nom_annexe_technique
                dossier_annexe_technique = "../" + annexes_techniques + "/" + nom_annexe_technique
    
                if self.prod2qual:
                    code_sap_traduit = self.prod2qual.traduire_code_client(code_sap)
                else:
                    code_sap_traduit = code_sap

                combo_list.append(code_client + " " + client['abrev_labo'])
                dico_contenu = {'code': code_client, 'abrev': client['abrev_labo'],
                                'nom': client['nom_labo'], 'dest': client['dest'], 'ref': client['ref'],
                                'ref_fact': reference, 'texte': generaux.entete}
                contenu_client = r'''<section><div id="entete"> %(code)s <br />
                    %(abrev)s <br />
                    %(nom)s <br />
                    %(dest)s <br />
                    %(ref)s <br />
                    </div><br />
                    %(ref_fact)s <br /><br />
                    %(texte)s <br />
                    ''' % dico_contenu
    
                contenu_client += r'''<table id="tableau">
                    <tr>
                    <td>Item </td><td> Date </td><td> Name </td><td> Description </td><td> Unit </td><td> Quantity </td>
                    <td> Unit Price <br /> [CHF] </td><td> Discount </td><td> Net amount <br /> [CHF] </td>
                    </tr>
                    '''
    
                fichier_writer.writerow([poste, generaux.origine, genre, generaux.commerciale,
                                         generaux.canal, generaux.secteur, "", "",
                                         code_sap_traduit, client['dest'], client['ref'], client['email'],
                                         code_sap_traduit, code_sap_traduit,
                                         code_sap_traduit, generaux.devise, client['mode'], reference, "", "",
                                         generaux.entete, lien_annexe, "", lien_annexe_technique, "X"])
    
                op_centre = client['type_labo'] + str(edition.annee)[2:] + Outils.mois_string(edition.mois)
                if int(client['emol_base_mens']) > 0:
                    poste = generaux.poste_emolument
                    fichier_writer.writerow(self.ligne_facture(generaux, generaux.articles[0], poste, scl['em'],
                                                               scl['er'], op_centre, "", edition))
                    contenu_client += self.ligne_tableau(generaux.articles[0], poste, scl['em'], scl['er'], "", edition)

                if scl['r'] > 0:
                    poste = generaux.poste_reservation
                    fichier_writer.writerow(self.ligne_facture(generaux, generaux.articles[1], poste, scl['rm'],
                                                               scl['rr'], op_centre, "", edition))
                    contenu_client += self.ligne_tableau(generaux.articles[1], poste, scl['rm'], scl['rr'], "",
                                                         edition)
    
                inc = 1
                sco_cl = sommes.sommes_comptes[code_client]
                for id_compte in sorted(sco_cl.keys()):
                    sco = sco_cl[id_compte]
                    compte = comptes.donnees[id_compte]
                    if sco['si_facture'] > 0:
                        poste = inc*10
                        if sco['somme_j_mm'] > 0:
                            fichier_writer.writerow(self.ligne_facture(generaux, generaux.articles[2], poste,
                                                                       sco['somme_j_mm'], sco['somme_j_mr'], op_centre,
                                                                       compte['intitule'], edition))
                            contenu_client += self.ligne_tableau(generaux.articles[2], poste, sco['somme_j_mm'],
                                                                 sco['somme_j_mr'], compte['intitule'], edition)
                            poste += 1

                        for article in generaux.articles_d3:
                            categorie = article.code_d
                            if sco['sommes_cat_m'][categorie] > 0:
                                fichier_writer.writerow(self.ligne_facture(generaux, article, poste,
                                                                           sco['sommes_cat_m'][categorie],
                                                                           sco['sommes_cat_r'][categorie], op_centre,
                                                                           compte['intitule'], edition))
                                contenu_client += self.ligne_tableau(article, poste, sco['sommes_cat_m'][categorie],
                                                                     sco['sommes_cat_r'][categorie], compte['intitule'],
                                                                     edition)
                                poste += 1
                        inc += 1
                net_amount = scl['somme_t'] + scl['e']
                contenu_client += r'''
                    <tr><td colspan="8" id="toright">Net amount [CHF] : </td><td id="toright">
                    ''' + "%.2f" % net_amount + r'''</td></tr>
                    </table>
                    '''
                contenu_client += r'''<a href="''' + dossier_annexe + r'''" target="new">''' + nom_annexe + r'''
                    </a>&nbsp;&nbsp;&nbsp;'''
                contenu_client += r'''<a href="''' + dossier_annexe_technique + r'''" target="new">
                    ''' + nom_annexe_technique + r'''</a>'''
                contenu_client += "</section>"
                contenu += contenu_client
        self.creer_html(contenu, destination, combo_list)
示例#33
0
    def creation_lignes(edition, somme_client, client, generaux, acces,
                        livraisons, comptes, categories):
        """
        génération des lignes de données du récapitulatif
        :param edition: paramètres d'édition
        :param somme_client: sommes par comptes calculées pour un client donné
        :param client: client donné
        :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
        :return: lignes de données du récapitulatif
        """

        lignes = []

        code_client = client['code']
        comptes_utilises = Outils.comptes_in_somme(somme_client, comptes)
        nature = generaux.code_ref_par_code_n(client['nature'])
        ref = nature + str(edition.annee)[2:] + Outils.mois_string(
            edition.mois) + "." + code_client
        if edition.version > 0:
            ref += "-" + str(edition.version)
        base_client = [
            generaux.centre, edition.annee, edition.mois, ref,
            client['code_sap'], client['abrev_labo']
        ]

        for id_compte, num_compte in sorted(comptes_utilises.items(),
                                            key=lambda x: x[1]):
            compte = comptes.donnees[id_compte]
            base_compte = base_client + [
                num_compte + " - " + compte['intitule']
            ]

            if code_client in acces.sommes and id_compte in acces.sommes[
                    code_client]['categories']:

                for cat, som_cats in sorted(acces.sommes[code_client]
                                            ['categories'][id_compte].items()):
                    for id_categorie, som_cat in sorted(som_cats.items()):
                        unite = categories.donnees[id_categorie]['unite']
                        montant = som_cat['mk']
                        if unite == 'h':
                            quantite = som_cat['quantite'] / 1440
                        else:
                            quantite = som_cat['quantite']
                        if montant > 0:
                            ligne = base_compte + [
                                'Services',
                                categories.donnees[id_categorie]['intitule'],
                                quantite, unite, som_cat['pk'], montant
                            ]
                            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:
                        if article.code_d == 'C':
                            base_article = base_compte + ['Consumables']
                        else:
                            base_article = base_compte + ['Other']
                        for no_prestation, sip in sorted(
                                somme[article.code_d].items()):
                            if sip['montant'] > 0:
                                ligne = base_article + [
                                    str(no_prestation) + " - " + sip['nom'],
                                    sip['quantite'], sip['unite'], sip['pn'],
                                    (sip['montant'] - sip['rabais'])
                                ]
                                lignes.append(ligne)

        return lignes
示例#34
0
    def creer_html(self, destination, combo_list, edition):
        """
        crée une page html autour d'une liste de sections
        
        :param destination:  Une instance de la classe dossier.DossierDestination
        :param combo_list: liste des clients et leurs sections
        :param edition: paramètres d'édition
        """

        nom = "ticket_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
              str(edition.version)
        if edition.version > 0:
            nom += "_" + str(edition.client_unique)
        if self.prod2qual:
            nom += "_qualite.html"
        else:
            nom += ".html"
        with destination.open(nom) as fichier:

            html = r'''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                <meta content="text/html; charset=cp1252" http-equiv="content-type" />
                <meta content="EPFL" name="author" />
                <style>
                #entete {
                    margin-left: 600px;
                    text-align:left;
                }
                #tableau {
                    border-collapse: collapse;
                    margin: 20px;
                }
                #tableau tr, #tableau td {
                    border: 1px solid black;
                    vertical-align:middle;
                }
                #tableau td {
                    padding: 3px;
                }
                #toright {
                    text-align:right;
                }
                #combo {
                    margin-top: 10px;
                    margin-left: 50px;
                }
                </style>
                <link rel="stylesheet" href="../css/reveal.css">
                <link rel="stylesheet" href="../css/white.css">
                </head>
                <body>
                <div id="combo">
                <select name="client" onchange="changeClient(this)">
                '''
            i = 0
            for k, v in sorted(combo_list.items()):
                html += r'''<option value="''' + str(i) + r'''">''' + str(
                    k) + r'''</option>'''
                i += 1
            html += r'''
                </select>
                </div>
                <div class="reveal">
                <div class="slides">
                '''
            for k, v in sorted(combo_list.items()):
                html += v
            html += r'''</div></div>
                    <script src="../js/reveal.js"></script>
                    <script>
                        Reveal.initialize();
                    </script>
                    <script>
                    function changeClient(sel) {
                        Reveal.slide(sel.value, 0);
                    }
                    </script>
                    </body>
                </html>'''
            fichier.write(html)
示例#35
0
    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
示例#36
0
    def annexes(consolidation, plateforme, subgeneraux, subedition,
                dossier_annexe):
        """
        création des annexes de subsides
        :param consolidation: classe de consolidation des données des bilans
        :param plateforme: OS utilisé
        :param subgeneraux: paramètres généraux
        :param subedition: paramètres d'édition
        :param dossier_annexe: nom du dossier dans lequel enregistrer le dossier des annexes
        """
        for code_client, dcl in consolidation.clients.items():
            code_client = Latex.echappe_caracteres(code_client)

            contenu = Latex.entete(plateforme)
            contenu += r'''
                \usepackage[margin=10mm, includehead]{geometry}
                \usepackage{changepage}
                \usepackage{graphicx}
                \usepackage{longtable}
                \usepackage{dcolumn}
                \usepackage[scriptsize]{caption}
                \usepackage{fancyhdr}
                '''

            if subedition.filigrane != "":
                contenu += r'''
                    \usepackage{draftwatermark}
                    \SetWatermarkLightness{0.8}
                    \SetWatermarkAngle{45}
                    \SetWatermarkScale{2}
                    \SetWatermarkFontSize{2cm}
                    \SetWatermarkText{''' + subedition.filigrane[:15] + r'''}
                    '''

            contenu += r'''
                \pagestyle{fancy}

                \fancyhead{}
                \fancyfoot{}

                \renewcommand{\headrulewidth}{0pt}
                \renewcommand{\footrulewidth}{0pt}

                \fancyhead[L]{\leftmark \\ \rightmark}
                \fancyhead[R]{\thepage}

                \newcommand{\fakesection}[2]{
                    \markboth{#1}{#2}
                }
                
                \begin{document}
                \renewcommand{\arraystretch}{1.5}
                '''
            reference = "SUBS" + str(subedition.annee_fin_general)[2:] + \
                        Outils.mois_string(subedition.mois_fin_general) + "." + code_client

            contenu += r'''
                \begin{titlepage}
                \vspace*{8cm}
                \begin{adjustwidth}{5cm}{}
                \Large\textsc{Annexes subsides \newline Subsidies Appendices}\newline
                \Large\textsc{''' + reference + r'''}\newline\newline\newline
                '''

            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_entete = {
                'code': code_client,
                'code_sap': Latex.echappe_caracteres(dcl['sap']),
                'nom': Latex.echappe_caracteres(dcl['abrev']),
                'debut': debut,
                'fin': fin
            }

            contenu += r'''Client %(code)s - %(code_sap)s - %(nom)s \newline
                 %(debut)s - %(fin)s
                \end{adjustwidth}
                \end{titlepage}    
                \clearpage
                ''' % dic_entete
            contenu += Annexes.contenu_client(code_client, consolidation,
                                              subgeneraux, subedition)
            contenu += r'''\end{document}'''

            nom = "subside_" + str(subedition.annee_fin_general) + "_" + \
                  Outils.mois_string(subedition.mois_fin_general) + "_" + code_client

            Latex.creer_latex_pdf(nom, contenu, dossier_annexe)
示例#37
0
reservations = Reservation(dossier_source)

generaux = Generaux(dossier_source)

verification = Verification()

if verification.verification_date(edition, acces, clients, coefmachines, coefprests, comptes, livraisons, machines,
                                  prestations, reservations) > 0:
    sys.exit("Erreur dans les dates")

if verification.verification_cohérence(generaux, edition, acces, clients, coefmachines, coefprests, comptes, livraisons,
                                       machines, prestations, reservations) > 0:
    sys.exit("Erreur dans la cohérence")

dossier_enregistrement = Outils.chemin_dossier([generaux.chemin, edition.annee,
                                                Outils.mois_string(edition.mois)], plateforme, generaux)
dossier_lien = Outils.lien_dossier([generaux.lien, edition.annee, Outils.mois_string(edition.mois)],
                                   plateforme, generaux)
livraisons.calcul_montants(prestations, coefprests, comptes, clients, verification)
reservations.calcul_montants(machines, coefmachines, comptes, clients, verification)
acces.calcul_montants(machines, coefmachines, comptes, clients, verification)

sommes = Sommes(verification, generaux)
sommes.calculer_toutes(livraisons, reservations, acces, prestations, comptes, clients, machines)

if edition.version == '0':
    dossier_csv = Outils.chemin_dossier([dossier_enregistrement, "csv_0"], plateforme, generaux)
else:
    dossier_csv = Outils.chemin_dossier([dossier_enregistrement, "csv_" + edition.version + "_" +
                                         edition.client_unique], plateforme, generaux)
dossier_destination = DossierDestination(dossier_csv)
示例#38
0
    def bilan(dossier_destination, edition, sommes, clients, generaux, acces, reservations, livraisons,
              comptes):
        """
        création du bilan

        :param dossier_source: Une instance de la classe dossier.DossierSource
        :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 reservations: réservations importés
        :param livraisons: livraisons importées
        :param comptes: comptes importés
        """

        if sommes.calculees == 0:
            info = "Vous devez d'abord faire toutes les sommes avant de pouvoir créer le bilan mensuel"
            print(info)
            Outils.affiche_message(info)
            return

        nom = "bilan_" + str(edition.annee) + "_" + Outils.mois_string(edition.mois) + "_" + \
              str(edition.version) + ".csv"

        with dossier_destination.writer(nom) as fichier_writer:

            ligne = ["année", "mois", "référence", "code client", "code client sap", "abrév. labo", "nom labo",
                     "type client", "nature client", "nb utilisateurs", "nb tot comptes", "nb comptes cat 1",
                     "nb comptes cat 2", "nb comptes cat 3", "nb comptes cat 4", "somme T", "Em base", "somme EQ",
                     "Rabais Em", "Prj 1", "Prj 2", "Prj 3", "Prj 4", "Pt", "Qt", "Ot", "Nt"]
            for categorie in generaux.codes_d3():
                ligne.append(categorie + "t")
            fichier_writer.writerow(ligne)

            for code_client in sorted(sommes.sommes_clients.keys()):
                scl = sommes.sommes_clients[code_client]
                sca = sommes.sommes_categories[code_client]
                cl = clients.donnees[code_client]
                nature = generaux.nature_client_par_code_n(cl['type_labo'])
                reference = nature + str(edition.annee)[2:] + Outils.mois_string(edition.mois) + "." + code_client
                if edition.version != "0":
                    reference += "-" + edition.version
                nb_u = len(BilanMensuel.utilisateurs(acces, livraisons, reservations, code_client))
                cptes = BilanMensuel.comptes(acces, livraisons, reservations, code_client)
                cat = {'1': 0, '2': 0, '3': 0, '4': 0}
                nb_c = 0
                for cpte in cptes:
                    nb_c += 1
                    cat[comptes.donnees[cpte]['categorie']] += 1

                if '1' in sca:
                    kprj1 = sca['1']['somme_k_prj']
                else:
                    kprj1 = 0
                if '2' in sca:
                    kprj2 = sca['2']['somme_k_prj']
                else:
                    kprj2 = 0
                if '3' in sca:
                    kprj3 = sca['3']['somme_k_prj']
                else:
                    kprj3 = 0
                if '4' in sca:
                    kprj4 = sca['4']['somme_k_prj']
                else:
                    kprj4 = 0

                ligne = [edition.annee, edition.mois, reference, code_client, cl['code_sap'], cl['abrev_labo'],
                         cl['nom_labo'], 'U', cl['type_labo'], nb_u, nb_c, cat['1'], cat['2'], cat['3'], cat['4'],
                         scl['somme_t'], scl['em'], scl['somme_eq'], scl['er'], kprj1, kprj2, kprj3, kprj4, scl['pt'],
                         scl['qt'], scl['ot'], scl['nt']]
                for categorie in generaux.codes_d3():
                    ligne.append(scl['tot_cat'][categorie])
                fichier_writer.writerow(ligne)