Пример #1
0
    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
Пример #2
0
    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