<?php
/**
 * Ce script définit la classe 'om_dbform'.
 *
 * @package opencimetiere
 * @version SVN : $Id: om_dbform.class.php 2045 2013-01-22 14:03:35Z jbastide $
 */

require_once PATH_OPENMAIRIE."om_dbform.class.php";

/**
 * Définition de la classe 'om_dbform' (om_dbform).
 *
 * Cette classe permet la surcharge de certaines méthodes de
 * la classe om_dbform du framework pour des besoins spécifiques
 * de l'application.
 */
class om_dbform extends dbForm {


    /**
     * Retourne la collectivité de l'objet métier.
     * 
     * Gère 3 cas :
     * - Cas 1 : L'objet a un champ om_collectivite direct
     * - Cas 2 : L'objet a une relation vers un emplacement (qui a om_collectivite)
     * - Cas 3 : L'objet nécessite une requête SQL personnalisée (à surcharger)
     * - Cas 4 : Tables de référence sans collectivité (retourne la collectivité de l'utilisateur)
     * 
     * @return int|null L'identifiant de la collectivité ou null
     */
    function get_collectivite() {
        // Cas 1 : L'objet a directement un champ om_collectivite
        if (in_array("om_collectivite", $this->champs)) {
            return $this->getVal("om_collectivite");
        }
        
        // Cas 2 : L'objet a un champ emplacement (relation indirecte)
        if (in_array("emplacement", $this->champs) && $this->exists() === true) {
            $emplacement_id = $this->getVal("emplacement");
            if ($emplacement_id !== null && $emplacement_id !== "") {
                $inst_emplacement = $this->f->get_inst__om_dbform(array(
                    "obj" => "emplacement",
                    "idx" => $emplacement_id,
                ));
                return $inst_emplacement->getVal("om_collectivite");
            }
        }
        
        // Cas 3 : Tables de référence ou objets sans lien avec une collectivité
        // On retourne la collectivité de l'utilisateur connecté
        // Cela permet aux tables partagées (sepulture_type, zone_type, etc.) 
        // d'être accessibles à tous les utilisateurs
        return $_SESSION["collectivite"];
    }

    /**
     * CONDITION - is_user_from_allowed_collectivite.
     *
     * Cette condition permet de vérifier si l'utilisateur connecté appartient
     * à une collectivité autorisée : c'est-à-dire de niveau 2 ou identique à
     * la collectivité de l'enregistrement sur lequel on se trouve.
     *
     * @return boolean
     */
    function is_user_from_allowed_collectivite() {

        // Si l'utilisateur est de niveau 2
        if ($_SESSION["niveau"] == "2") {
            // Alors l'utilisateur fait partie d'une collectivité autorisée
            return true;
        }

        // L'utilisateur est donc de niveau 1
        // On vérifie donc si la collectivité de l'utilisateur est la même
        // que la collectivité de l'élément sur lequel on se trouve
        if ($_SESSION["collectivite"] === $this->get_collectivite()) {
            // Alors l'utilisateur fait partie d'une collectivité autorisée
            return true;
        }

        // L'utilisateur ne fait pas partie d'une collectivité autorisée
        return false;
    }

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

        // ACTION - 001 - modifier
        $this->class_actions[1]["condition"][] = "is_user_from_allowed_collectivite";

        // ACTION - 002 - supprimer
        $this->class_actions[2]["condition"][] = "is_user_from_allowed_collectivite";

        // ACTION - 003 - consulter
        $this->class_actions[3]["condition"][] = "is_user_from_allowed_collectivite";
    }
    /**
     *
     */
    function get_values_substitution_vars($om_collectivite_idx = null) {
        //
        $values = parent::get_values_substitution_vars($om_collectivite_idx);
        //
        $values["aujourdhui"] = date("d/m/Y");
        $values["aujourdhui_lettre"] = strftime("%d %B %Y");
        //
        return $values;
    }

    /**
     *
     */
    function get_labels_substitution_vars($om_collectivite_idx = null) {
        //
        $labels = parent::get_labels_substitution_vars($om_collectivite_idx);
        //
        $labels["specifique"]["logo(id=identifiant-logo)"] = __("Intégration d'une image disponible dans le paramétrage des logos à partir de son identifiant");
        $labels["divers"]["aujourdhui"] = __("Date du jour (Format : 14/01/1978)");
        $labels["divers"]["aujourdhui_lettre"] = __("Date du jour (Format : 14 janvier 1978)");
        //
        return $labels;
    }

    /**
     * @return string
     */
    function get_om_etat_id() {
        return "cette_edition_n_existe_pas";
    }

    /**
     * VIEW - view_pdf_edition.
     *
     * @return void
     */
    function view_pdf_edition_etat() {
        $this->checkAccessibility();
        // Génération du PDF
        $pdfedition = $this->compute_pdf_output(
            "etat",
            $this->get_om_etat_id(),
            null,
            $this->getVal($this->clePrimaire)
        );
        // Affichage du PDF
        $this->expose_pdf_output(
            $pdfedition['pdf_output'],
            $pdfedition['filename']
        );
        return;
    }

    /**
     * @return string
     */
    function get_default_om_sig_map() {
        return $this->table;
    }

    /**
     * VIEW - view_om_sig_map.
     *
     * @return void
     */
    function view_om_sig_map() {
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "top",
        ));
        $this->retour();
        $this->f->layout->display__form_controls_container__end();
        //
        $form = $this->f->get_inst__om_formulaire();
        $form->entete();
        $this->form_specific_content_before_portlet_actions(13);
        printf(
            '<iframe id="emplacement_map" style="width:100%%;border: 0 none; height: 780px;" src="%s"></iframe>',
            OM_ROUTE_MAP."&mode=tab_sig&obj=".$this->get_default_om_sig_map()."&idx=".$this->getVal($this->clePrimaire)."&popup=1"
        );
        $form->enpied();
        //
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "bottom",
        ));
        $this->retour();
        $this->f->layout->display__form_controls_container__end();
    }

    function view_consulter() {
        $this->checkAccessibility();
        // Récupération maj et crud
        $maj = $this->getParameter("maj");
        $crud = $this->get_action_crud($maj);
        // Affichage du message avant d'afficher le formulaire
        $this->message();
        // Affichage du lien retour
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "top",
        ));
        $this->retour(
            $this->getParameter("premier"),
            $this->getParameter("recherche"),
            $this->getParameter("tricol")
        );
        $this->f->layout->display__form_controls_container__end();
        // Instanciation de l'objet formulaire
        $form = $this->f->get_inst__om_formulaire(array(
            "validation" => $this->getParameter("validation"),
            "maj" => $maj,
            "champs" => $this->champs,
            "val" => $this->val,
            "max" => $this->longueurMax,
        ));
        // Ouverture du conteneur de formulaire
        $form->entete();
        // Point d'entrée dans le formulaire pour ajout d'éléments spécifiques
        $this->form_specific_content_before_portlet_actions($maj);
        // Composition du tableau d'action à afficher dans le portlet
        $this->compose_portlet_actions();
        // Affichage du portlet d'actions s'il existe des actions
        if (!empty($this->user_actions)) {
            $form->afficher_portlet(
                $this->getParameter("idx"),
                $this->user_actions
            );
        }
        // Point d'entrée dans le formulaire pour ajout d'éléments spécifiques
        $this->form_specific_content_after_portlet_actions($maj);
        //
        $this->display__view_consulter_content();
        // Fermeture du conteneur de formulaire
        $form->enpied();
        // Affichage du lien retour
        $this->f->layout->display__form_controls_container__begin(array(
            "controls" => "bottom",
        ));
        $this->retour(
            $this->getParameter("premier"),
            $this->getParameter("recherche"),
            $this->getParameter("tricol")
        );
        $this->f->layout->display__form_controls_container__end();
    }
}
