def _get_nb_m_effectif(self, cr, uid, ids, name, args, context=None): """nombre d'heures dans les mois associés à l'avenant """ result = {} for record in self.browse(cr, uid, ids, context=context): nb_m = 0 mam_mois_e = self.pool.get('mam.mois_e') mois_e_ids = mam_mois_e.search(cr, uid, [('avenant_id','=',record.id)], context=context) for mois_e in mam_mois_e.browse(cr, uid, mois_e_ids, context=context): print "mois ", mois_e, " , h ", mois_e.minutes_present_prevu nb_m += mam_tools.conv_str2minutes(mois_e.minutes_present_prevu) + mam_tools.conv_str2minutes(mois_e.minutes_absent) + mam_tools.conv_str2minutes(mois_e.minutes_excuse) result[record.id]= mam_tools.conv_minutes2str(nb_m) return result
def _get_minutes(self, cr, uid, ids, name, args, context=None): """minutes bilan de la journée """ result = {} for record in self.browse(cr, uid, ids, context=context): print "* calcul minutes jour ", record.id, liste = [] # on crée une liste au format (heure,type,est_debut) for prevu in record.presence_prevue_ids: # p = prévu liste += [(mam_tools.conv_str2minutes(prevu.heure_debut),'p',True), (mam_tools.conv_str2minutes(prevu.heure_fin),'p',False)] for reel in record.presence_e_ids: if reel.type in [u'normal']: # r = réel liste += [(mam_tools.conv_str2minutes(reel.heure_debut),'r',True), (mam_tools.conv_str2minutes(reel.heure_fin),'r',False)] if reel.type in [u'malade',u'cause_am']: # e = excusé liste += [(mam_tools.conv_str2minutes(reel.heure_debut),'e',True), (mam_tools.conv_str2minutes(reel.heure_fin),'e',False)] if reel.type in [u'abus',u'absent']: # a = abus liste += [(mam_tools.conv_str2minutes(reel.heure_debut),'a',True), (mam_tools.conv_str2minutes(reel.heure_fin),'a',False)] liste.sort() # print liste hdebut = 0 est_prevu = est_present = est_excuse = est_abus = False m_pres_prev = m_pres_imprev = m_absent = m_excuse = 0 for (heure,type,est_debut) in liste: # print (heure,type,est_debut) delta = heure - hdebut if est_prevu and est_present: m_pres_prev += delta if est_prevu and est_excuse: m_excuse += delta elif not est_prevu and est_present: m_pres_imprev += delta elif (est_prevu and not est_present and not est_excuse) or est_abus: m_absent += delta if est_prevu and type == 'p': #assert est_debut == False est_prevu = est_debut elif not est_prevu and type == 'p': #assert est_debut == True est_prevu = est_debut elif est_present and type == 'r': #assert est_debut == False est_present = est_debut elif not est_present and type == 'r': #assert est_debut == True est_present = est_debut elif est_excuse and type == 'e': #assert est_debut == False est_excuse = est_debut elif not est_excuse and type == 'e': #assert est_debut == True est_excuse = est_debut elif est_abus and type == 'a': #assert est_debut == False est_abus = est_debut elif not est_abus and type == 'a': #assert est_debut == True est_abus = est_debut hdebut = heure # print "minutes_present_prevu ", m_pres_prev # print "minutes_present_imprevu ", m_pres_imprev # print "minutes_absent ", m_absent result[record.id] = {} result[record.id]['minutes_present_prevu'] = mam_tools.conv_minutes2str(m_pres_prev) result[record.id]['minutes_present_imprevu'] = mam_tools.conv_minutes2str(m_pres_imprev) result[record.id]['minutes_absent'] = mam_tools.conv_minutes2str(m_absent) result[record.id]['minutes_excuse'] = mam_tools.conv_minutes2str(m_excuse) print return result
def calculs_mois(self, cr, uid, ids, name, args, context=None): # Tous les calculs de fin de mois # Problème du début de contrat (d'avenants) en milieu de mois : on considère que le premier mois est une régul. # L'année commence le mois suivant. # Valeurs partagées eur_salaire_horaire_net = 3.2 # 3.2€ / heure eur_salaire_complementaire_net = 3.2 # 3.2€ / heure eur_salaire_supplementaire_net = 4.0 # 4.0€ / heure eur_entretien_0_9 = 3.2 # 3.2€ / jour si moins de 9h eur_entretien_9_plus = 4.0 # 4.0€ / jour si plus de 9h eur_entretien_minimum = 32.0 # 32 € d'entretien minimum eur_repas_midi_6_18m = 2.0 eur_repas_midi_plus_18m = 3.0 eur_repas_gouter = 1.0 coef_net_brut = 1.3 result = {} for mois_e in self.browse(cr, uid, ids, context=context): type_contrat = mois_e.avenant_id.contrat_id.type date_debut_avenant = mois_e.avenant_id.date_debut # au format yyyy-mm-dd date_fin_avenant = mois_e.avenant_id.date_fin # au format yyyy-mm-dd (ou false s'il n'y en a pas) remarques = "" jour_debut = 1 est_debut_avenant = False est_fin_avenant = False if date_debut_avenant[:7] == "{0}-{1:02d}".format(mois_e.annee, mois_e.mois): # le mois du début du contrat, le jour_début est le premier jour du contrat. jour_debut = int(date_debut_avenant[8:]) est_debut_avenant = True date_debut_mois = "{0}-{1:02d}-{2:02d}".format(mois_e.annee, mois_e.mois, jour_debut) date_debut_mois_d = date(mois_e.annee, mois_e.mois, jour_debut) jour_fin = calendar.monthrange(mois_e.annee, mois_e.mois)[1] # dernier jour du mois = nombre de jours dans le mois if date_fin_avenant and date_fin_avenant [:7] == "{0}-{1:02d}".format(mois_e.annee, mois_e.mois): # le mois de fin du contrat, le jour_fin est le dernier jour du contrat. jour_fin = int(date_fin_avenant[8:]) est_fin_avenant = True date_fin_mois = "{0}-{1:02d}-{2:02d}".format(mois_e.annee, mois_e.mois, jour_fin) _logger.info(pl("--- debut calcul mois :", mois_e.avenant_id.contrat_id.enfant_id.nomprenom, date_debut_mois, date_fin_mois)) # calcul du nombre de jours à récupérer du mois précédent pour le calcul des heures complémentaires par semaines if date_debut_mois_d.weekday() >= 5: # le premier du mois est samedi ou dimanche lundi_mois_prec_d = date_debut_mois_d # on ne va pas chercher les dates du mois précédent else: # on commence la recherche au lundi d'avant lundi_mois_prec_d = date_debut_mois_d - timedelta(days=date_debut_mois_d.weekday()) # tarif du repas du midi par rapport à l'age age_mois = int((datetime.strptime(date_fin_mois,'%Y-%m-%d') - datetime.strptime(mois_e.avenant_id.contrat_id.enfant_id.date_naiss,'%Y-%m-%d')).days / 30.417) _logger.info(pl( "age du gamin", age_mois)) if age_mois > 18: eur_repas_midi = eur_repas_midi_plus_18m _logger.info(pl( "> 18, repas midi :",eur_repas_midi)) else: eur_repas_midi = eur_repas_midi_6_18m _logger.info(pl( ">= 18, repas midi :",eur_repas_midi)) remarques += "age enfant (mois) : " + `age_mois` + "\n" remarques += "tarif repas : "******"\n" # calcul du mois de régul if date_debut_avenant[8:] == "01": # le contrat commence en début de mois # calcul du mois de regul de l'avenant (mois précédant l'anniversaire) mois_de_regul_avenant = int(date_debut_avenant[5:7]) - 1 if mois_de_regul_avenant == 0: mois_de_regul_avenant = 12 # décembre else: # sinon la regul se fait le mois anniversaire et non pas le mois précédent mois_de_regul_avenant = int(date_debut_avenant[5:7]) _logger.info(pl( "mois de regul avenant : ", mois_de_regul_avenant)) # faut-il faire une régul ce mois-ci ? faire_regul = (mois_de_regul_avenant == mois_e.mois) _logger.info(pl( "faire regul : ", faire_regul)) if faire_regul: remarques += "il faut faire une régul ce mois-ci\n" else: remarques += "il ne faut pas faire une régul ce mois-ci\n" # on parcourt les jours pour récupérer les infos m_pres_prev = m_pres_imprev = m_absent = m_excuse = 0 m_complementaires = m_supplementaires = m_imprev_semaine = 0 indemnite_entretien = 0.0 indemnite_midi = indemnite_gouter = indemnite_frais = 0.0 nb_jours_activite = 0 mam_jour_e = self.pool.get('mam.jour_e') _logger.info(pl( "enfant_id", mois_e.avenant_id.contrat_id.enfant_id.id)) # attention : on recherche tous les jours en commençant au lundi de la semaine d'avant pour les calculs à la semaine jour_e_ids = mam_jour_e.search(cr, uid, [('enfant_id','=',mois_e.avenant_id.contrat_id.enfant_id.id),('jour','>=',str(lundi_mois_prec_d)),('jour','<=',date_fin_mois)], order='jour', context=context) for jour_e in mam_jour_e.browse(cr, uid, jour_e_ids, context=context): if (jour_e.jour < date_debut_mois): # jours du mois précédent _logger.info(pl( "semaine prec:", jour_e.jour)) m_imprev_semaine += mam_tools.conv_str2minutes(jour_e.minutes_present_imprevu) # mais on ne va pas plus loin continue j_pres_prev = mam_tools.conv_str2minutes(jour_e.minutes_present_prevu) j_pres_imprev = mam_tools.conv_str2minutes(jour_e.minutes_present_imprevu) j_absent = mam_tools.conv_str2minutes(jour_e.minutes_absent) j_excuse = mam_tools.conv_str2minutes(jour_e.minutes_excuse) m_pres_prev += j_pres_prev m_pres_imprev += j_pres_imprev m_absent += j_absent m_excuse += j_excuse if j_pres_prev + j_pres_imprev + j_absent > 0: nb_jours_activite += 1 # pour les contrats halte garderie, il n'y a pas de prévu, seulement de l'imprévu ; on transfert tout dans l'imprévu. if type_contrat != u'normal': m_pres_imprev += m_pres_prev m_pres_prev = 0 # pour un contrat normal, on compte les heures complémentaires et supplémentaires m_imprev_semaine += j_pres_imprev # le vendredi, calcul des jours complémentaires/supplémentaires if datetime.strptime(jour_e.jour,'%Y-%m-%d').weekday() == 4: # heure complémentaire : heure non prévue au contrat jusqu'à 46h par semaine # on stocke des minutes # au delà, c'est des heures supplémentaires if m_imprev_semaine <= 46*60: m_complementaires += m_imprev_semaine else: m_complementaires += 46*60 m_supplementaires += m_imprev_semaine - 46*60 _logger.error(pl( "semaine ",jour_e.jour,":", m_imprev_semaine, "compl:", m_complementaires, "suppl:",m_supplementaires)) remarques += "imprevu semaine du " + jour_e.jour + ": "+ `m_imprev_semaine`+ " m, total compl:"+ `m_complementaires`+ " m, total suppl:"+`m_supplementaires`+" m\n" # on remet le compteur à zero pour la semaine suivante m_imprev_semaine = 0 # pour un contrat halte garderie, on ne compte que les heures supplémentaires if type_contrat != u'normal': m_complementaires = 0 # calculs des frais d'entretiens if j_pres_prev + j_pres_imprev > 0: if j_pres_prev + j_pres_imprev < 9*60: indemnite_entretien += eur_entretien_0_9 else: indemnite_entretien += eur_entretien_9_plus # calcul des frais repas + autres if jour_e.mange_midi: indemnite_midi += eur_repas_midi if jour_e.mange_gouter: indemnite_gouter += eur_repas_gouter indemnite_frais += jour_e.frais_montant m_contrat = 0 salaire_base_net = 0 absences_net = 0 excuse_net = 0 m_effectif = 0 if type_contrat == u'normal': # indemnité d'entretien minimum : 32€ (si le contrat ne se termine pas ou ne commence pas) if indemnite_entretien < eur_entretien_minimum and not est_debut_avenant and not est_fin_avenant : # TODO: a améliorer pour que si le début du contrat et le premier jour du mois ou fin = fin on prenne qd meme le minimum... remarques += "Passage entretien minimum : " + `indemnite_entretien` + " --> " + `eur_entretien_minimum` + "\n" indemnite_entretien = eur_entretien_minimum # quand enfant malade avec justif : les heures sont déduites du salaire de base mensuel + on décompte le nombre d'heures restantes du nombre total d'heures prévues au contrat # cause am = comme quand malade m_contrat = mois_e.avenant_id.nb_h_par_an * (60/12) # on stocke des minutes par mois salaire_base_net = float(m_contrat)/60 * eur_salaire_horaire_net m_effectif = m_contrat - m_excuse # on arrondit au dessus : m_effectif = (m_effectif + 59) / 60 * 60 if type_contrat == u'normal': m_a_comptabiliser = m_pres_prev-m_excuse else: m_a_comptabiliser = m_pres_imprev # Pour le premier mois, on compte comme en halte garderie : ce qui est du. Pas de congés ? m_ajout_arrondi = (60 - ((m_a_comptabiliser) % 60)) % 60 remarques += "Ajout minutes pour arrondi : " + `m_ajout_arrondi` + "\n" remarques += " Total minutes après arrondi : " + mam_tools.conv_minutes2str(m_a_comptabiliser + m_ajout_arrondi) + "\n" complementaires_net = float(m_complementaires)/60 * eur_salaire_complementaire_net supplementaires_net = float(m_supplementaires)/60 * eur_salaire_supplementaire_net presences_net = float(m_a_comptabiliser + m_ajout_arrondi)/60 * eur_salaire_horaire_net # salaire_hors_cp_abs_net : # Pour les contrats CDI : salaire de base prévu au contrat (sauf pour le premier mois où c’est le salaire au réel, càd en fonction du nombre d’heures réalisées dans le mois # Pour les contrats occasionnels : nb d’heures réalisées dans le mois x 3,20€ cp_net = 0 cumul_salaire_net_encours = 0 if type_contrat == u'normal': # TODO : le premier mois il est compté en présence_net if est_debut_avenant: salaire_hors_cp_abs_net = presences_net else: salaire_hors_cp_abs_net = salaire_base_net # TODO : # les congés payés ne sont pas pris en compte depuis le début jusqu'au 31 mai # a partir du 1er juin qui suit le début du contrat, il faut ajouter les congés payés qui sont fonction du début du contrat # les CP, c'est un montant fixe 1/12 de 1/10 de la rémunération net (salaire net) qui a eu lieu jusqu'à présent # ce montant, c'est toujours le même pendant 1 an. # L'année d'après, on refait le calcul (et pour l'histoire, le salaire net comprend les congés payés de l'année précédente...) # en fait on fait le calcul à chaque mois, donc on cherche le mois de mai précédent et le moi de juin de l'année -1 if mois_e.mois >= 6: date_cp_annee_debut = mois_e.annee - 1 else: date_cp_annee_debut = mois_e.annee - 2 mam_mois_e2 = self.pool.get('mam.mois_e') mam_mois_e2_ids = mam_mois_e2.search(cr, uid, [('avenant_id','=',mois_e.avenant_id.id)], order='annee, mois', context=context) for mois_e2 in mam_mois_e2.browse(cr, uid, mam_mois_e2_ids, context=context): _logger.error(pl( "----- CP annee: ",mois_e2.annee, ", mois: ",mois_e2.mois)) if (mois_e2.annee == date_cp_annee_debut and mois_e2.mois >= 6) or (mois_e2.annee == date_cp_annee_debut + 1 and mois_e2.mois < 6): _logger.error(pl( "----- on la compte = + ", mois_e2.salaire_net)) cumul_salaire_net_encours += mois_e2.salaire_net cp_net = cumul_salaire_net_encours / 12 / 10 # on arrondit au dessus : m_excuse_arrondi = (m_excuse + 59) / 60 * 60 excuse_net = float(m_excuse_arrondi)/60 * eur_salaire_horaire_net salaire_net = salaire_hors_cp_abs_net + cp_net - excuse_net + complementaires_net + supplementaires_net else: salaire_hors_cp_abs_net = presences_net # on arrondit au dessus : m_absent_arrondi = (m_absent + 59) / 60 * 60 absences_net = float(m_absent_arrondi)/60 * eur_salaire_horaire_net # CP : 10% tous les mois cp_net = (salaire_hors_cp_abs_net + absences_net) * 0.1 salaire_net = salaire_hors_cp_abs_net + absences_net + cp_net + complementaires_net + supplementaires_net # TODO : calcul de l'indemnité de rupture : # il faut que le contrat ait plus d'un an d'ancienneté # = 1/120 du total des salaires net perçus pendant la totalité du contrat indemnite_rupture = 0 result[mois_e.id] = {} result[mois_e.id]['jour_debut'] = jour_debut result[mois_e.id]['jour_fin'] = jour_fin result[mois_e.id]['type_contrat'] = type_contrat result[mois_e.id]['minutes_present_prevu'] = mam_tools.conv_minutes2str(m_pres_prev) result[mois_e.id]['minutes_present_imprevu'] = mam_tools.conv_minutes2str(m_pres_imprev) result[mois_e.id]['minutes_absent'] = mam_tools.conv_minutes2str(m_absent) result[mois_e.id]['minutes_excuse'] = mam_tools.conv_minutes2str(m_excuse) result[mois_e.id]['nb_heures_mois_contrat'] = mam_tools.conv_minutes2str(m_contrat) result[mois_e.id]['salaire_base_brut'] = salaire_base_net * coef_net_brut result[mois_e.id]['salaire_base_net'] = salaire_base_net result[mois_e.id]['nb_heures_mois_effectif'] = mam_tools.conv_minutes2str(m_effectif) result[mois_e.id]['nb_heures_complementaires'] = mam_tools.conv_minutes2str(m_complementaires) result[mois_e.id]['nb_heures_supplementaires'] = mam_tools.conv_minutes2str(m_supplementaires) result[mois_e.id]['nb_jours_activite'] = nb_jours_activite result[mois_e.id]['presences_brut'] = presences_net * coef_net_brut result[mois_e.id]['presences_net'] = presences_net result[mois_e.id]['salaire_hors_cp_abs_brut'] = salaire_hors_cp_abs_net * coef_net_brut result[mois_e.id]['salaire_hors_cp_abs_net'] = salaire_hors_cp_abs_net result[mois_e.id]['absences_brut'] = absences_net * coef_net_brut result[mois_e.id]['absences_net'] = absences_net result[mois_e.id]['excuse_brut'] = excuse_net * coef_net_brut result[mois_e.id]['excuse_net'] = excuse_net result[mois_e.id]['cp_brut'] = cp_net * coef_net_brut result[mois_e.id]['cp_net'] = cp_net result[mois_e.id]['salaire_brut'] = salaire_net * coef_net_brut result[mois_e.id]['salaire_net'] = salaire_net result[mois_e.id]['cumul_salaire_brut_encours'] = cumul_salaire_net_encours * coef_net_brut result[mois_e.id]['cumul_salaire_net_encours'] = cumul_salaire_net_encours result[mois_e.id]['indemnite_rupture'] = indemnite_rupture result[mois_e.id]['indemnite_entretien'] = indemnite_entretien result[mois_e.id]['indemnite_midi'] = indemnite_midi result[mois_e.id]['indemnite_gouter'] = indemnite_gouter result[mois_e.id]['indemnite_frais'] = indemnite_frais result[mois_e.id]['remarques'] = remarques return result