You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1438 lines
68 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Pre-traitements des tables prestataire">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_bul
;
CREATE TEMP TABLE w_bul AS
select
cdmato as mat,
dtpero as mois,
dtdppo::text::date as date_debut,
dtfppo::text::date as date_fin,
nojobo,
norjpo
from prod_talentia_rh.iptw2fghm_rsaldi
group by 1,2,3,4,5,6
;
DROP TABLE IF EXISTS w_caisses
;
CREATE TEMP TABLE w_caisses AS
with type_caisse as (
select ltrim(noenrg, '0') as code, ponpag as texte
from prod_talentia_rh.iptw2fghm_paramg
where cdenrg = 'NC'
group by 1,2),
code_caisse as (
select ltrim(noenrg, '0') as code, ponpag as texte
from prod_talentia_rh.iptw2fghm_paramg
where cdenrg = 'SC'
group by 1,2)
select
cdrubk as rub,
coalesce(type_caisse.code, '')||'|'||coalesce(code_caisse.code, '') as code_ori,
coalesce(type_caisse.code, '')||case when code_caisse.code is null then '' else '-' end||coalesce(code_caisse.code, '') as code,
coalesce(type_caisse.texte, '')||case when code_caisse.code is null then '' else ' - ' end||coalesce(code_caisse.texte, '') as texte
from prod_talentia_rh.iptw2fghm_rubrik
left join type_caisse on type_caisse.code = iptw2fghm_rubrik.cdncak
left join code_caisse on code_caisse.code = iptw2fghm_rubrik.cdcaik
where cdncak != '' or cdcaik != ''
group by 1,2,3,4
;
]]></sqlcmd>
</NODE>
<NODE name="INIT" type="common" />
<NODE label="Mise à jour des informations permanentes">
<sqlcmd><![CDATA[
-- Màj des codes postaux.
INSERT INTO base.t_codes_postaux(code, texte, texte_court, departement_id, departement_code, departement_texte)
select cpsala, max(libura), substr(max(libura), 1, 50), t_departements.oid, t_departements.code, t_departements.texte
from prod_talentia_rh.iptw2fghm_coadrd
JOIN base.t_departements ON t_departements.code = substr(cpsala, 1, 2)
where true
and trim(cpsala) != ''
and cpsala not in (SELECT code FROM base.t_codes_postaux)
group by 1, 4,5,6
;
-- Màj des Entreprises
INSERT INTO rh.t_entreprises(code_original, code, texte, texte_court)
select cdsocp, cdsocp, listep, substr(listep, 1, 50)
from prod_talentia_rh.iptw2fghm_strucp
where 1=1
AND cdetsp = '000'
AND cdsocp NOT IN (SELECT code_original FROM rh.t_entreprises)
GROUP BY 1,2,3,4
;
-- Màj des Etablissements
INSERT INTO rh.t_etablissements(code_original, code, texte, texte_court, entreprise_id)
select cdetsp, cdetsp, listep, substr(listep, 1, 50), t_entreprises.oid
from prod_talentia_rh.iptw2fghm_strucp
JOIN rh.t_entreprises ON t_entreprises.code_original = iptw2fghm_strucp.cdsocp
where 1=1
AND cddepp = '000'
AND cdetsp != '000'
AND cdetsp NOT IN (SELECT code_original FROM rh.t_etablissements)
GROUP BY 1,2,3,4,5
;
-- Màj des catégories socio-professionnelles.
INSERT INTO rh.t_categories_socio_professionnelle(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'EM'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_categories_socio_professionnelle)
group by 1,2,3,4
;
-- [NON] Màj des groupes cotisants.
-- Màj des motifs de début de contrat.
INSERT INTO rh.t_motifs_debut_contrat(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'ME'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_motifs_debut_contrat)
group by 1,2,3,4
;
-- Màj des motifs de fin de contrat
INSERT INTO rh.t_motifs_fin_contrat(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'MD'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_motifs_fin_contrat)
group by 1,2,3,4
;
-- Màj des nationalités
INSERT INTO rh.t_nationalites(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'PA'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_nationalites)
group by 1,2,3,4
;
-- Màj des organismes de cotisation.
INSERT INTO rh.t_organismes_cotisation(code_original, code, texte, texte_court)
SELECT code_ori, code, texte, substr(texte,1,50)
FROM w_caisses
WHERE code_ori NOT IN (SELECT code_original FROM rh.t_organismes_cotisation)
GROUP BY 1,2,3,4
;
-- Màj des qualifications.
INSERT INTO rh.t_qualifications(code_original, code, texte, texte_court)
SELECT cdepli, cdepli, liepli, substr(liepli, 1, 50)
FROM prod_talentia_rh.iptw2fghm_emploi
WHERE cdepli NOT IN (SELECT code_original FROM rh.t_qualifications)
GROUP BY 1,2,3,4
;
-- Màj des rubriques.
INSERT INTO rh.t_rubriques(code_original, code, texte, texte_court, rang_edition)
SELECT
cdrubk,
cdrubk,
lirubk,
substr(lirubk, 1, 50),
nsequk
FROM prod_talentia_rh.iptw2fghm_rubrik
WHERE cdrubk NOT IN (SELECT code_original FROM rh.t_rubriques)
;
-- Màj des situations de famille (non profil)
INSERT INTO rh.t_situations_famille(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'SF'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_situations_famille)
group by 1,2,3,4
;
-- Màj des types de contrat -- iptw2fghm_atcpa1
INSERT INTO rh.t_types_contrat(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'CO'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_types_contrat)
group by 1,2,3,4
;
-- Màj des statuts
INSERT INTO rh.t_statuts(code_original, code, texte, texte_court)
select ltrim(noenrg, '0'), ltrim(noenrg, '0'), trim(ponpag), substr(trim(ponpag), 1, 50)
from prod_talentia_rh.iptw2fghm_paramg
where 1=1
and cdenrg = 'ST'
and ltrim(noenrg, '0') NOT IN (SELECT code_original FROM rh.t_statuts)
group by 1,2,3,4
;
-- Màj des types de temps de travail
INSERT INTO rh.t_types_temps_travail(code_original, code, texte, texte_court)
select
case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'TP' else 'TC' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), '000.00')),
case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'TP' else 'TC' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), '000.00')),
case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'Temps Partiel ' else 'Temps Complet ' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), 'FM990D99')) || 'h',
case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'Tps Part ' else 'Tps Compl ' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), 'FM990D99')) || 'h'
from prod_talentia_rh.iptw2fghm_csalar
WHERE case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'TP' else 'TC' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), '000.00')) NOT IN (SELECT code_original FROM rh.t_types_temps_travail)
group by 1,2,3,4
;
-- Màj des types d'horaire
INSERT INTO rh.t_types_horaire(code_original, code, texte, texte_court)
select codcdd, codcdd, libcdd, substr(libcdd, 1, 50)
from prod_talentia_rh.iptw2fghm_zontab
where true
and nomtbd = 'JOUNUI'
AND codcdd NOT IN (SELECT code_original FROM rh.t_types_horaire WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des services.
INSERT INTO rh.t_services(code_original, code, texte, texte_court)
select cddepp, cddepp, listep, substr(listep, 1, 50)
from prod_talentia_rh.iptw2fghm_strucp
where 1=1
AND cdsecp = '000'
and cddepp != '000'
AND cddepp NOT IN (SELECT code_original FROM rh.t_services)
GROUP BY 1,2,3,4
;
-- [NON] Màj des spécialités.
-- Màj des codes emploi
INSERT INTO rh.t_codes_emploi(code_original, code, texte, texte_court)
select cdsecp, cdsecp, listep, substr(listep, 1, 50)
from prod_talentia_rh.iptw2fghm_strucp
where 1=1
and cdsecp != '000'
AND cdsecp NOT IN (SELECT code_original FROM rh.t_codes_emploi)
GROUP BY 1,2,3,4
;
-- [NON] Màj des comptes.
-- [NON] Màj des sociétés d'interim
-- Màj des grilles
INSERT INTO rh.t_grilles(code_original, code, texte, texte_court)
select nbpoin::int, nbpoin::int, nbpoin::int, substr(nbpoin::int, 1, 50)
from prod_talentia_rh.iptw2fghm_csalar
where nbpoin::int NOT IN (SELECT code_original FROM rh.t_grilles WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des groupes de grilles
INSERT INTO rh.t_grilles_groupes(code_original, code, texte, texte_court)
select codcdd, codcdd, libcdd, substr(libcdd, 1, 50)
from prod_talentia_rh.iptw2fghm_zontab
where true
and nomtbd = 'FILIER'
AND codcdd NOT IN (SELECT code_original FROM rh.t_grilles_groupes WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Màj des motifs d'arret
INSERT INTO rh.t_motifs_arret(code_original, code, texte, texte_court)
select cdcndb, cdcndb, libcob, substr(libcob, 1, 50)
from prod_talentia_rh.iptw2fghm_coempb
where cdcndb NOT IN (SELECT code_original FROM rh.t_motifs_arret WHERE code_original IS NOT NULL)
GROUP BY 1,2,3,4
;
-- Insertion du Plan Analytique.
TRUNCATE rh.t_plan_analytique
;
INSERT INTO rh.t_plan_analytique(oid, code, texte)
VALUES
(1, 'TALENTIARH', 'Plan analytique Talentia RH.')
;
-- Màj des sections analytiques.
INSERT INTO rh.t_section_analytique(code_original, code, texte, texte_court)
select ctan1u||axe11u, ctan1u||axe11u, ctan1u||axe11u, substr(ctan1u||axe11u, 1, 50)
from prod_talentia_rh.iptw2fghm_rsalan
where ctan1u||axe11u NOT IN (SELECT code FROM rh.t_section_analytique)
group by 1,2,3,4
;
]]></sqlcmd>
</NODE>
<NODE label="Paramétrage des rubriques">
<sqlcmd><![CDATA[
-- Pré-paramétrage automatique des rubriques (au mieux).
-- Cette requête n'intervient pas sur les rubriques paramétrées à la main.
-- s_* (source_) :
-- - 0 = nombre
-- - 1 = base
-- - 2 = taux salarial
-- - 3 = montant salarial
-- - 4 = taux patronal
-- - 5 = montant patronal
-- - 6 = montant salarial + montant patronal
DROP TABLE IF EXISTS w_rub_affectation
;
CREATE TEMP TABLE w_rub_affectation AS
select
cdrubk,
false as p_cumul,
-- Rubrique de détail.
cdde1k in ('G', 'R') or cdde3k = 'P' as p_detail,
-- Nombre.
false as p_nombre,
0 as s_nombre,
1 as c_nombre,
-- Base.
cdde1k in ('G', 'R') or cdde3k = 'P' as p_base,
1 as s_base,
1 as c_base,
-- Heures payées.
false as p_heures_payees,
0 as s_heures_payees,
1 as c_heures_payees,
-- Heures travaillées.
false as p_heures_travaillees,
0 as s_heures_travaillees,
1 as c_heures_travaillees,
-- Masse salariale.
(cdde1k in ('G', 'R') and cdrubk::int < 349900) or cdde3k = 'P' as p_masse_salariale,
case
when cdde1k in ('G', 'R') and cdrubk::int < 349900 then 3
when cdde3k = 'P' then 5
else 3
end as s_masse_salariale,
1 as c_masse_salariale,
-- Brut
cdde1k in ('G', 'R') and cdrubk::int < 349900 as p_brut,
3 as s_brut,
1 as c_brut,
-- Avantages en nature
false as p_avantage_nature,
3 as s_avantage_nature,
1 as c_avantage_nature,
-- Frais imposable
false as p_frais_imposables,
3 as s_frais_imposables,
1 as c_frais_imposables,
-- Cotisations salariales
cdde1k in ('G', 'R') and cdrubk::int between 349901 and 600600 as p_cotisation_salarie,
3 as s_cotisation_salarie,
1 as c_cotisation_salarie,
-- Cotisations patronales
cdde3k = 'P' as p_cotisation_patronale,
5 as s_cotisation_patronale,
1 as c_cotisation_patronale, -- tous les montants patronaux sont déjà signés négativement donc -1 pour ce coeff.
-- OD/Net salariales
cdde1k in ('G', 'R') and cdrubk::int > 600600 as p_od_net_salarie,
3 as s_od_net_salarie,
-1 as c_od_net_salarie,
-- OD/Net patronales
false as p_od_net_patronale,
5 as s_od_net_patronale,
1 as c_od_net_patronale,
-- Net imposable
cdde1k in ('G', 'R') and cdrubk::int < 599920 as p_net_imposable,
3 as s_net_imposable,
1 as c_net_imposable,
-- Net à payer
cdde1k in ('G', 'R') p_net_a_payer,
3 as s_net_a_payer,
1 as c_net_a_payer
from prod_talentia_rh.iptw2fghm_rubrik
;
update rh.t_rubriques set
p_cumul = rub.p_cumul,
p_detail = rub.p_detail,
p_nombre = rub.p_nombre,
s_nombre = rub.s_nombre,
c_nombre = rub.c_nombre,
p_base = rub.p_base,
s_base = rub.s_base,
c_base = rub.c_base,
p_heures_payees = rub.p_heures_payees,
s_heures_payees = rub.s_heures_payees,
c_heures_payees = rub.c_heures_payees,
p_heures_travaillees = rub.p_heures_travaillees,
s_heures_travaillees = rub.s_heures_travaillees,
c_heures_travaillees = rub.c_heures_travaillees,
p_masse_salariale = rub.p_masse_salariale,
s_masse_salariale = rub.s_masse_salariale,
c_masse_salariale = rub.c_masse_salariale,
p_brut = rub.p_brut,
s_brut = rub.s_brut,
c_brut = rub.c_brut,
p_avantage_nature = rub.p_avantage_nature,
s_avantage_nature = rub.s_avantage_nature,
c_avantage_nature = rub.c_avantage_nature,
p_frais_imposables = rub.p_frais_imposables,
s_frais_imposables = rub.s_frais_imposables,
c_frais_imposables = rub.c_frais_imposables,
p_cotisation_salarie = rub.p_cotisation_salarie,
s_cotisation_salarie = rub.s_cotisation_salarie,
c_cotisation_salarie = rub.c_cotisation_salarie,
p_cotisation_patronale = rub.p_cotisation_patronale,
s_cotisation_patronale = rub.s_cotisation_patronale,
c_cotisation_patronale = rub.c_cotisation_patronale,
p_od_net_salarie = rub.p_od_net_salarie,
s_od_net_salarie = rub.s_od_net_salarie,
c_od_net_salarie = rub.c_od_net_salarie,
p_od_net_patronale = rub.p_od_net_patronale,
s_od_net_patronale = rub.s_od_net_patronale,
c_od_net_patronale = rub.c_od_net_patronale,
p_net_imposable = rub.p_net_imposable,
s_net_imposable = rub.s_net_imposable,
c_net_imposable = rub.c_net_imposable,
p_net_a_payer = rub.p_net_a_payer,
s_net_a_payer = rub.s_net_a_payer,
c_net_a_payer = rub.c_net_a_payer
from w_rub_affectation as rub
where 1=1
AND t_rubriques.code_original = rub.cdrubk
AND NOT t_rubriques.user_modified
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PROD" label="RECUPERATION DES DONNEES DE PRODUCTION">
<NODE label="Pre-traitement des Profils">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_profils
;
CREATE TEMP TABLE w_profils AS
SELECT
0 AS profil_id, -- Identifiant CTI du profil CTI
cdmatn||'-'||chronn as code_original, -- Code unique du profil CTI.
-- Clefs naturelles prestataire.
cdsocn as ent_ori,
cdetsn as ets_ori,
t_etablissements.oid as etablissement_id,
t_etablissements.entreprise_id,
cdmatn as mat,
-- noconn as numero_contrat,
noconn||'-'||chronn as numero_contrat,
base.cti_to_date(dtdctn)::date as date_debut,
coalesce(base.cti_to_date(dtfctn)::date, '2099-12-31'::date) as date_fin,
coalesce(nullif(nbhtpn, 0), 151.67) / 151.67 as etp_contrat,
coalesce(nullif(nbhtpn, 0), 151.67) as heures_contrat,
0 as est_hors_periode,
-- Données du Profil CTI
coalesce(nullif(trim(cdempn), ''), chr(1)||'*') as categorie_socio_professionnelle_code_original,
coalesce(nullif(trim(cdsecn), ''), chr(1)||'*') as code_emploi_code_original,
coalesce(nullif(trim(nbpoin::int), 0), chr(1)||'*') as grille_code_original,
chr(1)||'*' as grille_groupe_code_original, -- FIXME Impossible de trouver l'usage dans les tables de prod.
chr(1)||'*' AS groupe_cotisant_code_original,
coalesce(nullif(trim(MOTENN), ''), chr(1)||'*') as motif_debut_code_original,
coalesce(nullif(trim(CDMODN), ''), chr(1)||'*') as motif_fin_code_original,
coalesce(nullif(trim(cdepln), ''), chr(1)||'*') as qualification_code_original,
chr(1)||'*' AS section_analytique_code_original,
chr(1)||'*' AS section_analytique_paie_code_original,
coalesce(nullif(trim(cddepn), ''), chr(1)||'*') AS service_code_original,
chr(1)||'*' AS societe_interim_code_original,
chr(1)||'*' AS specialite_code_original,
coalesce(nullif(trim(cdcatn), ''), chr(1)||'*') as statut_code_original,
coalesce(nullif(trim(cdconn), ''), chr(1)||'*') AS type_contrat_code_original,
chr(1)||'*' AS type_horaire_code_original,
case when coalesce(nullif(nbhtpn, 0), 151.67) < 151.67 then 'TP' else 'TC' end || trim(to_char(coalesce(nullif(nbhtpn, 0), 151.67), '000.00')) AS type_temps_travail_code_original,
-- Champs dédiés au public.
chr(1)||'*' AS unite_fonctionnelle_code_original,
chr(1)||'*' AS categorie_conge_code_original,
chr(1)||'*' AS compte_salarie_code_original,
chr(1)||'*' AS commission_paritaire_code_original,
chr(1)||'*' AS lettre_budgetaire_code_original,
chr(1)||'*' AS cadre_emploi_code_original,
chr(1)||'*' AS filiere_code_original,
chr(1)||'*' AS categorie_statutaire_code_original
from prod_talentia_rh.iptw2fghm_csalar
join rh.t_etablissements on t_etablissements.code_original = iptw2fghm_csalar.cdetsn
;
]]></sqlcmd>
</NODE>
<NODE name="PROFIL" type="common" />
<NODE label="Salariés">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_salaries
;
CREATE TEMP TABLE w_salaries AS
SELECT
rhp('finess') AS finess,
nomsan AS nom,
prenon AS prenom,
base.cti_to_date(aanasn, mmnasn, jjnasn) AS date_naissance,
CASE WHEN cdsexn = 'H' THEN 'M' ELSE 'F' END AS sexe,
cdmatn AS matricule,
cdmatn AS code,
cdmatn AS code_original,
coalesce(t_entreprises.oid, 0) AS entreprise_id,
coalesce(t_nationalites.oid, 0) AS nationalite_id,
coalesce(t_codes_postaux.oid, 0) AS code_postal_id,
nomjfn AS nom_naissance,
coalesce(t_situations_famille.oid, 0) AS situation_famille_id,
((max(ARRAY[w_profils.date_fin::text, w_profils.profil_id::text]))[2])::bigint AS profil_id, -- dernier profil salarié.
max(w_profils.date_debut) AS date_debut, -- date de début du dernier contrat.
max(w_profils.date_fin) AS date_fin, -- date de fin du dernier contrat.
min(w_profils.date_debut) AS date_entree_ets,
max(w_profils.date_fin) AS date_sortie_ets,
-- Champs dédiés au public.
'1900-01-01'::date AS date_entree_fp,
'1900-01-01'::date AS date_entree_fph,
0 AS no_adeli,
0 AS code_cotisation_id,
0 AS matricule_retraite
FROM prod_talentia_rh.iptw2fghm_salarn AS salarie
JOIN w_profils on w_profils.mat = salarie.cdmatn
LEFT JOIN rh.t_codes_postaux ON t_codes_postaux.code = salarie.cpsaln
LEFT JOIN rh.t_situations_famille ON t_situations_famille.code_original = salarie.cdsifn
LEFT JOIN rh.t_entreprises ON t_entreprises.code_original = salarie.cdsocn
LEFT JOIN rh.t_nationalites ON t_nationalites.code_original = salarie.cdnatn
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13, 19,20,21,22,23
;
]]></sqlcmd>
</NODE>
<NODE name="SALARIE" type="common" />
<NODE label="Contrats">
<sqlcmd><![CDATA[
TRUNCATE rh.p_contrats
;
ALTER SEQUENCE rh.s_contrats RESTART WITH 1
;
INSERT INTO rh.p_contrats(
salarie_id,
date_debut,
date_fin,
numero_contrat,
code_original,
etablissement_id,
profil_id)
select
coalesce(p_salaries.oid,0) AS salarie_id,
w_profils.date_debut,
w_profils.date_fin,
w_profils.numero_contrat,
w_profils.numero_contrat AS code_original,
coalesce(t_etablissements.oid,0) AS etablissement_id,
(max(ARRAY[extract(EPOCH from w_profils.date_fin), w_profils.profil_id]))[2] AS profil_id -- Il se peut que pour un même contrat, il y est plusieurs profils. Dans ce cas on prend le profil le plus récent.
from w_profils
JOIN rh.p_salaries ON p_salaries.matricule = w_profils.mat
join rh.t_etablissements ON t_etablissements.code_original = w_profils.ets_ori
GROUP BY 1,2,3,4,5,6
;
TRUNCATE rh.p_contrats_mois
;
ALTER SEQUENCE rh.s_contrats_mois RESTART WITH 1
;
INSERT INTO rh.p_contrats_mois(
code_original,
salarie_id,
etablissement_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,
nombre_heures,
age_id,
age_jours,
anciennete_jours,
anciennete_mois,
anciennete_annee_id)
SELECT
w_profils.code_original,
p_salaries.oid AS salarie_id,
p_contrats.etablissement_id,
p_contrats.oid AS contrat_id,
p_calendrier_mois.mois AS mois,
GREATEST(p_calendrier_mois.date_debut, w_profils.date_debut) AS date_debut,
LEAST(p_calendrier_mois.date_fin, w_profils.date_fin) AS date_fin,
CASE WHEN p_salaries.date_entree_ets BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_entrees,
CASE WHEN p_salaries.date_sortie_ets BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_departs,
CASE WHEN p_contrats.date_debut BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_debut_contrat,
CASE WHEN p_contrats.date_fin BETWEEN p_calendrier_mois.date_debut AND p_calendrier_mois.date_fin THEN 1 ELSE 0 END AS nombre_fin_contrat,
w_profils.est_hors_periode,
CASE WHEN p_calendrier_mois.date_debut BETWEEN p_contrats.date_debut AND p_contrats.date_fin THEN 1 ELSE 0 END AS present_debut_mois,
CASE WHEN p_calendrier_mois.date_fin BETWEEN p_contrats.date_debut AND p_contrats.date_fin THEN 1 ELSE 0 END AS present_fin_mois,
etp_contrat,
heures_contrat,
base.cti_age(LEAST(p_calendrier_mois.date_fin, w_profils.date_fin), COALESCE(p_salaries.date_naissance, '1962-04-18'::date), 'ny') AS age_id,
LEAST(p_calendrier_mois.date_fin, w_profils.date_fin)::date - COALESCE(p_salaries.date_naissance, '1962-04-18'::date) AS age_jours,
p_contrats.anciennete_anterieure_jours
+ (LEAST(p_calendrier_mois.date_fin, w_profils.date_fin) - p_contrats.date_debut)
+ 1
AS anciennete_jours,
base.cti_months_between(p_contrats.date_debut, p_calendrier_mois.date_fin)
+ p_contrats.anciennete_anterieure_calculee_mois
AS anciennete_mois,
floor(
(
base.cti_months_between(p_contrats.date_debut, p_calendrier_mois.date_fin)
+ p_contrats.anciennete_anterieure_calculee_mois
) / 12
) AS anciennete_annee_id
from w_profils
JOIN base.p_calendrier_mois ON base.cti_overlaps(w_profils.date_debut, w_profils.date_fin, p_calendrier_mois.date_debut, p_calendrier_mois.date_fin)
JOIN rh.p_contrats ON p_contrats.numero_contrat = w_profils.numero_contrat
JOIN rh.p_salaries ON p_salaries.matricule = w_profils.mat
WHERE 1=1
AND p_calendrier_mois.mois < to_char(now() + '1 month'::interval, 'YYYYMM')
;
]]></sqlcmd>
</NODE>
<NODE label="Historique de la paie">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_hp
;
CREATE TEMP TABLE w_hp AS
SELECT
bul.mat,
p_salaries.oid as salarie_id,
p_salaries.date_naissance,
bul.mois::int AS mois_paie,
bul.mois::int AS mois_activite,
nojobo,
norjpo,
bul.date_debut,
bul.date_fin,
bul.date_fin as date_paie,
t_rubriques.p_detail,
t_rubriques.p_cumul,
t_rubriques.oid as rubrique_id,
lig.cdrub9 as rub,
(CASE WHEN p_nombre THEN (CASE s_nombre
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_nombre)::numeric AS nombre,
(CASE WHEN p_base THEN (CASE s_base
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_base)::numeric AS base,
(CASE WHEN p_heures_payees THEN (CASE s_heures_payees
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_heures_payees)::numeric(11, 2) AS heure_payee,
(CASE WHEN p_heures_travaillees THEN (CASE s_heures_travaillees
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_heures_travaillees)::numeric(11, 2) AS heure_travaillee,
(CASE WHEN p_masse_salariale THEN (CASE s_masse_salariale
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_masse_salariale)::numeric AS montant_masse_salariale,
(CASE WHEN p_brut THEN (CASE s_brut
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_brut)::numeric AS montant_brut,
(CASE WHEN p_avantage_nature THEN (CASE s_avantage_nature
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_avantage_nature)::numeric AS montant_avantage_nature,
(CASE WHEN p_frais_imposables THEN (CASE s_frais_imposables
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_frais_imposables)::numeric AS montant_frais_imposables,
(txsa29 * coefficient_txs) AS taux_cotisation_salarie,
(CASE WHEN p_cotisation_salarie THEN (CASE s_cotisation_salarie
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_cotisation_salarie)::numeric AS montant_cotisation_salarie,
(txpa29 * coefficient_txp) AS taux_cotisation_patronale,
(CASE WHEN p_cotisation_patronale THEN (CASE s_cotisation_patronale
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_cotisation_patronale)::numeric AS montant_cotisation_patronale,
(CASE WHEN p_od_net_salarie THEN (CASE s_od_net_salarie
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_od_net_salarie)::numeric AS montant_od_net_salarie,
(CASE WHEN p_od_net_patronale THEN (CASE s_od_net_patronale
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_od_net_patronale)::numeric AS montant_od_net_patronale,
(CASE WHEN p_net_imposable THEN (CASE s_net_imposable
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_net_imposable)::numeric AS montant_net_imposable_salarie,
(CASE WHEN p_net_a_payer THEN (CASE s_net_a_payer
WHEN 0 THEN mbsp29
WHEN 1 THEN mbsp29
WHEN 2 THEN txsa29
WHEN 3 THEN mtsr29
WHEN 4 THEN txpa29
WHEN 5 THEN mtpr29
WHEN 6 THEN mtsr29 + mtpr29
WHEN 7 THEN mtsr29 - mtpr29
WHEN 8 THEN -mtsr29 + mtpr29
END) ELSE 0 END * c_net_a_payer)::numeric AS montant_net_a_payer_salarie
FROM w_bul as bul
JOIN prod_talentia_rh.iptw2fghm_hires9 as lig ON 1=1
AND lig.cdmat9 = bul.mat
AND lig.nojob9 = bul.nojobo
AND lig.norjp9 = bul.norjpo
JOIN rh.p_salaries ON p_salaries.matricule = bul.mat
JOIN rh.t_rubriques ON t_rubriques.code_original = lig.cdrub9
WHERE 1=1
AND aappa9::int >= 2016
AND (1!=1
OR t_rubriques.p_detail
OR t_rubriques.p_cumul)
;
TRUNCATE rh.p_historique_paie
;
ALTER SEQUENCE rh.s_historique_paie RESTART WITH 1
;
SELECT base.cti_stash_table_indexes('rh', 'p_historique_paie')
;
DROP TABLE IF EXISTS w_hp_1
;
CREATE TEMP TABLE w_hp_1 AS
SELECT
nextval('rh.s_historique_paie'::regclass) as oid,
date_part('year', age(w_hp.date_debut, date_naissance)) AS age_id,
w_hp.nombre,
w_hp.base AS base,
(max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.contrat_id]))[2] AS contrat_id,
(max(ARRAY[EXTRACT(EPOCH FROM p_contrats_mois.date_fin),p_contrats_mois.oid]))[2] AS contrat_mois_id,
w_hp.date_debut,
w_hp.date_fin,
w_hp.date_paie,
w_hp.mois_activite,
w_hp.mois_paie,
w_hp.heure_payee,
w_hp.heure_travaillee,
w_hp.montant_avantage_nature,
w_hp.montant_brut,
w_hp.montant_masse_salariale,
w_hp.montant_cotisation_patronale,
w_hp.montant_cotisation_salarie,
w_hp.montant_frais_imposables,
w_hp.montant_net_a_payer_salarie,
w_hp.montant_net_imposable_salarie,
w_hp.montant_od_net_salarie,
w_hp.montant_od_net_patronale,
coalesce(t_organismes_cotisation.oid, 0) AS organisme_cotisation_id,
rubrique_id,
w_hp.mat,
w_hp.salarie_id,
w_hp.taux_cotisation_patronale,
w_hp.taux_cotisation_salarie,
0 AS compte_id,
nojobo,
norjpo
FROM w_hp
LEFT JOIN w_caisses ON w_caisses.rub = w_hp.rub
LEFT JOIN rh.t_organismes_cotisation ON t_organismes_cotisation.code_original = w_caisses.code_ori
LEFT JOIN rh.p_contrats_mois ON 1=1
AND p_contrats_mois.salarie_id = w_hp.salarie_id
AND base.cti_overlaps(p_contrats_mois.date_debut, p_contrats_mois.date_fin, w_hp.date_debut, w_hp.date_fin)
WHERE w_hp.p_detail
GROUP BY 1,2,3,4, 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, w_hp.ctid
;
-- Associer les bulletins hors contrat (is null) avec le contrat PRECEDENT.
UPDATE w_hp_1 SET
contrat_id = subq.contrat_id,
contrat_mois_id = subq.contrat_mois_id
FROM (
select
w_hp_1.oid,
(max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.contrat_id]))[2] as contrat_id,
(max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id
from w_hp_1
join rh.p_contrats_mois on true
and p_contrats_mois.salarie_id = w_hp_1.salarie_id
and p_contrats_mois.date_fin < w_hp_1.date_debut
where contrat_mois_id is null
group by 1) as subq
WHERE true
AND w_hp_1.oid = subq.oid
AND w_hp_1.contrat_mois_id is null
;
-- Associer les bulletins hors contrat (is null) avec le contrat SUIVANT.
UPDATE w_hp_1 SET
contrat_id = subq.contrat_id,
contrat_mois_id = subq.contrat_mois_id
FROM (
select
w_hp_1.oid,
(max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.contrat_id]))[2] as contrat_id,
(max(array[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id
from w_hp_1
join rh.p_contrats_mois on true
and p_contrats_mois.salarie_id = w_hp_1.salarie_id
and p_contrats_mois.date_debut > w_hp_1.date_fin
where contrat_mois_id is null
group by 1) as subq
WHERE true
AND w_hp_1.oid = subq.oid
AND w_hp_1.contrat_mois_id is null
;
-- Insertion dans la table de production CTI.
INSERT INTO rh.p_historique_paie(
oid,
age_id,
nombre,
base,
contrat_id,
contrat_mois_id,
date_debut,
date_fin,
date_paie,
mois_activite,
mois_paie,
heure_payee,
heure_travaillee,
montant_avantage_nature,
montant_brut,
montant_masse_salariale,
montant_cotisation_patronale,
montant_cotisation_salarie,
montant_frais_imposables,
montant_net_a_payer_salarie,
montant_net_imposable_salarie,
montant_od_net_salarie,
montant_od_net_patronale,
organisme_cotisation_id,
rubrique_id,
salarie_id,
taux_cotisation_patronale,
taux_cotisation_salarie,
compte_id)
SELECT
oid,
age_id,
nombre,
base,
contrat_id,
contrat_mois_id,
date_debut,
date_fin,
date_paie,
mois_activite,
mois_paie,
heure_payee,
heure_travaillee,
montant_avantage_nature,
montant_brut,
montant_masse_salariale,
montant_cotisation_patronale,
montant_cotisation_salarie,
montant_frais_imposables,
montant_net_a_payer_salarie,
montant_net_imposable_salarie,
montant_od_net_salarie,
montant_od_net_patronale,
organisme_cotisation_id,
rubrique_id,
salarie_id,
taux_cotisation_patronale,
taux_cotisation_salarie,
compte_id
FROM w_hp_1
;
-- 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,
nombre,
base,
heure_payee,
heure_travaillee,
montant_masse_salariale,
montant_brut,
montant_avantage_nature,
montant_frais_imposables,
montant_cotisation_salarie,
montant_cotisation_patronale,
montant_od_net_salarie,
montant_od_net_patronale,
montant_net_imposable_salarie,
montant_net_a_payer_salarie,
organisme_cotisation_id,
profil_id, -- @deprecated
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 nombre,
0 AS base,
sum(cum.heure_payee - subq.heure_payee) as heure_payee,
sum(cum.heure_travaillee - subq.heure_travaillee) as heure_travaillee,
sum(cum.montant_masse_salariale - subq.montant_masse_salariale) as montant_masse_salariale,
sum(cum.montant_brut - subq.montant_brut) as montant_brut,
sum(cum.montant_avantage_nature - subq.montant_avantage_nature) as montant_avantage_nature,
sum(cum.montant_frais_imposables - subq.montant_frais_imposables) as montant_frais_imposables,
sum(cum.montant_cotisation_salarie - subq.montant_cotisation_salarie) as montant_cotisation_salarie,
sum(cum.montant_cotisation_patronale - subq.montant_cotisation_patronale) as montant_cotisation_patronale,
sum(cum.montant_od_net_salarie - subq.montant_od_net_salarie) as montant_od_net_salarie,
sum(cum.montant_od_net_patronale - subq.montant_od_net_patronale) as montant_od_net_patronale,
sum(cum.montant_net_imposable_salarie - subq.montant_net_imposable_salarie) as montant_net_imposable_salarie,
sum(cum.montant_net_a_payer_salarie - subq.montant_net_a_payer_salarie) as montant_net_a_payer_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
w_hp.salarie_id,
w_hp.nojobo,
w_hp.norjpo,
sum(w_hp.heure_payee) as heure_payee,
sum(w_hp.heure_travaillee) as heure_travaillee,
sum(w_hp.montant_avantage_nature) as montant_avantage_nature,
sum(w_hp.montant_brut) as montant_brut,
sum(w_hp.montant_masse_salariale) as montant_masse_salariale,
sum(w_hp.montant_cotisation_patronale) as montant_cotisation_patronale,
sum(w_hp.montant_cotisation_salarie) as montant_cotisation_salarie,
sum(w_hp.montant_frais_imposables) as montant_frais_imposables,
sum(w_hp.montant_net_a_payer_salarie) as montant_net_a_payer_salarie,
sum(w_hp.montant_net_imposable_salarie) as montant_net_imposable_salarie,
sum(w_hp.montant_od_net_salarie) as montant_od_net_salarie,
sum(w_hp.montant_od_net_patronale) as montant_od_net_patronale
FROM w_hp
WHERE w_hp.p_cumul
GROUP BY 1,2,3) as cum
JOIN (
SELECT
age_id,
contrat_id,
contrat_mois_id,
date_debut,
date_fin,
date_paie,
mois_activite,
mois_paie,
nojobo,
norjpo,
sum(heure_payee) as heure_payee,
sum(heure_travaillee) as heure_travaillee,
sum(montant_masse_salariale) as montant_masse_salariale,
sum(montant_brut) AS montant_brut,
sum(montant_avantage_nature) AS montant_avantage_nature,
sum(montant_frais_imposables) AS montant_frais_imposables,
sum(montant_cotisation_salarie) AS montant_cotisation_salarie,
sum(montant_cotisation_patronale) AS montant_cotisation_patronale,
sum(montant_od_net_salarie) as montant_od_net_salarie,
sum(montant_od_net_patronale) as montant_od_net_patronale,
sum(montant_net_imposable_salarie) AS montant_net_imposable_salarie,
sum(montant_net_a_payer_salarie) AS montant_net_a_payer_salarie,
0 AS organisme_cotisation_id,
0 AS profil_id,
(SELECT oid FROM rh.t_rubriques WHERE code = 'C000'),
salarie_id,
0 AS taux_cotisation_patronale,
0 AS taux_cotisation_salarie
FROM w_hp_1
GROUP BY 1,2,3,4,5,6,7,8,9,10, 23,24,25,26,27,28) AS subq ON true
AND subq.salarie_id = cum.salarie_id
AND subq.nojobo = cum.nojobo
AND subq.norjpo = cum.norjpo
GROUP BY 1,2,3,4,5,6,7,8, 23,24,25,26,27,28
HAVING 1!=1
OR sum(cum.heure_payee - subq.heure_payee) != 0
OR sum(cum.heure_travaillee - subq.heure_travaillee) != 0
OR sum(cum.montant_masse_salariale - subq.montant_masse_salariale) != 0
OR sum(cum.montant_brut - subq.montant_brut) != 0
OR sum(cum.montant_avantage_nature - subq.montant_avantage_nature) != 0
OR sum(cum.montant_frais_imposables - subq.montant_frais_imposables) != 0
OR sum(cum.montant_cotisation_salarie - subq.montant_cotisation_salarie) != 0
OR sum(cum.montant_cotisation_patronale - subq.montant_cotisation_patronale) != 0
OR sum(cum.montant_od_net_salarie - subq.montant_od_net_salarie) != 0
OR sum(cum.montant_od_net_patronale - subq.montant_od_net_patronale) != 0
OR sum(cum.montant_net_imposable_salarie - subq.montant_net_imposable_salarie) != 0
OR sum(cum.montant_net_a_payer_salarie - subq.montant_net_a_payer_salarie) != 0
;
SELECT base.cti_stash_pop_table_indexes('rh', 'p_historique_paie')
;
INSERT INTO rh.t_divers (code, texte, valeur, valeur_date, description, show_info_module)
SELECT
'NOW',
'Date en-cours',
to_char(date_max, 'YYYYMM'),
date_max,
'Date non modifiable',
true
FROM
(SELECT date(MAX(date_paie) + interval '1 month') AS date_max FROM rh.p_historique_paie WHERE date_paie <= now()) sub
WHERE 'NOW' NOT IN (SELECT code FROM rh.t_divers);
INSERT INTO rh.t_divers (code, texte, valeur, valeur_date, description, show_info_module)
SELECT
'NOWCLOTURE',
'Date en-cours',
to_char(date_max, 'YYYYMM'),
date_max,
'Date non modifiable',
true
FROM
(SELECT date(MAX(date_paie)) AS date_max FROM rh.p_historique_paie WHERE date_paie <= now()) sub
WHERE 'NOWCLOTURE' NOT IN (SELECT code FROM rh.t_divers);
]]></sqlcmd>
</NODE>
<NODE label="Chiffrier">
<sqlcmd><![CDATA[
TRUNCATE rh.p_chiffrier_production
;
INSERT INTO rh.p_chiffrier_production (entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures)
select
t_etablissements.entreprise_id AS entreprise_id,
t_etablissements.oid as etablissement_id,
mois_paie,
count(distinct mat) AS nombre_salaries,
sum(montant_brut),
sum(heure_payee) AS nombre_heures
FROM w_hp
JOIN rh.p_salaries ON p_salaries.matricule = w_hp.mat
LEFT JOIN rh.p_contrats_mois ON 1=1
AND p_contrats_mois.salarie_id = p_salaries.oid
AND base.cti_overlaps(p_contrats_mois.date_debut, p_contrats_mois.date_fin, w_hp.date_debut, w_hp.date_fin)
LEFT JOIN rh.t_etablissements on t_etablissements.oid = p_contrats_mois.etablissement_id
WHERE w_hp.p_cumul
group by 1,2,3
;
]]></sqlcmd>
</NODE>
<NODE label="Ventilation des profils">
<sqlcmd><![CDATA[
-- Alimentation des profils simultanés.
TRUNCATE rh.p_profil_contrat_mois
;
INSERT INTO rh.p_profil_contrat_mois (
profil_id,
contrat_mois_id,
salarie_id,
ratio,
mois)
select
w_profils.profil_id,
p_contrats_mois.oid as contrat_mois_id,
p_contrats_mois.salarie_id,
1 AS ratio,
p_contrats_mois.mois_activite
from rh.p_contrats_mois
join w_profils ON w_profils.code_original = p_contrats_mois.code_original
group by 1,2,3,4,5
;
]]></sqlcmd>
</NODE>
<NODE label="Ventilation Analytique">
<sqlcmd><![CDATA[
DROP SEQUENCE IF EXISTS ventilation_id
;
CREATE TEMP SEQUENCE ventilation_id START 1
;
DROP TABLE IF EXISTS w_ven
;
CREATE TEMP TABLE w_ven AS
with ven_0 as (
select
ctan1u||axe11u as sec,
dtperu,
dtdppu,
dtfppu,
nojobu,
norjpu,
cdmatu as mat,
sum(pcan1u) / 100.0 as rat
from prod_talentia_rh.iptw2fghm_rsalan
group by 1,2,3,4,5,6,7)
, ven_1 as (
select
sec,
dtperu,
dtdppu,
dtfppu,
nojobu,
norjpu,
mat,
base.cti_division(rat, sum(rat) over w) as rat,
row_number() over wo as rang
from ven_0
window w as (partition by mat, dtperu, dtdppu, dtfppu, nojobu, norjpu),
wo as (partition by mat, dtperu, dtdppu, dtfppu, nojobu, norjpu order by rat desc))
, ven_corr as (
select
dtperu,
dtdppu,
dtfppu,
nojobu,
norjpu,
mat,
1.0 - sum(rat) as cor
from ven_1
group by 1,2,3,4,5,6
having sum(rat) != 1)
select
ven_1.dtperu,
ven_1.dtdppu,
ven_1.dtfppu,
ven_1.nojobu,
ven_1.norjpu,
ven_1.mat,
array_agg(ven_1.sec order by ven_1.sec) as sec,
array_agg(case when cor is not null and ven_1.rang = 1 then ven_1.rat + ven_corr.cor else ven_1.rat end order by ven_1.sec) as rat,
nextval('ventilation_id') as ventilation_id
from ven_1
left join ven_corr on 1=1
and ven_corr.dtperu = ven_1.dtperu
and ven_corr.dtdppu = ven_1.dtdppu
and ven_corr.dtfppu = ven_1.dtfppu
and ven_corr.nojobu = ven_1.nojobu
and ven_corr.norjpu = ven_1.norjpu
and ven_corr.mat = ven_1.mat
group by 1,2,3,4,5,6
;
-- Récupération des différents schémas/modèles de ventilation.
TRUNCATE rh.p_ventilation
;
INSERT INTO rh.p_ventilation(oid, code, texte, plan_analytique_id)
select
ventilation_id,
ventilation_id::text,
array_to_string(sec, ',')||' @ '||array_to_string(rat, ','),
1
FROM w_ven
group by 1,2,3,4
UNION ALL
SELECT
0,
'N/R',
'Non renseignée',
1
;
TRUNCATE rh.p_ventilation_section
;
INSERT INTO rh.p_ventilation_section(
ventilation_id,
section_analytique_id,
section_analytique_code,
section_analytique_texte,
ratio)
SELECT
ventilation_id,
t_section_analytique.oid,
t_section_analytique.code,
t_section_analytique.texte,
rat
FROM (
SELECT
ventilation_id,
unnest(sec) as sec,
unnest(rat) as rat
FROM w_ven
group by 1,2,3) as subq
JOIN rh.t_section_analytique on t_section_analytique.code_original = sec
UNION ALL
SELECT
0,
oid,
code,
texte,
1
FROM rh.t_section_analytique
WHERE oid = 0
;
WITH subq AS (
select
w_hp_1.oid,
w_ven.ventilation_id
from w_hp_1
join w_ven on 1=1
and w_ven.nojobu = w_hp_1.nojobo
and w_ven.norjpu = w_hp_1.norjpo
and w_ven.mat = w_hp_1.mat
and w_ven.dtperu = w_hp_1.mois_paie)
UPDATE rh.p_historique_paie SET
ventilation_1_id = subq.ventilation_id
FROM subq
WHERE p_historique_paie.oid = subq.oid
;
]]></sqlcmd>
</NODE>
<NODE label="Arrêts de travail">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_arrets
;
CREATE TEMP TABLE w_arrets AS
select
cdsocg as ent,
cdmatg as mat,
cdmatg||'-'||noarrg as code,
cdcndg as motif,
to_char(dtdatg::text::date, 'YYYYMM')::int as mois_activite,
dtdatg::text::date as date_debut,
dtfatg::text::date as date_fin,
dtfatg::text::date - dtdatg::text::date + 1 as duree,
nullif(dtretg, 0)::text::date as date_reprise
from prod_talentia_rh.iptw2fghm_malptg
;
-- Alimentation des arrêts de travail (pas d'heures dans Talentia RH).
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,
max(p_contrats.oid),
w_arrets.mois_activite,
w_arrets.date_debut,
w_arrets.date_fin,
w_arrets.date_reprise,
coalesce(t_motifs_arret.oid, 0) AS motif_arret_id,
0 AS precision_motif_arret_id,
w_arrets.duree
FROM w_arrets
JOIN rh.p_salaries ON p_salaries.code_original = w_arrets.mat
LEFT JOIN rh.t_motifs_arret ON t_motifs_arret.code_original = w_arrets.motif
JOIN rh.p_contrats ON 1=1
AND p_contrats.salarie_id = p_salaries.oid
AND base.cti_overlaps(w_arrets.date_debut, w_arrets.date_fin, p_contrats.date_debut, p_contrats.date_fin)
GROUP BY 1, 3,4,5,6,7,8,9
;
-- 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,
nb_arret)
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,
(max(DISTINCT ARRAY[p_contrats_mois.date_fin - p_contrats_mois.date_debut, p_contrats_mois.oid]))[2] AS contrat_mois_id, -- On ratache l'arrêt au contrat le plus long dans le mois lorsque plusieurs contrat sur la même période.
p_contrats_mois.mois_activite,
CASE WHEN p_arrets_travail.date_debut BETWEEN min(p_contrats_mois.date_debut) AND max(p_contrats_mois.date_fin) THEN 1 ELSE 0 END AS nombre_debut_arret,
CASE WHEN p_arrets_travail.date_fin BETWEEN min(p_contrats_mois.date_debut) AND max(p_contrats_mois.date_fin) THEN 1 ELSE 0 END AS nombre_fin_arret,
CASE WHEN p_arrets_travail.date_reprise BETWEEN min(p_contrats_mois.date_debut) AND max(p_contrats_mois.date_fin) THEN 1 ELSE 0 END AS nb_reprise_apres_arret,
min(GREATEST(p_contrats_mois.date_debut, p_arrets_travail.date_debut)) AS date_debut,
max(LEAST(p_contrats_mois.date_fin, p_arrets_travail.date_fin)) AS date_fin,
max(LEAST(p_contrats_mois.date_fin, p_arrets_travail.date_fin)::date) - min(GREATEST(p_contrats_mois.date_debut, p_arrets_travail.date_debut)::date) + 1 AS nb_jours,
CASE WHEN base.cti_overlaps(p_arrets_travail.date_debut, p_arrets_travail.date_fin, p_contrats_mois.date_debut, p_contrats_mois.date_fin) THEN 1 ELSE 0 END AS nb_arret
FROM rh.p_contrats_mois
JOIN rh.p_arrets_travail ON 1=1
AND p_contrats_mois.contrat_id = p_arrets_travail.contrat_id
AND base.cti_overlaps(p_arrets_travail.date_debut, p_arrets_travail.date_reprise, p_contrats_mois.date_debut, p_contrats_mois.date_fin)
GROUP BY 1,2,3,5,p_arrets_travail.date_debut,p_arrets_travail.date_fin,p_arrets_travail.date_reprise,12
ORDER BY 9
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="POST" label="POST-TRAITEMENTS">
<NODE name="DIVERS" type="common"/>
<NODE name="POST" type="common"/>
</NODE>
<NODE name="VACUUM" label="REORGANISATION BASE DE DONNEES">
<NODE name="VACUUM" type="common" />
</NODE>
<NODE name="RAZ" label="RAZ BASE">
<NODE name="RAZ" type="common" />
</NODE>
<NODE name="RAZ_ALL" label="RAZ ALL">
<NODE name="RAZ_ALL" type="common" />
</NODE>
</ROOT>