return: text lang: plpgsql src: | DECLARE result TEXT; BEGIN INSERT INTO rh.t_divers (code, texte, valeur, description) SELECT 'ODETP_SALARIE', 'OD ETP. Liste des salaries', ''::text, 'Format MATRICULE:HEURES|MATRICULE:HEURES|MATRICULE:HEURES' WHERE 'ODETP_SALARIE' NOT IN (SELECT code FROM rh.t_divers); INSERT INTO rh.t_divers (code, texte, valeur, description) SELECT 'ODETP_RUBRIQUE_BRUT', 'OD ETP. Rubrique identifiant la presence', ''::text, 'Code de la rubrique' WHERE 'ODETP_RUBRIQUE_BRUT' NOT IN (SELECT code FROM rh.t_divers); INSERT INTO rh.t_divers (code, texte, valeur, description) SELECT 'ODETP_RUBRIQUE_HEURE', 'OD ETP. Rubrique d''heure pour generation OD', ''::text, 'Code de la rubrique' WHERE 'ODETP_RUBRIQUE_HEURE' NOT IN (SELECT code FROM rh.t_divers); DROP TABLE IF EXISTS w_divers_odetp; CREATE TEMP TABLE w_divers_odetp AS SELECT p_salaries.oid AS odetp_salarie_id, CASE WHEN ((string_to_array((string_to_array(replace(t_divers_odetp_salaries.valeur,',','.'),'|'))[i],':'))[2])::text <> '*' THEN base.cti_to_number((string_to_array((string_to_array(replace(t_divers_odetp_salaries.valeur,',','.'),'|'))[i],':'))[2]::text) ELSE -1 END AS odetp_nb_heures, t_rubriques_brut.oid AS odetp_rubrique_brut_id, t_rubriques_heure.oid AS odetp_rubrique_heure_id FROM rh.p_salaries JOIN rh.t_divers t_divers_odetp_salaries ON t_divers_odetp_salaries.code = 'ODETP_SALARIE' JOIN generate_series(1,100) i ON (string_to_array(t_divers_odetp_salaries.valeur,'|'))[i] <> '' JOIN rh.t_divers t_divers_odetp_rubrique_brut ON t_divers_odetp_rubrique_brut.code = 'ODETP_RUBRIQUE_BRUT' JOIN rh.t_divers t_divers_odetp_rubrique_heure ON t_divers_odetp_rubrique_heure.code = 'ODETP_RUBRIQUE_HEURE' JOIN rh.t_rubriques t_rubriques_brut ON t_divers_odetp_rubrique_brut.valeur = t_rubriques_brut.code JOIN rh.t_rubriques t_rubriques_heure ON t_divers_odetp_rubrique_heure.valeur = t_rubriques_heure.code WHERE matricule = (string_to_array((string_to_array(t_divers_odetp_salaries.valeur,'|'))[i],':'))[1] ; DROP TABLE IF EXISTS w_odetp_mois; CREATE TEMP TABLE w_odetp_mois AS SELECT p_historique_paie.salarie_id, p_historique_paie.contrat_mois_id, mois_paie, CASE WHEN MAX(odetp_nb_heures) >= 0 THEN MAX(odetp_nb_heures) ELSE 0 END AS odetp_heure_contrat, CASE WHEN MAX(odetp_nb_heures) >= 0 THEN MAX(odetp_nb_heures) ELSE SUM(heure_contrat) END AS odetp_heure_payee, MAX(odetp_rubrique_brut_id) AS odetp_rubrique_brut_id, MAX(odetp_rubrique_heure_id) AS odetp_rubrique_heure_id FROM rh.p_historique_paie JOIN w_divers_odetp ON salarie_id = odetp_salarie_id WHERE rubrique_id = odetp_rubrique_brut_id OR rubrique_id = odetp_rubrique_heure_id OR heure_contrat <> 0 AND odetp_nb_heures = -1 GROUP BY 1,2,3 HAVING MAX(CASE WHEN rubrique_id = odetp_rubrique_heure_id THEN rubrique_id ELSE 0 END) = 0 AND MAX(CASE WHEN rubrique_id = odetp_rubrique_brut_id THEN rubrique_id ELSE 0 END) <> 0 ; DROP TABLE IF EXISTS w_odetp_historique; CREATE TEMP TABLE w_odetp_historique AS SELECT p_historique_paie.* FROM rh.p_historique_paie JOIN w_odetp_mois ON p_historique_paie.salarie_id = w_odetp_mois.salarie_id AND p_historique_paie.mois_paie = w_odetp_mois.mois_paie AND p_historique_paie.contrat_mois_id = w_odetp_mois.contrat_mois_id AND p_historique_paie.rubrique_id = odetp_rubrique_brut_id; UPDATE w_odetp_historique SET rubrique_id = odetp_rubrique_heure_id, base = odetp_heure_payee, heure_payee = odetp_heure_payee, heure_travaillee = odetp_heure_payee, heure_contrat = odetp_heure_contrat, montant_brut = 0, taux_cotisation_salarie = 0, montant_cotisation_salarie = 0, taux_cotisation_patronale = 0, montant_cotisation_patronale = 0, montant_net_imposable_salarie = 0, montant_net_a_payer_salarie = 0, montant_avantage_nature = 0, montant_frais_imposables = 0, montant_masse_salariale = 0, montant_od_net_salarie = 0 FROM w_odetp_mois WHERE w_odetp_mois.salarie_id = w_odetp_historique.salarie_id AND w_odetp_mois.contrat_mois_id = w_odetp_historique.contrat_mois_id AND w_odetp_mois.mois_paie = w_odetp_historique.mois_paie ; INSERT INTO rh.p_historique_paie SELECT * FROM w_odetp_historique; UPDATE rh.p_chiffrier_production SET nombre_heures_od = 0 WHERE nombre_heures_od IS NULL; UPDATE rh.p_chiffrier_production SET nombre_heures_od = p_chiffrier_production.nombre_heures_od + subview.nombre_heures_od FROM ( SELECT t_etablissements.entreprise_id, p_contrats.etablissement_id, mois_paie, SUM(base) AS nombre_heures_od FROM w_odetp_historique JOIN rh.p_contrats ON contrat_id = p_contrats.oid JOIN rh.t_etablissements ON p_contrats.etablissement_id = t_etablissements.oid GROUP BY 1,2,3 ) subview WHERE p_chiffrier_production.entreprise_id = subview.entreprise_id AND p_chiffrier_production.etablissement_id = subview.etablissement_id AND p_chiffrier_production.mois = subview.mois_paie; RETURN 'OK'; END;