<?php
//$Id$

if (file_exists("../gen/obj/lien_instruction_signataire_validateur.class.php")) {
    require_once "../gen/obj/lien_instruction_signataire_validateur.class.php";
} else {
    require_once PATH_OPENMAIRIE."gen/obj/lien_instruction_signataire_validateur.class.php";
}

class lien_instruction_signataire_validateur extends lien_instruction_signataire_validateur_gen {

    protected $_absolute_class_name = "lien_instruction_signataire_validateur";

    /**
     * Définition des actions disponibles sur la classe.
     *
     * @return void
     */
    function init_class_actions() {
        parent::init_class_actions();

        // ACTION - 115 - view_selection_validateurs
        $this->class_actions[390] = array(
            "identifier" => "selection_validateurs",
            "view" => "view_selection_validateurs",
            "permission_suffix" => "selection_validateurs",
        );
    }

    function get_var_sql_forminc__tableSelect() {
        return sprintf(
            '%1$s%2$s
            LEFT JOIN %1$ssignataire_arrete
                ON lien_instruction_signataire_validateur.signataire_arrete = signataire_arrete.signataire_arrete',
            DB_PREFIXE,
            $this->table
        );
    }

    function setSelect_validateurs(&$form, $maj) {
        // Récupération de l'identifiant d'instruction
        $instruction = intval($_GET['idx_instr'] ?? $_GET['idx'] );
        $sql_permissions = "
            SELECT signataire_arrete.signataire_arrete,
            CONCAT(
                signataire_arrete.nom, ' ', signataire_arrete.prenom,
                CASE 
                    WHEN signataire_arrete.qualite IS NOT NULL 
                        AND signataire_arrete.qualite <> '' 
                    THEN CONCAT(' (', signataire_arrete.qualite, ')') 
                    ELSE '' 
                END
            ) AS lib
            FROM ".DB_PREFIXE."signataire_arrete
            LEFT JOIN ".DB_PREFIXE."lien_instruction_signataire_validateur lien_instruction_signataire_validateur
            ON lien_instruction_signataire_validateur.signataire_arrete = signataire_arrete.signataire_arrete
            WHERE lien_instruction_signataire_validateur.signataire_arrete IS NULL
            AND signataire_arrete.habilitation_parapheur IN ('valider', 'valider_signer')
            ORDER BY lib
        ";

        // Seulement ceux déjà liés à cette instruction
        $sql_permissions_by_id = "
            SELECT signataire_arrete.signataire_arrete,
            CONCAT(
                signataire_arrete.nom, ' ', signataire_arrete.prenom,
                CASE 
                    WHEN signataire_arrete.qualite IS NOT NULL 
                        AND signataire_arrete.qualite <> '' 
                    THEN CONCAT(' (', signataire_arrete.qualite, ')') 
                    ELSE '' 
                END
            ) AS lib
            FROM ".DB_PREFIXE."signataire_arrete
            LEFT JOIN ".DB_PREFIXE."lien_instruction_signataire_validateur
                ON lien_instruction_signataire_validateur.signataire_arrete = signataire_arrete.signataire_arrete
            WHERE lien_instruction_signataire_validateur.signataire_arrete IS NULL
            AND signataire_arrete.habilitation_parapheur IN ('valider', 'valider_signer')
            AND lien_instruction_signataire_validateur.instruction = ".$_GET['idx']."
            ORDER BY lib
        ";
        
        // Remplit les deux colonnes de la dual-list
        $this->init_select($form, $this->f->db, $maj, null, "validateurs", $sql_permissions, $sql_permissions_by_id, false, true);

        if ($maj == 0 || $maj == 1) {
            array_shift($form->select["validateurs"][0]);
            array_shift($form->select["validateurs"][1]);
        }
    }
        /**
     *
     * @return string
     */
    function get_var_sql_forminc__selection() {
        return " GROUP BY lien_instruction_signataire_validateur.lien_instruction_signataire_validateur ";
    }

    /**
     * VIEW - view_selection_validateurs.
     *
     * Formulaire de sélection d'une liste ordonnéer de validateurs d'une instruction,
     * parmi les signataire_arrete disponibles
     *  
     * A la validation de ce formulaire :
     *  - Autant de lien_instruction_signataire_validateur sont crées
     *    dans la table, qu'il y a de validateurs sélectionnés
     *  - Un JSON ordonné, composé de tableaux associatifs des validateurs
     *    est ajouté à l'instruction
     *
     * @return void
     */
    function view_selection_validateurs() {
        // Vérification de l'accessibilité sur l'élément
        $this->checkAccessibility();
        $maj = $this->getParameter("maj");
        
        
        // Non affichage du fil d'ariane. /!\ la surcharge se fait
        // depuis la méthode getSubFormTitle en renseignant le numéro de l'action
        // dans la méthode puis en appellant la méthode
        $this->getSubFormTitle('');
        
        //
        // Traitement des données du formulaire
        //
        $postValues = $this->f->get_submitted_post_value();
        
        // Paramétrage du formulaire
        // a. Tableau de champs
        $champs = array('validateurs');
        // b. Instanciation du formulaire 
        $form = $this->f->get_inst__om_formulaire(array(
            "validation" => 0,
            "maj" => $this->getParameter("maj"),
            "champs" => $champs
        ));

        // Paramétrage du champs type 'file' pour téléverser le document signé
        $form->setLib('validateurs', __('Validateur(s)'));
        $form->setTaille('validateurs', 64);
        $form->setMax('validateurs', 30);
        $form->setVal('validateurs', '');
        $form->setType("validateurs", "select_multiple_validateurs");
        $this->setSelect_validateurs($form, 0);
        // Paramétrage du champs type 'date' afin de sélectionner une date de retour signature
       
        // Affichage message d'information :
        if ($postValues != null && is_array($postValues) && $postValues != array()) {
            
            $this->ajouter_validateurs($this->val);

            $error = false;
            $message = __("Le document a bien été mis à jour.");
            // On vérifie que le champs de fichier a bien été renseigné
            if (isset($postValues) !== false) {
                die;
            }
            if ($postValues['validateurs'] === '') {
                $error = true;
                $message = __("Le champs 'Validateurs' est obligatoire");
            } else {
                // $res = $this->treatment_document_sign($postValues);
                if ($res['error'] === true) {
                    $error = $res['error'];
                    $message = $res['msg'];
                }
            };

            // On affiche le message d'erreur/de succès.
            $typeMessage = $error ? 'error' : 'valid';
            $add_message = "";
            if ($error === false) {
                $add_message = $res['msg'];
            }
            $message = $message.$add_message;
            $this->f->displayMessage($typeMessage, $message.$add_message);

            if ($error === true) {
                $log_msg = __('Erreur lors de la sélection du fichier signé - id instruction : %s - uid fichier : %s');
                $this->addToLog(__METHOD__."(): ".sprintf($log_msg, $this->getVal($this->clePrimaire), $this->getVal('om_fichier_instruction')), DEBUG_MODE);
            } 
        }

        $qres = $this->f->get_all_results_from_db_query(
            sprintf(
                'SELECT signataire_arrete.signataire_arrete as value,
                CONCAT(signataire_arrete.nom, \' \', signataire_arrete.prenom, \' (\', signataire_arrete.qualite, \')\') AS text,
                lien_instruction_signataire_validateur.rang as rang
                FROM %1$ssignataire_arrete
                LEFT JOIN %1$slien_instruction_signataire_validateur
                ON lien_instruction_signataire_validateur.signataire_arrete = signataire_arrete.signataire_arrete
                WHERE lien_instruction_signataire_validateur.signataire_arrete IS NOT NULL
                AND lien_instruction_signataire_validateur.instruction = %2$d
                ORDER by rang',
                DB_PREFIXE,
                intVal($_GET['idx'])
            ),
            array(
                "origin" => __METHOD__,
            )
        );
        // Le dossier est déjà à l'ordre du jour
        if ($qres['row_count'] == 0) {
            $this->supprimer_tous_liens();
            $this->f->log(__METHOD__, "RESOULT ".var_export($qres['result'], true), "DEBUG", "custom");
        }

        $js_validateurs = json_encode($qres['result'], JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
        echo "<script>setup_submit_validateurs($js_validateurs);</script>";

        $this->afficher_formulaire_modale($form, $champs, "");
    }

    /**
     * Fonction générique de création de modale
     * 
     * @return void
     */
    protected function afficher_formulaire_modale(
        $form,
        $champs,
        $formOnsubmit = '',
        $valueBoutonValidation = 'Valider',
        $formAction = '',
        $formName = 'f2',
        $nameBoutonValidation = "submit-directory",
        $classBoutonValidation = "boutonFormulaire"
    ) {
        // Ouverture du formulaire
        $this->f->layout->display__form_container__begin(array(
            "action" => $formAction,
            "onsubmit" => $formOnsubmit,
            "name" => $formName,
        ));
        // Ouverture du conteneur de formulaire
        $form->entete();
        // Affichage des champs
        $form->afficher($champs, 0, false, false);
        // Fermeture du conteneur de formulaire
        $form->enpied();
        // Ouverture de la zone contenant le bouton de validation
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "bottom",
        ));
        // Affichage du bouton valider
        $this->f->layout->display__form_input_submit(array(
            "name" => $nameBoutonValidation,
            "value" => $valueBoutonValidation,
            "class" => $classBoutonValidation,
        ));
        // Fermeture de la zone contenant le bouton de validation
        $this->f->layout->display__form_controls_container__end();
        // Fermeture du formulaire
        $this->f->layout->display__form_container__end();
    }

    /** 
     * Supprime tous les liens de la table lien_instruction_signataire_validateur
     * pour l'instruction concernée
     * 
     * @param  $instruction_id  Identifiant de l'instruction
     * 
    **/
    function supprimer_tous_liens() {
        $instruction = intval($_GET['idx_instr'] ?? $_GET['idx']);
    
        // On vide d'abord les liaisons existantes pour cette instruction
        $this->db->query("
            DELETE FROM openads.lien_instruction_signataire_validateur
            WHERE instruction = $instruction
        ");
    }
    /**
     * Ajoute les validateurs en base de données :
     * - dans la table lien_instruction_signataire_validateur pour chaque validateur
     * - dans la table instruction sous la forme d'un JSON ordonné contenant
     *   les informations utiles au parapheur pour chaque validateur
     *   (prenom, nom, email)
     * 
     * @return void
     */
    function ajouter_validateurs($val = array(), &$dnu1 = null, $dnu2 = null) {
        $validateurs = $this->getPostedValues('validateurs');
        $instruction_id = intval($_GET['idx_instr']);
        $this->f->log(__METHOD__, "IDEA ".var_export($instruction_id, true), "DEBUG", "custom");
        // On vide d'abord les liaisons existantes pour cette instruction
        $this->supprimer_tous_liens();

        if (count($validateurs) > 0) {
            // Ajout des liens de la table lien_instruction_signataire_validateur pour chaque validateur
            foreach ($validateurs as $rang => $validateur) {
                if ($validateur != "") {
                    $donnees = array(
                        'lien_instruction_signataire_validateur' => $this->getVal('lien_instruction_signataire_validateur'),
                        'instruction' => $instruction_id,
                        'signataire_arrete' => intval($validateur),
                        'rang' => intval($rang)
                    );
                    
                    $add = $this->ajouter_lien_instruction_signataire_validateur($donnees);

                    if ($add === false) {
                        return false;
                    }
                }
            }

            if ($rang > 0) {
                if ($rang == 1) {
                    $this->addToMessage(__("Création de ").$rang.__(" nouvelle liaison réalisée avec succès."));
                } else {
                    $this->addToMessage(__("Création de ").$rang.__(" nouvelles liaisons réalisées avec succès."));
                }
            }
            return true;
        }

        return false;
    }

    /**
     * Récupération des valeurs postées
     *
     * @param string $champ Champ du formulaire.
     *
     * @return string
     */
    public function getPostedValues($champ) {
        
        // Récupération des demandeurs dans POST
        if ($this->f->get_submitted_post_value($champ) !== null) {
            
            return $this->f->get_submitted_post_value($champ);
        }
    }

    /**
     * Ajout d'un lien entre le type de document numérisé et le type
     * de dossier d'instruction
     *
     * @param mixed[] $data Couples document_numerise_type/type de dossier 
     *                      d'instruction à ajouter
     *
     * @return boolean
     */
    public function ajouter_lien_instruction_signataire_validateur($data) {
        //
        $lien_instruction_signataire_validateur = $this->f->get_inst__om_dbform(array(
            "obj" => "lien_instruction_signataire_validateur",
            "idx" => "]",
        ));
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                $val[$key] = $value;
            }
        }
        //
        $add = parent::ajouter($val);
        if ($add == false) {
            return false;
        }
        //
        return $add;
    }

}
