<?php

namespace Modules\Ajax\Repository;

use Entity\Model\Paravrac;
use Helpers\Outil\Roles;
use Helpers\QueryBuilder\AbsRepository;
use Modules\GlobalApplication\Repository\LicenceOxalys;

class Signataires extends AbsRepository
{

    /**
     * signatairesBAP
     * @param string $numFact
     * @return array<mixed>
     */
    public function signatairesBAP(string $numFact) : ?array
    {

        $param = [
            ':factureId_0' => $numFact,
            ':factureId_1' => $numFact,
        ];
        
        $req =
            "SELECT HASTUTIL.CODE, HASTUTIL.NOM 
            FROM HASTUTIL with (nolock) 
            WHERE HASTUTIL.SIG_BAP=".\Helpers\Outil\Sql::TRUE." 
            AND (
                HASTUTIL.UTIMULTI=".\Helpers\Outil\Sql::TRUE."
                OR (
                    HASTUTIL.CODE_STE = (SELECT CODE_STE FROM FAC_ENT with (nolock) WHERE NUM_FACT = :factureId_0)
                    OR EXISTS (
                        SELECT * 
                        FROM SOC_USR with(nolock) 
                        WHERE SOC_USR.COD_USR='".$_SESSION['Session_Login']."' AND SOC_USR.COD_STE = (
                            SELECT CODE_STE FROM FAC_ENT with (nolock) WHERE NUM_FACT = :factureId_1
                        )
                    )
                )
            )";
        
            
        if ((new LicenceOxalys($this->pdo))->accordConfActive()) {
            $req .=
                " AND HASTUTIL.NIV_CONF >= (
                    SELECT isnull(max(TYPDOC.NIV_CONF), 0) NIV_CONF_CA
                    FROM FAC_LIG with(nolock) 
                    LEFT JOIN CA_ENTET with(nolock) 
                        ON CA_ENTET.CODE_STE=FAC_LIG.CODE_STE 
                        AND CA_ENTET.NO_CDE=FAC_LIG.NUM_CDE
                    LEFT JOIN TYPDOC with (nolock) ON CA_ENTET.TYP_DOC=TYPDOC.TYPE 
                    WHERE FAC_LIG.NUM_FACT = :factureId_2
                )";
            $param[':factureId_2'] = $numFact;
        }
        
        $req .= " ORDER BY HASTUTIL.NOM";
        
        return $this->fetchAssocAll($req, $param);
    }
    
    /**
     * signataireCde
     *
     * @param  int $order
     * @return array<string>[]
     */
    public function signataireCde(int $order = 0): array
    {
        $query = "
        DECLARE 
            @niv_conf int,
            @cod_ste varchar(7), 
            @no_cde int = :NUM_CDE
        
        SELECT @cod_ste = CODE_STE, @niv_conf = td.NIV_CONF
        FROM CA_ENTET cae with(nolock)
            LEFT JOIN TYPDOC td with(nolock) ON td.TYPE = cae.TYP_DOC
        WHERE NO_CDE = @no_cde
        
        -- le signataire existe, et il est coché signataire pour le type de document (DA, Cde ou BAP)
        SELECT ha.CODE, ha.NOM
        FROM HASTUTIL ha with(nolock)
        WHERE ha.SIG_CDE = 0x54
        -- il est valide à la date du jour
            AND (ha.DTE_FERM = '00000000' OR '".date('Ymd')."' < ha.DTE_FERM)
            AND '".date('Ymd')."' >= ha.DTE_OUV
        -- la société du document est dans sa liste de sociétés (périmètre société) (sur SRM on ne gère que sa société principale, donc c'est normal que la liste soit incomplète, il ne faut pas faire pareil en PHP)
            AND (
                    ha.UTIMULTI = 0x54 
                    OR ha.CODE_STE = @cod_ste 
                    OR @cod_ste IN (SELECT s.COD_STE FROM SOC_USR s WITH (NOLOCK) WHERE s.COD_USR = ha.CODE)
                )
        -- si le document a un niveau de confidentialité > 0, le niveau de confidentialité du signataire doit avoir un niveau de confidentialité supérieur ou égal (sur SRM, ce n'est pas géré dans la liste affichée, mais en contrôle de saisie) 
            AND ha.NIV_CONF >= @niv_conf
        -- le signataire n'est pas déjà affecté comme signataire du document en cours
            AND ha.CODE NOT IN 
                (
                    SELECT sc.SIGNAT 
                    FROM SIG_CDE sc with(nolock)
                    WHERE sc.NO_CDE = @no_cde
                )
        ORDER BY ha.NOM
        ";

        return $this->fetchAssocAll($query, [':NUM_CDE' => intval($order)]);
    }
    
    /**
     * signataireDA
     * @return array<string>[]
     */
    public function signataireDA(string $DA) : ?array
    {
        $req ="DECLARE 
                @niv_conf int,
                @cod_ste varchar(7), 
                @no_da int = :noDa
            
            SELECT @cod_ste = CODE_STE, @niv_conf = td.NIV_CONF
            FROM DA_ENTET dae with(nolock)
            LEFT JOIN TYPDOC td with(nolock) ON td.TYPE = dae.TYP_DOC
            WHERE NO_DA = @no_da
            
            -- le signataire existe, et il est coché signataire pour le type de document (DA, Cde ou BAP)
            SELECT ha.CODE, ha.NOM
            FROM HASTUTIL ha with(nolock)
            WHERE ha.SIG_DA = 0x54
            -- il est valide à la date du jour
                AND (ha.DTE_FERM = '00000000' OR '".date('Ymd')."' < ha.DTE_FERM)
                AND '".date('Ymd')."' >= ha.DTE_OUV
            -- la société du document est dans sa liste de sociétés (périmètre société) (sur SRM on ne gère que sa société principale, donc c'est normal que la liste soit incomplète, il ne faut pas faire pareil en PHP)
                AND (
                        ha.UTIMULTI = 0x54 
                        OR ha.CODE_STE = @cod_ste 
                        OR @cod_ste IN (SELECT s.COD_STE FROM SOC_USR s WITH (NOLOCK) WHERE s.COD_USR = ha.CODE)
                    )
            -- si le document a un niveau de confidentialité > 0, le niveau de confidentialité du signataire doit avoir un niveau de confidentialité supérieur ou égal (sur SRM, ce n'est pas géré dans la liste affichée, mais en contrôle de saisie) 
                AND ha.NIV_CONF >= @niv_conf
            -- le signataire n'est pas déjà affecté comme signataire du document en cours
                AND ha.CODE NOT IN 
                    (
                        SELECT sc.SIGNAT 
                        FROM SIG_DA sc with(nolock) 
                        WHERE sc.NO_DA = @no_da
                    )
            ORDER BY ha.NOM";
    
        return $this->fetchAssocAll($req, [':noDa'  => intval($DA)]);
    }
    
    /**
     * signataireREF
     * @return array<string>[]
     */
    public function signataireREF() : ?array
    {
        $req = "SELECT HASTUTIL.CODE, HASTUTIL.NOM
                FROM HASTUTIL with (nolock)
                WHERE HASTUTIL.SIG_REF=".\Helpers\Outil\Sql::TRUE." ORDER BY HASTUTIL.NOM";
        
        return $this->fetchAssocAll($req, []);
    }
    
    /**
     * signataireREFGroupe
     * @return array<mixed>[]
     */
    public function signataireREFGroupe() : array
    {
        $req = "SELECT * from WF_GRP_SIG with(nolock) 
        where WF_GS_ENT_TYPE = 'FOURNISS' 
        order by WF_GS_ENT_TYPE, WF_GS_CODE";
        
        return $this->fetchAssocAll($req, []);
    }
    /**
     * signataireREFGroupeById
     * @param mixed $code
     * @return array<mixed>
     */
    public function signataireREFGroupeById($code) :array
    {
        $req = "SELECT * from WF_GRP_SIG with(nolock) 
        where WF_GS_ENT_TYPE = 'FOURNISS' and WF_GS_CODE = :code 
        order by WF_GS_ENT_TYPE, WF_GS_CODE";
        return $this->fetchAssocOne($req, [':code' => $code]);
    }
}
