<?php
/**
 * Contient la classe SynchronisationContrainte
 *
 * @package openfoncier
 * @version SVN : $Id: synchronisationContrainte.class.php 6066 2016-03-01 11:11:26Z nhaye $
 */

/**
 * Cette classe permet la synchronisation des contraintes 
 * du SIG et de l'application
 */
class SynchronisationContrainte {

    /**
     * Instance de la classe Utils
     * @var object
     */
    var $f = null;
    /**
     * Retour du SOAP
     * @var array
     */
    var $execute = array();
    /**
     * Liste des contraintes récupérées du SIG
     * @var array
     */
    var $listContraintesSIG = array();
    /**
     * Liste des contraintes de la base de données
     * @var array
     */
    var $listContraintesBDD = array();
    /**
     * Liste des contraintes "à archiver"
     * @var array
     */
    var $listContraintesArchive = array();
    /**
     * Liste des contraintes "à ajouter"
     * @var array
     */
    var $listContraintesAdd = array();
    /**
     * Liste des contraintes "à modifier"
     * @var array
     */
    var $listContraintesEdit = array();
    /**
     * Liste des contraintes récupérées du SIG (seulement l'identifiant)
     * @var array
     */
    var $listContraintesSIGIdContrainte = array();
    /**
     * Code HTTP de la réponse SOAP
     * @var string
     */
    var $responseHTTP = null;
    /**
     * Message d'erreur de la réponse SOAP
     * @var string
     */
    var $errorMessage = null;

    /**
     * Constructeur
     * @param object $f Instance de la classe Utils
     */
    public function __construct($f, $collectivite) {
        // Initialise $this->f
        $this->f = $f;
        // Permet lors de l'instantiation d'objets métiers d'avoir accès à f
        $GLOBALS['f'] = $this->f;

        //
        require_once "../obj/geoads.class.php";
        // Instance geoads
        $geoads = new geoads($collectivite);
        // Intérogation du web service du SIG
        $this->listContraintesSIG = $geoads->recup_toutes_contraintes();
        //
    }

    /**
     * Destructeur
     */
    public function __destruct() {
        // Détruit l'instance de la classe Utils
        // unset($this->f);
        // // Détruis l'accès à la classe Utils
        // unset($GLOBALS['f']);
    }

    /**
     * Remplit toutes les listes de contrainte
     */
    public function setAllListContraintes() {
        //
        $this->setListContraintesBDD();
        //
        $this->setListContraintesAdd();
        //
        $this->setListContraintesEdit();
        //
        $this->setListContraintesSIGIdContrainte();
        //
        $this->setListContraintesArchive();
    }

    /**
     * Retourne la list des contraintes récupérées du SIG
     * @return array Liste des contraintes
     */
    public function getListContraintesSIG() {
        //
        return $this->listContraintesSIG;
    }

    /**
     * Remplit la valeur de la réponse HTTP
     * @param string $responseHTTP Réponse HTTP de la classe MessageSenderSOAP
     */
    private function setResponseHTTP($responseHTTP) {
        //
        $this->responseHTTP = $responseHTTP;
    }

    /**
     * Retourne le code réponse HTTP
     * @return string Code réponse HTTP
     */
    public function getResponseHTTP() {
        //
        return $this->responseHTTP;
    }

    /**
     * Remplit la valeur du message d'erreur
     * @param string $errorMessage Message d'erreur renvoyé par la classe MessageSenderSOAP
     */
    public function setErrorMessage($errorMessage){
        $this->errorMessage = $errorMessage;
    }

    /**
     * Retourne le message d'erreur
     * @return string Message d'erreur
     */
    public function getErrorMessage(){
        return $this->errorMessage;
    }

    /**
     * Remplit la liste des contraintes récupérées de la base de données
     */
    public function setListContraintesBDD() {

        // Initialisation résultat
        $resultArray = array();

        // Requête SQL
        $sql = "SELECT numero
                FROM ".DB_PREFIXE."contrainte
                WHERE reference = 't'
                AND om_validite_fin IS NULL";
        $this->f->addToLog("getListContraintes() : db->query(\"".$sql."\")", VERBOSE_MODE);
        $res = $this->f->db->query($sql);
        $this->f->isDatabaseError($res);

        // Tableau des résultats
        while ($row = &$res->fetchRow(DB_FETCHMODE_ASSOC)) {
            $resultArray[] = $row['numero'];
        }

        //
        $this->listContraintesBDD = $resultArray;
    }

    /**
     * Retourne la liste des contraintes récupérées de la base données
     * @return array 
     */
    public function getListContraintesBDD() {
        //
        return $this->listContraintesBDD;
    }

    /**
     * Remplit la liste des contraintes récupérées du SIG 
     * (seulement les identifiants)
     */
    public function setListContraintesSIGIdContrainte() {

        // Pour chaque contraintes récupérées
        foreach ($this->getListContraintesSIG() as $key => $contrainte) {
            // Met l'identifiant de la contrainte dans la liste
            $this->listContraintesSIGIdContrainte[] = $contrainte['contrainte'];
        }
    }

    /**
     * Retourne la liste des contraintes récupérées du SIG 
     * (seulement les identifiants)
     * @return array 
     */
    public function getListContraintesSIGIdContrainte() {
        //
        return $this->listContraintesSIGIdContrainte;
    }

    /**
     * Remplit la liste des contraintes "à ajouter"
     */
    public function setListContraintesAdd() {
        // Pour chaque contraintes récupérées
        foreach ($this->listContraintesSIG as $key => $contrainte) {
            // Si la contrainte n'est pas dans la liste des contraintes de 
            // la base de données
            if (!in_array($contrainte['contrainte'], $this->listContraintesBDD)) {
                // Met la contrainte dans la liste des "à ajouter"
                $this->listContraintesAdd[] = $contrainte;
            }
        }
    }

    /**
     * Retourne la liste des contraintes "à ajouter"
     * @return array
     */
    public function getListContraintesAdd() {
        //
        return $this->listContraintesAdd;
    }

    /**
     * Ajoute les contraintes de la liste listContraintesAdd
     * @return boolean
     */
    public function addContraintes() {
        //
        $return = true;
        // Pour chaque contrainte "à ajouter"
        foreach ($this->listContraintesAdd as $key => $contrainte) {
            // Instancie la classe contrainte
            require_once "../obj/contrainte.class.php";
            $contrainteAdd = new contrainte("]", $this->f->db, DEBUG);
            // Définit les valeurs
            $val = array(
                'contrainte' => ']',
                'numero' => $contrainte['contrainte'],
                'nature' => 'PLU',
                'groupe' => $contrainte['groupe_contrainte'],
                'sousgroupe' => (isset($contrainte['sous_groupe_contrainte']))?$contrainte['sous_groupe_contrainte']:"",
                'libelle' => $contrainte['libelle'],
                'reference' => true,
                'texte' => null,
                'no_ordre' => null,
                'service_consulte' => false,
                'om_collectivite' => $_SESSION["collectivite"],
                'om_validite_debut' => null,
                'om_validite_fin' => null,
            );
            // Ajout de la contrainte
            $ajouter = $contrainteAdd->ajouter($val, $this->f->db, DEBUG);
            // Si la contrainte n'a pas été ajoutée
            if ($ajouter == false) {
                //
                $return = false;
            }
        }

        //
        return $return;
    }

    /**
     * Remplit la liste des contraintes "à modifier"
     */
    public function setListContraintesEdit() {

        // Pour chaque contraintes récupérées
        foreach ($this->listContraintesSIG as $key => $contrainte) {
            // Si la contrainte est dans la liste des contraintes de 
            // la base de données
            if (in_array($contrainte['contrainte'], $this->listContraintesBDD)) {
                // Met la contrainte dans la liste des "à modifier"
                $this->listContraintesEdit[] = $contrainte;
            }
        }
    }

    /**
     * Retourne la liste des contraintes "à modifier"
     * @return array
     */
    public function getListContraintesEdit() {
        //
        return $this->listContraintesEdit;
    }

    /**
     * Modifie les contraintes la liste listContraintesEdit
     * @return boolean
     */
    public function editContraintes() {
        //
        $return = true;
        // Si la liste des contraintes "à modifier" n'est pas vide
        if (!empty($this->listContraintesEdit)) {
            // Pour chaque contrainte "à modifier"
            foreach ($this->listContraintesEdit as $key => $contrainte) {
                // Récupère l'identifiant de la contrainte de l'application
                $contrainte['contrainte_bdd'] = $this->getContrainte($contrainte['contrainte']);
                // Instancie la classe contrainte
                require_once "../obj/contrainte.class.php";
                $contrainteEdit = new contrainte($contrainte['contrainte_bdd'], $this->f->db, DEBUG);
                // Déclare le tableau des valeurs
                $val = array();
                foreach ($contrainteEdit->champs as $key => $champ) {
                    $val[$champ] = $contrainteEdit->val[$key];
                }
                // Modifie les valeurs qui peuvent avoir subit une modification
                $val['groupe'] = $contrainte['groupe_contrainte'];
                $val['sousgroupe'] = (isset($contrainte['sous_groupe_contrainte']))?$contrainte['sous_groupe_contrainte']:"";
                $val['libelle'] = $contrainte['libelle'];
                // Modifie la contrainte
                $modifier = $contrainteEdit->modifier($val, $this->f->db, DEBUG);
                // Si la contrainte à été modifiée
                if ($modifier == false) {
                    //
                    $return = false;
                }
            }
        }
        //
        return $return;
    }

    /**
     * Remplit la liste des contraintes "à archiver"
     */
    public function setListContraintesArchive() {
        // Pour chaque contraintes de la base de données
        foreach ($this->getListContraintesBDD() as $key => $contrainte) {
            // Si la contrainte n'est pas dans la liste des contraintes récupérées
            if (!in_array($contrainte, $this->getListContraintesSIGIdContrainte())) {
                // Met la contrainte dans la liste des "à archiver"
                $this->listContraintesArchive[] = $contrainte;
            }
        }
    }

    /**
     * Retourne la liste des contraintes "à archiver"
     * @return array 
     */
    public function getListContraintesArchive() {
        //
        return $this->listContraintesArchive;
    }

    /**
     * Archive les contraintes de la liste listContraintesArchive
     * @return boolean 
     */
    public function archiveContraintes() {
        //
        $return = true;
        // Pour chaque contrainte "à archiver"
        foreach ($this->getListContraintesArchive() as $key => $contrainte) {
            // Récupère l'identifiant de la contrainte de l'application
            $contrainteId = $this->getContrainte($contrainte);
            // Instancie la classe contrainte
            require_once "../obj/contrainte.class.php";
            $contrainteArchive = new contrainte($contrainteId, $this->f->db, DEBUG);
            // Déclare le tableau des valeurs
            $val = array();
            // Récupération des valeurs
            foreach($contrainteArchive->champs as $id => $champ) {
                $val[$champ] = $contrainteArchive->val[$id];
            }
            // Met la date de fin de validité au jour pour archiver 
            $val['om_validite_fin'] = date('d/m/Y');
            // Modifie la contrainte
            $archiver = $contrainteArchive->modifier($val, $this->f->db, DEBUG);
            // Si la contrainte n'a pas été modifiée
            if ($archiver == false) {
                //
                $return = false;
            }
        }
        //
        return $return;
    }

    /**
     * Récupère l'identifiant d'un ccontrainte par rapport à son numéro
     * @param  string   $numero Identifiant unique de la contrainte sur le SIG
     * @return integer          Identifiant de la contrainte dans l'application    
     */
    private function getContrainte($numero) {

        // Initialisation résultat
        $contrainte = "";

        // Requête SQL
        $sql = "SELECT contrainte
                FROM ".DB_PREFIXE."contrainte
                WHERE numero = '".$numero."'";
        $this->f->addToLog("getContrainte() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
        $contrainte = $this->f->db->getOne($sql);
        $this->f->isDatabaseError($contrainte);

        // Retourne résultat
        return $contrainte;
    }
}

?>