<?xml version="1.0" encoding="ISO-8859-1"?>
<ROOT>
	<NODE name="COPIE" label="REPLICATIONS">
        <!--
            Noeud XML appelé avant de faire l'import RH-Paie de chaque prestataire.
            Permet de :
                - synchroniser le schéma SQL dédié au PRESTATAIRE (rh_prestataire) avec le schéma SQL GLOBAL (rh) potentiellement mis à jour,
                - remonter dans PRESTATAIRE le paramétrage effectué dans GLOBAL pour que l'import PRESTATAIRE se passe bien.
        -->
		<NODE label="Réplication du schéma rh">
			<sqlcmd><![CDATA[
			
			-- rh_ori correspond en temps normal au schéma rh.
			-- le schéma rh_prestataire a été renommé rh.
			SELECT base.cti_synchronize_schema('rh_ori', 'rh');

			]]></sqlcmd>
		</NODE>
		<NODE label="Réplication du paramétrage">
			<sqlcmd><![CDATA[

            -- Réplication du paramétrage t_divers.
            TRUNCATE rh.t_divers
            ;

            INSERT INTO rh.t_divers(code, texte, valeur, description, valeur_date)
                SELECT code, texte, valeur, description, valeur_date
                FROM rh_ori.t_divers
            ;
			
			-- On réplique le paramétrage des rubriques dans le schéma du prestataire.
			UPDATE rh.t_rubriques
			SET
				c_avantage_nature = rub_ori.c_avantage_nature,
                c_base = rub_ori.c_base,
                c_brut = rub_ori.c_brut,
                c_cotisation_patronale = rub_ori.c_cotisation_patronale,
                c_cotisation_salarie = rub_ori.c_cotisation_salarie,
                c_frais_imposables = rub_ori.c_frais_imposables,
                c_heures_contrat = rub_ori.c_heures_contrat,
                c_heures_payees = rub_ori.c_heures_payees,
                c_heures_travaillees = rub_ori.c_heures_travaillees,
                c_masse_salariale = rub_ori.c_masse_salariale,
                c_masse_salariale_provisionnee = rub_ori.c_masse_salariale_provisionnee,
                c_montant_provisions = rub_ori.c_montant_provisions,
                c_net_a_payer = rub_ori.c_net_a_payer,
                c_net_imposable = rub_ori.c_net_imposable,
                c_nombre = rub_ori.c_nombre,
                c_nombre_provisions = rub_ori.c_nombre_provisions,
                c_od_net_patronale = rub_ori.c_od_net_patronale,
                c_od_net_salarie = rub_ori.c_od_net_salarie,
                code_calcul = rub_ori.code_calcul,
                coefficient = rub_ori.coefficient,
                coefficient_base = rub_ori.coefficient_base,
                coefficient_nombre = rub_ori.coefficient_nombre,
                coefficient_txp = rub_ori.coefficient_txp,
                coefficient_txs = rub_ori.coefficient_txs,
                heures_payees = rub_ori.heures_payees,
                p_avantage_nature = rub_ori.p_avantage_nature,
                p_base = rub_ori.p_base,
                p_brut = rub_ori.p_brut,
                p_cotisation_patronale = rub_ori.p_cotisation_patronale,
                p_cotisation_salarie = rub_ori.p_cotisation_salarie,
                p_cumul = rub_ori.p_cumul,
                p_detail = rub_ori.p_detail,
                p_frais_imposables = rub_ori.p_frais_imposables,
                p_heures_contrat = rub_ori.p_heures_contrat,
                p_heures_payees = rub_ori.p_heures_payees,
                p_heures_travaillees = rub_ori.p_heures_travaillees,
                p_masse_salariale = rub_ori.p_masse_salariale,
                p_masse_salariale_provisionnee = rub_ori.p_masse_salariale_provisionnee,
                p_montant_provisions = rub_ori.p_montant_provisions,
                p_net_a_payer = rub_ori.p_net_a_payer,
                p_net_imposable = rub_ori.p_net_imposable,
                p_nombre = rub_ori.p_nombre,
                p_nombre_provisions = rub_ori.p_nombre_provisions,
                p_od_net_patronale = rub_ori.p_od_net_patronale,
                p_od_net_salarie = rub_ori.p_od_net_salarie,
                s_avantage_nature = rub_ori.s_avantage_nature,
                s_base = rub_ori.s_base,
                s_brut = rub_ori.s_brut,
                s_cotisation_patronale = rub_ori.s_cotisation_patronale,
                s_cotisation_salarie = rub_ori.s_cotisation_salarie,
                s_frais_imposables = rub_ori.s_frais_imposables,
                s_heures_contrat = rub_ori.s_heures_contrat,
                s_heures_payees = rub_ori.s_heures_payees,
                s_heures_travaillees = rub_ori.s_heures_travaillees,
                s_masse_salariale = rub_ori.s_masse_salariale,
                s_masse_salariale_provisionnee = rub_ori.s_masse_salariale_provisionnee,
                s_montant_provisions = rub_ori.s_montant_provisions,
                s_net_a_payer = rub_ori.s_net_a_payer,
                s_net_imposable = rub_ori.s_net_imposable,
                s_nombre = rub_ori.s_nombre,
                s_nombre_provisions = rub_ori.s_nombre_provisions,
                s_od_net_patronale = rub_ori.s_od_net_patronale,
                s_od_net_salarie = rub_ori.s_od_net_salarie,
                unite = rub_ori.unite,
                user_modified = rub_ori.user_modified,
				texte_court = rub_ori.texte_court,
				texte = rub_ori.texte
			FROM rh_ori.t_rubriques AS rub_ori
			WHERE 1=1
				AND t_rubriques.oid + fp('idx')::bigint = rub_ori.oid
				AND (1!=1
					OR t_rubriques.c_avantage_nature IS DISTINCT FROM rub_ori.c_avantage_nature
                    OR t_rubriques.c_base IS DISTINCT FROM rub_ori.c_base
                    OR t_rubriques.c_brut IS DISTINCT FROM rub_ori.c_brut
                    OR t_rubriques.c_cotisation_patronale IS DISTINCT FROM rub_ori.c_cotisation_patronale
                    OR t_rubriques.c_cotisation_salarie IS DISTINCT FROM rub_ori.c_cotisation_salarie
                    OR t_rubriques.c_frais_imposables IS DISTINCT FROM rub_ori.c_frais_imposables
                    OR t_rubriques.c_heures_contrat IS DISTINCT FROM rub_ori.c_heures_contrat
                    OR t_rubriques.c_heures_payees IS DISTINCT FROM rub_ori.c_heures_payees
                    OR t_rubriques.c_heures_travaillees IS DISTINCT FROM rub_ori.c_heures_travaillees
                    OR t_rubriques.c_masse_salariale IS DISTINCT FROM rub_ori.c_masse_salariale
                    OR t_rubriques.c_masse_salariale_provisionnee IS DISTINCT FROM rub_ori.c_masse_salariale_provisionnee
                    OR t_rubriques.c_montant_provisions IS DISTINCT FROM rub_ori.c_montant_provisions
                    OR t_rubriques.c_net_a_payer IS DISTINCT FROM rub_ori.c_net_a_payer
                    OR t_rubriques.c_net_imposable IS DISTINCT FROM rub_ori.c_net_imposable
                    OR t_rubriques.c_nombre IS DISTINCT FROM rub_ori.c_nombre
                    OR t_rubriques.c_nombre_provisions IS DISTINCT FROM rub_ori.c_nombre_provisions
                    OR t_rubriques.c_od_net_patronale IS DISTINCT FROM rub_ori.c_od_net_patronale
                    OR t_rubriques.c_od_net_salarie IS DISTINCT FROM rub_ori.c_od_net_salarie
                    OR t_rubriques.code_calcul IS DISTINCT FROM rub_ori.code_calcul
                    OR t_rubriques.coefficient IS DISTINCT FROM rub_ori.coefficient
                    OR t_rubriques.coefficient_base IS DISTINCT FROM rub_ori.coefficient_base
                    OR t_rubriques.coefficient_nombre IS DISTINCT FROM rub_ori.coefficient_nombre
                    OR t_rubriques.coefficient_txp IS DISTINCT FROM rub_ori.coefficient_txp
                    OR t_rubriques.coefficient_txs IS DISTINCT FROM rub_ori.coefficient_txs
                    OR t_rubriques.heures_payees IS DISTINCT FROM rub_ori.heures_payees
                    OR t_rubriques.p_avantage_nature IS DISTINCT FROM rub_ori.p_avantage_nature
                    OR t_rubriques.p_base IS DISTINCT FROM rub_ori.p_base
                    OR t_rubriques.p_brut IS DISTINCT FROM rub_ori.p_brut
                    OR t_rubriques.p_cotisation_patronale IS DISTINCT FROM rub_ori.p_cotisation_patronale
                    OR t_rubriques.p_cotisation_salarie IS DISTINCT FROM rub_ori.p_cotisation_salarie
                    OR t_rubriques.p_cumul IS DISTINCT FROM rub_ori.p_cumul
                    OR t_rubriques.p_detail IS DISTINCT FROM rub_ori.p_detail
                    OR t_rubriques.p_frais_imposables IS DISTINCT FROM rub_ori.p_frais_imposables
                    OR t_rubriques.p_heures_contrat IS DISTINCT FROM rub_ori.p_heures_contrat
                    OR t_rubriques.p_heures_payees IS DISTINCT FROM rub_ori.p_heures_payees
                    OR t_rubriques.p_heures_travaillees IS DISTINCT FROM rub_ori.p_heures_travaillees
                    OR t_rubriques.p_masse_salariale IS DISTINCT FROM rub_ori.p_masse_salariale
                    OR t_rubriques.p_masse_salariale_provisionnee IS DISTINCT FROM rub_ori.p_masse_salariale_provisionnee
                    OR t_rubriques.p_montant_provisions IS DISTINCT FROM rub_ori.p_montant_provisions
                    OR t_rubriques.p_net_a_payer IS DISTINCT FROM rub_ori.p_net_a_payer
                    OR t_rubriques.p_net_imposable IS DISTINCT FROM rub_ori.p_net_imposable
                    OR t_rubriques.p_nombre IS DISTINCT FROM rub_ori.p_nombre
                    OR t_rubriques.p_nombre_provisions IS DISTINCT FROM rub_ori.p_nombre_provisions
                    OR t_rubriques.p_od_net_patronale IS DISTINCT FROM rub_ori.p_od_net_patronale
                    OR t_rubriques.p_od_net_salarie IS DISTINCT FROM rub_ori.p_od_net_salarie
                    OR t_rubriques.s_avantage_nature IS DISTINCT FROM rub_ori.s_avantage_nature
                    OR t_rubriques.s_base IS DISTINCT FROM rub_ori.s_base
                    OR t_rubriques.s_brut IS DISTINCT FROM rub_ori.s_brut
                    OR t_rubriques.s_cotisation_patronale IS DISTINCT FROM rub_ori.s_cotisation_patronale
                    OR t_rubriques.s_cotisation_salarie IS DISTINCT FROM rub_ori.s_cotisation_salarie
                    OR t_rubriques.s_frais_imposables IS DISTINCT FROM rub_ori.s_frais_imposables
                    OR t_rubriques.s_heures_contrat IS DISTINCT FROM rub_ori.s_heures_contrat
                    OR t_rubriques.s_heures_payees IS DISTINCT FROM rub_ori.s_heures_payees
                    OR t_rubriques.s_heures_travaillees IS DISTINCT FROM rub_ori.s_heures_travaillees
                    OR t_rubriques.s_masse_salariale IS DISTINCT FROM rub_ori.s_masse_salariale
                    OR t_rubriques.s_masse_salariale_provisionnee IS DISTINCT FROM rub_ori.s_masse_salariale_provisionnee
                    OR t_rubriques.s_montant_provisions IS DISTINCT FROM rub_ori.s_montant_provisions
                    OR t_rubriques.s_net_a_payer IS DISTINCT FROM rub_ori.s_net_a_payer
                    OR t_rubriques.s_net_imposable IS DISTINCT FROM rub_ori.s_net_imposable
                    OR t_rubriques.s_nombre IS DISTINCT FROM rub_ori.s_nombre
                    OR t_rubriques.s_nombre_provisions IS DISTINCT FROM rub_ori.s_nombre_provisions
                    OR t_rubriques.s_od_net_patronale IS DISTINCT FROM rub_ori.s_od_net_patronale
                    OR t_rubriques.s_od_net_salarie IS DISTINCT FROM rub_ori.s_od_net_salarie
                    OR t_rubriques.unite IS DISTINCT FROM rub_ori.unite
                    OR t_rubriques.user_modified IS DISTINCT FROM rub_ori.user_modified
					OR t_rubriques.texte_court IS DISTINCT FROM rub_ori.texte_court
					OR t_rubriques.texte IS DISTINCT FROM rub_ori.texte
				)
            ;

            -- On réplique le paramétrage des entreprises/établissements dans le schéma du prestataire.
            UPDATE rh.t_entreprises SET
                planning_code = ent_ori.planning_code
            FROM rh_ori.t_entreprises AS ent_ori
            WHERE 1=1
                AND t_entreprises.oid + fp('idx')::bigint = ent_ori.oid
                AND t_entreprises.planning_code IS DISTINCT FROM ent_ori.planning_code
            ;

            UPDATE rh.t_etablissements SET
                planning_code = ets_ori.planning_code
            FROM rh_ori.t_etablissements AS ets_ori
            WHERE 1=1
                AND t_etablissements.oid + fp('idx')::bigint = ets_ori.oid
                AND t_etablissements.planning_code IS DISTINCT FROM ets_ori.planning_code
            ;

            -- Réplication de t_listes_tables.
            TRUNCATE rh.t_listes_tables
            ;

            INSERT INTO rh.t_listes_tables(oid, name, texte, select_cmd, code)
                SELECT oid, name, texte, select_cmd, code
                FROM rh_ori.t_listes_tables
            ;

			]]></sqlcmd>
		</NODE>
	</NODE>
	<NODE name="INIT" label="INITIALISATIONS">
		<NODE name="INIT" type="common" />
		<NODE label="Tables de paramètres.">
			<sqlcmd><![CDATA[

			-- rh correspond au schéma habituel rh.
			-- rh_src correspond au schéma du prestataire.

			-- Màj des Entreprises
			DELETE FROM rh.t_entreprises
            WHERE true
                AND oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
                AND oid > 0
            ;
            INSERT INTO rh.t_entreprises(
                oid,
                code_original,
                code,
                texte,
                texte_court,
                planning_code,
				siren)
                SELECT
                    oid + fp('idx')::bigint,
                    fp('idc')||code_original,
                    fp('idc')||code,
                    texte,
                    texte_court,
                    planning_code,
				    siren
                FROM rh_src.t_entreprises
                WHERE oid > 0
            ;

			-- Màj des Etablissements. NE PAS SUPPRIMER car paramétrage associé.
			-- DELETE FROM rh.t_etablissements
            -- WHERE true
            --     AND oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
            --     AND oid > 0
			-- ;
			INSERT INTO rh.t_etablissements(
                oid,
                code_original,
                code,
                texte,
                texte_court,
                entreprise_id,
                base_calcul_etp,
                mode_calcul_etp_paye,
                planning_code,
				siret)
				SELECT
                    oid + fp('idx')::bigint,
                    fp('idc')||code_original,
                    fp('idc')||code,
                    texte,
                    texte_court,
                    entreprise_id + fp('idx')::bigint,
                    base_calcul_etp,
                    mode_calcul_etp_paye,
                    planning_code,
				    siret
				FROM rh_src.t_etablissements
				WHERE true
                    and oid > 0
                    and oid + fp('idx')::bigint not in (select oid from rh.t_etablissements group by 1)
			;

            -- Màj du siret.
			UPDATE rh.t_etablissements SET 
				siret = src.siret
			FROM rh_src.t_etablissements as src
			WHERE 1=1
                and t_etablissements.oid = src.oid + fp('idx')::bigint
                and t_etablissements.siret is distinct from src.siret
			;

			-- Màj des catégories socio-professionnelles (fusion des codes).
			INSERT INTO rh.t_categories_socio_professionnelle (code_original, code, texte, texte_court)
				SELECT src_csp.code_original, src_csp.code, src_csp.texte, src_csp.texte_court
				FROM rh_src.t_categories_socio_professionnelle AS src_csp
					LEFT JOIN rh.t_categories_socio_professionnelle ON t_categories_socio_professionnelle.code_original = src_csp.code_original
				WHERE 1=1
					AND t_categories_socio_professionnelle.oid IS NULL
					AND src_csp.oid > 0
			;

			-- Màj des groupes cotisants.
			SELECT syncTable3('t_groupes_cotisant')
			;

			-- Màj Motifs début
			SELECT syncTable3('t_motifs_debut_contrat')
			;

			-- Màj des motifs de fin de contrat
			SELECT syncTable3('t_motifs_fin_contrat')
			;

			-- Màj des nationalités
			SELECT syncTable3('t_nationalites')
			;

			-- Màj des organismes de cotisation
			SELECT syncTable3('t_organismes_cotisation')
			;

			-- Màj des qualifications
			SELECT syncTable3('t_qualifications')
			;

			-- Màj des rubriques
			SELECT syncTable3('t_rubriques')
			;

			-- On réplique le paramétrage des rubriques.
            -- FIXME besoin de refaire descendre le paramétrage ?
			UPDATE rh.t_rubriques
			SET
				c_avantage_nature = rub_src.c_avantage_nature,
                c_base = rub_src.c_base,
                c_brut = rub_src.c_brut,
                c_cotisation_patronale = rub_src.c_cotisation_patronale,
                c_cotisation_salarie = rub_src.c_cotisation_salarie,
                c_frais_imposables = rub_src.c_frais_imposables,
                c_heures_contrat = rub_src.c_heures_contrat,
                c_heures_payees = rub_src.c_heures_payees,
                c_heures_travaillees = rub_src.c_heures_travaillees,
                c_masse_salariale = rub_src.c_masse_salariale,
                c_masse_salariale_provisionnee = rub_src.c_masse_salariale_provisionnee,
                c_montant_provisions = rub_src.c_montant_provisions,
                c_net_a_payer = rub_src.c_net_a_payer,
                c_net_imposable = rub_src.c_net_imposable,
                c_nombre = rub_src.c_nombre,
                c_nombre_provisions = rub_src.c_nombre_provisions,
                c_od_net_patronale = rub_src.c_od_net_patronale,
                c_od_net_salarie = rub_src.c_od_net_salarie,
                code_calcul = rub_src.code_calcul,
                coefficient = rub_src.coefficient,
                coefficient_base = rub_src.coefficient_base,
                coefficient_nombre = rub_src.coefficient_nombre,
                coefficient_txp = rub_src.coefficient_txp,
                coefficient_txs = rub_src.coefficient_txs,
                heures_payees = rub_src.heures_payees,
                p_avantage_nature = rub_src.p_avantage_nature,
                p_base = rub_src.p_base,
                p_brut = rub_src.p_brut,
                p_cotisation_patronale = rub_src.p_cotisation_patronale,
                p_cotisation_salarie = rub_src.p_cotisation_salarie,
                p_cumul = rub_src.p_cumul,
                p_detail = rub_src.p_detail,
                p_frais_imposables = rub_src.p_frais_imposables,
                p_heures_contrat = rub_src.p_heures_contrat,
                p_heures_payees = rub_src.p_heures_payees,
                p_heures_travaillees = rub_src.p_heures_travaillees,
                p_masse_salariale = rub_src.p_masse_salariale,
                p_masse_salariale_provisionnee = rub_src.p_masse_salariale_provisionnee,
                p_montant_provisions = rub_src.p_montant_provisions,
                p_net_a_payer = rub_src.p_net_a_payer,
                p_net_imposable = rub_src.p_net_imposable,
                p_nombre = rub_src.p_nombre,
                p_nombre_provisions = rub_src.p_nombre_provisions,
                p_od_net_patronale = rub_src.p_od_net_patronale,
                p_od_net_salarie = rub_src.p_od_net_salarie,
                s_avantage_nature = rub_src.s_avantage_nature,
                s_base = rub_src.s_base,
                s_brut = rub_src.s_brut,
                s_cotisation_patronale = rub_src.s_cotisation_patronale,
                s_cotisation_salarie = rub_src.s_cotisation_salarie,
                s_frais_imposables = rub_src.s_frais_imposables,
                s_heures_contrat = rub_src.s_heures_contrat,
                s_heures_payees = rub_src.s_heures_payees,
                s_heures_travaillees = rub_src.s_heures_travaillees,
                s_masse_salariale = rub_src.s_masse_salariale,
                s_masse_salariale_provisionnee = rub_src.s_masse_salariale_provisionnee,
                s_montant_provisions = rub_src.s_montant_provisions,
                s_net_a_payer = rub_src.s_net_a_payer,
                s_net_imposable = rub_src.s_net_imposable,
                s_nombre = rub_src.s_nombre,
                s_nombre_provisions = rub_src.s_nombre_provisions,
                s_od_net_patronale = rub_src.s_od_net_patronale,
                s_od_net_salarie = rub_src.s_od_net_salarie,
                unite = rub_src.unite,
                user_modified = rub_src.user_modified
			FROM rh_src.t_rubriques AS rub_src
			WHERE 1=1
				AND t_rubriques.oid = rub_src.oid + fp('idx')::bigint
				AND (1!=1
					OR t_rubriques.c_avantage_nature IS DISTINCT FROM rub_src.c_avantage_nature
                    OR t_rubriques.c_base IS DISTINCT FROM rub_src.c_base
                    OR t_rubriques.c_brut IS DISTINCT FROM rub_src.c_brut
                    OR t_rubriques.c_cotisation_patronale IS DISTINCT FROM rub_src.c_cotisation_patronale
                    OR t_rubriques.c_cotisation_salarie IS DISTINCT FROM rub_src.c_cotisation_salarie
                    OR t_rubriques.c_frais_imposables IS DISTINCT FROM rub_src.c_frais_imposables
                    OR t_rubriques.c_heures_contrat IS DISTINCT FROM rub_src.c_heures_contrat
                    OR t_rubriques.c_heures_payees IS DISTINCT FROM rub_src.c_heures_payees
                    OR t_rubriques.c_heures_travaillees IS DISTINCT FROM rub_src.c_heures_travaillees
                    OR t_rubriques.c_masse_salariale IS DISTINCT FROM rub_src.c_masse_salariale
                    OR t_rubriques.c_masse_salariale_provisionnee IS DISTINCT FROM rub_src.c_masse_salariale_provisionnee
                    OR t_rubriques.c_montant_provisions IS DISTINCT FROM rub_src.c_montant_provisions
                    OR t_rubriques.c_net_a_payer IS DISTINCT FROM rub_src.c_net_a_payer
                    OR t_rubriques.c_net_imposable IS DISTINCT FROM rub_src.c_net_imposable
                    OR t_rubriques.c_nombre IS DISTINCT FROM rub_src.c_nombre
                    OR t_rubriques.c_nombre_provisions IS DISTINCT FROM rub_src.c_nombre_provisions
                    OR t_rubriques.c_od_net_patronale IS DISTINCT FROM rub_src.c_od_net_patronale
                    OR t_rubriques.c_od_net_salarie IS DISTINCT FROM rub_src.c_od_net_salarie
                    OR t_rubriques.code_calcul IS DISTINCT FROM rub_src.code_calcul
                    OR t_rubriques.coefficient IS DISTINCT FROM rub_src.coefficient
                    OR t_rubriques.coefficient_base IS DISTINCT FROM rub_src.coefficient_base
                    OR t_rubriques.coefficient_nombre IS DISTINCT FROM rub_src.coefficient_nombre
                    OR t_rubriques.coefficient_txp IS DISTINCT FROM rub_src.coefficient_txp
                    OR t_rubriques.coefficient_txs IS DISTINCT FROM rub_src.coefficient_txs
                    OR t_rubriques.heures_payees IS DISTINCT FROM rub_src.heures_payees
                    OR t_rubriques.p_avantage_nature IS DISTINCT FROM rub_src.p_avantage_nature
                    OR t_rubriques.p_base IS DISTINCT FROM rub_src.p_base
                    OR t_rubriques.p_brut IS DISTINCT FROM rub_src.p_brut
                    OR t_rubriques.p_cotisation_patronale IS DISTINCT FROM rub_src.p_cotisation_patronale
                    OR t_rubriques.p_cotisation_salarie IS DISTINCT FROM rub_src.p_cotisation_salarie
                    OR t_rubriques.p_cumul IS DISTINCT FROM rub_src.p_cumul
                    OR t_rubriques.p_detail IS DISTINCT FROM rub_src.p_detail
                    OR t_rubriques.p_frais_imposables IS DISTINCT FROM rub_src.p_frais_imposables
                    OR t_rubriques.p_heures_contrat IS DISTINCT FROM rub_src.p_heures_contrat
                    OR t_rubriques.p_heures_payees IS DISTINCT FROM rub_src.p_heures_payees
                    OR t_rubriques.p_heures_travaillees IS DISTINCT FROM rub_src.p_heures_travaillees
                    OR t_rubriques.p_masse_salariale IS DISTINCT FROM rub_src.p_masse_salariale
                    OR t_rubriques.p_masse_salariale_provisionnee IS DISTINCT FROM rub_src.p_masse_salariale_provisionnee
                    OR t_rubriques.p_montant_provisions IS DISTINCT FROM rub_src.p_montant_provisions
                    OR t_rubriques.p_net_a_payer IS DISTINCT FROM rub_src.p_net_a_payer
                    OR t_rubriques.p_net_imposable IS DISTINCT FROM rub_src.p_net_imposable
                    OR t_rubriques.p_nombre IS DISTINCT FROM rub_src.p_nombre
                    OR t_rubriques.p_nombre_provisions IS DISTINCT FROM rub_src.p_nombre_provisions
                    OR t_rubriques.p_od_net_patronale IS DISTINCT FROM rub_src.p_od_net_patronale
                    OR t_rubriques.p_od_net_salarie IS DISTINCT FROM rub_src.p_od_net_salarie
                    OR t_rubriques.s_avantage_nature IS DISTINCT FROM rub_src.s_avantage_nature
                    OR t_rubriques.s_base IS DISTINCT FROM rub_src.s_base
                    OR t_rubriques.s_brut IS DISTINCT FROM rub_src.s_brut
                    OR t_rubriques.s_cotisation_patronale IS DISTINCT FROM rub_src.s_cotisation_patronale
                    OR t_rubriques.s_cotisation_salarie IS DISTINCT FROM rub_src.s_cotisation_salarie
                    OR t_rubriques.s_frais_imposables IS DISTINCT FROM rub_src.s_frais_imposables
                    OR t_rubriques.s_heures_contrat IS DISTINCT FROM rub_src.s_heures_contrat
                    OR t_rubriques.s_heures_payees IS DISTINCT FROM rub_src.s_heures_payees
                    OR t_rubriques.s_heures_travaillees IS DISTINCT FROM rub_src.s_heures_travaillees
                    OR t_rubriques.s_masse_salariale IS DISTINCT FROM rub_src.s_masse_salariale
                    OR t_rubriques.s_masse_salariale_provisionnee IS DISTINCT FROM rub_src.s_masse_salariale_provisionnee
                    OR t_rubriques.s_montant_provisions IS DISTINCT FROM rub_src.s_montant_provisions
                    OR t_rubriques.s_net_a_payer IS DISTINCT FROM rub_src.s_net_a_payer
                    OR t_rubriques.s_net_imposable IS DISTINCT FROM rub_src.s_net_imposable
                    OR t_rubriques.s_nombre IS DISTINCT FROM rub_src.s_nombre
                    OR t_rubriques.s_nombre_provisions IS DISTINCT FROM rub_src.s_nombre_provisions
                    OR t_rubriques.s_od_net_patronale IS DISTINCT FROM rub_src.s_od_net_patronale
                    OR t_rubriques.s_od_net_salarie IS DISTINCT FROM rub_src.s_od_net_salarie
                    OR t_rubriques.unite IS DISTINCT FROM rub_src.unite
                    OR t_rubriques.user_modified IS DISTINCT FROM rub_src.user_modified)
			;

			-- Màj comptes
			SELECT syncTable3('t_compte')
			;

			-- Màj des situations de famille
			SELECT syncTable3('t_situations_famille')
			;

			-- Màj des types de contrat
			SELECT syncTable3('t_types_contrat')
			;

			-- Màj des statuts
			SELECT syncTable3('t_statuts')
			;

			-- Màj des types de temps de travail
			SELECT syncTable3('t_types_temps_travail')
			;

			-- Màj des services
			SELECT syncTable3('t_services')
			;

			-- Màj des spécialités
			SELECT syncTable3('t_specialites')
			;

			-- Màj des codes emploi
			SELECT syncTable3('t_codes_emploi')
			;
			
			-- Màj des types d'horaire
			SELECT syncTable3('t_types_horaire')
			;

			-- Màj des sociétés d'interim
			SELECT syncTable3('t_societes_interim')
			;

			-- Màj des grilles
			SELECT syncTable3('t_grilles')
			;

			-- Màj des groupes de grilles
			SELECT syncTable3('t_grilles_groupes')
			;

            -- Màj des sections analytiques paie
			SELECT syncTable3('t_sections_analytiques_paie')
			;

            -- Màj des sections analytiques comptable
			SELECT syncTable3('t_sections_analytiques')
			;

            -- Màj des plans analytiques ng
            DELETE FROM rh.t_plan_analytique WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint) AND oid > 0
			;
			INSERT INTO rh.t_plan_analytique(oid, code, texte)
				SELECT oid, code, texte
				FROM rh_src.t_plan_analytique
				WHERE oid > 0
			;

            -- Màj des sections analytiques ng
			SELECT syncTable3('t_section_analytique')
			;

			-- Màj des motifs d'arret
			SELECT syncTable3('t_motifs_arret')
			;

			-- Màj des précisions du motif d'arrêt
			SELECT syncTable3('t_precisions_motif_arret')
			;

			-- Màj des motifs de visite médicale
			SELECT syncTable3('t_motifs_visite')
			;

			-- Màj des circonstances d'accident du travail
			SELECT syncTable3('t_accident_circonstance')
			;

			-- Màj des lieux d'accident du travail
			SELECT syncTable3('t_accident_lieu')
			;

			-- Màj de la nature de l'accident du travail
			SELECT syncTable3('t_accident_nature')
			;

			--  Màj des sièges d'accident du travail
			SELECT syncTable3('t_accident_siege')
			;

			-- Màj des listes de formations
			SELECT syncTable3('t_liste_formations')
			;

			-- Màj des codes de cotisation.
			SELECT syncTable3('t_code_cotisation')
			;

			]]></sqlcmd>
		</NODE>
	</NODE>
	<NODE name="FUSION" label="FUSION">
		<NODE label="Chiffrier">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_chiffrier_production WHERE mois BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
			;

			INSERT INTO rh.p_chiffrier_production (entreprise_id, etablissement_id, mois, nombre_salaries, montant_brut, nombre_heures)
				SELECT
					getOid(entreprise_id),
					getOid(etablissement_id),
					mois,
					nombre_salaries,
					montant_brut,
					nombre_heures
				FROM rh_src.p_chiffrier_production
				WHERE mois BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
			;

			]]></sqlcmd>
		</NODE>
		<NODE label="Profils">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_profils WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;
			
			INSERT INTO rh.p_profils(
				oid,
				cadre_emploi_code_original,
				categorie_conge_code_original,
				categorie_socio_professionnelle_code_original,
				categorie_statutaire_code_original,
				code_emploi_code_original,
				commission_paritaire_code_original,
				compte_salarie_code_original,
				filiere_code_original,
				grille_code_original,
				grille_groupe_code_original,
				groupe_cotisant_code_original,
				lettre_budgetaire_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,
				unite_fonctionnelle_code_original)
                WITH merged_qua as (
                        select
                            src.code_original as code_original,
                            max(case when dst.oid is null then fp('idc')||src.code_original else dst.code_original end) as merged_code_original
                        from rh_src.t_qualifications as src
                            left join rh.t_qualifications as dst on 1=1
                                and dst.code = src.code
                                and dst.texte = src.texte
                        group by 1),
                    merged_cem as (
                        select
                            src.code_original as code_original,
                            max(case when dst.oid is null then fp('idc')||src.code_original else dst.code_original end) as merged_code_original
                        from rh_src.t_codes_emploi as src
                            left join rh.t_codes_emploi as dst on 1=1
                                and dst.code = src.code
                                and dst.texte = src.texte
                        group by 1),
                    merged_ser as (
                        select
                            src.code_original as code_original,
                            max(case when dst.oid is null then fp('idc')||src.code_original else dst.code_original end) as merged_code_original
                        from rh_src.t_services as src
                            left join rh.t_services as dst on 1=1
                                and dst.code = src.code
                                and dst.texte = src.texte
                        group by 1)
				SELECT
					oid + fp('idx')::bigint,
					fp('idc')||p_profils.cadre_emploi_code_original,
					fp('idc')||p_profils.categorie_conge_code_original,
					p_profils.categorie_socio_professionnelle_code_original, -- les CSP sont fusionnées.
					fp('idc')||p_profils.categorie_statutaire_code_original,
					coalesce(merged_cem.merged_code_original, fp('idc')||p_profils.code_emploi_code_original) as code_emploi_code_original,
					fp('idc')||p_profils.commission_paritaire_code_original,
					fp('idc')||p_profils.compte_salarie_code_original,
					fp('idc')||p_profils.filiere_code_original,
					fp('idc')||p_profils.grille_code_original,
					fp('idc')||p_profils.grille_groupe_code_original,
					fp('idc')||p_profils.groupe_cotisant_code_original,
					fp('idc')||p_profils.lettre_budgetaire_code_original,
					fp('idc')||p_profils.motif_debut_code_original,
					fp('idc')||p_profils.motif_fin_code_original,
					coalesce(merged_qua.merged_code_original, fp('idc')||p_profils.qualification_code_original) as qualification_code_original,
					fp('idc')||p_profils.section_analytique_code_original,
					fp('idc')||p_profils.section_analytique_paie_code_original,
					coalesce(merged_ser.merged_code_original, fp('idc')||p_profils.service_code_original) as service_code_original,
					fp('idc')||p_profils.societe_interim_code_original,
					fp('idc')||p_profils.specialite_code_original,
					fp('idc')||p_profils.statut_code_original,
					fp('idc')||p_profils.type_contrat_code_original,
					fp('idc')||p_profils.type_horaire_code_original,
					fp('idc')||p_profils.type_temps_travail_code_original,
					fp('idc')||p_profils.unite_fonctionnelle_code_original
				FROM rh_src.p_profils
                    LEFT JOIN merged_qua ON merged_qua.code_original = p_profils.qualification_code_original
                    LEFT JOIN merged_ser ON merged_ser.code_original = p_profils.service_code_original
                    LEFT JOIN merged_cem ON merged_cem.code_original = p_profils.code_emploi_code_original
			;

			]]></sqlcmd>
		</NODE>
		<NODE label="Salariés">
			<sqlcmd><![CDATA[

            -- Stratégie (Divers FUSION_STRATEGIE) :
            --  * 0 = les salariés ont leur matricules conservés d'un prestataire à l'autre.
            --  * 1 = SHS -> Cegid : 2299Z -> 0000002299. On conserve 0000002299.
            --  * 2 = Le n° de SS sert à effectuer le rapprochement. On conserver le matricule le plus récent (celui du prestataire en cours).

			DROP TABLE IF EXISTS w_salaries
			;
			CREATE TEMP TABLE w_salaries AS
				SELECT
                    oid + fp('idx')::bigint AS oid,
					finess,
					nom,
					prenom,
					date_naissance,
					sexe,
					CASE t_divers.valeur
                        WHEN 0 THEN matricule
                        WHEN 1 THEN (CASE WHEN length(matricule) = 10 THEN matricule ELSE lpad(substring(matricule from '(....).$'), 10, '0') END)
                        WHEN 2 THEN matricule
                    END AS matricule,
                    matricule_planning,
					CASE t_divers.valeur
                        WHEN 0 THEN p_salaries.code
                        WHEN 1 THEN (CASE WHEN length(p_salaries.code) = 10 THEN p_salaries.code ELSE lpad(substring(p_salaries.code from '(....).$'), 10, '0') END)
                        WHEN 2 THEN p_salaries.code
                    END AS code,
					CASE t_divers.valeur
                        WHEN 0 THEN code_original
                        WHEN 1 THEN (CASE WHEN length(code_original) = 10 THEN code_original ELSE lpad(substring(code_original from '(....).$'), 10, '0') END)
                        WHEN 2 THEN code_original
                    END AS code_original,
                    coalesce(nir, matricule) as nir, -- prise en du compte matricule pour les salaries sans nir e.g. étrangers
					getOid(entreprise_id) as entreprise_id,
					getOid(nationalite_id) as nationalite_id,
					code_postal_id,
					nom_naissance,
					getOid(situation_famille_id) as situation_famille_id,
                    adresse1,
					adresse2,
					getOid(profil_id) as profil_id,
					date_debut,
					date_fin,
					date_entree_ets,
					date_sortie_ets,
                    date_anciennete,
					date_entree_fp,
					date_entree_fph,
					no_adeli,
					case when code_cotisation_id = 0 then 0 else code_cotisation_id + fp('idx')::bigint end as code_cotisation_id,
					matricule_retraite as matricule_retraite
                FROM rh_src.p_salaries
                    join rh.t_divers ON t_divers.code = 'FUSION_STRATEGIE'
			;

            DELETE FROM rh.p_salaries WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
            ;

            -- Ajout des salariés pas déjà insérés précédemment.
            INSERT INTO rh.p_salaries(
                oid,
                finess,
                nom,
                prenom,
                date_naissance,
                sexe,
                matricule,
                matricule_planning,
                code,
                code_original,
                nir,
                entreprise_id,
                nationalite_id,
                code_postal_id,
                nom_naissance,
                situation_famille_id,
                adresse1,
				adresse2,
                profil_id,
                date_debut,
                date_fin,
                date_entree_ets,
                date_sortie_ets,
                date_anciennete,
                date_entree_fp,
                date_entree_fph,
                no_adeli,
                code_cotisation_id,
                matricule_retraite)
                SELECT
                    oid,
                    finess,
                    nom,
                    prenom,
                    date_naissance,
                    sexe,
                    matricule,
                    matricule_planning,
                    code,
                    code_original,
                    nir,
                    entreprise_id,
                    nationalite_id,
                    code_postal_id,
                    nom_naissance,
                    situation_famille_id,
                    adresse1,
					adresse2,
                    profil_id,
                    date_debut,
                    date_fin,
                    date_entree_ets,
                    date_sortie_ets,
                    date_anciennete,
                    date_entree_fp,
                    date_entree_fph,
                    no_adeli,
                    code_cotisation_id,
                    matricule_retraite
                FROM w_salaries
                WHERE matricule NOT IN (SELECT matricule FROM rh.p_salaries)
            ;

			]]></sqlcmd>
		</NODE>
		<NODE label="Salariés (mapping)">
			<sqlcmd><![CDATA[

			-- Table de mapping rh_src.oid <-> rh.oid pour les salariés.
			DROP TABLE IF EXISTS w_map_sal
			;
			CREATE TEMP TABLE w_map_sal AS
				SELECT
					p_salaries.oid as salarie_src_id,
					min(p.oid) as salarie_id, -- Utile lorsque FUSION_STRATEGIE à 2 car plusieurs matricules pour le même n°SS.
                    -- CASE t_divers.valeur
                    --     WHEN 0 THEN p_salaries.matricule
                    --     WHEN 1 THEN (CASE WHEN length(p_salaries.matricule) = 10 THEN p_salaries.matricule ELSE lpad(substring(p_salaries.matricule from '(....).$'), 10, '0') END)
                    --     WHEN 2 THEN p_salaries.matricule
                    -- END AS matricule,
                    p_salaries.nir
				FROM rh_src.p_salaries
                    join rh.t_divers ON t_divers.code = 'FUSION_STRATEGIE'
					JOIN rh.p_salaries as p ON 
                        (CASE t_divers.valeur
                            WHEN 0 THEN p.matricule = p_salaries.matricule
                            WHEN 1 THEN p.matricule = (CASE WHEN length(p_salaries.matricule) = 10 THEN p_salaries.matricule ELSE lpad(substring(p_salaries.matricule from '(....).$'), 10, '0') END)
                            WHEN 2 THEN substring(p.nir, 1, 13) = substring(p_salaries.nir, 1, 13)
                        END)
                GROUP BY 1, 3
			;

			]]></sqlcmd>
		</NODE>
		<NODE label="Contrats">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_contrats WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			-- Création d'une table de mapping ancien oid <-> nouveaux oids.
			-- Seuls les contrats avec cnt_to_insert à true seront à insérer.
			DROP TABLE IF EXISTS w_map_cnt
			;
			CREATE TEMP TABLE w_map_cnt AS
                with src_contrat_bul as (
                    select contrat_id 
                    from rh_src.p_historique_paie
                    where mois_paie BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
                    group by 1)
				SELECT
					coalesce(cnt_ori.oid, MAX(cnt.oid) + fp('idx')::bigint) AS contrat_id, -- id (à insérer si cnt_to_insert = true) du contrat dans le schéma de rh.
					MAX(cnt.oid) AS contrat_src_id, -- id du contrat dans le schéma du prestataire.
                    cnt_ori.oid IS NULL as cnt_to_insert, -- true : contrat à insérer; false : contrat déjà inséré.
					map1.salarie_id -- on met le bon id de salarié issu du mapping.
                    --coalesce(cnt_ori.date_debut, cnt.date_debut) AS date_debut,
                    --coalesce(cnt_ori.date_fin, cnt.date_fin) AS date_fin
				FROM rh_src.p_contrats as cnt
					JOIN w_map_sal as map1 ON map1.salarie_src_id = cnt.salarie_id
                    left join src_contrat_bul on src_contrat_bul.contrat_id = cnt.oid
                    LEFT JOIN rh.p_contrats as cnt_ori ON 1=1
                        AND cnt_ori.salarie_id = map1.salarie_id
                        AND cnt_ori.date_debut = cnt.date_debut -- On fait uniquement le lien avec la date de début, car la date de fin pouvait ne pas être déterminé dans l'ancien prestataire.
                        -- AND cnt_ori.date_fin = cnt.date_fin -- <- A laisser commentée.
                        -- AND base.cti_overlaps(cnt.date_debut, cnt.date_fin, cnt_ori.date_debut, cnt_ori.date_fin) -- Permet de ne pas prendre des contrats en trop qui seraient chevauchant (cf. exemple ci-dessous)
				WHERE true
                    and (false
                        or base.cti_overlaps(cnt.date_debut, cnt.date_fin, fp('str')::date, fp('end')::date) -- on prend uniquement les contrats relatif à la période prestataire...
                        or src_contrat_bul.contrat_id is not null) -- ... ou ceux dont le contrat aurait été positionné avant le changement de prestataire (IC-4475).
				GROUP BY cnt_ori.oid, map1.salarie_id, cnt.date_debut
			;

            /**

            UPDATE :
            --------
            Tant pis pour le cas où la reprise des contrat n'a pas été correcte (avec date de début identique).
            En effet cela pose problème pour la gestion du multi-contrat.


            EXPLICATION ORIGINELLE :
            ------------------------

            Cas d'un salarié.
            
            LEFT JOIN rh.p_contrats as cnt_ori basé sur cnt_ori.date_debut = cnt.date_debut

            Cegid (nouveau prestataire) :
            "2003-08-02";"2003-08-31";"00000020310001" -- NON (via le WHERE)
            "2003-10-01";"2003-10-31";"00000020310002" -- NON (via le WHERE)
            "2003-11-01";"2003-11-30";"00000020310003" -- NON (via le WHERE)
            "2003-12-01";"2003-12-31";"00000020310004" -- NON (via le WHERE)
            "2004-01-01";"2099-12-31";"00000020310005" -- Sélectionné

            SHS (ancien prestataire ) :
            "2003-08-02";"2003-08-31";"2031H-1" -- Sélectionné
            "2003-10-01";"2003-10-31";"2031H-2" -- Sélectionné
            "2003-11-01";"2003-11-30";"2031H-3" -- Sélectionné
            "2003-12-01";"2003-12-31";"2031H-4" -- Sélectionné
            "2004-01-01";"2004-06-30";"2031H-5" -- Non sélectionné car déjà remonté avec Cegid.
            "2004-07-01";"2099-12-31";"2031H-6" -- Sélectionné

            Fusion (erronée car 2 contrats se terminant en 2099-12-31) :
            "2003-08-02";"2003-08-31";"SH_2031H-1"
            "2003-10-01";"2003-10-31";"SH_2031H-2"
            "2003-11-01";"2003-11-30";"SH_2031H-3"
            "2003-12-01";"2003-12-31";"SH_2031H-4"
            "2004-01-01";"2099-12-31";"00000020310005"
            "2004-07-01";"2099-12-31";"SH_2031H-6" -- ce contrat n'aurait pas du être remonté et c'est le sens du cti_overlaps dans le LEFT JOIN.

            */

			INSERT INTO rh.p_contrats (
				oid,
				salarie_id,
				date_debut,
				date_fin,
				numero_contrat,
				code_original,
				etablissement_id,
				profil_id,
				anciennete_anterieure_mois,
				anciennete_anterieure_calculee_mois,
				salarie_remplace_id,
				anciennete_anterieure_jours,
                anciennete_anterieure_calculee_jours)
				SELECT
					cnt.contrat_id,
					cnt.salarie_id, -- on met le bon id de salarié issu du mapping.
					p_contrats.date_debut,
					p_contrats.date_fin,
					fp('idc')||p_contrats.numero_contrat,
					fp('idc')||p_contrats.code_original,
					getOid(p_contrats.etablissement_id),
					getOid(p_contrats.profil_id),
					p_contrats.anciennete_anterieure_mois,
					p_contrats.anciennete_anterieure_calculee_mois,
					coalesce(map.salarie_id, 0), -- on met le bon id de salarié remplacé issu du mapping.
					p_contrats.anciennete_anterieure_jours,
                    p_contrats.anciennete_anterieure_calculee_jours
				FROM w_map_cnt as cnt
					JOIN rh_src.p_contrats on p_contrats.oid = cnt.contrat_src_id
					LEFT JOIN w_map_sal as map ON map.salarie_src_id = p_contrats.salarie_remplace_id
				WHERE cnt.cnt_to_insert -- on insére uniquement les contrats pas déjà insérés précédemment.
			;

			-- On conserve uniquement la ventilation sur les périodes propres à chaque prestataire.
            -- On considère que la ventilation sur les périodes propres à chaque prestataire est la plus à même de décrire l'évolution du salarié,
            -- notamment pour les CDI pour lesquels l'historique n'aura pas été intégralement repris avec le nouveau prestataire.
			DELETE FROM rh.p_contrats_mois WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			-- Table qui fait le mapping entre les anciens oid et les éventuels nouveaux.
		    DROP TABLE IF EXISTS w_map_cnt_mois
			;
			CREATE TEMP TABLE w_map_cnt_mois AS
                with src_contrat_bul as (
                    select contrat_mois_id 
                    from rh_src.p_historique_paie
                    where mois_paie BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
                    group by 1)
				SELECT
					cnt_src.oid + fp('idx')::bigint as contrat_mois_id,
					cnt_src.oid as contrat_mois_src_id,
					w_map_cnt.contrat_id,
					w_map_cnt.contrat_src_id,
		            cnt_src.mois_activite,
		            w_map_cnt.salarie_id
		        FROM rh_src.p_contrats_mois AS cnt_src
                    left join src_contrat_bul on src_contrat_bul.contrat_mois_id = cnt_src.oid
		            JOIN w_map_cnt ON 1=1
                        AND w_map_cnt.contrat_src_id = cnt_src.contrat_id
                        -- UPDATE : NON -- V Les contrats_mois doivent correspondrent à un seul contrat sur une période donnée.
                        -- AND base.cti_overlaps(w_map_cnt.date_debut, w_map_cnt.date_fin, cnt_src.date_debut, cnt_src.date_fin)
                WHERE true
                    and (false
                        or cnt_src.mois_activite BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM') -- on prend uniquement les contrats relatif à la période prestataire...
                        or src_contrat_bul.contrat_mois_id is not null) -- ... ou ceux dont le contrat aurait été positionné avant le changement de prestataire (IC-4475).
			;
			

			INSERT INTO rh.p_contrats_mois(
	            oid,
	            contrat_id,
	            mois_activite,
	            nombre_debut_contrat,
	            nombre_fin_contrat,
	            equivalent_temps_plein,
	            date_debut,
	            date_fin,
	            age_id,
	            age_jours,
	            est_hors_periode,
	            present_fin_mois,
	            anciennete_mois,
	            anciennete_annee_id,
	            nombre_departs,
	            salarie_id,
	            anciennete_grade_mois,
	            anciennete_grade_annee_id,
	            anciennete_fp_mois,
	            anciennete_fp_annee_id,
	            anciennete_fph_mois,
	            anciennete_fph_annee_id,
	            fictif,
	            nombre_entrees,
	            present_debut_mois,
	            anciennete_jours,
	            profil_id,
                etablissement_id,
                code_original,
                effectif_permanent,
                nombre_transformation_cdi,
                pole_id,
                population_id,
                ratio_temps_travail,
                nombre_heures)
				SELECT
					w_map_cnt_mois.contrat_mois_id,
		            w_map_cnt_mois.contrat_id,
		            w_map_cnt_mois.mois_activite,
		            p_contrats_mois.nombre_debut_contrat,
		            p_contrats_mois.nombre_fin_contrat,
		            p_contrats_mois.equivalent_temps_plein,
		            p_contrats_mois.date_debut,
		            p_contrats_mois.date_fin,
		            p_contrats_mois.age_id,
		            p_contrats_mois.age_jours,
		            p_contrats_mois.est_hors_periode,
		            p_contrats_mois.present_fin_mois,
		            p_contrats_mois.anciennete_mois,
		            p_contrats_mois.anciennete_annee_id,
		            p_contrats_mois.nombre_departs,
		            w_map_cnt_mois.salarie_id, -- on met le bon id de salarié issu du mapping.
		            p_contrats_mois.anciennete_grade_mois,
		            p_contrats_mois.anciennete_grade_annee_id,
		            p_contrats_mois.anciennete_fp_mois,
		            p_contrats_mois.anciennete_fp_annee_id,
		            p_contrats_mois.anciennete_fph_mois,
		            p_contrats_mois.anciennete_fph_annee_id,
		            p_contrats_mois.fictif,
		            p_contrats_mois.nombre_entrees,
		            p_contrats_mois.present_debut_mois,
		            p_contrats_mois.anciennete_jours,
		            getOid(p_contrats_mois.profil_id),
                    getOid(p_contrats_mois.etablissement_id),
                    p_contrats_mois.code_original,
                    p_contrats_mois.effectif_permanent,
                    p_contrats_mois.nombre_transformation_cdi,
                    p_contrats_mois.pole_id,
                    p_contrats_mois.population_id,
                    p_contrats_mois.ratio_temps_travail,
                    p_contrats_mois.nombre_heures
		           FROM w_map_cnt_mois
		               JOIN rh_src.p_contrats_mois ON p_contrats_mois.oid = w_map_cnt_mois.contrat_mois_src_id
		    ;

			]]></sqlcmd>
		</NODE>
		<NODE label="Historique de la paie">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_historique_paie WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			INSERT INTO rh.p_historique_paie(
				oid,
				age_id,
				base,
                compte_id,
				contrat_id,
				contrat_mois_id,
				date_debut,
				date_fin,
				date_paie,
                etablissement_id,
                heure_contrat,
                heure_payee,
                heure_travaillee,
				mois_activite,
				mois_paie,
				montant_avantage_nature,
				montant_brut,
				montant_cotisation_patronale,
				montant_cotisation_salarie,
				montant_frais_imposables,
                montant_masse_salariale,
                montant_masse_salariale_provisionnee,
				montant_net_a_payer_salarie,
				montant_net_imposable_salarie,
                montant_od_net_patronale,
				montant_od_net_salarie,
                montant_patronal,
                montant_provisions,
                montant_salarial,
                nombre,
                nombre_provisions,
				organisme_cotisation_id,
				rubrique_id,
				salarie_id,
				taux_cotisation_patronale,
				taux_cotisation_salarie,
                ventilation_1_id,
                ventilation_2_id,
                ventilation_3_id)
				SELECT
					oid + fp('idx')::bigint,
					age_id,
					base,
                    getOid(compte_id),
					w_map_cnt_mois.contrat_id,
					w_map_cnt_mois.contrat_mois_id,
					date_debut,
					date_fin,
					date_paie,
                    getOid(etablissement_id),
                    heure_contrat,
                    heure_payee,
                    heure_travaillee,
					hp.mois_activite,
					hp.mois_paie,
					montant_avantage_nature,
					montant_brut,
					montant_cotisation_patronale,
					montant_cotisation_salarie,
					montant_frais_imposables,
                    montant_masse_salariale,
                    montant_masse_salariale_provisionnee,
					montant_net_a_payer_salarie,
					montant_net_imposable_salarie,
                    montant_od_net_patronale,
					montant_od_net_salarie,
                    montant_patronal,
                    montant_provisions,
                    montant_salarial,
                    nombre,
                    nombre_provisions,
					getOid(organisme_cotisation_id),
					getOid(rubrique_id),
					w_map_sal.salarie_id,
					taux_cotisation_patronale,
					taux_cotisation_salarie,
                    getOid(ventilation_1_id),
                    getOid(ventilation_2_id),
                    getOid(ventilation_3_id)
				FROM rh_src.p_historique_paie as hp
					JOIN w_map_sal ON w_map_sal.salarie_src_id = hp.salarie_id
					LEFT JOIN w_map_cnt_mois on w_map_cnt_mois.contrat_mois_src_id = hp.contrat_mois_id
				WHERE 1=1
					AND mois_paie BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
			;

			-- Associer les bulletins de paie hors période de contrat avec contrat sur la période précédente appartenant à un autre prestataire.
			UPDATE rh.p_historique_paie
			SET contrat_id = subq.contrat_id,
				contrat_mois_id = subq.contrat_mois_id
			FROM (
				select
					p_historique_paie.oid,
					(max(ARRAY[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.oid]))[2] as contrat_mois_id,
					(max(ARRAY[extract(epoch from p_contrats_mois.date_fin), p_contrats_mois.contrat_id]))[2] AS contrat_id
				from rh.p_historique_paie
					join rh.p_contrats_mois on 1=1 
						and p_contrats_mois.salarie_id = p_historique_paie.salarie_id
						and p_contrats_mois.date_fin < p_historique_paie.date_debut
				where p_historique_paie.contrat_id is null
				group by 1) AS subq
			WHERE p_historique_paie.oid = subq.oid
			;

			]]></sqlcmd>
		</NODE>
        <NODE label="Ventilation analytique NG">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_ventilation WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			INSERT INTO rh.p_ventilation (
				oid,
				code,
                texte,
                plan_analytique_id)
				SELECT
					oid + fp('idx')::bigint,
					code,
					texte,
					plan_analytique_id
				FROM rh_src.p_ventilation
            ;

            DELETE FROM rh.p_ventilation_section WHERE ventilation_id BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			INSERT INTO rh.p_ventilation_section (
				ventilation_id,
                section_analytique_id,
                section_analytique_code,
                section_analytique_texte,
                ratio)
				SELECT
					ventilation_id + fp('idx')::bigint,
					section_analytique_id + fp('idx')::bigint,
					section_analytique_code,
					section_analytique_texte,
                    ratio
				FROM rh_src.p_ventilation_section
            ;

			]]></sqlcmd>
		</NODE>
		<NODE label="Ventilation des profils">
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_profil_contrat_mois WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			-- Alimentation des profils simultanés.
			INSERT INTO rh.p_profil_contrat_mois (
				oid,
				profil_id,
				contrat_mois_id,
				salarie_id,
				ratio,
				mois
				)
				SELECT
					oid + fp('idx')::bigint,
					getOid(pcm.profil_id),
					w_map_cnt_mois.contrat_mois_id,
					w_map_cnt_mois.salarie_id,
					pcm.ratio,
					pcm.mois
				FROM rh_src.p_profil_contrat_mois as pcm
					JOIN w_map_cnt_mois ON w_map_cnt_mois.contrat_mois_src_id = pcm.contrat_mois_id
				WHERE 1=1
					--AND w_map_cnt_mois.contrat_mois_ori_id = 0 -- on insère uniquement les contrats pas déjà insérés précédemment.
					-- AND pcm.mois BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM') -- PAS BESOIN DEJA FILTRE.
			;

			]]></sqlcmd>
		</NODE>
		<NODE label="Arrêts de travail">
			<condition><![CDATA[  
				SELECT valeur = '0' FROM rh.t_divers
				WHERE code = 'FUSION_IGNORE_ARRETS';
            ]]></condition>
			<sqlcmd><![CDATA[

			DELETE FROM rh.p_arrets_travail WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

			INSERT INTO rh.p_arrets_travail(
				oid,
				salarie_id,
				contrat_id,
				mois_activite,
				date_debut,
				date_fin,
				date_reprise,
				motif_arret_id,
				precision_motif_arret_id,
				nb_jours
				)
				SELECT
					oid + fp('idx')::bigint,
					w_map_cnt.salarie_id,
					w_map_cnt.contrat_id,
					p_arrets_travail.mois_activite,
					p_arrets_travail.date_debut,
					p_arrets_travail.date_fin,
					p_arrets_travail.date_reprise,
					getOid(p_arrets_travail.motif_arret_id),
					0 AS precision_motif_arret_id,
					p_arrets_travail.nb_jours
				FROM rh_src.p_arrets_travail
					JOIN w_map_cnt on w_map_cnt.contrat_src_id = p_arrets_travail.contrat_id
				WHERE to_char(p_arrets_travail.date_fin, 'YYYYMM')::int BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
                -- On prend to_char(p_arrets_travail.date_fin, 'YYYYMM') plutôt que p_arrets_travail.mois_activite car cette dernière est calculée
                -- à partir de la date de début.
			;

            -- Contrairement à la ventilation des contrats, on peut se permettre ici de remonter la ventilation des arrêts même si elle est à cheval.
            -- NON car pour les longues durées, ça n'aura pas été ventilé ?.
            -- Manifestement, les arrêts longue durée sont recréés dans le nouveau prestataire avec une date de début plus récente (inclue dans la plage du prestataire).
            -- Seule la date de reprise sera fausse, il y aura des chevauchements si dans le prestataire précédent ça chevauche...

			DELETE FROM rh.p_arrets_travail_mois WHERE arret_travail_id BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
			;

            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,
                nb_heures)
                SELECT
                    p_arrets_travail.oid,
                    w_map_sal.salarie_id,
                    w_map_cnt_mois.contrat_id,
                    w_map_cnt_mois.contrat_mois_id,
                    p_arrets_travail_mois.mois_activite,
                    p_arrets_travail_mois.nb_debut_arret,
                    p_arrets_travail_mois.nb_fin_arret,
                    p_arrets_travail_mois.nb_reprise_apres_arret,
                    p_arrets_travail_mois.date_debut,
                    p_arrets_travail_mois.date_fin,
                    p_arrets_travail_mois.nb_jours,
                    p_arrets_travail_mois.nb_arret,
                    p_arrets_travail_mois.nb_heures
                FROM rh_src.p_arrets_travail_mois
                    -- JOIN rh.p_arrets_travail : permet de restreindre la remontée des arrets_travail_mois à des arrets_travail précédemment remontés.
                    JOIN rh.p_arrets_travail ON p_arrets_travail.oid = p_arrets_travail_mois.arret_travail_id + fp('idx')::bigint
                    JOIN w_map_sal ON w_map_sal.salarie_src_id = p_arrets_travail_mois.salarie_id
                    JOIN w_map_cnt_mois on w_map_cnt_mois.contrat_mois_src_id = p_arrets_travail_mois.contrat_mois_id
                WHERE p_arrets_travail_mois.mois_activite BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
                GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13
            ;

			]]></sqlcmd>
		</NODE>
        <NODE label="Visites Médicales">
            <sqlcmd><![CDATA[

            DELETE FROM rh.p_visites_medicales WHERE oid BETWEEN fp('idx')::bigint AND (fp('idx')::bigint + fp('pas')::bigint)
            ;

            INSERT INTO rh.p_visites_medicales(
                oid,
                salarie_id,
                contrat_id,
                contrat_mois_id,
                mois_activite,
                date,
                motif_visite_id)
                SELECT 
                    p_visites_medicales.oid + fp('idx')::bigint,
                    w_map_cnt_mois.salarie_id,
                    w_map_cnt_mois.contrat_id,
                    w_map_cnt_mois.contrat_mois_id,
                    p_visites_medicales.mois_activite,
                    p_visites_medicales.date,
                    getOid(p_visites_medicales.motif_visite_id)
                FROM rh_src.p_visites_medicales
                    JOIN w_map_cnt_mois on w_map_cnt_mois.contrat_mois_src_id = p_visites_medicales.contrat_mois_id
                WHERE p_visites_medicales.mois_activite BETWEEN to_char(fp('str')::date, 'YYYYMM') AND to_char(fp('end')::date, 'YYYYMM')
            ;

            ]]></sqlcmd>
        </NODE>
        <NODE label="Handicap 2">
			<condition><![CDATA[  
            select fp('idx')::bigint = 0
            ;
            ]]></condition>
            <sqlcmd><![CDATA[
			
			TRUNCATE rh.p_handicap2 
			;
			
            INSERT INTO rh.p_handicap2(
						salarie_id
						,statut_boeth 
						,lib_boeth
						,type_reco
						,lib_reco
						,taux_ipp
						,deb_validite
						,fin_validite
						,cat_invalide_pension 
						,deb_pension
						,lourd_handicap
						,decision
					)
					SELECT 
						salarie_id
						,statut_boeth 
						,lib_boeth
						,type_reco
						,lib_reco
						,taux_ipp
						,deb_validite
						,fin_validite
						,cat_invalide_pension 
						,deb_pension
						,lourd_handicap
						,decision
					FROM rh_src.p_handicap2
			;
			
            ]]></sqlcmd>
        </NODE>
		<NODE name="DIVERS" type="common"/>
		<NODE label="Mise à jour de la table Divers (mois en cours)">
			<sqlcmd><![CDATA[

			-- Màj du mois non clôturé.
			-- Opération à ne faire qu'une seule fois avec le prestataire courant.
			DELETE FROM rh.t_divers
			WHERE 1=1
				AND code = 'MOIS_EN_COURS'
				AND fp('idx')::bigint = 0
			;

			INSERT INTO rh.t_divers(
				code,
  				texte,
  				valeur,
  				valeur_date,
  				description)
				SELECT
					code,
	  				texte,
	  				valeur,
	  				valeur_date,
	  				description
				FROM rh_src.t_divers
				WHERE 1=1
					AND code = 'MOIS_EN_COURS'
					AND fp('idx')::bigint = 0
			;
			
			]]></sqlcmd>
		</NODE>
	</NODE>
	<NODE name="POST" label="POST-TRAITEMENTS">
		<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>
