<?php
//$Id: lot.class.php 4698 2015-04-30 16:17:47Z nmeucci $ 
//gen openMairie le 08/11/2012 14:59

require_once ("../gen/obj/lot.class.php");

class lot extends lot_gen {

    var $donnees_techniques;
    var $idDT;

    function lot($id,&$db,$debug) {
        $this->constructeur($id,$db,$debug);

    }// fin constructeur


    function triggerAjouterApres($id, &$db, $val, $DEBUG) {
        parent::triggerAjouterApres($id, $db, $val, $DEBUG);

        if($this->getParameter("idxformulaire") != "") {

            // Insertion du lien demandeur/lot
            require_once ("../obj/lien_lot_demandeur.class.php");
            $lld = new lien_lot_demandeur("]", $db, $DEBUG);
            $sqlDemandeur = "SELECT * FROM ".DB_PREFIXE."lien_dossier_demandeur 
                                WHERE dossier='".$this->getParameter("idxformulaire")."'";
            $res = $db->query($sqlDemandeur);
            $this->f->addToLog("triggerAjouterApres() : db->query(\"".$sqlDemandeur."\");", VERBOSE_MODE);
            if ( database::isError($res)){
                die();
            }
            while($row = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                unset($row['lien_dossier_demandeur']);
                unset($row['dossier']);
                $row['lien_lot_demandeur'] = "";
                $row['lot'] = $this->valF["lot"];
                $lld->ajouter($row, $db, $DEBUG);
            }
        }
    }

    /**
     * Cache le champ dossier_autorisation
     */
    function setType(&$form,$maj) {
        parent::setType($form,$maj);
        
        $form->setType('dossier_autorisation', 'hidden');
        $form->setType('dossier','hidden');
    }


    /**
     * Permet d'affecter des valeurs aux champs de sous formulaires
     */
    function setValsousformulaire(&$form,$maj,$validation,$idxformulaire,$retourformulaire,$typeformulaire,&$db,$DEBUG=null){
        $this->retourformulaire = $retourformulaire;
        if($validation == 0) {
            if($retourformulaire =='dossier'
                    || $this->getParameter("retourformulaire") == "dossier_instruction"
                    || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
                    || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
                    || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
                    || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures") {
                $form->setVal('dossier', $idxformulaire);
            }
            if($retourformulaire =='dossier_autorisation')
                $form->setVal('dossier_autorisation', $idxformulaire);
        }// fin validation
    }// fin setValsousformulaire
    
    /**
     * Ajout de la liste des demandeurs
     */
    function sousformSpecificContent($maj) {

        //En consultation
        if ( $maj == 3 ){
            
            //Récupère la liste des demandeurs
            $sql = "SELECT
                        civilite.code as code, 
                        CASE WHEN demandeur.qualite='particulier' 
                            THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom)) 
                            ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination)) 
                        END as nom,
                        lien_lot_demandeur.petitionnaire_principal as petitionnaire_principal,
                        demandeur.type_demandeur as type_demandeur
                    FROM
                        ".DB_PREFIXE."lien_lot_demandeur
                    LEFT JOIN
                        ".DB_PREFIXE."demandeur
                        ON
                            lien_lot_demandeur.demandeur = demandeur.demandeur
                    LEFT JOIN
                        ".DB_PREFIXE."civilite
                        ON
                            demandeur.particulier_civilite = civilite.civilite OR
                            demandeur.personne_morale_civilite = civilite.civilite
                    WHERE lien_lot_demandeur.lot = ".$this->val[array_search('lot', $this->champs)]."
                    ORDER BY demandeur.type_demandeur DESC";
                    
            $res = $this->f->db->query($sql);
            $this->f->addToLog("sousformSpecificContent() : db->query(\"".$sql."\")");
            if ( database::isError($res)){
                die();
            }
            
            //Affichage des données
            echo "<div class=\"field field-type-static\">";
                echo "<div class=\"form-libelle\">";
                    echo "<label id=\"lib-libelle\" class=\"libelle-demandeur\" for=\"demandeur\">";
                        echo _("demandeur");
                    echo "</label>";
                echo "</div>";
                echo "<div class=\"form-content\">";
                    echo "<span id=\"demandeur\" class=\"field_value\">";
            
                        $listDemandeur = "";
                        //La liste des demandeurs
                        while($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
                     
                            //Ordonne l'affichage des demandeur
                            if ( $row['petitionnaire_principal'] == 't' ){
                                
                                $listDemandeur =  $row['code']. " " . $row['nom'] . ", " . _("petitionnaire principal") . "<br/>".$listDemandeur;
                            }
                            else {
                                
                                $listDemandeur .=  $row['code']. " " . $row['nom'] . ", " . $row['type_demandeur'] . "<br/>";
                            }
                        }
                        echo $listDemandeur;
                    echo "</span>";
                echo "</div>";
            echo "</div>";
        }
    }

    /**
     * Surcharge pour gérer les actions disponibles dans le portlet
     */
    function checkAccessibility() {
        //
        parent::checkAccessibility();
        
        $idxformulaire = $this->getParameter("idxformulaire");
        $retourformulaire = $this->getParameter("retourformulaire");
        //Si le dossier d'instruction auquel est rattaché le lot est 
        //cloturé, on affiche pas les liens du portlet
        if ( $idxformulaire != '' && 
            (
                $retourformulaire == 'dossier' ||
                $retourformulaire == 'dossier_instruction' ||
                $retourformulaire == 'dossier_instruction_mes_encours' ||
                $retourformulaire == 'dossier_instruction_tous_encours' ||
                $retourformulaire == 'dossier_instruction_mes_clotures' ||
                $retourformulaire == 'dossier_instruction_tous_clotures'
            )){
                
            //On récuppère le statut du dossier d'instruction        
            $statut = $this->f->getStatutDossier($idxformulaire);
            if ( $this->f->isUserInstructeur() && $statut == "cloture" ){
                
                //On cache le lien de modification
                $this->parameters["actions"]["modifier"] = NULL;
                $this->parameters["actions"]["supprimer"] = NULL;
                $this->actions_sup["transferer"] = NULL;
                
                //Si le dossier lié n'a pas de données techniques
                if ( !$this->hasDonneesTechniquesDossier($idxformulaire) ){
                    $this->actions_sup["editer_donnees"] = NULL;
                }
            }
        }

        /*
         * Si l'utilisateur est un instructeur sans bypass sur l'action et si
         * sa division ne correspond pas à celle du dossier alors on n'affiche
         * pas cette action dans le portlet.
         */

        $instr_with_different_div = false;
        if ($this->f->isUserInstructeur()
            && isset($this->f->om_utilisateur["division"])
            && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) {
            $instr_with_different_div = true;
        }

        // MODIFIER
        if ($this->f->can_bypass("lot", "modifier") == false
            && $instr_with_different_div == true) {
            //
            $this->parameters["actions"]["modifier"] = NULL;
        }
        // SUPPRIMER
        if ($this->f->can_bypass("lot", "supprimer") == false
            && $instr_with_different_div == true) {
            //
            $this->parameters["actions"]["supprimer"] = NULL;
        }
        // TRANSFERER
        if ($this->f->can_bypass("lot", "transferer") == false
            && $instr_with_different_div == true) {
            //
            unset($this->actions_sup["transferer"]);
        }
        // EDITER DONNEES TECHNIQUES
        if ($this->f->can_bypass("lot", "editer_donnees") == false
            && $instr_with_different_div == true) {
            //
            unset($this->actions_sup["editer_donnees"]);
        }
    }
    
    /**
     * Cette methode est à surcharger elle permet de tester dans chaque classe
     * des droits spécifiques en fonction des données
     */
    function canAccess() {

        $retourformulaire = $this->getParameter("retourformulaire");
        // Si l'utilisateur est un instructeur et que le dossier est cloturé
        if ( $this->f->isUserInstructeur() && 
            $this->f->getStatutDossier($this->getParameter("idxformulaire")) == "cloture" && 
            (
                $retourformulaire == 'dossier' ||
                $retourformulaire == 'dossier_instruction' ||
                $retourformulaire == 'dossier_instruction_mes_encours' ||
                $retourformulaire == 'dossier_instruction_tous_encours' ||
                $retourformulaire == 'dossier_instruction_mes_clotures' ||
                $retourformulaire == 'dossier_instruction_tous_clotures'
            ) && $this->getParameter("maj") != 3) {
            
            return false;
        }

        // Récupération du bypass adéquat
        // XXX - actions spécifiques non testées
        $bypass = false;
        if (($this->f->can_bypass("lot", "ajouter") == true && $this->getParameter("maj") == 0)
            || ($this->f->can_bypass("lot", "modifier") == true && $this->getParameter("maj") == 1)
            || ($this->f->can_bypass("lot", "supprimer") == true && $this->getParameter("maj") == 2)) {
            $bypass = true;
        }
        // Si, hors mode consulter, l'utilisateur est un instructeur sans bypass
        // dont la division ne correspond pas à celle du dossier
        if ($this->getParameter("maj") != 3 && $bypass == false && $this->f->isUserInstructeur()
            && $this->f->om_utilisateur["division"] != $this->getDivisionFromDossier()) {
            //
            return false;
        }
        //
        return true;
    }
    
    /**
     * Retourne true s'il y a des données techniques lié au dossier d'instruction
     * @param string $idx Identifiant du dossier d'instruction
     * @return boolean S'il y a des données techniques
     */
    function hasDonneesTechniquesDossier($idx){
        
        //Si l'identifiant du dossier d'instruction founi est correct
        if ( $idx != '' ){
            
            //On récupère le statut de l'état du dossier d'instruction à partir de 
            //l'identifiant du dossier
            $sql = "SELECT donnees_techniques.donnees_techniques
                FROM ".DB_PREFIXE."donnees_techniques
                LEFT JOIN
                    ".DB_PREFIXE."dossier
                    ON
                        donnees_techniques.dossier_instruction = dossier.dossier
                WHERE dossier.dossier = '".$idx."'";
            $donnees_techniques = $this->db->query($sql);
            $this->f->addToLog("hasDonneesTechniquesDossier() : db->query(\"".$sql."\")", VERBOSE_MODE);
            if ( database::isError($donnees_techniques)){
                die();
            }
            
            if ( $donnees_techniques->numRows() > 0 ){
                return TRUE;
            }
        }
        return FALSE;
    }

    /**
     * Cette variable permet de stocker le résultat de la méthode
     * getDivisionFromDossier() afin de ne pas effectuer le recalcul à chacun de
     * ces appels.
     * @var string Code de la division du dossier en cours
     */
    var $_division_from_dossier = NULL;

    /**
     * Cette méthode permet de récupérer le code de division correspondant
     * au dossier sur lequel on se trouve.
     *
     * @return string Code de la division du dossier en cours
     */
    function getDivisionFromDossier() {

        // Cette méthode peut être appelée plusieurs fois lors d'une requête.
        // Pour éviter de refaire le traitement de recherche de la division
        // alors on vérifie si nous ne l'avons pas déjà calculé.
        if ($this->_division_from_dossier != NULL) {
            // Logger
            $this->addToLog("getDivisionFromDossier(): retour de la valeur déjà calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
            // On retourne la valeur déjà calculée
            return $this->_division_from_dossier;
        }

        // Par défaut, on définit la valeur du dossier à NULL
        $dossier = NULL;
        // Test sur le mode et le contexte du formulaire
        if ($this->getParameter("maj") == 0
            && ($this->getParameter("retourformulaire") == "dossier"
                || $this->getParameter("retourformulaire") == "dossier_instruction"
                || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
                || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
                || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
                || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures")) {
            // Si on se trouve en mode AJOUT (seul mode où l'enregistrement
            // n'existe pas en base de données) ET que nous nous trouvons
            // dans le contexte d'un dossier d'instruction alors on récupère
            // le numéro de dossier depuis le paramètre 'idxformulaire'
            $dossier = $this->getParameter("idxformulaire");
        } else {
            // Sinon on récupère le numéro de dossier dans le champs dossier de
            // l'enregistrement (en base de données)
            $dossier = $this->getVal("dossier");
        }

        // On appelle la méthode de la classe utils qui renvoi le code de la
        // division d'un dossier, on la stocke pour ne pas refaire le calcul au
        // prochain appel de cette méthode
        $this->_division_from_dossier = $this->f->getDivisionFromDossier($dossier);
        // Logger
        $this->addToLog("getDivisionFromDossier(): retour de la valeur nouvellement calculée - '".$this->_division_from_dossier."'", EXTRA_VERBOSE_MODE);
        // On retourne la valeur retournée
        return $this->_division_from_dossier;

    }
}// fin classe
?>