<?php
/**
 *
 * @package openmarchefor
 * @version SVN : $Id: sirene_alerte_recuperation.class.php 1103 2018-03-15 09:56:58Z lgroleau $
 */

require_once PATH_OPENMAIRIE.'../gen/obj/num_dossier.class.php';

/**
 * Classe gérant les erreurs rencontrées lors des traitements avec transaction.
 */
class treatment_exception extends Exception {
    
    /**
     * Construit l'exception
     *
     * @param string  $message  Le message de l'exception à lancer.
     * @param string  $log      Le message à logguer.
     */
    public function __construct($message, $log = null) {
        parent::__construct($message);
        if ($log !== null) {
            $this->log($log);
        }
    }
    
    /**
     * Cette fonction ajoute dans le message fourni dans le fichier de log.
     *
     * @param string $log  Le message a logger.
     */
    private function log($log) {
        require_once "../core/om_logger.class.php";
        logger::instance()->log($log);
    }
}

class num_dossier_recuperation extends num_dossier_gen {
    
    
    //
    // OVERRIDE
    //
    
    /**
     * Définition des actions disponibles sur la classe.
     *
     * @return void
     */
    function init_class_actions() {
        
        parent::init_class_actions();
        
        // ACTION - 000 - ajouter
        // Désactivation de l'action ajouter
        $this->class_actions[0] = null;
        
        // ACTION - 001 - modifier
        // Désactivation de l'action modifier
        $this->class_actions[1] = null;
        
        // ACTION - 002 - supprimer
        // Désactivation de l'action supprimer
        $this->class_actions[2] = null;
        
        // ACTION - 003 - consulter
        // Désactivation de l'action consulter
        $this->class_actions[3] = null;
        
        // ACTION - 004 - synchroniser
        // Synchronisation des contraintes
        $this->class_actions[4] = array(
                "identifier" => "dossier_recuperation",
                "view" => "view_dossier_recuperation",
                "permission_suffix" => "",
                "condition" => "",
        );
    }
    
    /*
     * Retour à la fonction générée
     */
    function getFormTitle($ent) {
        return $ent;
    }
    
    // FIN DE LA SURCHARGE
    
    //
    // VIEWS
    //
    
    /**
     * VIEW - view_mise_a_jour.
     *
     * Permet de mettre à jour les statuts des autorisations expirées
     * et leurs conséquences
     *
     * @return void
     */
    function view_dossier_recuperation() {
        // Vérification de l'accessibilité sur l'élément
        $this->checkAccessibility();
        
        // Traitement et affichage message si formulaire validé
        if ($this->f->get_submitted_post_value('valider_mise_a_jour') === 'oui') {
            //
            $this->begin_treatment_with_transaction(__METHOD__);
            //
            try {
                $this->recuperation();
                $this->end_treatment_with_transaction(__METHOD__);
            } catch (treatment_exception $e) {
                $this->addToMessage($e->getMessage());
                $this->end_treatment_with_transaction(__METHOD__, false);
            }
            //
            $this->display_msg();
        }
        
        // Formulaire de validation
        printf("<form method=\"POST\" action=\"\" name=\"f1\">");
        printf('<div class="formEntete ui-corner-all">');
        $this->f->displayDescription(__("Cette page permet de récupérer les dossiers présents dans OpenADS."));
        printf('<input type="hidden" name="valider_mise_a_jour" id="valider_mise_a_jour" value="oui" />');
        //
        printf("</div><div class=\"formControls\">");
        $btn = array(
                "value" => __("Récupération"),
                "name" => "btn_mise_a_jour"
        );
        $this->f->layout->display_form_button($btn);
        printf("</div></form>");
    }


    //
    // TREATMENTS
    //
    
    /**
     * TREATMENT - mise_a_jour.
     *
     * Mettre à jour le statut des arrêtés expirés et par suite
     * éventuellement dé-suspendre des arrêtés suspendus
     *
     * @param  array $val Valeurs soumises par le formulaire
     * @throws treatment_exception
     * @return void
     */
    function recuperation($val = array()) {

        // base SQL
        $base_sql = 
            "FROM ".DB_PREFIXE."demande
             LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille 
               ON demande.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
             LEFT JOIN ".DB_PREFIXE."demande_type  
               ON demande.demande_type = demande_type.demande_type
             LEFT JOIN ".DB_PREFIXE."lien_demande_demandeur
                ON demande.demande = lien_demande_demandeur.demande
                   AND lien_demande_demandeur.petitionnaire_principal
             LEFT JOIN ".DB_PREFIXE."demandeur 
               ON lien_demande_demandeur.demandeur = demandeur.demandeur
            WHERE NOT EXISTS (SELECT 1 FROM ".DB_PREFIXE."num_dossier 
                              WHERE num_dossier.ref = demande.dossier_instruction)
        ";
        

        // Requête de comptage sur la base
        //
        $sql = "SELECT COUNT(1) ".$base_sql;
        // requêtage
        $res = $this->f->db->getOne($sql);
        // Logger
        $this->f->addToLog(__METHOD__ . "(): db->getOne(\"" . $sql ." \");", VERBOSE_MODE);
        // gestion erreur
        if ($this->f->isDatabaseError($res, true)) {
            throw new treatment_exception(
                    __("Erreur de base de donnees. Contactez votre administrateur."),
                    __METHOD__.": ".$res->getMessage()
                    );
        }
        
        // nombre
        $nb_dossiers=intval($res);
            
        // Requête sur la base
        //
        $sql =  "INSERT INTO ".DB_PREFIXE."num_dossier (num_dossier, num_commande, ref, code, date_depot, petition)
            SELECT nextval('".DB_PREFIXE."num_dossier_seq')
                  ,demande.demande
                  ,demande.dossier_instruction
                  ,demande_type.code
                  ,demande.date_demande 
                  ,TRANSLATE(
                    CONCAT(
                        CASE demandeur.qualite
                            WHEN 'particulier' 
                            THEN CONCAT(demandeur.particulier_nom,' '||demandeur.particulier_prenom)

                            ELSE CONCAT(demandeur.personne_morale_denomination,' - '||demandeur.personne_morale_raison_sociale
                                , ' - ',demandeur.personne_morale_nom,' '||demandeur.personne_morale_prenom
                                )
                        END
                        ,' - '||COALESCE(demandeur.numero,'')||' '||demandeur.voie
                        ,' - '||demandeur.complement
                        ,' - '||demandeur.lieu_dit
                        ,' - BP '||demandeur.bp
                        ,' - ',COALESCE(demandeur.code_postal,'')||' '||demandeur.localite
                        ,' - Cedex '||demandeur.cedex
                        )
                    ,'âãäåÁÂÃÄÅèééêëÈÉÉÊËìíîïìÌÍÎÏÌóôõöÒÓÔÕÖùúûüÙÚÛÜç'
                    ,'aaaaAAAAAeeeeeEEEEEiiiiiIIIIIooooOOOOOuuuuUUUUc'
                    )
         ".$base_sql;
        // requêtage
        $res = $this->f->db->query($sql);
        // Logger
        $this->f->addToLog(__METHOD__ . "(): db->query(\"" . $sql ." \");", VERBOSE_MODE);
        // gestion erreur
        if ($this->f->isDatabaseError($res, true)) {
            throw new treatment_exception(
                    __("Erreur de base de donnees. Contactez votre administrateur."),
                    __METHOD__.": ".$res->getMessage()
                    );
        }
        
        // Résultat
        $msg = ("Les dossiers ont été récupérés.");
        $msg = sprintf(
                __("Opération terminée").": %s ".__("dossiers importés")
                , $nb_dossiers);
        $this->addToMessage($msg);
        
        // RETURN
        return $this->correct;
            
        }
        
        /**
         * Cette méthode permet d'exécuter une routine en début des méthodes dites
         * de TREATMENT. Elle étend celle du core dans le sens où le traitement
         * se fait dans une transaction SQL. Celle du core gère la validation nativement.
         * (code repris d'openARIA)
         *
         * @param string $method_name Nom de la méthode appelante.
         * @param array  $extras      Paramètres supplémentaires.
         *
         * @return void
         */
        function begin_treatment_with_transaction($method_name) {
            //
            $this->f->db->autoCommit(false);
            $this->begin_treatment($method_name);
        }
        
        /**
         * Cette méthode permet d'exécuter une routine en fin des méthodes dites
         * de TREATMENT. Elle étend celle du core dans le sens où le traitement
         * se fait dans une transaction SQL. De plus elle gère la validation.
         * (code repris d'openARIA)
         *
         * @param string  $method_name Nom de la méthode appelante.
         * @param boolean $ret         Valeur de retour.
         * @param array   $extras      Paramètres supplémentaires.
         *
         * @return mixed
         */
        function end_treatment_with_transaction($method_name, $ret = true) {
            //
            if ($ret === true) {
                $this->f->db->commit();
                return $this->end_treatment($method_name, true);
            }
            //
            $this->correct = false;
            $this->f->db->rollback();
            return $this->end_treatment($method_name, false);
        }
        
        /**
         * Affichage du message de validation
         *
         * (code repris d'openARIA)
         *
         * @return void
         */
        function display_msg() {
            $type = 'valid';
            if ($this->correct === false) {
                $type = 'error';
            }
            $this->f->displayMessage($type, $this->msg);
        }
  
} // fin classe

