<?php

namespace Modules\Facture\Controller;

use Helpers\Outil\Date;
use Helpers\Outil\Roles;
use Helpers\Outil\Sql;
use Modules\Facture\MenuContextuel\ListeFactureMenuContextuel;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Skeleton\Controller\Controller;

class ListesFactureController extends Controller
{
    public function listeEnteteAction() : string
    {
        $post = $this->request->getParsedBody();
        
        $paginator = new \Helpers\Pagination\PaginatorGestion();
        $paginator->generate(0, 'f.NUM_FACT');
        
        $listesFacture= new \Modules\Facture\Repository\ListesFacture($this->pdo);
        $factures = $listesFacture->listeEntete($post);

        $infoPagination = \Helpers\Pagination\PaginatorGestion::getInfoPagination();
        
        
        $trad = $this->getTranslationService();

        $filtreAvance = new \Helpers\Filter\FiltreAvance\Generator($post);
        $filtreAvance->setFiltre('f.FACT_FOU', 'text', $trad->t('Référence fournisseur'));
        $filtreAvance->setFiltre('f.DATE_ENR', 'date', $trad->t('Date enregistrement'));
        $filtreAvance->setFiltre('f.DTAE_ECH', 'date', $trad->t('Date échéance'));
        $filtreAvance->setFiltre('f.NUM_FACT', 'numeric', $trad->t('Numéro Enregistrement'));
        $filtreAvance->setFiltre('f.TOTAL_HT', 'numeric', $trad->t('PU remisé'));
        $filtreAvance->setFiltre('f.TOTAL_TTC', 'numeric', $trad->t('Montant HT'));

        $listeType = ['F' => $trad->t('Fac'), 'A' => $trad->t('Avr')];

        \Helpers\Ariane\Ariane::generate(0, $trad->t('Liste des Entêtes'), $post, $infoPagination['nbrArticle']);

        return $this->renderer->render('@listes-facture/liste-entete', [
            'menuActive'       => 'Facture',
            // 'menuLeft'         => 'Listes',
            'post'             => $post,
            'factures'         => $factures,
            'infoPagination'   => $infoPagination,
            'listeType'        => $listeType,
            'filtreAvance'     => $filtreAvance->getFiltres(),
            'initFiltreAvance' => $filtreAvance->getInit(),
            
        ]);
    }
    
    public function listeLigneAction() : string
    {
        $post = $this->request->getParsedBody();

        $sectimpu = new \Entity\Model\Sectimpu($this->pdo);
        $codecomp = new \Entity\Model\Codecomp($this->pdo);
        $sscptana = new \Entity\Model\Sscptana($this->pdo);
        $directio = new \Entity\Model\Directio($this->pdo);
        $natana   = new \Entity\Model\Natana($this->pdo);
        $centrana = new \Entity\Model\Centrana($this->pdo);
        
        $paginator = new \Helpers\Pagination\PaginatorGestion();
        $paginator->generate(0, 'f.NUM_FACT');

        
        $trad = $this->getTranslationService();

        $userMonoSociete = !$_SESSION['Session_UsrMultiSoc'] && !$_SESSION['Session_UsrPluriSoc'];
        if ($userMonoSociete) {
            // Si l'utilisateur est monon-société, on initialise le filtre société avec sa société paramétrée.
            $post['societe'] = $_SESSION['Session_SocUsrProfil'];
        }
        $existePostSociete = isset($post['societe']) && $post['societe'] != '';

        // Paramétrage des axes d'imputations
        // Si l'axe d'imputation est sectorisé, il faut que le filtre société soit rempli (soit par l'initialisation si mono-société, soit parce que l'utilisateur a choisi la société dans les filtres) pour que l'axe soit accessible pour l'utilisateur.
        $steSi = $steCdc = $steSca = '';
        if ($params['SISECTOR'] = \Helpers\Outil\Roles::droit($this->pdo, 'SISECTOR', 'PARAMSTE')) {
            if (!$existePostSociete) {
                $post['CODE_SI'] = $post['CODE_DIR'] = $post['ID_CG'] = '';
            }
            $params['CODE_SI_LOCK'] = !$existePostSociete && !$userMonoSociete;
            $steSi = $post['societe'] ?? '';
        }
        if ($params['CDCSECTO'] = \Helpers\Outil\Roles::droit($this->pdo, 'CDCSECTO', 'PARAMSTE')) {
            if (!$existePostSociete) {
                $post['CODE_CDC'] = $post['CODNAN'] = '';
            }
            $params['CODE_CDC_LOCK'] = !$existePostSociete && !$userMonoSociete;
            $steCdc = $post['societe'] ?? '';
        }
        if ($params['SCASECTO'] = \Helpers\Outil\Roles::droit($this->pdo, 'SCASECTO', 'PARAMSTE')) {
            if (!$existePostSociete) {
                $post['CODE_SCA'] = $post['CODE_CTA'] = '';
            }
            $params['CODE_SCA_LOCK'] = !$existePostSociete && !$userMonoSociete;
            $steSca = $post['societe'] ?? '';
        }

        $params['IS_CG_ACTIVE'] = (new LicenceOxalys($this->pdo))->codeGestionActive();

        if (isset($post['CODE_SI']) && $post['CODE_SI'] != '') {
            // Récupération du libellé du SI
            $sectimpu = $sectimpu->find(['CODE_SI' => $post['CODE_SI'], 'CODE_STE' => $steSi]);
            $post['CODE_SI_LIBELLE'] = $sectimpu['LIBELLE'] . ' (' . $post['CODE_SI'] . ')';

            // Vérification si affichage du CG en fonction du SI
            $affichageCodeGestion = Sql::boolSql($sectimpu['SICODG']);
            if (isset($post['ID_CG']) && $post['ID_CG'] != '') {
                $Codgest = new \Entity\Model\Codgest($this->pdo);
                $codegestion = $Codgest->find(['CODE_AFF' => $post['ID_CG']], [], ['filter_egal_CODE_SI' => $post['CODE_SI'], 'filter_egal_CODE_STE' => $steSi]);
                if (!$codegestion) {
                    $codegestion = $Codgest->find(['CODE_GES' => $post['ID_CG']], [], ['filter_egal_CODE_SI' => $post['CODE_SI'], 'filter_egal_CODE_STE' => $steSi]);
                }
                // Récupération du libellé du CG
                $post['CodeGestion_LIBELLE'] = $codegestion['LIB_GES'] . ' (' . $codegestion['CODE_AFF'] . ')';
            }
        }

        // Récupération du libellé CDC
        if (isset($post['CODE_CDC']) && $post['CODE_CDC'] != '') {
            $codecomp = $codecomp->find(['CODE_CDC' => $post['CODE_CDC'], 'CODE_STE' => $steCdc]);
            $post['CODE_CDC_LIBELLE'] = $codecomp['LIBELLE'] . ' (' . $post['CODE_CDC'] . ')';
        }

        // Récupération du libellé SCA
        if (isset($post['CODE_SCA']) && $post['CODE_SCA'] != '') {
            $sscptana = $sscptana->find(['CODE_SCA' => $post['CODE_SCA'], 'CODE_STE' => $steSca]);
            $post['CODE_SCA_LIBELLE'] = $sscptana['LIBELLE'] . ' (' . $post['CODE_SCA'] . ')';
        }

        // Récupération du libellé Direction
        if (isset($post['CODE_DIR']) && $post['CODE_DIR'] != '') {
            $directio = $directio->find(['CODE_DIR' => $post['CODE_DIR'], 'CODE_STE' => $steSi]);
            $post['CODE_DIR_LIBELLE'] = $directio['LIBELLE'] . ' (' . $post['CODE_DIR'] . ')';
        }

        // Récupération du libellé Nature analytique
        if (isset($post['CODNAN']) && $post['CODNAN'] != '') {
            $natana = $natana->find(['CODNAN' => $post['CODNAN'], 'CODE_STE' => $steCdc]);
            $post['CODNAN_LIBELLE'] = $natana['LIBELLE'] . ' (' . $post['CODNAN'] . ')';
        }

        // Récupération du libellé Centre d'analyse
        if (isset($post['CODE_CTA']) && $post['CODE_CTA'] != '') {
            $centrana = $centrana->find(['CODE_CTA' => $post['CODE_CTA'], 'CODE_STE' => $steSca]);
            $post['CODE_CTA_LIBELLE'] = $centrana['LIBELLE'] . ' (' . $post['CODE_CTA'] . ')';
        }

        $listesFacture= new \Modules\Facture\Repository\ListesFacture($this->pdo);
        $factures = $listesFacture->listeLigne($post);

        $menuContextuel = new ListeFactureMenuContextuel($this->pdo, $this->router, $this->getTranslationService());
        foreach ($factures as &$fac) {
            $fac['menuContextuel'] = $menuContextuel->generateLigne($fac);
        }
        
        $infoPagination = \Helpers\Pagination\PaginatorGestion::getInfoPagination();

        // Listes pour filtres ou affichage des descriptions des codes
        $listeType        = ['F' => $trad->t('Fac'), 'A' => $trad->t('Avr')];
        $listeArchive     = ['' => $trad->t('Toutes les factures'), 'oui' => $trad->t('Factures archivées'), 'non' => $trad->t('Factures non archivées')];
        $listeSiDirection = ['si' => $trad->t('SI'), 'direction' => $trad->t('Direction')];
        $listeCdcNa       = ['cdc' => $trad->t('CDC'), 'na' => $trad->t('Nature analytique')];
        $listeScaCa       = ['sca' => $trad->t('SCA'), 'ca' => $trad->t('Centre d\'analyse')];

        $listeFiltreStatut = [
            'AffectationsASaisir'  => $trad->t('Affectations à saisir'),
            'AffectationsAValider' => $trad->t('Affectations à valider'),
            'FacRefus'             => $trad->t('Factures refusée'),
            'AttenteBAP'           => $trad->t('Attente du bon à payer'),
            'EnLitige'             => $trad->t('Factures en litige'),
            'EnAttenteSignature'   => $trad->t('Factures en attente de signature'),
            //'ATransfererEnCompta'  => $trad->t('A transférer en compta'),
            'BAPSignes'            => $trad->t('BAP signés'),
            'BAPRefuses'           => $trad->t('BAP refusés'),
            'PreAffectees'         => $trad->t('Factures pré-affectées'),
            'PartiellementReglees' => $trad->t('Factures partiellement réglées'),
            'TotalementReglees'    => $trad->t('Factures totalement réglées'),
            'NonReglees'           => $trad->t('Factures non réglées'),
            'Rejet'                => $trad->t('Factures rejetées'),
            'EnteteCompta'         => $trad->t('Entête en compta'),
            'affectationsCompta'   => $trad->t('Affectation en compta'),
            'EnteteAffectCompta'   => $trad->t('Entête et affectation en compta'),
            'BAPenCompta'          => $trad->t('BAP en compta'),
        ];

        // $filtreAvance = new \Helpers\Filter\FiltreAvance\Generator($post, 'FAC_LIG', 'lig.NUM_FACT', $this->pdo);
        $filtreAvance = new \Helpers\Filter\FiltreAvance\Generator($post);
        $filtreAvance->setFiltre('lig.DESIGNAT', 'text', $trad->t('Désignation'));
        $filtreAvance->setFiltre('lig.AFF_TMP', 'bool', $trad->t('Pré-aff. ?'), '', null, null, 'bdd');
        $filtreAvance->setFiltre('lig.NUM_FACT', 'numeric', $trad->t('Numéro Enregistrement'));
        $filtreAvance->setFiltre('lig.NUM_LIG', 'numeric', $trad->t('Lignes Facture'));
        $filtreAvance->setFiltre('lig.QUANTITE', 'numeric', $trad->t('Quantité'));
        $filtreAvance->setFiltre('lig.PU_REMISE', 'numeric', $trad->t('PU remisé'));
        $filtreAvance->setFiltre('lig.MONTANT', 'numeric', $trad->t('Montant HT'));
        $filtreAvance->setFiltre('lig.TYPE_TVA', 'text', $trad->t('Type de TVA'));
        $filtreAvance->setFiltre('lig.CODE_PROFIL_TVA', 'text', $trad->t('Profil de TVA'));
        $filtreAvance->setFiltre('cg.CODE_AFF', 'text', $trad->t('Code gestion'));
        
        $listeType = ['F' => $trad->t('Fac'), 'A' => $trad->t('Avr')];

        \Helpers\Ariane\Ariane::generate(0, $trad->t('Liste Lignes'), $post, $infoPagination['nbrArticle']);

        return $this->renderer->render('@listes-facture/liste-ligne', [
            'menuActive'                => 'Facture',
            // 'menuLeft'                  => 'Listes',
            'post'                      => $post,
            'factures'                  => $factures,
            'infoPagination'            => $infoPagination,
            'listeType'                 => $listeType,
            'filtreAvance'              => $filtreAvance->getFiltres(),
            'initFiltreAvance'          => $filtreAvance->getInit(),
            
            'userMonoSociete'           => $userMonoSociete,
            'params'                    => $params,
            'type'                      => $post['type'] ?? '',
            'listeArchive'              => $listeArchive,
            'listeSiDirection'          => $listeSiDirection,
            'listeCdcNa'                => $listeCdcNa,
            'listeScaCa'                => $listeScaCa,
            'listeFiltreStatut'         => $listeFiltreStatut,
            'affichageCodeGestion'      => $affichageCodeGestion ?? 0,
        ]);
    }
}
