'AD',
'aliciarh' => 'AL',
'cador' => 'CA',
'ccmx' => 'CX',
'cegi' => 'CJ',
'cegid' => 'CD',
'pegase' => 'PG',
'qsp' => 'QP',
'quadrarh' => 'QR',
'sage' => 'SA',
'sagex3rhp' => 'SX',
'shs' => 'SH',
'shspub' => 'SP',
'sigems' => 'SI',
'cegidhru' => 'CU',
'rhplace' => 'RE',
);
$p2Histo = false; // Est-ce que le second prestataire est de type historique.
logStartMsg();
// Récupération des arguments passés en paramètres et traitement de ces paramètres.
$cti_args = new CTI_Args_class();
$cti_args->checkArgs();
$multiP = Environnement::getInstance()->hasRhProvider2();
$p1 = Environnement::getInstance()->getRhProvider();
$p2 = Environnement::getInstance()->getRhProvider2();
// Si $p2 est suffixé par _histo, passer le booléen $p2Histo à true.
if (substr($p2, -6, 6) === "_histo") {
// Vérification que le prestataire en cours est bien égal au prestataire histo.
if ($p1 !== substr($p2, 0, -6)) {
logErrorMsg("Le prestataire en cours $p1 est différent du prestataire historisé $p2.");
logEndMsg();
exit(1);
}
$p2Histo = true;
}
$p1Start = Environnement::getInstance()->getRhProviderStart();
$p2Start = Environnement::getInstance()->getRhProvider2Start();
$tmpDate = date_create($p1Start);
date_modify($tmpDate, '-1 day');
$p2End = date_format($tmpDate, 'Y-m-d');
// Vérification de la remontée.
$exitCode1 = 0;
$exitCode2 = 0;
$exitCodePlanning = 0;
// Si quadra RH, creation put_result avec contenu des tables pour verifier que COPY est OK
if ($p1 == 'quadrarh') {
$iCTI_connexion = Database2Factory::getInstance(Environnement::PROVIDER_CTI);
$ret = $iCTI_connexion->connect();
$putResultFilename = __ROOT__."/prodsgbd/quadrarh/data/iCTI_synchronize_quadrarh_put_result.XML";
$executeControlSql = "
DROP TABLE IF EXISTS w_putresult;
CREATE TEMP TABLE w_putresult AS
SELECT tablename, 0::numeric AS nbrows
FROM pg_tables
WHERE schemaname = 'prod_quadrarh'
ORDER BY 1
;
SELECT base.cti_execute('UPDATE w_putresult SET nbrows = (SELECT count(*) FROM prod_quadrarh.'||tablename||') WHERE tablename = '''||tablename||''' ',1)
FROM w_putresult
;
COPY (
SELECT data
FROM
(
SELECT 1, '' AS data
UNION
SELECT 2, ''
UNION
SELECT 9, ''
UNION
SELECT 3, '
0 THEN 'OK' ELSE 'KO' END||'\" />'
FROM w_putresult
ORDER BY 1,2
) subview
)
TO '$putResultFilename'
";
$iCTI_connexion->query($executeControlSql);
}
$exitCode1 = checkLoadedData($p1, $MODULE);
if ($multiP && !$p2Histo) {
// Prestataire p2 arrêté, p1 uniquement ?
if (!$cti_args->args["-p1"]) {
$exitCode2 = checkLoadedData($p2, $MODULE, false);
}
}
if ($exitCode1 + $exitCode2 + $exitCodePlanning === 0 || $cti_args->args["-f"]) {
logInfoMsg("Données prestataire chargées avec succès.");
// Chargement des paramètres et connexion BD.
$iCTI_connexion = Database2Factory::getInstance(Environnement::PROVIDER_CTI);
$ret = $iCTI_connexion->connect();
// Auto-réparation des schémas si plantage en cours.
if (schemaExists('rh_ori')) {
logInfoMsg("Auto-réparation des schémas.");
if (schemaExists("rh_$p2") && schemaExists('rh')) {
changeSchemaName("rh", "rh_$p1");
} elseif (schemaExists("rh_$p1") && schemaExists('rh')) {
changeSchemaName("rh", "rh_$p2");
}
if (!schemaExists('rh')) {
changeSchemaName("rh_ori", "rh");
}
}
if (schemaExists('rh_src')) {
logInfoMsg("Auto-réparation des schémas.");
if (schemaExists("rh_$p2")) {
changeSchemaName("rh_src", "rh_$p1");
} elseif (schemaExists("rh_$p1")) {
changeSchemaName("rh_src", "rh_$p2");
}
if (!schemaExists('rh') && schemaExists('rh_ori')) {
changeSchemaName("rh_ori", "rh");
}
}
if (schemaExists('prod_rh_p1')) {
logInfoMsg("Auto-réparation des schémas prod.");
changeSchemaName("prod_$p1", "prod_$p2");
changeSchemaName("prod_rh_p1", "prod_$p1");
}
// Import CTI
if ($multiP && !isset($cti_args->args["--fusion_only"]) && (isset($cti_args->args["-p1"]) || !isset($cti_args->args["-p2"]))) {
logInfoMsg("___________________________________________");
logInfoMsg(">>> FUSION " . strtoupper($p1) . " (actuel) / " . strtoupper($p2) . " (ancien)");
logInfoMsg("");
logInfoMsg("___________________________________________");
logInfoMsg(">>> PREPARATION TRANSFORMATION " . strtoupper($p1));
logInfoMsg("");
changeSchemaName("rh", "rh_ori");
changeSchemaName("rh_$p1", "rh");
initialisationSchemas(0, '');
logInfoMsg("___________________________________________");
logInfoMsg(">>> TRANSFORMATION " . strtoupper($p1));
logInfoMsg("");
}
if (!isset($cti_args->args["--fusion_only"]) && (isset($cti_args->args["-p1"]) || !isset($cti_args->args["-p2"]))) {
extractionEnvironnement($p1, Environnement::getInstance()->getSiren(), $p1Start, $cti_args->args["-raz"]);
}
if ($multiP && !isset($cti_args->args["--fusion_only"]) && (isset($cti_args->args["-p1"]) || !isset($cti_args->args["-p2"]))) {
changeSchemaName("rh", "rh_$p1");
changeSchemaName("rh_ori", "rh");
}
if ($multiP && !isset($cti_args->args["--fusion_only"]) && (isset($cti_args->args["-p2"]) || !isset($cti_args->args["-p1"]))) {
logInfoMsg("___________________________________________");
logInfoMsg(">>> PREPARATION TRANSFORMATION " . strtoupper($p2));
logInfoMsg("");
changeSchemaName("rh", "rh_ori");
changeSchemaName("rh_$p2", "rh");
initialisationSchemas(1, $prefixes[($p2Histo ? $p1 : $p2)]);
if ($p2Histo) {
changeSchemaName("prod_$p1", "prod_rh_p1");
changeSchemaName("prod_$p2", "prod_$p1");
}
logInfoMsg("___________________________________________");
logInfoMsg(">>> TRANSFORMATION " . strtoupper($p2));
logInfoMsg("");
if (!isset($cti_args->args["--fusion_only"]) && (isset($cti_args->args["-p2"]) || !isset($cti_args->args["-p1"]))) {
extractionEnvironnement(($p2Histo ? $p1 : $p2), Environnement::getInstance()->getSiren2(), $p2Start, $cti_args->args["-raz"]);
}
changeSchemaName("rh", "rh_$p2");
changeSchemaName("rh_ori", "rh");
if ($p2Histo) {
changeSchemaName("prod_$p1", "prod_$p2");
changeSchemaName("prod_rh_p1", "prod_$p1");
}
}
// Fusion CTI
if ($multiP && !isset($cti_args->args["--no_fusion"])) {
logInfoMsg("___________________________________________");
logInfoMsg(">>> FUSION " . strtoupper($p1));
logInfoMsg("");
changeSchemaName("rh_$p1", "rh_src");
fusionEnvironnement($p1, 0, '', $p1Start);
changeSchemaName("rh_src", "rh_$p1");
logInfoMsg("___________________________________________");
logInfoMsg(">>> FUSION " . strtoupper($p2));
logInfoMsg("");
changeSchemaName("rh_$p2", "rh_src");
fusionEnvironnement($p2, 1, $prefixes[($p2Histo ? $p1 : $p2)], $p2Start, $p2End);
changeSchemaName("rh_src", "rh_$p2");
logInfoMsg("___________________________________________");
logInfoMsg(">>> POST-TRAITEMENTS FUSION");
logInfoMsg("");
postEnvironnement();
}
// Déconnexion BD
$iCTI_connexion->close();
// Calcul des Essentiels.
if ($cti_args->args['-e'] || $cti_args->args['--essentiels']) {
essentielCompute();
}
executeExpertControls($iCTI_connexion);
// nettoyage du cache
logInfoMsg("Nettoyage cache");
cleanAllCache("iCTI_rh", true);
} else {
logErrorMsg("Problème de chargement des données prestataire.");
}
logEndMsg();
/**
* ******************************************************
* FONCTIONS *
* ******************************************************
*/
function extractionEnvironnement($_rhProvider, $_siren, $_start, $_raz = false)
{
global $iCTI_connexion;
global $cti_args;
logInfoMsg("DEBUT RECUPERATION DE LA PRODUCTION " . strtoupper($_rhProvider));
$time = strtotime("-5 year", time());
$start = date("Y-m-d", $time);
// RHPROVIDER_START
if (strlen($_start) > 0) {
$start = $_start;
}
// Préparation
// Initiatlisation du tableau de paramètres
$environmentVars = array();
// Spécifique SHS (permet d'avoir des imports génériques indépendants du code client SHS).
if (strtolower($_rhProvider) === 'shs') {
$provider = Provider::createFromName($_rhProvider);
$extractionReportFile = $provider->getDataExtractionReportFile();
if (file_exists($extractionReportFile)) {
$dcpm = new DatabaseContentParametersManager($extractionReportFile);
$providerDatabaseParameters = $dcpm->getParameters();
// Générer les vues génériques
// Bibl. RH.
if ($providerDatabaseParameters['rhlib'] !== '') {
$environmentVars['rhlib'] = $providerDatabaseParameters['rhlib'];
$listViewsSql = "
SELECT table_name as tablename
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'prod_shs'
AND table_name ilike '" . $environmentVars['rhlib'] . "%'
GROUP BY 1
ORDER BY 1
";
$res = $iCTI_connexion->query($listViewsSql);
if ($res !== false) {
while ($prodShsTable = pg_fetch_assoc($res)) {
$createViewSql = "
DROP VIEW IF EXISTS prod_shs." . str_ireplace($environmentVars['rhlib'], 'rhlib', $prodShsTable["tablename"]) . "
;
CREATE VIEW prod_shs." . str_ireplace($environmentVars['rhlib'], 'rhlib', $prodShsTable["tablename"]) . " AS
SELECT * FROM prod_shs." . $prodShsTable["tablename"] . "
;
";
$iCTI_connexion->query($createViewSql);
}
}
}
// Bibl. RHDIF.
if ($providerDatabaseParameters['rhdiflib'] !== '') {
$environmentVars['rhdiflib'] = $providerDatabaseParameters['rhdiflib'];
$listViewsSql = "
SELECT table_name as tablename
FROM information_schema.columns
WHERE 1=1
AND table_schema = 'prod_shs'
AND table_name ilike '" . $environmentVars['rhdiflib'] . "%'
GROUP BY 1
ORDER BY 1
";
$res = $iCTI_connexion->query($listViewsSql);
if ($res !== false) {
while ($prodShsTable = pg_fetch_assoc($res)) {
$createViewSql = "
DROP VIEW IF EXISTS prod_shs." . str_ireplace($environmentVars['rhdiflib'], 'rhdiflib', $prodShsTable["tablename"]) . "
;
CREATE VIEW prod_shs." . str_ireplace($environmentVars['rhdiflib'], 'rhdiflib', $prodShsTable["tablename"]) . " AS
SELECT * FROM prod_shs." . $prodShsTable["tablename"] . "
;
";
$iCTI_connexion->query($createViewSql);
}
}
}
}
}
// Initialisation du requêteur
try {
$sqlOptions = array();
$environmentVars["FINESS"] = Environnement::getInstance()->getFiness();
if (strlen($_siren) > 0) {
$environmentVars["SIREN"] = $_siren;
}
$environmentVars["OPTRH_AVT_NATURE"] = 'false';
if (strtolower($OPTRH_AVT_NATURE) == '1') {
$environmentVars["OPTRH_AVT_NATURE"] = 'true';
}
$environmentVars["APP_ROOT"] = __ROOT__;
// Création d'une table SQL temporaire contenant les paramètres à passer à l'import RH.
// A appeler dans le SQL de la façon suivante : rhp('finess');
$sqlSiren = '';
if (isset($environmentVars["SIREN"])) {
foreach (explode(',', $_siren) as $siren) {
$sqlSiren .= "('siren'::text, '" . trim($siren) . "'::text)," . PHP_EOL;
}
}
$sqlEnt = '';
if (isset($environmentVars["entreprise"])) {
foreach ($environmentVars["entreprise"] as $ent) {
$sqlEnt .= "('entreprise'::text, '$ent'::text)," . PHP_EOL;
}
}
$tmpParamSql = "
DROP TABLE IF EXISTS rhp
;
CREATE TEMP TABLE rhp AS
VALUES
$sqlSiren
$sqlEnt
('finess'::text, '" . $environmentVars["FINESS"] . "'::text),
('opt_avt_nature'::text, '" . $environmentVars["OPTRH_AVT_NATURE"] . "'::text),
('rhprovider_start'::text, '" . $start . "'::text)
;
DROP FUNCTION IF EXISTS rhp(text)
;
CREATE FUNCTION rhp(text)
RETURNS text AS
\$BODY\$
SELECT column2 FROM rhp WHERE column1 = \$1
;
\$BODY\$
LANGUAGE 'sql' VOLATILE
;
DROP FUNCTION IF EXISTS rhp_in(text)
;
CREATE FUNCTION rhp_in(text)
RETURNS setof text AS
\$BODY\$
SELECT column2 FROM rhp WHERE column1 = \$1
;
\$BODY\$
LANGUAGE 'sql' VOLATILE
;
";
$iCTI_connexion->query($tmpParamSql);
foreach ($cti_args->args as $key => $value) {
$sqlOptions[] = $key;
}
$cti_sqlStatements = new CTI_SqlStatements_class("iCTI_import_rh_" . strtoupper($_rhProvider) . ".XML", $iCTI_connexion, $environmentVars, $sqlOptions, "iCTI_import_rh_SHARE.XML");
// Raz automatique le samedi
if (date("w") == 6) {
$_raz = "ONLYKEY";
}
if ($_raz) {
$cti_sqlStatements->executeStatementsNode("RAZ");
$cti_sqlStatements->executeStatementsNode("VACUUM");
}
$cti_sqlStatements->executeStatementsNode("INIT");
$cti_sqlStatements->executeStatementsNode("PROD");
$cti_sqlStatements->executeStatementsNode("POST");
$cti_sqlStatements->executeStatementsNode("VACUUM");
} catch (Exception $e) {
logErrorMsg("Impossible de charger les requêtes SQL.");
logEndMsg();
exit(1);
}
logInfoMsg("FIN RECUPERATION DE LA PRODUCTION " . strtoupper($_rhProvider));
}
function postEnvironnement()
{
global $iCTI_connexion;
global $cti_args;
$sqlOptions = array();
$environmentVars = array();
foreach ($cti_args->args as $key => $value) {
$sqlOptions[] = $key;
}
$sqlStatements = new CTI_SqlStatements_class("iCTI_import_rh_FUSION.XML", $iCTI_connexion, $environmentVars, $sqlOptions, "iCTI_import_rh_SHARE.XML");
$sqlStatements->executeStatementsNode("POST");
$sqlStatements->executeStatementsNode("VACUUM");
}
function essentielCompute()
{
logInfoMsg("Calcul des indicateurs essentiels RH.");
$exe = "..\..\outils\dashboard\iCTI_aggregateCtiIndicators.exe";
if (file_exists($exe)) {
$return = exec("$exe -m rh -e");
} else {
logErrorMsg("La fonction de calcul des essentiels RH est absente.");
}
}
function executeExpertControls($iCTI_connexion)
{
logInfoMsg("Contrôles expert");
$executeControlSql = "SELECT base.cti_calcul_expert_controls('rh', 0);";
$res = $iCTI_connexion->query($executeControlSql);
if ($res === false) {
logErrorMsg("Le traitement des contrôles experts a echoué");
}
}