<?php

/**
 * Classe dédiée à la gestion de l'objet du workflow : FAC Sign
 */
class VisuWorflowFACSign 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 = 'FACSign';
        $this->LIBELLE = trad('APPRO BAP');
        
        $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 BAP est à l'état 0
                         // Si le workflow est appelé depuis une DA
        if (TypeSuivi::DA == $typeSuivi) {
            $VisuWorflowFAC = new VisuWorflowFAC(TypeSuivi::DA, $no_doc);
            
            // Si la signature des BAP est activé et que l'objet BAP est visible
            if (Param::isSignBAPactivated() && $VisuWorflowFAC->getETAT())
                $this->ETAT = 1;
        } elseif (TypeSuivi::CDE == $typeSuivi) {
            $VisuWorflowFAC = new VisuWorflowFAC(TypeSuivi::CDE, $no_doc);
            
            // Si la signature des BAP est activé et que l'objet BAP est visible
            if (Param::isSignBAPactivated() && $VisuWorflowFAC->getETAT())
                $this->ETAT = 1;
        } elseif (TypeSuivi::BR == $typeSuivi) {
            
            $VisuWorflowFAC = new VisuWorflowFAC($typeSuivi, $no_doc);
            
            // Si la signature des BAP est activé et que l'objet BAP est visible
            if (Param::isSignBAPactivated() && $VisuWorflowFAC->getETAT())
                $this->ETAT = 1;
        } elseif (TypeSuivi::BAP == $typeSuivi) {
            
            $VisuWorflowFAC = new VisuWorflowFAC($typeSuivi, $no_doc);
            
            // Si la signature des BAP est activé et que l'objet BAP est visible
            if (Param::isSignBAPactivated() && $VisuWorflowFAC->getETAT())
                $this->ETAT = 1;
        }
    }

    public function initSTATUT(& $typeSuivi, & $no_doc)
    {
        $this->STATUT = null;
        
        /*
         *
         * N : aucune facture avec BAP en cours
         * C : au moins une facture avec BAP en cours
         * T : toutes factures avec BAP et toutes cdes état « F » et Cde « terminée ».
         *
         *
         */
        
        // Si le workflow est appelé depuis une DA
        if (TypeSuivi::DA == $typeSuivi) {
            
            $VisuWorflowFAC = new VisuWorflowFAC($typeSuivi, $no_doc);
            $liste_BAP = SqlBap::rqGetAllBapOnDA($no_doc)->TrouveTous();
            
            if (! is_array($liste_BAP) || 0 == count($liste_BAP)) {
                $this->STATUT = 'N';
            } else {
                foreach ($liste_BAP as & $BAP)
                    if ((BoolSql($BAP['BON_A_PAY']) || '00000000' == $BAP['DATE_BAP']) || ($VisuWorflowFAC->getETAT() && 'T' != $VisuWorflowFAC->getSTATUT())) {
                        $this->STATUT = 'C';
                        break;
                    }
                
                if (is_null($this->STATUT))
                    $this->STATUT = 'T';
            }
            
            if (is_array($liste_BAP))
                foreach ($liste_BAP as & $BAP)
                    $this->DATA[] = $this->initDATA($BAP['NUM_FACT'], $BAP['NUM_CDE'], $BAP['NUM_EXP']);
        }        // Si le workflow est appelé depuis une CDE
        elseif (TypeSuivi::CDE == $typeSuivi || TypeSuivi::BR == $typeSuivi) {
            
            if (TypeSuivi::BR == $typeSuivi) {
                $info_BR = SqlBr::rqGetInfoOnBrEntete($no_doc)->Trouve1();
                $no_doc = $info_BR['NUM_CDE'];
            }
            $VisuWorflowFAC = new VisuWorflowFAC($typeSuivi, $no_doc);
            $liste_BAP = SqlBap::rqGetAllBapOnCDE($no_doc)->TrouveTous();
            if (! is_array($liste_BAP) || 0 == count($liste_BAP)) {
                $this->STATUT = 'N';
            } else {
                foreach ($liste_BAP as & $BAP) {
                    if ((! BoolSql($BAP['BON_A_PAY']) || '00000000' == $BAP['DATE_BAP']) || ($VisuWorflowFAC->getETAT() && 'T' != $VisuWorflowFAC->getSTATUT()))
                        $this->STATUT = 'C';
                    break;
                }
                
                if (is_null($this->STATUT))
                    $this->STATUT = 'T';
            }
            
            if (is_array($liste_BAP))
                foreach ($liste_BAP as & $BAP)
                    $this->DATA[] = $this->initDATA($BAP['NUM_FACT'], $BAP['NUM_CDE'], $BAP['NUM_EXP']);
        } elseif (TypeSuivi::BAP == $typeSuivi) {
            $BAP = SqlBap::getInfoOnEnteteBAP($no_doc)->Trouve1();
            
            // print_r($BAP); exit;
            if ((! BoolSql($BAP['BON_A_PAY']) || '00000000' == $BAP['DATE_BAP']) || ($this->getETAT() && 'T' != $this->getSTATUT()))
                if (BoolSql($BAP['LITIGE']))
                    $this->STATUT = 'R';
                else
                    $this->STATUT = 'C';
            else
                $this->STATUT = 'T';
            if ($listeLignesBAP = SqlBap::rqGetDistinctCdeOnBap($no_doc)->TrouveTous())
                foreach ($listeLignesBAP as & $ligneBAP)
                    $this->DATA[] = $this->initDATA($no_doc, $ligneBAP['NUM_CDE'], $ligneBAP['NUM_EXP']);
        }
    }

    public function &initDATA($no_doc, $no_cde, $no_exp)
    {
        
        // On récupère les informations de l'entête de la facture
        $data['ENTETE'] = SqlBap::getInfoOnEnteteBAP($no_doc)->Trouve1();
        
        if ($no_cde == 0 || '' == trim($no_cde)) {
            $no_cde = 0;
        }
        if ($no_exp == 0 || '' == trim($no_exp)) {
            $no_exp = 0;
        }
        
        $data['ENTETE']['NO_CDE'] = $no_cde;
        $data['ENTETE']['NO_EXP'] = $no_exp;
        
        $data['ENTETE']['DATE_FAFO'] = convertDateSqlToFr($data['ENTETE']['DATE_FAFO']);
        
        if (BoolSql($data['ENTETE']['ENT_VALID'])) {
            $data['ENTETE']['VALIDEE'] = trad('Validée');
        } else {
            $data['ENTETE']['VALIDEE'] = trad('Non validée');
        }
        
        if (BoolSql($data['ENTETE']['AFF_TMP'])) {
            $data['ENTETE']['AFFECTEE'] = trad('Pré-affectée');
        } elseif (BoolSql($data['ENTETE']['AFF_VALID'])) {
            $data['ENTETE']['AFFECTEE'] = trad('Validée');
        } elseif (BoolSql($data['ENTETE']['AFF_ENREG'])) {
            $data['ENTETE']['AFFECTEE'] = trad('Affectée');
        }
        
        // EDP Dossier 23752 Ajout LITIGE et ATT_SIG
        if (BoolSql($data['ENTETE']['LITIGE']))
            $data['ENTETE']['BAP_TEXTE'] = trad('Litige');
        else if (BoolSql($data['ENTETE']['ATT_SIG']))
            $data['ENTETE']['BAP_TEXTE'] = trad('En signature');
        else if (BoolSql($data['ENTETE']['BON_A_PAY']))
            $data['ENTETE']['BAP'] = trad('Demandé');
        else
            $data['ENTETE']['BAP'] = trad('Non demandé');
        
        if (BoolSql($data['ENTETE']['BON_A_PAY']))
            $data['ENTETE']['BAP_VALID'] = convertDateSqlToFr($data['ENTETE']['DATE_BAP']);
        
        // On recupère les informations liées aux évènements de signature de la facture
        if ($data['LISTE_EVENT']['EVENT'] = SqlBap::rqGetEventFacture($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::rqGetAllSignatAttendusByBAP($no_doc)->TrouveTous();
        
        return $data;
    }
}
