<?php
require_once 'application/class/class_panier.php';

$num_ligne['id_lig'] = getValue('id_lig');

$table_cs = 'DA_LIGNE';

$panierEntete = new PanierEntete();
$panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);

if ($panierEntete->isPanierModifDocPourSignature()) {
    $origine = explode('|', $panierEntete->getORIGINE());
    
    if (TypeSuivi::CDE == $origine[1])
        $table_cs = 'CA_LIGNE';
    elseif (TypeSuivi::DA == $origine[1])
        $table_cs = 'DA_LIGNE';
    
    $contexteModificationCS = 'signerModifDocument';
} else
    $contexteModificationCS = '';

$object = GetValue('OBJECT');

$isHttp = (GetValue('THROUGH') == 'TRUE');

if ($isHttp) {
    $obj_xml = new GenXslt();
    switch (GetValue('MODE')) {
        // Mode appserveur
        case 'httpreq': // mode reponse sur les updates
            $object = GetValue('OBJECT');
            $form_parent = GetValue('form_parent');
            $champ = GetValue('champ');
            $prg_appel = GetValue('prg_appel');
            
            /*** SPEC 4241 Caractéristiques complémentaires : MAJ d'un CC calculé ***/
            if (GetValue('action') == 'updateCC') {
                // Remplacement des tags par leur valeur
                $id_lig = getValue('id_lig');
                $lignePanier = TrouveLignePanier($_SESSION['id_panier'], $id_lig);
                $formule = preg_split('/(<[^>]*[^\/]>)/i', getValue('formule'), -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
                foreach($formule as &$element){
                    $element = str_replace(['<', '>'], '', $element);
                    if(strpos($element, 'CC_') !== FALSE){
                        $id_cc = str_replace('CC_', '', $element);
                        $input_id = 'CS_CC'.$id_lig.'_'.$id_cc.'_VALEUR';
                        $element = getValue($input_id) == '' || !is_numeric(getValue($input_id)) ? 0 : getValue($input_id);
                    }elseif($element=='PU'){
                        $element = $lignePanier['PX_ART'];
                    }elseif($element=='MNT_LIG_HT'){
                        $element = '('.$lignePanier['PX_ART'].'*'.$lignePanier['qte'].')';
                    }elseif($element=='MNT_LIG_TTC'){                       
                        $element = '('.$lignePanier['PX_ART'].'*'.$lignePanier['qte'].'*(1+'.$lignePanier['TAUX_TVA'].'/100))';
                    }else{
                        $element = $element;
                    }         
                }
                $formule = implode($formule);

                // Calcul de la formule
                try {
                    $formule = eval('$form_evalue=number_format(('.$formule.'), '.GetValue('decimal').', ".", "");');
                } catch (Throwable $t) {
                    $form_evalue = number_format('0', GetValue('decimal'), ".", "");
                }
                if(!is_finite($form_evalue)){
                    $form_evalue = number_format('0', GetValue('decimal'), ".", "");
                }
                
                // MAJ de la valeur dans l'input
                Affichage::setValue('CS_CC'.$id_lig.'_'.getValue('cc2upd').'_VALEUR', $form_evalue);    
            }elseif ($object == 'save_modif') {
                /*** SPEC 4241 Caractéristiques complémentaires : Contrôle des CC ***/
                $liste_cc_nouvelle_ligne = array();
                if ('' != getValue('Liste_num_fix_cc')) {
                    $liste_cc = explode('|', getValue('Liste_num_fix_cc'));
                    foreach ($liste_cc as $num_cc) {
                        $enreg_cc = explode('__', $num_cc);
                        $data_cc = SqlCaracteristiquesCompl::getCCDoc('PAN', $_SESSION['id_panier'], $num_ligne['id_lig'], $_SESSION['id_user'], null, $enreg_cc[2])->Trouve1();
                        $valeurCC = getValueCS("CS_CC".$num_ligne['id_lig']."_".$enreg_cc[2]."_VALEUR");
                        if ($data_cc['FORMAT'] != 'L' && ($valeurCC == null || $valeurCC == '') && !BoolSql($data_cc['CC_UPD_ONLY_RECEIPT']) && BoolSql($data_cc['CC_REQUIRED'])) {
                            Affichage::messageJS(strBuild(trad('La caractéristique complémentaire @1@ est obligatoire, veuillez la renseigner.'), $data_cc['NOM']));
                            return false;
                        }
            
                        $data_cc['VALEUR'] = $valeurCC;
                        $data_cc['TYPE'] = $data_cc['CC_TYPE'];
                        if($data_cc['FORMAT'] == 'L') { 
                            // Les logiques sont enregistrés en BDD en format O ou N
                            $data_cc['VALEUR'] = BoolSql($data_cc['VALEUR']) ? 'O' : 'N';
                        } 
                        
                        $data_cc['COD_TAB'] = $enreg_cc[0]; // Table d'appartenance du CC
                        $data_cc['NUM_FIX'] = $enreg_cc[2]; // Numéro identifiant du CC
                        
                        $data_cc['DOC_TYPE'] = 'PAN'; // Type du document
                        $data_cc['CC_FREE'] = 0; // CC libre ?

                        if($data_cc['FORMAT'] == 'U' || $data_cc['FORMAT'] == 'E'){
                            $data_cc['ALP_LONG'] = '3000';
                        }
                        
                        if($data_cc['FORMAT'] == '1'){
                            $data_cc['DEVISE'] = getValue("devise_CS_CC".$num_ligne['id_lig']."_".$enreg_cc[2]);
                        }
                        
                        // On contrôle la valeur du CC saisi par l'utilisateur
                        $CS = new CS($data_cc);
                        $code_retour = $CS->ControlValueCS();
                        if ($data_cc['FORMAT'] == 'D'){
                            // Les dates sont enregistrées en BDD en format AAAAMMDD
                            $data_cc['VALEUR'] = $CS->getVALEUR();
                        }
                        if ($data_cc['FORMAT'] == 'H'){
                            // Les heures sont enregistrées en BDD en format HHMMSS
                            $data_cc['VALEUR'] =  str_replace(':', '', $data_cc['VALEUR']);
                        }
        
                        if (0 == $code_retour[0]) {
                            Affichage::messageJS(CS::alertUser($code_retour[1], $data_cc['NOM']));
                            $connecteur->disconnect();
                            exit();
                        }
                        
                        $liste_cc_nouvelle_ligne[$enreg_cc[2]] = $data_cc;            
                    }
                }
                
                // Contrôle des CS
                $liste_cs = explode('|', getValue('Liste_num_fix_cs'));
                
                $panierEntete = new PanierEntete();
                $panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);
                $table_cs = 'DA_LIGNE';
                
                if ($panierEntete->isPanierModifDocPourSignature()) {
                    $origine = explode('|', $panierEntete->getORIGINE());
                    
                    if (TypeSuivi::CDE == $origine[1])
                        $table_cs = 'CA_LIGNE';
                    elseif (TypeSuivi::DA == $origine[1])
                        $table_cs = 'DA_LIGNE';
                }
                
                foreach ($liste_cs as $num_cs) {
                    $data_cs = SqlCs::rqGetInfoCS($table_cs, $num_cs)->Trouve1();
                    $data_cs['VALEUR'] = getValueCS("CS_{$num_ligne['id_lig']}_{$num_cs}_VALEUR"); // Valeur du champ
                    
                    if ('L' == $data_cs['FORMAT'])
                        $data_cs['VALEUR'] = BoolSql($data_cs['VALEUR']);
                    
                    $data_cs['ID_LIGNE'] = $num_ligne['id_lig']; // Numéro de ligne article concernée
                    $data_cs['COD_TAB'] = $table_cs; // Table d'appartenance du CS
                    $data_cs['NUM_FIX'] = $num_cs; // Numéro identifiant du CS
                    
                    $CS = new CS($data_cs);
                    $code_retour = $CS->ControlValueCS();
                    
                    if ('D' == $data_cs['FORMAT'])
                        $data_cs['VALEUR'] = $CS->getVALEUR();
                    
                    $array_sql[] = $data_cs;
                    if (0 == $code_retour[0]) {
                        Affichage::messageJS(CS::alertUser($code_retour[1], $data_cs['NOM']));
                        $connecteur->disconnect();
                        exit();
                    }
                }

                // MAJ CC et CS
                /*** SPEC 4241 Caractéristiques complémentaires : ajout de l'enregistrement des CC ***/
                if (is_array($liste_cc)) {            
                    $Pile = new PileSql(DB_OXAPROCDB);
                    foreach ($liste_cc as $num_cc) {
                        $enreg_cc = explode('__', $num_cc);
                        $valeur = $liste_cc_nouvelle_ligne[$enreg_cc[2]]['VALEUR'];
                        $Pile->AddRequeteSql(SqlCaracteristiquesCompl::rqUpdateValueCCDoc($valeur, $enreg_cc[2], 'PAN', $_SESSION['id_panier'], $num_ligne['id_lig'], $_SESSION['id_user']));
                    }
                    // Si la mise à jour des CC s'est déroulée correctement alors on poursuit avec la mise à jour des CS
                    if (!$Pile->Commit()) {
                        Affichage::messageJS(trad("Un problème est survenu lors de l'enregistrement des caractéristiques complémentaires."));
                        $connecteur->disconnect();
                        exit();
                    }
                }
                
                // Si la mise à jour des CS s'est déroulée correctement alors on ferme la popup
                if (! CS::UpdateCS($array_sql)) {
                    Affichage::messageJS(trad('Un problème est survenu lors de l\'enregistrement des CS'));
                    $connecteur->disconnect();
                    exit();
                }
                else{
                    echo "Oxa_getDevice().jQuery('.oxawin_close').trigger('click');";
                }
            }
            break;
    }
    $connecteur->disconnect();
    exit();
}

$panier = new Panier();
/*** SPEC 4241 Caractéristiques complémentaires : Récupération de la liste des CC ***/
$panier->getListeCCDoc('PAN', $_SESSION['id_panier'], $num_ligne['id_lig'], $_SESSION['id_user'], null, 'CC'.$num_ligne['id_lig'], 'gestion_cs_panier.php', 'frm_recherche');
$tmpCC = $panier->getListe_cc();
$array['article']['ListeCC'] = & $tmpCC['ListeCS'];
$array['article']['ListeCC']['liste_CC_calc'] = & $tmpCC['liste_CC_calc'];

// La quantité et le prix unitaire ne peuvent pas être modifiés dans la popup, donc uniquement la modification des valeurs des CC peuvent entrainer un recalcul des CC calculées
$liste_CC_calc = $array['article']['ListeCC']['liste_CC_calc'];
if(isset($liste_CC_calc) && is_array($liste_CC_calc)){
    foreach ($liste_CC_calc as $ligneCc)
    {
        if(count($ligneCc['tab_CC_CALC_EXP']) != 0){
            $tbl_onclick_ligne = [];
            $title = '';
            foreach($ligneCc['tab_CC_CALC_EXP'] as $variable_calc){
                if(strpos($variable_calc, 'CC_') !== FALSE){
                    $cc_id = explode('_', $variable_calc)[1];
                    $title .= $liste_CC_calc[$cc_id]['NOM'];                        
                    // ajouter un onchange sur l'input du cc
                    if(!isset($tbl_onclick_ligne[$cc_id])){
                        if(isset($liste_CC_calc[$cc_id]['onchange'])){
                            $liste_CC_calc[$cc_id]['onchange'] .= "Traite('divartcarcompl.php?action=updateCC&posLigne=".$compte."&cc2upd=".$ligneCc['CC_ID']."&formule=".urlencode($ligneCc['CC_CALC_EXP'])."&decimal=".$ligneCc['PD_LONG']."', document.forms.frm_recherche.elements[0]);";
                        }else{
                            $liste_CC_calc[$cc_id]['onchange'] = "Traite('divartcarcompl.php?action=updateCC&posLigne=".$compte."&cc2upd=".$ligneCc['CC_ID']."&formule=".urlencode($ligneCc['CC_CALC_EXP'])."&decimal=".$ligneCc['PD_LONG']."', document.forms.frm_recherche.elements[0]);";
                        }
                        $tbl_onclick_ligne[$cc_id] = 1;
                    }                        
                }elseif($variable_calc=='PU'){                        
                    $title .= 'PU';
                }elseif($variable_calc=='MNT_LIG_HT'){
                    $title .= 'MONTANT LIGNE HT';
                }elseif($variable_calc=='MNT_LIG_TTC'){                       
                    $title .= 'MONTANT LIGNE TTC';
                }else{
                    $title .= $variable_calc;
                }
            }
            $array['article']['ListeCC']['CS'][$ligneCc['index']]['actions']['!titre'] = $title;
        }
    }
    foreach ($liste_CC_calc as $ligneCc)
    {
        if(isset($ligneCc['onchange'])){
            $onchange = '';
            if(isset($array['article']['ListeCC']['CS'][$ligneCc['index']]['actions']['!onchange'])){
                $onchange = $array['article']['ListeCC']['CS'][$ligneCc['index']]['actions']['!onchange'];
            }
            $array['article']['ListeCC']['CS'][$ligneCc['index']]['actions']['!onchange'] = $onchange.$ligneCc['onchange'];
        }
    }
}

$panier->initListeCS(null, $table_cs, $num_ligne['id_lig'], (int) $num_ligne['id_lig'], "gestion_cs_panier.php", null, "frm_recherche", true, $contexteModificationCS);

$array['article']['ListeCS'] = $panier->getListe_cs()['ListeCS'];
$array['article']['id_lig']['!value'] = $num_ligne['id_lig'];
$array['article']['save']['!href'] = "Traite('divartcarcompl.php',document.frm_recherche.save_modif);";

$fichier_xsl = 'application/xsl/divartcarcompl.xsl';
$obj_xml = new GenXslt();

echo $obj_xml->XslHtml($fichier_xsl, $array);

$connecteur->disconnect();
exit();