'' THEN ' Q'||qualif ELSE '' END, substr(lib_group||CASE WHEN qualif <> '' THEN ' Q'||qualif ELSE '' END,1,50) FROM prod_sigems.groupe_fiehp WHERE lpad(c_group,2,'0')||lpad(qualif,4,'0') NOT IN (SELECT code_original FROM rh.t_grilles_groupes) GROUP BY 1,2,3,4 ;*/ -- @TODO: Màj des groupes de grilles INSERT INTO rh.t_grilles_groupes(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_grilles_groupes) ; /* INSERT INTO rh.t_grilles_groupes(code_original, code, texte, texte_court) SELECT c_group, c_group, lib_group, substr(lib_group,1,50) FROM prod_sigems.groupe_fiehp WHERE c_group NOT IN (SELECT code_original FROM rh.t_grilles_groupes) GROUP BY 1,2,3,4 ;*/ -- Màj des motifs d'arret INSERT INTO rh.t_motifs_arret(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_motifs_arret) ; INSERT INTO rh.t_motifs_arret(code, texte, texte_court, code_original) SELECT ta_code, ta_intitule, substr(ta_intitule,1,50), ta_code FROM prod_sage100.f_tab WHERE 1=1 AND ta_typetable = 0 AND ta_code NOT IN (SELECT code_original FROM rh.t_motifs_arret) GROUP BY 1,2,3,4 ; -- Màj des précisions du motif d'arrêt INSERT INTO rh.t_precisions_motif_arret(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseignée', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_precisions_motif_arret) ; -- @TODO: Màj des motifs de visite médicale INSERT INTO rh.t_motifs_visite(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_motifs_visite) ; /* INSERT INTO rh.t_motifs_visite(code_original, code, texte, texte_court) SELECT code, code, libelle, substr(libelle,1,50) FROM prod_sigems.MOTIF_VISMED WHERE code NOT IN (SELECT code_original FROM rh.t_motifs_visite) GROUP BY 1,2,3,4 ;*/ -- @TODO: Màj des circonstances d'accident du travail INSERT INTO rh.t_accident_circonstance(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_accident_circonstance) ; /* INSERT INTO rh.t_accident_circonstance(code_original, code, texte, texte_court) SELECT code, code, libelle, substr(libelle,1,50) FROM prod_sigems.acc_circst WHERE code NOT IN (SELECT code_original FROM rh.t_accident_circonstance) AND code <> '' AND code IS DISTINCT FROM NULL GROUP BY 1,2,3,4 ;*/ -- @TODO: Màj des lieux d'accident du travail INSERT INTO rh.t_accident_lieu(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_accident_lieu) ; /* INSERT INTO rh.t_accident_lieu(code_original, code, texte, texte_court) SELECT code_original, code, code_original, substr(code_original,1,50) FROM w_tmp_lieu_1 WHERE code_original NOT IN (SELECT code_original FROM rh.t_accident_lieu) GROUP BY 1,2,3,4 ;*/ -- @TODO: Màj de la nature de l'accident du travail INSERT INTO rh.t_accident_nature(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_accident_nature) ; /* INSERT INTO rh.t_accident_nature(code_original, code, texte, texte_court) SELECT code, code, libelle, substr(libelle,1,50) FROM prod_sigems.acc_nature WHERE code NOT IN (SELECT code_original FROM rh.t_accident_nature) AND code <> '' AND code IS DISTINCT FROM NULL GROUP BY 1,2,3,4 ;*/ -- @TODO: Màj des sièges d'accident du travail INSERT INTO rh.t_accident_siege(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_accident_siege) ; /* INSERT INTO rh.t_accident_siege(code_original, code, texte, texte_court) SELECT code, code, libelle, substr(libelle,1,50) FROM prod_sigems.acc_siege WHERE code NOT IN (SELECT code_original FROM rh.t_accident_siege) AND code <> '' AND code IS DISTINCT FROM NULL GROUP BY 1,2,3,4 ;*/ -- Màj des listes de formations INSERT INTO rh.t_liste_formations(oid, code_original, code, texte, texte_court) SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R' WHERE 0 NOT IN (SELECT oid FROM rh.t_liste_formations) ; INSERT INTO rh.t_liste_formations(code_original, code, texte, texte_court) SELECT fo_code, fo_code, fo_intitule, substr(fo_intitule,1,50) FROM prod_sage100.f_formation WHERE fo_code NOT IN (SELECT code_original FROM rh.t_liste_formations) GROUP BY 1,2,3,4 ; ]]> = 2008 AND date_part('year', f_hcum.hu_date::date) <= 2020 GROUP BY 1,2,3 ; ]]> date_fin ; -- Création d'une table temporaire des contrats DROP TABLE IF EXISTS w_cnt ; CREATE TEMP TABLE w_cnt AS SELECT matricule, '' AS numero_contrat, eta_code, min(date_debut) AS date_debut, max(date_fin) AS date_fin, coalesce(fp_contrat_nature,chr(1)||'*') AS type_contrat FROM w_aff LEFT JOIN prod_sage100.f_renssal ON f_renssal.sa_matricule = w_aff.matricule GROUP BY 1,2,3,6 ; UPDATE w_cnt SET numero_contrat = matricule||replace(date_debut,'-','') ; -- Création d'une table temporaire de l'histo salarié dans établissements /*DROP TABLE IF EXISTS w_ets ; CREATE TEMP TABLE w_ets AS SELECT sa_matricule AS matricule, ae_datededebut::date AS date_debut, (ae_date::date - interval '1 day')::date AS date_fin, ae_etab_code AS eta_code FROM prod_sage100.f_hst_etablissement ; DELETE FROM w_ets WHERE date_debut > date_fin ; UPDATE w_ets SET date_debut = date_fin WHERE date_debut IS NULL ;*/ ]]> = p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS present_fin_mois, base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',p_contrats.date_debut)::date, 'nm') + GREATEST(p_contrats.anciennete_anterieure_mois, p_contrats.anciennete_anterieure_calculee_mois) + 1 AS anciennete_mois, floor((base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',p_contrats.date_debut)::date, 'nm') + GREATEST(p_contrats.anciennete_anterieure_mois, p_contrats.anciennete_anterieure_calculee_mois) + 1) / 12) AS anciennete_annee_id, p_salaries.oid FROM rh.p_contrats JOIN rh.p_salaries ON p_contrats.salarie_id = p_salaries.oid --JOIN rh.t_etablissements ON p_contrats.etablissement_id = t_etablissements.oid --JOIN rh.t_entreprises ON t_etablissements.entreprise_id = t_entreprises.oid JOIN base.p_calendrier_mois ON (p_contrats.date_debut <= p_calendrier_mois.date_fin AND p_contrats.date_fin >= p_calendrier_mois.date_debut) JOIN w_profils ON w_profils.numero_contrat = p_contrats.numero_contrat GROUP BY 1,2,3,4,6,7,8,9,10,11,12,13,14,15 ; ]]> déplacée dans OD/Net CREATE TEMP TABLE w_hp AS ( SELECT sa_matricule AS matricule, hb_date::date AS date, base.cti_first_day(hb_date::date) AS date_debut, base.cti_last_day(hb_date::date) AS date_fin, to_char(hb_date::date,'YYYYMM')::numeric as mois, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, hb_base::numeric AS base, (CASE WHEN ru_gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN ru_rubrique::int != 440 AND ru_type = 1 AND ru_das_avnat != 1 THEN hb_montant::numeric ELSE 0 END) AS montant_brut, 0, --(CASE WHEN ru_gain = 1 THEN 1 ELSE -1 END) * (CASE WHEN ru_rubrique = 9 OR ru_rubrique >= 7990 THEN 0 ELSE hb_montant::numeric END) AS montant_frais_imposables, hb_taux::numeric AS taux_sal, 0 AS montant_sal, 0 AS taux_pat, 0 AS montant_pat, (CASE WHEN (ru_rubrique::int = 440 OR ru_rubrique::int > 1999) AND ru_das_avnat != 1 THEN hb_montant::numeric ELSE 0 END) AS od_net, (CASE WHEN ru_dasenplus2 = 2 THEN hb_montant::numeric ELSE 0 END) AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer FROM prod_sage100.f_hbns JOIN prod_sage100.f_rub ON f_rub.ru_rubrique = f_hbns.hb_rubrique JOIN rh.t_rubriques ON t_rubriques.code_original = f_rub.ru_rubrique WHERE 1=1 AND ru_imprimable = 2 AND hb_montant != 0 AND date_part('year', hb_date::date) >= 2008 --AND sa_matricule = 1117 --AND hb_date >= '2012-01-01' ) UNION ALL ( SELECT sa_matricule AS matricule, hc_date::date AS date, base.cti_first_day(hc_date::date) AS date_debut, base.cti_last_day(hc_date::date) AS date_fin, to_char(hc_date::date,'YYYYMM')::numeric AS mois, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, hc_base::numeric AS base, 0 AS montant_brut, 0 AS montant_frais_imposables, hc_taux_salarial::numeric AS taux_sal, (CASE WHEN ru_gain = 1 THEN -1 ELSE 1 END) * hc_montant_salarial::numeric AS montant_sal, hc_taux_patronal::numeric AS taux_pat, (CASE WHEN ru_gain = 1 THEN -1 ELSE 1 END) * hc_montant_patronal::numeric AS montant_pat, 0 AS od_net, 0 AS avt_nat, 0 AS net_imposable, 0 AS net_a_payer FROM prod_sage100.f_hcot JOIN prod_sage100.f_rub ON f_rub.ru_rubrique = f_hcot.hc_rubrique JOIN rh.t_rubriques ON t_rubriques.code_original = f_rub.ru_rubrique WHERE 1=1 AND ru_imprimable = 2 AND (hc_montant_salarial != 0 OR hc_montant_patronal != 0) AND date_part('year', hc_date::date) >= 2008 --AND sa_matricule = 1117 --AND hc_date >= '2012-01-01' ) UNION ALL ( SELECT sa_matricule AS matricule, hu_date::date AS date, base.cti_first_day(hu_date::date) AS date_debut, base.cti_last_day(hu_date::date) AS date_fin, to_char(hu_date::date,'YYYYMM')::numeric AS mois, t_rubriques.oid AS rub_id, t_rubriques.code_original AS rub_code, t_rubriques.texte AS rub_texte, CASE WHEN hu_constante = 86 THEN hu_valeurcumul::numeric ELSE 0 END AS base, 0 AS montant_brut, 0 AS montant_frais_imposables, 0 AS taux_sal, 0 AS montant_sal, 0 AS taux_pat, 0 AS montant_pat, 0 AS od_net, 0 AS avt_nat, CASE WHEN hu_constante = 4 THEN hu_valeurcumul::numeric ELSE 0 END AS net_imposable, CASE WHEN hu_constante = 3 THEN hu_valeurcumul::numeric ELSE 0 END AS net_a_payer FROM prod_sage100.f_hcum JOIN rh.t_rubriques ON t_rubriques.code_original = 'C' || lpad(hu_constante, 3, '0') WHERE 1=1 AND hu_constante::int IN (3, 4, 86) AND date_part('year', hu_date::date) >= 2008 --AND sa_matricule = 1117 --AND hu_date >= '2012-01-01' ) ; CREATE INDEX i_w_hp_1 ON w_hp USING btree (matricule) ; CREATE INDEX i_w_hp_2 ON w_hp USING btree (date) ; CREATE INDEX i_w_hp_3 ON w_hp USING btree (rub_code) ; TRUNCATE rh.p_historique_paie ; SELECT base.cti_stash_table_indexes('rh', 'p_historique_paie') ; INSERT INTO rh.p_historique_paie ( age_id, base, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, montant_avantage_nature, montant_brut, montant_cotisation_patronale, montant_cotisation_salarie, montant_frais_imposables, montant_net_a_payer_salarie, montant_net_imposable_salarie, montant_od_net_salarie, organisme_cotisation_id, profil_id, rubrique_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie ) SELECT date_part('year', age(date, date_naissance)) AS age_id, base AS base, p_contrats_mois.contrat_id AS contrat_id, p_contrats_mois.oid AS contrat_mois_id, date_trunc('month', date)::date AS date_debut, date::date AS date_fin, date::date AS date_paie, w_hp.mois AS mois_activite, w_hp.mois AS mois_paie, avt_nat AS montant_avantage_nature, montant_brut AS montant_brut, montant_pat AS montant_cotisation_patronale, montant_sal AS montant_cotisation_salarie, 0 AS montant_frais_imposables, net_a_payer AS montant_net_a_payer_salarie, net_imposable AS montant_net_imposable_salarie, od_net AS montant_od_net_salarie, 0 AS organisme_cotisation_id, w_profils.profil_id AS profil_id, w_hp.rub_id AS rubrique_id, p_salaries.oid AS salarie_id, taux_pat AS taux_cotisation_patronale, taux_sal AS taux_cotisation_salarie FROM w_hp JOIN rh.p_salaries ON p_salaries.matricule = w_hp.matricule JOIN w_profils ON 1=1 AND w_profils.matricule = w_hp.matricule AND base.cti_overlaps(aff_date_debut,aff_date_fin,w_hp.date_debut,w_hp.date_fin) LEFT JOIN rh.p_contrats_mois ON 1=1 AND p_contrats_mois.salarie_id = p_salaries.oid AND p_contrats_mois.mois_activite = w_hp.mois 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 ; SELECT base.cti_stash_pop_table_indexes('rh', 'p_historique_paie') ; -- Associer le bulletin de paie au dernier contrat connu lorsque pas de contrat couvrant le mois de paie. UPDATE rh.p_historique_paie SET contrat_id = contrat, contrat_mois_id = contrat_mois, profil_id = profil FROM ( SELECT p_historique_paie.salarie_id, p_historique_paie.date_paie, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats.date_fin),p_contrats.oid]))[2] AS contrat, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats.date_fin),p_contrats.profil_id]))[2] AS profil, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.oid]))[2] AS contrat_mois FROM rh.p_historique_paie JOIN rh.p_contrats ON p_contrats.salarie_id = p_historique_paie.salarie_id JOIN rh.p_contrats_mois ON p_contrats_mois.contrat_id = p_contrats.oid WHERE p_historique_paie.contrat_mois_id IS NULL GROUP BY 1,2 ) AS subq WHERE 1=1 AND p_historique_paie.salarie_id = subq.salarie_id AND p_historique_paie.date_paie = subq.date_paie ; -- Création d'une table temp qui regroupe tous les totaux à atteindre pour calculer l'écart DROP TABLE IF EXISTS w_totaux ; CREATE TEMP TABLE w_totaux AS SELECT sa_matricule AS matricule, hu_date::date AS date, to_char(hu_date::date,'YYYYMM')::numeric AS mois, hu_constante as rub_code, hu_valeurcumul::numeric AS montant FROM prod_sage100.f_hcum WHERE 1=1 AND date_part('year', hu_date::date) >= 2008 AND hu_constante::int IN (3,4,5,6,7,8,86) ; -- Inserer pour chaque bulletin une ligne qui va faire le compte avec le total (rubrique 'C000' nommée 'Ecart cumulé') INSERT INTO rh.p_historique_paie ( age_id, contrat_id, contrat_mois_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, montant_avantage_nature, montant_brut, montant_cotisation_patronale, montant_cotisation_salarie, montant_frais_imposables, montant_net_a_payer_salarie, montant_net_imposable_salarie, montant_od_net_salarie, organisme_cotisation_id, profil_id, rubrique_id, salarie_id, taux_cotisation_patronale, taux_cotisation_salarie ) SELECT age_id, contrat_id, contrat_mois_id, subq.date_debut, subq.date_fin, subq.date_paie, subq.mois_activite, subq.mois_paie, 0 AS base, sum(CASE WHEN rub_code = 5 THEN montant - subq.montant_avantage_nature ELSE 0 END) AS montant_avantage_nature, sum(CASE WHEN rub_code = 8 THEN montant - subq.montant_brut ELSE 0 END) AS montant_brut, sum(CASE WHEN rub_code = 6 THEN montant - subq.montant_cotisation_patronale ELSE 0 END) AS montant_cotisation_patronale, sum(CASE WHEN rub_code = 7 THEN montant - subq.montant_cotisation_salarie ELSE 0 END) AS montant_cotisation_salarie, 0 AS montant_frais_imposables, sum(CASE WHEN rub_code = 3 THEN montant - subq.montant_net_a_payer_salarie ELSE 0 END) AS montant_net_a_payer_salarie, sum(CASE WHEN rub_code = 4 THEN montant - subq.montant_net_imposable_salarie ELSE 0 END) AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, subq.organisme_cotisation_id AS organisme_cotisation_id, subq.profil_id AS profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000') AS rubrique_id, subq.salarie_id AS salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie FROM ( SELECT p_historique_paie.age_id, p_historique_paie.contrat_id, p_historique_paie.contrat_mois_id, p_historique_paie.date_debut, p_historique_paie.date_fin, p_historique_paie.date_paie, p_historique_paie.mois_activite, p_historique_paie.mois_paie, 0 AS base, sum(montant_avantage_nature) AS montant_avantage_nature, sum(montant_brut) AS montant_brut, sum(montant_cotisation_patronale) AS montant_cotisation_patronale, sum(montant_cotisation_salarie) AS montant_cotisation_salarie, 0 AS montant_frais_imposables, sum(montant_net_a_payer_salarie) AS montant_net_a_payer_salarie, sum(montant_net_imposable_salarie) AS montant_net_imposable_salarie, 0 AS montant_od_net_salarie, p_historique_paie.organisme_cotisation_id, p_historique_paie.profil_id, (SELECT oid FROM rh.t_rubriques WHERE code = 'C000'), p_historique_paie.salarie_id, 0 AS taux_cotisation_patronale, 0 AS taux_cotisation_salarie FROM rh.p_historique_paie JOIN rh.p_salaries ON p_salaries.oid = p_historique_paie.salarie_id GROUP BY 1,2,3,4,5,6,7,8,9, 18,19,20,21 ) AS subq JOIN rh.p_salaries ON p_salaries.oid = subq.salarie_id JOIN w_totaux ON w_totaux.matricule = p_salaries.matricule AND w_totaux.date = subq.date_paie GROUP BY 1,2,3,4,5,6,7,8,9, 18,19,20,21 HAVING 1!=1 OR sum(CASE WHEN rub_code = 8 THEN montant - subq.montant_brut ELSE 0 END) <> 0 OR sum(CASE WHEN rub_code = 5 THEN montant - subq.montant_avantage_nature ELSE 0 END) <> 0 OR sum(CASE WHEN rub_code = 6 THEN montant - subq.montant_cotisation_patronale ELSE 0 END) <> 0 OR sum(CASE WHEN rub_code = 7 THEN montant - subq.montant_cotisation_salarie ELSE 0 END) <> 0 OR sum(CASE WHEN rub_code = 3 THEN montant - subq.montant_net_a_payer_salarie ELSE 0 END) <> 0 OR sum(CASE WHEN rub_code = 4 THEN montant - subq.montant_net_imposable_salarie ELSE 0 END) <> 0 ; /* Quels sont les écarts cumulés > 0 ? : SELECT p_salaries.matricule, p_historique_paie.* FROM rh.p_historique_paie JOIN rh.p_salaries on p_salaries.oid = p_historique_paie.salarie_id JOIN rh.t_rubriques on t_rubriques.oid = p_historique_paie.rubrique_id WHERE 1=1 AND t_rubriques.code_original = 'C000' AND (1!=1 OR p_historique_paie.base <> 0 OR p_historique_paie.montant_brut <> 0 OR p_historique_paie.montant_cotisation_salarie <> 0 OR p_historique_paie.montant_cotisation_patronale <> 0 OR p_historique_paie.montant_net_a_payer_salarie <> 0 OR p_historique_paie.montant_net_imposable_salarie <> 0 OR p_historique_paie.montant_avantage_nature <> 0 ) ORDER BY 1,4 DESC ; */ ]]> 0 -- nb_jours > 0 AND date_part('year', ap_arret_01debut::date) >= '2008' GROUP BY 1,2,3,4,5,6,7 ) UNION ( SELECT sa_matricule AS matricule, ap_arret_02type AS motif, to_char(ap_arret_02debut::date,'YYYYMM')::numeric AS mois, ap_arret_02debut::date AS date_debut, ap_arret_02fin::date AS date_fin, ap_arret_02fin::date - ap_arret_02debut::date + 1 AS nb_jours, '' AS no_contrat FROM prod_sage100.f_hst_arret WHERE 1=1 AND ap_arret_02debut IS NOT NULL AND ap_arret_02fin IS NOT NULL AND ap_arret_02fin::date - ap_arret_02debut::date + 1 > 0 -- nb_jours > 0 AND date_part('year', ap_arret_02debut::date) >= '2008' GROUP BY 1,2,3,4,5,6,7 ) UNION ( SELECT sa_matricule AS matricule, ap_arret_03type AS motif, to_char(ap_arret_03debut::date,'YYYYMM')::numeric AS mois, ap_arret_03debut::date AS date_debut, ap_arret_03fin::date AS date_fin, ap_arret_03fin::date - ap_arret_03debut::date + 1 AS nb_jours, '' AS no_contrat FROM prod_sage100.f_hst_arret WHERE 1=1 AND ap_arret_03debut IS NOT NULL AND ap_arret_03fin IS NOT NULL AND ap_arret_03fin::date - ap_arret_03debut::date + 1 > 0 -- nb_jours > 0 AND date_part('year', ap_arret_03debut::date) >= '2008' GROUP BY 1,2,3,4,5,6,7 ) ; UPDATE w_arr SET no_contrat = w_cnt.numero_contrat FROM w_cnt WHERE 1=1 AND w_arr.matricule = w_cnt.matricule AND base.cti_overlaps(w_arr.date_debut,w_arr.date_fin,w_cnt.date_debut,w_cnt.date_fin) ; -- Alimentation des arrêts de travail TRUNCATE rh.p_arrets_travail ; ALTER SEQUENCE rh.s_arrets_travail RESTART WITH 1 ; INSERT INTO rh.p_arrets_travail( salarie_id, contrat_id, mois_activite, date_debut, date_fin, date_reprise, motif_arret_id, precision_motif_arret_id, nb_jours ) SELECT p_salaries.oid, p_contrats.oid, w_arr.mois, w_arr.date_debut, w_arr.date_fin, (w_arr.date_fin + INTERVAL '1 day')::date AS date_reprise, t_motifs_arret.oid AS motif_arret_id, 0 AS precision_motif_arret_id, w_arr.nb_jours FROM w_arr JOIN rh.p_salaries ON p_salaries.matricule = w_arr.matricule JOIN rh.t_motifs_arret ON t_motifs_arret.code_original = w_arr.motif JOIN rh.p_contrats ON p_contrats.salarie_id = p_salaries.oid ; -- Ventilation mensuelle des arrêts de travail TRUNCATE rh.p_arrets_travail_mois ; 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 ) SELECT p_arrets_travail.oid AS arret_travail_id, p_arrets_travail.salarie_id AS salarie_id, p_arrets_travail.contrat_id AS contrat_id, p_contrats_mois.oid AS contrat_mois_id, p_contrats_mois.mois_activite, CASE WHEN p_arrets_travail.date_debut BETWEEN p_contrats_mois.date_debut AND p_contrats_mois.date_fin THEN 1 ELSE 0 END AS nombre_debut_arret, CASE WHEN p_arrets_travail.date_fin BETWEEN p_contrats_mois.date_debut AND p_contrats_mois.date_fin THEN 1 ELSE 0 END AS nombre_fin_arret, CASE WHEN p_arrets_travail.date_reprise BETWEEN p_contrats_mois.date_debut AND p_contrats_mois.date_fin THEN 1 ELSE 0 END AS nombre_reprise_apres_arret, GREATEST(p_contrats_mois.date_debut, p_arrets_travail.date_debut) AS date_debut, LEAST(p_contrats_mois.date_fin, p_arrets_travail.date_fin) AS date_fin, LEAST(p_contrats_mois.date_fin, p_arrets_travail.date_fin)::date - GREATEST(p_contrats_mois.date_debut, p_arrets_travail.date_debut)::date + 1 AS nb_jours FROM rh.p_contrats_mois JOIN rh.p_arrets_travail ON (p_contrats_mois.contrat_id = p_arrets_travail.contrat_id AND p_arrets_travail.date_debut <= p_contrats_mois.date_fin AND p_arrets_travail.date_reprise >= p_contrats_mois.date_debut ) ORDER BY arret_travail_id, p_contrats_mois.mois_activite ; ]]> = '2008' GROUP BY 1,2,3,4,5,6,7,8 ; UPDATE w_for SET no_contrat = w_cnt.numero_contrat FROM w_cnt WHERE 1=1 AND w_for.matricule = w_cnt.matricule AND base.cti_overlaps(w_for.date_debut, w_for.date_fin, w_cnt.date_debut, w_cnt.date_fin) ; UPDATE w_for SET no_contrat = subq.numero_contrat FROM ( SELECT matricule, (max(ARRAY[extract(EPOCH FROM w_cnt.date_fin), w_cnt.numero_contrat::numeric]))[2] AS numero_contrat FROM w_cnt GROUP BY 1 ) AS subq WHERE 1=1 AND w_for.matricule = subq.matricule AND no_contrat = '' ; -- Peuplement de rh.p_formations TRUNCATE rh.p_formations ; ALTER SEQUENCE rh.s_formations RESTART WITH 1 ; INSERT INTO rh.p_formations ( salarie_id, formation_id, contrat_id, contrat_mois_id, formation_date, mois_activite, nb_heures, organisateur ) SELECT p_salaries.oid, t_liste_formations.oid, p_contrats_mois.contrat_id, p_contrats_mois.oid, w_for.date_fin, w_for.mois_activite, w_for.nb_heures, substr(w_for.organisateur, 1, 20) FROM w_for JOIN rh.p_salaries ON p_salaries.matricule = w_for.matricule JOIN rh.t_liste_formations ON w_for.code = t_liste_formations.code JOIN rh.p_contrats_mois ON 1=1 AND p_contrats_mois.salarie_id = p_salaries.oid AND p_contrats_mois.mois_activite = w_for.mois_activite ORDER BY 1,2,3,4 ; ]]>