<?php
$MODULE="RH";
$TITLE="Récupération Planning";
$DFTENDSTATUS="OK";
$ARGS="-noactualizeprod -raz";
/** Laisser les lignes 2 à 5 sans changer la casse et sans espaces et dans cet ordre
 * car le script est lu et analysé quand il est exécuté via .exe ou Jenkins
 * pour gestion des fichiers .pid dans system\batch\logs
 */

set_time_limit(0);

define('__ROOT__', dirname(dirname(dirname(dirname(__FILE__)))));
require_once __ROOT__.'/modules/base/php/lib/cti/Batch/iCTI_batch_common.php';
require_once __ROOT__.'/modules/base/php/classSimpleXML.php';
require_once __ROOT__.'/modules/outils/php/httpService_cacheManager_cleanCache.php';
require_once __ROOT__.'/modules/base/php/lib/cti/Database/Database2Factory.class.php';
require_once __ROOT__.'/modules/base/php/lib/cti/Environnement/Environnement.class.php';
require_once __ROOT__.'/modules/base/php/Features/FeaturesManager.php';

global $ENDSTATUS;
global $iCTI_connexion;
global $iCTI_cache;
global $cti_args;
global $cti_sqlStatements;
global $ENV_TYPEETS;
global $ENV_FINESS;
global $ENV_SIREN;
global $p1;
global $nbE;

$multiP = Environnement::getInstance()->hasPlanningProvider2();
$p1 = Environnement::getInstance()->getPlanningProvider();
$p2 = Environnement::getInstance()->getPlanningProvider2();

$p1Start = Environnement::getInstance()->getPlanningProviderStart();
if ($p1Start == '') {
    $p1Start = Environnement::getInstance()->getRhProviderStart();
}
$p2Start = Environnement::getInstance()->getPlanningProvider2Start();
$tmpDate = date_create($p1Start);
date_modify($tmpDate, '-1 day');
$p2End = date_format($tmpDate, 'Y-m-d');


logStartMsg();

// Chargement des paramètres et connexion BD
$iCTI_connexion = Database2Factory::getInstance(Environnement::PROVIDER_CTI);
$ret = $iCTI_connexion->connect();

// Récupération des arguments passés en paramètres
$cti_args = new CTI_Args_class();

if (checkLoadedData($p1, $MODULE) === 0 || $cti_args->args["-f"]) {
    logInfoMsg("Données prestataire $p1 chargées avec succès.");

    // import CTI
    extraction_environnement($p1, $p1Start);

} else {
    logErrorMsg("Problème de chargement des données prestataire $p1.");
}

if ($multiP) {
    if (checkLoadedData($p2, $MODULE) === 0 || $cti_args->args["-f"]) {
        logInfoMsg("Données prestataire $p2 chargées avec succès.");

        // import CTI
        extraction_environnement($p2, $p2Start, $p2End);

    } else {
        logErrorMsg("Problème de chargement des données prestataire $p2.");
    }
}

// Croisement Paie Planning
// Gestion des FEATURES
try {
    $FM = new FeaturesManager();
    $activatedFeatures = $FM->getActivatedFeatures();
} catch(Exception $e) {
    // Si l'exception est la non présence de FEATURES alors on passe simplement
    // Pour les autres exceptions, c'est donc une exception à signaler
    if($e->getMessage() !== FeaturesManager::FEATURES_MANAGER_NO_FEATURES_EXCEPTION) {
        logErrorMsg("Erreur lors de la gestion des features : ".$e->getMessage());
    }
    $activatedFeatures = array();
}

if(in_array('RH_CROISEMENT_PAIE_PLANNING',$activatedFeatures)) {
	$iCTI_connexion->query('SELECT rh.cti_croisement_paie_planning_generate()');
}

// nettoyage du cache
logInfoMsg("Nettoyage cache");
cleanAllCache("iCTI_rh", TRUE);

// Déconnexion BD
$iCTI_connexion->close();

logEndMsg();

/**
 * ******************************************************
 * FONCTIONS *
 * ******************************************************
 */


// récupération historique
function extraction_environnement($_prestataire, $_start, $_end = '2099-12-31') {
    global $cti_sqlStatements;
    global $cti_args;
    global $iCTI_connexion;

    try {
        logInfoMsg("RECUPERATION DE LA PRODUCTION $_prestataire (de $_start à $_end)");
    
        // Raz automatique le samedi
        if (date("w") == 6) {
            $cti_args->args["-raz"] = "ONLYKEY";
        }

        $environmentVars = array();
        $environmentVars["ENV_PLANNING_DATEDEBUT"] = $_start;
        $environmentVars["ENV_PLANNING_DATEFIN"] = $_end;

        $environmentVars["FINESS"] = Environnement::getInstance()->getFiness();
        $environmentVars["SIREN"] = Environnement::getInstance()->getSiren();
        $environmentVars["OPTRH_AVT_NATURE"] = Environnement::getInstance()->getOptAvantageNature();

        // 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');

        $tmpParamSql = "
        DROP TABLE IF EXISTS rhp
        ;
        CREATE TEMP TABLE rhp AS
        VALUES
        	('siren'::text,  '" . trim($environmentVars["SIREN"]) . "'::text),
    	    ('finess'::text, '" . $environmentVars["FINESS"] . "'::text),
			('opt_avt_nature'::text,  '" . $environmentVars["OPTRH_AVT_NATURE"] . "'::text),
            ('planningprovider_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);
    
        $sqlOptions = array();
        foreach ($cti_args->args as $key => $value) {
            $sqlOptions[] = $key;
        }

        $cti_sqlStatements = new CTI_SqlStatements_class("iCTI_import_planning_".$_prestataire.".XML", $iCTI_connexion, $environmentVars, $sqlOptions, "iCTI_import_planning_SHARE.XML", "iCTI_import_rh_SHARE.XML");
    
        if ($cti_args->args["-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");
        $cti_sqlStatements->executeStatementsNode("VENTILATION");
    } catch (Exception $e) {
        logErrorMsg("Impossible de charger les requêtes SQL.");
        exit(1);
    }

    logEndMsg();
}

?>