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.
 
 
 

1588 lines
59 KiB

<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
<NODE name="INIT" label="INITIALISATIONS">
<NODE label="Mise à jour des informations permanentes">
<sqlcmd><![CDATA[
-- Màj des codes postaux
INSERT INTO rh.t_codes_postaux(oid, code, texte, texte_court, longitude, latitude, departement_id,
departement_code, departement_texte)
SELECT
t_codes_postaux.oid,
t_codes_postaux.code,
t_codes_postaux.texte,
t_codes_postaux.texte_court,
t_codes_postaux.longitude,
t_codes_postaux.latitude,
t_codes_postaux.departement_id,
t_codes_postaux.departement_code,
t_codes_postaux.departement_texte
FROM base.t_codes_postaux
LEFT JOIN rh.t_codes_postaux t_codes_postaux_rh ON t_codes_postaux_rh.oid = t_codes_postaux.oid
WHERE t_codes_postaux_rh.oid IS NULL
;
UPDATE rh.t_codes_postaux AS t_codes_postaux_rh
SET
code = t_codes_postaux.code,
texte = t_codes_postaux.texte,
texte_court = t_codes_postaux.texte_court,
longitude = t_codes_postaux.longitude,
latitude = t_codes_postaux.latitude,
departement_id = t_codes_postaux.departement_id,
departement_code = t_codes_postaux.departement_code,
departement_texte = t_codes_postaux.departement_texte
FROM base.t_codes_postaux
WHERE
t_codes_postaux_rh.oid = t_codes_postaux.oid
AND (
t_codes_postaux_rh.code IS DISTINCT FROM t_codes_postaux.code OR
t_codes_postaux_rh.texte IS DISTINCT FROM t_codes_postaux.texte OR
t_codes_postaux_rh.texte_court IS DISTINCT FROM t_codes_postaux.texte_court OR
t_codes_postaux_rh.longitude IS DISTINCT FROM t_codes_postaux.longitude OR
t_codes_postaux_rh.latitude IS DISTINCT FROM t_codes_postaux.latitude OR
t_codes_postaux_rh.departement_id IS DISTINCT FROM t_codes_postaux.departement_id OR
t_codes_postaux_rh.departement_code IS DISTINCT FROM t_codes_postaux.departement_code OR
t_codes_postaux_rh.departement_texte IS DISTINCT FROM t_codes_postaux.departement_texte
)
;
-- Màj des Depts.
INSERT INTO rh.t_departements(oid, code, texte, texte_court)
SELECT
t_departements.oid,
t_departements.code,
t_departements.texte,
t_departements.texte_court
FROM base.t_departements
LEFT JOIN rh.t_departements t_departements_rh ON t_departements_rh.oid = t_departements.oid
WHERE t_departements_rh.oid IS NULL
;
UPDATE rh.t_departements t_departements_rh
SET
code = t_departements.code,
texte = t_departements.texte,
texte_court = t_departements.texte_court
FROM base.t_departements
WHERE
t_departements_rh.oid = t_departements.oid
AND (
t_departements_rh.code IS DISTINCT FROM t_departements.code OR
t_departements_rh.texte IS DISTINCT FROM t_departements.texte OR
t_departements_rh.texte_court IS DISTINCT FROM t_departements.texte_court
)
;
-- Màj des Entreprises
INSERT INTO rh.t_entreprises(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_entreprises)
;
INSERT INTO rh.t_entreprises(code, texte, texte_court, code_original)
SELECT et_code, et_intitule, substr(et_intitule,1,50), et_code
FROM prod_sage100.f_eta
WHERE et_code NOT IN (SELECT code_original FROM rh.t_entreprises)
GROUP BY 1,2,3,4
;
-- Màj des Etablissements
INSERT INTO rh.t_etablissements(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_etablissements)
;
INSERT INTO rh.t_etablissements(code, texte, texte_court, code_original, entreprise_id)
SELECT et_code, et_intitule, substr(et_intitule,1,50), et_code, t_entreprises.oid
FROM prod_sage100.f_eta
JOIN rh.t_entreprises ON t_entreprises.code_original = et_code
WHERE et_code 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(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_categories_socio_professionnelle)
;
INSERT INTO rh.t_categories_socio_professionnelle(code, texte, texte_court, code_original)
SELECT ta_codeemploiinsee, max(ta_intitule), max(substr(ta_intitule,1,50)), ta_codeemploiinsee
FROM prod_sage100.f_tab
WHERE 1=1
AND ta_typetable = 14
AND ta_codeemploiinsee NOT IN (SELECT code_original FROM rh.t_categories_socio_professionnelle)
GROUP BY 1,4
;
-- Màj des groupes cotisants.
INSERT INTO rh.t_groupes_cotisant(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_groupes_cotisant)
;
INSERT INTO rh.t_groupes_cotisant(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 = 27
AND ta_code NOT IN (SELECT code_original FROM rh.t_groupes_cotisant)
GROUP BY 1,2,3,4
;
-- Màj des motifs de début de contrat
INSERT INTO rh.t_motifs_debut_contrat(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_debut_contrat)
;
INSERT INTO rh.t_motifs_debut_contrat(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 = 2
AND ta_code 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(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_fin_contrat)
;
INSERT INTO rh.t_motifs_fin_contrat(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 = 1 -- ou 26 ?
AND ta_code 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(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_nationalites)
;
INSERT INTO rh.t_nationalites(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 = 4
AND ta_code 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(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_organismes_cotisation)
;
INSERT INTO rh.t_organismes_cotisation(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 = 20
AND ta_code 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(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_qualifications)
;
INSERT INTO rh.t_qualifications(code, texte, texte_court, code_original)
SELECT or_code, max(or_intitule), max(substr(or_intitule,1,50)), or_code
FROM prod_sage100.f_org
WHERE 1=1
AND or_type = 3
AND or_code NOT IN (SELECT code_original FROM rh.t_qualifications)
GROUP BY 1,4
;
-- Màj des rubriques
INSERT INTO rh.t_rubriques(oid, code_original, code, texte, texte_court, rang_edition)
SELECT 0, '', chr(1) || '*', 'Non renseignée', 'N/R', 0
WHERE 0 NOT IN (SELECT oid FROM rh.t_rubriques)
;
INSERT INTO rh.t_rubriques(code, texte, texte_court, code_original, rang_edition)
SELECT lpad(ru_rubrique, 4, '0'), ru_intitule, substr(ru_intitule,1,50), ru_rubrique, ru_nodordre::numeric
FROM prod_sage100.f_rub
WHERE ru_rubrique NOT IN (SELECT code_original FROM rh.t_rubriques)
GROUP BY 1,2,3,4,5
;
-- (création des rubriques CTI de cumul)
INSERT INTO rh.t_rubriques(code, texte, texte_court, code_original, rang_edition)
SELECT 'C000', 'Ecart cumulé', 'Ecart cumulé', 'C000', -1
WHERE 'C000' NOT IN (SELECT code_original FROM rh.t_rubriques)
;
INSERT INTO rh.t_rubriques(code, texte, texte_court, code_original, rang_edition)
SELECT 'C086', 'Heures payées', 'Heures payées', 'C086', -1
WHERE 'C086' NOT IN (SELECT code_original FROM rh.t_rubriques)
;
INSERT INTO rh.t_rubriques(code, texte, texte_court, code_original, rang_edition)
SELECT 'C003', 'Net à payer', 'Net à payer', 'C003', -1
WHERE 'C003' NOT IN (SELECT code_original FROM rh.t_rubriques)
;
INSERT INTO rh.t_rubriques(code, texte, texte_court, code_original, rang_edition)
SELECT 'C004', 'Net imposable', 'Net imposable', 'C004', -1
WHERE 'C004' NOT IN (SELECT code_original FROM rh.t_rubriques)
;
-- Màj des situations de famille
INSERT INTO rh.t_situations_famille(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_situations_famille)
;
INSERT INTO rh.t_situations_famille(code, texte, texte_court, code_original)
SELECT af_situationfamiliale, af_situationfamiliale, substr(af_situationfamiliale,1,50), af_situationfamiliale
FROM prod_sage100.f_hst_famille
WHERE 1=1
AND af_situationfamiliale NOT IN (SELECT code_original FROM rh.t_situations_famille)
AND af_situationfamiliale IS NOT NULL
GROUP BY 1,2,3,4
;
-- Màj des types de contrat
INSERT INTO rh.t_types_contrat(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_types_contrat)
;
INSERT INTO rh.t_types_contrat(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 = 2
AND ta_code 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(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_statuts)
;
INSERT INTO rh.t_statuts(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 = 19
AND ta_code 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(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_types_temps_travail)
;
INSERT INTO rh.t_types_temps_travail(code_original, code, texte, texte_court)
SELECT ta_code, ta_intitule, substr(ta_intitule,1,50), ta_code
FROM prod_sage100.f_tab
WHERE 1=1
AND ta_typetable = 18 -- ou 7 ?
AND ta_code NOT IN (SELECT code_original FROM rh.t_types_temps_travail)
GROUP BY 1,2,3,4
;
-- Màj des services
INSERT INTO rh.t_services(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_services)
;
INSERT INTO rh.t_services(code, texte, texte_court, code_original)
SELECT or_code, max(or_intitule), max(substr(or_intitule,1,50)), or_code
FROM prod_sage100.f_org
WHERE 1=1
AND or_type = 1
AND or_code NOT IN (SELECT code_original FROM rh.t_services)
GROUP BY 1,4
;
-- Màj des spécialités
INSERT INTO rh.t_specialites(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_specialites)
;
INSERT INTO rh.t_specialites(code_original, code, texte, texte_court)
SELECT or_code, or_code, max(or_intitule), max(substr(or_intitule,1,50))
FROM prod_sage100.f_org
WHERE 1=1
AND or_type = 0
AND or_code NOT IN (SELECT code_original FROM rh.t_specialites)
GROUP BY 1,2
;
-- Màj des codes emploi
INSERT INTO rh.t_codes_emploi(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_codes_emploi)
;
INSERT INTO rh.t_codes_emploi(code, texte, texte_court, code_original)
SELECT or_code, max(or_intitule), max(substr(or_intitule,1,50)), or_code
FROM prod_sage100.f_org
WHERE 1=1
AND or_type = 2
AND or_code NOT IN (SELECT code_original FROM rh.t_codes_emploi)
GROUP BY 1,4
;
-- Màj des types d'horaire -- aucun jeu de données
INSERT INTO rh.t_types_horaire(oid, code_original, code, texte, texte_court)
SELECT 0, '', chr(1) || '*', 'Non renseigné', 'N/R'
WHERE 0 NOT IN (SELECT oid FROM rh.t_types_horaire)
;
-- Màj des sociétés d'interim -- aucun jeu de données
INSERT INTO rh.t_societes_interim(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_societes_interim)
;
-- @TODO: Màj des grilles
INSERT INTO rh.t_grilles(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_grilles)
;
/* INSERT INTO rh.t_grilles(code_original, code, texte, texte_court)
SELECT
lpad(c_group,2,'0')||lpad(qualif,4,'0'),
lpad(c_group,2,'0')||lpad(qualif,4,'0'),
lib_group||CASE WHEN qualif <> '' 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
;
]]></sqlcmd>
</NODE>
</NODE>
<NODE name="PROD" label="RECUPERATION DES DONNEES DE PRODUCTION">
<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
0,--t_entreprises.oid,
0,--t_etablissements.oid,
to_char(f_hcum.hu_date::date,'YYYYMM')::numeric,
count(DISTINCT sa_matricule),
sum(CASE WHEN hu_constante = 8 THEN hu_valeurcumul::numeric ELSE 0 END),
sum(CASE WHEN hu_constante = 86 THEN hu_valeurcumul::numeric ELSE 0 END)
FROM prod_sage100.f_hcum
--JOIN rh.t_entreprises ON t_entreprises.code_original = stat_paie.ste
--JOIN rh.t_etablissements ON t_etablissements.code_original = stat_paie.etb
WHERE 1=1
AND date_part('year', f_hcum.hu_date::date) >= 2008
AND date_part('year', f_hcum.hu_date::date) <= 2020
GROUP BY 1,2,3
;
]]></sqlcmd>
</NODE>
<NODE label="Pré-traitements">
<sqlcmd><![CDATA[
-- Création d'une table temporaire des affectations
DROP TABLE IF EXISTS w_aff
;
CREATE TEMP TABLE w_aff AS
SELECT
sa_matricule AS matricule,
et_etablissement AS eta_code,
ha_debutpaiement::date AS date_debut,
ha_finpaiement::date AS date_fin,
or_departement AS departement,
or_service AS service,
or_unite AS unite,
or_categorie AS categorie
FROM prod_sage100.f_haff
WHERE 1=1
AND ha_debutpaiement IS NOT NULL
AND ha_finpaiement IS NOT NULL
;
DELETE FROM w_aff
WHERE date_debut > 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
;*/
]]></sqlcmd>
</NODE>
<NODE label="Profils">
<sqlcmd><![CDATA[
-- Création d'une table temp de profils
DROP TABLE IF EXISTS w_profils
;
CREATE TEMP TABLE w_profils AS
SELECT
-- Identifiant CTI du profil CTI
0 AS profil_id,
-- Cléfs naturelles permettant le matching du profil CTI au données Sage
0 AS last_profil,
w_aff.eta_code AS eta_code,
w_cnt.matricule AS matricule,
w_cnt.matricule AS numero_salarie,
w_cnt.numero_contrat AS numero_contrat,
w_cnt.date_debut AS cnt_date_debut,
w_cnt.date_fin AS cnt_date_fin,
w_aff.date_debut AS aff_date_debut,
w_aff.date_fin AS aff_date_fin,
--w_ets.date_debut AS ets_date_debut,
--w_ets.date_fin AS ets_date_fin,
-- Données du Profil CTI
greatest(w_aff.categorie, chr(1)||'*') AS categorie_socio_professionnelle_code_original,
greatest(w_aff.unite, chr(1)||'*') AS code_emploi_code_original,
chr(1)||'*' AS grille_code_original,
chr(1)||'*' AS grille_groupe_code_original,
chr(1)||'*' AS groupe_cotisant_code_original,
chr(1)||'*' AS motif_debut_code_original,
chr(1)||'*' AS motif_fin_code_original,
greatest(w_aff.categorie, chr(1)||'*') AS qualification_code_original,
chr(1)||'*' AS section_analytique_code_original,
chr(1)||'*' AS section_analytique_paie_code_original,
greatest(w_aff.service, chr(1)||'*') AS service_code_original,
chr(1)||'*' AS societe_interim_code_original,
greatest(w_aff.departement, chr(1)||'*') AS specialite_code_original,
chr(1)||'*' AS statut_code_original,
greatest(w_cnt.type_contrat, chr(1)||'*') AS type_contrat_code_original,
chr(1)||'*' AS type_horaire_code_original,
chr(1)||'*' AS type_temps_travail_code_original
FROM w_cnt
LEFT JOIN w_aff ON 1=1
AND w_aff.matricule = w_cnt.matricule
AND base.cti_overlaps(w_cnt.date_debut,w_cnt.date_fin,w_aff.date_debut,w_aff.date_fin)
/*LEFT JOIN w_ets ON 1=1
AND w_ets.matricule = w_aff.matricule
AND base.cti_overlaps(w_ets.date_debut,w_ets.date_fin,w_aff.date_debut,w_aff.date_fin)
AND base.cti_overlaps(w_ets.date_debut,w_ets.date_fin,w_cnt.date_debut,w_cnt.date_fin)*/
WHERE 1=1
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
;
-- Alimentation de la table CTI des profils
INSERT INTO rh.p_profils
(
categorie_socio_professionnelle_code_original,
code_emploi_code_original,
grille_code_original,
grille_groupe_code_original,
groupe_cotisant_code_original,
motif_debut_code_original,
motif_fin_code_original,
qualification_code_original,
section_analytique_code_original,
section_analytique_paie_code_original,
service_code_original,
societe_interim_code_original,
specialite_code_original,
statut_code_original,
type_contrat_code_original,
type_horaire_code_original,
type_temps_travail_code_original
)
SELECT
w_profils.categorie_socio_professionnelle_code_original,
w_profils.code_emploi_code_original,
w_profils.grille_code_original,
w_profils.grille_groupe_code_original,
w_profils.groupe_cotisant_code_original,
w_profils.motif_debut_code_original,
w_profils.motif_fin_code_original,
w_profils.qualification_code_original,
w_profils.section_analytique_code_original,
w_profils.section_analytique_paie_code_original,
w_profils.service_code_original,
w_profils.societe_interim_code_original,
w_profils.specialite_code_original,
w_profils.statut_code_original,
w_profils.type_contrat_code_original,
w_profils.type_horaire_code_original,
w_profils.type_temps_travail_code_original
FROM w_profils
LEFT JOIN rh.p_profils ON 1=1
AND p_profils.type_contrat_code_original = w_profils.type_contrat_code_original
AND p_profils.type_horaire_code_original = w_profils.type_horaire_code_original
AND p_profils.motif_debut_code_original = w_profils.motif_debut_code_original
AND p_profils.motif_fin_code_original = w_profils.motif_fin_code_original
AND p_profils.qualification_code_original = w_profils.qualification_code_original
AND p_profils.service_code_original = w_profils.service_code_original
AND p_profils.specialite_code_original = w_profils.specialite_code_original
AND p_profils.type_temps_travail_code_original = w_profils.type_temps_travail_code_original
AND p_profils.categorie_socio_professionnelle_code_original = w_profils.categorie_socio_professionnelle_code_original
AND p_profils.statut_code_original = w_profils.statut_code_original
AND p_profils.code_emploi_code_original = w_profils.code_emploi_code_original
AND p_profils.societe_interim_code_original = w_profils.societe_interim_code_original
AND p_profils.section_analytique_paie_code_original = w_profils.section_analytique_paie_code_original
AND p_profils.section_analytique_code_original = w_profils.section_analytique_code_original
AND p_profils.grille_code_original = w_profils.grille_code_original
AND p_profils.grille_groupe_code_original = w_profils.grille_groupe_code_original
AND p_profils.groupe_cotisant_code_original = w_profils.groupe_cotisant_code_original
WHERE p_profils.type_contrat_code_original IS NULL
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
;
-- màj les oids et textes des profils
SELECT rh.cti_reorganize_profils()
;
-- maj des profil_id dans la table temporaire
UPDATE w_profils
SET profil_id = p_profils.oid
FROM rh.p_profils
WHERE 1=1
AND p_profils.type_contrat_code_original = w_profils.type_contrat_code_original
AND p_profils.type_horaire_code_original = w_profils.type_horaire_code_original
AND p_profils.motif_debut_code_original = w_profils.motif_debut_code_original
AND p_profils.motif_fin_code_original = w_profils.motif_fin_code_original
AND p_profils.qualification_code_original = w_profils.qualification_code_original
AND p_profils.service_code_original = w_profils.service_code_original
AND p_profils.specialite_code_original = w_profils.specialite_code_original
AND p_profils.type_temps_travail_code_original = w_profils.type_temps_travail_code_original
AND p_profils.categorie_socio_professionnelle_code_original = w_profils.categorie_socio_professionnelle_code_original
AND p_profils.statut_code_original = w_profils.statut_code_original
AND p_profils.code_emploi_code_original = w_profils.code_emploi_code_original
AND p_profils.societe_interim_code_original = w_profils.societe_interim_code_original
AND p_profils.section_analytique_paie_code_original = w_profils.section_analytique_paie_code_original
AND p_profils.section_analytique_code_original = w_profils.section_analytique_code_original
AND p_profils.grille_code_original = w_profils.grille_code_original
AND p_profils.grille_groupe_code_original = w_profils.grille_groupe_code_original
AND p_profils.groupe_cotisant_code_original = w_profils.groupe_cotisant_code_original
;
-- Marquage du profil le + récent pour chaque salarié tout établissement confondu
UPDATE w_profils
SET last_profil = 1
FROM
(
SELECT
matricule,
max(aff_date_fin) AS aff_date_fin
FROM w_profils
GROUP BY 1
) AS subq
WHERE 1=1
AND w_profils.matricule = subq.matricule
AND w_profils.aff_date_fin = subq.aff_date_fin
;
]]></sqlcmd>
</NODE>
<NODE label="Salariés">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_salarie
;
CREATE TEMP TABLE w_salarie AS
SELECT
'[FINESS]' AS finess,
fp_identite_nom AS nom,
fp_identite_prenom AS prenom,
fp_naissance_date::date AS date_naissance,
CASE WHEN fp_identite_civilite = 0
THEN 'M'
ELSE 'F'
END AS sexe,
sa_matricule AS matricule,
sa_matricule 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,
fp_identite_nomjeunefille AS nom_naissance,
coalesce(t_situations_famille.oid,0) AS situation_famille_id,
coalesce(profil_id,0) AS profil_id,
min(cnt_date_debut)::date AS date_debut,
max(coalesce(cnt_date_fin, '20991231'))::date AS date_fin
FROM prod_sage100.f_renssal
JOIN w_profils ON w_profils.numero_salarie = sa_matricule
LEFT JOIN rh.t_situations_famille ON t_situations_famille.code_original = fp_famille_situation
LEFT JOIN rh.t_entreprises ON t_entreprises.code_original = fp_etab_code
LEFT JOIN rh.t_codes_postaux ON t_codes_postaux.code = fp_adr_codepostal
LEFT JOIN rh.t_nationalites ON t_nationalites.code_original = fp_nation
WHERE 1=1
AND last_profil = 1
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
;
-- Ajout des nouveaux salariés
INSERT INTO rh.p_salaries(
finess,
nom,
prenom,
date_naissance,
sexe,
matricule,
code_original,
entreprise_id,
nationalite_id,
code_postal_id,
nom_naissance,
situation_famille_id,
profil_id,
date_debut,
date_fin
)
SELECT *
FROM w_salarie
WHERE w_salarie.matricule NOT IN (SELECT matricule FROM rh.p_salaries)
;
-- Màj des salariés déjà présents
UPDATE rh.p_salaries
SET
finess = w_salarie.finess,
nom = w_salarie.nom,
prenom = w_salarie.prenom,
date_naissance = w_salarie.date_naissance,
sexe = w_salarie.sexe,
entreprise_id = w_salarie.entreprise_id,
nationalite_id = w_salarie.nationalite_id,
code_postal_id = w_salarie.code_postal_id,
nom_naissance = w_salarie.nom_naissance,
situation_famille_id = w_salarie.situation_famille_id,
profil_id = w_salarie.profil_id,
date_debut = w_salarie.date_debut,
date_fin = w_salarie.date_fin
FROM w_salarie
WHERE 1=1
AND p_salaries.matricule = w_salarie.matricule
AND (1!=1
OR p_salaries.finess IS DISTINCT FROM w_salarie.finess
OR p_salaries.nom IS DISTINCT FROM w_salarie.nom
OR p_salaries.prenom IS DISTINCT FROM w_salarie.prenom
OR p_salaries.date_naissance IS DISTINCT FROM w_salarie.date_naissance
OR p_salaries.sexe IS DISTINCT FROM w_salarie.sexe
OR p_salaries.entreprise_id IS DISTINCT FROM w_salarie.entreprise_id
OR p_salaries.nationalite_id IS DISTINCT FROM w_salarie.nationalite_id
OR p_salaries.code_postal_id IS DISTINCT FROM w_salarie.code_postal_id
OR p_salaries.nom_naissance IS DISTINCT FROM w_salarie.nom_naissance
OR p_salaries.situation_famille_id IS DISTINCT FROM w_salarie.situation_famille_id
OR p_salaries.profil_id IS DISTINCT FROM w_salarie.profil_id
OR p_salaries.date_debut IS DISTINCT FROM w_salarie.date_debut
OR p_salaries.date_fin IS DISTINCT FROM w_salarie.date_fin
)
;
]]></sqlcmd>
</NODE>
<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.cnt_date_debut AS date_debut,
w_profils.cnt_date_fin AS date_fin,
w_profils.numero_contrat AS numero_contrat,
w_profils.numero_contrat AS code_original,
(max(ARRAY[EXTRACT(EPOCH FROM cnt_date_fin),coalesce(t_etablissements.oid,0)]))[2] AS etablissement_id,
(max(ARRAY[EXTRACT(EPOCH FROM cnt_date_fin),w_profils.profil_id]))[2] AS profil_id
FROM w_profils
JOIN rh.p_salaries ON p_salaries.matricule = w_profils.matricule
LEFT JOIN rh.t_etablissements ON t_etablissements.code_original = w_profils.eta_code
GROUP BY 1,2,3,4,5
;
TRUNCATE rh.p_contrats_mois
;
ALTER SEQUENCE rh.s_contrats_mois RESTART WITH 1
;
INSERT INTO rh.p_contrats_mois(
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,
salarie_id
)
SELECT
p_contrats.oid AS contrat_id,
p_calendrier_mois.mois AS mois,
GREATEST(p_calendrier_mois.date_debut, p_contrats.date_debut) AS date_debut,
LEAST(p_calendrier_mois.date_fin, p_contrats.date_fin) AS date_fin,
min(w_profils.profil_id) AS profil_id,
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,
0, --w_profils.nbh_mens / 151.67 AS equivalent_temps_plein,
base.cti_age(LEAST(p_calendrier_mois.date_fin, p_contrats.date_fin), COALESCE(p_salaries.date_naissance, '1962-04-18'::date), 'ny') AS age_id,
LEAST(p_calendrier_mois.date_fin, p_contrats.date_fin)::date - COALESCE(p_salaries.date_naissance, '1962-04-18'::date) AS age_jours,
'0' AS est_hors_periode,
CASE WHEN p_contrats.date_fin >= 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
;
]]></sqlcmd>
</NODE>
<NODE label="Historique de la paie">
<sqlcmd><![CDATA[
DROP TABLE IF EXISTS w_hp
;
-- INFOS :
-- La rubrique 440 "Prime Interessement" n'est pas comptée dans le brut => 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
;
*/
]]></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
p_contrats_mois.profil_id AS 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
GROUP BY 1,2,3,4,5
;
]]></sqlcmd>
</NODE>
<NODE label="Arrêts de travail">
<sqlcmd><![CDATA[
-- SELECT * FROM w_arr
DROP TABLE IF EXISTS w_arr
;
CREATE TEMP TABLE w_arr AS
(
SELECT
sa_matricule AS matricule,
ap_arret_01type AS motif,
to_char(ap_arret_01debut::date,'YYYYMM')::numeric AS mois,
ap_arret_01debut::date AS date_debut,
ap_arret_01fin::date AS date_fin,
ap_arret_01fin::date - ap_arret_01debut::date + 1 AS nb_jours,
'' AS no_contrat
FROM prod_sage100.f_hst_arret
WHERE 1=1
AND ap_arret_01debut IS NOT NULL
AND ap_arret_01fin IS NOT NULL
AND ap_arret_01fin::date - ap_arret_01debut::date + 1 > 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
;
]]></sqlcmd>
</NODE>
<NODE label="Visites Médicales">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
<NODE label="Accidents du travail">
<sqlcmd><![CDATA[
]]></sqlcmd>
</NODE>
<NODE label="Formations">
<sqlcmd><![CDATA[
-- Pré-traitement
DROP TABLE IF EXISTS w_for
;
CREATE temp TABLE w_for AS
SELECT
f_participant.sa_matricule AS matricule,
'' AS no_contrat,
f_formation.fo_code AS code,
fds_datefin::date AS date_debut,
fds_datefin::date AS date_fin,
to_char(fds_datefin::date,'YYYYMM')::numeric AS mois_activite,
fds_nbheures::numeric AS nb_heures,
f_orgfor.of_nom AS organisateur
FROM prod_sage100.f_formdatessessions
JOIN prod_sage100.f_formation ON f_formation.fo_code = f_formdatessessions.fo_code
JOIN prod_sage100.f_participant ON f_participant.fo_formation = f_formdatessessions.fo_code
JOIN prod_sage100.f_orgfor ON f_orgfor.of_organisme = f_formation.of_organisme
WHERE 1=1
AND date_part('year', fds_datefin::date) >= '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
;
]]></sqlcmd>
</NODE>
<NODE label="Handicap">
<sqlcmd><![CDATA[
]]></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>