<?php

/**
 * Classe dédiée à la gestion de l'objet du workflow : CDE Sign
 */
class VisuWorflowCDESign extends ObjetVisuWorflow
{

    protected $TYPE;

    protected $NOM;

    protected $ETAT;

    protected $STATUT;

    protected $LIBELLE;

    protected $DATA;

    public function __construct($typeSuivi, $no_doc)
    {
        $this->TYPE = 'A';
        $this->NOM = 'CDESign';
        $this->LIBELLE = trad('APPRO CDE');
        
        $this->initETAT($typeSuivi, $no_doc);
        
        if ($this->ETAT)
            $this->initSTATUT($typeSuivi, $no_doc);
    }

    public function &getETAT()
    {
        return $this->ETAT;
    }

    public function &getSTATUT()
    {
        return $this->STATUT;
    }

    public function &getTYPE()
    {
        return $this->TYPE;
    }

    public function &getNOM()
    {
        return $this->NOM;
    }

    public function &getLIBELLE()
    {
        return $this->LIBELLE;
    }

    public function &getDATA()
    {
        return $this->DATA;
    }

    public function initETAT($typeSuivi, & $no_doc)
    {
        $this->ETAT = 0; // On considère par défaut que l'objet Approbation DA est à l'état 0
                         // Si le workflow est appelé depuis une DA
        if (TypeSuivi::DA == $typeSuivi) {
            $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
            
            // Si l'objet CDE est affiché et que la signature est activée sur les CDE
            if ($VisuWorflowCDE->getETAT() && Param::isSignCDEactivated())
                // Alors l'état passe à 1
                $this->ETAT = 1;
        } elseif (TypeSuivi::CDE == $typeSuivi) {
            
            $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
            
            // Si l'objet CDE est affiché et que la signature est activée sur les CDE
            if ($VisuWorflowCDE->getETAT() && Param::isSignCDEactivated())
                // Alors l'état passe à 1
                $this->ETAT = 1;
        } elseif (TypeSuivi::BR == $typeSuivi) {
            $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
            
            // Si l'objet CDE est affiché et que la signature est activée sur les CDE
            if ($VisuWorflowCDE->getETAT() && Param::isSignCDEactivated())
                // Alors l'état passe à 1
                $this->ETAT = 1;
        } elseif (TypeSuivi::BAP == $typeSuivi) {
            if ($liste_CDE = SqlBap::getListeCDEOnBAP($no_doc)->TrouveTous())
                foreach ($liste_CDE as & $cde) {
                    
                    $VisuWorflowCDE = new VisuWorflowCDE(TypeSuivi::CDE, $cde['NO_CDE']);
                    
                    // Si l'objet CDE est affiché et que la signature est activée sur les CDE
                    if ($VisuWorflowCDE->getETAT() && Param::isSignCDEactivated()) {
                        // Alors l'état passe à 1
                        $this->ETAT = 1;
                        break;
                    }
                }
        }
    }

    public function initSTATUT(& $typeSuivi, & $no_doc)
    {
        $this->STATUT = null;
        
        // Si le workflow est appelé depuis une DA
        if (TypeSuivi::DA == $typeSuivi) {
            // On récupère la liste potentielle des commandes associées à la DA
            $liste_CDE = SqlDa::getListeCdeOnDA($no_doc)->TrouveTous();
            
            // Si une commande n'est pas validée le staut vaut "commencé"
            if (is_array($liste_CDE) && count($liste_CDE) > 0) {
                
                $validee = false;
                $signee = true;
                $refusee = false;
                
                foreach ($liste_CDE as & $CDE) {
                    $info_CDE = SqlCde::getInfoOnEnteteCDE($CDE['NO_CDE'])->Trouve1();
                    
                    if (BoolSql($info_CDE['REFUSEE'])) {
                        $refusee = true;
                        break;
                    }
                    
                    if ('00000000' != $info_CDE['DTE_VALID'])
                        $validee = true;
                    
                    if (! BoolSql($info_CDE['SIGNEE']))
                        $signee = false;
                }
                
                // Si au moins une commande a été refusée
                if ($refusee)
                    $this->STATUT = 'R';
                // Sinon, si l'une des commandes n'est pas validée
                elseif (! $validee)
                    $this->STATUT = 'N';
                // Sinon si aucune des commandes n'est signée
                elseif (! $signee)
                    $this->STATUT = 'C';
                else
                    $this->STATUT = 'T';
                
                foreach ($liste_CDE as & $CDE)
                    $this->DATA[] = $this->initDATA($CDE['NO_CDE']);
            } else {
                $this->STATUT = 'N';
            }
        } elseif (TypeSuivi::CDE == $typeSuivi || TypeSuivi::BR == $typeSuivi) {
            
            if (TypeSuivi::BR == $typeSuivi) {
                $info_BR = SqlBr::rqGetInfoOnBrEntete($no_doc)->Trouve1();
                $no_doc = $info_BR['NUM_CDE'];
            }
            $info_CDE = SqlCde::getInfoOnEnteteCDE($no_doc)->Trouve1();
            
            // Si la commande a été refusée
            if (BoolSql($info_CDE['REFUSEE']))
                $this->STATUT = 'R';
            // Sinon, si la commande n'a pas été validée
            elseif ('00000000' == $info_CDE['DTE_VALID'])
                $this->STATUT = 'N';
            // Sinon, si la commande n'est pas encore signée
            elseif (! BoolSql($info_CDE['SIGNEE']))
                $this->STATUT = 'C';
            else
                $this->STATUT = 'T';
            
            $this->DATA[] = $this->initDATA($no_doc);
        } elseif (TypeSuivi::BAP == $typeSuivi) {
            $liste_CDE = SqlBap::getListeCDEOnBAP($no_doc)->TrouveTous();
            
            $nbStatutR = 0;
            $nbStatutN = 0;
            $nbStatutC = 0;
            $nbStatutT = 0;
            
            foreach ($liste_CDE as & $cde) {
                $info_CDE = SqlCde::getInfoOnEnteteCDE($cde['NO_CDE'])->Trouve1();
                
                // Si la commande a été refusée
                if (BoolSql($info_CDE['REFUSEE']))
                    $nbStatutR ++;
                // Sinon, si la commande n'a pas été validée
                elseif ('00000000' == $info_CDE['DTE_VALID'])
                    $nbStatutN ++;
                // Sinon, si la commande n'est pas encore signée
                elseif (! BoolSql($info_CDE['SIGNEE']))
                    $nbStatutC ++;
                else
                    $nbStatutT ++;
                
                $this->DATA[] = $this->initDATA($cde['NO_CDE']);
            }
            
            if ($nbStatutR > 0)
                $this->STATUT = 'R';
            elseif ($nbStatutN > 0)
                $this->STATUT = 'N';
            elseif ($nbStatutC > 0)
                $this->STATUT = 'C';
            elseif ($nbStatutT > 0)
                $this->STATUT = 'T';
        }
    }

    public function &initDATA($no_doc)
    {
        
        // On récupère les informations de l'entête de la CDE
        $data['ENTETE'] = SqlCde::getInfoOnEnteteCDE($no_doc)->Trouve1();
        
        $data['ENTETE']['STATUT'] = SuiviDocument::getStatutDOC(TypeSuivi::CDE, $data['ENTETE']);
        
        // On recupère les informations liées aux évènements de la signature de la CDE
        if ($data['LISTE_EVENT']['EVENT'] = SqlCde::rqGetEventCDE($no_doc, 'signature')->TrouveTous())
            // On formate les champs Date et Heure
            foreach ($data['LISTE_EVENT']['EVENT'] as & $EVENT) {
                $EVENT['LIBELLE'] = trad($EVENT['LIBELLE']);
                $EVENT['DTE'] = convertDateSqlToFr($EVENT['DTE']);
                $EVENT['HEURE'] = convertHeureSqlToFr($EVENT['HEURE']);
            }
        
        // Liste des signataires attendus
        $data['SIGNATAIRES_ATTENDUS']['SIGNATAIRE'] =  SqlSign::rqGetAllSignatAttendusByCDE($no_doc)->TrouveTous();
        
        return $data;
    }
}
