def MAJ(self): # Calcul des heures à facturer self.heures_a_facturer = self.heures_prevues - self.heures_absences_deductibles + self.heures_regularisation + self.duree_solde_rtt self.montant_a_facturer = FloatToDecimal( self.tarif_base * UTILS_Dates.DeltaEnFloat(self.heures_a_facturer)) # Calcul des dépassements self.montant_depassements = FloatToDecimal( self.tarif_depassement * UTILS_Dates.DeltaEnFloat(self.heures_depassements)) self.montant_a_facturer += self.montant_depassements self.heures_a_facturer += self.heures_depassements
def Calculer(self, mode_test=False, dict_valeurs={}): """ Calcul des totaux et des mensualités """ """ dict_valeurs : pour saisir des valeurs tests """ # Récupération des données date_debut = self.GetValeur("date_debut") if "date_debut" in dict_valeurs: date_debut = dict_valeurs["date_debut"] date_fin = self.GetValeur("date_fin") if "date_fin" in dict_valeurs: date_fin = dict_valeurs["date_fin"] tracks_previsions = self.GetValeur("tracks_previsions", []) tracks_tarifs = self.GetValeur("tracks_tarifs", []) duree_heures_regularisation = self.GetValeur( "duree_heures_regularisation", datetime.timedelta(0)) arrondi_type = self.GetValeur("arrondi_type", "duree") arrondi_delta = self.GetValeur("arrondi_delta", 30) # Absences duree_absences_prevues = self.GetValeur("duree_absences_prevues", datetime.timedelta(0)) duree_absences_prises = self.GetValeur("duree_absences_prises", datetime.timedelta(0)) duree_absences_solde = duree_absences_prevues - duree_absences_prises self.SetValeur("duree_absences_solde", duree_absences_solde) # Vérifie si dates du contrat valides avant les calculs if date_debut != None and date_fin != None and date_fin > date_debut: dates_valides = True else: dates_valides = False # Calcul du nbre de semaines et de mois if dates_valides: nbre_semaines = rrule.rrule(rrule.WEEKLY, dtstart=date_debut, until=date_fin).count() nbre_mois = rrule.rrule(rrule.MONTHLY, dtstart=date_debut, until=date_fin).count() else: nbre_semaines = 0 nbre_mois = 0 # Analyse des heures prévues duree_heures_brut = datetime.timedelta(0) listeDatesUniques = [] for track in tracks_previsions: duree_heures_brut += track.duree_arrondie if track.date not in listeDatesUniques: listeDatesUniques.append(track.date) # Calcul du nbre de dates uniques nbre_dates = len(listeDatesUniques) # Calcul des moyennes if nbre_dates == 0: moy_heures_jour = datetime.timedelta(0) moy_heures_semaine = datetime.timedelta(0) moy_heures_mois = datetime.timedelta(0) else: moy_heures_jour = duree_heures_brut // nbre_dates moy_heures_semaine = duree_heures_brut // nbre_semaines moy_heures_mois = duree_heures_brut // nbre_mois # Calcul du nbre d'heures du contrat duree_heures_contrat = duree_heures_brut - duree_absences_prevues + duree_heures_regularisation # Génération des dates de facturation if dates_valides: liste_mois = list( rrule.rrule(rrule.MONTHLY, bymonthday=1, dtstart=date_debut, until=date_fin)) else: liste_mois = [] nbre_mois_factures = len(liste_mois) # Ajout de la date de début du contrat if dates_valides and date_debut.day > 1: liste_mois.insert(0, date_debut) # Recherche s'il y a des mensualités déjà facturées # listePrestationsFacturees = [] # heuresFacturees = datetime.timedelta(seconds=0) # for dictPrestation in self.GetValeur("liste_prestations", []) : # if dictPrestation["IDfacture"] != None : # listePrestationsFacturees.append(dictPrestation) # heuresFacturees += dictPrestation["temps_facture"] # nbrePrestations = len(listePrestationsFacturees) # Conversion du nbre d'heures déjà facturées en entier # heuresFacturees = (nbre_heures_contrat.days*24) + (nbre_heures_contrat.seconds/3600) # Calcul du forfait mensuel # heures_restantes = nbre_heures_contrat - heuresFacturees # nbre_mois_restant = nbre_mois - nbrePrestations if nbre_mois_factures == 0: forfait_horaire_mensuel, reste_division = 0, 0 else: nbre_heures_contrat_float = UTILS_Dates.DeltaEnHeures( duree_heures_contrat) forfait_horaire_mensuel, reste_division = divmod( nbre_heures_contrat_float, nbre_mois_factures) forfait_horaire_dernier_mois = forfait_horaire_mensuel + reste_division forfait_horaire_mensuel = UTILS_Dates.FloatEnDelta( forfait_horaire_mensuel) forfait_horaire_dernier_mois = UTILS_Dates.FloatEnDelta( forfait_horaire_dernier_mois) # Calcul du forfait horaire mensuel # if nbre_mois == 0 : # forfait_horaire_mensuel, reste_division = 0, 0 # else : # forfait_horaire_mensuel, reste_division = divmod(nbre_heures_contrat, nbre_mois) # forfait_horaire_dernier_mois = forfait_horaire_mensuel + reste_division # Génération des mensualités tracks_mensualites = [] total_mensualites = FloatToDecimal(0.0) index = 0 for date in liste_mois: date_facturation = datetime.date(date.year, date.month, date.day) # Calcul des dates du forfait forfait_date_debut = date_facturation if index == len(liste_mois) - 1: dernierJour = date.day else: dernierJour = calendar.monthrange(date.year, date.month)[1] forfait_date_fin = datetime.date(date.year, date.month, dernierJour) # Calcul du forfait horaire mensuel if index == len(liste_mois) - 1: heures_prevues = forfait_horaire_dernier_mois else: heures_prevues = forfait_horaire_mensuel # Recherche du tarif du mois listeTarifs = [] for track in tracks_tarifs: listeTarifs.append((track.date_debut, track)) listeTarifs.sort() track_tarif = None for date_debut_tarif, track in listeTarifs: if track_tarif == None or date_facturation >= date_debut_tarif: track_tarif = track # Calcul du montant mensuel à facturer if track_tarif != None: tarif_base = track_tarif.tarif_base tarif_depassement = track_tarif.tarif_depassement taux = track_tarif.taux else: tarif_base = 0.0 tarif_depassement = 0.0 taux = 0.0 montant_prevu = FloatToDecimal( tarif_base * UTILS_Dates.DeltaEnFloat(heures_prevues)) total_mensualites += montant_prevu # Recherche d'une prestation existante IDprestation = None IDfacture = None num_facture = None heures_facturees = datetime.timedelta(seconds=0) montant_facture = FloatToDecimal(0.0) for dictPrestation in self.GetValeur("liste_prestations", []): if dictPrestation["date_facturation"] == date_facturation: IDprestation = dictPrestation["IDprestation"] IDfacture = dictPrestation["IDfacture"] num_facture = dictPrestation["num_facture"] montant_facture = dictPrestation["montant"] heures_facturees = dictPrestation["temps_facture"] # Mémorisation de la mensualité dictMensualite = { "IDprestation": IDprestation, "date_facturation": date_facturation, "taux": taux, "track_tarif": track_tarif, "tarif_base": tarif_base, "tarif_depassement": tarif_depassement, "heures_prevues": heures_prevues, "montant_prevu": montant_prevu, "heures_facturees": heures_facturees, "montant_facture": montant_facture, "IDfacture": IDfacture, "forfait_date_debut": forfait_date_debut, "forfait_date_fin": forfait_date_fin, "num_facture": num_facture, } tracks_mensualites.append(Track_mensualite(dictMensualite)) index += 1 # Vérifie si anomalies listeAnomalies = [] # Vérifie que les prestations facturées sont toujours l� # for dictPrestation in listePrestationsFacturees : # present = False # for track in tracks_mensualites : # if track.IDprestation == dictPrestation["IDprestation"] : # present = True # if present == False : # listeAnomalies.append(_(u"La prestation du %s ne peut pas être supprimée car elle apparaît déjà sur la facture n°%s." % (UTILS_Dates.DateDDEnFr(dictPrestation["date_facturation"]), dictPrestation["num_facture"]))) # Vérifie si les consommations sont bien sur la période du contrat nbreConsoHorsPeriode = 0 for track in tracks_previsions: if track.date < date_debut or track.date > date_fin: nbreConsoHorsPeriode += 1 if nbreConsoHorsPeriode > 0: listeAnomalies.append( _(u"%d consommations prévues sont en dehors de la période du contrat." % nbreConsoHorsPeriode)) # Si mode test, renvoie la liste des anomalies if mode_test == True: if len(listeAnomalies) > 0: from Dlg import DLG_Messagebox introduction = _( u"Votre saisie ne peut pas être validée en raison des erreurs suivantes :" ) detail = "\n".join(listeAnomalies) conclusion = _(u"Veuillez modifier les données saisies.") dlg = DLG_Messagebox.Dialog(None, titre=_(u"Erreur"), introduction=introduction, detail=detail, conclusion=conclusion, icone=wx.ICON_INFORMATION, boutons=[ _(u"Ok"), ]) dlg.ShowModal() dlg.Destroy() return False else: return True # Envoi des données à clsbase dictValeurs = { "nbre_semaines": nbre_semaines, "nbre_mois": nbre_mois, "duree_heures_brut": duree_heures_brut, "nbre_dates": nbre_dates, "moy_heures_jour": moy_heures_jour, "moy_heures_semaine": moy_heures_semaine, "moy_heures_mois": moy_heures_mois, "duree_heures_contrat": duree_heures_contrat, "forfait_horaire_mensuel": forfait_horaire_mensuel, "forfait_horaire_dernier_mois": forfait_horaire_dernier_mois, "tracks_mensualites": tracks_mensualites, "nbre_mensualites": len(tracks_mensualites), "total_mensualites": total_mensualites, } self.SetValeurs(dictValeurs) return dictValeurs