<?php

/**
 * Classe dédiée à la gestion de l'objet du workflow : Envoi CDE
 */
class VisuWorflowEnvoiCDE 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 = 'envoiCDE';
        $this->LIBELLE = trad('ENV 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);
            $this->ETAT = $VisuWorflowCDE->getETAT();
        } elseif (TypeSuivi::CDE == $typeSuivi || TypeSuivi::BR == $typeSuivi) {
            $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
            $this->ETAT = $VisuWorflowCDE->getETAT();
        } 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']);
                    $this->ETAT = $VisuWorflowCDE->getETAT();
                    
                    if (1 == $this->ETAT)
                        break;
                }
        }
    }

    public function initSTATUT(& $typeSuivi, & $no_doc)
    {
        $this->STATUT = null;
        
        // Si le workflow est appelé depuis une DA
        if (TypeSuivi::DA == $typeSuivi) {
            $liste_CDE = SqlDa::getListeCdeOnDA($no_doc)->TrouveTous();
            
            if (is_array($liste_CDE) && count($liste_CDE) > 0) {
                $commencee = false;
                $non_commencee = false;
                
                foreach ($liste_CDE as & $CDE) {
                    $info_CDE = SqlCde::getInfoOnEnteteCDE($CDE['NO_CDE'])->Trouve1();
                    
                    if ('E' == trim($info_CDE['ETAT_CDE']) || 'S' == trim($info_CDE['ETAT_CDE']))
                        $commencee = true;
                    else
                        $non_commencee = true;
                    
                    $this->DATA[] = $this->initDATA($CDE['NO_CDE']);
                }
                
                if ($commencee && $non_commencee)
                    $this->STATUT = 'C';
                elseif (! $commencee && $non_commencee)
                    $this->STATUT = 'N';
                else
                    $this->STATUT = 'T';
            } else
                $this->STATUT = 'N';
        } elseif (TypeSuivi::CDE == $typeSuivi) {
            $info_CDE = SqlCde::getInfoOnEnteteCDE($no_doc)->Trouve1();
            
            if (is_array($info_CDE)) {
                $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
                
                if (('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE']) && 'T' == $VisuWorflowCDE->getSTATUT())
                    $this->STATUT = 'T';
                elseif ('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE'])
                    $this->STATUT = 'C';
                else
                    $this->STATUT = 'N';
                
                $this->DATA[] = $this->initDATA($no_doc);
            }
        } elseif (TypeSuivi::BR == $typeSuivi) {
            $info_BR = SqlBr::rqGetInfoOnBrEntete($no_doc)->Trouve1();
            $info_CDE = SqlCde::getInfoOnEnteteCDE($info_BR['NUM_CDE'])->Trouve1();
            
            if (is_array($info_CDE)) {
                $VisuWorflowCDE = new VisuWorflowCDE($typeSuivi, $no_doc);
                
                if (('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE']) && 'T' == $VisuWorflowCDE->getSTATUT())
                    $this->STATUT = 'T';
                elseif ('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE'])
                    $this->STATUT = 'C';
                else
                    $this->STATUT = 'N';
                
                $this->DATA[] = $this->initDATA($info_BR['NUM_CDE']);
            }
        } elseif (TypeSuivi::BAP == $typeSuivi) {
            
            $nbStatutT = 0;
            $nbStatutC = 0;
            $nbStatutN = 0;
            $nbCDE = 0;
            if ($liste_CDE = SqlBap::getListeCDEOnBAP($no_doc)->TrouveTous())
                foreach ($liste_CDE as & $cde) {
                    $info_CDE = SqlCde::getInfoOnEnteteCDE($cde['NO_CDE'])->Trouve1();
                    $nbCDE ++;
                    $VisuWorflowCDE = new VisuWorflowCDE(TypeSuivi::CDE, $cde['NO_CDE']);
                    if (('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE']) && 'T' == $VisuWorflowCDE->getSTATUT())
                        $nbStatutT ++;
                    elseif ('E' == $info_CDE['ETAT_CDE'] || 'S' == $info_CDE['ETAT_CDE'])
                        $nbStatutC ++;
                    else
                        $nbStatutN ++;
                    $this->DATA[] = $this->initDATA($cde['NO_CDE']);
                }
            if ($nbStatutT == $nbCDE)
                $this->STATUT = 'T';
            elseif ($nbStatutC >= 1)
                $this->STATUT = 'C';
            else
                $this->STATUT = 'N';
        }

        /**
         * Gestion des commandes annulées
         */
        if($info_CDE['ETAT_CDE'] == 'Z' )
        {
            foreach(($this->DATA[0]['LISTE_EVENT']['EVENT']) ?? [] as $dataTmp)
            {  
                if($dataTmp['CODE'] == 'IMA')
                {
                    $this->STATUT = 'T';
                    return true;
                }else if(trim($dataTmp['CODE']) != ''){
                    $this->STATUT = 'C';
                }
            }
        }
    }

    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 d'envoi de la CDE
        if ($data['LISTE_EVENT']['EVENT'] = SqlCde::rqGetEventCDE($no_doc, 'envoi')->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']);
            }
        
        return $data;
    }
}
