Jump to content

Module migration from 1.6 to 1.7


Recommended Posts

<?php
if (!defined('_PS_VERSION_')) {
  exit;
}

include(_PS_MODULE_DIR_.'syncBsale/models/ApiBsale.php');
include(_PS_MODULE_DIR_.'syncBsale/models/Config.php');
include(_PS_MODULE_DIR_.'syncBsale/models/StockBsale.php');
include(_PS_MODULE_DIR_.'syncBsale/models/PriceBsale.php');
include(_PS_MODULE_DIR_.'syncBsale/models/DocumentBsale.php');

/**
* syncBsale Clase principal del módulo
*
* Contiene la vista principal de la interfaz de configuración,
* todos los hooks necesarios para sincronizar Stock y Pedidos
* todos los métodos Ajax de actión y generador de vistas,
*

*
* @package  syncBsale
* @author   SidecKick <[email protected]>
* @version  $Revision: 1.4
*/
class SyncBsale extends Module
{
  /**
  * Constructor del módulo
  *
  * Recibe los parámetros inciales para generar mostrar la información del módulo
  *
  *
  * @return void
  */
  public function __construct()
  {
    //Variables de información
    $this->name = 'syncBsale';
    $this->tab = 'administration';
    $this->version = '1.0.3';
    $this->author = 'SidecKick';
    $this->need_instance = 0;

    // Para que todas las vistas del front del admin se pueda usar boostrap css
    $this->bootstrap = true;
    parent::__construct();
    //Título y descripcion visual cuando aparece en el listado de módulos
    $this->displayName = $this->l('syncBsale');
    $this->description = $this->l('Sincronización de stock y boletas');
    //Mensaje para la desintalación del plugin
    $this->confirmUninstall = $this->l('Está seguro de eliminar el módulo?');

    //Versiones compatibles con el plugin
    $this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
  }

  /**
  * Instalación del módulo
  * @return void
  */
  public function install()
  {
    Configuration::updateValue('SYNCBSALE_LIVE_MODE', false);

    //Incluimos proceso para instalar tablas necesarias del módulo
    include(dirname(__FILE__).'/sql/install.php');

    //Registrarmos los hooks necesarios para sincronizar con bsale
    return parent::install() &&
    //Menú derecho del detalle del producto
    $this->registerHook('displayProductButtons') &&
    $this->registerHook('displayProductAdditionalInfo') &&
    $this->registerHook('actionValidateOrder') &&
    $this->registerHook('header') &&
    $this->registerHook('OrderConfirmation') &&
    // Detalle del producto
    $this->registerHook('displayProductContent') &&
    // Detalle de la orden en la vista del administrador
    $this->registerHook('displayAdminOrderContentOrder') &&
    $this->registerHook('displayOrderDetail') &&

    //Cuando se modifica es estado de la orden
    $this->registerHook('actionOrderStatusUpdate') &&
    $this->registerHook('backOfficeHeader')&&
    $this->registerHook('payment') &&
    $this->registerHook('paymentTop') && 
    $this->registerHook('paymentReturn');    

    return true;
  }

  /**
  * Eliminar el módulo junto a todas las tablas propias de la base de datos
  * @return void
  */
  public function uninstall()
  {
    Configuration::deleteByName('SYNCBSALE_LIVE_MODE');
    //Eliminamos las tablas que dependen del plugin al momento de desintalar
    include(dirname(__FILE__).'/sql/uninstall.php');
    return parent::uninstall();
  }


  /**
  * Se encarga de mostrar la vista del panel principal de configuración del módulo
  * @return void
  */
  public function getContent()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Variables que le enviaré a la vista
    $this->context->smarty->assign('ajaxUrl', $ajaxUrl);
    $this->context->smarty->assign('module_dir', $this->_path);
    //Llamo a la vista
    $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/PanelPrincipal.tpl');
    //Se despliega la vista
    return $output;
  }

  //AJAX SECCION Todas las sub-vistas del panel principal serán por peticiones Ajax

  /**
  * Vista que muestra el panel de configuración para bsale
  * @return void
  */
  public function ajaxProcessPanelConfiguracionBsale()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    $urlbases = $this->context->link->getModuleLink('syncBsale','psJson');
    //Saber si existe un token ingresado o no
    $tokenBsale = "";
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale'";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenSidekick'";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenSidekick = $fila['valor'];
    }

    //Variables para pasar a la vista
    $this->context->smarty->assign('ajaxUrl', $ajaxUrl);
    $this->context->smarty->assign('urlbase', $urlbases);
    $this->context->smarty->assign('tokenBsale', $tokenBsale);
    $this->context->smarty->assign('tokenSidekick', $tokenSidekick);
    $this->context->smarty->assign('module_dir', $this->_path);

    $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelConfiguracionBsale.tpl');
    echo $output;
  }

  /**
  * Panel que despliega un calendario para ver los documentos emitidos documentos emitidos
  *
  *Lo ingresa a la base de datos y si todo es correcto, despliega información necesaria para mostrar sucursales
  *
  * @return void
  */
  public function ajaxProcessPanelDocumentosEmitidos()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    $this->context->smarty->assign('ajaxUrl', $ajaxUrl);
    $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelDocumentosEmitidos.tpl');
    echo $output;
  }

  public function ajaxProcessPanelConsultarDocumentosEmitidos()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    if(Tools::getValue('desde') != "" && Tools::getValue('hasta') != ""){

      //Formateo la fecha para que sea válidad desde la base de datos
      $desde = explode("/",Tools::getValue('desde'));
      $desde = $desde[2]."-".$desde[1]."-".$desde[0];

      $hasta = explode("/",Tools::getValue('hasta'));
      $hasta = $hasta[2]."-".$hasta[1]."-".$hasta[0];

      $cantidad_dias = $this->rango_fechas($desde,$hasta);
      if($cantidad_dias <= 31)
      {

        //Consulto por la cantidad de documentos emitidos a la fecha
        //Consulto si existen documentos en bsale desde el id de la orden
        $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_documento
        WHERE fecha_creacion between '".$desde."' and '".$hasta."'
        ORDER BY fecha_creacion desc
        ";
        $arrDocumentos = Db::getInstance()->ExecuteS($sql);
        $tokenTemporal = Tools::getAdminToken('AdminOrders'.(int)(Tab::getIdFromClassName('AdminOrders')));
        //Envío los documentos a la vista
        $this->context->smarty->assign('arrDocumentos',$arrDocumentos);
        $this->context->smarty->assign('tokenTemporal',$tokenTemporal);

        $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelConsultarDocumentosEmitidos.tpl');
        echo $output;
      }else{
        echo "El rango de fechas supera los 31 días";
      }
    }else{
      echo "Debe ingresar alguna fecha válida";
    }
  }

  /**
  * Acción que valida el token
  *
  *Lo ingresa a la base de datos y si todo es correcto, despliega información necesaria para mostrar sucursales
  *
  * @return void
  */
  public function ajaxProcessPanelComprobarToken()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Instancio la clase apiBsale
    $apiBsale = new ApiBsale();

    //Valido si se ingresó un valor al token
    if(trim(Tools::getValue('tokenBsale')) != "")
    {
      //Realizo la consulta a la API de Bsale para saber si es valido el token
      $respuesta = $apiBsale->getApi('users.json',Tools::getValue('tokenBsale'));

      if($respuesta != null)
      {
        if(isset($respuesta['error']))
        {
          if($respuesta['error'] == 'Sorry, this request can not be authenticated')
          {
            echo "<span class='alert alert-danger'>Error de Idenfiticación de Token. Por favor, compruebe si es el correcto</span>";
          }else{
            echo "<span class='alert alert-danger'>".$respuesta['error'] ."</span>";
          }
          $sql = "DELETE FROM "._DB_PREFIX_."syncbsale_configuracion WHERE
          atributo = 'tokenBsale'";
          if (!Db::getInstance()->execute($sql))
          $error = true;
        }else{

          $tokenBsale = "";
          $error = false;
          //El Token es el correcto, si ya existe realizo una consulta a la base de datos
          $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
          WHERE atributo = 'tokenBsale' ";
          if ($fila = Db::getInstance()->getRow($sql))
          {
            $tokenBsale = $fila['valor'];
          }
          $tokenSidekick = "";
          $error = false;
          //El Token es el correcto, si ya existe realizo una consulta a la base de datos
          $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
          WHERE atributo = 'tokenSidekick' ";
          if ($fila = Db::getInstance()->getRow($sql))
          {
            $tokenSidekick = $fila['valor'];
          }


          if( ($tokenBsale == "") || ($tokenSidekick == "") )
          {
            //Si no existe, se ingresa a la base
            $sql = "DELETE FROM "._DB_PREFIX_."syncbsale_configuracion WHERE atributo = 'tokenBsale'; INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
            values ('tokenBsale','".pSQL(Tools::getValue('tokenBsale'))."',1,'".date("Y-m-d")."')";
            if (!Db::getInstance()->execute($sql))
            $error = true;

            $sql2 = "DELETE FROM "._DB_PREFIX_."syncbsale_configuracion WHERE atributo = 'tokenSidekick'; INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
            values ('tokenSidekick','".pSQL(Tools::getValue('tokenSidekick'))."',1,'".date("Y-m-d")."')";
            if (!Db::getInstance()->execute($sql2))
            $error = true;

          }else{
            //Si existe, se modifica de la base
            $sql = "UPDATE "._DB_PREFIX_."syncbsale_configuracion
            set atributo = 'tokenBsale', valor = '".pSQL(Tools::getValue('tokenBsale'))."', estado = 1, fecha_modificacion = '".date("Y-m-d")."'
            where atributo = 'tokenBsale' ";
            if (!Db::getInstance()->execute($sql))
            $error = true;
            $sql = "UPDATE "._DB_PREFIX_."syncbsale_configuracion
            set atributo = 'tokenSidekick', valor = '".pSQL(Tools::getValue('tokenSidekick'))."', estado = 1, fecha_modificacion = '".date("Y-m-d")."'
            where atributo = 'tokenSidekick' ";
            if (!Db::getInstance()->execute($sql))
            $error = true;
            //die(Db::getInstance()->getMsgError());

          }
          //Si no hay errores, despliega la vista para configurar todos los parámetros para Bsale
          if(!$error)
          {

            $arrTypeDocuments = $apiBsale->getApi('document_types.json',Tools::getValue('tokenBsale'));
            $arrTypeDocuments = $arrTypeDocuments['items'];
            //Obtener previos para la vista
            //Listado de sucursales provenientes de la API Bsale
            $arrSucursales = $apiBsale->getApi('offices.json',Tools::getValue('tokenBsale'));
            //Elimino la meta data para obtener un listado limpio
            $arrSucursales = $arrSucursales['items'];

            $arrListaPrecios = $apiBsale->getApi("price_lists.json",Tools::getValue('tokenBsale'));
            $this->context->smarty->assign('arrListaPrecios', $arrListaPrecios['items']);

            //Cargo un listado de estados de pago para elegir cual se ingresará en la BD
            $sql = " SELECT "._DB_PREFIX_."order_state_lang.name,"._DB_PREFIX_."order_state_lang.id_order_state
            FROM "._DB_PREFIX_."order_state_lang
            INNER JOIN "._DB_PREFIX_."lang ON "._DB_PREFIX_."order_state_lang.id_lang = "._DB_PREFIX_."lang.id_lang
            WHERE "._DB_PREFIX_."lang.id_lang = '".$this->context->language->id."'
            ORDER BY id_order_state asc ";
            $arrEstadoOrden = Db::getInstance()->ExecuteS($sql);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocument' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocument = $fila['valor'];
            }else{
              $idTypeDocument = 0;
            }
            $this->context->smarty->assign('idTypeDocument', $idTypeDocument);
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocumentF' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocumentF = $fila['valor'];
            }else{
              $idTypeDocumentF = 0;
            }
            $this->context->smarty->assign('idTypeDocumentF', $idTypeDocumentF);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocumentReturns' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocumentReturns = $fila['valor'];
            }else{
              $idTypeDocumentReturns = 0;
            }
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idSucursal' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idSucursal = $fila['valor'];
            }else{
              $idSucursal = 0;
            }
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idLista' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idLista = $fila['valor'];
            }else{
              $idLista = 0;
            }

            $this->context->smarty->assign('idTypeDocumentReturns', $idTypeDocumentReturns);
            $this->context->smarty->assign('idSucursal', $idSucursal);
            $this->context->smarty->assign('idLista', $idLista);


            //Consulto si existe una configuración guardada
            //syncStockProduct  checked="checked"
            $siSyncStockProduct = "";
            $noSyncStockProduct = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncStockProduct' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncStockProduct = 'checked="checked"';
              }
            }else {
              $noSyncStockProduct = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncStockProduct', $siSyncStockProduct);
            $this->context->smarty->assign('noSyncStockProduct', $noSyncStockProduct);

            $siSyncBoleta = "";
            $noSyncBoleta = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'SyncBoleta' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncBoleta = 'checked="checked"';
              }
            }else {
              $noSyncBoleta = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncBoleta', $siSyncBoleta);
            $this->context->smarty->assign('noSyncBoleta', $noSyncBoleta);

            $sql = " SELECT estado, valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'sync_idListaPrecio' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $sync_idListaPrecio = json_decode($fila['valor'], true);
              }
            }else {
                $sync_idListaPrecio = '';
            }
            $this->context->smarty->assign('sync_idListaPrecio', $sync_idListaPrecio);
            
            $siSyncFactura = "";
            $noSyncFactura = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'SyncFactura' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncFactura = 'checked="checked"';
              }
            }else {
              $noSyncFactura = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncFactura', $siSyncFactura);
            $this->context->smarty->assign('noSyncFactura', $noSyncFactura);

            //showStockStore  checked="checked"
            $siShowStockStore = "";
            $noShowStockStore = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'showStockStore' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siShowStockStore = 'checked="checked"';
              }
            }else {
              $noShowStockStore = 'checked="checked"';
            }
            $this->context->smarty->assign('siShowStockStore', $siShowStockStore);
            $this->context->smarty->assign('noShowStockStore', $noShowStockStore);

            //syncDocumentOrder  checked="checked"
            $siSyncDocumentOrder= "";
            $noSyncDocumentOrder = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncDocumentOrder' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncDocumentOrder = 'checked="checked"';
              }
            }else {
              $noSyncDocumentOrder = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncDocumentOrder', $siSyncDocumentOrder);
            $this->context->smarty->assign('noSyncDocumentOrder', $noSyncDocumentOrder);

            //syncTimbraje  checked="checked"
            $siSyncTimbraje = "";
            $noSyncTimbraje = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncTimbraje' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncTimbraje = 'checked="checked"';
              }
            }else {
              $noSyncTimbraje = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncTimbraje', $siSyncTimbraje);
            $this->context->smarty->assign('noSyncTimbraje', $noSyncTimbraje);

            //syncDocumentOrder  checked="checked"
            $siSyncDocumentIvaOrder= "";
            $noSyncDocumentIvaOrder = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncDocumentIvaOrder' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncDocumentIvaOrder = 'checked="checked"';
              }
            }else {
              $noSyncDocumentIvaOrder = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncDocumentIvaOrder', $siSyncDocumentIvaOrder);
            $this->context->smarty->assign('noSyncDocumentIvaOrder', $noSyncDocumentIvaOrder);
            
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocument' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocument = $fila['valor'];
            }else{
              $idTypeDocument = 0;
            }
            $this->context->smarty->assign('idTypeDocument', $idTypeDocument);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocumentReturns' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocumentReturns = $fila['valor'];
            }else{
              $idTypeDocumentReturns = 0;
            }

            $this->context->smarty->assign('idTypeDocumentReturns', $idTypeDocumentReturns);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idSucursal' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idSucursal = $fila['valor'];
            }else{
              $idSucursal = 0;
            }

            $this->context->smarty->assign('idSucursal', $idSucursal);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'codeShipping' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['valor'] != "")
              {
                $codeShipping = $fila['valor'];
              }else{
                $codeShipping = "";
              }
            }else {
              $codeShipping = "";
            }
            $this->context->smarty->assign('codeShipping', $codeShipping);

            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'rutRepresentant' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['valor'] != "")
              {
                $rutRepresentant = $fila['valor'];
              }else{
                $rutRepresentant = "";
              }
            }else {
              $rutRepresentant = "";
            }
            $this->context->smarty->assign('rutRepresentant', $rutRepresentant);

            //SincDocumentNoStock
            //syncDocumentOrder  checked="checked"
            $siSyncDocumentNoStock = "";
            $noSyncDocumentNoStock = "";
            $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncDocumentNoStock' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              if($fila['estado'] == 1)
              {
                $siSyncDocumentNoStock = 'checked="checked"';
              }
            }else {
              $noSyncDocumentNoStock = 'checked="checked"';
            }
            $this->context->smarty->assign('siSyncDocumentNoStock', $siSyncDocumentNoStock);
            $this->context->smarty->assign('noSyncDocumentNoStock', $noSyncDocumentNoStock);

            //Consulto por los estados guardados
            $sql = " SELECT id_estado_orden from "._DB_PREFIX_."syncbsale_documento_estado_orden ";
            $arrEstadosBD = Db::getInstance()->ExecuteS($sql);

            foreach ($arrEstadoOrden as $key => $estado) {
              $arrEstadoOrden[$key]['selected'] = "";
              foreach ($arrEstadosBD as $key_2 => $estado2) {
                if($estado2['id_estado_orden'] == $estado['id_order_state'])
                {
                  $arrEstadoOrden[$key]['selected'] = "selected";
                  break;
                }
              }
            }

            $idTypeDocumentReturns = "";
            //Campos select
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocumentReturns' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocumentReturns = $fila['valor'];
            }
            $this->context->smarty->assign('idTypeDocumentReturns', $idTypeDocumentReturns);

            $idTypeDocument = "";
            //Campos select
            $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'idTypeDocument' ";
            if ($fila = Db::getInstance()->getRow($sql))
            {
              $idTypeDocument = $fila['valor'];
            }
            $this->context->smarty->assign('idTypeDocument', $idTypeDocument);

            //Obtengo los campos para seleccionar el Rut

            //Variables para pasar a la vista
            $this->context->smarty->assign('arrSucursales', $arrSucursales);
            $this->context->smarty->assign('arrTypeDocuments', $arrTypeDocuments);
            $this->context->smarty->assign('arrEstadoOrden', $arrEstadoOrden);
            $this->context->smarty->assign('tokenBsale', Tools::getValue('tokenBsale'));
            $this->context->smarty->assign('module_dir', $this->_path);
            $this->context->smarty->assign('ajaxUrl', $ajaxUrl);

            $grupos = new Group();
            $grupos = $grupos->getGroups($this->context->language->id);

            $this->context->smarty->assign('grupos', $grupos);


            $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelComprobarToken.tpl');
            echo $output;

          }else{
            echo "<span class='label label-danger'>Lo sentimos</span> <br><br>
            Ha ocurrido un error con la conexión a la base de datos, intente nuevamente.
            Si el error persiste, favor de comunicarse a <a href='mailto:[email protected]'>[email protected]</a>";
          }

        }
      }else{
        echo "<span class='alert alert-danger'>Error de Idenfiticación de Token. Por favor, compruebe si es el correcto</span>";
        echo "<br><br><br><span class='label label-danger'>Lo sentimos</span> <br><br>
        Ha ocurrido un error con la conexión a desde bsale, intente nuevamente.
        Si el error persiste, favor de comunicarse a <a href='mailto:[email protected]'>[email protected]</a>";
      }
    }else{
      echo "Ingrese un valor válido";
    }
  }//Fin función

  /**
  * Acción que guarda la configuración del panel principal
  *
  * @return void
  */
  public function ajaxProcessActionConfigurarBsale()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Toda la configuración vuelve a 0 eliminando los parámetros en la BD
    $error = false;
    $sql = "DELETE FROM "._DB_PREFIX_."syncbsale_configuracion WHERE
    atributo = 'syncStockProduct' or
    atributo = 'syncBoleta' or
    atributo = 'syncFactura' or
    atributo = 'syncDocumentOrder' or
    atributo = 'syncDocumentIvaOrder' or
    atributo = 'syncDocumentNoStock' or
    atributo = 'showStockStore' or
    atributo = 'codeShipping' or
    atributo = 'idTypeDocument' or
    atributo = 'idTypeDocumentF' or
    atributo = 'syncTimbraje' or
    atributo = 'rutRepresentant' or
    atributo = 'idTypeDocumentReturns' or
    atributo = 'sync_idListaPrecio' or
    atributo = 'idLista' or
    atributo = 'idSucursal' ";
    if (!Db::getInstance()->execute($sql))
    $error = true;
    //Elimino los estados de orden para emisión de documentos
    $sql = "DELETE FROM "._DB_PREFIX_."syncbsale_documento_estado_orden";
    if (!Db::getInstance()->execute($sql))
    $error = true;


    //Siempre se ingresará el idSucursale por defecto
    $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
    values ('idSucursal','".Tools::getValue('idSucursal')."',1,'".date("Y-m-d")."')";
    if (!Db::getInstance()->execute($sql))
    $error = true;

    //Siempre se ingresará el idSucursale por defecto
    $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
    values ('idLista','".Tools::getValue('idLista')."',1,'".date("Y-m-d")."')";
    if (!Db::getInstance()->execute($sql))
    $error = true;


    //Siempre se ingresará el idSucursale por defecto
    $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
    values ('idTypeDocument','".Tools::getValue('idTypeDocument')."',1,'".date("Y-m-d")."')";
    if (!Db::getInstance()->execute($sql))
    $error = true;

  //Siempre se ingresará el idSucursale por defecto
    $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
    values ('idTypeDocumentF','".Tools::getValue('idTypeDocumentF')."',1,'".date("Y-m-d")."')";
    if (!Db::getInstance()->execute($sql))
    $error = true;

    //Siempre se ingresará la devolución por defecto
    $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
    values ('idTypeDocumentReturns','".Tools::getValue('idTypeDocumentReturns')."',1,'".date("Y-m-d")."')";
    if (!Db::getInstance()->execute($sql))
    $error = true;

    //Si ha seleccionado la opción, se ingresará a la base de datos la sincronización del producto en el detalle
    if(Tools::getValue('syncStockProduct'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('syncStockProduct','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //Si ha seleccionado la opción, se ingresará a la base de datos la sincronización del producto en el detalle
    if(Tools::getValue('syncTimbraje'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('syncTimbraje','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //listas de precio sync
      if(Tools::getValue('idListaPrecio'))
      {
        foreach (Tools::getValue('idListaPrecio') as $key => $value) {
          $sync_idLista_precio[$key]['id_bsale_list'] = $value;
          $sync_idLista_precio[$key]['active'] = Tools::getValue('syncListaPrecio')[$key];
        }
        $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
        values ('sync_idListaPrecio','".json_encode($sync_idLista_precio)."',1,'".date("Y-m-d")."')";
        if (!Db::getInstance()->execute($sql))
        $error = true;

      }

    if(!Tools::getValue('syncBoleta') && !Tools::getValue('syncFactura')){
        echo "<span class='label label-danger'>Atención</span> Debe activar al menos un tipo de documento ( Boleta o Factura )<br><br>";
      }else{
      //Si ha activado la boleta
      if(Tools::getValue('syncBoleta'))
      {
        $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
        values ('syncBoleta','1',1,'".date("Y-m-d")."')";
        if (!Db::getInstance()->execute($sql))
        $error = true;
      }

      //Si ha activado la factura
      if(Tools::getValue('syncFactura'))
      {
        $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
        values ('syncFactura','1',1,'".date("Y-m-d")."')";
        if (!Db::getInstance()->execute($sql))
        $error = true;
      }
    }

    //Si ha seleccionado la opción, se ingresará a la base de datos la sincronización de los documentos (boleta) en Bsale
    if(Tools::getValue('syncDocumentOrder'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('syncDocumentOrder','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;

    }

    //Si ha seleccionado la opción, se ingresará a la base de datos la sincronización de los documentos (boleta) en Bsale
    if(Tools::getValue('codeShipping'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('codeShipping','".Tools::getValue('codeShipping')."',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //Si ha seleccionado la opción, se ingresará a la base de datos la sincronización de los documentos (boleta) en Bsale
    if(Tools::getValue('rutRepresentant'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('rutRepresentant','".Tools::getValue('rutRepresentant')."',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //Si ha seleccionado la opción, se considerará la inclusión de iva
    if(Tools::getValue('syncDocumentIvaOrder'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('syncDocumentIvaOrder','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //Si ha seleccionado la opción, se eliminará la opción de descontar el stock del documento en bsale
    if(Tools::getValue('syncDocumentNoStock'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('syncDocumentNoStock','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    //Ingreso los estados de orden seleccionados para ejecutar la emisión de documentos
    if(Tools::getValue('idOrderState'))
    {
      foreach (Tools::getValue('idOrderState') as $key => $idOrderState) {
        //Ingreso los estados de orden seleccionados
        $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_documento_estado_orden (id_estado_orden)
        values (".$idOrderState.")";
        if (!Db::getInstance()->execute($sql))
        $error = true;
      }
    }else{
      echo "<span class='label label-danger'>Atención</span> Debe seleccionar al menos una opción en la selección de estados para emitir documentos <br><br>";
    }

    //Si ha seleccionado la opción, se ingresará a la base de datos el despliege de stock de las tiendas
    if(Tools::getValue('showStockStore'))
    {
      $sql = "INSERT INTO "._DB_PREFIX_."syncbsale_configuracion (atributo,valor,estado,fecha_modificacion)
      values ('showStockStore','1',1,'".date("Y-m-d")."')";
      if (!Db::getInstance()->execute($sql))
      $error = true;
    }

    if(!$error)
    {
      echo "<div class='alert alert-success'>Los cambios se han realizado con éxito</div>";
    }else
    {
      echo "<span class='label label-danger'>Lo sentimos</span> <br><br>
      Ha ocurrido un error con la conexión a la base de datos, intente nuevamente.
      Si el error persiste, favor de comunicarse a <a href='mailto:[email protected]'>[email protected]</a>";
    }
  }

  /**
  * Panel que permitirá sincronizar todo el stock
  *
  * @return void
  */
  public function ajaxProcessPanelSincronizacionAllStockBsale()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    ini_set('max_execution_time', 9000);
    $tokenBsale = null;
    $idSucursal = null;
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }

    //Obtengo el Id de la sucursal por defecto
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'idSucursal' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $idSucursal = $fila['valor'];
    }

    if($idSucursal != null && $tokenBsale != null)
    {
      //Consulto por la cantidad total stock existentes desde la API (para luego hacer un calculo de paginación)
      $apiBsale = new ApiBsale();
      $respuesta = $apiBsale->getApi("stocks.json?officeid=".$idSucursal,$tokenBsale);
      $cantidadStock = $respuesta['count'];
      error_log('ajaxProcessPanelSincronizacionAllStockBsale vars ::'.$cantidadStock.', '.$ajaxUrl.', '.$this->_path);
      //Variables para pasar a la vista
      $this->context->smarty->assign('cantidadStock', $cantidadStock);
      $this->context->smarty->assign('ajaxUrl', $ajaxUrl);
      $this->context->smarty->assign('module_dir', $this->_path);
      $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelSincronizacionAllStockBsale.tpl');
      echo $output;
      //echo "<div class='panel'><div class='alert alert-danger'>Aún no ha configurado Bsale, hagalo en la primera opción</div></div>";
    }else{
      //Para no crear una vista, despliego el mensaje de error por acá
      echo "<div class='panel'><div class='alert alert-danger'>Aún no ha configurado Bsale, hagalo en la primera opción</div></div>";
    }
  }

  /**
  * Función que realizará la sincronización masiva de stock considerando variantes
  */
  public function ajaxProcessPanelSincronizarAllStockBsale()
  {
    error_log('ajaxProcessPanelSincronizarAllStockBsale');
    try {
      $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
      //Aumento el tiempo de procesamiento para que no expulse a medio camino
      ini_set('max_execution_time', 9000);
      $respuesta = array();
      $cantidadPaginas = (int) Tools::getValue('cantidadPaginas');

      $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
      WHERE atributo = 'tokenBsale' ";
      if ($fila = Db::getInstance()->getRow($sql))
      {
        $tokenBsale = $fila['valor'];
      }

      //Obtengo el Id de la sucursal por defecto
      $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
      WHERE atributo = 'idSucursal' ";
      if ($fila = Db::getInstance()->getRow($sql))
      {
        $idSucursal = $fila['valor'];
      }

      if($idSucursal != null && $tokenBsale != null)
      {
        $stockBsale = new StockBsale();

        //Ejecuto según el tipo de carga seleccionada
        if(Tools::getValue('tipoSincronizacion') == 'normal')
        {
          $stockBsale->updateStockAllProduct($tokenBsale,$idSucursal,$cantidadPaginas,$this->context->language->id);
        }else{
          $stockBsale->updateStockAllProductVariant($tokenBsale,$idSucursal,$cantidadPaginas,$this->context->language->id);
        }
        echo "<div class='alert alert-success'>La sincronización de stock ha sido realizado con éxito</div>";
      }else{
        echo "Error de configuración con bsale, intente re-configurar las opciones";
      }
    } catch (Exception $e) {
      error_log('ajaxProcessPanelSincronizarAllStockBsale Exception :: '.$e->getMessage());
    }
  }

  /**
  * Panel que mostrará un rango de calendario para ver los logs de error con bsale
  */
  public function ajaxProcessPanelLogs()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    $this->context->smarty->assign('ajaxUrl', $ajaxUrl);
    $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelLogs.tpl');
    echo $output;
  }

  /**
  * Panel que mostrará un rango de calendario para ver los logs de error con bsale
  */
  public function ajaxProcessPanelConsultarLogs()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    if(Tools::getValue('desde') != "" && Tools::getValue('hasta') != ""){

      //Formateo la fecha para que sea válidad desde la base de datos
      $desde = explode("/",Tools::getValue('desde'));
      $desde = $desde[2]."-".$desde[1]."-".$desde[0];

      $hasta = explode("/",Tools::getValue('hasta'));
      $hasta = $hasta[2]."-".$hasta[1]."-".$hasta[0];

      $cantidad_dias = $this->rango_fechas($desde,$hasta);
      if($cantidad_dias <= 31)
      {
        //Consulto por la cantidad de documentos emitidos a la fecha
        //Consulto si existen documentos en bsale desde el id de la orden
        $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_logs_error
        WHERE fecha_creacion between '".$desde."' and '".$hasta."'
        ORDER BY fecha_creacion desc
        ";
        $arrLogsError = Db::getInstance()->ExecuteS($sql);

        //Envío los documentos a la vista
        $this->context->smarty->assign('arrLogsError',$arrLogsError);

        $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelConsultarLogs.tpl');
        echo $output;

      }else{
        echo "El rango de fechas supera los 31 días";
      }
    }else{
      echo "Debe ingresar alguna fecha válida";
    }
  }

  public function ajaxProcessSendEmail()
  {

  }

  /**
  * Panel que mostrará la lista de precios y permitirá accionar una sincronización de precios
  *
  */
  public function ajaxProcessPanelSincronizacionAllPreciosBsale()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    $tokenBsale = null;
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }

    if($tokenBsale != null)
    {
      //Pregunto por el listado de precios de bsale
      $apiBsale = new ApiBsale();
      $arrListaPrecios = $apiBsale->getApi("price_lists.json?state=0",$tokenBsale);

      $arrListaAct = $arrListaPrecios['items'];
      foreach ($arrListaAct as $valor) {
        $nuevaLista[$valor['id']] = $valor['name'];
      }
      
      $sql = " SELECT valor from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'sync_idListaPrecio' ";
      if ($fila = Db::getInstance()->getRow($sql))
      {
        $sync_idListaPrecio = json_decode($fila['valor']);
        foreach ($sync_idListaPrecio as $key => $value) {
          if ($value->active == 1){
            $grupo = new Group($key);
             $lista_final[$key]['value'] = $key.'-'.$value->id_bsale_list;
             $lista_final[$key]['name'] = $grupo->name[1].$grupo->name[3].' --> '.$nuevaLista[$value->id_bsale_list];
            }
          }
      }else{
        $sync_idListaPrecio = null;
      }
      $this->context->smarty->assign('sync_idListaPrecio', $lista_final);
      $this->context->smarty->assign('arrListaPrecios', $arrListaPrecios['items']);
      $grupos = new Group();
      $grupos = $grupos->getGroups($this->context->language->id);

      $this->context->smarty->assign('grupos', $grupos);
      $output = $this->context->smarty->fetch($this->local_path.'views/templates/admin/ajax/PanelSincronizacionAllPreciosBsale.tpl');
      echo $output;
    }else{
      //Para no crear una vista, despliego el mensaje de error por acá
      echo "<div class='panel'><div class='alert alert-danger'>Aún no ha configurado Bsale, hagalo en la primera opción</div></div>";
    }
  }

  /**
  * Acción que sincronizará la lista de precios
  *
  */
  public function ajaxProcessPanelSincronizarAllPrecioBsale()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Aumento el tiempo de procesamiento para que no expulse a medio camino
    ini_set('max_execution_time', 9000);
    $tokenBsale = null;
    $idListaPrecio = Tools::getValue('idListaPrecio');
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }
    if($tokenBsale != null)
    {

      $priceBsale = new PriceBsale();
      $resultado = $priceBsale->updatePriceAllProduct($idListaPrecio,$tokenBsale,$this->context->language->id);
      echo "<div class='alert alert-success'>La sincronización de precios ha sido realizado con éxito</div>";

    }else{
      echo "Error de configuración con bsale, intente re-configurar las opciones";
    }
  }

  public function ajaxProcessPanelSincronizarAllPrecioBsaleGroup()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Aumento el tiempo de procesamiento para que no expulse a medio camino
    ini_set('max_execution_time', 9000);
    $tokenBsale = null;
    $idAct = Tools::getValue('idAct');
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }
    if($tokenBsale != null)
    {

      $priceBsale = new PriceBsale();
      $resultado = $priceBsale->updatePriceGroup($idAct,$tokenBsale,$this->context->language->id);
      echo "<div class='alert alert-success'>La sincronización de precios ha sido realizado con éxito</div>";

    }else{
      echo "Error de configuración con bsale, intente re-configurar las opciones";
    }
  }

   public function ajaxProcessPanelDeleteListaPreciosGroup()
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    //Aumento el tiempo de procesamiento para que no expulse a medio camino
    ini_set('max_execution_time', 9000);
    $tokenBsale = null;
    $idGroup = Tools::getValue('idGroup');
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }
    if($tokenBsale != null)
    {

      $priceBsale = new PriceBsale();
      $resultado = $priceBsale->deletePriceGroup($idGroup,$tokenBsale,$this->context->language->id);
      echo "<div class='alert alert-success'>Se han eliminado los precios con éxito</div>";

    }else{
      echo "Error de configuración con bsale, intente re-configurar las opciones";
    }
  }

  //HOOKS SECCION Funciones que dependen de los hooks
  /**
  * Hook que muestra el link del documento en bsale
  *
  * @return void
  */
    public function hookDisplayPaymentTop($params)
  {
    if (!$this->active)
      return;

    $urlFinal = _PS_BASE_URL_.__PS_BASE_URI__;

    $sql = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncBoleta' ";
    $sql2 = " SELECT estado from "._DB_PREFIX_."syncbsale_configuracion where atributo = 'syncFactura' ";

    $this->smarty->assign(array(
      'url_sitio' => $urlFinal,
      'id_cart' => $params['cart']->id,
      'this_path' => $this->_path,
      'this_path_bw' => $this->_path,
      'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/'
    ));

    if ( ( ($fila = Db::getInstance()->getRow($sql)) && ($fila2 = Db::getInstance()->getRow($sql2)) ) || ( ($fila2 = Db::getInstance()->getRow($sql2)) ) )
    {
      if ( ($fila['estado'] == 1) && ($fila2['estado'] == 1) )
      {
        $this->context->controller->addJS('rutJs', 'modules/'.$this->name.'/jquery.Rut.js', ['position' => 'bottom','inline' => true,'priority' => 10,] );
        $this->context->controller->addJS('commonJs', 'modules/'.$this->name.'/common.js', ['position' => 'bottom','inline' => true, 'priority' => 10, ]);
        $this->smarty->assign(array('bol_fac' => 'both'));
        return $this->display(__FILE__, 'payment.tpl'); # Show payment 

      }elseif ($fila2['estado'] == 1){
        $this->context->controller->addJS('rutJs', 'modules/'.$this->name.'/jquery.Rut.js', ['position' => 'bottom','inline' => true,'priority' => 10,] );
        $this->context->controller->addJS('commonJs', 'modules/'.$this->name.'/common.js', ['position' => 'bottom','inline' => true, 'priority' => 10, ]);
        $this->smarty->assign(array('bol_fac' => 'fact'));
        return $this->display(__FILE__, 'payment.tpl'); # Show payment 
      }else{
        return;
      }
    }   
  }
  public function hookDisplayPayment($params)
  {
    if (!$this->active)
      return;
    return $this->display(__FILE__, 'payment.tpl'); # Show payment 
  }
  public function hookPaymentReturn($params)
  {
    if (!$this->active)
      return;
    return $this->display(__FILE__, 'payment_return.tpl');
  }
  public function hookDisplayAdminOrderContentOrder($params)
  {
    //Consulto si existen documentos en bsale desde el id de la orden
    $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_documento
    WHERE id_orden_ps = ".$params['order']->id."
    ORDER BY fecha_creacion desc
    ";
    $arrDocumentos = Db::getInstance()->ExecuteS($sql);

    //Puede haber más de un documento? A Consultar
    $this->context->smarty->assign('titulo',"Documentos BSALE");
    $this->context->smarty->assign('id',$params['order']->id);
    $this->context->smarty->assign('arrDocumentos',$arrDocumentos);

    $order = new Order($params['order']->id);
    
    $fila = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'syncbsale_factura WHERE id = '.$order->id_cart);
    if ($fila) {
      $this->smarty->assign(array(
        'rut' => $fila['rut'],
        'razon_social' => $fila['razon_social'],
        'giro' => $fila['giro'],
        'direccion' => $fila['direccion'],
        'telefono' => $fila['telefono'],
        'ciudad' => $fila['ciudad'],
        'comuna' => $fila['comuna']
      ));
    }

    return $this->display(__FILE__, 'documentbsale.tpl');
  }

  /**
  * Hook donde se despliega el detalle de cada producto y sincroniza el stock en el caso de estar activada la opción)
  *
  * @return void
  */
  public function hookDisplayProductContent($params)
  {
    $stock = null;
    $estado = null;
    $tokenBsale = "";
    //Verifico si está configurada la opción desde la BD
    $sql = "SELECT estado FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'syncStockProduct'";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $estado = $fila['estado'];
    }
    //Obtengo el Token Bsale
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }
    if($estado == 1 && $tokenBsale != "")
    {
      //Obtengo el SKU (reference) del producto
      $product = new Product(
        (int)Tools::getValue('id_product'),
        true,
        Configuration::get('PS_LANG_DEFAULT'),
        Context::getContext()->shop->reference
      );
      //Gestiono el cambio de stock mediante la clase StockBsale
      $stockBsale = new StockBsale();
      $stock = $stockBsale->updateStockProductId(Tools::getValue('id_product'),$tokenBsale,$product);
    }
    //Modifico desde la vista el nuevo Stock
    if($stock != null)
    {
      //Si no tiene variantes, se modifica directo
      if(is_numeric($stock))
      {
        $params['product']->quantity = $stock;
      }else{
        // Llamo a la función que modifica el stock visual de las variantes
        $this->assignAttributesGroups($params['product']);
      }
    }
  }

  /**
  * Hook que envía el detalle de la orden para generar un documento en bsale y guardarlo aquí
  *
  * @return void
  */
  public function hookActionOrderStatusUpdate($params)
  {
    //Verifico si está configurada la opción de emitir ordenes desde la BD
    $tokenBsale = "";
    $estado = null;
    $sql = "SELECT estado FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'syncDocumentOrder'";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $estado = $fila['estado'];
    }

    //Obtengo el Token Bsale
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'tokenBsale' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $tokenBsale = $fila['valor'];
    }

    //Consulto por los estados confirgurados para emitir una orden
    $sql = " SELECT id_estado_orden FROM "._DB_PREFIX_."syncbsale_documento_estado_orden ";
    $arrEstadoOrden = Db::getInstance()->ExecuteS($sql);

    $estadoOrden = false;
    foreach ($arrEstadoOrden as $key => $idEstadoOrden)
    {
      //Comparo si es correcta la configuración
      if($idEstadoOrden['id_estado_orden'] == $params['newOrderStatus']->id)
      {
        $estadoOrden = true;
      }
    }

    //Si esa toda la configuración correcta, se realiza la gestión de emisión de boleta
    if($estado == 1 && $tokenBsale != "" && $estadoOrden == true)
    {
      //Si es estado es igual a 2 (Pago Aceptado), se realiza la gestión de emitir una boleta y descontar el stock
      $documentBsale = new DocumentBsale();
      $documentBsale->syncDocumentOrder($params['id_order'],$params['newOrderStatus']->id,$tokenBsale);

      $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_documento
      WHERE id_orden_ps = ".$params['id_order']."
      ORDER BY fecha_creacion desc
      ";
      $link = "";

      if ($fila = Db::getInstance()->getRow($sql))
      {
        $link = $fila['link_documento_bsale'];
      }

      $order = new Order((int)($params['id_order'])); // obtengo el detalle de la orden
      $customer = new Customer((int)($order->id_customer)); // obtengo el detalle del cliente
      //Se envía un email del documento
      Mail::Send((int)(Configuration::get('PS_LANG_DEFAULT')), // defaut language id
      'newsletter', // email template file to be use
      'Boleta Cliente', // email subject
      array(
        '{firstname}' => $customer->firstname,
        '{lastname}' => $customer->lastname, // sender email address
        '{message}' => 'Su boleta puede ser descargada desde aquí : <a href="'.$link.'">'.$link.'</a>',
      ),
      $customer->email, // receiver email address
      NULL, NULL, NULL);
    }
    //Si el estado es para cancelar, se debe realizar la siguiente configuración

    if($tokenBsale != "" && $params['newOrderStatus']->id == 6)
    {
      error_log("Orden a cancelar :".$params['id_order']);
      $documentBsale = new DocumentBsale();
      $documentBsale->syncCanceledDocumentOrder($params['id_order'],$tokenBsale);

      $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_documento
      WHERE id_orden_ps = ".$params['id_order']."
      ORDER BY fecha_creacion desc
      ";
      $link = "";

      if ($fila = Db::getInstance()->getRow($sql))
      {
        $link = $fila['link_documento_bsale'];
      }

      $order = new Order((int)($params['id_order'])); // obtengo el detalle de la orden
      $customer = new Customer((int)($order->id_customer)); // obtengo el detalle del cliente
      error_log("Enviando Mail");
      Mail::Send((int)(Configuration::get('PS_LANG_DEFAULT')), // defaut language id
      'newsletter', // email template file to be use
      'Nota de Crédito Cliente', // email subject
      array(
        '{firstname}' => $customer->firstname,
        '{lastname}' => $customer->lastname, // sender email address
        '{message}' => 'Su nota de crédito puede ser descargada desde aquí : <a href="'.$link.'">'.$link.'</a>',
      ),
      $customer->email, // receiver email address
      NULL, NULL, NULL);
    }
  }
  
  
  /*********************** ALFONSO*/
  
   public function renderWidget($hookName = null, array $configuration = [])    {
        $this->smarty->assign($this->getWidgetVariables($hookName, $configuration));

        return $this->fetch('module:syncBsale/views/templates/hook/ajax/showstockstore.tpl');
    }
    
    public function getWidgetVariables($hookName = null, array $configuration = [])    {
        
            
    }
    
    /************ fin alfonso *****************/

  /**
  * Hook que despliega el stock de un producto en todos los locales
  *
  * @return void
  */
  public function hookdisplayProductAdditionalInfo($params)
  {
    $ajaxUrl = $this->context->link->getAdminLink("AdminModules")."&configure=".$this->name;
    $estado = null;
    //Verifico si está configurada la opción de mostrar el stock de tiendas desde la BD
    $sql = "SELECT valor FROM "._DB_PREFIX_."syncbsale_configuracion
    WHERE atributo = 'showStockStore' ";
    if ($fila = Db::getInstance()->getRow($sql))
    {
      $estado = $fila['valor'];
    }

    //Si esa toda la configuración correcta, se despliega el stock
    if($estado == 1)
    {
      $this->context->smarty->assign('idProduct', Tools::getValue('id_product'));
      $this->context->smarty->assign('baseUrl', __PS_BASE_URI__);
      $this->context->smarty->assign('ajaxUrl', $ajaxUrl);

      $variant = false;
      //Veo si tiene variantes
      $product = new Product(
        (int)Tools::getValue('id_product'),
        true,
        Configuration::get('PS_LANG_DEFAULT')
      );

      $variants = $product->getAttributeCombinations($this->context->language->id);

      if(sizeof($variants) > 0)
      {
        $variant = true;
      }

      $this->context->smarty->assign('variant', $variant);


      return $this->display(__FILE__, 'stockstoreproduct.tpl');
    }
  }

    /**
  * Hook que despliega el stock de un producto en todos los locales
  *
  * @return void
  */
  public function hookDisplayOrderDetail($params)
  {
    //Consulto si existen documentos en bsale desde el id de la orden
    $sql = " SELECT * FROM "._DB_PREFIX_."syncbsale_documento
    WHERE id_orden_ps = ".$params['order']->id."
    ORDER BY fecha_creacion desc
    ";

    $arrDocumentos = Db::getInstance()->ExecuteS($sql);
    //Puede haber más de un documento? A Consultar
    $this->context->smarty->assign('titulo',"Boleta");
    $this->context->smarty->assign('id',$params['order']->id);
    $this->context->smarty->assign('arrDocumentos',$arrDocumentos);
    return $this->display(__FILE__, 'documentbsale.tpl');
  }
  /**
  * Add the CSS & JavaScript files you want to be loaded in the BO.
  */
  public function hookBackOfficeHeader()
  {
    if (Tools::getValue('module_name') == $this->name) {
      $this->context->controller->addJS($this->_path.'views/js/back.js');
      $this->context->controller->addCSS($this->_path.'views/css/back.css');
    }
  }

  /**
  * Add the CSS & JavaScript files you want to be added on the FO.
  */
  public function hookHeader()
  {

    $this->context->controller->addJS($this->_path.'/views/js/front.js');
    $this->context->controller->addCSS($this->_path.'/views/css/front.css');
  }

  /**
  * Función que me entrega la cantidad de días de un entre fechas
  *
  * @return int
  */
  private function rango_fechas($fechaInicio, $fechaFin) {

    $arrayFechas = array();
    $fechaMostrar = date("Y-m-d", strtotime($fechaInicio));
    while (strtotime($fechaMostrar) <= strtotime($fechaFin)) {
      $arrayFechas[] = $fechaMostrar;
      $fechaMostrar = date("Y-m-d", strtotime($fechaMostrar . " + 1 day"));
    }
    return sizeof($arrayFechas);
  }

  /**
  * Función que es una copia del controlador de productos, para mostrar el stock de las variantes
  *
  * @return void
  */
  protected function assignAttributesGroups($product)
  {

    $colors = array();
    $groups = array();

    // @todo (RM) should only get groups and not all declination ?
    $attributes_groups = $product->getAttributesGroups($this->context->language->id);
    if (is_array($attributes_groups) && $attributes_groups) {
      $combination_images = $product->getCombinationImages($this->context->language->id);
      $combination_prices_set = array();
      foreach ($attributes_groups as $k => $row) {
        // Color management
        if (isset($row['is_color_group']) && $row['is_color_group'] && (isset($row['attribute_color']) && $row['attribute_color']) || (file_exists(_PS_COL_IMG_DIR_.$row['id_attribute'].'.jpg'))) {
          $colors[$row['id_attribute']]['value'] = $row['attribute_color'];
          $colors[$row['id_attribute']]['name'] = $row['attribute_name'];
          if (!isset($colors[$row['id_attribute']]['attributes_quantity'])) {
            $colors[$row['id_attribute']]['attributes_quantity'] = 0;
          }
          $colors[$row['id_attribute']]['attributes_quantity'] += (int)$row['quantity'];
        }
        if (!isset($groups[$row['id_attribute_group']])) {
          $groups[$row['id_attribute_group']] = array(
            'group_name' => $row['group_name'],
            'name' => $row['public_group_name'],
            'group_type' => $row['group_type'],
            'default' => -1,
          );
        }

        $groups[$row['id_attribute_group']]['attributes'][$row['id_attribute']] = $row['attribute_name'];
        if ($row['default_on'] && $groups[$row['id_attribute_group']]['default'] == -1) {
          $groups[$row['id_attribute_group']]['default'] = (int)$row['id_attribute'];
        }
        if (!isset($groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']])) {
          $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] = 0;
        }
        $groups[$row['id_attribute_group']]['attributes_quantity'][$row['id_attribute']] += (int)$row['quantity'];

        $combinations[$row['id_product_attribute']]['attributes_values'][$row['id_attribute_group']] = $row['attribute_name'];
        $combinations[$row['id_product_attribute']]['attributes'][] = (int)$row['id_attribute'];
        $combinations[$row['id_product_attribute']]['price'] = (float)Tools::convertPriceFull($row['price'], null, Context::getContext()->currency, false);

        // Call getPriceStatic in order to set $combination_specific_price
        if (!isset($combination_prices_set[(int)$row['id_product_attribute']])) {
          Product::getPriceStatic((int)$product->id, false, $row['id_product_attribute'], 6, null, false, true, 1, false, null, null, null, $combination_specific_price);
          $combination_prices_set[(int)$row['id_product_attribute']] = true;
          $combinations[$row['id_product_attribute']]['specific_price'] = $combination_specific_price;
        }
        $combinations[$row['id_product_attribute']]['ecotax'] = (float)$row['ecotax'];
        $combinations[$row['id_product_attribute']]['weight'] = (float)$row['weight'];
        $combinations[$row['id_product_attribute']]['quantity'] = (int)$row['quantity'];
        $combinations[$row['id_product_attribute']]['reference'] = $row['reference'];
        $combinations[$row['id_product_attribute']]['unit_impact'] = Tools::convertPriceFull($row['unit_price_impact'], null, Context::getContext()->currency, false);
        $combinations[$row['id_product_attribute']]['minimal_quantity'] = $row['minimal_quantity'];
        if ($row['available_date'] != '0000-00-00' && Validate::isDate($row['available_date'])) {
          $combinations[$row['id_product_attribute']]['available_date'] = $row['available_date'];
          $combinations[$row['id_product_attribute']]['date_formatted'] = Tools::displayDate($row['available_date']);
        } else {
          $combinations[$row['id_product_attribute']]['available_date'] = $combinations[$row['id_product_attribute']]['date_formatted'] = '';
        }

        if (!isset($combination_images[$row['id_product_attribute']][0]['id_image'])) {
          $combinations[$row['id_product_attribute']]['id_image'] = -1;
        } else {
          $combinations[$row['id_product_attribute']]['id_image'] = $id_image = (int)$combination_images[$row['id_product_attribute']][0]['id_image'];
          if ($row['default_on']) {
            if (isset($this->context->smarty->tpl_vars['cover']->value)) {
              $current_cover = $this->context->smarty->tpl_vars['cover']->value;
            }

            if (is_array($combination_images[$row['id_product_attribute']])) {
              foreach ($combination_images[$row['id_product_attribute']] as $tmp) {
                if ($tmp['id_image'] == $current_cover['id_image']) {
                  $combinations[$row['id_product_attribute']]['id_image'] = $id_image = (int)$tmp['id_image'];
                  break;
                }
              }
            }

            if ($id_image > 0) {
              if (isset($this->context->smarty->tpl_vars['images']->value)) {
                $product_images = $this->context->smarty->tpl_vars['images']->value;
              }
              if (isset($product_images) && is_array($product_images) && isset($product_images[$id_image])) {
                $product_images[$id_image]['cover'] = 1;
                $this->context->smarty->assign('mainImage', $product_images[$id_image]);
                if (count($product_images)) {
                  $this->context->smarty->assign('images', $product_images);
                }
              }
              if (isset($this->context->smarty->tpl_vars['cover']->value)) {
                $cover = $this->context->smarty->tpl_vars['cover']->value;
              }
              if (isset($cover) && is_array($cover) && isset($product_images) && is_array($product_images)) {
                $product_images[$cover['id_image']]['cover'] = 0;
                if (isset($product_images[$id_image])) {
                  $cover = $product_images[$id_image];
                }
                $cover['id_image'] = (Configuration::get('PS_LEGACY_IMAGES') ? ($this->product->id.'-'.$id_image) : (int)$id_image);
                $cover['id_image_only'] = (int)$id_image;
                $this->context->smarty->assign('cover', $cover);
              }
            }
          }
        }
      }

      // wash attributes list (if some attributes are unavailables and if allowed to wash it)
      if (!Product::isAvailableWhenOutOfStock($product->out_of_stock) && Configuration::get('PS_DISP_UNAVAILABLE_ATTR') == 0) {
        foreach ($groups as &$group) {
          foreach ($group['attributes_quantity'] as $key => &$quantity) {
            if ($quantity <= 0) {
              unset($group['attributes'][$key]);
            }
          }
        }

        foreach ($colors as $key => $color) {
          if ($color['attributes_quantity'] <= 0) {
            unset($colors[$key]);
          }
        }
      }
      foreach ($combinations as $id_product_attribute => $comb) {
        $attribute_list = '';
        foreach ($comb['attributes'] as $id_attribute) {
          $attribute_list .= '\''.(int)$id_attribute.'\',';
        }
        $attribute_list = rtrim($attribute_list, ',');
        $combinations[$id_product_attribute]['list'] = $attribute_list;
      }

      $this->context->smarty->assign(array(
        'groups' => $groups,
        'colors' => (count($colors)) ? $colors : false,
        'combinations' => $combinations,
        'combinationImages' => $combination_images
      ));
    }
  }
}
 

Link to comment
Share on other sites

tpl file

 

<table class="table table-bordered table-striped table-condensed" style="min-width: 280px">
  <tr style="color:#000">
    <th colspan="2">
      <center>
        <label style="text-align: center">
          DISPONIBILIDAD DE STOCK
        </label>
      </center>
    </th>
  </tr>
  <tr>
    <th style="width:50%">
      <center>
        <label style="text-align: center">
          Sucursal
        </label>
      </center>
    </th>
    <th style="width:50%">
      <center>
        <label style="text-align: center">
          Cantidad
        </label>
      </center>
    </th>
  </tr>
  {foreach from=$arrStockSucursalProduct item=sucursal}
  <tr>
    <td>
      <center>
        {$sucursal['office']}
      </center>
    </td>
    <td>
      <center>
        {number_format($sucursal['stock'], 0, '', '.') }
      </center>
    </td>
  </tr>
  {/foreach}
</table>
 

Link to comment
Share on other sites

Why repair a module that already exists in version 1.7?
It is not repaired your module for you in any case not on the forum.
You do not explain the main features of the module very well.

So does a summary of the module with images.

Link to comment
Share on other sites

Please check and test the code :

 

{foreach from=$groups key=id_attribute_group item=group}
    <div class="clearfix product-variants-item">
      <span class="control-label">{$group.name}</span>

          {foreach from=$group.attributes key=id_attribute item=group_attribute}
           {$group_attribute.name} - {$product.quantity}<br>
          {/foreach}
    </div>
  {/foreach}

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...