Merge branch 'main' into feat/ordenes-trabajo

This commit is contained in:
amazuecos
2024-12-05 20:32:32 +01:00
38 changed files with 2256 additions and 1093 deletions

View File

@ -394,6 +394,9 @@ $routes->group('clientes', ['namespace' => 'App\Controllers\Clientes'], function
$routes->group('clienteprecios', ['namespace' => 'App\Controllers\Clientes'], function ($routes) { $routes->group('clienteprecios', ['namespace' => 'App\Controllers\Clientes'], function ($routes) {
$routes->post('datatable', 'ClientePrecios::datatable', ['as' => 'dataTableOfClienteprecios']); $routes->post('datatable', 'ClientePrecios::datatable', ['as' => 'dataTableOfClienteprecios']);
$routes->post('datatable_editor', 'ClientePrecios::datatable_editor', ['as' => 'editorOfClienteprecios']); $routes->post('datatable_editor', 'ClientePrecios::datatable_editor', ['as' => 'editorOfClienteprecios']);
$routes->post('changeplantilla', 'ClientePrecios::updatePlantilla', ['as' => 'changePlantillaOfClienteprecios']);
$routes->get('getplantilla', 'ClientePrecios::getCurrentPlantilla', ['as' => 'getPlantillaOfClienteprecios']);
$routes->post('update', 'ClientePrecios::updatePlantilla', ['as' => 'updateClienteprecios']);
}); });
$routes->resource('clienteprecios', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'ClientePrecios', 'except' => 'show,new,create,update']); $routes->resource('clienteprecios', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'ClientePrecios', 'except' => 'show,new,create,update']);
@ -403,11 +406,13 @@ $routes->group('clienteplantillaprecios', ['namespace' => 'App\Controllers\Clien
$routes->get('add', 'Clienteplantillaprecios::add', ['as' => 'newClienteplantillaprecios']); $routes->get('add', 'Clienteplantillaprecios::add', ['as' => 'newClienteplantillaprecios']);
$routes->post('add', 'Clienteplantillaprecios::add', ['as' => 'createClienteplantillaprecios']); $routes->post('add', 'Clienteplantillaprecios::add', ['as' => 'createClienteplantillaprecios']);
$routes->post('edit/(:num)', 'Clienteplantillaprecios::edit/$1', ['as' => 'updateClienteplantillaprecios']); $routes->post('edit/(:num)', 'Clienteplantillaprecios::edit/$1', ['as' => 'updateClienteplantillaprecios']);
$routes->get('edit/(:num)', 'Clienteplantillaprecios::edit/$1', ['as' => 'updateClienteplantillaprecios']);
$routes->get('delete/(:num)', 'Clienteplantillaprecios::delete/$1', ['as' => 'deleteClienteplantillaprecios']); $routes->get('delete/(:num)', 'Clienteplantillaprecios::delete/$1', ['as' => 'deleteClienteplantillaprecios']);
$routes->post('datatable', 'Clienteplantillaprecios::datatable', ['as' => 'dataTableOfClientesplantillaprecios']); $routes->post('datatable', 'Clienteplantillaprecios::datatable', ['as' => 'dataTableOfClientesplantillaprecios']);
$routes->post('menuitems', 'Clienteplantillaprecios::menuItems', ['as' => 'menuItemsOfClienteplantillaprecios']); $routes->get('menuitems', 'Clienteplantillaprecios::menuItems', ['as' => 'menuItemsOfClienteplantillaprecios']);
$routes->post('update/(:num)', 'Clienteplantillaprecios::update/$1', ['as' => 'updateClienteplantillaprecios']);
}); });
$routes->resource('clienteplantillaprecios', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'Clienteplantillaprecios', 'except' => 'show,new,create,update']); $routes->resource('clienteplantillaprecios', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'Clienteplantillaprecios', 'except' => 'show,new,create']);
$routes->group('clienteplantillaprecioslineas', ['namespace' => 'App\Controllers\Clientes'], function ($routes) { $routes->group('clienteplantillaprecioslineas', ['namespace' => 'App\Controllers\Clientes'], function ($routes) {

View File

@ -1,4 +1,5 @@
<?php namespace App\Controllers\Clientes; <?php
namespace App\Controllers\Clientes;
use App\Controllers\BaseResourceController; use App\Controllers\BaseResourceController;
@ -45,40 +46,36 @@ class ClientePrecios extends \App\Controllers\BaseResourceController
parent::initController($request, $response, $logger); parent::initController($request, $response, $logger);
} }
public function update($requestedId = null) public function updatePlantilla()
{ {
if ($this->request->getPost()) : if ($this->request->isAJAX()) {
if ($requestedId == null) :
return;
endif;
$postData = $this->request->getJSON(); $postData = $this->request->getPost();
$cliente_id = $postData['cliente_id'] ?? -1;
$plantilla_id = $postData['plantilla_id'] ?? -1;
$plantilla_id = $postData->plantilla_id ?? -1;
// Se ha actualizado un registro por lo que no es una plantilla // Se ha actualizado un registro por lo que no es una plantilla
if($plantilla_id == -1){ if ($plantilla_id == -1) {
$this->model->clean_plantilla_id($requestedId); $this->model->clean_plantilla_id($cliente_id);
} } else if ($cliente_id == -1) { // actualizar todos los clientes que usan una plantilla
else if($requestedId== -1){ // actualizar todos los clientes que usan una plantilla
$this->model->update_from_plantilla($plantilla_id); $this->model->update_from_plantilla($plantilla_id);
} else {
$this->model->copy_from_plantilla($cliente_id, $plantilla_id);
} }
else{
$this->model->copy_from_plantilla($requestedId, $plantilla_id);
}
$newTokenHash = csrf_hash(); $newTokenHash = csrf_hash();
$csrfTokenName = csrf_token(); $csrfTokenName = csrf_token();
$data = [ $data = [
$csrfTokenName => $newTokenHash $csrfTokenName => $newTokenHash
]; ];
return $this->respond($data); return $this->respond($data);
endif; // ($requestMethod === 'post') } else {
return $this->failUnauthorized('Invalid request', 403);
}
} }
@ -93,92 +90,114 @@ class ClientePrecios extends \App\Controllers\BaseResourceController
} }
$start = $reqData['start'] ?? 0; $start = $reqData['start'] ?? 0;
$length = $reqData['length'] ?? 5; $length = $reqData['length'] ?? 5;
$requestedOrder = $reqData['order']['0']['column'] ?? 0;
$requestedOrder2 = $reqData['order']['1']['column'] ?? $requestedOrder; $requestedOrder = $reqData['order'] ?? [];
$requestedOrder3 = $reqData['order']['2']['column'] ?? $requestedOrder;
$requestedOrder4 = $reqData['order']['3']['column'] ?? $requestedOrder; $searchValues = get_filter_datatables_columns($reqData);
$requestedOrder5 = $reqData['order']['4']['column'] ?? $requestedOrder;
$order = ClientePreciosModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 0];
$order2 = ClientePreciosModel::SORTABLE[$requestedOrder2 >= 0 ? $requestedOrder2 : $requestedOrder];
$order3 = ClientePreciosModel::SORTABLE[$requestedOrder3 >= 0 ? $requestedOrder3 : $requestedOrder];
$order4 = ClientePreciosModel::SORTABLE[$requestedOrder4 >= 0 ? $requestedOrder4 : $requestedOrder];
$order5 = ClientePreciosModel::SORTABLE[$requestedOrder4 >= 0 ? $requestedOrder5 : $requestedOrder];
$dir = $reqData['order']['0']['dir'] ?? 'asc';
$dir2 = $reqData['order']['1']['dir'] ?? $dir;
$dir3 = $reqData['order']['2']['dir'] ?? $dir;
$dir4= $reqData['order']['3']['dir'] ?? $dir;
$dir5= $reqData['order']['4']['dir'] ?? $dir;
$cliente_id = $reqData['cliente_id'] ?? 0; $cliente_id = $reqData['cliente_id'] ?? 0;
$resourceData = $this->model->getResource($cliente_id) $resourceData = $this->model->getResource($searchValues, $cliente_id);
->orderBy($order, $dir)->orderBy($order2, $dir2)->orderBy($order3, $dir3)->orderBy($order4, $dir4)->orderBy($order5, $dir5) foreach ($requestedOrder as $order) {
->limit($length, $start)->get()->getResultObject(); $column = $order['column'] ?? 0;
$dir = $order['dir'] ?? 'asc';
$orderColumn = ClientePreciosModel::SORTABLE[$column] ?? null;
if ($orderColumn) {
$resourceData->orderBy($orderColumn, $dir);
}
}
$resourceData = $resourceData->limit($length, $start)->get()->getResultObject();
return $this->respond(Collection::datatable( return $this->respond(Collection::datatable(
$resourceData, $resourceData,
$this->model->getResource($cliente_id)->countAllResults(), $this->model->getResource($searchValues, $cliente_id)->countAllResults(),
$this->model->getResource($cliente_id)->countAllResults() $this->model->getResource($searchValues, $cliente_id)->countAllResults()
)); ));
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
} }
} }
public function datatable_editor() { public function datatable_editor()
{
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
include(APPPATH . "ThirdParty/DatatablesEditor/DataTables.php"); include(APPPATH . "ThirdParty/DatatablesEditor/DataTables.php");
// Build our Editor instance and process the data coming from _POST // Build our Editor instance and process the data coming from _POST
$response = Editor::inst( $db, 'cliente_precios' ) $response = Editor::inst($db, 'cliente_precios')
->fields( ->fields(
Field::inst( 'plantilla_id' ), Field::inst('plantilla_id'),
Field::inst( 'cliente_id' ), Field::inst('cliente_id'),
Field::inst( 'tipo' ), Field::inst('tipo'),
Field::inst( 'tipo_maquina' ), Field::inst('tipo_maquina'),
Field::inst( 'tipo_impresion' ), Field::inst('tipo_impresion'),
Field::inst( 'user_updated_id' ), Field::inst('user_updated_id'),
Field::inst( 'updated_at' ), Field::inst('updated_at'),
Field::inst( 'is_deleted' ), Field::inst('is_deleted'),
Field::inst( 'tiempo_min' ) Field::inst('tiempo_min')
->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') ->getFormatter('Format::toDecimalChar')->setFormatter('Format::fromDecimalChar')
->validator( 'Validate::notEmpty',array( ->validator(
'message' => lang('ClientePrecios.validation.required')) 'Validate::notEmpty',
array(
'message' => lang('ClientePrecios.validation.required')
)
) )
->validator('Validate::numeric', array( ->validator(
'Validate::numeric',
array(
"decimal" => ',', "decimal" => ',',
'message' => lang('ClientePrecios.validation.decimal')) 'message' => lang('ClientePrecios.validation.decimal')
)
), ),
Field::inst( 'tiempo_max' ) Field::inst('tiempo_max')
->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') ->getFormatter('Format::toDecimalChar')->setFormatter('Format::fromDecimalChar')
->validator( 'Validate::notEmpty',array( ->validator(
'message' => lang('ClientePrecios.validation.required')) 'Validate::notEmpty',
array(
'message' => lang('ClientePrecios.validation.required')
)
) )
->validator('Validate::numeric', array( ->validator(
"decimal" => ',', 'Validate::numeric',
'message' => lang('ClientePrecios.validation.decimal')) array(
),
Field::inst( 'precio_hora' )
->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar')
->validator( 'Validate::notEmpty',array(
'message' => lang('ClientePrecios.validation.required'))
)
->validator('Validate::numeric', array(
"decimal" => ',',
'message' => lang('ClientePrecios.validation.decimal'))
),
Field::inst( 'margen' )
->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar')
->validator( 'Validate::notEmpty',array(
'message' => lang('ClientePrecios.validation.required'))
)
->validator('Validate::numeric', array(
"decimal" => ',', "decimal" => ',',
'message' => lang('ClientePrecios.validation.decimal')) 'message' => lang('ClientePrecios.validation.decimal')
)
),
Field::inst('precio_hora')
->getFormatter('Format::toDecimalChar')->setFormatter('Format::fromDecimalChar')
->validator(
'Validate::notEmpty',
array(
'message' => lang('ClientePrecios.validation.required')
)
)
->validator(
'Validate::numeric',
array(
"decimal" => ',',
'message' => lang('ClientePrecios.validation.decimal')
)
),
Field::inst('margen')
->getFormatter('Format::toDecimalChar')->setFormatter('Format::fromDecimalChar')
->validator(
'Validate::notEmpty',
array(
'message' => lang('ClientePrecios.validation.required')
)
)
->validator(
'Validate::numeric',
array(
"decimal" => ',',
'message' => lang('ClientePrecios.validation.decimal')
)
), ),
) )
@ -203,21 +222,19 @@ class ClientePrecios extends \App\Controllers\BaseResourceController
} }
}) })
->on('preCreate', function ($editor, &$values) { ->on('preCreate', function ($editor, &$values) {
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$editor $editor
->field('user_updated_id') ->field('user_updated_id')
->setValue($session->id_user); ->setValue(auth()->user()->id);
$editor $editor
->field('updated_at') ->field('updated_at')
->setValue($datetime->format('Y-m-d H:i:s')); ->setValue($datetime->format('Y-m-d H:i:s'));
}) })
->on('preEdit', function ($editor, &$values) { ->on('preEdit', function ($editor, &$values) {
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$editor $editor
->field('user_updated_id') ->field('user_updated_id')
->setValue($session->id_user); ->setValue(auth()->user()->id);
$editor $editor
->field('updated_at') ->field('updated_at')
->setValue($datetime->format('Y-m-d H:i:s')); ->setValue($datetime->format('Y-m-d H:i:s'));
@ -238,4 +255,16 @@ class ClientePrecios extends \App\Controllers\BaseResourceController
} }
} }
public function getCurrentPlantilla()
{
if ($this->request->isAJAX()) {
$cliente_id = $this->request->getGet('cliente_id');
$plantilla = $this->model->getPlantilla($cliente_id);
return $this->respond($plantilla);
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
} }

View File

@ -1,4 +1,5 @@
<?php namespace App\Controllers\Clientes; <?php
namespace App\Controllers\Clientes;
use App\Controllers\BaseResourceController; use App\Controllers\BaseResourceController;
@ -70,51 +71,48 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
// plantilla desde la lista // plantilla desde la lista
public function update($requestedId = null) public function update($requestedId = null)
{ {
if ($this->request->getPost()) : if ($requestedId == null):
return;
if ($requestedId == null) : endif;
return; $model = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel');
endif; $model->delete_values($requestedId);
$model = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel');
$model->delete_values($requestedId); $newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$newTokenHash = csrf_hash(); $data = [
$csrfTokenName = csrf_token(); $csrfTokenName => $newTokenHash
$data = [ ];
$csrfTokenName => $newTokenHash
]; return $this->respond($data);
return $this->respond($data);
endif; // ($requestMethod === 'post')
} }
public function add() public function add()
{ {
if ($this->request->getPost()) :
if ($this->request->getPost()):
$nullIfEmpty = true; // !(phpversion() >= '8.1'); $nullIfEmpty = true; // !(phpversion() >= '8.1');
$postData = $this->request->getPost(); $postData = $this->request->getPost();
$cliente_id = $postData['cliente_id'] ?? -1; $cliente_id = $postData['cliente_id'] ?? -1;
$from_client_data = $postData['from_client_data'] ?? 0;
$sanitizedData = $this->sanitized($postData, $nullIfEmpty); $sanitizedData = $this->sanitized($postData, $nullIfEmpty);
// JJO // JJO
$sanitizedData['user_created_id'] = auth()->user()->id; $sanitizedData['user_created_id'] = auth()->user()->id;
$noException = true; $noException = true;
if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : if ($successfulResult = $this->canValidate()): // if ($successfulResult = $this->validate($this->formValidationRules) ) :
if ($this->canValidate()) : if ($this->canValidate()):
try { try {
$successfulResult = $this->model->skipValidation(true)->save($sanitizedData); $successfulResult = $this->model->skipValidation(true)->save($sanitizedData);
} catch (\Exception $e) { } catch (\Exception $e) {
@ -126,24 +124,27 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
$this->session->setFlashdata('formErrors', $this->model->errors()); $this->session->setFlashdata('formErrors', $this->model->errors());
endif; endif;
$thenRedirect = true; // Change this to false if you want your user to stay on the form after submission if ($from_client_data == 1) {
$thenRedirect = false;
} else {
$thenRedirect = true; // Change this to false if you want your user to stay on the form after submission
}
endif; endif;
if ($noException && $successfulResult) : if ($noException && $successfulResult):
$id = $this->model->db->insertID(); $id = $this->model->db->insertID();
$message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.'; $message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.';
if($cliente_id != -1){ if ($cliente_id != -1) {
$modelLineas = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel'); $modelLineas = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel');
$modelLineas->copy_from_cliente($cliente_id, $id); $modelLineas->copy_from_cliente($cliente_id, $id);
$modelClientePrecios = model('App\Models\Clientes\ClientePreciosModel'); $modelClientePrecios = model('App\Models\Clientes\ClientePreciosModel');
$modelClientePrecios->set_plantilla_id($cliente_id, $id); $modelClientePrecios->set_plantilla_id($cliente_id, $id);
return ; return $this->respond(['status' => 'success', 'id' => $id]);
} } else {
else{ if ($thenRedirect):
if ($thenRedirect) : if (!empty($this->indexRoute)):
if (!empty($this->indexRoute)) :
//return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); //return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message);
return redirect()->to(site_url('/clientes/clienteplantillaprecios/edit/' . $id))->with('message', $message); return redirect()->to(site_url('/clientes/clienteplantillaprecios/edit/' . $id))->with('message', $message);
else: else:
@ -171,35 +172,35 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
{ {
if ($requestedId == null) : if ($requestedId == null):
return $this->redirect2listView(); return $this->redirect2listView();
endif; endif;
$id = filter_var($requestedId, FILTER_SANITIZE_URL); $id = filter_var($requestedId, FILTER_SANITIZE_URL);
$clientePlantillaPreciosEntity = $this->model->find($id); $clientePlantillaPreciosEntity = $this->model->find($id);
if ($clientePlantillaPreciosEntity == false) : if ($clientePlantillaPreciosEntity == false):
$message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Clientes.cliente')), $id]); $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Clientes.cliente')), $id]);
return $this->redirect2listView('sweet-error', $message); return $this->redirect2listView('sweet-error', $message);
endif; endif;
if ($this->request->getPost()) :
if ($this->request->getPost()):
$nullIfEmpty = true; // !(phpversion() >= '8.1'); $nullIfEmpty = true; // !(phpversion() >= '8.1');
$postData = $this->request->getPost(); $postData = $this->request->getPost();
$sanitizedData = $this->sanitized($postData, $nullIfEmpty); $sanitizedData = $this->sanitized($postData, $nullIfEmpty);
// JJO // JJO
$sanitizedData['user_updated_id'] = auth()->user()->id; $sanitizedData['user_updated_id'] = auth()->user()->id;
$noException = true; $noException = true;
if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : if ($successfulResult = $this->canValidate()): // if ($successfulResult = $this->validate($this->formValidationRules) ) :
if ($this->canValidate()) : if ($this->canValidate()):
try { try {
$successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData); $successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData);
} catch (\Exception $e) { } catch (\Exception $e) {
@ -216,12 +217,12 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
$thenRedirect = false; $thenRedirect = false;
endif; endif;
if ($noException && $successfulResult) : if ($noException && $successfulResult):
$id = $clientePlantillaPreciosEntity->id ?? $id; $id = $clientePlantillaPreciosEntity->id ?? $id;
$message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.'; $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.';
if ($thenRedirect) : if ($thenRedirect):
if (!empty($this->indexRoute)) : if (!empty($this->indexRoute)):
return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message);
else: else:
return $this->redirect2listView('sweet-success', $message); return $this->redirect2listView('sweet-success', $message);
@ -236,7 +237,7 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
//var_dump($clientePlantillaPreciosEntity); dd(); //var_dump($clientePlantillaPreciosEntity); dd();
$this->viewData['clienteplantillapreciosEntity'] = $clientePlantillaPreciosEntity; $this->viewData['clienteplantillapreciosEntity'] = $clientePlantillaPreciosEntity;
$this->viewData['formAction'] = route_to('updateClienteplantillaprecios', $id); $this->viewData['formAction'] = route_to('updateClienteplantillaprecios', $id);
$this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('Clientes.moduleTitle') . ' ' . lang('Basic.global.edit3'); $this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('Clientes.moduleTitle') . ' ' . lang('Basic.global.edit3');
@ -246,6 +247,23 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
} // end function edit(...) } // end function edit(...)
public function updatePlantillaEnCliente(){
if ($this->request->isAJAX()) {
$reqData = $this->request->getPost();
$plantilla_id = $reqData['plantilla_id'] ?? -1;
$model = model('App\Models\Clientes\ClientePreciosModel');
$model->update_plantilla_id($plantilla_id);
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
public function datatable() public function datatable()
{ {
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
@ -257,16 +275,16 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
} }
$start = $reqData['start'] ?? 0; $start = $reqData['start'] ?? 0;
$length = $reqData['length'] ?? 5; $length = $reqData['length'] ?? 5;
$search = $reqData['search']['value']; $searchValues = get_filter_datatables_columns($reqData);
$requestedOrder = $reqData['order']['0']['column'] ?? 1; $requestedOrder = $reqData['order']['0']['column'] ?? 1;
$order = ClientePlantillaPreciosModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 0]; $order = ClientePlantillaPreciosModel::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($searchValues)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject();
return $this->respond(Collection::datatable( return $this->respond(Collection::datatable(
$resourceData, $resourceData,
$this->model->getResource()->countAllResults(), $this->model->getResource()->countAllResults(),
$this->model->getResource($search)->countAllResults() $this->model->getResource($searchValues)->countAllResults()
)); ));
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
@ -275,34 +293,32 @@ class Clienteplantillaprecios extends \App\Controllers\BaseResourceController
public function menuItems() public function menuItems()
{ {
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$searchStr = goSanitize($this->request->getPost('searchTerm'))[0]; $query = $this->model->builder()->select(
$reqId = goSanitize($this->request->getPost('id'))[0]; [
$reqText = goSanitize($this->request->getPost('text'))[0]; "id",
$onlyActiveOnes = false; "nombre as name"
$columns2select = [$reqId ?? 'id', $reqText ?? 'nombre']; ]
$onlyActiveOnes = false; )->where("deleted_at", null);
try{ if ($this->request->getGet("q")) {
$menu = $this->model->getSelect2MenuItems($columns2select, $columns2select[1], $onlyActiveOnes, $searchStr, true); $query->groupStart()
$nonItem = new \stdClass; ->orLike("cliente_plantilla_precios.nombre", $this->request->getGet("q"))
$nonItem->id = ''; ->groupEnd();
$nonItem->text = '- ' . lang('Basic.global.None') . ' -';
array_unshift($menu, $nonItem);
}
catch(Exception $e){
$menu = [];
} }
$newTokenHash = csrf_hash(); $items = $query->get()->getResultObject();
$csrfTokenName = csrf_token(); // add a custom item at the beginning
$data = [ $customItem = new \stdClass;
'menu' => $menu, $customItem->id = 0;
$csrfTokenName => $newTokenHash $customItem->name = "Personalizado";
]; array_unshift($items, $customItem);
return $this->respond($data);
return $this->response->setJSON($items);
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
} }
} }
} }

View File

@ -93,31 +93,27 @@ class Clienteplantillaprecioslineas extends \App\Controllers\BaseResourceControl
} }
$start = $reqData['start'] ?? 0; $start = $reqData['start'] ?? 0;
$length = $reqData['length'] ?? 5; $length = $reqData['length'] ?? 5;
$requestedOrder = $reqData['order']['0']['column'] ?? 0;
$requestedOrder2 = $reqData['order']['1']['column'] ?? $requestedOrder; $requestedOrder = $reqData['order'] ?? [];
$requestedOrder3 = $reqData['order']['2']['column'] ?? $requestedOrder; $searchValues = get_filter_datatables_columns($reqData);
$requestedOrder4 = $reqData['order']['3']['column'] ?? $requestedOrder;
$requestedOrder5 = $reqData['order']['4']['column'] ?? $requestedOrder;
$order = ClientePlantillaPreciosLineasModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 0];
$order2 = ClientePlantillaPreciosLineasModel::SORTABLE[$requestedOrder2 >= 0 ? $requestedOrder2 : $requestedOrder];
$order3 = ClientePlantillaPreciosLineasModel::SORTABLE[$requestedOrder3 >= 0 ? $requestedOrder3 : $requestedOrder];
$order4 = ClientePlantillaPreciosLineasModel::SORTABLE[$requestedOrder4 >= 0 ? $requestedOrder4 : $requestedOrder];
$order5 = ClientePlantillaPreciosLineasModel::SORTABLE[$requestedOrder4 >= 0 ? $requestedOrder5 : $requestedOrder];
$dir = $reqData['order']['0']['dir'] ?? 'asc';
$dir2 = $reqData['order']['1']['dir'] ?? $dir;
$dir3 = $reqData['order']['2']['dir'] ?? $dir;
$dir4= $reqData['order']['3']['dir'] ?? $dir;
$dir5= $reqData['order']['4']['dir'] ?? $dir;
$plantilla_id = $reqData['plantilla_id'] ?? 0; $plantilla_id = $reqData['plantilla_id'] ?? 0;
$resourceData = $this->model->getResource($plantilla_id) $resourceData = $this->model->getResource($searchValues, $plantilla_id);
->orderBy($order, $dir)->orderBy($order2, $dir2)->orderBy($order3, $dir3)->orderBy($order4, $dir4)->orderBy($order5, $dir5) foreach ($requestedOrder as $order) {
->limit($length, $start)->get()->getResultObject(); $column = $order['column'] ?? 0;
$dir = $order['dir'] ?? 'asc';
$orderColumn = ClientePlantillaPreciosLineasModel::SORTABLE[$column] ?? null;
if ($orderColumn) {
$resourceData->orderBy($orderColumn, $dir);
}
}
$resourceData = $resourceData->limit($length, $start)->get()->getResultObject();
return $this->respond(Collection::datatable( return $this->respond(Collection::datatable(
$resourceData, $resourceData,
$this->model->getResource($plantilla_id)->countAllResults(), $this->model->getResource([], $plantilla_id)->countAllResults(),
$this->model->getResource($plantilla_id)->countAllResults() $this->model->getResource($searchValues, $plantilla_id)->countAllResults()
)); ));
} else { } else {
return $this->failUnauthorized('Invalid request', 403); return $this->failUnauthorized('Invalid request', 403);
@ -138,6 +134,8 @@ class Clienteplantillaprecioslineas extends \App\Controllers\BaseResourceControl
Field::inst( 'tipo_maquina' ), Field::inst( 'tipo_maquina' ),
Field::inst( 'tipo_impresion' ), Field::inst( 'tipo_impresion' ),
Field::inst( 'user_updated_id' ), Field::inst( 'user_updated_id' ),
Field::inst( 'deleted_at' ),
Field::inst( 'is_deleted' ),
Field::inst( 'updated_at' ), Field::inst( 'updated_at' ),
Field::inst( 'tiempo_min' ) Field::inst( 'tiempo_min' )
->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar')
@ -201,21 +199,20 @@ class Clienteplantillaprecioslineas extends \App\Controllers\BaseResourceControl
} }
}) })
->on('preCreate', function ($editor, &$values) { ->on('preCreate', function ($editor, &$values) {
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$editor $editor
->field('user_updated_id') ->field('user_updated_id')
->setValue($session->id_user); ->setValue(auth()->user()->id);
$editor $editor
->field('updated_at') ->field('updated_at')
->setValue($datetime->format('Y-m-d H:i:s')); ->setValue($datetime->format('Y-m-d H:i:s'));
}) })
->on('preEdit', function ($editor, &$values) { ->on('preEdit', function ($editor, &$values) {
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$editor $editor
->field('user_updated_id') ->field('user_updated_id')
->setValue($session->id_user); ->setValue(auth()->user()->id);
$editor $editor
->field('updated_at') ->field('updated_at')
->setValue($datetime->format('Y-m-d H:i:s')); ->setValue($datetime->format('Y-m-d H:i:s'));

View File

@ -298,13 +298,24 @@ class Papelesgenericos extends \App\Controllers\BaseResourceController
{ {
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$tirada = goSanitize($this->request->getGet('tirada'))[0] ?? null;
$POD = null;
if($tirada != null){
$POD_value = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD();
if(intval($tirada) <= intval($POD_value)){
$POD = true;
}
else{
$POD = false;
}
}
$tipo = goSanitize($this->request->getGet('tipo'))[0]; $tipo = goSanitize($this->request->getGet('tipo'))[0];
$selected_papel = goSanitize($this->request->getGet('papel'))[0] ?? null; $selected_papel = goSanitize($this->request->getGet('papel'))[0] ?? null;
$cubierta = goSanitize($this->request->getGet('cubierta'))[0] ?? 0; $cubierta = goSanitize($this->request->getGet('cubierta'))[0] ?? 0;
$tapa_dura = goSanitize($this->request->getGet('tapa_dura'))[0] ?? null; $tapa_dura = goSanitize($this->request->getGet('tapa_dura'))[0] ?? null;
$menu = $this->model->getPapelCliente($tipo, $cubierta, $selected_papel, $tapa_dura, false); $menu = $this->model->getPapelCliente($tipo, $cubierta, $selected_papel, $tapa_dura, false, $POD);
$menu2 = $this->model->getPapelCliente($tipo, $cubierta, $selected_papel, $tapa_dura, true); $menu2 = $this->model->getPapelCliente($tipo, $cubierta, $selected_papel, $tapa_dura, true, $POD);
$newTokenHash = csrf_hash(); $newTokenHash = csrf_hash();
$csrfTokenName = csrf_token(); $csrfTokenName = csrf_token();
@ -325,10 +336,21 @@ class Papelesgenericos extends \App\Controllers\BaseResourceController
if ($this->request->isAJAX()) { if ($this->request->isAJAX()) {
$tirada = goSanitize($this->request->getGet('tirada'))[0] ?? null;
$POD = null;
if($tirada != null){
$POD_value = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD();
if(intval($tirada) <= intval($POD_value)){
$POD = true;
}
else{
$POD = false;
}
}
$tipo = goSanitize($this->request->getGet('tipo'))[0]; $tipo = goSanitize($this->request->getGet('tipo'))[0];
$cubierta = goSanitize($this->request->getGet('cubierta'))[0] ?? 0; $cubierta = goSanitize($this->request->getGet('cubierta'))[0] ?? 0;
$items = $this->model->getPapelCliente($tipo, $cubierta, null, true); $items = $this->model->getPapelCliente($tipo, $cubierta, null, true, $POD);
$items = array_map(function ($item) { $items = array_map(function ($item) {
return [ return [
'id' => $item->id, 'id' => $item->id,

View File

@ -265,7 +265,7 @@ class Users extends \App\Controllers\GoBaseController
foreach ($chatDepartments as $chatDepartment) { foreach ($chatDepartments as $chatDepartment) {
$this->chat_department_user_model->insert([ $this->chat_department_user_model->insert([
"user_id" => $id, "user_id" => $id,
"chat_department_id" => $this->chat_department_model->where("name", $chatDepartment)->first()["id"] "chat_department_id" => $this->chat_department_model->where("name", $chatDepartment)->first()->id
]); ]);
} }
$id = $user->id ?? $id; $id = $user->id ?? $id;

View File

@ -21,9 +21,22 @@ class Language extends BaseController
public function getTranslation() public function getTranslation()
{ {
$translationFile = $this->request->getPost('translationFile'); $translationFile = $this->request->getPost('translationFile');
$locale = $this->request->getPost('locale'); $data = [];
$path = "Language/{$locale}/$translationFile.php"; if(is_array($translationFile)){
$lang = require APPPATH.$path; foreach($translationFile as $file){
return json_encode($lang); $locale = $this->request->getPost('locale');
$path = "Language/{$locale}/$file.php";
$lang = require APPPATH.$path;
$data[$file] = $lang;
}
return json_encode($data);
}
else{
$locale = $this->request->getPost('locale');
$path = "Language/{$locale}/$translationFile.php";
$lang = require APPPATH.$path;
return json_encode($lang);
}
} }
} }

View File

@ -522,6 +522,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
'a_favor_fibra' => 1, 'a_favor_fibra' => 1,
); );
// Para POD siempre es HQ
if ($tirada[0] <= $POD) {
$isHq = true;
}
$input_data = array( $input_data = array(
'uso' => 'interior', 'uso' => 'interior',
'tipo_impresion_id' => $tipo_impresion_id, 'tipo_impresion_id' => $tipo_impresion_id,
@ -1509,6 +1514,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$info['merma'] = $datosPedido->merma; $info['merma'] = $datosPedido->merma;
} }
// Para POD siempre es HQ
if ($tirada[$t] <= $POD) {
$isHq = true;
}
$input_data = array( $input_data = array(
'uso' => 'interior', 'uso' => 'interior',
'tipo_impresion_id' => $tipo_impresion_id, 'tipo_impresion_id' => $tipo_impresion_id,

View File

@ -28,5 +28,6 @@ return [
"add_notification" => "Notificación", "add_notification" => "Notificación",
"check_as_unviewed" => "Marcar como no leídos", "check_as_unviewed" => "Marcar como no leídos",
"add_notification_message" => "Envía a los usuarios añadidos una notificación con los mensajes presentes en el chat.", "add_notification_message" => "Envía a los usuarios añadidos una notificación con los mensajes presentes en el chat.",
"chat_title_presupuesto" => 'Presupuesto[{title,string,0}][{id}]' "chat_title_presupuesto" => 'Presupuesto[{title,string,0}][{id}]',
"no_messages_notification" => 'No hay mensajes que revisar por el momento'
]; ];

View File

@ -7,14 +7,16 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
protected $table = "cliente_plantilla_precios_lineas"; protected $table = "cliente_plantilla_precios_lineas";
const SORTABLE = [ const SORTABLE = [
0 => "t1.tipo", 0 => "t1.id",
1 => "t1.tipo_maquina", 1 => "t1.tipo",
2 => "t1.tipo_impresion", 2 => "t1.tipo_maquina",
3 => "t1.tiempo_min", 3 => "t1.tipo_impresion",
4 => "t1.tiempo_max", 4 => "t1.tiempo_min",
5 => "t1.precio_hora", 5 => "t1.tiempo_max",
6 => "t1.margen", 6 => "t1.precio_hora",
7 => "t1.margen",
8 => "CONCAT(t2.first_name, ' ', t2.last_name)",
9 => "t1.updated_at",
]; ];
/** /**
@ -113,10 +115,20 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
function delete_values($plantilla_id = 0){ function delete_values($plantilla_id = 0){
$datetime = (new \CodeIgniter\I18n\Time("now"));
$date_value = $datetime->format('Y-m-d H:i:s');
$this->db $this->db
->table($this->table . " t1") ->table($this->table . " t1")
->where('t1.plantilla_id', $plantilla_id) ->where('t1.plantilla_id', $plantilla_id)
->set('is_deleted', 1) ->set('is_deleted', 1)
->set('deleted_at', $date_value)
->update();
$this->db
->table('cliente_precios' . " t1")
->where('t1.plantilla_id', $plantilla_id)
->set('plantilla_id', null)
->update(); ->update();
} }
@ -127,14 +139,15 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
* *
* @return \CodeIgniter\Database\BaseBuilder * @return \CodeIgniter\Database\BaseBuilder
*/ */
public function getResource($plantilla_id = -1) public function getResource($search = [], $plantilla_id = -1)
{ {
$builder = $this->db $builder = $this->db
->table($this->table . " t1") ->table($this->table . " t1")
->select( ->select(
"t1.id as id, t1.tipo AS tipo, t1.tipo_maquina AS tipo_maquina, t1.tipo_impresion AS tipo_impresion, "t1.id as id, t1.tipo AS tipo, t1.tipo_maquina AS tipo_maquina, t1.tipo_impresion AS tipo_impresion,
t1.tiempo_min AS tiempo_min, t1.tiempo_max AS tiempo_max, t1.precio_hora AS precio_hora, t1.margen AS margen, t1.tiempo_min AS tiempo_min, t1.tiempo_max AS tiempo_max, t1.precio_hora AS precio_hora, t1.margen AS margen,
t1.user_updated_id AS user_updated_id, t1.updated_at AS updated_at, CONCAT(t2.first_name, ' ', t2.last_name) AS user_updated" t1.user_updated_id AS user_updated_id, t1.updated_at AS updated_at, CONCAT(t2.first_name, ' ', t2.last_name) AS user_updated,
t1.id AS DT_RowId"
); );
$builder->join("users t2", "t1.user_updated_id = t2.id", "left"); $builder->join("users t2", "t1.user_updated_id = t2.id", "left");
@ -142,8 +155,19 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
$builder->where('t1.is_deleted', 0); $builder->where('t1.is_deleted', 0);
$builder->where('t1.plantilla_id', $plantilla_id); $builder->where('t1.plantilla_id', $plantilla_id);
if (empty($search))
return $builder; return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
if ($col_search[1] > 0 && $col_search[0] < 4)
$builder->where(self::SORTABLE[$col_search[0]], $col_search[2]);
else
$builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
}
$builder->groupEnd();
return $builder;
}
} }
public function checkIntervals($data = [], $id_linea = null, $plantilla_id = null){ public function checkIntervals($data = [], $id_linea = null, $plantilla_id = null){
@ -183,14 +207,13 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
function copy_from_cliente($cliente_id = 0, $plantilla_id = 0){ function copy_from_cliente($cliente_id = 0, $plantilla_id = 0){
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$date_value = $datetime->format('Y-m-d H:i:s'); $date_value = $datetime->format('Y-m-d H:i:s');
// Se cargan los valores en la plantilla // Se cargan los valores en la plantilla
$clientePreciosModel = model('App\Models\Clientes\ClientePreciosModel'); $clientePreciosModel = model('App\Models\Clientes\ClientePreciosModel');
$values = $clientePreciosModel->getResource($cliente_id)->get()->getResultObject(); $values = $clientePreciosModel->getResource([], $cliente_id)->get()->getResultObject();
foreach ($values as $value) { foreach ($values as $value) {
$this->db $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -201,7 +224,7 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel
->set('tiempo_min', $value->tiempo_min) ->set('tiempo_min', $value->tiempo_min)
->set('tiempo_max', $value->tiempo_max) ->set('tiempo_max', $value->tiempo_max)
->set('margen', $value->margen) ->set('margen', $value->margen)
->set('user_updated_id', $session->id_user) ->set('user_updated_id', auth()->user()->id)
->set('updated_at', $date_value) ->set('updated_at', $date_value)
->insert(); ->insert();
} }

View File

@ -7,7 +7,8 @@ class ClientePlantillaPreciosModel extends \App\Models\BaseModel
protected $table = "cliente_plantilla_precios"; protected $table = "cliente_plantilla_precios";
const SORTABLE = [ const SORTABLE = [
0 => "t1.nombre", 0 => "t1.id",
1 => "t1.nombre",
]; ];
/** /**
@ -48,11 +49,11 @@ class ClientePlantillaPreciosModel extends \App\Models\BaseModel
/** /**
* Get resource data. * Get resource data.
* *
* @param string $search * @param array $search
* *
* @return \CodeIgniter\Database\BaseBuilder * @return \CodeIgniter\Database\BaseBuilder
*/ */
public function getResource(string $search = "", $cliente_id = -1) public function getResource($search = [])
{ {
$builder = $this->db $builder = $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -61,14 +62,17 @@ class ClientePlantillaPreciosModel extends \App\Models\BaseModel
); );
$builder->where('t1.is_deleted', 0); $builder->where('t1.is_deleted', 0);
return empty($search) if (empty($search))
? $builder return $builder;
: $builder else {
->groupStart() $builder->groupStart();
->like("t1.nombre", $search) foreach ($search as $col_search) {
->groupEnd(); $builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
}
$builder->groupEnd();
return $builder;
}
} }
} }

View File

@ -14,14 +14,14 @@ class ClientePreciosModel extends \App\Models\BaseModel
protected $useAutoIncrement = true; protected $useAutoIncrement = true;
const SORTABLE = [ const SORTABLE = [
0 => "t1.tipo", 0 => "t1.id",
1 => "t1.tipo_maquina", 1 => "t1.tipo",
2 => "t1.tipo_impresion", 2 => "t1.tipo_maquina",
3 => "t1.tiempo_min", 3 => "t1.tipo_impresion",
4 => "t1.tiempo_max", 4 => "t1.tiempo_min",
5 => "t1.precio_hora", 5 => "t1.tiempo_max",
6 => "t1.margen", 6 => "t1.precio_hora",
7 => "t1.margen",
]; ];
protected $allowedFields = [ protected $allowedFields = [
@ -153,7 +153,7 @@ class ClientePreciosModel extends \App\Models\BaseModel
// Se cargan los valores de la plantilla // Se cargan los valores de la plantilla
$plantillaModel = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel'); $plantillaModel = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel');
$values = $plantillaModel->getResource($plantilla_id)->get()->getResultObject(); $values = $plantillaModel->getResource([],$plantilla_id)->get()->getResultObject();
foreach ($values as $value) { foreach ($values as $value) {
$this->db $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -178,7 +178,6 @@ class ClientePreciosModel extends \App\Models\BaseModel
function update_from_plantilla($plantilla_id = 0){ function update_from_plantilla($plantilla_id = 0){
$session = session();
$datetime = (new \CodeIgniter\I18n\Time("now")); $datetime = (new \CodeIgniter\I18n\Time("now"));
$date_value = $datetime->format('Y-m-d H:i:s'); $date_value = $datetime->format('Y-m-d H:i:s');
@ -187,6 +186,7 @@ class ClientePreciosModel extends \App\Models\BaseModel
->table($this->table . " t1") ->table($this->table . " t1")
->select("t1.cliente_id AS id") ->select("t1.cliente_id AS id")
->where('t1.plantilla_id', $plantilla_id) ->where('t1.plantilla_id', $plantilla_id)
->where('t1.is_deleted', 0)
->distinct() ->distinct()
->get()->getResultObject(); ->get()->getResultObject();
@ -200,7 +200,7 @@ class ClientePreciosModel extends \App\Models\BaseModel
// Se cargan los valores de la plantilla // Se cargan los valores de la plantilla
$plantillaModel = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel'); $plantillaModel = model('App\Models\Clientes\ClientePlantillaPreciosLineasModel');
$values = $plantillaModel->getResource($plantilla_id)->get()->getResultObject(); $values = $plantillaModel->getResource([], $plantilla_id)->get()->getResultObject();
foreach ($values as $value) { foreach ($values as $value) {
$this->db $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -215,7 +215,7 @@ class ClientePreciosModel extends \App\Models\BaseModel
->set('margen', $value->margen) ->set('margen', $value->margen)
->set('user_updated_id', $value->user_updated_id) ->set('user_updated_id', $value->user_updated_id)
->set('updated_at', $value->updated_at) ->set('updated_at', $value->updated_at)
->set('user_created_id', $session->id_user) ->set('user_created_id', auth()->user()->id)
->set('created_at', $date_value) ->set('created_at', $date_value)
->insert(); ->insert();
} }
@ -256,7 +256,7 @@ class ClientePreciosModel extends \App\Models\BaseModel
* *
* @return \CodeIgniter\Database\BaseBuilder * @return \CodeIgniter\Database\BaseBuilder
*/ */
public function getResource($cliente_id = -1) public function getResource($search = [], $cliente_id = -1)
{ {
$builder = $this->db $builder = $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -271,11 +271,43 @@ class ClientePreciosModel extends \App\Models\BaseModel
$builder->where('t1.is_deleted', 0); $builder->where('t1.is_deleted', 0);
$builder->where('t1.cliente_id', $cliente_id); $builder->where('t1.cliente_id', $cliente_id);
return $builder; if (empty($search))
return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
if ($col_search[0] > 0 && $col_search[0] < 4)
$builder->where(self::SORTABLE[$col_search[0]], $col_search[2]);
else
$builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
}
$builder->groupEnd();
return $builder;
}
} }
public function getPlantilla($cliente_id = -1){
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.plantilla_id AS id, t2.nombre AS nombre"
);
$builder->where('t1.is_deleted', 0);
$builder->where('t1.cliente_id', $cliente_id);
$builder->join("cliente_plantilla_precios t2", "t1.plantilla_id = t2.id", "left");
$builder->limit(1);
$values = $builder->get()->getResultArray();
if(count($values)>0){
return $values[0];
}
return [];
}
public function checkIntervals($data = [], $id_linea = null, $cliente_id = null){ public function checkIntervals($data = [], $id_linea = null, $cliente_id = null){

View File

@ -313,7 +313,7 @@ class PapelGenericoModel extends \App\Models\BaseModel
} }
public function getPapelCliente($tipo, $is_cubierta = false, $selected_papel_id = null, $tapa_dura = null, $papel_especial = false) public function getPapelCliente($tipo, $is_cubierta = false, $selected_papel_id = null, $tapa_dura = null, $papel_especial = false, $POD = null)
{ {
/* /*
1.-> Tipo impresion 1.-> Tipo impresion
@ -322,6 +322,13 @@ class PapelGenericoModel extends \App\Models\BaseModel
4.-> papeles genericos que aparecen en esos papeles impresion 4.-> papeles genericos que aparecen en esos papeles impresion
*/ */
if ($POD == true && ($tipo == 'color' || $tipo == 'negro')) {
if($tipo == 'color')
$tipo = 'colorhq';
else if($tipo == 'negro')
$tipo = 'negrohq';
}
if ($selected_papel_id != null) { if ($selected_papel_id != null) {
$builder = $this->db $builder = $this->db
->table($this->table . " t1") ->table($this->table . " t1")
@ -404,6 +411,14 @@ class PapelGenericoModel extends \App\Models\BaseModel
if ($tipo == 'colorhq' || $tipo == 'negrohq') { if ($tipo == 'colorhq' || $tipo == 'negrohq') {
$builder->where("t2.rotativa", 0); $builder->where("t2.rotativa", 0);
} }
else{
if($POD == false){
$builder->where("t2.rotativa", 1);
}
else if ($POD == true){
$builder->where("t2.rotativa", 0);
}
}
if ($selected_papel_id != null) if ($selected_papel_id != null)

View File

@ -523,6 +523,11 @@ class PresupuestoClienteService extends BaseService
$linea_rotativa = array_merge($linea_rotativa, $lineas); $linea_rotativa = array_merge($linea_rotativa, $lineas);
} }
} }
$linea_rotativa = array_filter($linea_rotativa, function($item) {
return count($item['fields']['num_formas']) > 1;
});
if (count($linea_rotativa) > 0) { if (count($linea_rotativa) > 0) {
usort( usort(

View File

@ -639,11 +639,11 @@ class PresupuestoService extends BaseService
$calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h1_temp); $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h1_temp);
// Si son mas de 2 formas // Si son mas de 2 formas
if (count($calles) > 0) if (count($calles) > 0)
$h1 = ($h1_temp * $anchoForCalculo + 2 * $calles[0]->externas + ($h1_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h1_temp : $h1_temp - 1; $h1 = ($h1_temp * $anchoForCalculo + 2 * $calles[0]->externas + ($h1_temp - 1) * $calles[0]->internas < (floatval($maquina->ancho))) ? $h1_temp : $h1_temp - 1;
else else
$h1 = $h1_temp; $h1 = $h1_temp;
$v1 = floor($maquina->alto_click / $altoForCalculo); $v1 = floor(floatval($maquina->alto_click) / $altoForCalculo);
$formas_h = $h1 * $v1; //p1 $formas_h = $h1 * $v1; //p1
} }
// verticales // verticales
@ -651,10 +651,10 @@ class PresupuestoService extends BaseService
$calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h2_temp); $calles = (new \App\Models\Configuracion\MaquinasCallesModel())->getCallesForMaquina($maquina->maquina_id, $h2_temp);
if (count($calles) > 0) if (count($calles) > 0)
$h2 = ($h2_temp * $altoForCalculo + 2 * $calles[0]->externas + ($h2_temp - 1) * $calles[0]->internas < ($maquina->ancho)) ? $h2_temp : $h2_temp - 1; $h2 = ($h2_temp * $altoForCalculo + 2 * $calles[0]->externas + ($h2_temp - 1) * $calles[0]->internas < (floatval($maquina->ancho))) ? $h2_temp : $h2_temp - 1;
else else
$h2 = $h2_temp; $h2 = $h2_temp;
$v2 = floor($maquina->alto_click / $anchoForCalculo); $v2 = floor(floatval($maquina->alto_click) / $anchoForCalculo);
$formas_v = $h2 * $v2; //p2 $formas_v = $h2 * $v2; //p2
} }
@ -1061,16 +1061,16 @@ class PresupuestoService extends BaseService
), ),
'cliente_id' => ($input_data['presupuesto'])->cliente_id, 'cliente_id' => ($input_data['presupuesto'])->cliente_id,
'datosTipolog' => [ 'datosTipolog' => [
(object) array( (object) array(
'negro' => $linea->rotativa_negro, 'negro' => $linea->rotativa_negro,
'cyan' => $linea->rotativa_cyan, 'cyan' => $linea->rotativa_cyan,
'magenta' => $linea->rotativa_magenta, 'magenta' => $linea->rotativa_magenta,
'amarillo' => $linea->rotativa_amarillo, 'amarillo' => $linea->rotativa_amarillo,
'cg' => $linea->rotativa_cg, 'cg' => $linea->rotativa_cg,
'gota_negro' => $linea->rotativa_gota_negro, 'gota_negro' => $linea->rotativa_gota_negro,
'gota_color' => $linea->rotativa_gota_color, 'gota_color' => $linea->rotativa_gota_color,
) )
] ]
]; ];
$comp_data = PresupuestoService::obtenerComparadorRotativa($datos); $comp_data = PresupuestoService::obtenerComparadorRotativa($datos);
@ -1816,7 +1816,7 @@ class PresupuestoService extends BaseService
} }
if ($uso == 'cubierta' || $uso == 'sobrecubierta') { if ($uso == 'cubierta' || $uso == 'sobrecubierta') {
$linea['fields']['dimension_desarrollo']['ancho'] = $datosPedido->anchoExteriores; $linea['fields']['dimension_desarrollo']['ancho'] = $datosPedido->anchoExteriores;
$linea['fields']['dimension_desarrollo']['alto'] = $datosPedido->altoExteriores; $linea['fields']['dimension_desarrollo']['alto'] = $datosPedido->altoExteriores;
} }

View File

@ -561,7 +561,6 @@
<?php if ($formAction !== route_to('clienteAdd')){ ?> <?php if ($formAction !== route_to('clienteAdd')){ ?>
<div class="tab-pane fade" id="tarifascliente" role="tabpanel"> <div class="tab-pane fade" id="tarifascliente" role="tabpanel">
<?= view("themes/vuexy/form/clientes/cliente/convert2templateModal") ?>
<div class='row'> <div class='row'>
<div class="col-md-12 col-lg-4 px-4"> <div class="col-md-12 col-lg-4 px-4">
<div class="mb-3"> <div class="mb-3">
@ -584,6 +583,7 @@
<table id="tableOfPrecios" class="table table-striped table-hover" style="width: 100%;"> <table id="tableOfPrecios" class="table table-striped table-hover" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th><?= lang('ClientePrecios.tipo') ?></th> <th><?= lang('ClientePrecios.tipo') ?></th>
<th><?= lang('ClientePrecios.tipo_maquina') ?></th> <th><?= lang('ClientePrecios.tipo_maquina') ?></th>
<th><?= lang('ClientePrecios.tipo_impresion') ?></th> <th><?= lang('ClientePrecios.tipo_impresion') ?></th>
@ -591,10 +591,10 @@
<th><?= lang('ClientePrecios.tiempo_max') ?></th> <th><?= lang('ClientePrecios.tiempo_max') ?></th>
<th><?= lang('ClientePrecios.precio_hora') ?></th> <th><?= lang('ClientePrecios.precio_hora') ?></th>
<th><?= lang('ClientePrecios.margen') ?></th> <th><?= lang('ClientePrecios.margen') ?></th>
<th><?= lang('ClientePrecios.user_updated_id') ?></th> <th class="noFilter"><?= lang('ClientePrecios.user_updated_id') ?></th>
<th><?= lang('ClientePrecios.updated_at') ?></th> <th class="noFilter"><?= lang('ClientePrecios.updated_at') ?></th>
<th>plantilla_id</th> <th class="noFilter noVis">plantilla_id</th>
<th class="text-nowrap" style="min-width:100px"><?= lang('Basic.global.Action') ?></th> <th class="text-nowrap noFilter noVis" style="min-width:100px"><?= lang('Basic.global.Action') ?></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -880,345 +880,6 @@ $(document).on('click', '.btn-remove', function(e) {
<?=$this->endSection() ?> <?=$this->endSection() ?>
<?= $this->section("additionalInlineJs") ?>
/**************************************
Tarifas cliente
***************************************/
$('#plantillas').select2({
allowClear: false,
ajax: {
url: '<?= route_to("menuItemsOfClienteplantillaprecios") ?>',
type: 'post',
dataType: 'json',
data: function (params) {
return {
id: 'id',
text: 'nombre',
searchTerm: params.term,
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
};
},
delay: 60,
processResults: function (response) {
yeniden(response.<?= csrf_token() ?>);
return {
results: response.menu
};
},
cache: true
}
});
const lastColNr_lineas = $('#tableOfPrecios').find("tr:first th").length - 1;
const actionBtns_lineas = function(data) {
return `
<span class="edit"><a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="${data.id}"></i></a></span>
<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>
<span class="cancel"></span>
`;
};
const tipo_linea = [
{label:'<?= lang('ClientePrecios.interior') ?>', value:'interior'},
{label:'<?= lang('ClientePrecios.cubierta') ?>', value: 'cubierta'},
{label:'<?= lang('ClientePrecios.sobrecubierta') ?>', value: 'sobrecubierta'}
];
const tipo_maquina = [
{label: '<?= lang('ClientePrecios.toner') ?>', value:'toner'},
{label: '<?= lang('ClientePrecios.inkjet') ?>', value:'inkjet'},
];
const tipo_impresion = [
{label: '<?= lang('ClientePrecios.negro') ?>', value:'negro'},
{label: '<?= lang('ClientePrecios.negrohq') ?>', value:'negrohq'},
{label: '<?= lang('ClientePrecios.color') ?>', value:'color'},
{label: '<?= lang('ClientePrecios.colorhq') ?>', value:'colorhq'},
];
var editorPrecios = new $.fn.dataTable.Editor( {
ajax: {
url: "<?= route_to('editorOfClienteprecios') ?>",
headers: {
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v,
},
},
table : "#tableOfPrecios",
idSrc: 'id',
fields: [ {
name: "tipo",
type: "select",
options: tipo_linea
}, {
name: "tipo_maquina",
type: "select",
options: tipo_maquina
}, {
name: "tipo_impresion",
type: "select",
options: tipo_impresion
}, {
name: "tiempo_min"
}, {
name: "tiempo_max"
}, {
name: "precio_hora"
}, {
name: "margen"
}, {
name: "user_updated_id",
type:'hidden',
}, {
name: "updated_at",
type:'hidden',
}, {
"name": "plantilla_id",
"type": "hidden"
},{
"name": "cliente_id",
"type": "hidden"
},{
"name": "deleted_at",
"type": "hidden"
},{
"name": "is_deleted",
"type": "hidden"
},
]
} );
editorPrecios.on( 'preSubmit', function ( e, d, type ) {
if ( type === 'create'){
d.data[0]['cliente_id'] = id;
}
else if(type === 'edit' ) {
for (v in d.data){
d.data[v]['cliente_id'] = id;
}
}
});
editorPrecios.on( 'postSubmit', function ( e, json, data, action ) {
yeniden(json.<?= csrf_token() ?>);
});
editorPrecios.on( 'submitSuccess', function ( e, json, data, action ) {
theTablePrecios.clearPipeline();
theTablePrecios.draw();
});
editorPrecios.on ('postEdit', function ( e, json, data, action ) {
const domain = window.location.origin
fetch(domain + "/clientes/clienteprecios/update/" + id , {
method: "POST",
body: JSON.stringify({
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
})
})
editorPrecios.on ('postCreate', function ( e, json, data, action ) {
const domain = window.location.origin
fetch(domain + "/clientes/clienteprecios/update/" + id , {
method: "POST",
body: JSON.stringify({
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
})
})
var theTablePrecios = $('#tableOfPrecios').DataTable( {
serverSide: true,
processing: true,
autoWidth: true,
responsive: true,
lengthMenu: [ 10, 25, 50, 100],
order: [[ 0, "asc" ], [ 1, "asc" ], [ 2, "asc" ], [ 3, "asc" ]],
pageLength: 50,
lengthChange: true,
searching: false,
paging: true,
info: false,
dom: '<"mt-4"><"float-end"B><"float-start"l><t><"mt-4 mb-3"p>',
ajax : $.fn.dataTable.pipeline( {
url: '<?= route_to('dataTableOfClienteprecios') ?>',
data: {
cliente_id: id,
},
method: 'POST',
headers: {'X-Requested-With': 'XMLHttpRequest'},
async: true,
}),
columns: [
{ 'data': 'tipo' ,
'render': function ( data, type, row, meta ) {
if(data=='interior')
return '<?= lang('ClientePrecios.interior') ?>';
else if(data=='cubierta')
return '<?= lang('ClientePrecios.cubierta') ?>';
else if(data=='sobrecubierta')
return '<?= lang('ClientePrecios.sobrecubierta') ?>';
}
},
{ 'data': 'tipo_maquina',
'render': function ( data, type, row, meta ) {
if(data=='toner')
return '<?= lang('ClientePrecios.toner') ?>';
else if(data=='inkjet')
return '<?= lang('ClientePrecios.inkjet') ?>';
}
},
{ 'data': 'tipo_impresion',
'render': function ( data, type, row, meta ) {
if(data=='negro')
return '<?= lang('ClientePrecios.negro') ?>';
else if(data=='negrohq')
return '<?= lang('ClientePrecios.negrohq') ?>';
else if(data=='color')
return '<?= lang('ClientePrecios.color') ?>';
else if(data=='colorhq')
return '<?= lang('ClientePrecios.colorhq') ?>';
}
},
{ 'data': 'tiempo_min' },
{ 'data': 'tiempo_max' },
{ 'data': 'precio_hora' },
{ 'data': 'margen' },
{ 'data': 'user_updated_id',
'render': function ( data, type, row, meta ) {
return row.user_updated
}
},
{ 'data': 'updated_at' },
{ 'data': 'plantilla_id' },
{
data: actionBtns_lineas,
className: 'row-edit dt-center'
}
],
columnDefs: [
{
target: 9,
orderable: false,
visible: false,
searchable: false
},
{
orderable: false,
searchable: false,
targets: [lastColNr_lineas]
},
{"orderData": [ 0, 1 ], "targets": 0 },
],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
buttons: [ {
className: 'btn btn-primary me-sm-3 me-1',
extend: "createInline",
editor: editorPrecios,
formOptions: {
submitTrigger: -1,
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>'
}
} ]
} );
const initPrecioTemplate = <?php echo json_encode($precioTemplate);?>;
if(initPrecioTemplate != null){
var newOption = new Option(initPrecioTemplate.label, initPrecioTemplate.value, false, false);
$('#plantillas').append(newOption);
}
// Activate an inline edit on click of a table cell
$('#tableOfPrecios').on( 'click', 'tbody span.edit', function (e) {
editorPrecios.inline(
theTablePrecios.cells(this.parentNode.parentNode, '*').nodes(),
{
cancelHtml: '<a href="javascript:void(0);"><i class="ti ti-x"></i></a>',
cancelTrigger: 'span.cancel',
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>',
submitTrigger: 'span.edit',
submit: 'allIfChanged'
}
);
} );
// Delete row
$(document).on('click', '.btn-delete', function(e) {
$(".btn-remove").attr('data-id', $(this).attr('data-id'));
$(".btn-remove").attr('table-id', '#tableOfPrecios');
$(".btn-remove").attr('row', $(this).closest('tr')[0]._DT_RowIndex);
});
function delete_precio(dataId, row){
if ($.isNumeric(dataId)) {
editorPrecios
.create( false )
.edit( theTablePrecios.rows(row), false)
.set( 'deleted_at', new Date().toISOString().slice(0, 19).replace('T', ' ') )
.set( 'is_deleted', 1 )
.submit();
$('#confirm2delete').modal('toggle');
}
}
$('#plantillas').on('change.select2', function(){
const data = $('#plantillas').select2('data');
if(data.length>0){
const domain = window.location.origin
fetch(domain + "/clientes/clienteprecios/update/" + id , {
method: "POST",
body: JSON.stringify({
plantilla_id: data[0].id,
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
}).then(function(){
theTablePrecios.clearPipeline();
theTablePrecios.draw();
})
}
});
$('#convert2template').on('click', function(){
var newAddDialog = $('#convert2Template')
newAddDialog.modal("show");
})
<?= $this->endSection() ?>
<?= $this->section("additionalInlineJs") ?> <?= $this->section("additionalInlineJs") ?>
/**************************************** /****************************************
Direcciones cliente Direcciones cliente

View File

@ -1,65 +0,0 @@
<div id="convert2Template" class="modal fade addModal">
<div class="modal-dialog modal-lg modal-simple">
<div class="modal-content">
<div class="modal-header">
<h4 id="labelTitleConfirmDialog" class="modal-title"><?= lang('ClientePrecios.convertir2plantilla') ?></h4>
</div>
<div class="modal-body">
<div id='error-nombre'></div>
<div class="mb-3">
<p><?= lang('ClientePrecios.convertir2plantillaText') ?></p>
<p><?= lang('ClientePrecios.convertir2plantillaText2') ?></p>
</div><!--//.mb-3 -->
<div class="mb-3">
<label for="nombre_plantilla" class="form-label">
<?= lang('ClientePrecios.nombrePlantilla') ?>
</label>
<input type="text" id="nombre_plantilla" maxLength="100" class="form-control new-address">
</div><!--//.mb-3 -->
</div>
<div class="modal-footer">
<button id="saveTemplate"
type="button"
class="btn btn-primary"
><?= lang('App.global_save') ?></button>
<button id="cancelTemplate"
type="button"
class="btn btn-default"
><?= lang('App.user_delete_btn_cancel') ?></button>
</div>
</div>
</div>
</div>
<?= $this->section("additionalInlineJs") ?>
$('#saveTemplate').on('click', function(){
if($('#nombre_plantilla').val().length == 0){
popErrorAlert('<?= lang('ClientePrecios.errors.error_nombre_template') ?>', 'error-nombre')
}
else{
data = new FormData();
data.append('cliente_id', id)
data.append('nombre', $('#nombre_plantilla').val())
data.append('<?= csrf_token() ?? "token" ?>', <?= csrf_token() ?>v)
fetch('<?= route_to("createClienteplantillaprecios");?>' , {
method: "POST",
body: data,
})
.then(data => {
$('#convert2Template').modal("hide");
var newOption = new Option($('#nombre_plantilla').val(), "", false, false);
$('#plantillas').append(newOption);
$('#nombre_plantilla').val("");
})
}
})
$('#cancelTemplate').on('click', function(){
$('#convert2Template').modal("hide");
})
<?=$this->endSection() ?>

View File

@ -1,6 +1,7 @@
<?= $this->include("themes/_commonPartialsBs/datatables") ?> <?= $this->include("themes/_commonPartialsBs/datatables") ?>
<?= $this->include("themes/_commonPartialsBs/select2bs5") ?> <?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
<?= $this->include("themes/_commonPartialsBs/sweetalert") ?> <?= $this->include("themes/_commonPartialsBs/sweetalert") ?>
<?= $this->include('themes/_commonPartialsBs/_confirm2delete') ?>
<?=$this->extend('themes/vuexy/main/defaultlayout') ?> <?=$this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section("content") ?> <?= $this->section("content") ?>
@ -43,5 +44,8 @@
<?= $this->section("additionalExternalJs") ?> <?= $this->section("additionalExternalJs") ?>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.colVis.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
<script type="module" src="<?= site_url('assets/js/safekat/pages/cliente/cliente.js?'. 'token' . '='. (csrf_token() ?? "token")) ?>"></script> <script type="module" src="<?= site_url('assets/js/safekat/pages/cliente/cliente.js?'. 'token' . '='. (csrf_token() ?? "token")) ?>"></script>
<?= $this->endSection() ?> <?= $this->endSection() ?>

View File

@ -16,12 +16,8 @@
<?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?> <?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?>
<?= view("themes/vuexy/form/clientes/plantillaprecios/_ClienteplantillapreciosFormItems") ?> <?= view("themes/vuexy/form/clientes/plantillaprecios/_ClienteplantillapreciosFormItems") ?>
<div class="pt-4"> <div class="pt-4">
<input <input type="submit" class="btn btn-primary float-start me-sm-3 me-1" name="save"
type="submit" value="<?= lang("Basic.global.Save") ?>" />
class="btn btn-primary float-start me-sm-3 me-1"
name="save"
value="<?= lang("Basic.global.Save") ?>"
/>
<?= anchor(route_to("clienteplantillapreciosList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary"]) ?> <?= anchor(route_to("clienteplantillapreciosList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary"]) ?>
</div><!-- /.card-footer --> </div><!-- /.card-footer -->
@ -31,22 +27,32 @@
</div><!--//.row --> </div><!--//.row -->
<?php if(str_contains($formAction,'edit')): ?> <?php if (str_contains($formAction, 'edit')): ?>
<div class="accordion mt-3" id="accordionPreciosLineas"> <div class="accordion mt-3" id="accordionPreciosLineas">
<div class="card accordion-item active"> <div class="card accordion-item active">
<h2 class="accordion-header" id="headingOne"> <h2 class="accordion-header" id="headingOne">
<button type="button" class="accordion-button" data-bs-toggle="collapse" data-bs-target="#accordionTip1" aria-expanded="false" aria-controls="accordionTip1"> <button type="button" class="accordion-button" data-bs-toggle="collapse" data-bs-target="#accordionTip1"
aria-expanded="false" aria-controls="accordionTip1">
<h3><?= lang("MaquinasTarifasImpresions.moduleTitle") ?></h3> <h3><?= lang("MaquinasTarifasImpresions.moduleTitle") ?></h3>
</button> </button>
</h2> </h2>
<div id="accordionTip1" class="accordion-collapse collapse show" data-bs-parent="#accordionPreciosLineas"> <div id="accordionTip1" class="accordion-collapse collapse show" data-bs-parent="#accordionPreciosLineas">
<div class="accordion-body"> <div class="accordion-body">
<button id="btnApply" type="button" class="btn btn-primary d-none">
Guardar y aplicar a clientes
</button>
<button id="btnUndo" type="button" class="btn btn-secondary d-none">
Descartar cambios
</button>
<table id="tableOfPlantillasPreciosLineas" class="table table-striped table-hover" style="width: 100%;"> <table id="tableOfPlantillasPreciosLineas" class="table table-striped table-hover" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th><?= lang('ClientePrecios.tipo') ?></th> <th><?= lang('ClientePrecios.tipo') ?></th>
<th><?= lang('ClientePrecios.tipo_maquina') ?></th> <th><?= lang('ClientePrecios.tipo_maquina') ?></th>
<th><?= lang('ClientePrecios.tipo_impresion') ?></th> <th><?= lang('ClientePrecios.tipo_impresion') ?></th>
@ -55,308 +61,51 @@
<th><?= lang('ClientePrecios.precio_hora') ?></th> <th><?= lang('ClientePrecios.precio_hora') ?></th>
<th><?= lang('ClientePrecios.margen') ?></th> <th><?= lang('ClientePrecios.margen') ?></th>
<th><?= lang('ClientePrecios.user_updated_id') ?></th> <th><?= lang('ClientePrecios.user_updated_id') ?></th>
<th><?= lang('ClientePrecios.updated_at') ?></th> <th class="noFilter"><?= lang('ClientePrecios.updated_at') ?></th>
<th class="text-nowrap" style="min-width:100px"><?= lang('Basic.global.Action') ?></th> <th class="text-nowrap noFilter" style="min-width:100px"><?= lang('Basic.global.Action') ?>
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
</div> </div>
</div> <!-- //.accordion --> </div> <!-- //.accordion -->
<?php endif; ?> <?php endif; ?>
<?= $this->endSection() ?> <?= $this->endSection() ?>
<?php if(str_contains($formAction,'edit')): ?> <?= $this->section('css') ?>
<?=$this->section('additionalInlineJs') ?> <link rel="stylesheet"
href="<?= site_url('themes/vuexy/css/datatables-editor/editor.dataTables.min.css') ?>">
const lastColNr_lineas = $('#tableOfPlantillasPreciosLineas').find("tr:first th").length - 1; <link rel="stylesheet"
href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
const url = window.location.href; <?= $this->endSection() ?>
const url_parts = url.split('/');
let id = -1;
if(url_parts[url_parts.length-2] == 'edit'){
id = url_parts[url_parts.length-1];
}
const actionBtns_lineas = function(data) {
return `
<span class="edit"><a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="${data.id}"></i></a></span>
<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>
<span class="cancel"></span>
`;
};
const tipo_linea = [
{label:'<?= lang('ClientePrecios.interior') ?>', value:'interior'},
{label:'<?= lang('ClientePrecios.cubierta') ?>', value: 'cubierta'},
{label:'<?= lang('ClientePrecios.sobrecubierta') ?>', value: 'sobrecubierta'}
];
const tipo_maquina = [
{label: '<?= lang('ClientePrecios.toner') ?>', value:'toner'},
{label: '<?= lang('ClientePrecios.inkjet') ?>', value:'inkjet'},
];
const tipo_impresion = [
{label: '<?= lang('ClientePrecios.negro') ?>', value:'negro'},
{label: '<?= lang('ClientePrecios.negrohq') ?>', value:'negrohq'},
{label: '<?= lang('ClientePrecios.color') ?>', value:'color'},
{label: '<?= lang('ClientePrecios.colorhq') ?>', value:'colorhq'},
];
var editor = new $.fn.dataTable.Editor( {
ajax: {
url: "<?= route_to('editorOfClienteplantillaprecioslineas') ?>",
headers: {
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v,
},
},
table : "#tableOfPlantillasPreciosLineas",
idSrc: 'id',
fields: [ {
name: "tipo",
type: "select",
options: tipo_linea
}, {
name: "tipo_maquina",
type: "select",
options: tipo_maquina
}, {
name: "tipo_impresion",
type: "select",
options: tipo_impresion
}, {
name: "tiempo_min"
}, {
name: "tiempo_max"
}, {
name: "precio_hora"
}, {
name: "margen"
}, {
name: "user_updated_id",
type:'hidden',
}, {
name: "updated_at",
type:'hidden',
}, {
"name": "plantilla_id",
"type": "hidden"
},{
"name": "deleted_at",
"type": "hidden"
},{
"name": "is_deleted",
"type": "hidden"
},
]
} );
editor.on( 'preSubmit', function ( e, d, type ) {
if ( type === 'create'){
d.data[0]['plantilla_id'] = id;
}
else if(type === 'edit' ) {
for (v in d.data){
d.data[v]['plantilla_id'] = id;
}
}
});
editor.on( 'postSubmit', function ( e, json, data, action ) {
yeniden(json.<?= csrf_token() ?>);
const domain = window.location.origin
fetch(domain + "/clientes/clienteprecios/update/" + -1 , {
method: "POST",
body: JSON.stringify({
plantilla_id: id,
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
})
});
editor.on( 'submitSuccess', function ( e, json, data, action ) {
theTable.clearPipeline();
theTable.draw();
});
var theTable = $('#tableOfPlantillasPreciosLineas').DataTable( {
serverSide: true,
processing: true,
autoWidth: true,
responsive: true,
lengthMenu: [ 10, 25, 50, 100],
order: [[ 0, "asc" ], [ 1, "asc" ], [ 2, "asc" ], [ 3, "asc" ]],
pageLength: 50,
lengthChange: true,
searching: false,
paging: true,
info: false,
dom: '<"mt-4"><"float-end"B><"float-start"l><t><"mt-4 mb-3"p>',
ajax : $.fn.dataTable.pipeline( {
url: '<?= route_to('dataTableOfClientesplantillaprecioslineas') ?>',
data: {
plantilla_id: id,
},
method: 'POST',
headers: {'X-Requested-With': 'XMLHttpRequest'},
async: true,
}),
columns: [
{ 'data': 'tipo' ,
'render': function ( data, type, row, meta ) {
if(data=='interior')
return '<?= lang('ClientePrecios.interior') ?>';
else if(data=='cubierta')
return '<?= lang('ClientePrecios.cubierta') ?>';
else if(data=='sobrecubierta')
return '<?= lang('ClientePrecios.sobrecubierta') ?>';
}
},
{ 'data': 'tipo_maquina',
'render': function ( data, type, row, meta ) {
if(data=='toner')
return '<?= lang('ClientePrecios.toner') ?>';
else if(data=='inkjet')
return '<?= lang('ClientePrecios.inkjet') ?>';
}
},
{ 'data': 'tipo_impresion',
'render': function ( data, type, row, meta ) {
if(data=='negro')
return '<?= lang('ClientePrecios.negro') ?>';
else if(data=='negrohq')
return '<?= lang('ClientePrecios.negrohq') ?>';
else if(data=='color')
return '<?= lang('ClientePrecios.color') ?>';
else if(data=='colorhq')
return '<?= lang('ClientePrecios.colorhq') ?>';
}
},
{ 'data': 'tiempo_min' },
{ 'data': 'tiempo_max' },
{ 'data': 'precio_hora' },
{ 'data': 'margen' },
{ 'data': 'user_updated_id',
'render': function ( data, type, row, meta ) {
return row.user_updated
}
},
{ 'data': 'updated_at' },
{
data: actionBtns_lineas,
className: 'row-edit dt-center'
}
],
columnDefs: [
{
orderable: false,
searchable: false,
targets: [lastColNr_lineas]
},
{"orderData": [ 0, 1 ], "targets": 0 },
],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
buttons: [
{
extend: 'collection',
text: 'Exportar',
buttons:[
'copy', 'csv', 'excel', 'print', {
extend: 'pdfHtml5',
orientation: 'landscape',
pageSize: 'A4'
}
]
},
{
className: 'btn btn-primary me-sm-3 me-1',
extend: "createInline",
editor: editor,
formOptions: {
submitTrigger: -1,
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>'
}
} ]
} );
// Activate an inline edit on click of a table cell
$('#tableOfPlantillasPreciosLineas').on( 'click', 'tbody span.edit', function (e) {
editor.inline(
theTable.cells(this.parentNode.parentNode, '*').nodes(),
{
cancelHtml: '<a href="javascript:void(0);"><i class="ti ti-x"></i></a>',
cancelTrigger: 'span.cancel',
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>',
submitTrigger: 'span.edit',
submit: 'allIfChanged'
}
);
} );
// Delete row
$(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: `/clientes/clienteplantillaprecioslineas/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() ?>
<?php endif; ?>
<?=$this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/css/datatables-editor/editor.dataTables.min.css') ?>">
<link rel="stylesheet" href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
<?=$this->endSection() ?>
<?= $this->section('additionalExternalJs') ?> <?= $this->section('additionalExternalJs') ?>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script> <script
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script> src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script> <script
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script> src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script> <script
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>" crossorigin="anonymous" referrerpolicy="no-referrer"></script> src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script> <script
<script src="<?= site_url('themes/vuexy/js/datatables-editor/dataTables.editor.min.js') ?>"></script> src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
<?=$this->endSection() ?> <script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>"
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
<script
src="<?= site_url('themes/vuexy/js/datatables-editor/dataTables.editor.min.js') ?>"></script>
<?php if (str_contains($formAction, 'edit')): ?>
<script type="module"
src="<?= site_url('assets/js/safekat/pages/plantillasTarifasCliente/edit.js') ?>"></script>
<?php endif; ?>
<?= $this->endSection() ?>

View File

@ -10,14 +10,16 @@
<h3 class="card-title"><?=lang('ClientePrecios.plantillaPrecios_list') ?></h3> <h3 class="card-title"><?=lang('ClientePrecios.plantillaPrecios_list') ?></h3>
<?=anchor(route_to('newClienteplantillaprecios'), lang('Basic.global.addNew').' '.lang('ClientePrecios.plantillaPrecios_name'), ['class'=>'btn btn-primary float-end']); ?> <?=anchor(route_to('newClienteplantillaprecios'), lang('Basic.global.addNew').' '.lang('ClientePrecios.plantillaPrecios_name'), ['class'=>'btn btn-primary float-end']); ?>
</div><!--//.card-header --> </div><!--//.card-header -->
<div class="card-body"> <?= csrf_field() ?>
<div class="card-body">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?> <?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<table id="tableOfClienteplantillaprecios" class="table table-striped table-hover using-exportable-data-table" style="width: 100%;"> <table id="tableOfClienteplantillaprecios" class="table table-striped table-hover using-exportable-data-table" style="width: 100%;">
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th><?= lang('ClientePrecios.nombre') ?></th> <th><?= lang('ClientePrecios.nombre') ?></th>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th> <th class="noFilter text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -50,100 +52,6 @@
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script> <script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
<script type="module" src="<?= site_url('assets/js/safekat/pages/plantillasTarifasCliente/list.js') ?>"></script>
<?=$this->endSection() ?> <?=$this->endSection() ?>
<?=$this->section('additionalInlineJs') ?>
const lastColNr2 = $(".using-exportable-data-table").find("tr:first th").length - 1;
const actionBtns2 = function(data) {
return `
<span class="edit"><a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="${data.id}"></i></a></span>
<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>
<span class="cancel"></span>
`;
};
$(document).on('click', '.btn-edit', function(e) {
window.location.href = `/clientes/clienteplantillaprecios/edit/${$(this).attr('data-id')}`;
});
// Delete row
$(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: `/clientes/clienteplantillaprecios/delete/${dataId}`,
method: 'GET',
}).done((data, textStatus, jqXHR) => {
$('#confirm2delete').modal('toggle');
tablePLantillaPrecios.clearPipeline();
tablePLantillaPrecios.row($(row)).invalidate().draw();
// Se borran las lineas asociadas
const domain = window.location.origin
fetch(domain + "/clientes/clienteplantillaprecios/update/" + dataId , {
method: "POST",
body: JSON.stringify({
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}),
headers: {
"Content-type": "application/json; charset=UTF-8"
}
})
popSuccessAlert(data.msg ?? jqXHR.statusText);
}).fail((jqXHR, textStatus, errorThrown) => {
popErrorAlert(jqXHR.responseJSON.messages.error)
});
}
});
var tablePLantillaPrecios = $('#tableOfClienteplantillaprecios').DataTable( {
serverSide: true,
processing: true,
autoWidth: true,
responsive: true,
lengthMenu: [ 5, 10, 25, 50, 75, 100, 250],
order: [[ 0, "asc" ]],
pageLength: 25,
lengthChange: true,
searching: true,
paging: true,
info: true,
stateSave: true,
dom: "lftp",
ajax : $.fn.dataTable.pipeline( {
url: '<?= route_to('dataTableOfClientesplantillaprecios') ?>',
method: 'POST',
headers: {'X-Requested-With': 'XMLHttpRequest'},
async: true,
}),
columns: [
{ data: 'nombre'},
{ data: actionBtns2,
className: 'row-edit dt-center'}
],
columnDefs: [
{
orderable: false,
targets: [lastColNr2]
},
{
searchable: false,
targets: [lastColNr2]
}
],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
}
} );
<?=$this->endSection() ?>

View File

@ -63,7 +63,7 @@
</div> </div>
<div <div id="divExcluirRotativa"
class="col-sm-5 mb-3 d-flex flex-column align-items-center <?= (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) ? " d-none" : "" ?>"> class="col-sm-5 mb-3 d-flex flex-column align-items-center <?= (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) ? " d-none" : "" ?>">
<div class="form-check form-switch mb-2"> <div class="form-check form-switch mb-2">
<input <?= (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) ? " hidden" : "" ?> class=" calcular-solapas calcular-presupuesto form-check-input" type="checkbox" id="excluirRotativa" <input <?= (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) ? " hidden" : "" ?> class=" calcular-solapas calcular-presupuesto form-check-input" type="checkbox" id="excluirRotativa"

View File

@ -61,11 +61,11 @@
$selectedChatDepartments = isset($chatDepartmentUser) && is_array($chatDepartmentUser) ? $chatDepartmentUser : []; $selectedChatDepartments = isset($chatDepartmentUser) && is_array($chatDepartmentUser) ? $chatDepartmentUser : [];
$selectedKeywords = array_map(fn($chatDepartment) => $chatDepartment->name, $selectedChatDepartments); $selectedKeywords = array_map(fn($chatDepartment) => $chatDepartment->name, $selectedChatDepartments);
foreach ($chatDepartments as $item) : foreach ($chatDepartments as $item) :
$isSelected = in_array($item["name"], $selectedKeywords) ? 'selected' : ''; $isSelected = in_array($item->name, $selectedKeywords) ? 'selected' : '';
?> ?>
<option value="<?= $item["name"] ?>" <option value="<?= $item->name ?>"
data-select2-id=<?= $item["name"] ?> <?= $isSelected ?>> data-select2-id=<?= $item->name ?> <?= $isSelected ?>>
<?= $item["display"] ?> <?= $item->display ?>
</option> </option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>

View File

@ -136,8 +136,9 @@ $picture = "/assets/img/default-user.png";
<div class="container-m-nx m-2"> <div class="container-m-nx m-2">
<div class="sidebar-body"> <div class="sidebar-body">
<!-- Contacts --> <!-- Contacts -->
<h6 id="chat-message-notification-title"><?= lang("Chat.no_messages_notification") ?> </h6>
<ul class="list-unstyled chat-contact-list mb-0" id="chat-notification-list"> <ul class="list-unstyled chat-contact-list mb-0" id="chat-notification-list">
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -0,0 +1,81 @@
class ConfirmDeleteModal {
constructor(alias = "") {
this.modalId = alias !== "" ? `confirm2delete-${alias}`: 'confirm2delete';
const removeClass = alias !== "" ? `btn-remove-${alias}` : 'btn-remove';
this.btnCancelId = alias !== "" ? `btnCancelDelete-${alias}` : 'btnCancelDelete';
this.btnDeleteId = alias !== "" ? `btnConfirmDelete-${alias}` : 'btnConfirmDelete';
this.data = null;
this.modalHtml = `
<div class="modal fade" id="${this.modalId}" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="${this.modalId}Label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="${this.modalId}Label">¿Estás seguro de que deseas eliminar?</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Esta acción no se puede deshacer.
</div>
<div class="modal-footer">
<button id=${this.btnCancelId} type="button" class="btn btn-default" data-bs-dismiss="modal">Cancelar</button>
<a id=${this.btnDeleteId} href="javascript:void(0);" class="btn btn-danger btn-confirm ${removeClass}">Eliminar</a>
</div><!--//.modal-footer -->
</div><!--//.modal-content -->
</div><!--//.modal-dialog -->
</div><!--//.modal -->
`;
}
init() {
// Insertar el modal en el body del documento si no existe
if (!document.getElementById(this.modalId)) {
document.body.insertAdjacentHTML('beforeend', this.modalHtml);
}
document.getElementById(this.btnCancelId).addEventListener('click', () => {
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.hide();
});
}
getModalId() {
return '#' + this.modalId;
}
setData(data) {
this.data = data;
}
getData() {
return this.data;
}
// Método para mostrar el modal
show(callback) {
// Mostrar el modal usando Bootstrap
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.show();
// Configurar el evento de confirmación de eliminación
document.getElementById(this.btnDeleteId).addEventListener('click', () => {
callback(); // Llamar al callback que el usuario haya proporcionado
modal.hide(); // Cerrar el modal
});
}
// Método para ocultar el modal si es necesario
hide() {
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.hide();
}
}
export default ConfirmDeleteModal;

View File

@ -722,9 +722,11 @@ export const showNotificationMessages = (dom) => {
dom.empty() dom.empty()
$("#chat-notification-number") $("#chat-notification-number")
if (data.totalMessages > 0) { if (data.totalMessages > 0) {
$("#chat-message-notification-title").addClass("d-none")
$("#chat-notification-number").removeClass("d-none") $("#chat-notification-number").removeClass("d-none")
$("#chat-notification-number").text(data.totalMessages ?? 0) $("#chat-notification-number").text(data.totalMessages ?? 0)
} else { } else {
$("#chat-message-notification-title").removeClass("d-none")
$("#chat-notification-number").addClass("d-none") $("#chat-notification-number").addClass("d-none")
$("#chat-notification-number").text(0) $("#chat-notification-number").text(0)
} }

View File

@ -0,0 +1,69 @@
class ModalYesNo {
constructor(text= "", alias = "") {
this.modalId = alias !== "" ? `yesNoModal-${alias}`: 'yesNoModal';
this.btnCancelId = alias !== "" ? `btnCancelModal-${alias}` : 'btnCancelModal';
this.btnConfirmId = alias !== "" ? `btnYesModal-${alias}` : 'btnYesModal';
this.modalHtml = `
<div class="modal fade" id="${this.modalId}" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="${this.modalId}Label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="${this.modalId}Label">Aplicar cambios</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
${text}
</div>
<div class="modal-footer">
<button id=${this.btnCancelId} type="button" class="btn btn-default" data-bs-dismiss="modal">Cancelar</button>
<a id=${this.btnConfirmId} href="javascript:void(0);" class="btn btn-danger ">Si</a>
</div><!--//.modal-footer -->
</div><!--//.modal-content -->
</div><!--//.modal-dialog -->
</div><!--//.modal -->
`;
}
init() {
// Insertar el modal en el body del documento si no existe
if (!document.getElementById(this.modalId)) {
document.body.insertAdjacentHTML('beforeend', this.modalHtml);
}
document.getElementById(this.btnCancelId).addEventListener('click', () => {
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.hide();
});
}
getModalId() {
return '#' + this.modalId;
}
// Método para mostrar el modal
show(callback) {
// Mostrar el modal usando Bootstrap
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.show();
// Configurar el evento de confirmación de eliminación
document.getElementById(this.btnConfirmId).addEventListener('click', () => {
callback(); // Llamar al callback que el usuario haya proporcionado
modal.hide(); // Cerrar el modal
});
}
// Método para ocultar el modal si es necesario
hide() {
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.hide();
}
}
export default ModalYesNo;

View File

@ -84,6 +84,10 @@ let ClassSelect = function (domItem, url, placeholder, allowClear = false, param
this.onChange = function(callback) { this.onChange = function(callback) {
this.item.on('change', callback); this.item.on('change', callback);
}; };
this.offChange = function() {
this.item.off('change');
};
}; };
export default ClassSelect; export default ClassSelect;

View File

@ -0,0 +1,187 @@
let Table = function (
domItem,
alias,
url,
columns,
data,
row_id = "DT_RowId",
language = "es-ES") {
this.domItem = domItem;
this.alias = alias;
this.url = url;
this.columns = columns;
this.data = data;
this.row_id = row_id;
this.language = language;
this.table = null;
this.actions = []; // Declaración inicial de actions como propiedad
this.deleteModal = null;
const self = this;
this.init = function ({
dom = '<"mt-4"><"float-end"B><"float-start"l><t><"mt-4 mb-3"p>',
actions = ['view', 'edit', 'delete', 'cancel'],
order = [[0, 'asc']],
buttonsExport = true,
colVisibility = true,
buttonNewWithEditor = false,
editor = null,
booleanColumns = [],
} = {}) {
this.actions = actions;
const lastColNr = this.domItem.find("tr:first th").length - 1;
let columnDefs = [];
if (actions.length > 0) {
columnDefs = [
{
orderable: false,
searchable: false,
targets: [lastColNr]
}
];
columns.push(
{
'data': self.actionBtns.bind(self), // Vincular correctamente el contexto
'defaultContent': '<span class="edit"><a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2"></i></a></span><span class="cancel"></span><a href="javascript:void(0);"><i class="ti ti-trash ti-sm btn-delete mx-2"></i></a>',
'className': 'row-edit dt-center',
}
);
}
let buttons = [];
if (buttonsExport) {
buttons = [
'copy', 'csv', 'excel', 'print', {
extend: 'pdfHtml5',
orientation: 'landscape',
pageSize: 'A4'
}
];
}
if(colVisibility){
buttons.unshift({
extend: 'colvis',
columns: ':not(.noVis)',
})
}
if (buttonNewWithEditor) {
buttons.push(
{
className: 'btn btn-primary me-sm-3 me-1',
extend: "createInline",
editor: editor,
formOptions: {
submitTrigger: -1,
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>'
}
}
);
}
// Inicialización de DataTable
this.table = this.domItem.DataTable({
processing: true,
serverSide: true,
autoWidth: true,
responsive: true,
scrollX: true,
stateSave: true,
lengthMenu: [5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500],
order: order,
orderCellsTop: true,
fixedHeader: true,
rowId: row_id,
dom: dom,
ajax: $.fn.dataTable.pipeline({
url: this.url,
method: 'POST',
headers: { 'X-Requested-With': 'XMLHttpRequest' },
data: function (d) {
$.each(self.data, function (key, val) {
d[val.name] = val.value;
});
},
async: true,
}),
buttons: buttons,
columns: this.columns,
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/" + this.language + ".json"
},
columnDefs: columnDefs,
});
if (Array.isArray(booleanColumns) && booleanColumns.length > 0) {
this.table.on('draw.dt', function () {
for (let coln of booleanColumns) {
self.table.column(coln, { page: 'current' }).nodes().each(function (cell) {
cell.innerHTML = cell.innerHTML == '1' ? '<i class="ti ti-check"></i>' : '';
});
}
});
}
};
this.getAlias = function () {
return this.alias;
}
this.setData = function (data) {
this.data = data;
}
this.setPageLength = function (length) {
this.table.page.len(length).draw();
}
this.setEditCallback = function (callback) {
this.domItem.on('click', '.btn-edit-' + this.alias, function () {
let id = $(this).data('id');
callback(id);
});
}
this.setDeleteCallback = function (callback) {
this.domItem.on('click', '.btn-delete-' + this.alias, function () {
let id = $(this).data('id');
callback(id);
});
}
this.setViewCallback = function (callback) {
this.domItem.on('click', '.btn-view-' + this.alias, function () {
let id = $(this).data('id');
callback(id);
});
}
this.actionBtns = function (data) {
let btns = ``;
if (this.actions.includes('view')) {
btns += `<span class="view"><a href="javascript:void(0);"><i class="ti ti-eye ti-sm btn-edit-${this.alias} mx-2" data-id="${data.id}"></i></a></span>`;
}
if (this.actions.includes('edit')) {
btns += `<span class="edit"><a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit-${this.alias} mx-2" data-id="${data.id}"></i></a></span>`;
}
if (this.actions.includes('cancel')) {
btns += `<span class="cancel"></span>`;
}
if (this.actions.includes('delete')) {
btns += `<a href="javascript:void(0);"><i class="ti ti-trash ti-sm btn-delete-${this.alias} mx-2" data-id="${data.id}"></i></a>`;
}
return btns;
};
}
export default Table;

View File

@ -0,0 +1,43 @@
let TableEditor = function (
table,
url = "",
headers,
idSrc,
fields) {
this.table = table;
this.url = url;
this.headers = headers;
this.idSrc = idSrc;
this.fields = fields;
this.editor = null;
this.init = function () {
if (url == "") {
this.editor = new $.fn.dataTable.Editor({
table: table,
idSrc: idSrc,
fields: fields,
});
}
else {
this.editor = new $.fn.dataTable.Editor({
ajax: {
url: url,
headers: headers,
},
table: table,
idSrc: idSrc,
fields: fields,
});
}
};
}
export default TableEditor;

View File

@ -1,11 +1,12 @@
import ClassSelect from '../../components/select2.js'; import ClassSelect from '../../components/select2.js';
import tarifasClienteView from './tarifasCliente.js';
import Ajax from '../../components/ajax.js';
class Cliente { class Cliente {
constructor() { constructor() {
this.csrf_token = this.getToken(); this.tarifas = new tarifasClienteView($('#tarifascliente'));
this.csrf_hash = $('#clienteForm').find('input[name="' + this.csrf_token + '"]').val();
this.pais = new ClassSelect($("#paisId"), '/paises/menuitems2', "Seleccione un país", {[this.csrf_token]: this.csrf_hash}); this.pais = new ClassSelect($("#paisId"), '/paises/menuitems2', "Seleccione un país", {[this.csrf_token]: this.csrf_hash});
this.soporte = new ClassSelect($("#soporteId"), '/users/getMenuComerciales', "Seleccione un usuario", {[this.csrf_token]: this.csrf_hash}); this.soporte = new ClassSelect($("#soporteId"), '/users/getMenuComerciales', "Seleccione un usuario", {[this.csrf_token]: this.csrf_hash});
@ -14,7 +15,6 @@ class Cliente {
this.provincia = new ClassSelect($("#provinciaId"), '/provincias/menuitems2', "Seleccione una provincia", {[this.csrf_token]: this.csrf_hash}); this.provincia = new ClassSelect($("#provinciaId"), '/provincias/menuitems2', "Seleccione una provincia", {[this.csrf_token]: this.csrf_hash});
this.comunidadAutonoma = new ClassSelect($("#comunidadAutonomaId"), '/comunidades-autonomas/menuitems2', "Seleccione una comunidad autónoma", {[this.csrf_token]: this.csrf_hash}); this.comunidadAutonoma = new ClassSelect($("#comunidadAutonomaId"), '/comunidades-autonomas/menuitems2', "Seleccione una comunidad autónoma", {[this.csrf_token]: this.csrf_hash});
this.init();
} }
init() { init() {
@ -30,6 +30,8 @@ class Cliente {
this.formaPago.init(); this.formaPago.init();
this.provincia.init(); this.provincia.init();
this.comunidadAutonoma.init(); this.comunidadAutonoma.init();
this.tarifas.init();
$(document).keypress(function (e) { $(document).keypress(function (e) {
var key = e.which; var key = e.which;
@ -49,18 +51,23 @@ class Cliente {
}); });
} }
getToken(){
const scriptUrl = new URL(import.meta.url);
const params = new URLSearchParams(scriptUrl.search);
const paramsObject = Object.fromEntries(params.entries());
return paramsObject.token;
}
} }
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
new Cliente().init();
}); const locale = document.querySelector('meta[name="locale"]').getAttribute('content');
new Ajax('/translate/getTranslation', { locale: locale, translationFile: ['ClienteContactos', 'ClientePrecios'] }, {},
function(translations) {
window.language = JSON.parse(translations);
new Cliente().init();
},
function (error) {
console.log("Error getting translations:", error);
}
).post();
});

View File

@ -0,0 +1,83 @@
class ModalConvert2Template {
constructor() {
this.modalId = 'modalConvert2Template';
this.modalHtml = `
<div class="modal fade" id="${this.modalId}" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="${this.modalId}Label" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h4 id="labelTitleConfirmDialog" class="modal-title">${window.language.ClientePrecios.convertir2plantilla}</h4>
</div>
<div class="modal-body">
<div id='error-nombre'></div>
<div class="mb-3">
<p>${window.language.ClientePrecios.convertir2plantillaText}</p>
<p>${window.language.ClientePrecios.convertir2plantillaText2}</p>
</div>
<div class="mb-3">
<label for="nombre_plantilla" class="form-label">
${window.language.ClientePrecios.nombrePlantilla}
</label>
<input type="text" id="nombre_plantilla" maxLength="100" class="form-control new-address">
</div>
</div>
<div class="modal-footer">
<button id="saveTemplate" type="button" class="btn btn-primary">
Guardar
</button>
<button id="cancelTemplate" type="button" class="btn btn-default">
Cancelar
</button>
</div>
</div>
</div>
</div>
`;
this.modalInstance = null;
}
init() {
const self = this;
// Insertar el modal en el body del documento si no existe
if (!document.getElementById(this.modalId)) {
document.body.insertAdjacentHTML('beforeend', this.modalHtml);
}
this.modalInstance = new bootstrap.Modal(document.getElementById(this.modalId));
// Configurar el evento del botón de cancelar
document.getElementById('cancelTemplate').addEventListener('click', () => {
this.modalInstance.hide();
});
}
// Método para mostrar el modal
show(callback) {
// Mostrar el modal usando Bootstrap
this.modalInstance.show();
// Configurar el evento de confirmación de eliminación
document.getElementById('saveTemplate').addEventListener('click', () => {
callback(); // Llamar al callback que el usuario haya proporcionado
this.modalInstance.hide();
});
}
hide() {
document.getElementById('nombre_plantilla').value = "";
const modal = new bootstrap.Modal(document.getElementById(this.modalId));
modal.hide();
}
getNombrePlantilla() {
return document.getElementById('nombre_plantilla').value;
}
}
export default ModalConvert2Template;

View File

@ -0,0 +1,499 @@
import Table from '../../components/table.js';
import TableEditor from '../../components/tableEditor.js';
import ConfirmDeleteModal from '../../components/ConfirmDeleteModal.js';
import ConvertToTemplate from './modalConvert2Template.js';
import ClassSelect from '../../components/select2.js';
import Ajax from '../../components/ajax.js';
import { getToken } from '../../common/common.js';
class tarifasClienteView {
constructor(domItem) {
this.domItem = domItem;
this.csrf_token = getToken();
this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val();
this.clienteId = window.location.href.split("/").pop();
this.actions = ['edit', 'delete', 'cancel'];
this.headerSearcher();
this.tableTarifas = null;
this.editorTarifas = null;
this.confirmDeleteModal = null;
this.deleteModal = null;
this.convertToTemplate = null;
this.plantillas = $(this.domItem.find('#plantillas'));
this.selectorPlantilla = new ClassSelect(this.plantillas, '/clienteplantillaprecios/menuitems', '');
this.convertToTemplateBtn = $('#convert2template');
}
init() {
const self = this;
this.deleteModal = new ConfirmDeleteModal('tarifascliente');
this.deleteModal.init();
this.convertToTemplate = new ConvertToTemplate();
this.convertToTemplate.init();
this.#initEditor();
this.#initTable();
this.selectorPlantilla.init();
this.#getPlantillaPrecios();
this.convertToTemplateBtn.on('click', function () {
self.convertToTemplate.show(self.#convertir2plantilla.bind(self));
})
// Editar en linea la fila
this.tableTarifas.table.on('click', 'tbody span.edit', function (e) {
const row = $(this).closest('tr');
// Iniciar la edición en línea para todas las celdas de la fila
self.editorTarifas.editor.inline(
self.tableTarifas.table.cells(row, '*').nodes(),
{
cancelHtml: '<a href="javascript:void(0);"><i class="ti ti-x"></i></a>',
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>',
cancelTrigger: row.find('span.cancel')[0],
submitTrigger: row.find('span.edit')[0],
submit: 'allIfChanged'
}
);
});
this.tableTarifas.table.on('click', '.btn-delete-' + this.tableTarifas.getAlias(), function (e) {
const row = $(this).closest('tr')[0]._DT_RowIndex;
self.deleteModal.setData($(this).attr('data-id'));
self.deleteModal.show(() => {
if ($.isNumeric(self.deleteModal.getData())) {
self.editorTarifas.editor
.create(false)
.edit(self.tableTarifas.table.rows(row), false)
.set('deleted_at', new Date().toISOString().slice(0, 19).replace('T', ' '))
.set('is_deleted', 1)
.submit();
self.deleteModal.hide();
}
});
});
}
#initEditor() {
const self = this;
const tipo_linea = [
{ label: window.language.ClientePrecios.interior, value: 'interior' },
{ label: window.language.ClientePrecios.cubierta, value: 'cubierta' },
{ label: window.language.ClientePrecios.sobrecubierta, value: 'sobrecubierta' }
];
const tipo_maquina = [
{ label: window.language.ClientePrecios.toner, value: 'toner' },
{ label: window.language.ClientePrecios.inkjet, value: 'inkjet' },
];
const tipo_impresion = [
{ label: window.language.ClientePrecios.negro, value: 'negro' },
{ label: window.language.ClientePrecios.negrohq, value: 'negrohq' },
{ label: window.language.ClientePrecios.color, value: 'color' },
{ label: window.language.ClientePrecios.colorhq, value: 'colorhq' },
];
const editorFields = [
{
name: "id",
type: "readonly"
}, {
name: "tipo",
type: "select",
options: tipo_linea
}, {
name: "tipo_maquina",
type: "select",
options: tipo_maquina
}, {
name: "tipo_impresion",
type: "select",
options: tipo_impresion
}, {
name: "tiempo_min"
}, {
name: "tiempo_max"
}, {
name: "precio_hora"
}, {
name: "margen"
}, {
name: "user_updated_id",
type: 'hidden',
}, {
name: "updated_at",
type: 'hidden',
}, {
name: "plantilla_id",
type: "hidden"
}, {
name: "cliente_id",
type: "hidden"
}, {
name: "deleted_at",
type: "hidden"
}, {
name: "is_deleted",
type: "hidden"
},
];
this.editorTarifas = new TableEditor(
$('#tableOfPrecios'),
'/clienteprecios/datatable_editor',
{ [this.csrf_token]: this.csrf_hash },
'id',
editorFields);
this.editorTarifas.init();
this.editorTarifas.editor.on('preSubmit', function (e, d, type) {
if (type === 'create') {
d.data[0]['cliente_id'] = self.clienteId;
}
});
this.editorTarifas.editor.on('submitSuccess', function (e, json, data, action) {
self.tableTarifas.table.clearPipeline();
self.tableTarifas.table.draw();
});
this.editorTarifas.editor.on('postEdit', function (e, json, data, action) {
self.#borrarPlantillaTarifa(self.clienteId);
self.selectorPlantilla.offChange();
self.selectorPlantilla.setOption(0, 'Personalizado');
self.selectorPlantilla.onChange(self.#changePlantilla.bind(this));
})
this.editorTarifas.editor.on('postCreate', function (e, json, data, action) {
self.#borrarPlantillaTarifa(self.clienteId);
self.selectorPlantilla.offChange();
self.selectorPlantilla.setOption(0, 'Personalizado');
self.selectorPlantilla.onChange(self.#changePlantilla.bind(this));
})
this.editorTarifas.editor.on('postCancel', function (e, json, data) {
// Restaurar botones de acción por fila
self.tableTarifas.table.rows().nodes().each(function (node) {
$(node).find('span.edit').removeClass('d-none');
$(node).find('span.cancel, span.submit').addClass('d-none');
});
});
}
#convertir2plantilla() {
if (this.convertToTemplate.getNombrePlantilla().length == 0) {
popErrorAlert(window.language.ClientePrecios.errors.error_nombre_template, 'error-nombre')
}
else {
new Ajax('/clientes/clienteplantillaprecios/add',
{
'from_client_data': 1,
'cliente_id': this.clienteId,
'nombre': this.convertToTemplate.getNombrePlantilla(),
[this.csrf_token]: this.csrf_hash
},
{},
(response) => {
if (response.id) {
this.selectorPlantilla.offChange();
this.selectorPlantilla.setOption(response.id, this.convertToTemplate.getNombrePlantilla());
this.selectorPlantilla.onChange(this.#changePlantilla.bind(this));
}
},
(error) => {
console.log(error);
}
).post();
}
}
#getPlantillaPrecios() {
new Ajax(
'/clienteprecios/getplantilla',
{
'cliente_id': this.clienteId,
[this.csrf_token]: this.csrf_hash
},
{},
(data) => {
if (data !== null && typeof data === 'object') {
if (data.hasOwnProperty('id') && data.id != null)
this.selectorPlantilla.setOption(data.id, data.nombre);
else {
this.selectorPlantilla.setOption(0, 'Personalizado');
}
}
else {
this.selectorPlantilla.setOption(0, 'Personalizado');
}
this.selectorPlantilla.onChange(this.#changePlantilla.bind(this));
},
(data) => {
this.selectorPlantilla.onChange(this.#changePlantilla.bind(this));
console.log(data);
}
).get();
}
#changePlantilla() {
const self = this;
const data = $('#plantillas').select2('data');
if (data.length > 0) {
if (data[0].id == 0) {
self.#borrarPlantillaTarifa(self.clienteId);
self.tableTarifas.table.clearPipeline();
self.tableTarifas.table.draw();
}
else {
const id = data[0].id;
new Ajax(
'/clienteprecios/changeplantilla',
{
'cliente_id': self.clienteId,
'plantilla_id': id,
[this.csrf_token]: this.csrf_hash
},
{},
() => {
self.tableTarifas.table.clearPipeline();
self.tableTarifas.table.draw();
},
(error) => {
console.log(error);
}
).post();
}
}
}
#borrarPlantillaTarifa(id) {
new Ajax(
'/clienteprecios/changeplantilla',
{
'cliente_id': id,
[this.csrf_token]: this.csrf_hash
},
{},
() => { },
(data) => {
console.log(data);
}
).post();
}
#initTable() {
const self = this;
const columns = [
{ 'data': 'id' },
{
'data': 'tipo',
'render': function (data, type, row, meta) {
if (data == 'interior')
return window.language.ClientePrecios.interior;
else if (data == 'cubierta')
return window.language.ClientePrecios.cubierta;
else if (data == 'sobrecubierta')
return window.language.ClientePrecios.sobrecubierta;
}
},
{
'data': 'tipo_maquina',
'render': function (data, type, row, meta) {
if (data == 'toner')
return window.language.ClientePrecios.toner;
else if (data == 'inkjet')
return window.language.ClientePrecios.inkjet;
}
},
{
'data': 'tipo_impresion',
'render': function (data, type, row, meta) {
if (data == 'negro')
return window.language.ClientePrecios.negro;
else if (data == 'negrohq')
return window.language.ClientePrecios.negrohq;
else if (data == 'color')
return window.language.ClientePrecios.color;
else if (data == 'colorhq')
return window.language.ClientePrecios.colorhq;
}
},
{ 'data': 'tiempo_min' },
{ 'data': 'tiempo_max' },
{ 'data': 'precio_hora' },
{ 'data': 'margen' },
{ 'data': 'user_updated' },
{ 'data': 'updated_at' },
{
'data': 'plantilla_id',
'searchable': false,
'visible': false,
},
];
this.tableTarifas = new Table(
$('#tableOfPrecios'),
'tarifasCliente',
'/clienteprecios/datatable',
columns,
[
{ name: 'cliente_id', value: window.location.href.split("/").pop() },
{ name: this.csrf_token, value: this.csrf_hash },
]
);
this.tableTarifas.init({
actions: self.actions,
buttonNewWithEditor: true,
buttonsExport: true,
editor: this.editorTarifas.editor,
});
this.tableTarifas.table.on('init.dt', function () {
self.tableTarifas.table.page.len(50).draw();
});
$('button[data-bs-target="#tarifascliente"]').on('shown.bs.tab', function (event) {
setTimeout(() => {
self.tableTarifas.table.columns.adjust().draw();
}, 1000); // Usamos setTimeout para asegurar que se dibuje después del renderizado
});
}
headerSearcher() {
const self = this;
$('#tableOfPrecios thead tr').clone(false).appendTo('#tableOfPrecios thead');
$('#tableOfPrecios thead tr:eq(1) th').each(function (i) {
if (!$(this).hasClass("noFilter")) {
if (i == 1) {
// Agregar un selector en la segunda columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="interior">Interior</option>');
selector.append('<option value="cubierta">Cubierta</option>');
selector.append('<option value="sobrecubierta">Sobrecubierta</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tableTarifas.table.column(i).search(val).draw();
});
}
else if (i == 2) {
// Agregar un selector en la tercera columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="toner">Toner</option>');
selector.append('<option value="inkjet">Inkjet</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tableTarifas.table.column(i).search(val).draw();
});
}
else if (i == 3) {
// Agregar un selector en la cuarta columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="negro">' + window.language.ClientePrecios.negro + '</option>');
selector.append('<option value="color">' + window.language.ClientePrecios.color + '</option>');
selector.append('<option value="negrohq">' + window.language.ClientePrecios.negrohq + '</option>');
selector.append('<option value="colorhq">' + window.language.ClientePrecios.colorhq + '</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tableTarifas.table.column(i).search(val).draw();
});
}
else {
$(this).html('<input type="text" class="form-control " style="min-width:100px;max-width:120px;font-size:0.8rem !important;" />');
$('input', this).on('change clear', function () {
if (self.tableTarifas.table.column(i).search() !== this.value) {
self.tableTarifas.table
.column(i)
.search(this.value)
.draw();
}
});
}
}
else {
$(this).html('<span></span>');
}
});
}
}
export default tarifasClienteView;

View File

@ -14,7 +14,7 @@ class MessagePage {
this.formNewDirectMessage = this.modalNewMessage.item.find("#formNewDirectMessage") this.formNewDirectMessage = this.modalNewMessage.item.find("#formNewDirectMessage")
this.alert = new Alert($("#alertDirectMessage")) this.alert = new Alert($("#alertDirectMessage"))
this.selectUsers = $("#select-users") this.selectUsers = $("#select-users")
this.selectUsers = $("#select-departments") this.selectDepartments = $("#select-departments")
this.selectPlaceholder = { this.selectPlaceholder = {
id: '0', id: '0',
@ -25,7 +25,7 @@ class MessagePage {
text: "Seleccione un departamento" text: "Seleccione un departamento"
} }
this.selectMessageUsers = new ClassSelect(this.selectUsers, '/chat/users/all', this.selectPlaceholder, true) this.selectMessageUsers = new ClassSelect(this.selectUsers, '/chat/users/all', this.selectPlaceholder, true)
this.selectChatDepartment = new ClassSelect(this.selectUsers, '/chat/department/select', this.selectDepartmentPlaceholder, true) this.selectChatDepartment = new ClassSelect(this.selectDepartments, '/chat/department/select', this.selectDepartmentPlaceholder, true)
} }
init() { init() {

View File

@ -0,0 +1,605 @@
import Table from '../../components/table.js';
import TableEditor from '../../components/tableEditor.js';
import ModalYesNo from '../../components/modalYesNo.js';
import Ajax from '../../components/ajax.js';
import { getToken } from '../../common/common.js';
class PlantillasTarifasClienteForm {
constructor() {
this.domItem = $('.card-body');
this.plantillaId = window.location.href.split("/").pop();
this.csrf_token = getToken();
this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val();
this.btnApply = $('#btnApply');
this.btnUndo = $('#btnUndo');
this.tablePlantilla = null;
this.modalYesNo = null;
this.localEditor = null;
this.ajaxEditor = null;
}
init() {
const self = this;
this.headerSearcher();
this.modalYesNo = new ModalYesNo(
"Aplicar los cambios afectarán a <b>TODOS</b> los clientes que tengan asociada esta plantilla de precios.<br>" +
"¿Esta seguro de que deseas aplicar los cambios?",
);
this.modalYesNo.init();
this.#initEditor();
this.#initTable();
// Editar en linea la fila
this.tablePlantilla.table.on('click', 'tbody span.edit', function (e) {
const row = $(this).closest('tr');
// Iniciar la edición en línea para todas las celdas de la fila
self.localEditor.editor.inline(
self.tablePlantilla.table.cells(row, '*').nodes(),
{
cancelHtml: '<a href="javascript:void(0);"><i class="ti ti-x"></i></a>',
submitHtml: '<a href="javascript:void(0);"><i class="ti ti-device-floppy"></i></a>',
cancelTrigger: row.find('span.cancel')[0],
submitTrigger: row.find('span.edit')[0],
submit: 'allIfChanged',
drawType: 'none'
}
);
});
this.tablePlantilla.table.on('click', '.btn-delete-' + this.tablePlantilla.getAlias(), function (e) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = false;
const row = $(this).attr('data-id');
self.btnApply.removeClass('d-none');
self.btnUndo.removeClass('d-none');
$('#' + row).css('background-color', '#ffcccc');
$('#' + row).addClass('row-deleted');
// find closest span.edit
$('#' + row).find('span.edit').addClass('d-none');
$('#' + row).find('.btn-delete-' + self.tablePlantilla.getAlias()).addClass('d-none');
});
this.btnApply.on('click', function (e) {
self.modalYesNo.show(self.#applyChanges.bind(self));
});
this.btnUndo.on('click', function (e) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = true;
self.tablePlantilla.table.clearPipeline();
self.tablePlantilla.table.draw();
self.btnApply.addClass('d-none');
self.btnUndo.addClass('d-none');
});
}
#initEditor() {
const self = this;
const tipo_linea = [
{ label: window.language.ClientePrecios.interior, value: 'interior' },
{ label: window.language.ClientePrecios.cubierta, value: 'cubierta' },
{ label: window.language.ClientePrecios.sobrecubierta, value: 'sobrecubierta' }
];
const tipo_maquina = [
{ label: window.language.ClientePrecios.toner, value: 'toner' },
{ label: window.language.ClientePrecios.inkjet, value: 'inkjet' },
];
const tipo_impresion = [
{ label: window.language.ClientePrecios.negro, value: 'negro' },
{ label: window.language.ClientePrecios.negrohq, value: 'negrohq' },
{ label: window.language.ClientePrecios.color, value: 'color' },
{ label: window.language.ClientePrecios.colorhq, value: 'colorhq' },
];
const editorFields = [
{
name: "id",
type: "readonly",
def: new Date().toISOString().slice(0, 19).replace('T', ' ')
}, {
name: "tipo",
type: "select",
options: tipo_linea
}, {
name: "tipo_maquina",
type: "select",
options: tipo_maquina
}, {
name: "tipo_impresion",
type: "select",
options: tipo_impresion
}, {
name: "tiempo_min"
}, {
name: "tiempo_max"
}, {
name: "precio_hora"
}, {
name: "margen"
}, {
name: "user_updated",
type: "hidden",
def: ''
}, {
name: "updated_at",
type: "hidden",
def: ''
}, {
name: "deleted_at",
type: "hidden",
}, {
name: "is_deleted",
type: "hidden",
}, {
name: "plantilla_id",
type: "hidden",
def: this.plantillaId
}
];
this.localEditor = new TableEditor(
$('#tableOfPlantillasPreciosLineas'),
'',
{},
'id',
editorFields);
this.localEditor.init();
this.ajaxEditor = new TableEditor(
$('#tableOfPlantillasPreciosLineas'),
'/clienteplantillaprecioslineas/datatable_editor',
{ [this.csrf_token]: this.csrf_hash },
'id',
editorFields);
this.ajaxEditor.init();
this.localEditor.editor.on('preCreate', function (e, d, type) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = false;
});
// add class and change background color of row in postCreate
this.localEditor.editor.on('postCreate', function (e, json, data) {
const row = self.tablePlantilla.table.row('#' + json.data[0].id);
let rowNode = row.node();
$(rowNode).addClass('row-created');
$(rowNode).css('background-color', '#C9E2C7');
self.btnApply.removeClass('d-none');
self.btnUndo.removeClass('d-none');
});
this.localEditor.editor.on('postEdit', function (e, json, data) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = false;
let row = self.tablePlantilla.table.row('#' + data.id);
let rowNode = row.node();
// Añadir una clase usando jQuery
if (!$(rowNode).hasClass('row-created')) {
$(rowNode).addClass('row-edited');
$(rowNode).css('background-color', '#E9DEAC');
}
if (row.length) {
// Actualizar los datos de la fila
self.tablePlantilla.table.row('#' + data.id).data({
id: data.id,
tipo: data.tipo,
tipo_maquina: data.tipo_maquina,
tipo_impresion: data.tipo_impresion,
tiempo_min: data.tiempo_min,
tiempo_max: data.tiempo_max,
precio_hora: data.precio_hora,
margen: data.margen,
user_updated_id: data.user_updated,
user_updated: data.user_updated,
updated_at: data.updated_at
});
self.btnApply.removeClass('d-none');
self.btnUndo.removeClass('d-none');
}
});
this.ajaxEditor.editor.on('preEdit', function (e, d, type) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = true;
});
this.ajaxEditor.editor.on('preCreate', function (e, d, type) {
self.tablePlantilla.table.settings()[0].oFeatures.bServerSide = true;
});
}
#applyChanges() {
const self = this;
const deletedRows = self.tablePlantilla.table.rows('.row-deleted').data().toArray();
const editedRows = self.tablePlantilla.table.rows('.row-edited').data().toArray();
const createdRows = self.tablePlantilla.table.rows('.row-created').data().toArray();
if (editedRows.length != 0) {
let error = self.#checkInterval(editedRows);
if (error) {
if (error == 1) {
popErrorAlert('Hay filas EDITADAS con el tiempo mínimo mayor que el tiempo máximo');
}
else if (error == 2) {
popErrorAlert('Hay filas EDITADAS con intervalos [Tiempo min., Tiempo max] solapados');
}
return;
}
}
if (createdRows.length != 0) {
let error = self.#checkInterval(editedRows);
if (error) {
if (error == 1) {
popErrorAlert('Hay filas CREADAS con el tiempo mínimo mayor que el tiempo máximo');
}
else if (error == 2) {
popErrorAlert('Hay filas CREADAS con intervalos [Tiempo min., Tiempo max] solapados');
}
return;
}
}
if (deletedRows.length != 0) {
let rowIds = deletedRows.map(row => '#' + row.id);
// Iterar sobre cada fila y actualizar los campos necesarios
self.ajaxEditor.editor
.edit(rowIds, false) // Editar múltiples filas (acepta un array)
.multiSet({
deleted_at: new Date().toISOString().slice(0, 19).replace('T', ' '),
is_deleted: 1
}) // Establecer valores comunes para todas las filas
.submit();
}
if (editedRows.length != 0) {
let rowIds = editedRows.map(row => '#' + row.id);
let updatedFields = {};
// Iterar sobre las filas editadas y construir el objeto actualizado
editedRows.forEach(row => {
updatedFields['tipo'] = updatedFields['tipo'] || {};
updatedFields['tipo'][row.id] = row.tipo;
updatedFields['tipo_maquina'] = updatedFields['tipo_maquina'] || {};
updatedFields['tipo_maquina'][row.id] = row.tipo_maquina;
updatedFields['tipo_impresion'] = updatedFields['tipo_impresion'] || {};
updatedFields['tipo_impresion'][row.id] = row.tipo_impresion;
updatedFields['tiempo_min'] = updatedFields['tiempo_min'] || {};
updatedFields['tiempo_min'][row.id] = row.tiempo_min;
updatedFields['tiempo_max'] = updatedFields['tiempo_max'] || {};
updatedFields['tiempo_max'][row.id] = row.tiempo_max;
updatedFields['precio_hora'] = updatedFields['precio_hora'] || {};
updatedFields['precio_hora'][row.id] = row.precio_hora;
updatedFields['margen'] = updatedFields['margen'] || {};
updatedFields['margen'][row.id] = row.margen;
});
self.ajaxEditor.editor.edit(rowIds, false).multiSet(updatedFields)
.submit()
}
if (createdRows.length != 0) {
let updatedFields = {};
let count = 0;
// Iterar sobre las filas editadas y construir el objeto actualizado
createdRows.forEach(row => {
updatedFields['id'] = updatedFields['id'] || {};
updatedFields['id'][row.id] = count;
updatedFields['tipo'] = updatedFields['tipo'] || {};
updatedFields['tipo'][count] = row.tipo;
updatedFields['tipo_maquina'] = updatedFields['tipo_maquina'] || {};
updatedFields['tipo_maquina'][count] = row.tipo_maquina;
updatedFields['tipo_impresion'] = updatedFields['tipo_impresion'] || {};
updatedFields['tipo_impresion'][count] = row.tipo_impresion;
updatedFields['tiempo_min'] = updatedFields['tiempo_min'] || {};
updatedFields['tiempo_min'][count] = row.tiempo_min;
updatedFields['tiempo_max'] = updatedFields['tiempo_max'] || {};
updatedFields['tiempo_max'][count] = row.tiempo_max;
updatedFields['precio_hora'] = updatedFields['precio_hora'] || {};
updatedFields['precio_hora'][count] = row.precio_hora;
updatedFields['margen'] = updatedFields['margen'] || {};
updatedFields['margen'][count] = row.margen;
updatedFields['plantilla_id'] = updatedFields['plantilla_id'] || {};
updatedFields['plantilla_id'][count] = self.plantillaId;
count++;
});
self.ajaxEditor.editor.create(createdRows.length, false).multiSet(updatedFields)
.submit()
}
if (deletedRows.length != 0 || editedRows.length != 0 || createdRows.length != 0) {
new Ajax(
'/clienteprecios/update',
{
[self.csrf_token]: self.csrf_hash,
plantilla_id: self.plantillaId
},
{},
() => {
window.location.reload();
},
(error) => {
console.log(error);
}
).post();
}
}
#checkInterval(rows) {
// obtener todas las filas de la tabla que no tengan la clase row-deleted
let rowsNotDeletedDT = this.tablePlantilla.table.rows(':not(.row-deleted)').nodes().toArray();
for (let row of rowsNotDeletedDT) {
let rowData = this.tablePlantilla.table.row(row).data();
for (let rowEdited of rows) {
if (rowEdited.tiempo_min > rowEdited.tiempo_max) {
return 1;
}
if (rowData.tipo == rowEdited.tipo && rowData.tipo_maquina == rowEdited.tipo_maquina && rowData.tipo_impresion == rowEdited.tipo_impresion) {
// check overlapping intervals
if (rowEdited.tiempo_min >= rowData.tiempo_min || rowEdited.tiempo_min <= rowData.tiempo_max) {
return 2;
}
}
}
}
return 0;
}
#initTable() {
const self = this;
const columns =
[
{ 'data': 'id' },
{
'data': 'tipo',
'render': function (data, type, row, meta) {
if (data == 'interior')
return window.language.ClientePrecios.interior;
else if (data == 'cubierta')
return window.language.ClientePrecios.cubierta;
else if (data == 'sobrecubierta')
return window.language.ClientePrecios.sobrecubierta;
}
},
{
'data': 'tipo_maquina',
'render': function (data, type, row, meta) {
if (data == 'toner')
return window.language.ClientePrecios.toner;
else if (data == 'inkjet')
return window.language.ClientePrecios.inkjet;
}
},
{
'data': 'tipo_impresion',
'render': function (data, type, row, meta) {
if (data == 'negro')
return window.language.ClientePrecios.negro;
else if (data == 'negrohq')
return window.language.ClientePrecios.negrohq;
else if (data == 'color')
return window.language.ClientePrecios.color;
else if (data == 'colorhq')
return window.language.ClientePrecios.colorhq;
}
},
{ 'data': 'tiempo_min' },
{ 'data': 'tiempo_max' },
{ 'data': 'precio_hora' },
{ 'data': 'margen' },
{ 'data': 'user_updated' },
{ 'data': 'updated_at' },
];
const actions = ['edit', 'delete', 'cancel'];
this.tablePlantilla = new Table(
$('#tableOfPlantillasPreciosLineas'),
'plantillaTarifasCliente',
'/clienteplantillaprecioslineas/datatable',
columns,
[
{ name: 'plantilla_id', value: this.plantillaId }
], 'id'
);
this.tablePlantilla.init({
actions: actions,
colVisibility: false,
buttonsExport: true,
buttonNewWithEditor: true,
editor: self.localEditor.editor,
});
this.tablePlantilla.table.on('init.dt', function () {
self.tablePlantilla.table.page.len(50).draw();
});
}
headerSearcher() {
const self = this;
$('#tableOfPlantillasPreciosLineas thead tr').clone(false).appendTo('#tableOfPlantillasPreciosLineas thead');
$('#tableOfPlantillasPreciosLineas thead tr:eq(1) th').each(function (i) {
if (!$(this).hasClass("noFilter")) {
if (i == 1) {
// Agregar un selector en la segunda columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="interior">Interior</option>');
selector.append('<option value="cubierta">Cubierta</option>');
selector.append('<option value="sobrecubierta">Sobrecubierta</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tablePlantilla.table.column(i).search(val).draw();
});
}
else if (i == 2) {
// Agregar un selector en la tercera columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="toner">Toner</option>');
selector.append('<option value="inkjet">Inkjet</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tablePlantilla.table.column(i).search(val).draw();
});
}
else if (i == 3) {
// Agregar un selector en la cuarta columna
$(this).html('<select class="form-control" style="min-width:100px;max-width:120px;font-size:0.8rem !important;"></select>');
// Agregar opciones al selector
var selector = $('select', this);
selector.append('<option value="">Todos</option>'); // Opción vacía
selector.append('<option value="negro">' + window.language.ClientePrecios.negro + '</option>');
selector.append('<option value="color">' + window.language.ClientePrecios.color + '</option>');
selector.append('<option value="negrohq">' + window.language.ClientePrecios.negrohq + '</option>');
selector.append('<option value="colorhq">' + window.language.ClientePrecios.colorhq + '</option>');
selector.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
self.tablePlantilla.table.column(i).search(val).draw();
});
}
else {
$(this).html('<input type="text" class="form-control " style="min-width:100px;max-width:120px;font-size:0.8rem !important;" />');
$('input', this).on('change clear', function () {
if (self.tablePlantilla.table.column(i).search() !== this.value) {
self.tablePlantilla.table
.column(i)
.search(this.value)
.draw();
}
});
}
}
else {
$(this).html('<span></span>');
}
});
}
}
document.addEventListener('DOMContentLoaded', function () {
const locale = document.querySelector('meta[name="locale"]').getAttribute('content');
new Ajax('/translate/getTranslation', { locale: locale, translationFile: ['ClientePrecios'] }, {},
function (translations) {
window.language = JSON.parse(translations);
new PlantillasTarifasClienteForm().init();
},
function (error) {
console.log("Error getting translations:", error);
}
).post();
});

View File

@ -0,0 +1,153 @@
import Table from '../../components/table.js';
import ConfirmDeleteModal from '../../components/ConfirmDeleteModal.js';
import Ajax from '../../components/ajax.js';
import { getToken } from '../../common/common.js';
class PlantillasTarifasClienteList {
constructor() {
this.domItem = $('.card-body');
this.csrf_token = getToken();
this.csrf_hash = $('#mainContainer').find('input[name="' + this.csrf_token + '"]').val();
this.tablePlantillas = null;
this.deleteModal = null;
}
init() {
const self = this;
this.headerSearcher();
this.deleteModal = new ConfirmDeleteModal('plantillasTarifasCliente');
this.deleteModal.init();
this.#initTable();
// Editar en linea la fila
this.tablePlantillas.table.on('click', '.btn-edit-' + this.tablePlantillas.getAlias(), function (e) {
const dataId = $(this).attr('data-id');
if (!Number.isNaN(Number(dataId))) {
window.location.href = '/clienteplantillaprecios/edit/' + dataId;
}
});
// Eliminar la fila
this.tablePlantillas.table.on('click', '.btn-delete-' + this.tablePlantillas.getAlias(), function (e) {
const row = $(this).closest('tr')[0]._DT_RowIndex;
const dataId = $(this).attr('data-id');
self.deleteModal.setData($(this).attr('data-id'));
self.deleteModal.show(() => {
if (!Number.isNaN(Number(self.deleteModal.getData()))) {
new Ajax(
'/clienteplantillaprecios/delete/' + dataId,
{
},
{},
(data, textStatus, jqXHR) => {
self.tablePlantillas.table.clearPipeline();
self.tablePlantillas.table.row($(row)).invalidate().draw();
// Se borran las lineas asociadas
new Ajax(
"/clientes/clienteplantillaprecios/update/" + dataId,
{
[this.csrf_token]: this.csrf_hash
},
{},
() => { },
(error) => {
console.log(error);
}).post();
popSuccessAlert(data.msg ?? jqXHR.statusText);
},
(error) => {
console.log(error);
}
).get();
self.deleteModal.hide();
}
});
});
}
#initTable() {
const self = this;
const columns = [
{ 'data': 'id' },
{ 'data': 'nombre' },
];
const actions = ['edit', 'delete'];
this.tablePlantillas = new Table(
$('#tableOfClienteplantillaprecios'),
'plantillasTarifasCliente',
'/clienteplantillaprecios/datatable',
columns,
[]
);
this.tablePlantillas.init({
actions: actions,
colVisibility: false,
buttonsExport: true,
});
this.tablePlantillas.table.on('init.dt', function () {
self.tablePlantillas.table.page.len(50).draw();
});
}
headerSearcher() {
const self = this;
$('#tableOfClienteplantillaprecios thead tr').clone(false).appendTo('#tableOfClienteplantillaprecios thead');
$('#tableOfClienteplantillaprecios thead tr:eq(1) th').each(function (i) {
if (!$(this).hasClass("noFilter")) {
$(this).html('<input type="text" class="form-control " style="min-width:100px;max-width:500px;font-size:0.8rem !important;" />');
$('input', this).on('change clear', function () {
if (self.tablePlantillas.table.column(i).search() !== this.value) {
self.tablePlantillas.table
.column(i)
.search(this.value)
.draw();
}
});
}
else {
$(this).html('<span></span>');
}
});
}
}
document.addEventListener('DOMContentLoaded', function () {
new PlantillasTarifasClienteList().init();
});

View File

@ -572,8 +572,8 @@ class DatosGenerales {
this.pagColorConsecutivas.prop('checked', datos.paginasColorConsecutivas); this.pagColorConsecutivas.prop('checked', datos.paginasColorConsecutivas);
if (datos.paginasColorConsecutivas) { if (datos.paginasColorConsecutivas) {
this.divPapelDiferente.removeClass('d-none'); //this.divPapelDiferente.removeClass('d-none');
this.papelDiferente.prop('checked', datos.papelInteriorDiferente).trigger('change'); //this.papelDiferente.prop('checked', datos.papelInteriorDiferente).trigger('change');
} }
this.posPaginasColor.val(datos.posPaginasColor); this.posPaginasColor.val(datos.posPaginasColor);
@ -727,6 +727,8 @@ class DatosGenerales {
} }
// Para recalcular el presupuesto // Para recalcular el presupuesto
$('#divGramajeInterior').empty();
$('#divGramajeInteriorColor').empty();
element.trigger('change'); element.trigger('change');
} }
@ -792,11 +794,11 @@ class DatosGenerales {
#handPaginasConsecutivas() { #handPaginasConsecutivas() {
if (this.pagColorConsecutivas.is(':checked')) { if (this.pagColorConsecutivas.is(':checked')) {
this.divPapelDiferente.removeClass('d-none'); //this.divPapelDiferente.removeClass('d-none');
} }
else { else {
this.divPapelDiferente.addClass('d-none'); /*this.divPapelDiferente.addClass('d-none');
this.papelDiferente.prop('checked', false); this.papelDiferente.prop('checked', false);*/
} }
} }

View File

@ -42,15 +42,6 @@ class DisenioInterior {
this.colorPremium_color = this.domItem.find("#colorPremiumColor"); this.colorPremium_color = this.domItem.find("#colorPremiumColor");
this.gramaje_color = this.domItem.find(".check-interior-color-gramaje"); this.gramaje_color = this.domItem.find(".check-interior-color-gramaje");
this.gramaje70_color = this.domItem.find("#interiorGramaje70Color");
this.gramaje80_color = this.domItem.find("#interiorGramaje80Color");
this.gramaje90_color = this.domItem.find("#interiorGramaje90Color");
this.gramaje100_color = this.domItem.find("#interiorGramaje100Color");
this.gramaje115_color = this.domItem.find("#interiorGramaje115Color");
this.gramaje120_color = this.domItem.find("#interiorGramaje120Color");
this.gramaje135_color = this.domItem.find("#interiorGramaje135Color");
this.gramaje150_color = this.domItem.find("#interiorGramaje150Color");
this.gramaje170_color = this.domItem.find("#interiorGramaje170Color");
this.checksGramaje = $('.gramaje-interior'); this.checksGramaje = $('.gramaje-interior');
@ -121,6 +112,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
tipo: this.getTipoImpresion(), tipo: this.getTipoImpresion(),
cubierta: 0, cubierta: 0,
}, },
@ -135,6 +127,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
tipo: this.getTipoImpresion(), tipo: this.getTipoImpresion(),
cubierta: 0, cubierta: 0,
}, },
@ -859,6 +852,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
papel: papel, papel: papel,
tipo: tipo, tipo: tipo,
cubierta: 0, cubierta: 0,
@ -886,6 +880,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
papel: this.papelInterior, papel: this.papelInterior,
tipo: tipo, tipo: tipo,
cubierta: 0, cubierta: 0,
@ -931,6 +926,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
papel: papel, papel: papel,
tipo: tipo, tipo: tipo,
cubierta: 0, cubierta: 0,
@ -954,6 +950,7 @@ class DisenioInterior {
new Ajax('/papelesgenericos/getpapelcliente', new Ajax('/papelesgenericos/getpapelcliente',
{ {
[this.csrf_token]: this.csrf_hash, [this.csrf_token]: this.csrf_hash,
tirada: $('#tirada').val(),
papel: this.papelInterior, papel: this.papelInterior,
tipo: tipo, tipo: tipo,
cubierta: 0, cubierta: 0,

View File

@ -44,7 +44,8 @@ class PresupuestoCliente {
this.datos = {}; this.datos = {};
this.ajax_calcular = new Ajax('/presupuestocliente/calcular', this.ajax_calcular = new Ajax('/presupuestocliente/calcular',
{}, this.datos, this.datos,
{},
this.#procesarPresupuesto.bind(this), this.#procesarPresupuesto.bind(this),
() => { $('#loader').modal('hide'); }); () => { $('#loader').modal('hide'); });