Falta testear funcionamiento completo. Edit no funciona

This commit is contained in:
Jaime Jiménez
2023-08-05 12:51:29 +02:00
parent 3e27d3fc17
commit 121b270dd0
15 changed files with 390 additions and 236 deletions

View File

@ -378,6 +378,25 @@ $routes->group('tarifaencuadernacionlineas', ['namespace' => 'App\Controllers\Ta
}); });
$routes->resource('tarifaencuadernacionlineas', ['namespace' => 'App\Controllers\Tarifas', 'controller' => 'Tarifaencuadernacionlineas', 'except' => 'show,new,create,update']); $routes->resource('tarifaencuadernacionlineas', ['namespace' => 'App\Controllers\Tarifas', 'controller' => 'Tarifaencuadernacionlineas', 'except' => 'show,new,create,update']);
$routes->group('proveedores', ['namespace' => 'App\Controllers\Compras'], function ($routes) {
$routes->get('', 'Proveedores::index', ['as' => 'proveedorList']);
$routes->get('add', 'Proveedores::add', ['as' => 'newProveedor']);
$routes->post('add', 'Proveedores::add', ['as' => 'createProveedor']);
$routes->post('create', 'Proveedores::create', ['as' => 'ajaxCreateProveedor']);
$routes->put('(:num)/update', 'Proveedores::update/$1', ['as' => 'ajaxUpdateProveedor']);
$routes->post('(:num)/edit', 'Proveedores::edit/$1', ['as' => 'updateProveedor']);
$routes->post('datatable', 'Proveedores::datatable', ['as' => 'dataTableOfProveedores']);
$routes->post('allmenuitems', 'Proveedores::allItemsSelect', ['as' => 'select2ItemsOfProveedores']);
$routes->post('menuitems', 'Proveedores::menuItems', ['as' => 'menuItemsOfProveedores']);
});
$routes->resource('proveedores', ['namespace' => 'App\Controllers\Compras', 'controller' => 'Proveedores', 'except' => 'show,new,create,update']);
$routes->group('proveedorestipos', ['namespace' => 'App\Controllers\Compras'], function ($routes) {
$routes->post('menuitems', 'ProveedoresTipos::menuItems', ['as' => 'menuItemsOfProveedoresTipos']);
});
$routes->resource('proveedorestipos', ['namespace' => 'App\Controllers\Compras', 'controller' => 'ProveedoresTipos', 'except' => 'show,new,create,update']);
/* /*
* -------------------------------------------------------------------- * --------------------------------------------------------------------
* Additional Routing * Additional Routing

View File

@ -1,19 +1,12 @@
<?php namespace App\Controllers\compras; <?php namespace App\Controllers\Compras;
use App\Controllers\GoBaseResourceController; use App\Controllers\GoBaseResourceController;
use App\Models\Collection; use App\Models\Collection;
use App\Entities\compras\ProveedorEntity; use App\Entities\Compras\ProveedorEntity;
use App\Models\compras\ProveedorTipoModel; use App\Models\Compras\ProveedorModel;
use App\Models\compras\ProvinciaModel;
use App\Models\Configuracion\PaisModel;
use App\Models\compras\ProveedorModel;
class Proveedores extends \App\Controllers\GoBaseResourceController { class Proveedores extends \App\Controllers\GoBaseResourceController {
@ -34,8 +27,23 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) { public function initController(\CodeIgniter\HTTP\RequestInterface $request, \CodeIgniter\HTTP\ResponseInterface $response, \Psr\Log\LoggerInterface $logger) {
$this->viewData['pageTitle'] = lang('LgProveedores.moduleTitle'); $this->viewData['pageTitle'] = lang('Proveedores.moduleTitle');
$this->viewData['usingSweetAlert'] = true; $this->viewData['usingSweetAlert'] = true;
// Se indica que este controlador trabaja con soft_delete
$this->soft_delete = true;
// Se indica el flag para los ficheros borrados
$this->delete_flag = 1;
$this->viewData = ['usingServerSideDataTable' => true];
// Breadcrumbs (IMN)
$this->viewData['breadcrumb'] = [
['title' => lang("App.menu_configuration"), 'route' => "javascript:void(0);", 'active' => false],
['title' => lang("App.menu_proveedores"), 'route' => site_url('compras/proveedores'), 'active' => true]
];
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
} }
@ -44,7 +52,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$viewData = [ $viewData = [
'currentModule' => static::$controllerSlug, 'currentModule' => static::$controllerSlug,
'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('LgProveedores.proveedor')]), 'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Proveedores.proveedor')]),
'proveedorEntity' => new ProveedorEntity(), 'proveedorEntity' => new ProveedorEntity(),
'usingServerSideDataTable' => true, 'usingServerSideDataTable' => true,
@ -83,7 +91,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$this->dealWithException($e); $this->dealWithException($e);
} }
else: else:
$this->viewData['errorMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('LgProveedores.proveedor'))]); $this->viewData['errorMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Proveedores.proveedor'))]);
$this->session->setFlashdata('formErrors', $this->model->errors()); $this->session->setFlashdata('formErrors', $this->model->errors());
endif; endif;
@ -93,7 +101,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$id = $this->model->db->insertID(); $id = $this->model->db->insertID();
$message = lang('Basic.global.saveSuccess', [mb_strtolower(lang('LgProveedores.proveedor'))]).'.'; $message = lang('Basic.global.saveSuccess', [mb_strtolower(lang('Proveedores.proveedor'))]).'.';
$message .= anchor( "admin/proveedores/{$id}/edit" , lang('Basic.global.continueEditing').'?'); $message .= anchor( "admin/proveedores/{$id}/edit" , lang('Basic.global.continueEditing').'?');
$message = ucfirst(str_replace("'", "\'", $message)); $message = ucfirst(str_replace("'", "\'", $message));
@ -118,7 +126,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$this->viewData['formAction'] = route_to('createProveedor'); $this->viewData['formAction'] = route_to('createProveedor');
$this->viewData['boxTitle'] = lang('Basic.global.addNew').' '.lang('LgProveedores.moduleTitle').' '.lang('Basic.global.addNewSuffix'); $this->viewData['boxTitle'] = lang('Basic.global.addNew').' '.lang('Proveedores.moduleTitle').' '.lang('Basic.global.addNewSuffix');
return $this->displayForm(__METHOD__); return $this->displayForm(__METHOD__);
@ -133,7 +141,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$proveedorEntity = $this->model->find($id); $proveedorEntity = $this->model->find($id);
if ($proveedorEntity == false) : if ($proveedorEntity == false) :
$message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('LgProveedores.proveedor')), $id]); $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Proveedores.proveedor')), $id]);
return $this->redirect2listView('sweet-error', $message); return $this->redirect2listView('sweet-error', $message);
endif; endif;
@ -162,20 +170,21 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$this->dealWithException($e); $this->dealWithException($e);
} }
else: else:
$this->viewData['warningMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('LgProveedores.proveedor'))]); $this->viewData['warningMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Proveedores.proveedor'))]);
$this->session->setFlashdata('formErrors', $this->model->errors()); $this->session->setFlashdata('formErrors', $this->model->errors());
endif; endif;
$proveedorEntity->fill($sanitizedData); $proveedorEntity->fill($sanitizedData);
$thenRedirect = true; $thenRedirect = false;
endif; endif;
if ($noException && $successfulResult) : if ($noException && $successfulResult) :
$id = $proveedorEntity->id ?? $id; $id = $proveedorEntity->id ?? $id;
$message = lang('Basic.global.updateSuccess', [mb_strtolower(lang('LgProveedores.proveedor'))]).'.'; $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]).'.';
$message .= anchor( "admin/proveedores/{$id}/edit" , lang('Basic.global.continueEditing').'?'); //$message = lang('Basic.global.updateSuccess', [mb_strtolower(lang('Proveedores.proveedor'))]).'.';
$message = ucfirst(str_replace("'", "\'", $message)); //$message .= anchor( "admin/proveedores/{$id}/edit" , lang('Basic.global.continueEditing').'?');
//$message = ucfirst(str_replace("'", "\'", $message));
if ($thenRedirect) : if ($thenRedirect) :
if (!empty($this->indexRoute)) : if (!empty($this->indexRoute)) :
@ -197,7 +206,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$this->viewData['formAction'] = route_to('updateProveedor', $id); $this->viewData['formAction'] = route_to('updateProveedor', $id);
$this->viewData['boxTitle'] = lang('Basic.global.edit2').' '.lang('LgProveedores.moduleTitle').' '.lang('Basic.global.edit3'); $this->viewData['boxTitle'] = lang('Basic.global.edit2').' '.lang('Proveedores.moduleTitle').' '.lang('Basic.global.edit3');
return $this->displayForm(__METHOD__, $id); return $this->displayForm(__METHOD__, $id);
@ -217,7 +226,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
$length = $reqData['length'] ?? 5; $length = $reqData['length'] ?? 5;
$search = $reqData['search']['value']; $search = $reqData['search']['value'];
$requestedOrder = $reqData['order']['0']['column'] ?? 1; $requestedOrder = $reqData['order']['0']['column'] ?? 1;
$order = ProveedorModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 1]; $order = ProveedorModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 0];
$dir = $reqData['order']['0']['dir'] ?? 'asc'; $dir = $reqData['order']['0']['dir'] ?? 'asc';
$resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); $resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject();
@ -282,9 +291,9 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
protected function getProveedorTipoListItems($selId = null) { protected function getProveedorTipoListItems($selId = null) {
$data = [''=>lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('LgProveedoresTipos.proveedorTipo'))])]; $data = [''=>lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Proveedores.tipoId'))])];
if (!empty($selId)) : if (!empty($selId)) :
$proveedorTipoModel = model('App\Models\compras\ProveedorTipoModel'); $proveedorTipoModel = model('App\Models\Compras\ProveedorTipoModel');
$selOption = $proveedorTipoModel->where('id', $selId)->findColumn('nombre'); $selOption = $proveedorTipoModel->where('id', $selId)->findColumn('nombre');
if (!empty($selOption)) : if (!empty($selOption)) :
@ -307,7 +316,7 @@ class Proveedores extends \App\Controllers\GoBaseResourceController {
protected function getProvinciaListItems($selId = null) { protected function getProvinciaListItems($selId = null) {
$data = [''=>lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Provincias.provincia'))])]; $data = [''=>lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Provincias.provincia'))])];
if (!empty($selId)) : if (!empty($selId)) :
$provinciaModel = model('App\Models\compras\ProvinciaModel'); $provinciaModel = model('App\Models\Configuracion\ProvinciaModel');
$selOption = $provinciaModel->where('id', $selId)->findColumn('nombre'); $selOption = $provinciaModel->where('id', $selId)->findColumn('nombre');
if (!empty($selOption)) : if (!empty($selOption)) :

View File

@ -1,13 +1,13 @@
<?php namespace App\Controllers\compras; <?php namespace App\Controllers\Compras;
use App\Controllers\GoBaseResourceController; use App\Controllers\GoBaseResourceController;
use App\Models\Collection; use App\Models\Collection;
use App\Entities\compras\ProveedorTipoEntity; use App\Entities\Compras\ProveedorTipoEntity;
use App\Models\compras\ProveedorTipoModel; use App\Models\Compras\ProveedorTipoModel;
class ProveedoresTipos extends \App\Controllers\GoBaseResourceController { class ProveedoresTipos extends \App\Controllers\GoBaseResourceController {

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Entities\compras; namespace App\Entities\Compras;
use CodeIgniter\Entity; use CodeIgniter\Entity;

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Entities\compras; namespace App\Entities\Compras;
use CodeIgniter\Entity; use CodeIgniter\Entity;

View File

@ -0,0 +1,85 @@
<?php
return [
'cif' => 'CIF',
'ciudad' => 'City',
'cp' => 'Postal code',
'createdAt' => 'Created At',
'deletedAt' => 'Deleted At',
'direccion' => 'Address',
'email' => 'Email',
'id' => 'ID',
'isDeleted' => 'Is Deleted',
'moduleTitle' => 'Suppliers',
'nombre' => 'Name',
'paisId' => 'Country',
'personaContacto' => 'Contact Person',
'propiedades' => 'Properties',
'proveedor' => 'Supplier',
'proveedorList' => 'Suppliers List',
'proveedores' => 'Suppliers',
'provinciaId' => 'Region',
'razonSocial' => 'Business Name',
'telefono' => 'Phone',
'tipoId' => 'Type',
'updatedAt' => 'Updated At',
'validation' => [
'cif' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'ciudad' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'cp' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'direccion' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'persona_contacto' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'razon_social' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'telefono' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
],
'email' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
'valid_email' => 'The {field} field must contain a valid email address.',
],
'nombre' => [
'max_length' => 'The {field} field cannot exceed {param} characters in length.',
'required' => 'The {field} field is required.',
],
'tipo' => [
'required' => 'The {field} field is required.',
],
],
];

View File

@ -0,0 +1,84 @@
<?php
return [
'cif' => 'CIF',
'ciudad' => 'Ciudad',
'cp' => 'Código Postal',
'createdAt' => 'Created At',
'deletedAt' => 'Deleted At',
'direccion' => 'Direccion',
'email' => 'Email',
'id' => 'ID',
'isDeleted' => 'Is Deleted',
'moduleTitle' => 'Proveedores',
'nombre' => 'Nombre',
'paisId' => 'País',
'personaContacto' => 'Persona Contacto',
'propiedades' => 'Propiedades',
'proveedor' => 'Proveedor',
'proveedorList' => 'Lista de Proveedores',
'proveedores' => 'Proveedores',
'provinciaId' => 'Provincia',
'razonSocial' => 'Razón Social',
'telefono' => 'Teléfono',
'tipoId' => 'Tipo',
'updatedAt' => 'Updated At',
'validation' => [
'cif' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'ciudad' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'cp' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'direccion' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'persona_contacto' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'razon_social' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'telefono' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
],
'email' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
'valid_email' => 'El campo {field} debe contener una dirección de correo válida.',
],
'nombre' => [
'max_length' => 'El campo {field} no puede exceder de {param} caracteres en longitud.',
'required' => 'El campo {field} es obligatorio.',
],
'tipo' => [
'required' => 'El campo {field} es obligatorio.',
],
],
];

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Models\compras; namespace App\Models\Compras;
class ProveedorModel extends \App\Models\GoBaseModel class ProveedorModel extends \App\Models\GoBaseModel
{ {
@ -13,22 +13,9 @@ class ProveedorModel extends \App\Models\GoBaseModel
protected $useAutoIncrement = true; protected $useAutoIncrement = true;
const SORTABLE = [ const SORTABLE = [
1 => "t1.id", 0 => "t1.nombre",
2 => "t1.nombre", 1 => "t2.nombre",
3 => "t1.tipo_id",
4 => "t1.razon_social",
5 => "t1.cif",
6 => "t1.direccion",
7 => "t1.cp",
8 => "t1.ciudad",
9 => "t1.provincia_id",
10 => "t1.pais_id",
11 => "t1.persona_contacto",
12 => "t1.email",
13 => "t1.telefono",
14 => "t2.nombre",
15 => "t3.nombre",
16 => "t4.nombre",
]; ];
protected $allowedFields = [ protected $allowedFields = [
@ -45,7 +32,7 @@ class ProveedorModel extends \App\Models\GoBaseModel
"email", "email",
"telefono", "telefono",
]; ];
protected $returnType = "App\Entities\compras\ProveedorEntity"; protected $returnType = "App\Entities\Compras\ProveedorEntity";
protected $useTimestamps = true; protected $useTimestamps = true;
protected $useSoftDeletes = false; protected $useSoftDeletes = false;
@ -58,72 +45,79 @@ class ProveedorModel extends \App\Models\GoBaseModel
protected $validationRules = [ protected $validationRules = [
"cif" => [ "cif" => [
"label" => "LgProveedores.cif", "label" => "Proveedores.cif",
"rules" => "trim|max_length[15]", "rules" => "trim|max_length[15]",
], ],
"tipo_id" => [
"label" => "Proveedores.tipoId",
"rules" => "required",
],
"ciudad" => [ "ciudad" => [
"label" => "LgProveedores.ciudad", "label" => "Proveedores.ciudad",
"rules" => "trim|max_length[255]", "rules" => "trim|max_length[255]",
], ],
"cp" => [ "cp" => [
"label" => "LgProveedores.cp", "label" => "Proveedores.cp",
"rules" => "trim|max_length[10]", "rules" => "trim|max_length[10]",
], ],
"direccion" => [ "direccion" => [
"label" => "LgProveedores.direccion", "label" => "Proveedores.direccion",
"rules" => "trim|max_length[255]", "rules" => "trim|max_length[255]",
], ],
"email" => [ "email" => [
"label" => "LgProveedores.email", "label" => "Proveedores.email",
"rules" => "trim|max_length[255]|valid_email|permit_empty", "rules" => "trim|max_length[255]|valid_email|permit_empty",
], ],
"nombre" => [ "nombre" => [
"label" => "LgProveedores.nombre", "label" => "Proveedores.nombre",
"rules" => "trim|required|max_length[255]", "rules" => "trim|required|max_length[255]",
], ],
"persona_contacto" => [ "persona_contacto" => [
"label" => "LgProveedores.personaContacto", "label" => "Proveedores.personaContacto",
"rules" => "trim|max_length[255]", "rules" => "trim|max_length[255]",
], ],
"razon_social" => [ "razon_social" => [
"label" => "LgProveedores.razonSocial", "label" => "Proveedores.razonSocial",
"rules" => "trim|max_length[255]", "rules" => "trim|max_length[255]",
], ],
"telefono" => [ "telefono" => [
"label" => "LgProveedores.telefono", "label" => "Proveedores.telefono",
"rules" => "trim|max_length[60]", "rules" => "trim|max_length[60]",
], ],
]; ];
protected $validationMessages = [ protected $validationMessages = [
"cif" => [ "cif" => [
"max_length" => "LgProveedores.validation.cif.max_length", "max_length" => "Proveedores.validation.cif.max_length",
], ],
"ciudad" => [ "ciudad" => [
"max_length" => "LgProveedores.validation.ciudad.max_length", "max_length" => "Proveedores.validation.ciudad.max_length",
], ],
"cp" => [ "cp" => [
"max_length" => "LgProveedores.validation.cp.max_length", "max_length" => "Proveedores.validation.cp.max_length",
], ],
"direccion" => [ "direccion" => [
"max_length" => "LgProveedores.validation.direccion.max_length", "max_length" => "Proveedores.validation.direccion.max_length",
], ],
"email" => [ "email" => [
"max_length" => "LgProveedores.validation.email.max_length", "max_length" => "Proveedores.validation.email.max_length",
"valid_email" => "LgProveedores.validation.email.valid_email", "valid_email" => "Proveedores.validation.email.valid_email",
], ],
"nombre" => [ "nombre" => [
"max_length" => "LgProveedores.validation.nombre.max_length", "max_length" => "Proveedores.validation.nombre.max_length",
"required" => "LgProveedores.validation.nombre.required", "required" => "Proveedores.validation.nombre.required",
],
"tipo_id" => [
"required" => "Proveedores.validation.tipo.required",
], ],
"persona_contacto" => [ "persona_contacto" => [
"max_length" => "LgProveedores.validation.persona_contacto.max_length", "max_length" => "Proveedores.validation.persona_contacto.max_length",
], ],
"razon_social" => [ "razon_social" => [
"max_length" => "LgProveedores.validation.razon_social.max_length", "max_length" => "Proveedores.validation.razon_social.max_length",
], ],
"telefono" => [ "telefono" => [
"max_length" => "LgProveedores.validation.telefono.max_length", "max_length" => "Proveedores.validation.telefono.max_length",
], ],
]; ];
public function findAllWithAllRelations(string $selcols = "*", int $limit = null, int $offset = 0) public function findAllWithAllRelations(string $selcols = "*", int $limit = null, int $offset = 0)

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Models\compras; namespace App\Models\Compras;
class ProveedorTipoModel extends \App\Models\GoBaseModel class ProveedorTipoModel extends \App\Models\GoBaseModel
{ {
@ -20,7 +20,7 @@ class ProveedorTipoModel extends \App\Models\GoBaseModel
]; ];
protected $allowedFields = ["nombre"]; protected $allowedFields = ["nombre"];
protected $returnType = "App\Entities\compras\ProveedorTipoEntity"; protected $returnType = "App\Entities\Compras\ProveedorTipoEntity";
protected $useTimestamps = true; protected $useTimestamps = true;
protected $useSoftDeletes = false; protected $useSoftDeletes = false;

View File

@ -2,38 +2,38 @@
<div class="col-md-12 col-lg-6 px-4"> <div class="col-md-12 col-lg-6 px-4">
<div class="mb-3"> <div class="mb-3">
<label for="nombre" class="form-label"> <label for="nombre" class="form-label">
<?=lang('LgProveedores.nombre') ?>* <?=lang('Proveedores.nombre') ?>*
</label> </label>
<input type="text" id="nombre" name="nombre" required maxLength="255" class="form-control" value="<?=old('nombre', $proveedorEntity->nombre) ?>"> <input type="text" id="nombre" name="nombre" tabindex="1" maxLength="255" class="form-control" value="<?=old('nombre', $proveedorEntity->nombre) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="razonSocial" class="form-label"> <label for="razonSocial" class="form-label">
<?=lang('LgProveedores.razonSocial') ?> <?=lang('Proveedores.razonSocial') ?>
</label> </label>
<input type="text" id="razonSocial" name="razon_social" maxLength="255" class="form-control" value="<?=old('razon_social', $proveedorEntity->razon_social) ?>"> <input type="text" id="razonSocial" name="razon_social" tabindex="3" maxLength="255" class="form-control" value="<?=old('razon_social', $proveedorEntity->razon_social) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="direccion" class="form-label"> <label for="direccion" class="form-label">
<?=lang('LgProveedores.direccion') ?> <?=lang('Proveedores.direccion') ?>
</label> </label>
<input type="text" id="direccion" name="direccion" maxLength="255" class="form-control" value="<?=old('direccion', $proveedorEntity->direccion) ?>"> <input type="text" id="direccion" name="direccion" tabindex="5" maxLength="255" class="form-control" value="<?=old('direccion', $proveedorEntity->direccion) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="ciudad" class="form-label"> <label for="ciudad" class="form-label">
<?=lang('LgProveedores.ciudad') ?> <?=lang('Proveedores.ciudad') ?>
</label> </label>
<input type="text" id="ciudad" name="ciudad" maxLength="255" class="form-control" value="<?=old('ciudad', $proveedorEntity->ciudad) ?>"> <input type="text" id="ciudad" name="ciudad" tabindex="7" maxLength="255" class="form-control" value="<?=old('ciudad', $proveedorEntity->ciudad) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="paisId" class="form-label"> <label for="paisId" class="form-label">
<?=lang('LgProveedores.paisId') ?>* <?=lang('Proveedores.paisId') ?>
</label> </label>
<select id="paisId" name="pais_id" required class="form-control select2bs" style="width: 100%;" > <select id="paisId" name="pais_id" tabindex="9" class="form-control select2bs" style="width: 100%;" >
<option value=""><?=lang('Basic.global.pleaseSelectA', [lang('LgProveedores.paisId')]) ?></option> <option value=""><?=lang('Basic.global.pleaseSelectA', [lang('Proveedores.paisId')]) ?></option>
<?php foreach ($paisList as $item) : ?> <?php foreach ($paisList as $item) : ?>
<option value="<?=$item->id ?>"<?=$item->id==$proveedorEntity->pais_id ? ' selected':'' ?>> <option value="<?=$item->id ?>"<?=$item->id==$proveedorEntity->pais_id ? ' selected':'' ?>>
@ -45,18 +45,18 @@
<div class="mb-3"> <div class="mb-3">
<label for="email" class="form-label"> <label for="email" class="form-label">
<?=lang('LgProveedores.email') ?> <?=lang('Proveedores.email') ?>
</label> </label>
<input type="email" id="email" name="email" maxLength="255" class="form-control" value="<?=old('email', $proveedorEntity->email) ?>"> <input type="email" id="email" name="email" tabindex="11" maxLength="255" class="form-control" value="<?=old('email', $proveedorEntity->email) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
</div><!--//.col --> </div><!--//.col -->
<div class="col-md-12 col-lg-6 px-4"> <div class="col-md-12 col-lg-6 px-4">
<div class="mb-3"> <div class="mb-3">
<label for="tipoId" class="form-label"> <label for="tipoId" class="form-label">
<?=lang('LgProveedores.tipoId') ?> <?=lang('Proveedores.tipoId') ?>*
</label> </label>
<select id="tipoId" name="tipo_id" class="form-control select2bs2" style="width: 100%;" > <select id="tipoId" name="tipo_id" tabindex="2" class="form-control select2bs2" style="width: 100%;" >
<?php if ( isset($proveedorTipoList) && is_array($proveedorTipoList) && !empty($proveedorTipoList) ) : <?php if ( isset($proveedorTipoList) && is_array($proveedorTipoList) && !empty($proveedorTipoList) ) :
foreach ($proveedorTipoList as $k => $v) : ?> foreach ($proveedorTipoList as $k => $v) : ?>
@ -70,23 +70,23 @@
<div class="mb-3"> <div class="mb-3">
<label for="cif" class="form-label"> <label for="cif" class="form-label">
<?=lang('LgProveedores.cif') ?> <?=lang('Proveedores.cif') ?>
</label> </label>
<input type="text" id="cif" name="cif" maxLength="15" class="form-control" value="<?=old('cif', $proveedorEntity->cif) ?>"> <input type="text" id="cif" name="cif" tabindex="4" maxLength="15" class="form-control" value="<?=old('cif', $proveedorEntity->cif) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="cp" class="form-label"> <label for="cp" class="form-label">
<?=lang('LgProveedores.cp') ?> <?=lang('Proveedores.cp') ?>
</label> </label>
<input type="text" id="cp" name="cp" maxLength="10" class="form-control" value="<?=old('cp', $proveedorEntity->cp) ?>"> <input type="text" id="cp" name="cp" tabindex="6" maxLength="10" class="form-control" value="<?=old('cp', $proveedorEntity->cp) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="provinciaId" class="form-label"> <label for="provinciaId" class="form-label">
<?=lang('LgProveedores.provinciaId') ?>* <?=lang('Proveedores.provinciaId') ?>
</label> </label>
<select id="provinciaId" name="provincia_id" required class="form-control select2bs2" style="width: 100%;" > <select id="provinciaId" name="provincia_id" tabindex="8" class="form-control select2bs2" style="width: 100%;" >
<?php if ( isset($provinciaList) && is_array($provinciaList) && !empty($provinciaList) ) : <?php if ( isset($provinciaList) && is_array($provinciaList) && !empty($provinciaList) ) :
foreach ($provinciaList as $k => $v) : ?> foreach ($provinciaList as $k => $v) : ?>
@ -100,16 +100,16 @@
<div class="mb-3"> <div class="mb-3">
<label for="personaContacto" class="form-label"> <label for="personaContacto" class="form-label">
<?=lang('LgProveedores.personaContacto') ?> <?=lang('Proveedores.personaContacto') ?>
</label> </label>
<input type="text" id="personaContacto" name="persona_contacto" maxLength="255" class="form-control" value="<?=old('persona_contacto', $proveedorEntity->persona_contacto) ?>"> <input type="text" id="personaContacto" name="persona_contacto" tabindex="10" maxLength="255" class="form-control" value="<?=old('persona_contacto', $proveedorEntity->persona_contacto) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
<div class="mb-3"> <div class="mb-3">
<label for="telefono" class="form-label"> <label for="telefono" class="form-label">
<?=lang('LgProveedores.telefono') ?> <?=lang('Proveedores.telefono') ?>
</label> </label>
<input type="text" id="telefono" name="telefono" maxLength="60" class="form-control" value="<?=old('telefono', $proveedorEntity->telefono) ?>"> <input type="text" id="telefono" name="telefono" tabindex="12" maxLength="60" class="form-control" value="<?=old('telefono', $proveedorEntity->telefono) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
</div><!--//.col --> </div><!--//.col -->

View File

@ -1,6 +1,6 @@
<?= $this->include("Themes/_commonPartialsBs/select2bs5") ?> <?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
<?= $this->include("Themes/_commonPartialsBs/sweetalert") ?> <?= $this->include("themes/_commonPartialsBs/sweetalert") ?>
<?= $this->extend("Themes/" . config("Basics")->theme["name"] . "/AdminLayout/defaultLayout") ?> <?= $this->extend('themes/backend/vuexy/main/defaultlayout') ?>
<?= $this->section("content") ?> <?= $this->section("content") ?>
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
@ -11,15 +11,21 @@
<form id="proveedorForm" method="post" action="<?= $formAction ?>"> <form id="proveedorForm" method="post" action="<?= $formAction ?>">
<?= csrf_field() ?> <?= csrf_field() ?>
<div class="card-body"> <div class="card-body">
<?= view("Themes/_commonPartialsBs/_alertBoxes") ?> <?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?> <?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?>
<?= view("themes/backend/vuexy/form/compras/proveedores/_proveedorFormItems") ?> <?= view("themes/backend/vuexy/form/compras/proveedores/_proveedorFormItems") ?>
</div><!-- /.card-body --> </div><!-- /.card-body -->
<div class="card-footer">
<?= anchor(route_to("proveedorList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?> <div class="pt-4">
<input type="submit" class="btn btn-primary float-end" name="save" value="<?= lang("Basic.global.Save") ?>"> <input type="submit"
</div><!-- /.card-footer --> class="btn btn-primary float-start me-sm-3 me-1"
</form> name="save"
value="<?= lang("Basic.global.Save") ?>"
/>
<?= anchor(route_to("proveedorList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?>
</div><!-- /.card-footer -->
</form>
</div><!-- //.card --> </div><!-- //.card -->
</div><!--//.col --> </div><!--//.col -->
</div><!--//.row --> </div><!--//.row -->
@ -30,7 +36,6 @@
$('#tipoId').select2({ $('#tipoId').select2({
theme: 'bootstrap-5',
allowClear: false, allowClear: false,
ajax: { ajax: {
url: '<?= route_to("menuItemsOfProveedoresTipos") ?>', url: '<?= route_to("menuItemsOfProveedoresTipos") ?>',
@ -60,7 +65,6 @@
}); });
$('#provinciaId').select2({ $('#provinciaId').select2({
theme: 'bootstrap-5',
allowClear: false, allowClear: false,
ajax: { ajax: {
url: '<?= route_to("menuItemsOfProvincias") ?>', url: '<?= route_to("menuItemsOfProvincias") ?>',

View File

@ -1,35 +1,24 @@
<?=$this->include('Themes/_commonPartialsBs/select2bs5') ?> <?=$this->include('themes/_commonPartialsBs/select2bs5') ?>
<?=$this->include('Themes/_commonPartialsBs/datatables') ?> <?=$this->include('themes/_commonPartialsBs/datatables') ?>
<?=$this->include('Themes/_commonPartialsBs/sweetalert') ?> <?= $this->include('themes/_commonPartialsBs/_confirm2delete') ?>
<?=$this->extend('Themes/'.config('Basics')->theme['name'].'/AdminLayout/defaultLayout') ?> <?= $this->extend('themes/backend/vuexy/main/defaultlayout') ?>
<?=$this->section('content'); ?> <?=$this->section('content'); ?>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="card card-info"> <div class="card card-info">
<div class="card-header"> <div class="card-header">
<h3 class="card-title"><?=lang('LgProveedores.proveedorList') ?></h3> <h3 class="card-title"><?=lang('Proveedores.proveedorList') ?></h3>
<?=anchor(route_to('newProveedor'), lang('Basic.global.addNew').' '.lang('Proveedores.proveedor'), ['class'=>'btn btn-primary float-end']); ?>
</div><!--//.card-header --> </div><!--//.card-header -->
<div class="card-body"> <div class="card-body">
<?= view('Themes/_commonPartialsBs/_alertBoxes'); ?> <?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<table id="tableOfProveedores" class="table table-striped table-hover" style="width: 100%;"> <table id="tableOfProveedores" class="table table-striped table-hover" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th> <th><?= lang('Proveedores.nombre') ?></th>
<th><?=lang('LgProveedores.id')?></th> <th><?= lang('Proveedores.tipoId') ?></th>
<th><?= lang('LgProveedores.nombre') ?></th>
<th><?= lang('LgProveedoresTipos.proveedorTipo') ?></th>
<th><?= lang('LgProveedores.razonSocial') ?></th>
<th><?= lang('LgProveedores.cif') ?></th>
<th><?= lang('LgProveedores.direccion') ?></th>
<th><?= lang('LgProveedores.cp') ?></th>
<th><?= lang('LgProveedores.ciudad') ?></th>
<th><?= lang('Provincias.provincia') ?></th>
<th><?= lang('Paises.pais') ?></th>
<th><?= lang('LgProveedores.personaContacto') ?></th>
<th><?= lang('LgProveedores.email') ?></th>
<th><?= lang('LgProveedores.telefono') ?></th>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th> <th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr> </tr>
</thead> </thead>
@ -39,7 +28,7 @@
</table> </table>
</div><!--//.card-body --> </div><!--//.card-body -->
<div class="card-footer"> <div class="card-footer">
<?=anchor(route_to('newProveedor'), lang('Basic.global.addNew').' '.lang('LgProveedores.proveedor'), ['class'=>'btn btn-primary float-end']); ?>
</div><!--//.card-footer --> </div><!--//.card-footer -->
</div><!--//.card --> </div><!--//.card -->
</div><!--//.col --> </div><!--//.col -->
@ -50,26 +39,26 @@
<?=$this->section('additionalInlineJs') ?> <?=$this->section('additionalInlineJs') ?>
const lastColNr = $('#tableOfProveedores').find("tr:first th").length - 1; const lastColNr = $('#tableOfProveedores').find("tr:first th").length - 1;
const actionBtns = function(data) { const actionBtns = function(data) {
return `<td class="text-right py-0 align-middle"> return `
<div class="btn-group btn-group-sm"> <td class="text-right py-0 align-middle">
<button class="btn btn-sm btn-warning btn-edit me-1" data-id="${data.id}"><?= lang('Basic.global.edit') ?></button> <div class="btn-group btn-group-sm">
<button class="btn btn-sm btn-danger btn-delete ms-1" data-id="${data.id}"><?= lang('Basic.global.Delete') ?></button> <a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="${data.id}"></i></a>
</div> <a href="javascript:void(0);"><i class="ti ti-trash ti-sm btn-delete mx-2" data-id="${data.id}" data-bs-toggle="modal" data-bs-target="#confirm2delete"></i></a>
</td>`; </div>
}; </td>`;
theTable = $('#tableOfProveedores').DataTable({ };
processing: true, theTable = $('#tableOfProveedores').DataTable({
serverSide: true, processing: true,
autoWidth: true, serverSide: true,
responsive: true, autoWidth: true,
scrollX: true, responsive: true,
lengthMenu: [ 5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500 ], scrollX: true,
pageLength: 10, lengthMenu: [ 5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500 ],
lengthChange: true, pageLength: 25,
"dom": 'lfrtipB', // 'lfBrtip', // you can try different layout combinations by uncommenting one or the other lengthChange: true,
// "dom": '<"top"lf><"clear">rt<"bottom"ipB><"clear">', // remember to comment this line if you uncomment the above "dom": 'lfBrtip',
"buttons": [ "buttons": [
'copy', 'csv', 'excel', 'print', { 'copy', 'csv', 'excel', 'print', {
extend: 'pdfHtml5', extend: 'pdfHtml5',
@ -77,88 +66,58 @@
pageSize: 'A4' pageSize: 'A4'
} }
], ],
stateSave: true, stateSave: true,
order: [[1, 'asc']], order: [[0, 'asc']],
language: { language: {
url: "/assets/dt/<?= config('Basics')->languages[$currentLocale] ?? config('Basics')->i18n ?>.json" url: "//cdn.datatables.net/plug-ins/1.13.4/i18n/<?= config('Basics')->i18n ?>.json"
}, },
ajax : $.fn.dataTable.pipeline( { ajax : $.fn.dataTable.pipeline( {
url: '<?= route_to('dataTableOfProveedores') ?>', url: '<?= route_to('dataTableOfProveedores') ?>',
method: 'POST', method: 'POST',
headers: {'X-Requested-With': 'XMLHttpRequest'}, headers: {'X-Requested-With': 'XMLHttpRequest'},
async: true, async: true,
}), }),
columnDefs: [ columnDefs: [
{ {
orderable: false, orderable: false,
searchable: false, searchable: false,
targets: [0,lastColNr] targets: [lastColNr]
}
],
columns : [
{ 'data': actionBtns },
{ 'data': 'id' },
{ 'data': 'nombre' },
{ 'data': 'tipo' },
{ 'data': 'razon_social' },
{ 'data': 'cif' },
{ 'data': 'direccion' },
{ 'data': 'cp' },
{ 'data': 'ciudad' },
{ 'data': 'provincia' },
{ 'data': 'pais' },
{ 'data': 'persona_contacto' },
{ 'data': 'email' },
{ 'data': 'telefono' },
{ 'data': actionBtns }
]
});
$(document).on('click', '.btn-edit', function(e) {
window.location.href = `<?= route_to('proveedorList') ?>/${$(this).attr('data-id')}/edit`;
});
$(document).on('click', '.btn-delete', function(e) {
Swal.fire({
title: '<?= lang('Basic.global.sweet.sureToDeleteTitle', [mb_strtolower(lang('LgProveedores.proveedor'))]) ?>',
text: '<?= lang('Basic.global.sweet.sureToDeleteText') ?>',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
confirmButtonText: '<?= lang('Basic.global.sweet.deleteConfirmationButton') ?>',
cancelButtonText: '<?= lang('Basic.global.Cancel') ?>',
cancelButtonColor: '#d33'
})
.then((result) => {
const dataId = $(this).data('id');
const row = $(this).closest('tr');
if (result.value) {
$.ajax({
url: `<?= route_to('proveedorList') ?>/${dataId}`,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: data.msg ?? jqXHR.statusText,
});
theTable.clearPipeline();
theTable.row($(row)).invalidate().draw();
}).fail((jqXHR, textStatus, errorThrown) => {
Toast.fire({
icon: 'error',
title: jqXHR.responseJSON.messages.error,
});
})
} }
}); ],
columns : [
{ 'data': 'nombre' },
{ 'data': 'tipo' },
{ 'data': actionBtns }
]
}); });
$(document).on('click', '.btn-edit', function(e) {
window.location.href = `/compras/proveedores/edit/${$(this).attr('data-id')}`;
});
$(document).on('click', '.btn-delete', function(e) {
$(".btn-remove").attr('data-id', $(this).attr('data-id'));
});
$(document).on('click', '.btn-remove', function(e) {
const dataId = $(this).attr('data-id');
const row = $(this).closest('tr');
if ($.isNumeric(dataId)) {
$.ajax({
url: `/compras/proveedores/delete/${dataId}`,
method: 'GET',
}).done((data, textStatus, jqXHR) => {
$('#confirm2delete').modal('toggle');
theTable.clearPipeline();
theTable.row($(row)).invalidate().draw();
popSuccessAlert(data.msg ?? jqXHR.statusText);
}).fail((jqXHR, textStatus, errorThrown) => {
popErrorAlert(jqXHR.responseJSON.messages.error)
})
}
});
<?=$this->endSection() ?> <?=$this->endSection() ?>

View File

@ -4,7 +4,7 @@
<label for="nombre" class="form-label"> <label for="nombre" class="form-label">
<?= lang('Tarifaacabado.nombre') ?>* <?= lang('Tarifaacabado.nombre') ?>*
</label> </label>
<input type="text" id="nombre" name="nombre" required maxLength="255" class="form-control" <input type="text" id="nombre" name="nombre" maxLength="255" class="form-control"
value="<?= old('nombre', $tarifaacabadoEntity->nombre) ?>"> value="<?= old('nombre', $tarifaacabadoEntity->nombre) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
@ -12,7 +12,7 @@
<label for="nombre" class="form-label"> <label for="nombre" class="form-label">
<?= lang('Tarifaacabado.precioMin') ?>* <?= lang('Tarifaacabado.precioMin') ?>*
</label> </label>
<input type="text" id="precio_min" name="precio_min" required class="form-control" <input type="text" id="precio_min" name="precio_min" class="form-control"
value="<?= old('precio_min', $tarifaacabadoEntity->precio_min) ?>"> value="<?= old('precio_min', $tarifaacabadoEntity->precio_min) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
@ -20,7 +20,7 @@
<label for="nombre" class="form-label"> <label for="nombre" class="form-label">
<?= lang('Tarifaacabado.importeFijo') ?>* <?= lang('Tarifaacabado.importeFijo') ?>*
</label> </label>
<input type="text" id="importe_fijo" name="importe_fijo" required class="form-control" <input type="text" id="importe_fijo" name="importe_fijo" class="form-control"
value="<?= old('importe_fijo', $tarifaacabadoEntity->importe_fijo) ?>"> value="<?= old('importe_fijo', $tarifaacabadoEntity->importe_fijo) ?>">
</div><!--//.mb-3 --> </div><!--//.mb-3 -->

View File

@ -388,10 +388,10 @@
/** /**
* MENU PROVEEDORES * MENU PROVEEDORES
*/ */
if (count(getArrayItem($menus, 'name', 'Proveedor')) > 0): ?> if (count(getArrayItem($menus, 'name', 'Proveedores')) > 0): ?>
<!-- Providers --> <!-- Providers -->
<li class="menu-item"> <li class="menu-item">
<a href="<?= site_url("proveedores/proveedor") ?>" class="menu-link"> <a href="<?= site_url("compras/proveedores") ?>" class="menu-link">
<i class="menu-icon tf-icons ti ti-file-dollar"></i> <i class="menu-icon tf-icons ti ti-file-dollar"></i>
<div data-i18n="<?= lang("App.menu_proveedores") ?>"><?= lang("App.menu_proveedores") ?></div> <div data-i18n="<?= lang("App.menu_proveedores") ?>"><?= lang("App.menu_proveedores") ?></div>
</a> </a>

View File

@ -407,7 +407,7 @@
* MENU COMPRAS * MENU COMPRAS
*/ */
if (allowMenuSection($menus, if (allowMenuSection($menus,
['Compras', 'Productos', 'Proveedor'], 'index')): ?> ['Compras', 'Productos', 'Proveedores'], 'index')): ?>
<!-- BUY --> <!-- BUY -->
<li class="menu-item"> <li class="menu-item">
<a href="javascript:void(0);" class="menu-link menu-toggle"> <a href="javascript:void(0);" class="menu-link menu-toggle">
@ -436,7 +436,7 @@
<?php if (count($temp = getArrayItem($menus, 'name', 'Proveedor')) > 0): ?> <?php if (count($temp = getArrayItem($menus, 'name', 'Proveedor')) > 0): ?>
<?php if (count(getArrayItem($temp, 'methods', 'index', true)) > 0): ?> <?php if (count(getArrayItem($temp, 'methods', 'index', true)) > 0): ?>
<li class="menu-item"> <li class="menu-item">
<a href="<?= site_url("servicios/proveedor") ?>" class="menu-link"> <a href="<?= site_url("compras/proveedores") ?>" class="menu-link">
<div data-i18n="<?= lang("App.menu_proveedores") ?>"><?= lang("App.menu_proveedores") ?></div> <div data-i18n="<?= lang("App.menu_proveedores") ?>"><?= lang("App.menu_proveedores") ?></div>
</a> </a>
</li> </li>