= 201401 ; TRUNCATE rh.p_chiffrier_production ; INSERT INTO rh.p_chiffrier_production (entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures) SELECT entreprise_id, etablissement_id, annee_mois, count(distinct cpte_personne), sum(montant_brut), sum(heures_payees) from w_bul GROUP BY 1,2,3 ; ]]> on met le mois de paie en cours (et surtout pas current_date). from w_cnt, w_periode group by 1 UNION ALL select cpte_personne, min(date_debut_paie) as date_debut, max(date_fin_paie) as date_fin from w_bul group by 1 ) as subq join prod_cegialpha.fnp_tab_per_personnes on fnp_tab_per_personnes.cpt_personne = subq.cpte_personne group by 1,2 ; DROP TABLE IF EXISTS w_evt_mois ; CREATE TEMP TABLE w_evt_mois AS select w_lim_sal.cpte_personne, w_lim_sal.matricule, cpt_contrat, -- contrat cpt_bulletin, -- bulletins p_calendrier.mois, min(p_calendrier.date) as date_debut, max(p_calendrier.date) as date_fin from base.p_calendrier join w_lim_sal on p_calendrier.date between w_lim_sal.date_debut and w_lim_sal.date_fin left join w_cnt on 1=1 and w_cnt.cpte_personne = w_lim_sal.cpte_personne and p_calendrier.date between w_cnt.date_debut and w_cnt.date_fin left join w_bul on 1=1 and w_bul.cpte_personne = w_lim_sal.cpte_personne and p_calendrier.date between w_bul.date_debut_paie and w_bul.date_fin_paie group by 1,2,3,4,5 --,6,7,8,9 --,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38 having 1!=1 or cpt_contrat is not null -- on ne conserve que les évenements ou il y a un contrat OU or cpt_bulletin is not null -- un bulletin ; DROP TABLE IF EXISTS w_profils ; CREATE TEMP TABLE w_profils AS select row_number() over () as row_id, 0 as profil_id, 0 as contrat_id, 0 as contrat_mois_id, 0 as salarie_id, w_evt_mois.cpte_personne, w_evt_mois.matricule, w_evt_mois.mois, w_evt_mois.date_debut, w_evt_mois.date_fin, coalesce(w_cnt.entreprise_id, w_bul.entreprise_id, 0) as entreprise_id, coalesce(w_cnt.etablissement_id, w_bul.etablissement_id, 0) as etablissement_id, -- **** contrat **** w_cnt.cpt_contrat, w_cnt.identifiant_contrat, w_cnt.etp_cnt, coalesce(w_cnt.cpt_contrat, -- si la valeur est renseignée sur la ligne courante, on la prend. (max(case when w_cnt.cpt_contrat is null then null else ARRAY[extract(epoch from w_evt_mois.date_debut)::text, w_cnt.cpt_contrat] end) over wb)[2], -- sinon on prend la valeur renseignée la plus proche dans le passé (min(case when w_cnt.cpt_contrat is null then null else ARRAY[extract(epoch from w_evt_mois.date_debut)::text, w_cnt.cpt_contrat] end) over wf)[2], -- sinon on prend la valeur renseignée la plus proche dans le futur null -- sinon on prend null. Ne devrait pas arriver. ) as cti_cnt_all, -- cpt_contrat mais renseigné avec les valeurs précédentes ou suivantes lorsque hors période de contrat. Utile pour p_contrats_mois. w_cnt.date_debut as cnt_date_debut, w_cnt.date_fin as cnt_date_fin, -- **** bulletins **** w_bul.cpt_bulletin, --w_bul.date_debut as bul_date_debut, --w_bul.date_fin as bul_date_fin, case when w_cnt.cpt_contrat is null then 1 else 0 end as est_hors_periode, -- **** code original **** coalesce(code_csp, chr(1)||'*') AS categorie_socio_professionnelle_code_original, coalesce(cpte_emploi, chr(1)||'*') AS code_emploi_code_original, chr(1)||'*' AS grille_code_original, chr(1)||'*' AS grille_groupe_code_original, coalesce(cpte_groupe, chr(1)||'*') AS groupe_cotisant_code_original, coalesce(code_dad_motif_debut, chr(1)||'*') as motif_debut_code_original, coalesce(code_dad_motif_fin, chr(1)||'*') as motif_fin_code_original, coalesce(cpte_qualification, chr(1)||'*') AS qualification_code_original, chr(1)||'*' AS section_analytique_code_original, chr(1)||'*' AS section_analytique_paie_code_original, chr(1)||'*' AS service_code_original, -- @todo chr(1)||'*' AS societe_interim_code_original, chr(1)||'*' AS specialite_code_original, -- @todo coalesce(code_dad_statut_prof, chr(1)||'*') AS statut_code_original, coalesce(code_type_contrat, chr(1)||'*') as type_contrat_code_original, coalesce(bl_travail_nuit, chr(1)||'*') AS type_horaire_code_original, coalesce(case when etp_cnt = 1 then 'TC' else 'TP'||lpad(round(etp_cnt * 100, 2), 2, '0') end, chr(1)||'*') AS type_temps_travail_code_original, -- @todo -- Public chr(1)||'*' AS cadre_emploi_code_original, chr(1)||'*' AS categorie_conge_code_original, chr(1)||'*' AS categorie_statutaire_code_original, chr(1)||'*' AS commission_paritaire_code_original, chr(1)||'*' AS compte_salarie_code_original, chr(1)||'*' AS filiere_code_original, chr(1)||'*' AS lettre_budgetaire_code_original, chr(1)||'*' AS unite_fonctionnelle_code_original from w_evt_mois left join w_cnt on w_cnt.cpt_contrat = w_evt_mois.cpt_contrat left join w_bul on w_bul.cpt_bulletin = w_evt_mois.cpt_bulletin window wb as (PARTITION BY w_evt_mois.cpte_personne ORDER BY w_evt_mois.date_debut rows unbounded preceding), -- sélectionne les lignes précédentes wf as (PARTITION BY w_evt_mois.cpte_personne ORDER BY w_evt_mois.date_debut rows between current row and unbounded following) -- sélectionne les lignes suivantes ; ]]> Si les dates d'entrée/sortie d'établissement semblent incohérentes par rapports aux dates des contrats, les corriger. -- UPDATE rh.p_salaries -- SET date_entree_ets = date_debut_contrat -- FROM (SELECT salarie_id, min(date_debut) AS date_debut_contrat from rh.p_contrats group by 1) subview -- WHERE 1=1 -- AND p_salaries.oid = subview.salarie_id -- -- AND date_debut_contrat < date_entree_ets -- On corrige désormais TOUTES les dates d'entrées ets. car cela pose des soucis de calcul -- -- des TOPs entrée/sortie ets. dans p_contrats_mois. -- ; -- UPDATE rh.p_salaries -- SET date_sortie_ets = date_fin_contrat -- FROM (SELECT salarie_id, max(date_fin) AS date_fin_contrat from rh.p_contrats group by 1) subview -- WHERE 1=1 -- AND p_salaries.oid = subview.salarie_id -- AND date_fin_contrat > date_sortie_ets -- ; -- Màj de l'ancienneté. UPDATE rh.p_contrats SET anciennete_anterieure_jours = subq.anciennete_anterieure_jours, anciennete_anterieure_calculee_mois = subq.anciennete_anterieure_calculee_mois FROM ( select numero_contrat, coalesce(sum(date_fin - date_debut + 1) over w, 0) AS anciennete_anterieure_jours, coalesce(sum(date_fin - date_debut + 1) over w / 30::numeric, 0) AS anciennete_anterieure_calculee_mois from rh.p_contrats window w as (partition by salarie_id order by date_debut rows between UNBOUNDED PRECEDING and 1 preceding)) AS subq WHERE 1=1 AND p_contrats.numero_contrat = subq.numero_contrat ; SELECT base.cti_stash_table_indexes('rh.p_contrats_mois') ; TRUNCATE rh.p_contrats_mois ; ALTER SEQUENCE rh.s_contrats_mois RESTART WITH 1 ; DROP TABLE IF EXISTS w_contrats_mois ; CREATE TEMP TABLE w_contrats_mois AS SELECT nextval('rh.s_contrats_mois'::regclass) as contrat_mois_id, p_salaries.oid AS salarie_id, p_contrats.oid AS contrat_id, w_profils.mois AS mois_activite, w_profils.date_debut, w_profils.date_fin, CASE WHEN p_salaries.date_entree_ets BETWEEN w_profils.date_debut AND w_profils.date_fin THEN 1 ELSE 0 END AS nombre_entrees, CASE WHEN p_salaries.date_sortie_ets BETWEEN w_profils.date_debut AND w_profils.date_fin THEN 1 ELSE 0 END AS nombre_departs, CASE WHEN w_profils.cnt_date_debut BETWEEN w_profils.date_debut AND w_profils.date_fin THEN 1 ELSE 0 END AS nombre_debut_contrat, CASE WHEN w_profils.cnt_date_fin BETWEEN w_profils.date_debut AND w_profils.date_fin THEN 1 ELSE 0 END AS nombre_fin_contrat, w_profils.est_hors_periode, CASE WHEN w_profils.date_debut BETWEEN w_profils.cnt_date_debut AND w_profils.cnt_date_fin THEN 1 ELSE 0 END AS present_debut_mois, CASE WHEN w_profils.date_fin BETWEEN w_profils.cnt_date_debut AND w_profils.cnt_date_fin THEN 1 ELSE 0 END AS present_fin_mois, case when cpt_contrat IS NOT NULL then w_profils.etp_cnt -- Il n'y a pas d'ETP contrat ni d'anciennetés pour les contrats_mois hors période. * ( (least(w_profils.date_fin, w_profils.cnt_date_fin) - greatest(w_profils.date_debut, w_profils.cnt_date_debut) + 1)::numeric / (base.cti_last_day(to_date(w_profils.mois, 'YYYYMM')) - to_date(w_profils.mois, 'YYYYMM') + 1)::numeric ) else 0 end AS equivalent_temps_plein, base.cti_age(least(w_profils.date_fin, w_profils.cnt_date_fin), coalesce(p_salaries.date_naissance, '1962-04-18'::date), 'ny') AS age_id, least(w_profils.date_fin, w_profils.cnt_date_fin)::date - coalesce(p_salaries.date_naissance, '1962-04-18'::date) AS age_jours, case when cpt_contrat IS NOT NULL then p_contrats.anciennete_anterieure_jours + (w_profils.date_fin - w_profils.cnt_date_debut) + 1 else 0 end AS anciennete_jours, case when cpt_contrat IS NOT NULL then base.cti_age(date_trunc('month', w_profils.date_fin::date)::date, date_trunc('month', w_profils.cnt_date_debut)::date, 'nm') + greatest(p_contrats.anciennete_anterieure_mois, p_contrats.anciennete_anterieure_calculee_mois) + 1 else 0 end AS anciennete_mois, case when cpt_contrat IS NOT NULL then floor((base.cti_age(date_trunc('month', w_profils.date_fin::date)::date, date_trunc('month', w_profils.cnt_date_debut)::date, 'nm') + greatest(p_contrats.anciennete_anterieure_mois, p_contrats.anciennete_anterieure_calculee_mois) + 1) / 12) else 0 end AS anciennete_annee_id, coalesce(w_profils.etablissement_id, p_contrats.etablissement_id, 0) as etablissement_id, array_agg(w_profils.row_id) as array_row_id -- array des profils. FROM w_profils JOIN rh.p_salaries ON w_profils.salarie_id = p_salaries.oid LEFT JOIN rh.p_contrats ON p_contrats.code_original = w_profils.cti_cnt_all WHERE false -- Il faut au moins un contrat ou un bulletin. OR cpt_contrat IS NOT NULL OR cpt_bulletin IS NOT NULL GROUP BY 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ; -- On renseigne les id de contrats de w_profils. UPDATE w_profils SET contrat_id = subq.contrat_id, contrat_mois_id = subq.contrat_mois_id FROM ( select unnest(array_row_id) as row_id, contrat_mois_id, contrat_id from w_contrats_mois) as subq WHERE w_profils.row_id = subq.row_id ; INSERT INTO rh.p_contrats_mois( oid, salarie_id, contrat_id, mois_activite, date_debut, date_fin, nombre_entrees, nombre_departs, nombre_debut_contrat, nombre_fin_contrat, est_hors_periode, -- bulletins de paie hors période de contrat. present_debut_mois, present_fin_mois, equivalent_temps_plein, age_id, age_jours, anciennete_jours, anciennete_mois, anciennete_annee_id, etablissement_id) SELECT contrat_mois_id, salarie_id, contrat_id, mois_activite, date_debut, date_fin, nombre_entrees, nombre_departs, nombre_debut_contrat, nombre_fin_contrat, est_hors_periode, present_debut_mois, present_fin_mois, equivalent_temps_plein, age_id, age_jours, anciennete_jours, anciennete_mois, anciennete_annee_id, etablissement_id FROM w_contrats_mois ; SELECT base.cti_stash_pop_table_indexes('rh.p_contrats_mois') ; /* Présents fin de mois */ DROP TABLE IF EXISTS w_presents_fin_mois ; CREATE TEMP TABLE w_presents_fin_mois AS SELECT p_contrats.salarie_id, date(p_contrats_mois.date_debut - interval '1 day') AS date_presence FROM rh.p_contrats_mois JOIN rh.p_contrats ON p_contrats_mois.contrat_id = p_contrats.oid WHERE 1=1 AND fictif <> '1' AND est_hors_periode <> '1' AND date_part('day',p_contrats_mois.date_debut) = 01 GROUP BY 1,2 ; UPDATE rh.p_contrats_mois SET present_fin_mois = '1' FROM w_presents_fin_mois WHERE p_contrats_mois.salarie_id = w_presents_fin_mois.salarie_id AND p_contrats_mois.date_fin = w_presents_fin_mois.date_presence AND present_fin_mois <> '1' AND fictif <> '1' AND est_hors_periode <> '1' ; UPDATE rh.p_contrats_mois SET present_fin_mois = '0' WHERE present_fin_mois = '1' AND ( date_part('day',date_fin+interval '1 day') <> 1 OR fictif = '1' OR est_hors_periode = '1' ) ; UPDATE rh.p_contrats_mois SET present_fin_mois = '0' FROM ( SELECT oid FROM rh.p_contrats_mois LEFT JOIN w_presents_fin_mois ON p_contrats_mois.salarie_id = w_presents_fin_mois.salarie_id AND p_contrats_mois.date_fin = w_presents_fin_mois.date_presence WHERE present_fin_mois = '1' AND w_presents_fin_mois IS NULL ) subview WHERE p_contrats_mois.oid = subview.oid ; ]]> = 201401 ; CREATE TEMP TABLE w_hp AS SELECT cpt_bulletin, cpte_contrat, cpte_personne, code_dossier_gestion, cpte_rubrique, cpte_organisme, date_paie, mois_paie, date_debut, date_fin, mois, t_rubriques.oid as rubrique_id, sum(CASE WHEN p_base THEN (CASE s_base WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_base) AS base, sum(CASE WHEN p_nombre THEN (CASE s_nombre WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_nombre) AS nombre, sum(CASE WHEN p_heures_payees THEN (CASE s_heures_payees WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_heures_payees) AS heures_payees, sum(CASE WHEN p_heures_travaillees THEN (CASE s_heures_travaillees WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_heures_travaillees) AS heures_travaillees, sum(CASE WHEN p_masse_salariale THEN (CASE s_masse_salariale WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN (montant + montant_pat) WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_masse_salariale) AS montant_masse_salariale, sum(CASE WHEN p_brut THEN (CASE s_brut WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_brut) AS montant_brut, sum(CASE WHEN p_avantage_nature THEN (CASE s_avantage_nature WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_avantage_nature) AS montant_avantage_nature, sum(CASE WHEN p_frais_imposables THEN (CASE s_frais_imposables WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_frais_imposables) AS montant_frais_imposables, sum(taux * coefficient_txs) AS taux_cotisation_salarie, sum(CASE WHEN p_cotisation_salarie THEN (CASE s_cotisation_salarie WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_cotisation_salarie) AS montant_cotisation_salarie, sum(taux_pat * coefficient_txp) AS taux_cotisation_patronale, sum(CASE WHEN p_cotisation_patronale THEN (CASE s_cotisation_patronale WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_cotisation_patronale) AS montant_cotisation_patronale, sum(CASE WHEN p_od_net_salarie THEN (CASE s_od_net_salarie WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_od_net_salarie) AS montant_od_net_salarie, sum(CASE WHEN p_od_net_patronale THEN (CASE s_od_net_patronale WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_od_net_patronale) AS montant_od_net_patronale, sum(CASE WHEN p_net_imposable THEN (CASE s_net_imposable WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_net_imposable) AS montant_net_imposable_salarie, sum(CASE WHEN p_net_a_payer THEN (CASE s_net_a_payer WHEN 0 THEN base WHEN 1 THEN base WHEN 2 THEN taux WHEN 3 THEN montant WHEN 4 THEN taux_pat WHEN 5 THEN montant_pat WHEN 6 THEN montant + montant_pat WHEN 7 THEN montant - montant_pat WHEN 8 THEN -montant + montant_pat END) ELSE 0 END * c_net_a_payer) AS montant_net_a_payer_salarie FROM w_hp0 JOIN rh.t_rubriques on t_rubriques.code_original = w_hp0.cpte_rubrique WHERE p_detail GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12 ; DROP TABLE IF EXISTS w_hp_1 ; CREATE TEMP TABLE w_hp_1 AS SELECT cpt_bulletin, cpte_contrat, cpte_personne, code_dossier_gestion, cpte_rubrique, cpte_organisme, w_hp.date_paie, w_hp.mois_paie, w_hp.date_debut, w_hp.date_fin, w_hp.mois, p_salaries.oid as salarie_id, p_contrats.oid as contrat_id, CASE WHEN max(p_contrats_mois.oid) IS NOT NULL THEN (max(ARRAY[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] ELSE ( SELECT (max(ARRAY[p_contrats_mois.mois_activite, p_contrats_mois.oid]))[2] FROM rh.p_contrats_mois WHERE p_contrats_mois.contrat_id = p_contrats.oid AND p_contrats_mois.mois_activite < w_hp.mois) END as contrat_mois_id, w_hp.rubrique_id, 0 as organisme_cotisation_id, -- @todo w_hp.base, w_hp.nombre, round(w_hp.heures_payees, 2) AS heures_payees, -- arrondis nécessaires pour retomber juste avec les cumuls. round(w_hp.heures_travaillees, 2) as heures_travaillees, w_hp.montant_masse_salariale, w_hp.montant_brut, w_hp.montant_avantage_nature, w_hp.montant_frais_imposables, w_hp.taux_cotisation_salarie, w_hp.montant_cotisation_salarie, w_hp.taux_cotisation_patronale, w_hp.montant_cotisation_patronale, w_hp.montant_od_net_salarie, w_hp.montant_od_net_patronale, w_hp.montant_net_imposable_salarie, w_hp.montant_net_a_payer_salarie FROM w_hp JOIN rh.p_contrats on p_contrats.code_original = w_hp.cpte_contrat LEFT JOIN rh.p_contrats_mois on 1=1 AND p_contrats_mois.contrat_id = p_contrats.oid AND p_contrats_mois.mois_activite = mois JOIN rh.p_salaries on p_salaries.code_original = w_hp.cpte_personne GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13, 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32 ; TRUNCATE rh.p_historique_paie ; INSERT INTO rh.p_historique_paie( salarie_id, contrat_id, contrat_mois_id, mois_activite, date_debut, date_fin, mois_paie, date_paie, rubrique_id, organisme_cotisation_id, base, nombre, heure_payee, heure_travaillee, montant_masse_salariale, montant_brut, montant_avantage_nature, montant_frais_imposables, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_od_net_salarie, montant_od_net_patronale, montant_net_imposable_salarie, montant_net_a_payer_salarie) SELECT salarie_id, contrat_id, contrat_mois_id, mois, date_debut, date_fin, mois_paie, date_paie, rubrique_id, organisme_cotisation_id, base, nombre, heures_payees, heures_travaillees, montant_masse_salariale, montant_brut, montant_avantage_nature, montant_frais_imposables, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_od_net_salarie, montant_od_net_patronale, montant_net_imposable_salarie, montant_net_a_payer_salarie FROM w_hp_1 ; -- Calcul de la rubrique C000. -- Pas la peine de paramétrer une rubrique de cumul dans l'application car -- il existe une table des bulletins qui reprend les montants cumuls. -- Peut-être faudra-t-il un jour généré comme pour Sage de fausse rubrique -- reprenant les montants et devoir les paramétrer. -- Inserer pour chaque bulletin une ligne 'Ecart cumulé' qui va faire le compte avec le total WITH somme_detail as ( SELECT w_hp_1.salarie_id, w_hp_1.contrat_id, w_hp_1.contrat_mois_id, w_hp_1.cpt_bulletin, w_hp_1.mois_paie, w_hp_1.date_paie, w_hp_1.mois, w_hp_1.date_debut, w_hp_1.date_fin, sum(w_hp_1.heures_payees) AS heures_payees, 0 AS heures_travaillees, sum(w_hp_1.montant_masse_salariale) AS montant_masse_salariale, sum(w_hp_1.montant_brut) AS montant_brut, 0 AS montant_avantage_nature, 0 AS montant_frais_imposables, sum(w_hp_1.montant_cotisation_salarie) AS montant_cotisation_salarie, sum(w_hp_1.montant_cotisation_patronale) AS montant_cotisation_patronale, -- La somme des OD sal et pat est compensée uniquement dans les OD Sal car la rubrique de cumul Cegi Alpha ne fait pas le distingo. sum(w_hp_1.montant_od_net_salarie + w_hp_1.montant_od_net_patronale) AS montant_od_net_salarie, 0 AS montant_od_net_patronale, sum(w_hp_1.montant_net_imposable_salarie) AS montant_net_imposable_salarie, sum(w_hp_1.montant_net_a_payer_salarie) AS montant_net_a_payer_salarie FROM w_hp_1 GROUP BY 1,2,3,4,5,6,7,8,9), diff as ( SELECT somme_detail.salarie_id, somme_detail.contrat_id, somme_detail.contrat_mois_id, somme_detail.cpt_bulletin, somme_detail.mois_paie, somme_detail.date_paie, somme_detail.mois, somme_detail.date_debut, somme_detail.date_fin, sum(w_bul.heures_payees - somme_detail.heures_payees) AS heures_payees, --sum(w_bul.heures_travaillees - somme_detail.heures_travaillees) AS heures_travaillees, 0 AS heures_travaillees, sum(w_bul.montant_masse_salariale - somme_detail.montant_masse_salariale) AS montant_masse_salariale, sum(w_bul.montant_brut - somme_detail.montant_brut) AS montant_brut, -- sum(w_bul.montant_avantage_nature - somme_detail.montant_avantage_nature) AS montant_avantage_nature, 0 AS montant_avantage_nature, --sum(w_bul.montant_frais_imposables - somme_detail.montant_frais_imposables) AS montant_frais_imposables, 0 AS montant_frais_imposables, sum(w_bul.montant_cotisation_salarie - somme_detail.montant_cotisation_salarie) AS montant_cotisation_salarie, sum(w_bul.montant_cotisation_patronale - somme_detail.montant_cotisation_patronale) AS montant_cotisation_patronale, sum(w_bul.montant_od_net_salarie - somme_detail.montant_od_net_salarie) AS montant_od_net_salarie, -- sum(w_bul.montant_od_net_patronale - somme_detail.montant_od_net_patronale) AS montant_od_net_patronale, 0 AS montant_od_net_patronale, sum(w_bul.montant_net_imposable_salarie - somme_detail.montant_net_imposable_salarie) AS montant_net_imposable_salarie, sum(w_bul.montant_net_a_payer_salarie - somme_detail.montant_net_a_payer_salarie) AS montant_net_a_payer_salarie FROM somme_detail JOIN w_bul ON w_bul.cpt_bulletin = somme_detail.cpt_bulletin GROUP BY 1,2,3,4,5,6,7,8,9) INSERT INTO rh.p_historique_paie( salarie_id, contrat_id, contrat_mois_id, mois_activite, date_debut, date_fin, mois_paie, date_paie, rubrique_id, organisme_cotisation_id, base, nombre, heure_payee, heure_travaillee, montant_masse_salariale, montant_brut, montant_avantage_nature, montant_frais_imposables, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_od_net_salarie, montant_od_net_patronale, montant_net_imposable_salarie, montant_net_a_payer_salarie) SELECT diff.salarie_id, diff.contrat_id, diff.contrat_mois_id, diff.mois, diff.date_debut, diff.date_fin, diff.mois_paie, diff.date_paie, (select oid from rh.t_rubriques where code_original = 'C000'), 0 as organisme_cotisation_id, 0 as base, 0 as nombre, diff.heures_payees, diff.heures_travaillees, diff.montant_masse_salariale, diff.montant_brut, diff.montant_avantage_nature, diff.montant_frais_imposables, 0 as taux_cotisation_salarie, diff.montant_cotisation_salarie, 0 as taux_cotisation_patronale, diff.montant_cotisation_patronale, diff.montant_od_net_salarie, diff.montant_od_net_patronale, diff.montant_net_imposable_salarie, diff.montant_net_a_payer_salarie FROM diff WHERE 1!=1 OR diff.heures_payees != 0 OR diff.heures_travaillees != 0 OR diff.montant_brut != 0 OR diff.montant_avantage_nature != 0 OR diff.montant_frais_imposables != 0 OR diff.montant_cotisation_salarie != 0 OR diff.montant_cotisation_patronale != 0 OR diff.montant_od_net_salarie != 0 OR diff.montant_od_net_patronale != 0 OR diff.montant_net_imposable_salarie != 0 OR diff.montant_net_a_payer_salarie != 0 GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 ; ]]> = 2008 -- GROUP BY w_at.abs_id,1,7,8 -- ; -- INSERT INTO rh.p_arrets_travail_mois( -- arret_travail_id, -- salarie_id, -- contrat_id, -- contrat_mois_id, -- mois_activite, -- nb_debut_arret, -- nb_fin_arret, -- nb_reprise_apres_arret, -- date_debut, -- date_fin, -- nb_jours, -- nb_arret -- ) -- SELECT -- arr.oid AS arret_travail_id, -- arr.salarie_id AS salarie_id, -- arr.contrat_id AS contrat_id, -- p_contrats_mois.oid AS contrat_mois_id, -- cal.mois, -- CASE WHEN arr.date_debut BETWEEN cal.date_debut AND cal.date_fin THEN 1 ELSE 0 END AS nombre_debut_arret, -- CASE WHEN arr.date_fin BETWEEN cal.date_debut AND cal.date_fin THEN 1 ELSE 0 END AS nombre_fin_arret, -- CASE WHEN arr.date_reprise BETWEEN cal.date_debut AND cal.date_fin THEN 1 ELSE 0 END AS nombre_reprise_apres_arret, -- -- Lorsque la date de reprise est isolée sur un mois (l'arrêt de travail s'est terminé le mois précédent) : -- -- la date de début = date de reprise, -- CASE WHEN arr.date_reprise BETWEEN cal.date_debut AND cal.date_fin AND arr.date_fin