Project

General

Profile

Download (5.92 KB) Statistics
| Branch: | Tag: | Revision:

calebasse / calebasse / facturation / progor.py @ 99a62b84

1
# -*- coding: utf-8 -*-
2
"""
3
    Création du fichier d'importation d'ecritures comptables pour le logiciel
4
    prog'or
5

    
6
    Fichier texte format ANSI
7
    Lignes se terminent par un retour chariat et une fin de ligne (RC/LF soit
8
    13 et 10 en ACSII)
9

    
10
    Nom du fichier libre.
11
"""
12

    
13
def pad_str(chaine, len_pad):
14
    return chaine + ''.join([' ' for i in range(len_pad - len(chaine))])
15

    
16
def pad_str_0(chaine, len_pad):
17
    return '0'.join([' ' for i in range(len_pad - len(chaine))]) + chaine
18

    
19
def pad_int(montant, len_pad):
20
    montant = str(montant)
21
    return ''.join(['0' for i in range(len_pad - len(montant))]) + montant
22

    
23

    
24
class IdentificationJournal():
25

    
26
    def __init__(self):
27
        self.enregistrement = 'A'
28
        self.origine = '1' #Windows'
29
        self.code = 'FAC'
30
        self.intitule = pad_str('FACTURATION', 30)
31
        self.type = '1'
32
        self.type_pre = '0'
33
        self.centraliseur = ''
34
        self.centraliseur_intitule = ''
35
        self.ecritures = list()
36

    
37
    def add_ecriture(self, ecriture):
38
        self.ecritures.append(ecriture)
39

    
40
    def check_ecritures(self):
41
        '''
42
            Le total des écritures doit être égale à 0
43
        '''
44
        montant = 0
45
        for ecriture in self.ecritures:
46
            if not ecriture.check_echeances() or \
47
                    not ecriture.check_imputations():
48
                return False
49
            montant += ecriture.credit - ecriture.debit
50
        if montant:
51
            return False
52
        return True
53

    
54
    def render(self):
55
        if not self.check_ecritures():
56
            return None
57
        line = self.enregistrement + self.origine + self.code + \
58
            self.intitule + self.type + self.type_pre + self.centraliseur + \
59
            self.centraliseur_intitule
60
        line = pad_str(line, 255)
61
        lines = [line]
62
        lines.extend([ecriture.render() for ecriture in self.ecritures])
63
        line_sep = chr(10)
64
        res = line_sep.join(lines)
65
        return res + chr(13)
66

    
67
class EcritureComptable():
68

    
69
    def __init__(self, date, compte, intitule_compte, num_facturation,
70
            type_compte='2',
71
            compte_principale_defaut='41100000', compte_principale='41100000',
72
            intitule_compte_principal='Compte principal 411',
73
            credit=0, debit=0, quantite=0):
74
        if len(date) != 10 or len(compte) != 8:
75
            return None
76
        self.enregistrement = 'B'
77
        self.date = date
78
        self.monnaie = '1' #Euros
79
        self.compte = pad_str_0(compte, 8)
80
        self.intitule_compte = pad_str(intitule_compte, 30)
81
        self.type_compte = type_compte
82
        self.compte_principale_defaut = pad_str_0(compte_principale_defaut, 8)
83
        self.compte_principale = pad_str_0(compte_principale, 8)
84
        self.intitule_compte_principal = pad_str(intitule_compte_principal, 30)
85
        if self.type_compte == '0':
86
            self.compte_principale_defaut = pad_str('', 8)
87
            self.compte_principale = pad_str('', 8)
88
            self.intitule_compte_principal = pad_str('', 30)
89
        self.credit = credit
90
        self.debit = debit
91
        self.quantite = quantite
92
        self.nature_quantite = pad_str('', 20)
93
        libelle = 'FACTURATION CYCLE ' + num_facturation
94
        self.libelle_principale = pad_str(libelle, 30)
95
        self.libelle_secondaire = pad_str('', 30)
96
        self.lettrable = '0'
97
        self.piece = pad_str('', 10)
98
        self.rapprochement = '0'
99
        self.echeances = list()
100
        self.imputations = list()
101

    
102
    def add_echeance(self, echeance):
103
        self.echeances.append(echeance)
104

    
105
    def check_echeances(self):
106
        '''
107
            Le total des échéance doit être égale au montant de l'écriture
108
        '''
109
        return True
110

    
111
    def add_imputation(self, imputation):
112
        self.imputations.append(imputation)
113

    
114
    def check_imputations(self):
115
        '''
116
            Le total des imputations doit être égale au montant de l'écriture
117
        '''
118
        montant = 0
119
        for imputation in self.imputations:
120
            montant += imputation.credit - imputation.debit
121
        if montant >= 0 and montant == self.credit:
122
            return True
123
        if montant < 0 and abs(montant) == self.debit:
124
            return True
125
        return False
126

    
127
    def render(self):
128
        self.credit = pad_int(self.credit, 15)
129
        self.debit = pad_int(self.debit, 15)
130
        self.quantite = pad_int(self.quantite, 15)
131
        line = self.enregistrement + self.date + self.monnaie + self.compte + \
132
            self.intitule_compte + self.type_compte + \
133
            self.compte_principale_defaut + self.compte_principale + \
134
            self.intitule_compte_principal + self.debit + self.credit + \
135
            self.quantite + self.nature_quantite + self.libelle_principale + \
136
            self.libelle_secondaire + self.lettrable + self.piece + \
137
            self.rapprochement
138
        line = pad_str(line, 255)
139
        lines = [line]
140
        lines.extend([echeance.render() for echeance in self.echeances])
141
        lines.extend([imputation.render() for imputation in self.imputations])
142
        line_sep = chr(10)
143
        res = line_sep.join(lines)
144
        return res
145

    
146
class EcheancePaiement():
147

    
148
    def __init__(self):
149
        self.enregistrement = 'C'
150

    
151
    def render_to_ascii(self):
152
        return None
153

    
154
class ImputationAnalytique():
155

    
156
    def __init__(self, credit=0, debit=0, quantite=0):
157
        self.enregistrement = 'D'
158
        self.compte_ana = pad_str('CMPP', 8)
159
        self.intitule = pad_str('Compte analytique CMPP', 30)
160
        self.credit = credit
161
        self.debit = debit
162
        self.quantite = quantite
163
        self.nature_quantite = pad_str('', 20)
164

    
165
    def render(self):
166
        self.credit = pad_int(self.credit, 15)
167
        self.debit = pad_int(self.debit, 15)
168
        self.quantite = pad_int(self.quantite, 15)
169
        line = self.enregistrement + self.compte_ana + self.intitule + \
170
            self.debit + self.credit + \
171
            self.quantite + self.nature_quantite
172
        line = pad_str(line, 255)
173
        return line
(12-12/16)