<?php

/**
 * Classe permettant de gérer les lignes de réception
 *
 */
/**
 * Classe permettant de gérer les lignes de réception
 */
class BR_ligne
{

    // Attributs
    protected $login;

    protected $no_ligne_cde;

    protected $no_ligne_br;

    protected $code_art;

    protected $design_sommaire;

    protected $unite;

    protected $is_reception;

    protected $devise;

    protected $ral;

    protected $ral_mnt;

    protected $qte_r;

    protected $qte_c;

    protected $TVA;

    protected $prix_remise;

    protected $qte_a;

    protected $MNT_REC;

    protected $MNT_RET;

    protected $TYPE_RECEPTION;
 // '' 'Q' 'M'
    protected $is_incident;

    protected $code_inc;

    protected $comment_inc;

    protected $is_ctrl_qualite;

    protected $type_ctrl;

    protected $libelle_ctrl;

    protected $ctrl_qualite_done;

    protected $design_comp;

    protected $type_inc_default;

    protected $qteAccepValide;

    protected $QTE_ANNULE;

    protected $isAnnule;

    protected $EN_MNT = false;

    protected $COMMENT;

    protected $DTELIV;

    // Constructeur
    public function __construct()
    {}

    // Méthodes Get
    public function &getDteLiv()
    {
        return $this->DTELIV;
    }

    public function &getLogin()
    {
        return $this->login;
    }

    public function &getNo_ligne_cde()
    {
        return $this->no_ligne_cde;
    }

    public function &getNo_ligne_br()
    {
        return $this->no_ligne_br;
    }

    public function &getCode_art()
    {
        return $this->code_art;
    }

    public function &getDesign_sommaire()
    {
        return $this->design_sommaire;
    }

    public function &getUnite()
    {
        return $this->unite;
    }

    public function &isReception()
    {
        return $this->is_reception;
    }

    public function &getDevise()
    {
        return $this->devise;
    }

    public function &getRal()
    {
        return $this->ral;
    }

    public function &getQte_r()
    {
        return $this->qte_r;
    }

    public function &getQte_c()
    {
        return $this->qte_c;
    }

    public function &getPrixRemise()
    {
        return $this->prix_remise;
    }

    public function &getQte_a()
    {
        return $this->qte_a;
    }

    public function &getQTE_ANNULE()
    {
        return $this->QTE_ANNULE;
    }

    public function &getMontantRec()
    {
        return $this->MNT_REC;
    }

    public function &getMontantRet()
    {
        return $this->MNT_RET;
    }

    public function &getTypeDeReception()
    {
        return $this->TYPE_RECEPTION;
    }

    public function isReceptionEnMontant()
    {
        return $this->EN_MNT || ($this->TYPE_RECEPTION == 'M');
    }

    public function getQTE($type)
    {
        switch ($type) {
            
            case 'qte_r':
                return $this->getQte_r();
                break;
            
            case 'qte_c':
                return $this->getQte_c();
                break;
            
            case 'qte_a':
                return $this->getQte_a();
                break;
        }
    }

    public function &getIs_incident()
    {
        return $this->is_incident;
    }

    public function &getCode_inc()
    {
        return $this->code_inc;
    }

    public function &getType_inc_default()
    {
        return $this->type_inc_default;
    }

    public function &getComment_inc()
    {
        return $this->comment_inc;
    }

    public function &getIs_ctrl_qualite()
    {
        return $this->is_ctrl_qualite;
    }

    public function &getType_ctrl()
    {
        return $this->type_ctrl;
    }

    public function &isCtrlQualiteDone()
    {
        return $this->ctrl_qualite_done;
    }

    public function &getDesign_comp()
    {
        return $this->design_comp;
    }

    public function &getQteAccepValide()
    {
        return $this->qteAccepValide;
    }

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

    public function &getCOMMENT()
    {
        return $this->COMMENT;
    }

    public function &getTVA()
    {
        return $this->TVA;
    }

    // Méthodes SET
    public function setDteLiv($dteLiv)
    {
        $this->DTELIV = $dteLiv;
    }

    public function setLogin($v)
    {
        $this->login = & $v;
    }

    public function setNo_ligne_cde($v)
    {
        $this->no_ligne_cde = & $v;
    }

    public function setNo_ligne_br($v)
    {
        $this->no_ligne_br = & $v;
    }

    public function setCode_art($v)
    {
        $this->code_art = & $v;
    }

    public function setDesign_sommaire($v)
    {
        $this->design_sommaire = & $v;
    }

    public function setUnite($v)
    {
        $this->unite = & $v;
    }

    public function setIs_reception($v)
    {
        $this->is_reception = & $v;
    }

    public function setDevise($v)
    {
        $this->devise = & $v;
    }

    public function setRal($v)
    {
        $this->ral = number_format($v, 3, '.', '');
    }

    public function setRalMontant($v)
    {
        $this->ral_mnt = number_format($v, 3, '.', '');
    }

    public function setQte_r(& $v)
    {
        $this->qte_r = number_format($v, 3, '.', '');
    }

    public function setQte_c(& $v)
    {
        $this->qte_c = number_format($v, 3, '.', '');
    }

    public function setPrixRemise(& $v)
    {
        $this->prix_remise = number_format($v, 2, '.', '');
    }

    public function setQte_a(& $v)
    {
        $this->qte_a = number_format($v, 3, '.', '');
    }

    public function setMontantRec(& $v)
    {
        $this->MNT_REC = number_format((float)$v, 2, '.', '');
    }

    public function setQTE_ANNULE($v)
    {
        $this->QTE_ANNULE = number_format($v, 3, '.', '');
    }

    public function setMontantRet(& $v)
    {
        $this->MNT_RET = number_format((float)$v, 3, '.', '');
    }

    public function setTypeDeReception(& $v)
    {
        $this->TYPE_RECEPTION = & $v;
    }

    public function setIsAnnule($v)
    {
        $this->isAnnule = & $v;
    }

    public function setReceptionEnMontant($v)
    {
        $this->EN_MNT = & $v;
    }

    public function setIs_incident($v)
    {
        $this->is_incident = & $v;
    }

    public function setCode_inc($v)
    {
        $this->code_inc = & $v;
    }

    public function setComment_inc($v)
    {
        $this->comment_inc = & $v;
    }

    public function setIs_ctrl_qualite($v)
    {
        $this->is_ctrl_qualite = & $v;
    }

    public function setType_ctrl($v)
    {
        $this->type_ctrl = & $v;
    }

    public function setCOMMENT($v)
    {
        $this->COMMENT = & $v;
    }

    public function setCtrl_qualite_done($v)
    {
        $this->ctrl_qualite_done = & $v;
    }

    public function setDesign_comp($v)
    {
        $this->design_comp = & $v;
    }

    public function setType_inc_default($v)
    {
        $this->type_inc_default = & $v;
    }

    public function setQteAccepValide($v)
    {
        $this->qteAccepValide = & $v;
    }

    public function setTVA($TVA)
    {
        $this->TVA = round($TVA, 2, PHP_ROUND_HALF_DOWN);
    }

    /**
     * Fonction insérant dans la table oxa_br_ligne l'ensemble des lignes à réceptionner pour une commande donnée
     *
     * @param string $login
     *            : login de l'utilisateur
     * @param int $no_cde_br
     *            : numero de commande
     * @param string $contexte
     *            : contexte de l'initialisation des lignes
     * @return boolean
     */
    public static function initBR(& $login, & $no_cde, $contexte)
    {
        // Sélection des lignes à receptionner de la commande
        $array_ligne_cde = SqlBr::rqGetLigForRecept($no_cde)->TrouveTous();

        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        
        foreach ($array_ligne_cde as & $element){
            if (! BoolSql($element['RECEP_AUTO'])) { // Uniquement pour les lignes de reception en NON automatique
                                                    // Recherche s'il existe,
                $typeRecept = '';
                if ($listeBr = SqlCde::rqGetListeLigneBrOnCDE($element['NO_CDE'], $element['NO_PO'])->Trouve1())
                    if (BoolSql($listeBr['EN_MNT']))
                        $typeRecept = 'M'; // Saisie en montant
                    else
                        $typeRecept = 'Q'; // Saisie en quantité
                                           
                // Pas si expedition ni si article stock existe
                if ($typeRecept == '' && $element['SITE_STK'] != '')
                    $typeRecept = 'Q';
                
                // Si pas de bon de reception déjà présent ou existance en quantité ou alors montant mais donc obligation du droit
                if ($typeRecept == '' || $typeRecept == 'Q' || $_SESSION['HA_BR_PX']){
                    $pile_rq->AddRequeteSql(SqlBr::rqInsertLigneBRCreation($login, $element, $contexte, $typeRecept));
                    // Copier les CC de la ligne de commande dans CC_LDOC avec 'DOC_TYPE' = 'BRT', 'DOC_NUM' => 0, 'DOC_LINE_NUM' => numéro de ligne de la cde, 'ID_USER_BASKET' => session id_user  
                    $no_line = $element['NO_PO'];
                    $doc_num = 0;
                    $type_line = 'CDE';
                    $tbl_source = ['DOC_TYPE'=> 'CA', 'DOC_NUM' => $no_cde, 'DOC_LINE_NUM' => $no_line, 'ID_USER_BASKET' => 0];
                }else{ 
                    // Copier les CC de la ligne de BR dans CC_LDOC avec 'DOC_TYPE' = 'BRT', 'DOC_NUM' => numéro du BR, 'DOC_LINE_NUM' => numéro de ligne du br, 'ID_USER_BASKET' => session id_user                        
                    $no_line = $listeBr['NO_PO_BR'];
                    $doc_num = $listeBr['NUM_BR'];
                    $type_line = 'BR';
                    $tbl_source = ['DOC_TYPE'=> 'BR', 'DOC_NUM' => $doc_num, 'DOC_LINE_NUM' => $no_line, 'ID_USER_BASKET' => 0];
                }
                $tabLigneBR[] = ['no_line' => $no_line, 'doc_num' => $doc_num, 'type_line' => $type_line];                
                /*** SPEC 4241 Caractéristiques complémentaires : duplication des CC de la commande ou du BR en BRT  ***/  
                $pile_rq->AddRequeteSql(SqlCaracteristiquesCompl::rqDuplicateCCLigne($tbl_source, ['DOC_TYPE'=> 'BRT', 'DOC_NUM' => $doc_num, 'DOC_LINE_NUM' => $no_line, 'ID_USER_BASKET' => $_SESSION['id_user']]));
            }
        }

        // On commit la pile de requete insert, retourne true si ok
        $retour = $pile_rq->Commit();
        if($retour){
            foreach ($tabLigneBR as $ligneBR){                
                /*** SPEC 4241 Caractéristiques complémentaires : MAJ des CC calculés impactées par la quantité et le prix unitaire (ayant au moins un tag PU, MNT_LIG_HT ou MNT_LIG_TTC) ***/
               
                CaracteristiquesCompl::majCcCalc(['PU', 'MNT_LIG_HT', 'MNT_LIG_TTC'], 'BRT', $ligneBR['doc_num'], $ligneBR['no_line'], $_SESSION['id_user'], $ligneBR['type_line']);
            }
            
        }            
        return $retour;
    }

    /**
     * Fonction insérant dans la table oxa_br_ligne l'ensemble des lignes à contrôler pour un BR donné
     *
     * @param string $login
     * @param int $no_cde_br
     * @return boolean
     */
    public static function initBRForCtrlQualite(& $login, & $no_br)
    {
        // Sélection des lignes à contrôler de la commande
        $array_ligne_br = SqlBr::rqGetAllInfoOnBrLigneWithCtrl($no_br)->TrouveTous();
        
        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        
        foreach ($array_ligne_br as & $element){
            $pile_rq->AddRequeteSql(SqlBr::rqInsertLigneBRCtrlQualite($login, $element));

            /*** SPEC 4241 Caractéristiques complémentaires : duplication des CC du BR en BRT  ***/
            $no_line = $element['NO_PO_BR'];
            $tabLigneBR[] = ['no_line' => $no_line, 'doc_num' => $no_br];
            $tbl_source = ['DOC_TYPE'=> 'BR', 'DOC_NUM' => $no_br, 'DOC_LINE_NUM' => $no_line, 'ID_USER_BASKET' => 0];
            $pile_rq->AddRequeteSql(SqlCaracteristiquesCompl::rqDuplicateCCLigne($tbl_source, ['DOC_TYPE'=> 'BRT', 'DOC_NUM' => $no_br, 'DOC_LINE_NUM' => $no_line, 'ID_USER_BASKET' => $_SESSION['id_user']]));
        }

        $retour = $pile_rq->Commit();
        if($retour){
            foreach ($tabLigneBR as $ligneBR){                
                /*** SPEC 4241 Caractéristiques complémentaires : MAJ des CC calculés impactées par la quantité et le prix unitaire (ayant au moins un tag PU, MNT_LIG_HT ou MNT_LIG_TTC) ***/

                CaracteristiquesCompl::majCcCalc(['PU', 'MNT_LIG_HT', 'MNT_LIG_TTC'], 'BRT', $ligneBR['doc_num'], $ligneBR['no_line'], $_SESSION['id_user']);
            }
            
        }
        
        // On commit la pile de requete insert, retourne true si ok
        return $retour;
    }

    /**
     * fonction qui retourne les valeurs de la table oxa_br_ligne pour un br et un numéro de poste
     */
    public function initBRforReading(& $login, & $no_ligne_cde)
    {
        // Sélection de la ligne
        $array_ligne = SqlBr::rqGetBRInfo($login, $no_ligne_cde)->Trouve1();
        $this->COMMENT = & $array_ligne['COMMENT'];
        $this->DTELIV = & $array_ligne['DTE_LIV'];
        $this->qte_a = & $array_ligne['qte_a'];
        $this->qte_c = & $array_ligne['qte_c'];
        $this->qte_r = & $array_ligne['qte_r'];
        $this->prix_remise = & $array_ligne['PU_REMISE'];
    }

    /**
     * Fonction permettant de solder les lignes d'une commande lors de la création d'un BR
     */
    public static function soldeCde(& $login, $numCde)
    {
        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqSoldeCde($login, $numCde));
        // On commit retourne true si ok
        $retour = $pile_rq->Commit();
        if($retour){
            /*** SPEC 4241 Caractéristiques complémentaires : MAJ des CC calculés impactées par la quantité et le prix unitaire (ayant au moins un tag PU, MNT_LIG_HT ou MNT_LIG_TTC) ***/
            $enteteBR = SqlBr::getEnteteBRforCreation($login)->Trouve1();
            $doc_num = $enteteBR['no_br'] != '0' ? $enteteBR['no_br'] : $enteteBR['no_cde'];
            $lignesBR = SqlBr::getLigneBR($login)->TrouveTous();
            foreach ($lignesBR as $ligne){    
                $no_line = $enteteBR['no_br'] != '0' ? $ligne['no_ligne_br'] : $ligne['no_ligne_cde'];
                CaracteristiquesCompl::majCcCalc(['PU', 'MNT_LIG_HT', 'MNT_LIG_TTC'], 'BRT', $doc_num, $no_line, $_SESSION['id_user']);
            }            
        }
        return $retour;
    }

    /**
     * Fonction permettant de désolder les lignes d'une commande lors de la création d'un BR
     */
    public static function soldeCdeEchue(& $login, $num_cde, $dateBL = '')
    {
        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqSoldeCdeEchue($login, $num_cde, $dateBL));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    /**
     * Fonction permettant de désolder les lignes d'une commande lors de la création d'un BR
     */
    public static function deSoldeCde(& $login)
    {
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqDeSoldeCde($login));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateQTE(& $login, $no_ligne, $type_qte, $qte)
    {
        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateQTE($login, $no_ligne, $type_qte, $qte));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateMNT_REC(& $login, $no_ligne, $montant)
    {
        // Pour chaque ligne on réalise l'insertion dans la table oxa_br_ligne
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateMNT_REC($login, $no_ligne, $montant));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateIsReception(& $login, $is_reception, $no_ligne)
    {
        // Pour la ligne concernée on met à jour le flag reception et on réinitialise le RAL
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateReceptionLigne($login, $is_reception, $no_ligne));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    //modif dossier 30118 no_cde
    public static function updateIsEnMontant(& $login, $is_en_montant, $no_ligne, $no_cde)
    {
        // Pour la ligne concernée on met à jour le flag reception et on réinitialise le RAL
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::reqUpdateIsEnMontant($login, $is_en_montant, $no_ligne, $no_cde));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public function getLigneBRCreation(& $login, $no_ligne_cde, $ctrlRAL = true)
    {
        // Dossier 26612 : attention, le no_ligne_br est généralement à 0 mais, pas toujours : on va prendre le minimum existant dans la table.
        $no_ligne_br = 0;
        if ($no_ligne_cde == '0') {
            $reqSql = SqlBr::getLigneBRDefaut($_SESSION['br_login'])->Trouve1();
            if (is_array($reqSql)) {
                $no_ligne_br = $reqSql['no_ligne_br'];
                $no_ligne_cde = $reqSql['no_ligne_cde'];
            }
        }
        
        $array = SqlBr::getLigneBRforCreation($login, $no_ligne_cde, false, false, $no_ligne_br, false, $ctrlRAL)->Trouve1();
        
        $this->setIs_reception(BoolSql($array['is_reception']));
        $this->setDevise($array['DEVISE']);
        $this->setNo_ligne_cde($array['no_ligne_cde']);
        $this->setNo_ligne_br($array['no_ligne_br']);
        $this->setRal($array['ral']);
        $this->setQte_r($array['qte_r']);
        $this->setQte_c($array['qte_c']);
        $this->setPrixRemise($array['PU_REMISE']);
        $this->setQte_a($array['qte_a']);
        $this->setIs_incident(BoolSql($array['is_incident']));
        $this->setCode_inc($array['code_inc']);
        $this->setIs_ctrl_qualite(BoolSql($array['is_ctrl_qualite']));
        $this->setCtrl_qualite_done(BoolSql($array['ctrl_qualite_done']));
        $this->setType_ctrl($array['type_ctrl']);
        $this->setQTE_ANNULE($array['QTE_ANNULE']);
        $this->setTVA($array['TVA']);
        
        $this->setMontantRec($array['MNT_REC']);
        $this->setMontantRet($array['MNT_RET']);
        $this->setReceptionEnMontant(BoolSql($array['EN_MNT']));
        $this->setTypeDeReception($array['TYPE_RECEPT_POSSIBLE']);
    }

    public static function updateCodeInc(& $login, $type_inc, $no_ligne = '')
    {
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateCodeInc($login, $type_inc, $no_ligne));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateIsIncident(& $login, $is_incident, $code_inc, $no_ligne = '')
    {
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateIsIncident($login, $is_incident, $code_inc, $no_ligne));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateCommentInc(& $login, $no_ligne, $comment_inc)
    {
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateCommentInc($login, $no_ligne, $comment_inc));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    public static function updateIsCtrlQualiteDone(& $login, $ctrl_qualite_done, $no_ligne)
    {
        // Pour la ligne concernée on met à jour le flag controle
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqUpdateIsCtrlQualiteDone($login, $ctrl_qualite_done, $no_ligne));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }

    /**
     * Fonction enregistrant le commentaire associé à une ligne de bon de réception
     *
     * @param string $login
     * @param int $no_ligne_cde
     * @param string $comment
     * @return boolean
     */
    public static function updateComment($login, $no_ligne_cde, $comment)
    {
        $pile_rq = new PileSql(DB_OXAPROCDB);
        $pile_rq->AddRequeteSql(SqlBr::rqBrUpdateComment($login, $no_ligne_cde, $comment));
        
        // On commit retourne true si ok
        return $pile_rq->Commit();
    }
}
