def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ donnees_csv = [] try: for ligne in dossier_source.reader(self.nom_fichier): donnees_csv.append(ligne) except IOError as e: Outils.fatal(e, "impossible d'ouvrir le fichier : "+SuppressionFacture.nom_fichier) num = 4 if len(donnees_csv) != num: Outils.fatal(ErreurConsistance(), SuppressionFacture.libelle + ": nombre de lignes incorrect : " + str(len(donnees_csv)) + ", attendu : " + str(num)) try: self.annee = int(donnees_csv[0][1]) self.mois = int(donnees_csv[1][1]) except ValueError as e: Outils.fatal(e, SuppressionFacture.libelle + "\nle mois et l'année doivent être des nombres entiers") try: self.version = int(donnees_csv[2][1]) except ValueError as e: Outils.fatal(e, SuppressionFacture.libelle + "\nla version doit être un nombre entier") if self.version < 0: Outils.fatal(ErreurConsistance(), SuppressionFacture.libelle + ": la version doit être positive ") self.client_unique = donnees_csv[3][1]
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ fichier_reader = dossier_source.reader(self.nom_fichier) self.donnees = {} labels = [] try: for ligne in fichier_reader: if len(ligne) != 2: Outils.fatal(ErreurConsistance(), self.libelle + ": nombre de colonnes incorrect : " + str(len(ligne)) + ", attendu : 2") if ligne[0] in labels: Outils.fatal(ErreurConsistance(),self.libelle + "le label '" + ligne[0] + " n'est pas unique\n") ligne[0], err = Outils.est_un_alphanumerique(ligne[0], "le label", chevrons=True) if err != "": Outils.fatal(ErreurConsistance(), self.libelle + err) ligne[1], err = Outils.est_un_texte(ligne[1], "l'entête") if err != "": Outils.fatal(ErreurConsistance(), self.libelle + err) labels.append(ligne[0]) self.donnees[ligne[0]] = ligne[1] except IOError as e: Outils.fatal(e, "impossible d'ouvrir le fichier : "+self.nom_fichier)
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ self._chemin = dossier_source.chemin try: fichier_reader = dossier_source.reader(self.nom_fichier) donnees_csv = [] for ligne in fichier_reader: donnees_ligne = self.extraction_ligne(ligne) if donnees_ligne == -1: continue donnees_csv.append(donnees_ligne) self.donnees = donnees_csv except IOError as e: Outils.fatal( e, "impossible d'ouvrir le fichier : " + self.nom_fichier) del self.donnees[0] for donnee in self.donnees: if donnee['int'] != "" and donnee['int'] != 'X' and donnee[ 'int'] != 'NO': Outils.fatal( ErreurConsistance(), self.libelle + ": donnée INT doit être X, NO ou vide ") if donnee['ext_postal'] != "" and donnee[ 'ext_postal'] != 'X' and donnee['ext_postal'] != 'NO': Outils.fatal( ErreurConsistance(), self.libelle + ": donnée EXT & POSTAL doit être X, NO ou vide ") if donnee['ext_mail'] != "" and donnee[ 'ext_mail'] != 'X' and donnee['ext_mail'] != 'NO': Outils.fatal( ErreurConsistance(), self.libelle + ": donnée EXT & MAIL doit être X, NO ou vide ") if donnee['nom'] in self.dossiers_annexes: donnee['dossier'] = self.dossiers_annexes[donnee['nom']] else: Outils.fatal( ErreurConsistance(), self.libelle + ": nom non-attendu : " + donnee['nom'] + ", pas de nom de dossier ")
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ donnees_csv = [] try: for ligne in dossier_source.reader(self.nom_fichier): donnees_csv.append(ligne) except IOError as e: Outils.fatal( e, "impossible d'ouvrir le fichier : " + Edition.nom_fichier) num = 3 if len(donnees_csv) != num: Outils.fatal( ErreurConsistance(), Edition.libelle + ": nombre de lignes incorrect : " + str(len(donnees_csv)) + ", attendu : " + str(num)) try: self.annee = int(donnees_csv[0][1]) self.mois = int(donnees_csv[1][1]) except ValueError as e: Outils.fatal( e, Edition.libelle + "\nle mois et l'année doivent être des nombres") self.version = donnees_csv[2][1] self.client_unique = "" jours = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if self.mois != 2: jour = jours[self.mois - 1] else: if self.annee % 4 == 0: if self.annee % 100 == 0: if self.annee % 400 == 0: jour = 29 else: jour = 28 else: jour = 29 else: jour = 28 self.dernier_jour = jour mois_fr = [ "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" ] self.mois_txt = mois_fr[self.mois - 1]
def extraction_ligne(self, ligne): """ extracte une ligne de données du csv :param ligne: ligne lue du fichier :return: tableau représentant la ligne, indexé par les clés """ num = len(self.cles) if len(ligne) != num: Outils.fatal( ErreurConsistance(), self.libelle + ": nombre de lignes incorrect : " + str(len(ligne)) + ", attendu : " + str(num)) donnees_ligne = {} for xx in range(0, num): donnees_ligne[self.cles[xx]] = ligne[xx] return donnees_ligne
def __init__(self, dossier_source, prod2qual=None): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource :param prod2qual: Une instance de la classe Prod2Qual si on souhaite éditer des factures et annexes avec les codes d'articles de qualification """ self._donnees = {} try: for ligne in dossier_source.reader(self.nom_fichier): cle = ligne.pop(0) if cle not in self.cles_autorisees: Outils.fatal( ErreurConsistance(), "Clé inconnue dans %s: %s" % (self.nom_fichier, cle)) if cle != "texte_sap": while ligne[-1] == "": del ligne[-1] self._donnees[cle] = ligne except IOError as e: Outils.fatal( e, "impossible d'ouvrir le fichier : " + Generaux.nom_fichier) if prod2qual and 'code_sap_qas' in self._donnees: self._donnees['code_sap'] = self._donnees['code_sap_qas'] erreurs = "" for cle in self.cles_obligatoires: if cle not in self._donnees: erreurs += "\nClé manquante dans %s: %s" % (self.nom_fichier, cle) try: for quantite in self._donnees['quantite'][1:]: int(quantite) except ValueError: erreurs += "les quantités doivent être des nombres entiers\n" try: self._donnees['min_fact_rese'][1] = int( self._donnees['min_fact_rese'][1]) except ValueError: erreurs += "le montant minimum pour des frais de facturation doit être un nombre\n" codes_n = [] for nn in self._donnees['code_n'][1:]: if nn not in codes_n: codes_n.append(nn) else: erreurs += "le code N '" + nn + "' n'est pas unique\n" codes_d = [] for dd in self._donnees['code_d'][1:]: if dd not in codes_d: codes_d.append(dd) else: erreurs += "le code D '" + dd + "' n'est pas unique\n" if len(self._donnees['code_n']) != len(self._donnees['code_ref_fact']): erreurs += "le nombre de colonees doit être le même pour le code N et pour le code référence du client\n" if (len(self._donnees['code_d']) != len(self._donnees['code_sap'])) or \ (len(self._donnees['code_d']) != len(self._donnees['quantite'])) or \ (len(self._donnees['code_d']) != len(self._donnees['unite'])) or \ (len(self._donnees['code_d']) != len(self._donnees['type_prix'])) or \ (len(self._donnees['code_d']) != len(self._donnees['intitule_long'])) or \ (len(self._donnees['code_d']) != len(self._donnees['intitule_court'])) or \ (len(self._donnees['code_d']) != len(self._donnees['eligible_U1'])) or \ (len(self._donnees['code_d']) != len(self._donnees['eligible_U2'])) or \ (len(self._donnees['code_d']) != len(self._donnees['eligible_U3'])) or \ (len(self._donnees['code_d']) != len(self._donnees['type_rabais'])) or \ (len(self._donnees['code_d']) != len(self._donnees['texte_sap'])): erreurs += "le nombre de colonnes doit être le même pour le code D, le code SAP, la quantité, l'unité, " \ "le type de prix, le type de rabais, le texte SAP, l'intitulé long, l'intitulé court, " \ "l'éligible U1, l'éligible U2 et l'éligible U3\n" if len(self._donnees['centre'][1]) > 70: erreurs += "le string du paramètre centre est trop long" if erreurs != "": Outils.fatal(ErreurConsistance(), self.libelle + "\n" + erreurs)
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ donnees_csv = [] self.verifie_coherence = 0 msg = "" try: for ligne in dossier_source.reader(self.nom_fichier): donnees_csv.append(ligne) except IOError as e: Outils.fatal( e, "impossible d'ouvrir le fichier : " + self.nom_fichier) num = 5 if len(donnees_csv) != num: Outils.fatal( ErreurConsistance(), self.libelle + ": nombre de lignes incorrect : " + str(len(donnees_csv)) + ", attendu : " + str(num)) self.annee, err = Outils.est_un_entier(donnees_csv[0][1], "l'année", min=2000, max=2099) msg += err self.mois, err = Outils.est_un_entier(donnees_csv[1][1], "le mois", min=1, max=12) msg += err self.version, err = Outils.est_un_entier(donnees_csv[2][1], "la version", min=0) msg += err self.client_unique = donnees_csv[3][1] if self.version == 0 and self.client_unique != "": msg += " il ne peut pas y avoir de client unique pour la version 0" if self.version > 0 and self.client_unique == "": msg += " il doit y avoir un client unique pour une version > 0" self.filigrane, err = Outils.est_un_texte(donnees_csv[4][1], "le filigrane", vide=True) msg += err jours = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if self.mois != 2: jour = jours[self.mois - 1] else: if self.annee % 4 == 0: if self.annee % 100 == 0: if self.annee % 400 == 0: jour = 29 else: jour = 28 else: jour = 29 else: jour = 28 self.dernier_jour = jour mois_fr = [ "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre" ] self.mois_txt = mois_fr[self.mois - 1] if msg != "": Outils.fatal(ErreurConsistance(), Edition.libelle + "\n" + msg)
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ self._donnees = {} try: for ligne in dossier_source.reader(self.nom_fichier): cle = ligne.pop(0) if cle not in self.cles: Outils.fatal(ErreurConsistance(), "Clé inconnue dans %s: %s" % (self.nom_fichier, cle)) while ligne[-1] == "": del ligne[-1] self._donnees[cle] = ligne except IOError as e: Outils.fatal(e, "impossible d'ouvrir le fichier : "+SubGeneraux.nom_fichier) erreurs = "" for cle in self.cles: if cle not in self._donnees: erreurs += "\nClé manquante dans %s: %s" % (self.nom_fichier, cle) codes_n = [] for nn in self._donnees['code_n'][1:]: if nn not in codes_n: codes_n.append(nn) else: erreurs += "le code N '" + nn + "' n'est pas unique\n" codes_t = [] for tt in self._donnees['code_t'][1:]: if tt not in codes_t: codes_t.append(tt) else: erreurs += "le code T '" + tt + "' n'est pas unique\n" nb = 0 self.avec_bonus = False for it in self._donnees['indice_t']: if it == '2': nb += 1 if nb > 1: erreurs += "le code T2 doit être unique ou nul" if nb == 1: self.avec_bonus = True codes_d = [] for dd in self._donnees['code_d'][1:]: if dd not in codes_d: codes_d.append(dd) else: erreurs += "le code D '" + dd + "' n'est pas unique\n" nb = 0 for id in self._donnees['indice_d']: if id == '2': nb += 1 if nb != 1: erreurs += "le code D2 doit être unique et exister" if (len(self._donnees['code_d']) != len(self._donnees['indice_d'])) or \ (len(self._donnees['code_d']) != len(self._donnees['intitule_long'])) or \ (len(self._donnees['code_d']) != len(self._donnees['intitule_court'])): erreurs += "le nombre de colonnes doit être le même pour le code D, l'indice D, l'intitulé long" \ " et l'intitulé court\n" if (len(self._donnees['code_t']) != len(self._donnees['indice_t'])) or \ (len(self._donnees['code_t']) != len(self._donnees['texte_t_long'])) or \ (len(self._donnees['code_t']) != len(self._donnees['texte_t_ref'])) or \ (len(self._donnees['code_t']) != len(self._donnees['texte_t_court'])): erreurs += "le nombre de colonnes doit être le même pour le code T, l'indice T, le texte T long" \ ", le texte T court et le texte T ref\n" if erreurs != "": Outils.fatal(ErreurConsistance(), self.libelle + "\n" + erreurs)
def __init__(self, dossier_source, prod2qual=None): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource :param prod2qual: Une instance de la classe Prod2Qual si on souhaite éditer des factures et annexes avec les codes d'articles de qualification """ self._donnees = {} self.verifie_coherence = 0 try: for ligne in dossier_source.reader(self.nom_fichier): cle = ligne.pop(0) if cle not in self.cles_autorisees: Outils.fatal(ErreurConsistance(), "Clé inconnue dans %s: %s" % (self.nom_fichier, cle)) if cle != "texte_sap": while ligne[-1] == "": del ligne[-1] self._donnees[cle] = ligne except IOError as e: Outils.fatal(e, "impossible d'ouvrir le fichier : "+self.nom_fichier) if prod2qual and 'code_sap_qas' in self._donnees: self._donnees['code_sap'] = self._donnees['code_sap_qas'] erreurs = "" for cle in self.cles_obligatoires: if cle not in self._donnees: erreurs += "\nClé manquante dans %s: %s" % (self.nom_fichier, cle) self._donnees['centre'][1], err = Outils.est_un_texte(self._donnees['centre'][1], "le centre") erreurs += err self._donnees['origine'][1], err = Outils.est_un_alphanumerique(self._donnees['origine'][1], "l'origine") erreurs += err self._donnees['code_int'][1], err = Outils.est_un_alphanumerique(self._donnees['code_int'][1], "le code INT") erreurs += err self._donnees['code_ext'][1], err = Outils.est_un_alphanumerique(self._donnees['code_ext'][1], "le code EXT") erreurs += err self._donnees['commerciale'][1], err = Outils.est_un_alphanumerique(self._donnees['commerciale'][1], "le com.") erreurs += err self._donnees['canal'][1], err = Outils.est_un_alphanumerique(self._donnees['canal'][1], "le canal") erreurs += err self._donnees['secteur'][1], err = Outils.est_un_alphanumerique(self._donnees['secteur'][1], "le secteur") erreurs += err self._donnees['devise'][1], err = Outils.est_un_alphanumerique(self._donnees['devise'][1], "la devise") erreurs += err self._donnees['financier'][1], err = Outils.est_un_alphanumerique(self._donnees['financier'][1], "le financier") erreurs += err self._donnees['fonds'][1], err = Outils.est_un_alphanumerique(self._donnees['fonds'][1], "le fonds") erreurs += err self._donnees['entete'][1], err = Outils.est_un_texte(self._donnees['entete'][1], "l'entête", vide=True) erreurs += err self._donnees['poste_reservation'][1], err = Outils.est_un_entier(self._donnees['poste_reservation'][1], "le poste réservation", min=1, max=9) erreurs += err self._donnees['lien'][1], err = Outils.est_un_chemin(self._donnees['lien'][1], "le lien") erreurs += err self._donnees['chemin'][1], err = Outils.est_un_chemin(self._donnees['chemin'][1], "le chemin") erreurs += err self._donnees['chemin_propre'][1], err = Outils.est_un_chemin(self._donnees['chemin_propre'][1], "le chemin propre") erreurs += err self._donnees['chemin_filigrane'][1], err = Outils.est_un_chemin(self._donnees['chemin_filigrane'][1], "le chemin filigrane") erreurs += err for intitule in self._donnees['intitule_n'][1:]: intitule, err = Outils.est_un_texte(intitule, "l'intitulé N") erreurs += err for code_s in self._donnees['code_sap'][1:]: code_s, err = Outils.est_un_entier(code_s, "le code sap", min=1) erreurs += err for code_sq in self._donnees['code_sap_qas'][1:]: code_sq, err = Outils.est_un_entier(code_sq, "le code sap qas", min=1) erreurs += err for quantite in self._donnees['quantite'][1:]: quantite, err = Outils.est_un_nombre(quantite, "la quantité", arrondi=3, min=0) erreurs += err for unite in self._donnees['unite'][1:]: unite, err = Outils.est_un_texte(unite, "l'unité") erreurs += err for type_prix in self._donnees['type_prix'][1:]: type_prix, err = Outils.est_un_alphanumerique(type_prix, "le type de prix") erreurs += err for type_rabais in self._donnees['type_rabais'][1:]: type_rabais, err = Outils.est_un_alphanumerique(type_rabais, "le type de rabais") erreurs += err for texte_sap in self._donnees['texte_sap'][1:]: texte_sap, err = Outils.est_un_texte(texte_sap, "le texte sap", vide=True) erreurs += err for intitule_long in self._donnees['intitule_long'][1:]: intitule_long, err = Outils.est_un_texte(intitule_long, "l'intitulé long") erreurs += err for intitule_court in self._donnees['intitule_court'][1:]: intitule_court, err = Outils.est_un_texte(intitule_court, "l'intitulé court") erreurs += err for modes in self._donnees['modes'][1:]: modes, err = Outils.est_un_alphanumerique(modes, "le mode d'envoi", vide=True) erreurs += err self._donnees['min_fact_rese'][1], err = Outils.est_un_nombre( self._donnees['min_fact_rese'][1], "le montant minimum pour des frais de facturation", arrondi=2, min=0) erreurs += err codes_n = [] for nn in self._donnees['code_n'][1:]: nn, err = Outils.est_un_alphanumerique(nn, "le code N") erreurs += err if nn not in codes_n: codes_n.append(nn) else: erreurs += "le code N '" + nn + "' n'est pas unique\n" codes_d = [] for dd in self._donnees['code_d'][1:]: dd, err = Outils.est_un_alphanumerique(dd, "le code D") erreurs += err if dd not in codes_d: codes_d.append(dd) else: erreurs += "le code D '" + dd + "' n'est pas unique\n" len_ok = True if len(self._donnees['code_n']) != len(self._donnees['intitule_n']) or \ len(self._donnees['code_n']) != len(self._donnees['code_ref_fact']) or \ len(self._donnees['code_n']) != len(self._donnees['avantage_HC']) or \ len(self._donnees['code_n']) != len(self._donnees['subsides']) or \ len(self._donnees['code_n']) != len(self._donnees['rabais_excep']) or \ len(self._donnees['code_n']) != len(self._donnees['filtrer_article_nul']): len_ok = False erreurs += "le nombre de colonees doit être le même pour le code N, l'intitulé N, " \ "le code référence du client, l'avantage HC, le mode subsides, le mode rabais exceptionnel et " \ "le filtre articles nuls\n" if len_ok: for i in range(1, len(self._donnees['code_n'])): if self._donnees['code_ref_fact'][i] != 'INT' and self._donnees['code_ref_fact'][i] != 'EXT': erreurs += "le code référence client doit être INT ou EXT\n" if self._donnees['avantage_HC'][i] != 'BONUS' and self._donnees['avantage_HC'][i] != 'RABAIS': erreurs += "l'avantage HC doit être BONUS ou RABAIS\n" if self._donnees['subsides'][i] != 'BONUS' and self._donnees['subsides'][i] != 'RABAIS': erreurs += "le mode subsides doit être BONUS ou RABAIS\n" if self._donnees['rabais_excep'][i] != 'BONUS' and self._donnees['rabais_excep'][i] != 'RABAIS': erreurs += "le mode rabais exceptionnel doit être BONUS ou RABAIS\n" if self._donnees['filtrer_article_nul'][i] != 'OUI' and self._donnees['filtrer_article_nul'][i] != 'NON': erreurs += "le filtre articles nuls doit être OUI ou NON\n" if len(self._donnees['code_d']) != len(self._donnees['code_sap']) or \ len(self._donnees['code_d']) != len(self._donnees['quantite']) or \ len(self._donnees['code_d']) != len(self._donnees['unite']) or \ len(self._donnees['code_d']) != len(self._donnees['type_prix']) or \ len(self._donnees['code_d']) != len(self._donnees['intitule_long']) or \ len(self._donnees['code_d']) != len(self._donnees['intitule_court']) or \ len(self._donnees['code_d']) != len(self._donnees['type_rabais']) or \ len(self._donnees['code_d']) != len(self._donnees['texte_sap']): erreurs += "le nombre de colonnes doit être le même pour le code D, le code SAP, la quantité, l'unité, " \ "le type de prix, le type de rabais, le texte SAP, l'intitulé long et l'intitulé court\n" if len(self._donnees['centre'][1]) > 70: erreurs += "le string du paramètre centre est trop long" if erreurs != "": Outils.fatal(ErreurConsistance(), self.libelle + "\n" + erreurs)
def __init__(self, dossier_source): """ initialisation et importation des données :param dossier_source: Une instance de la classe dossier.DossierSource """ donnees_csv = [] try: for ligne in dossier_source.reader(self.nom_fichier): donnees_csv.append(ligne) except IOError as e: Outils.fatal( e, "impossible d'ouvrir le fichier : " + SubEdition.nom_fichier) num = 5 if len(donnees_csv) != num: Outils.fatal( ErreurConsistance(), SubEdition.libelle + ": nombre de lignes incorrect : " + str(len(donnees_csv)) + ", attendu : " + str(num)) if len(donnees_csv[0]) != 3 or len(donnees_csv[1]) != 3 or len( donnees_csv[2]) != 3 or len(donnees_csv[3]) != 3: Outils.fatal(ErreurConsistance(), SubEdition.libelle + ": nombre de colonnes incorrect") try: self.annee_debut_bonus = int(donnees_csv[0][1]) self.mois_debut_bonus = int(donnees_csv[0][2]) self.annee_fin_bonus = int(donnees_csv[1][1]) self.mois_fin_bonus = int(donnees_csv[1][2]) self.annee_debut_subs = int(donnees_csv[2][1]) self.mois_debut_subs = int(donnees_csv[2][2]) self.annee_fin_subs = int(donnees_csv[3][1]) self.mois_fin_subs = int(donnees_csv[3][2]) except ValueError as e: Outils.fatal( e, SubEdition.libelle + "\nles mois et les années doivent être des nombres entiers") if Outils.comparaison_date(self.annee_debut_bonus, self.mois_debut_bonus, self.annee_fin_bonus, self.mois_fin_bonus) > 0: Outils.fatal( ErreurConsistance(), SubEdition.libelle + ": la fin du bonus ne peut être avant le début") if Outils.comparaison_date(self.annee_debut_subs, self.mois_debut_subs, self.annee_fin_subs, self.mois_fin_subs) > 0: Outils.fatal( ErreurConsistance(), SubEdition.libelle + ": la fin des subsides ne peut être avant le début") if Outils.comparaison_date( self.annee_debut_bonus, self.mois_debut_bonus, self.annee_debut_subs, self.mois_debut_subs) < 0: self.annee_debut_general = self.annee_debut_bonus self.mois_debut_general = self.mois_debut_bonus else: self.annee_debut_general = self.annee_debut_subs self.mois_debut_general = self.mois_debut_subs if Outils.comparaison_date(self.annee_fin_bonus, self.mois_fin_bonus, self.annee_fin_subs, self.mois_fin_subs) > 0: self.annee_fin_general = self.annee_fin_bonus self.mois_fin_general = self.mois_fin_bonus else: self.annee_fin_general = self.annee_fin_subs self.mois_fin_general = self.mois_fin_subs self.filigrane = donnees_csv[4][1]