= 200901 AND ocdrub IN ('005', '499') AND ocdagt != '101413' -- Fiche Régime-Imputation incohérente au niveau des dates, agent en Fin de Contrat GROUP BY 1,2,3,4 HAVING sum(CASE WHEN ocdrub = '499' THEN omtcal ELSE 0 END) != 0 ) AS subq GROUP BY 1,2,3 ; ]]> infos diverses DROP TABLE IF EXISTS w_grade_divers ; CREATE TEMP TABLE w_grade_divers AS SELECT dcdgrd AS grade, ddtinf AS date_debut, CASE WHEN ddsinf = 'O' THEN '20991231' ELSE (SELECT to_char(to_date(min(ddtinf), 'YYYYMMDD') - '1 day'::interval, 'YYYYMMDD')::numeric FROM prod_shspub.pippub184_gdinfp AS sq WHERE sq.dcdgrd = gdinfp.dcdgrd AND sq.ddtinf > gdinfp.ddtinf) END AS date_fin, dcdgcp, -- commission_paritaire, dcdcem, -- cadre_emploi, dcdfil, -- filiere, dcdcas -- categorie_statutaire FROM prod_shspub.pippub184_gdinfp AS gdinfp WHERE 1=1 AND dcdgrd != '' ORDER BY 1, 2 ; -- Création d'une table d'association grade<=>métier DROP TABLE IF EXISTS w_grade_metier ; CREATE TEMP TABLE w_grade_metier AS SELECT xcdsuf AS grade, xlbpar AS metier FROM prod_shspub.pippub184_paramp WHERE xtyrad = 'MET_GRD' ; -- Création d'une table avec le dernier historique de la fiche cotisation par agent DROP TABLE IF EXISTS w_cotisation ; CREATE TEMP TABLE w_cotisation AS SELECT acdagt AS matricule, acdbud AS ent, acdsbd AS eta, atycot AS code_cotisation, amatre AS matricule_retraite FROM prod_shspub.pippub184_agcotp WHERE 1=1 AND aamfco = 20991231 AND acdsbd = (SELECT eta_code FROM w_finess) AND acdbud = (SELECT ent_code FROM w_finess) ; -- Création de la table de correspondance Rubrique <=> Régime Statutaire <=> Compte d'imputation. -- Utilisée pour la paye uniquement (associer une rubrique à un compte). DROP TABLE IF EXISTS w_cor ; CREATE TEMP TABLE w_cor AS SELECT rcdrub AS rubrique, rcdbud AS entreprise, rcdsbd AS etablissement, rcdrgs AS statut, -- Régime statutaire rcdcha AS compte -- Compte d'imputation FROM prod_shspub.pippub184_rbimpp JOIN rh.t_types_contrat ON t_types_contrat.code_original = pippub184_rbimpp.rcdrgs WHERE 1=1 AND rcdsbd IN (SELECT eta_code FROM w_finess) AND rcdbud IN (SELECT ent_code FROM w_finess) AND t_types_contrat.oid > 0 ORDER BY 1,4,5 DESC ; UPDATE w_cor SET compte = subq.rcdcha FROM ( SELECT rcdrub, rcdcha FROM prod_shspub.pippub184_rbimpp WHERE 1=1 AND rcdsbd = '' AND rcdbud ='' AND rcdcha != '' ) AS subq WHERE 1=1 AND rubrique = subq.rcdrub AND compte = '' ; -- Création d'un table avec les "éléments variables" saisis par salariés DROP TABLE IF EXISTS w_ev ; CREATE TEMP TABLE w_ev AS SELECT ecdagt AS agent, ecdbud AS entreprise, ecdsbd AS etablissement, ecdrub AS rubrique, to_date(edtdeb,'YYYYMMDD') AS date_debut, (CASE WHEN edtfin != 20991231 THEN to_date(edtfin,'YYYYMMDD') ELSE to_date(edtdeb,'YYYYMMDD') + interval '1 month' - interval '1 day' END )::date AS date_fin, substr(edtdeb, 1, 6) AS mois, ecdbax AS lettre_budgetaire_code_original, ecdser AS service_code_original, ecduf AS unite_fonctionnelle_code_original FROM prod_shspub.pippub184_elagtp WHERE 1=1 AND ecduf != '' AND ecdbud IN (SELECT ent_code FROM w_finess) AND ecdsbd IN (SELECT eta_code FROM w_finess) ; ]]> 0 THEN 1 ELSE 0 END AS etp_theorique, base.cti_unnest3(array[anbse1,anbse2,anbse3,anbse4,anbse5]) / 100 AS pct, -- Pourcentage d'affectation base.cti_unnest3(array[ CASE WHEN anbse1 > 0 THEN 1 ELSE NULL END, CASE WHEN anbse2 > 0 THEN 2 ELSE NULL END, CASE WHEN anbse3 > 0 THEN 3 ELSE NULL END, CASE WHEN anbse4 > 0 THEN 4 ELSE NULL END, CASE WHEN anbse5 > 0 THEN 5 ELSE NULL END ]) AS rang, -- Rang d'affectation to_date(ag.adtent, 'YYYYMMDD') AS date_entree_ets, -- Codes originaux greatest(w_grade_metier.metier,chr(1)||'*') AS categorie_socio_professionnelle_code_original, -- Métier greatest(pa.aagtyp,chr(1)||'*') AS code_emploi_code_original, -- Type de paie greatest(av.acdgrd,chr(1)||'*') AS grille_code_original, -- Grade greatest(av.acdech,chr(1)||'*') AS grille_groupe_code_original, -- Echelon greatest(pa.asspay,chr(1)||'*') AS groupe_cotisant_code_original, -- Sous-type de paie greatest(ag.amoent,chr(1)||'*') AS motif_debut_code_original, -- Motif debut d'entree ets greatest(ag.amosor,chr(1)||'*') AS motif_fin_code_original, -- Motif sortie ets base.cti_unnest2(array[acduf1,acduf2,acduf3,acduf4,acduf5]) AS unite_fonctionnelle_code_original, -- UF greatest(ho.acdcat,chr(1)||'*') AS categorie_conge_code_original, -- Catégorie congé greatest(ri.acdcha,chr(1)||'*') AS compte_salarie_code_original, -- Compte d'imputation base.cti_unnest2(array[acdse1,acdse2,acdse3,acdse4,acdse5]) AS service_code_original, -- CR greatest(wgd.dcdgcp,chr(1)||'*') AS commission_paritaire_code_original, -- Groupe de commission paritaire base.cti_unnest2(array[acdax1,acdax2,acdax3,acdax4,acdax5]) AS lettre_budgetaire_code_original, -- Lettre budgétaire greatest(pa.pacpos,chr(1)||'*') AS statut_code_original, -- Position greatest(ri.acdrgs,chr(1)||'*') AS type_contrat_code_original, -- Régime statutaire greatest(ho.atyhor,chr(1)||'*') AS type_horaire_code_original, -- Idem greatest(tp.acdtra,chr(1)||'*') AS type_temps_travail_code_original, -- Type de contrat greatest(wgd.dcdcem,chr(1)||'*') AS cadre_emploi_code_original, -- Cadre emploi greatest(wgd.dcdfil,chr(1)||'*') AS filiere_code_original, -- Filiere greatest(wgd.dcdcas,chr(1)||'*') AS categorie_statutaire_code_original, -- Categorie statutaire (chr(1)||'*')::text AS qualification_code_original, (chr(1)||'*')::text AS section_analytique_code_original, (chr(1)||'*')::text AS section_analytique_paie_code_original, (chr(1)||'*')::text AS societe_interim_code_original, (chr(1)||'*')::text AS specialite_code_original FROM prod_shspub.pippub184_agentp AS ag -- Fiche "Avancement" LEFT JOIN prod_shspub.pippub184_agavap AS av ON 1=1 AND av.acdagt = ag.acdagt -- Fiche "Temps-effectif-service" LEFT JOIN prod_shspub.pippub184_agtpsp AS tp ON 1=1 AND tp.acdagt = av.acdagt AND tp.acdsbd = av.acdsbd AND tp.acdbud = av.acdbud AND base.cti_overlaps(to_date(av.adtpec, 'YYYYMMDD'), to_date(av.adtfpc, 'YYYYMMDD'), to_date(tp.adttps, 'YYYYMMDD'), to_date(tp.adtftp, 'YYYYMMDD')) -- Fiche "Horaire" LEFT JOIN prod_shspub.pippub184_aghorp AS ho ON 1=1 AND ho.acdagt = av.acdagt AND ho.acdsbd = av.acdsbd AND ho.acdbud = av.acdbud AND base.cti_overlaps(to_date(av.adtpec, 'YYYYMMDD'), to_date(av.adtfpc, 'YYYYMMDD'), to_date(ho.adthor, 'YYYYMMDD'), to_date(ho.hofhor, 'YYYYMMDD')) AND base.cti_overlaps(to_date(tp.adttps, 'YYYYMMDD'), to_date(tp.adtftp, 'YYYYMMDD'), to_date(ho.adthor, 'YYYYMMDD'), to_date(ho.hofhor, 'YYYYMMDD')) -- Fiche "Imputation-régime" LEFT JOIN prod_shspub.pippub184_agimpp AS ri ON 1=1 AND ri.acdagt = av.acdagt AND ri.acdsbd = av.acdsbd AND ri.acdbud = av.acdbud AND base.cti_overlaps(to_date(av.adtpec, 'YYYYMMDD'), to_date(av.adtfpc, 'YYYYMMDD'), to_date(ri.adtimp, 'YYYYMMDD'), to_date(ri.imftim, 'YYYYMMDD')) AND base.cti_overlaps(to_date(tp.adttps, 'YYYYMMDD'), to_date(tp.adtftp, 'YYYYMMDD'), to_date(ri.adtimp, 'YYYYMMDD'), to_date(ri.imftim, 'YYYYMMDD')) AND base.cti_overlaps(to_date(ho.adthor, 'YYYYMMDD'), to_date(ho.hofhor, 'YYYYMMDD'), to_date(ri.adtimp, 'YYYYMMDD'), to_date(ri.imftim, 'YYYYMMDD')) -- Fiche "Type de paye" LEFT JOIN prod_shspub.pippub184_agpayp AS pa ON 1=1 AND pa.acdagt = av.acdagt AND pa.acdsbd = av.acdsbd AND pa.acdbud = av.acdbud AND base.cti_overlaps(to_date(av.adtpec, 'YYYYMMDD'), to_date(av.adtfpc, 'YYYYMMDD'), to_date(pa.adtpay, 'YYYYMMDD'), to_date(pa.adtfpa, 'YYYYMMDD')) AND base.cti_overlaps(to_date(tp.adttps, 'YYYYMMDD'), to_date(tp.adtftp, 'YYYYMMDD'), to_date(pa.adtpay, 'YYYYMMDD'), to_date(pa.adtfpa, 'YYYYMMDD')) AND base.cti_overlaps(to_date(ho.adthor, 'YYYYMMDD'), to_date(ho.hofhor, 'YYYYMMDD'), to_date(pa.adtpay, 'YYYYMMDD'), to_date(pa.adtfpa, 'YYYYMMDD')) AND base.cti_overlaps(to_date(ri.adtimp, 'YYYYMMDD'), to_date(ri.imftim, 'YYYYMMDD'), to_date(pa.adtpay, 'YYYYMMDD'), to_date(pa.adtfpa, 'YYYYMMDD')) -- "Fichier grades (informations diverses)" LEFT JOIN w_grade_divers AS wgd ON 1=1 AND wgd.grade = av.acdgrd AND base.cti_overlaps(to_date(av.adtpec, 'YYYYMMDD'), to_date(av.adtfpc, 'YYYYMMDD'), to_date(wgd.date_debut, 'YYYYMMDD'), to_date(wgd.date_fin, 'YYYYMMDD')) AND base.cti_overlaps(to_date(tp.adttps, 'YYYYMMDD'), to_date(tp.adtftp, 'YYYYMMDD'), to_date(wgd.date_debut, 'YYYYMMDD'), to_date(wgd.date_fin, 'YYYYMMDD')) AND base.cti_overlaps(to_date(ho.adthor, 'YYYYMMDD'), to_date(ho.hofhor, 'YYYYMMDD'), to_date(wgd.date_debut, 'YYYYMMDD'), to_date(wgd.date_fin, 'YYYYMMDD')) AND base.cti_overlaps(to_date(ri.adtimp, 'YYYYMMDD'), to_date(ri.imftim, 'YYYYMMDD'), to_date(wgd.date_debut, 'YYYYMMDD'), to_date(wgd.date_fin, 'YYYYMMDD')) AND base.cti_overlaps(to_date(pa.adtpay, 'YYYYMMDD'), to_date(pa.adtfpa, 'YYYYMMDD'), to_date(wgd.date_debut, 'YYYYMMDD'), to_date(wgd.date_fin, 'YYYYMMDD')) LEFT JOIN w_grade_metier ON w_grade_metier.grade = av.acdgrd WHERE 1=1 --AND av.acdagt = '100017' AND av.acdagt NOT IN ('101413','101478') -- @TODO Fiche Régime-Imputation incohérente au niveau des dates, agent en Fin de Contrat AND afipay = 1 AND ag.adtent != 0 -- Uniquement les agents qui ont une date d'entrée dans l'établissement --AND av.adtpec >= ag.adtent -- Uniquement l'historique depuis l'entrée dans l'établissement AND av.acdsbd = (SELECT eta_code FROM w_finess) AND av.acdbud = (SELECT ent_code FROM w_finess) 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 --order by 6 desc ; ]]> to_date(agent.adtsor,'YYYYMMDD') ; -- c. màj des date de fin du dernier profil de l'agent <= date de sortie de l'agent UPDATE w_profils_all SET date_fin = subq.date_sortie FROM ( SELECT w_profils_all.agent, max(w_profils_all.date_debut) AS date_debut, w_tmp.date_sortie FROM w_profils_all JOIN w_tmp ON w_tmp.agent = w_profils_all.agent GROUP BY 1,3 ) AS subq WHERE 1=1 AND subq.agent = w_profils_all.agent AND subq.date_debut = w_profils_all.date_debut ; -- Identification des derniers profils des matricule (champ "encours") -- SELECT * FROM w_profils_all WHERE encours = 1 UPDATE w_profils_all SET encours = 1 FROM ( SELECT w_profils_all.agent, max(w_profils_all.date_debut) AS date_debut FROM w_profils_all GROUP BY 1 ) AS subq WHERE 1=1 AND subq.agent = w_profils_all.agent AND subq.date_debut = w_profils_all.date_debut ; -- Optimisation de w_profils_all SELECT base.cti_optimize_table('w_profils_all') ; -- Création d'un table de profil avec 1 seul profil par matricule simultané. CREATE TEMP TABLE w_profils AS SELECT * FROM w_profils_all WHERE rang = 1 ; ]]> adtsor THEN '2099-12-31'::date ELSE to_date(adtsor, 'YYYYMMDD') END AS date_fin, to_date(agent.adtent, 'YYYYMMDD') AS date_entree_ets, CASE WHEN agent.adtadm = 0 THEN to_date(agent.adtent, 'YYYYMMDD') ELSE to_date(agent.adtadm, 'YYYYMMDD') END AS date_entree_fp, CASE WHEN agent.agdfph = 0 THEN to_date(agent.adtent, 'YYYYMMDD') ELSE to_date(agent.agdfph, 'YYYYMMDD') END AS date_entree_fph, cp.aadeli AS no_adeli, coalesce(t_code_cotisation.oid, 0) AS code_cotisation_id, matricule_retraite FROM prod_shspub.pippub184_agentp AS agent LEFT JOIN prod_shspub.pippub184_agencp AS cp ON cp.acdagt = agent.acdagt LEFT JOIN rh.t_codes_postaux ON t_codes_postaux.code = agent.aadpos LEFT JOIN rh.t_situations_famille ON t_situations_famille.code_original = agent.asifam LEFT JOIN w_cotisation ON w_cotisation.matricule = agent.acdagt LEFT JOIN rh.t_code_cotisation ON t_code_cotisation.code_original = w_cotisation.code_cotisation LEFT JOIN rh.t_nationalites ON t_nationalites.code_original = agent.acdnat JOIN w_profils ON 1=1 AND encours = 1 AND w_profils.agent = agent.acdagt WHERE 1=1 AND aprnma != '' AND agent.adtent != 0 -- Uniquement les agents qui ont une date d'entrée dans l'établissement GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 ; ]]> = 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',to_date(p_salaries.date_entree_ets,'YYYYMMDD'))::date, 'nm') AS anciennete_mois, floor(base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',to_date(p_salaries.date_entree_ets,'YYYYMMDD'))::date, 'ny')) AS anciennete_annee_id, base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',to_date(p_salaries.date_entree_fp,'YYYYMMDD'))::date, 'nm') AS anciennete_fp_mois, floor(base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',to_date(p_salaries.date_entree_fp,'YYYYMMDD'))::date, 'ny')) AS anciennete_fp_annee_id, base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',to_date(p_salaries.date_entree_fph,'YYYYMMDD'))::date, 'nm') AS anciennete_fph_mois, floor(base.cti_age(date_trunc('month',p_calendrier_mois.date_fin::date)::date, date_trunc('month',to_date(p_salaries.date_entree_fph,'YYYYMMDD'))::date, 'ny')) AS anciennete_fph_annee_id 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 1=1 AND w_profils.agent = p_salaries.matricule AND p_contrats.date_fin BETWEEN w_profils.date_debut AND w_profils.date_fin JOIN prod_shspub.pippub184_agentp AS ag ON ag.acdagt = w_profils.agent WHERE p_calendrier_mois.date_debut < date(now()) GROUP BY 1,2,3,4,5,7,8,10,11,12,13,14,15,16,17,18,19 ; ]]> = 200901 AND OCDSBD = (SELECT eta_code FROM w_finess) AND OCDBUD = (SELECT ent_code FROM w_finess) ) UNION ALL ( -- Heures payées SELECT nextval('w_hp_seq') AS oid, hp.ocdagt AS matricule, (ommtrt||'01')::date AS date_debut, ((ommtrt||'01')::date + interval '1 month' - interval '1 day')::date AS date_fin, ommtrt AS mois, ommpay, t_rubriques.oid AS rubrique_id, ocdrub, obacal AS base, 0 AS montant_brut, 0 AS taux_salarial, 0 AS montant_salarial, 0 AS taux_patronal, 0 AS montant_patronal, 0 AS net_imposable, 0 AS net_a_payer, 0 AS od_net FROM prod_shspub.pippub184_histop AS hp JOIN prod_shspub.pippub184_rbentp AS rb ON rb.rcdrub = hp.ocdrub JOIN rh.t_rubriques ON t_rubriques.code_original = rb.rcdrub WHERE 1=1 AND redbul = 0 AND ocdrub = '005' --AND ocdagt = '100009' --AND ommtrt = 201112 AND ommtrt >= 200901 AND OCDSBD = (SELECT eta_code FROM w_finess) AND OCDBUD = (SELECT ent_code FROM w_finess) ) UNION ALL ( -- Effectif payé SELECT nextval('w_hp_seq') AS oid, hp.ocdagt AS matricule, (ommtrt||'01')::date AS date_debut, ((ommtrt||'01')::date + interval '1 month' - interval '1 day')::date AS date_fin, ommtrt AS mois, ommpay, t_rubriques.oid AS rubrique_id, ocdrub, obacal AS base, 0 AS montant_brut, 0 AS taux_salarial, 0 AS montant_salarial, 0 AS taux_patronal, 0 AS montant_patronal, 0 AS net_imposable, 0 AS net_a_payer, 0 AS od_net FROM prod_shspub.pippub184_histop AS hp JOIN prod_shspub.pippub184_rbentp AS rb ON rb.rcdrub = hp.ocdrub JOIN rh.t_rubriques ON t_rubriques.code_original = rb.rcdrub WHERE 1=1 AND redbul = 0 AND ocdrub = 'EFF1' --AND ocdagt = '100009' --AND ommtrt = 201112 AND ommtrt >= 200901 AND OCDSBD = (SELECT eta_code FROM w_finess) AND OCDBUD = (SELECT ent_code FROM w_finess) ) ; -- Suppression des lignes de paie à zéro (sauf la ligne contenant les heures payées '005','EFF1') DELETE FROM w_hp WHERE 1=1 --AND base = 0 AND montant_brut = 0 AND montant_salarial = 0 AND montant_patronal = 0 AND net_imposable = 0 AND net_a_payer = 0 AND od_net = 0 AND ocdrub != '005' AND ocdrub != 'EFF1' ; CREATE INDEX i_w_hp_1 ON w_hp USING btree (matricule) ; CREATE INDEX i_w_hp_2 ON w_hp USING btree (date_fin) ; CREATE INDEX i_w_hp_3 ON w_hp USING btree (rubrique_id) ; -- Peuplement de l'historique de la paie TRUNCATE rh.p_historique_paie ; -- Activation des index SELECT base.cti_stash_table_indexes('rh', 'p_historique_paie') ; INSERT INTO rh.p_historique_paie ( age_id, contrat_id, contrat_mois_id, organisme_cotisation_id, profil_id, rubrique_id, salarie_id, date_debut, date_fin, date_paie, mois_activite, mois_paie, base, montant_brut, taux_cotisation_salarie, montant_cotisation_salarie, taux_cotisation_patronale, montant_cotisation_patronale, montant_avantage_nature, montant_frais_imposables, montant_od_net_salarie, montant_net_imposable_salarie, montant_net_a_payer_salarie, compte_id ) SELECT date_part('year', age(w_hp.date_fin, date_naissance)) AS age_id, coalesce((max(ARRAY[EXTRACT(EPOCH FROM p_contrats.date_fin),p_contrats.oid]))[2], 0) AS contrat_id, coalesce((max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.oid]))[2], 0) AS contrat_mois_id, 0 AS organisme_cotisation_id, coalesce((max(ARRAY[EXTRACT(EPOCH FROM w_profils.date_fin), w_profils.profil_id]))[2], '0') AS profil_id, w_hp.rubrique_id, p_salaries.oid AS salarie_id, (ommpay||'01')::date AS date_debut, ((ommpay||'01')::date + interval '1 month' - interval '1 day')::date AS date_fin, w_hp.date_fin AS date_paie, w_hp.ommpay AS mois_activite, w_hp.mois AS mois_paie, w_hp.base AS base, w_hp.montant_brut AS montant_brut, w_hp.taux_salarial AS taux_cotisation_salarie, w_hp.montant_salarial AS montant_cotisation_salarie, w_hp.taux_patronal AS taux_cotisation_patronale, w_hp.montant_patronal AS montant_cotisation_patronale, 0 AS montant_avantage_nature, 0 AS montant_frais_imposables, od_net AS montant_od_net_salarie, w_hp.net_imposable AS montant_net_imposable_salarie, w_hp.net_a_payer AS montant_net_a_payer_salarie, 0 AS compte_id FROM w_hp JOIN rh.p_salaries ON p_salaries.matricule = w_hp.matricule 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.ommpay LEFT JOIN rh.p_contrats ON p_contrats.oid = p_contrats_mois.contrat_id LEFT JOIN w_profils ON w_profils.numero_situation = p_contrats.numero_contrat GROUP BY 1,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, w_hp.oid -- permet d'avoir n lignes d'historique de paie lorsqu'il s'agit de retro-activité ; -- Re-activation des index SELECT base.cti_stash_pop_table_indexes('rh', 'p_historique_paie') ; -- Lorsqu'une paye n'est pas couverte par un contrat un mois donné -- générer une ventilation de contrat supplémentaire pour ce mois. -- Par la droite. INSERT INTO rh.p_contrats_mois( salarie_id, contrat_id, mois_activite, date_debut, date_fin, profil_id, nombre_debut_contrat, nombre_fin_contrat, equivalent_temps_plein, age_id, age_jours, est_hors_periode, present_fin_mois, anciennete_mois, anciennete_annee_id, anciennete_fp_mois, anciennete_fp_annee_id, anciennete_fph_mois, anciennete_fph_annee_id ) SELECT p_historique_paie.salarie_id, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats.oid]))[2] as contrat_id, p_historique_paie.mois_activite, p_historique_paie.date_debut, p_historique_paie.date_fin, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.profil_id]))[2] as profil_id, 0 AS nombre_debut_contrat, 0 AS nombre_fin_contrat, 0 AS equivalent_temps_plein, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.age_id]))[2] AS age_id, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.age_jours]))[2] AS age_jours, 1 AS est_hors_periode, 0 AS present_fin_mois, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_mois]))[2] AS anciennete_mois, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_annee_id]))[2] AS anciennete_annee_id, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_fp_mois]))[2] AS anciennete_fp_mois, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_fp_annee_id]))[2] AS anciennete_fp_annee_id, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_fph_mois]))[2] AS anciennete_fph_mois, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.anciennete_fph_annee_id]))[2] AS anciennete_fph_annee_id 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 1=1 AND (1!=1 OR p_historique_paie.contrat_mois_id IS NULL OR p_historique_paie.contrat_mois_id = 0 ) AND p_historique_paie.date_paie > p_contrats_mois.date_fin -- la fin du contrat doit être antérieure au bulletin de paie GROUP BY 1,3,4,5,7,8,9,12,13 ; -- Associer à l'historique de paie ce nouveau mois ventilé UPDATE rh.p_historique_paie SET contrat_id = p_contrats_mois.contrat_id, contrat_mois_id = p_contrats_mois.oid, profil_id = p_contrats_mois.profil_id FROM rh.p_contrats_mois WHERE 1=1 AND p_historique_paie.salarie_id = p_contrats_mois.salarie_id AND p_historique_paie.mois_activite = p_contrats_mois.mois_activite AND (1!=1 OR p_historique_paie.contrat_mois_id IS NULL OR p_historique_paie.contrat_mois_id = 0 ) ; -- Par la gauche. INSERT INTO rh.p_contrats_mois( salarie_id, contrat_id, mois_activite, date_debut, date_fin, profil_id, nombre_debut_contrat, nombre_fin_contrat, equivalent_temps_plein, age_id, age_jours, est_hors_periode, present_fin_mois, anciennete_mois, anciennete_annee_id, anciennete_fp_mois, anciennete_fp_annee_id, anciennete_fph_mois, anciennete_fph_annee_id ) SELECT p_historique_paie.salarie_id, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats.oid]))[2] as contrat_id, p_historique_paie.mois_activite, p_historique_paie.date_debut, p_historique_paie.date_fin, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.profil_id]))[2] as profil_id, 0 AS nombre_debut_contrat, 0 AS nombre_fin_contrat, 0 AS equivalent_temps_plein, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.age_id]))[2] AS age_id, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.age_jours]))[2] AS age_jours, 1 AS est_hors_periode, 0 AS present_fin_mois, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_mois]))[2] AS anciennete_mois, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_annee_id]))[2] AS anciennete_annee_id, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_fp_mois]))[2] AS anciennete_fp_mois, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_fp_annee_id]))[2] AS anciennete_fp_annee_id, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_fph_mois]))[2] AS anciennete_fph_mois, (min(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut),p_contrats_mois.anciennete_fph_annee_id]))[2] AS anciennete_fph_annee_id 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 1=1 AND (1!=1 OR p_historique_paie.contrat_mois_id IS NULL OR p_historique_paie.contrat_mois_id = 0 ) AND p_historique_paie.date_paie < p_contrats_mois.date_debut -- le début du contrat doit être postérieur au bulletin de paie GROUP BY 1,3,4,5,7,8,9,12,13 ; -- Associer à l'historique de paie ce nouveau mois ventilé UPDATE rh.p_historique_paie SET contrat_id = p_contrats_mois.contrat_id, contrat_mois_id = p_contrats_mois.oid, profil_id = p_contrats_mois.profil_id FROM rh.p_contrats_mois WHERE 1=1 AND p_historique_paie.salarie_id = p_contrats_mois.salarie_id AND p_historique_paie.mois_activite = p_contrats_mois.mois_activite AND (1!=1 OR p_historique_paie.contrat_mois_id IS NULL OR p_historique_paie.contrat_mois_id = 0 ) ; -- Création d'une table temp qui regroupe tous les totaux à atteindre pour calcul de l'écart DROP TABLE IF EXISTS w_totaux ; CREATE TEMP TABLE w_totaux AS SELECT OCDBUD AS ent, OCDSBD AS eta, ocdagt AS agent, ommtrt AS mois, -- sum(case when ocdrub = '005' then omtcal else 0 end) AS heures, -- pas utilisé sum(case when ocdrub = '499' then omtcal else 0 end) AS brut, sum(case when ocdrub = '950' then omtcal else 0 end) AS cots, sum(case when ocdrub = '951' then omtcal else 0 end) AS cotp, sum(case when ocdrub = '700' then omtcal else 0 end) AS netf, sum(case when ocdrub = '990' then omtcal else 0 end) AS netp, 0 AS od, 0 AS fi, 0 AS an FROM prod_shspub.pippub184_histop WHERE 1=1 AND ommtrt >= 200901 AND OCDSBD = (SELECT eta_code FROM w_finess) AND OCDBUD = (SELECT ent_code FROM w_finess) GROUP BY 1,2,3,4 ; -- Inserer pour chaque bulletin une ligne qui va faire le compte avec le total 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, compte_id ) 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(an - subq.montant_avantage_nature) AS montant_avantage_nature, sum(brut - subq.montant_brut) AS montant_brut, sum(cotp - subq.montant_cotisation_patronale) AS montant_cotisation_patronale, sum(cots - subq.montant_cotisation_salarie) AS montant_cotisation_salarie, sum(fi - subq.montant_frais_imposables) AS montant_frais_imposables, sum(netp - subq.montant_net_a_payer_salarie) AS montant_net_a_payer_salarie, sum(netf - subq.montant_net_imposable_salarie) AS montant_net_imposable_salarie, sum(od - subq.montant_od_net_salarie) 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, 0 AS compte_id FROM ( SELECT max(p_historique_paie.age_id) AS age_id, (max(ARRAY[p_historique_paie.mois_paie,p_historique_paie.contrat_id]))[2] AS contrat_id, (max(ARRAY[p_historique_paie.mois_paie,p_historique_paie.contrat_mois_id]))[2] AS contrat_mois_id, to_date(p_historique_paie.mois_paie, 'YYYYMM') AS date_debut, (to_date(p_historique_paie.mois_paie, 'YYYYMM') + interval '1 month' - interval '1 day')::date AS date_fin, p_historique_paie.date_paie, p_historique_paie.mois_paie AS 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, sum(montant_frais_imposables) 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, sum(montant_od_net_salarie) AS montant_od_net_salarie, 0 AS organisme_cotisation_id, (max(ARRAY[p_historique_paie.mois_paie,p_historique_paie.profil_id]))[2] AS 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, 0 AS compte_id FROM rh.p_historique_paie JOIN rh.p_salaries ON p_salaries.oid = p_historique_paie.salarie_id GROUP BY 4,5,6,7,8,9,18,20,21 ) as subq JOIN rh.p_salaries ON p_salaries.oid = subq.salarie_id JOIN w_totaux ON 1=1 AND w_totaux.agent = p_salaries.matricule AND w_totaux.mois = subq.mois_paie WHERE 1!=1 OR an - subq.montant_avantage_nature != 0 OR brut - subq.montant_brut != 0 OR cotp - subq.montant_cotisation_patronale != 0 OR cots - subq.montant_cotisation_salarie != 0 OR fi - subq.montant_frais_imposables != 0 OR netp - subq.montant_net_a_payer_salarie != 0 OR netf - subq.montant_net_imposable_salarie != 0 OR od - subq.montant_od_net_salarie != 0 GROUP BY 1,2,3,4,5,6,7,8,9, 18,19,20,21 ; -- Màj des Comptes UPDATE rh.p_historique_paie SET compte_id = t_compte.oid FROM rh.p_profils, rh.t_rubriques, w_cor, rh.t_compte WHERE 1=1 AND p_profils.oid = p_historique_paie.profil_id AND t_rubriques.oid = p_historique_paie.rubrique_id AND w_cor.rubrique = t_rubriques.code_original AND w_cor.statut = p_profils.type_contrat_code_original AND t_compte.code_original = w_cor.compte ; -- Màj des Comptes : lorsque non renseigné, le compte agent est utilisé UPDATE rh.p_historique_paie SET compte_id = p_profils.compte_salarie_id FROM rh.p_profils WHERE 1=1 AND p_profils.oid = p_historique_paie.profil_id AND p_historique_paie.compte_id = 0 ; ]]> date de reprise). 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, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut), p_contrats_mois.contrat_id]))[2] AS contrat_id, (max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_debut), p_contrats_mois.oid]))[2] AS contrat_mois_id, p_calendrier_mois.mois AS mois_activite, CASE WHEN p_arrets_travail.date_debut BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_debut_arret, CASE WHEN p_arrets_travail.date_fin BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_fin_arret, CASE WHEN p_arrets_travail.date_reprise BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_reprise_apres_arret, GREATEST(p_calendrier_mois.date_debut, p_arrets_travail.date_debut) AS date_debut, LEAST(p_calendrier_mois.date_fin, p_arrets_travail.date_fin) AS date_fin, 0 AS nb_jours FROM base.p_calendrier_mois JOIN rh.p_arrets_travail ON base.cti_overlaps(p_arrets_travail.date_debut, p_arrets_travail.date_reprise, p_calendrier_mois.date_debut, p_calendrier_mois.date_fin) LEFT JOIN rh.p_contrats_mois ON 1=1 AND p_contrats_mois.salarie_id = p_arrets_travail.salarie_id AND base.cti_overlaps(p_contrats_mois.date_debut, p_contrats_mois.date_fin, p_calendrier_mois.date_debut, p_calendrier_mois.date_fin) --WHERE p_arrets_travail.salarie_id = 9151 GROUP BY 1,2,5,6,7,8,9,10,11 --ORDER BY 9 desc, 5 desc ; -- DOIT TOUJOURS TRAITER 0 enregistrement : Suppression des mois sans évènements séparant la date de fin et la date de reprise. /* DELETE FROM rh.p_arrets_travail_mois WHERE 1=1 AND nb_debut_arret = 0 AND nb_fin_arret = 0 AND nb_reprise_apres_arret = 0 AND date_fin < date_debut ; */ -- Màj des dates de début/fin pour les reprises isolées sur un mois. UPDATE rh.p_arrets_travail_mois SET date_debut = p_arrets_travail.date_reprise, date_fin = p_arrets_travail.date_reprise FROM rh.p_arrets_travail WHERE 1=1 AND p_arrets_travail.oid = p_arrets_travail_mois.arret_travail_id AND nb_debut_arret = 0 AND nb_fin_arret = 0 AND nb_reprise_apres_arret = 1 ; -- Calcul de la durée de l'absence "nb_jours". UPDATE rh.p_arrets_travail_mois SET nb_jours = date_fin - date_debut + 1 ; -- Lorsque reprise isolée sur un mois, durée à 0. UPDATE rh.p_arrets_travail_mois SET nb_jours = 0 WHERE 1=1 AND nb_debut_arret = 0 AND nb_fin_arret = 0 AND nb_reprise_apres_arret = 1 ; -- Quand absences contigües, ne pas compter comme une reprise (date reprise absence N = date début absence N+1). UPDATE rh.p_arrets_travail_mois SET nb_reprise_apres_arret = 0 FROM rh.p_arrets_travail AS a1, rh.p_arrets_travail AS a2 WHERE 1=1 AND arret_travail_id = a1.oid AND a1.salarie_id = a2.salarie_id AND a1.date_reprise = a2.date_debut AND nb_reprise_apres_arret = 1 ; -- Quand reprise idolée sur un mois et sans contrat, la supprimer. DELETE FROM rh.p_arrets_travail_mois WHERE p_arrets_travail_mois.contrat_id IS NULL ; ]]> 0 ; -- Ventilation au 30eme sur le même mois -- DROP TABLE IF EXISTS w_contrats_multiples; -- CREATE TEMP TABLE w_contrats_multiples AS -- SELECT salarie_id, -- mois_activite, -- count(*) AS nb, -- SUM(date_fin - date_debut + 1) AS nb_jours, -- (MAX(Array[date_fin::text,p_contrats_mois.oid::text]))[2]::bigint AS contrat_mois_last_id, -- (MAX(Array[date_fin::text,(date_fin - date_debut + 1)::text]))[2]::bigint AS nb_jours_last -- FROM rh.p_contrats_mois -- WHERE fictif IS DISTINCT FROM '1' -- GROUP BY 1,2 -- HAVING SUM(CASE WHEN fictif <> 1 THEN 1 ELSE 0 END) > 1; -- UPDATE w_contrats_multiples -- SET nb_jours_last = 30 - nb_jours + nb_jours_last; -- UPDATE rh.p_contrats_mois -- SET equivalent_temps_plein = CASE WHEN oid <> contrat_mois_last_id THEN equivalent_temps_plein / 30 * (date_fin - date_debut + 1) ELSE equivalent_temps_plein / 30 * nb_jours_last END -- FROM w_contrats_multiples -- WHERE w_contrats_multiples.salarie_id = p_contrats_mois.salarie_id AND -- w_contrats_multiples.mois_activite = p_contrats_mois.mois_activite AND -- fictif IS DISTINCT FROM '1' ; -- Adaptation etp à duree dansle mois DROP TABLE IF EXISTS w_contrats_mois_partiels; CREATE TEMP TABLE w_contrats_mois_partiels AS SELECT salarie_id, mois_activite, SUM(p_contrats_mois.date_fin - p_contrats_mois.date_debut + 1) AS nb_jours, MAX(p_calendrier_mois.date_fin - p_calendrier_mois.date_debut + 1) AS nb_jours_mois FROM rh.p_contrats_mois JOIN base.p_calendrier_mois ON mois_activite = p_calendrier_mois.mois WHERE fictif IS DISTINCT FROM '1' GROUP BY 1,2; UPDATE rh.p_contrats_mois SET equivalent_temps_plein = equivalent_temps_plein * (p_contrats_mois.date_fin - p_contrats_mois.date_debut + 1.00) / CASE WHEN nb_jours <> nb_jours_mois THEN 30 ELSE nb_jours_mois END FROM base.p_calendrier_mois, w_contrats_mois_partiels WHERE p_contrats_mois.salarie_id = w_contrats_mois_partiels.salarie_id AND p_contrats_mois.mois_activite = w_contrats_mois_partiels.mois_activite AND p_contrats_mois.mois_activite = p_calendrier_mois.mois AND fictif <> 1 AND ( p_contrats_mois.date_debut > p_calendrier_mois.date_debut OR p_contrats_mois.date_fin < p_calendrier_mois.date_fin ); -- Pas d'etp sur sortis DROP TABLE IF EXISTS w_contrats_mois_sortis; CREATE TEMP TABLE w_contrats_mois_sortis AS SELECT salarie_id, p_contrats_mois.oid AS contrat_mois_id, mois_activite, p_contrats_mois.date_debut, p_contrats_mois.date_fin FROM rh.p_contrats_mois JOIN rh.p_salaries ON salarie_id = p_salaries.oid LEFT JOIN prod_shspub.pippub184_agpayp ON matricule = ACDAGT AND ( p_contrats_mois.date_debut BETWEEN DATE(adtpay) AND date(ADTFPA) AND ASSPAY <> 3 AND ASSPAY <> 9 OR p_contrats_mois.date_fin BETWEEN DATE(adtpay) AND date(ADTFPA) AND ASSPAY <> 3 AND ASSPAY <> 9 ) WHERE fictif IS DISTINCT FROM '1' AND ACDAGT IS NULL AND equivalent_temps_plein <> 0; UPDATE rh.p_contrats_mois SET equivalent_temps_plein = 0 FROM w_contrats_mois_sortis WHERE w_contrats_mois_sortis.contrat_mois_id = p_contrats_mois.oid ; -- Initialisation de l'ETP ventilé mensuellement à 0 lorsque qu'aucune rubrique d'heures payées -- n'est présente sur le bulletin de paie du mois. UPDATE rh.p_contrats_mois SET equivalent_temps_plein = 0 WHERE 1=1 AND equivalent_temps_plein <> 0 AND oid NOT IN ( SELECT contrat_mois_id FROM rh.p_historique_paie WHERE rubrique_id IN (SELECT oid FROM rh.t_rubriques WHERE code_calcul = '1') ) ; -- Report des ratios sur des sorties vers des non sorties DROP TABLE IF EXISTS w_profils_contrats_mois_absents; CREATE TEMP TABLE w_profils_contrats_mois_absents AS SELECT p_contrats_mois.oid AS contrat_mois_id, mois_activite, matricule, MIN(CASE WHEN groupe_cotisant_code NOT IN ('3', '9') THEN p_profil_contrat_mois.profil_id ELSE NULL END) AS profil_id_1, SUM(CASE WHEN groupe_cotisant_code NOT IN ('3', '9') THEN 1 ELSE 0 END) AS nb_1, SUM(CASE WHEN groupe_cotisant_code IN ('3', '9') THEN 1 ELSE 0 END) AS nb_9, SUM(CASE WHEN groupe_cotisant_code NOT IN ('3', '9') THEN ratio ELSE 0 END) AS ratio_1, SUM(CASE WHEN groupe_cotisant_code IN ('3', '9') THEN ratio ELSE 0 END) AS ratio_9 FROM rh.p_contrats_mois JOIN rh.p_salaries on salarie_id = p_salaries.oid JOIN rh.p_profil_contrat_mois ON p_profil_contrat_mois.contrat_mois_id = p_contrats_mois.oid JOIN rh.p_profils ON p_profil_contrat_mois.profil_id = p_profils.oid GROUP BY 1,2,3 HAVING count(*) > 1 AND SUM(CASE WHEN groupe_cotisant_code IN ('3', '9') THEN 1 ELSE 0 END) <> 0 AND SUM(CASE WHEN groupe_cotisant_code NOT IN ('3', '9') THEN 1 ELSE 0 END) <> 0; UPDATE rh.p_profil_contrat_mois SET ratio = CASE WHEN groupe_cotisant_code IN ('3', '9') THEN 0 WHEN profil_id = profil_id_1 THEN ratio + ratio_9 ELSE ratio END FROM rh.p_profils, w_profils_contrats_mois_absents WHERE p_profil_contrat_mois.profil_id = p_profils.oid AND p_profil_contrat_mois.contrat_mois_id = w_profils_contrats_mois_absents.contrat_mois_id; ]]> w_MANDAP.compte_id; ]]>