<?php 


class OPFGlobal
{
    //data webservices
    public $user = "";
    public $key  = "";
    public $url='https://opfhub.globalb.co';
    public $chdir='/home/gbcoha2h/public_html/opfhub';

    //data database
    protected $host="localhost";
    protected $userdb="gbcoha2h_useropfhub";
    protected $pass='9FsBco0vi+AlppRZ';
    protected $bd="gbcoha2h_opfhub";
    protected $charset="utf8";
    //link to connections with db
    public $link;

    public $meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
    public $IVA=19;

      //arrays con datos
      public $wsEntity; //obtenemos los datos para uso de ws de las entidades
      public $Entity; //obtenemos datos de las entidades

    function __construct()
    {
        
    }   

     //############################################################################################################################################################  
    /**
     * conexion con el opf
     */
    public function conexion()
    {
        $this->link = mysqli_connect($this->host,$this->userdb,$this->pass,$this->bd);
        $this->link->set_charset($this->charset);   
    } 

     //############################################################################################################################################################  
    /**
     * funcion para inicilizar los arrays con los datos correspondientes.
     * Arrays: wsEntity
     * Arrays: Entity
     * Link: link para efectuar operacion con mysqli_
     */
    public function initOPF()
    {
      $this->conexion();
      $this->initWsEntity();
      $this->getEntity();
      $this->getTax();
    }
     //############################################################################################################################################################  
    //GETTES SETTERS
    public function getTax()
    {
        $result = mysqli_query($this->link, "SELECT * FROM vtiger_inventorytaxinfo where taxlabel = 'IVA' and deleted='0'");
        if($result){
            $row = mysqli_fetch_array($result);
            $this->IVA = $row['percentage'];
            return $row;
        }
        return [];
    }
     //############################################################################################################################################################  
    /**
     * crear viar webservice
     * @param $module = Nombre del modulo
     * @param $dataws = array de informacion q debe mandar el array relacionado
     * @param $ficheroLog archivo donde registrar lo q se hace
     * @param $die, saber si el proceso debe morir al terminar esta funcion
     */
    public function crearByWS($module, $dataws, $ficheroLog='crearByWS.log', $die=true, $exception=false)
    {
          chdir($this->chdir);
        include_once 'vtwsclib/Vtiger/WSClient.php';
        error_log("crearByWS: data ->  ".json_encode($dataws)."\n", 3, $ficheroLog);
        $client = new Vtiger_WSClient($this->url);
        $login = $client->doLogin($this->user, $this->key);
        $recordid = null;
        if($login) {
            //echo "WEBSERVICE PRODUCT LOGUEADO</BR>";
            $record=$client->doCreate($module,$dataws);
            if ($record) {
                $recordid = $client->getRecordId($record['id']);
                  error_log("crearByWS: crear $module ->  ".json_encode($recordid)."\n", 3, $ficheroLog);
                //echo json_encode(['success'=>1,'message'=>"Done!!!",'id'=>$recordid],200);
                $die && die;
            }else{
                $recordid=$client->lastError();
                $recordid=json_encode(array('Result'=>'0', 'id'=>$recordid));
                error_log("error crearByWS: crear $module error ->  ".json_encode($recordid)."\n", 3, $ficheroLog);
                if(!$exception){
                    echo json_encode(['success'=>0,'message'=>"Error ",'id'=>$recordid],400);
                }else{
                    throw new Exception(json_encode($client->lastError()));
                }
                $die && die;
            }
        }else{
            if(!$exception){
                echo json_encode(['success'=>0,'message'=>"login error"],400);
            }else{
                throw new Exception("login error");
            }
          $die && die;
        }
        if(!$die){
            return $recordid;
        }
    }

     //############################################################################################################################################################  
    /**
     * @param $data array de datos para actualizar
     * @param $entidad id del ws, tabla vtiger_ws_entity
     * @param $record id del registro
     * @param $ficheroLog archivo donde registrar lo q se hace
     * @param $die, saber si el proceso debe morir al terminar esta funcion
     * @param $exception, saber si el proceso debe enviar una exception o un json.
     */
    public function updateWS($data,$entidad,$record, $ficheroLog='updateByWS.log', $die=true, $exception=false)
    {
        error_log("updateByWS: data ->  ".json_encode($data)."\n", 3, $ficheroLog);
        error_log("updateByWS: entidad ->  ".json_encode($entidad)."\n", 3, $ficheroLog);
        error_log("updateByWS: record ->  ".json_encode($record)."\n", 3, $ficheroLog);

        chdir($this->chdir);
        include_once 'vtwsclib/Vtiger/WSClient.php';
        $client = new Vtiger_WSClient($this->url);
        $login = $client->doLogin($this->user, $this->key);
        $dataWS = $client->doRetrieve($entidad.'x'.$record);
     
        foreach ($dataWS as $k => $v) {
            if(!empty($data[$k])){
               $dataWS[$k]=$data[$k];
            }
        }
        //echo "ARRAY FINAL <br>";
        //echo json_encode($data);
        //echo json_encode($dataWS);
        $recordid =null;
        $record=$client->doUpdate($dataWS);
        if ($record) { 
            $recordid = $client->getRecordId($record['id']);
            error_log("updateByWS: update done ->  ".json_encode($recordid)."\n", 3, $ficheroLog);
        }else{
            $recordid=$client->lastError();
            $recordid=json_encode(array('Result'=>'0', 'id'=>$recordid));
            error_log("error updateByWS: update error ->  ".json_encode($recordid)."\n", 3, $ficheroLog);
            if(!$exception){
                    echo json_encode(['success'=>0,'message'=>"Error ".$entidad,'id'=>$recordid],400);
                }else{
                    throw new Exception(json_encode($client->lastError()));
                }
            $die && die;
        }
        if(!$die){
            return $recordid;
        }
    }
     //############################################################################################################################################################  

     /**
     * funcion para obtener los datos de la tabla de entidad relacionada.
     * @param $setype = nombre del modulo
     * @param $relation_id = id de la entidad relacionada.
     * 
     * @return $columname
     */
    public function getDataTable($setype, $relation_id)
    {
        $this->conexion();
        //$result = mysqli_query($this->link,"SELECT * FROM vtiger_entityname WHERE tabid = (SELECT tabid FROM vtiger_tab where name = 'Accounts'");
        $result = mysqli_query($this->link,"SELECT * FROM vtiger_entityname WHERE modulename = '$setype'");
        $columnname = '';
        if($result){
            $data = mysqli_fetch_array($result);
            $tablename = $data["tablename"];
            $fieldname = $data["fieldname"];
            $entityidfield = $data["entityidfield"];
            if(strpos($fieldname,',')!=false){
                $columns = explode(',',$fieldname);
                $fieldname = "CONCAT($columns[0],' ',$columns[1])";
            }
            $resultEntity = mysqli_query($this->link,"SELECT $fieldname as titulo FROM $tablename WHERE $entityidfield = '$relation_id'");
            $dataEntity = mysqli_fetch_array($resultEntity);
            $columnname = $dataEntity['titulo'];
        }
        return $columnname;
    }

    //############################################################################################################################################################  
    /**
     * obtener datos del modulo en la tabla ws_entity. recibe modulo.
     */
    public function getWsEntity($module='Users')
    {
        if($this->link == null){
            $this->conexion();
        }
        $query = "SELECT * from vtiger_ws_entity WHERE name='$module'";
        $result = mysqli_query($this->link,$query);
        $data = array();
        if($result){
            $rowData = mysqli_fetch_array($result);
          $data['id'] = $rowData['id'];
        }
        return $data;
    }

    //############################################################################################################################################################  
      /**
     * obtener los datos de las entidades para uso de WS
     * asocia valores a una variable global.
     */
    protected function initWsEntity()
    {
        $this->wsEntity = [];
        $result = mysqli_query($this->link,"SELECT id, name FROM vtiger_ws_entity"); //and u.id = $userId
        if($result){
            while ($rowData = mysqli_fetch_assoc($result)) {
              $this->wsEntity[$rowData['name']] = $rowData['id'];
            }
        }
    }

    //############################################################################################################################################################  
      /**
     * obtener los datos de las entidades
     * @return $data, array de usuarios
     */
    protected function getEntity()
    {
        $this->Entity = [];
        $result = mysqli_query($this->link,"SELECT * FROM vtiger_entityname"); //and u.id = $userId
        if($result){
            while ($rowData = mysqli_fetch_assoc($result)) {
              $this->Entity[$rowData['modulename']] = $rowData['tabid'];
            }
        }
    }

    //############################################################################################################################################################  
      /**
     * obtener los datos de blocks de cada modulo
     * @param tabid
     * @return $data blocks
     */
    protected function getEntityBlocks($tabid)
    {
        $result = mysqli_query($this->link,"SELECT * FROM vtiger_blocks where tabid = '$tabid'"); //and u.id = $userId
        $data = array();
        if($result){
            while ($rowData = mysqli_fetch_assoc($result)) {
              $dataAux['blockid'] = $rowData['blockid'];
              $dataAux['blocklabel'] = $rowData['blocklabel'];
              $dataAux['tabid'] = $rowData['tabid'];
              $data[$rowData['blocklabel']] = $dataAux;
            }
        }
        return $data;
    }
    //#######################################################################################################################//
    /**
     * obtener data de la cuenta relacionada al ticket
     * @param $tablename = nombre de la tabla para obtener los campos
     * @param $modulename = Nombre del modulo q le pertenece la tabla
     * @param $group=id del grupo q desea obtener
     * @return data de la ceunta asociada al ticket
     */
    public function getFieldsModule($tablename='vtiger_account', $modulename='Accounts', $group='')
    {
      $this->getEntity();
      $blocks = $this->getEntityBlocks($this->Entity[$modulename]);
      if($group!=''){
        $blocks = $blocks[$group];
      }
      $data = array();
      foreach ($blocks as $key => $block) {
        $group = $block['blockid'];
        $result = mysqli_query($this->link, "SELECT * FROM vtiger_field where tablename = '$tablename' and block = '$group' order by sequence");
          if($result){
              while ($rowData = mysqli_fetch_assoc($result)) {
                $dataAux['fieldname'] = $rowData['fieldname'];
                $dataAux['fieldlabel'] = $rowData['fieldlabel'];
                $data[$key][] = $dataAux;
            }
          }
      }
        return $data;
    }
     
     //#######################################################################################################################//
    /**
     * @param recordid recibe el id del registro del modulo que queramos obtener.
     * @param $dataCampos, array con el nombre de los campos q debe obtener del tablename
     * @param $tablename = nombre de la tabla para obtener los campos de las secciones 
     */
    public function getDataModule($recordid, $dataCampos, $tablename='vtiger_account', $fieldMain='accountid')
    {
      $result = mysqli_query($this->link,"SELECT * FROM $tablename where $fieldMain = '$recordid'"); //and u.id = $userId
        $data = array();
        if($result){
            while ($rowData = mysqli_fetch_assoc($result)) {
        foreach ($dataCampos as $arrayCampos) {
          foreach ($arrayCampos as $key => $value) {
            $dataAux[$key] = $value;
              $dataAux[$key]['value'] = $rowData[$value['fieldname']];
          }
          array_push($data, $dataAux);
        }
            }
        }
        return $data;
    }
    //############################################################################################################################################################  
    /**
     * @param $recorid id del registro del modulo
     * @param $moduleName = nombre del modulo
     * @param $tablename tabla del modulo de los que obtener los datos
     * @param $fieldNamin campo principal para buscar
     * @param $group='' id del grupo q desea obtener, si los quiere todos enviar vacio
     */
    public function getAllModule($recordid, $modulename='Accounts', $tablename='vtiger_account', $fieldMain='accountid', $group='')
    {
      return $this->getDataModule($recordid, $this->getFieldsModule($tablename, $modulename, $group), $tablename, $fieldMain);
    }
    //############################################################################################################################################################  
    /**
     * obtener los usuarios del sistema con role=H5
     */
    public function getUserKey($userId)
    {
        $result = mysqli_query($this->link,"SELECT user_name, accesskey FROM vtiger_users WHERE status='Active' and id = '$userId'"); //and u.id = $userId
        $data = array();
        if($result){
            $rowData = mysqli_fetch_array($result);
            $data['user_name'] = $rowData['user_name'];
            $data['accesskey'] = $rowData['accesskey'];
        }
        return $data;
    }

    //############################################################################################################################################################  
    /**
     * setear los valores dle usuario conectado para la conexion por el ws.
     */
    public function setearValues($data)
    {
        $this->user = $data['user_name'];
        $this->key = $data['accesskey'];
    }
    //############################################################################################################################################################  

    public function setearMonedas($moneda)
    {
        return explode('.',$moneda)[0];
    }

    //############################################################################################################################################################  
    public function setearHoras($fechaconHora, $zonaHoraria='America/Santiago')
    {
      return date('Y-m-d H:i:s',strtotime(date($fechaconHora)." - 240 minutes"));
      die;
      $date = new DateTime($fechaconHora, new DateTimeZone($zonaHoraria));
      return $date->format('Y-m-d H:i:sP');
    }
    //############################################################################################################################################################  
    /**
     * @param $modulename = nombre del modulo
     * @param $crmidrel = id de la entidad relacionada.
     * 
     */
    public function crearURL($modulename, $crmidrel)
    {
        $columnname = $this->getDataTable($modulename, $crmidrel); 
        //no se puede usar, por los caracterese especiales
        return "<a href='/index.php?module=$modulename&view=Detail&record=$crmidrel' target='_blank'> $columnname </a>"; //queda pendiente cerrar el
    }

     //#######################################################################################################################################################################
    /**
     * @param $data = data del POST para crear documento y relación
     * @param $file = Archivo que viene en la peticion $_FILES
     * 
     * data ws:
     * cf_1343= es el tipo de documento cargado, cf_1873 = "tabid_ws".$recordid = relacion con la fuente, al q se le cargara el documento (solo acepta despacho), cf_2089 = "66x" relacion con la plantilla de documentos
     * 
     */
    public function cargarArchivos($data, $file)
    {
        $this->initOPF();
        chdir($this->chdir);
        unlink("cargarArchivos.log");
        error_log("loadDocumento data: ".json_encode($data)."\n", 3, "cargarArchivos.log");
        error_log("loadDocumento file: ".json_encode($file)."\n", 3, "cargarArchivos.log");

        $filename = $file['name'];
        $filetype =$file['type'];
        $filetmp_name = $file['tmp_name'];
        $recordid = $data['recordid'];
        $notecontent = isset($data['notecontent']) ? $data['notecontent'] : '';
        $cf_2089 = isset($data['cf_2089']) ? "66x".$data['cf_2089'] : ''; //bind with plantillaoperaciones.
        $cf_1873 = isset($data['cf_1873']) ? "30x$recordid" : ''; //bind with project
//notecontent, title, 
        $data=array("notes_title"=> $filename,'notecontent'=>'',"filename"=> $filename,"filesize"=>$file['size'],"filetype"=> $filetype,"filestatus"=>1,"filelocationtype"=>"I","cf_1343"=>'',"cf_1873"=>$cf_1873,"cf_2089"=>$cf_2089);
        $idcreacionws = $this->crearByWS("Documents",$data,"cargarArchivos.log",false);
        
        mysqli_query($this->link,"INSERT INTO vtiger_senotesrel VALUES ('$recordid','$idcreacionws')");

        $date_var =date("Y-m-d H:i:s");
     //Variables de Creacion
        /*$current_id=1;
        $current_user=1;
        $ownerid=1;
        $type="Documents";
        $save_file = 'true';
        */
        $sql=mysqli_query($this->link,"SELECT * FROM vtiger_crmentity_seq WHERE 1");
        $data= mysqli_fetch_array($sql);
        $idcrm=$data['id']+1;
        error_log("loadDocumento idcrm: ".json_encode($idcrm)."\n", 3, "cargarArchivos.log");

        mysqli_query($this->link,"UPDATE vtiger_crmentity_seq SET id='$idcrm'");
        //campos completos
        mysqli_query($this->link,"INSERT INTO vtiger_crmentity  VALUES ('$idcrm','1','1','1','Documents Attachment',NULL,'$date_var','$date_var',NULL,NULL,'0','1','0','0','WEBSERVICE','$filename')"); //duda de si debe ser idcrm o id de notesid

        $upload_file_path =$this->initStorageFileDirectory();
        error_log("loadDocumento upload_file_path: ".json_encode($upload_file_path)."\n", 3, "cargarArchivos.log");
        
        //$encryptFileName = getEncryptedFileName($filename);
        if(strpos($filename,'.')==false){
            $type = explode('/', $filetype);
            $extension = is_array($type) ? $type[1] : 'pdf';
            $filename .= '.'.$extension;
        }
        $final=$upload_file_path.$idcrm."_".$filename;
        error_log("loadDocumento final: ".json_encode($final)."\n", 3, "cargarArchivos.log");

        $upload_status = copy($filetmp_name, $final);
        error_log("loadDocumento upload_status: ".json_encode($upload_status)."\n", 3, "cargarArchivos.log");
        
        //Add entry to attachments
        mysqli_query($this->link,"INSERT INTO vtiger_attachments  VALUES ('$idcrm', '$filename',NULL, '$filetype', '$upload_file_path','$filename',NULL)");
         
          //Add relation
        mysqli_query($this->link,"INSERT INTO vtiger_seattachmentsrel VALUES ('$idcreacionws','$idcrm')");
        //return $idcrm.$idattach;
        return 1;
        
    }
    //#######################################################################################################################################################################
    private function initStorageFileDirectory() {
        $filepath = 'storage/';
        $year  = date('Y');
        $month = date('F');
        $day   = date('j');
        $week  = '';
        $permissions = 'gbcodesa:gbcodesa';
        if (!is_dir($filepath . $year)) {
                //create new folder
                mkdir($filepath . $year);
                $yearPath = $filepath.$year;
                exec("chown -R $permissions  $yearPath");
        }

        if (!is_dir($filepath . $year . "/" . $month)) {
                //create new folder
                $monthFilePath = "$year/$month";
                $monthPath = $filepath.$monthFilePath;
                mkdir($filepath . $monthFilePath);
                exec("chown -R $permissions  $monthPath");
        }
        if ($day > 0 && $day <= 7)
                $week = 'week1';
        elseif ($day > 7 && $day <= 14)
                $week = 'week2';
        elseif ($day > 14 && $day <= 21)
                $week = 'week3';
        elseif ($day > 21 && $day <= 28)
                $week = 'week4';
        else
                $week = 'week5';

        if (!is_dir($filepath . $year . "/" . $month . "/" . $week)) {
                //create new folder
                $weekFilePath = "$year/$month/$week";
                $weekPath = $filepath . $weekFilePath;

                mkdir($filepath . $weekFilePath );
                exec("chown -R $permissions  $weekPath");
        }
        $filepath = $filepath . $year . "/" . $month . "/" . $week . "/";
        return $filepath;
    }
     //#######################################################################################################################################################################
    public function consultarDoc($recordid)
    {
        $query = "SELECT n.notesid, note_no, title, label, name, CONCAT(path,a.attachmentsid,'_',storedname) AS ruta, a.type FROM vtiger_notes n 
                        INNER JOIN vtiger_notescf ncf on ncf.notesid = n.notesid 
                        INNER JOIN vtiger_senotesrel sn on sn.notesid = n.notesid 
                        INNER JOIN vtiger_crmentity c on c.crmid = n.notesid and c.deleted = '0' 
                        INNER JOIN vtiger_seattachmentsrel sa on sa.crmid = n.notesid 
                        INNER JOIN vtiger_attachments a on a.attachmentsid = sa.attachmentsid 
                        WHERE sn.crmid = $recordid ORDER BY notesid DESC";//n.notesid = 101949";
        $res = mysqli_query($this->link, $query);
        $data = array();
        if($res && mysqli_num_rows($res)>0){
            $data = mysqli_fetch_array($res, MYSQLI_ASSOC);
            //$type = explode('/', $data['type']);
            //$extension = is_array($type) ? $type[1] : 'pdf';
            //$data['ruta'] = $data['ruta'].'.'.$extension;
        }
        return $data;
    }
     //#######################################################################################################################################################################
    //#######################################################################################################################################################################
    /**
     * obtener informacion de la tasa de acmbio, según la moneda.
     */
    public function getTasacambio($tasacambio='999 -- Dolar Aduanero')
    {
        $res = mysqli_query($this->link, "SELECT * FROM vtiger_tasasdecambio INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid=vtiger_tasasdecambio.tasasdecambioid WHERE deleted='0' and  tasasdecambio_tks_moneda LIKE '%$tasacambio%' ORDER BY tasasdecambioid DESC limit 1");//tasasdecambio_tks_moneda != '999 -- Dolar Aduanero' and
        $data = array();
        if($res){
            $data = mysqli_fetch_array($res);
        }
        return $data;
    }
     //#######################################################################################################################################################################
    /**
     * Dolar minimo, mirar el valor del dolar en la tasadecambio y el valor tambien en la CH
     * La carta de honorario, tiene un campo de dólar mínimo, toca comprarlo con la tasa de cambio que se está utilizando. Si es menor la tasa de cambio al dólar minimo- se deja el dólar mínimo
     */
    public function dolarMinimo($projectid)
    {
        $Tasacambio = $this->getTasacambio();//por default trae dolar
        
        $res = mysqli_query($this->link, "SELECT * FROM vtiger_quotes q INNER JOIN vtiger_quotescf qcf on qcf.quoteid = q.quoteid inner join vtiger_project p on q.accountid = p.linktoaccountscontacts WHERE projectid = $projectid");
        $data = array();
        if($res){
            $row = mysqli_fetch_array($res);
            if(isset($Tasacambio['tasasdecambio_tks_valor']) && ($row['cf_2173'] > $Tasacambio['tasasdecambio_tks_valor'])){ //Si es menor la tasa de cambio al dólar minimo- se deja el dólar mínimo
                return ['tasasdecambioid'=>null,'tasasdecambio_tks_moneda'=>'DOLAR','tasasdecambio_tks_valor' =>$row['cf_2173']];
            }else{
                return ['tasasdecambioid'=>$Tasacambio['tasasdecambioid'],'tasasdecambio_tks_moneda'=>$Tasacambio['tasasdecambio_tks_moneda'],'tasasdecambio_tks_valor' =>$Tasacambio['tasasdecambio_tks_valor']];
            }
        }
        return [null,'NA',0];
    }
     //#######################################################################################################################################################################
     /**
     * Funcion global para subir docs utilizando archivo principal /UploadDocumentWS.php de Daniel Riaño
     * @autor : Michael Garcia 
     * fecha : 23/01/2024
     * Esta funcion recibe un _POST que contiene recordid, tipo y name_doc ademas del respectivo _FILE
     * el recordid es donde quedará relacionado el documento subido, tipo es el campo tipo dentro del documento y name_doc el nombre del mismo
     * IMPORTANTE: la etiqueta con la que llegan los _FILES debe ser 'file' de la siguiente manera: $_FILES['file']
     */

     public function uploaddoc($post){
        //echo "lleha";
        //var_dump($_FILES);
        include($_SERVER['DOCUMENT_ROOT'].'/configOPFBasic.php');
        $url=$url.'/UploadDocumentWS.php';
        error_log("info de CURL  ".json_encode($_FILES)."\n", 3, "infodocs.log");
                $fuente=$post['recordid'];
        error_log("info de fuente  ".json_encode($fuente)."\n", 3, "infodocs.log");
        
            $name=$_FILES['file']['name'];
                $type=$_FILES['file']['type'];
                $_FILES['file']['size'];
                $tmp_name=$_FILES['file']['tmp_name'];
                $_FILES['file']['error'];
                $base=$post['tipo'];
                $aname=$post['name_doc'];
                $ch = curl_init();
                $cfile =  new CURLFile($_FILES['file']['tmp_name'],$_FILES['file']['type'],$aname);
                    $postDocs = array('file'=>$cfile,
                       'tipo'=>$base,
                       'source'=>$fuente);
        error_log("info de CURL POST  ".json_encode($postDocs)."\n", 3, "infodocs.log");
        
                curl_setopt($ch, CURLOPT_URL,$url);
                curl_setopt($ch, CURLOPT_POST, TRUE);
                curl_setopt($ch, CURLOPT_POSTFIELDS,$postDocs);
                $response = curl_exec($ch);
                if($response == true){
                   // echo "Your image has been uploaded successfully";
                }else {
                // curl error returns a string comprising of error for the current session
                //        echo "Error!" . curl_error($ch);
        error_log("info de CURL error  ".json_encode($response)."\n", 3, "infodocs.log");
               
         }
                curl_close($ch);
        consultdoc($fuente);
        error_log("info de respuesta ".json_encode($response)."\n", 3, "infodocs.log");
        
        }
     //#######################################################################################################################################################################
}



 ?>
