ajsbox Posted May 15, 2019 Share Posted May 15, 2019 I have a module that is working in PS 1.6, but can't show in 1.7 Link to comment Share on other sites More sharing options...
Janett Posted May 15, 2019 Share Posted May 15, 2019 Maybe this module is not compliant with 1.7, ask the module developer Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 that is i want to fix Link to comment Share on other sites More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 Bonsoir, Quel est ce module s'il vous plait? Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 <?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 More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 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 More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 please send me à name module. Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 syncBsale is a custom one Link to comment Share on other sites More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 Ah ok, so you have to work the module code with version 1.7. What is the function of this module? Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 How data from database, stock info. The problem should be related to rendering i think Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 Show available stock from store Link to comment Share on other sites More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 There is that system in 1.7 no module needed https://gyazo.com/82cb16cddf01893210c1fb4311bc984c Sorry im french Link to comment Share on other sites More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 What i need is to fix so it can work in PS 1.7 Link to comment Share on other sites More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 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 More sharing options...
ajsbox Posted May 15, 2019 Author Share Posted May 15, 2019 Just show the available stock for all stores Link to comment Share on other sites More sharing options...
Webmain Posted May 15, 2019 Share Posted May 15, 2019 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 More sharing options...
ajsbox Posted May 16, 2019 Author Share Posted May 16, 2019 Is that solution related to render problem? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now