diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index ba3b7bf9..6de7cb2f 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -113,6 +113,7 @@ $routes->group('users', ['namespace' => 'App\Controllers\Configuracion'], functi $routes->get('delete/(:num)', 'Users::delete/$1', ['as' => 'deleteUser']); $routes->post('allmenuitems', 'Users::allItemsSelect', ['as' => 'select2ItemsOfUsers']); $routes->post('menuitems', 'Users::menuItems', ['as' => 'menuItemsOfUsers']); + $routes->post('datatable', 'Users::datatable', ['as' => 'datatableOfUsers']); $routes->get('getMenuComerciales', 'Users::getMenuComerciales', ['as' => 'menuItemsComerciales']); }); $routes->resource('users', ['namespace' => 'App\Controllers\Configuracion', 'controller' => 'Users', 'except' => 'show,new,create,update']); @@ -263,6 +264,8 @@ $routes->resource('papelesimpresionmargenes', ['namespace' => 'App\Controllers\C $routes->group('maquinas', ['namespace' => 'App\Controllers\Configuracion'], function ($routes) { $routes->get('', 'Maquinas::index', ['as' => 'maquinaList']); $routes->get('add', 'Maquinas::add', ['as' => 'newMaquina']); + $routes->get('edit/(:num)', 'Maquinas::edit/$1'); + $routes->get('delete/(:num)', 'Maquinas::delete/$1'); $routes->post('add', 'Maquinas::add', ['as' => 'createMaquina']); $routes->post('create', 'Maquinas::create', ['as' => 'ajaxCreateMaquina']); $routes->put('update/(:num)', 'Maquinas::update/$1', ['as' => 'ajaxUpdateMaquina']); @@ -428,11 +431,15 @@ $routes->resource('clienteplantillaprecios', ['namespace' => 'App\Controllers\Cl $routes->group('clienteplantillaprecioslineas', ['namespace' => 'App\Controllers\Clientes'], function ($routes) { $routes->post('datatable', 'Clienteplantillaprecioslineas::datatable', ['as' => 'dataTableOfClientesplantillaprecioslineas']); $routes->post('datatable_editor', 'Clienteplantillaprecioslineas::datatable_editor', ['as' => 'editorOfClienteplantillaprecioslineas']); + $routes->post('getrows', 'Clienteplantillaprecioslineas::getStoredRows', ['as' => 'getStoredRowsOfClienteplantillaprecioslineas']); }); $routes->resource('clienteplantillaprecioslineas', ['namespace' => 'App\Controllers\Clientes', 'controller' => 'clienteplantillaprecioslineas', 'except' => 'show,new,create,update']); $routes->group('clienteusuarios', ['namespace' => 'App\Controllers\Clientes'], function ($routes) { $routes->post('datatable', 'Clienteusuarios::datatable', ['as' => 'dataTableOfClienteUsuarios']); + $routes->post('adduser', 'Clienteusuarios::addUserToClient'); + $routes->get('delete/(:num)', 'Clienteusuarios::removeClienteFromUser/$1'); + $routes->get('getusers', 'Clienteusuarios::getAvailableUsers'); }); @@ -607,6 +614,7 @@ $routes->group('serviciosacabados', ['namespace' => 'App\Controllers\Presupuesto $routes->post('datatable', 'Presupuestoacabados::datatable', ['as' => 'dataTableOfPresupuestoAcabados']); $routes->post('menuitems', 'Presupuestoacabados::menuItems', ['as' => 'menuItemsOfPresupuestoAcabados']); $routes->post('edit/(:num)', 'Presupuestoacabados::edit/$1', ['as' => 'updatePresupuestoacabados']); + $routes->get('getacabados', 'Presupuestoacabados::getAcabados'); }); $routes->group('serviciosencuadernaciones', ['namespace' => 'App\Controllers\Presupuestos'], function ($routes) { @@ -799,6 +807,11 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route $routes->get('direct/conversation/(:num)', 'ChatController::get_chat_direct/$1', ['as' => 'getChatDirect']); $routes->get('direct/users/select/(:num)', 'ChatController::get_chat_direct_select_users/$1', ['as' => 'getChatDirectSelectUsers']); + + $routes->get('direct/client/users/select/presupuesto/(:num)', 'ChatController::get_presupuesto_client_users/$1/$2', ['as' => 'getPresupuestoClientUsers']); + $routes->get('direct/client/users/select/pedido/(:num)', 'ChatController::get_pedido_client_users/$1/$2', ['as' => 'getPedidoClientUsers']); + $routes->get('direct/client/users/select/factura/(:num)', 'ChatController::get_factura_client_users/$1/$2', ['as' => 'getFacturaClientUsers']); + $routes->get('direct/users/(:num)', 'ChatController::get_chat_direct_users', ['as' => 'getChatDirectUsers']); $routes->post('direct/users/(:num)', 'ChatController::store_chat_direct_users/$1', ['as' => 'storeChatDirectUsers']); $routes->get('direct/messages/(:num)', 'ChatController::get_chat_direct_messages/$1', ['as' => 'getChatDirectMessages']); diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php index 3526b6da..854f562b 100644 --- a/ci4/app/Controllers/Chat/ChatController.php +++ b/ci4/app/Controllers/Chat/ChatController.php @@ -10,6 +10,9 @@ use App\Models\Chat\ChatModel; use App\Models\ChatNotification; use App\Models\ChatUser; use App\Models\Clientes\ClienteModel; +use App\Models\Facturas\FacturaModel; +use App\Models\Pedidos\PedidoModel; +use App\Models\Presupuestos\PresupuestoModel; use App\Models\Usuarios\UserModel; use App\Services\MessageService; use CodeIgniter\HTTP\ResponseInterface; @@ -396,6 +399,72 @@ class ChatController extends BaseController return $this->response->setJSON($query->get()->getResultObject()); } + public function get_presupuesto_client_users(int $presupuesto_id) + { + $pm = model(PresupuestoModel::class); + $p = $pm->find($presupuesto_id); + $query = $this->userModel->builder()->select( + [ + "id", + "CONCAT(first_name,' ',last_name,'(',username,')') as name" + ] + ) + ->where("deleted_at", null) + ->whereNotIn("id", [auth()->user()->id]) + ->where("cliente_id",$p->cliente_id); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("users.username", $this->request->getGet("q")) + ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q")) + ->groupEnd(); + } + + return $this->response->setJSON($query->get()->getResultObject()); + } + public function get_pedido_client_users(int $pedido_id) + { + $pm = model(PedidoModel::class); + $p = $pm->find($pedido_id); + $query = $this->userModel->builder()->select( + [ + "id", + "CONCAT(first_name,' ',last_name,'(',username,')') as name" + ] + ) + ->where("deleted_at", null) + ->whereNotIn("id", [auth()->user()->id]) + ->where("cliente_id",$p->cliente()->id); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("users.username", $this->request->getGet("q")) + ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q")) + ->groupEnd(); + } + + return $this->response->setJSON($query->get()->getResultObject()); + } + public function get_factura_client_users(int $factura_id) + { + $fm = model(FacturaModel::class); + $f = $fm->find($factura_id); + $query = $this->userModel->builder()->select( + [ + "id", + "CONCAT(first_name,' ',last_name,'(',username,')') as name" + ] + ) + ->where("deleted_at", null) + ->whereNotIn("id", [auth()->user()->id]) + ->where("cliente_id",$f->cliente_id); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("users.username", $this->request->getGet("q")) + ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q")) + ->groupEnd(); + } + + return $this->response->setJSON($query->get()->getResultObject()); + } public function store_hebra_presupuesto() { $auth_user = auth()->user(); diff --git a/ci4/app/Controllers/Clientes/Cliente.php b/ci4/app/Controllers/Clientes/Cliente.php index f388ec1f..970118d9 100755 --- a/ci4/app/Controllers/Clientes/Cliente.php +++ b/ci4/app/Controllers/Clientes/Cliente.php @@ -250,11 +250,20 @@ class Cliente extends \App\Controllers\BaseResourceController $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; $search = $reqData['search']['value']; - $requestedOrder = $reqData['order']['0']['column'] ?? 1; - $order = ClienteModel::SORTABLE[$requestedOrder > 0 ? $requestedOrder : 1]; - $dir = $reqData['order']['0']['dir'] ?? 'asc'; + $searchValues = get_filter_datatables_columns($reqData); + $requestedOrder = $reqData['order'] ?? []; - $resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); + $resourceData = $this->model->getResource($searchValues); + foreach ($requestedOrder as $order) { + $column = $order['column'] ?? 0; + $dir = $order['dir'] ?? 'asc'; + $orderColumn = ClienteModel::SORTABLE[$column] ?? null; + if ($orderColumn) { + $resourceData->orderBy($orderColumn, $dir); + } + } + $resourceData = $resourceData->limit($length, $start)->get()->getResultObject(); + foreach ($resourceData as $item) : if (isset($item->direccion) && strlen($item->direccion) > 100) : $item->direccion = character_limiter($item->direccion, 100); @@ -273,7 +282,7 @@ class Cliente extends \App\Controllers\BaseResourceController return $this->respond(Collection::datatable( $resourceData, $this->model->getResource()->countAllResults(), - $this->model->getResource($search)->countAllResults() + $this->model->getResource($searchValues)->countAllResults() )); } else { return $this->failUnauthorized('Invalid request', 403); diff --git a/ci4/app/Controllers/Clientes/Clienteplantillaprecioslineas.php b/ci4/app/Controllers/Clientes/Clienteplantillaprecioslineas.php index 4e933a3a..d0b4d98a 100755 --- a/ci4/app/Controllers/Clientes/Clienteplantillaprecioslineas.php +++ b/ci4/app/Controllers/Clientes/Clienteplantillaprecioslineas.php @@ -120,6 +120,26 @@ class Clienteplantillaprecioslineas extends \App\Controllers\BaseResourceControl } } + + public function getStoredRows() + { + if ($this->request->isAJAX()) { + $reqData = $this->request->getPost(); + $plantilla_id = $reqData['plantilla_id'] ?? 0; + + $resourceData = $this->model->getResource([], $plantilla_id); + $resourceData = $resourceData->get()->getResultObject(); + + return $this->respond(Collection::datatable( + $resourceData, + $this->model->getResource([], $plantilla_id)->countAllResults(), + $this->model->getResource([], $plantilla_id)->countAllResults() + )); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function datatable_editor() { if ($this->request->isAJAX()) { @@ -178,26 +198,6 @@ class Clienteplantillaprecioslineas extends \App\Controllers\BaseResourceControl ), ) - ->validator(function ($editor, $action, $data) { - if ($action === Editor::ACTION_CREATE || $action === Editor::ACTION_EDIT) { - foreach ($data['data'] as $pkey => $values) { - // Si no se quiere borrar... - if ($data['data'][$pkey]['is_deleted'] != 1) { - $process_data['tiempo_min'] = $data['data'][$pkey]['tiempo_min']; - $process_data['tiempo_max'] = $data['data'][$pkey]['tiempo_max']; - $process_data['tipo'] = $data['data'][$pkey]['tipo']; - $process_data['tipo_maquina'] = $data['data'][$pkey]['tipo_maquina']; - $process_data['tipo_impresion'] = $data['data'][$pkey]['tipo_impresion']; - - $response = $this->model->checkIntervals($process_data, $pkey, $data['data'][$pkey]['plantilla_id']); - // No se pueden duplicar valores al crear o al editar - if (!empty($response)) { - return $response; - } - } - } - } - }) ->on('preCreate', function ($editor, &$values) { $datetime = (new \CodeIgniter\I18n\Time("now")); $editor diff --git a/ci4/app/Controllers/Clientes/Clienteusuarios.php b/ci4/app/Controllers/Clientes/Clienteusuarios.php index 8e2cdaac..ba0c9952 100644 --- a/ci4/app/Controllers/Clientes/Clienteusuarios.php +++ b/ci4/app/Controllers/Clientes/Clienteusuarios.php @@ -1,4 +1,5 @@ -request->isAJAX()) { + if (intval($user_id) > 0) { + $this->model->removeClienteFromUser($user_id); + return $this->respond(['status' => 'success', 'msg' => 'Usuario eliminado correctamente']); + } + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function addUserToClient(){ + + if ($this->request->isAJAX()) { + $user_id = $this->request->getPost("user_id"); + $cliente_id = $this->request->getPost("cliente_id"); + if (intval($user_id) > 0 && intval($cliente_id) > 0) { + $this->model->addUserToClient($user_id, $cliente_id); + return $this->respond(['status' => 'success', 'msg' => 'Usuario añadido correctamente']); + } + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function getAvailableUsers() + { + if ($this->request->isAJAX()) { + $query = $this->model->builder()->select( + [ + "id", + "CONCAT(first_name, ' ', last_name) as name" + ] + ) + ->where("deleted_at", null) + ->where("cliente_id", null); + + if ($this->request->getGet("q")) { + $column = "CONCAT(first_name, ' ', last_name)"; + $value = $this->request->getGet("q"); + $query->groupStart() + ->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%") + ->groupEnd(); + } + + $items = $query->get()->getResultObject(); + return $this->response->setJSON($items); + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } public function datatable() @@ -53,14 +107,19 @@ class Clienteusuarios extends \App\Controllers\BaseResourceController } $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; - $search = $reqData['search']['value']; - $requestedOrder = $reqData['order']['0']['column'] ?? 1; - $order = ClienteUsuariosModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 1]; - $dir = $reqData['order']['0']['dir'] ?? 'asc'; - + $requestedOrder = $reqData['order'] ?? []; $id_C = $reqData['id_cliente'] ?? -1; - $resourceData = $this->model->getResource("", $id_C)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); + $resourceData = $this->model->getResource("", $id_C); + foreach ($requestedOrder as $order) { + $column = $order['column'] ?? 0; + $dir = $order['dir'] ?? 'asc'; + $orderColumn = ClienteUsuariosModel::SORTABLE[$column] ?? null; + if ($orderColumn) { + $resourceData->orderBy($orderColumn, $dir); + } + } + $resourceData = $resourceData->limit($length, $start)->get()->getResultObject(); return $this->respond(Collection::datatable( $resourceData, diff --git a/ci4/app/Controllers/Configuracion/Maquinas.php b/ci4/app/Controllers/Configuracion/Maquinas.php index 65166b70..8deac302 100755 --- a/ci4/app/Controllers/Configuracion/Maquinas.php +++ b/ci4/app/Controllers/Configuracion/Maquinas.php @@ -1,4 +1,5 @@ -respond(['status' => 'error', 'msg' => 'ID no válida']); + } + + // Buscar la máquina en la base de datos + $maquina = $this->model->find($id); + if (!$maquina) { + $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Maquinas.maquina')), $id]); + return $this->respond(['status' => 'error', 'msg' => 'ID no válida']); + } + + // Verificar que el usuario está autenticado + if (!auth()->user()) { + return $this->respond(['status' => 'error', 'msg' => 'Usuario no autenticado']); + } + + // Preparar los datos para actualizar + $data = [ + 'id' => $id, + 'is_deleted' => 1, + 'deleted_at' => date('Y-m-d H:i:s'), + 'user_updated_id' => auth()->user()->id, + ]; + + // Guardar los cambios + if (!$this->model->save($data)) { + return $this->respond(['status' => 'error', 'msg' => 'Error al eliminar']); + } + + // Retornar éxito + $message = lang('Basic.global.deleteSuccess', [lang('Basic.global.record')]) . '.'; + return $this->respond(['status' => 'error', 'msg' => $message]); + } + public function add() { - - - - - if ($this->request->getPost()) : + if ($this->request->getPost()): $nullIfEmpty = true; // !(phpversion() >= '8.1'); @@ -84,10 +121,10 @@ class Maquinas extends \App\Controllers\BaseResourceController $sanitizedData['user_created_id'] = auth()->user()->id; $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 { $successfulResult = $this->model->skipValidation(true)->save($sanitizedData); } catch (\Exception $e) { @@ -101,14 +138,14 @@ class Maquinas extends \App\Controllers\BaseResourceController $thenRedirect = true; // Change this to false if you want your user to stay on the form after submission endif; - if ($noException && $successfulResult) : + if ($noException && $successfulResult): $id = $this->model->db->insertID(); $message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.'; - if ($thenRedirect) : - if (!empty($this->indexRoute)) : + if ($thenRedirect): + if (!empty($this->indexRoute)): //return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); return redirect()->to(site_url('configuracion/maquinas/edit/' . $id))->with('sweet-success', $message); else: @@ -138,20 +175,20 @@ class Maquinas extends \App\Controllers\BaseResourceController { - if ($requestedId == null) : + if ($requestedId == null): return $this->redirect2listView(); endif; $id = filter_var($requestedId, FILTER_SANITIZE_URL); $maquina = $this->model->find($id); - if ($maquina == false) : + if ($maquina == false): $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Maquinas.maquina')), $id]); return $this->redirect2listView('sweet-error', $message); endif; - - if ($this->request->getPost()) : + + if ($this->request->getPost()): $nullIfEmpty = true; // !(phpversion() >= '8.1'); @@ -171,17 +208,19 @@ class Maquinas extends \App\Controllers\BaseResourceController // JJO $sanitizedData['user_updated_id'] = auth()->user()->id; $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()): //JJO: comprobar alto y ancho impresion < alto y ancho if ($sanitizedData['alto'] < $sanitizedData['alto_impresion']) { $successfulResult = false; - $this->viewData['errorMessage'] = lang('Maquinas.validation.alto_menor_alto_impresion');; + $this->viewData['errorMessage'] = lang('Maquinas.validation.alto_menor_alto_impresion'); + ; $this->session->setFlashdata('formErrors', $this->model->errors()); } else if ($sanitizedData['ancho'] < $sanitizedData['ancho_impresion']) { $successfulResult = false; - $this->viewData['errorMessage'] = lang('Maquinas.validation.ancho_menor_ancho_impresion');; + $this->viewData['errorMessage'] = lang('Maquinas.validation.ancho_menor_ancho_impresion'); + ; $this->session->setFlashdata('formErrors', $this->model->errors()); } else { try { @@ -202,12 +241,12 @@ class Maquinas extends \App\Controllers\BaseResourceController $thenRedirect = false; endif; - if ($noException && $successfulResult) : + if ($noException && $successfulResult): $id = $maquina->id ?? $id; $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.'; - if ($thenRedirect) : - if (!empty($this->indexRoute)) : + if ($thenRedirect): + if (!empty($this->indexRoute)): return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); else: return $this->redirect2listView('sweet-success', $message); @@ -243,22 +282,24 @@ class Maquinas extends \App\Controllers\BaseResourceController } $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; - $search = $reqData['search']['value']; - $requestedOrder = $reqData['order']['0']['column'] ?? 1; - $order = MaquinaModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 1]; - $dir = $reqData['order']['0']['dir'] ?? 'asc'; + $searchValues = get_filter_datatables_columns($reqData); + $requestedOrder = $reqData['order'] ?? []; - $resourceData = $this->model->getResource($search)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject(); - foreach ($resourceData as $item) : - if (isset($item->observaciones) && strlen($item->observaciones) > 100) : - $item->observaciones = character_limiter($item->observaciones, 100); - endif; - endforeach; + $resourceData = $this->model->getResource($searchValues); + foreach ($requestedOrder as $order) { + $column = $order['column'] ?? 0; + $dir = $order['dir'] ?? 'asc'; + $orderColumn = MaquinaModel::SORTABLE[$column] ?? null; + if ($orderColumn) { + $resourceData->orderBy($orderColumn, $dir); + } + } + $resourceData = $resourceData->limit($length, $start)->get()->getResultObject(); return $this->respond(Collection::datatable( $resourceData, - $this->model->getResource()->countAllResults(), - $this->model->getResource($search)->countAllResults() + $this->model->getResource([])->countAllResults(), + $this->model->getResource($searchValues)->countAllResults() )); } else { return $this->failUnauthorized('Invalid request', 403); @@ -319,11 +360,11 @@ class Maquinas extends \App\Controllers\BaseResourceController protected function getMaquinaListItems($selId = null) { $data = ['' => lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Maquinas.maquina'))])]; - if (!empty($selId)) : + if (!empty($selId)): $maquinaModel = model('App\Models\Configuracion\MaquinaModel'); $selOption = $maquinaModel->where('id', $selId)->findColumn('nombre'); - if (!empty($selOption)) : + if (!empty($selOption)): $data[$selId] = $selOption[0]; endif; endif; diff --git a/ci4/app/Controllers/Configuracion/Users.php b/ci4/app/Controllers/Configuracion/Users.php index 7864620f..8fcc153e 100755 --- a/ci4/app/Controllers/Configuracion/Users.php +++ b/ci4/app/Controllers/Configuracion/Users.php @@ -7,6 +7,8 @@ use App\Models\Usuarios\GroupModel; use App\Models\UserModel; use App\Models\Usuarios\GroupsUsersModel; +use App\Models\Collection; + use CodeIgniter\Shield\Entities\User; use function PHPUnit\Framework\isNull; @@ -22,7 +24,8 @@ class Users extends \App\Controllers\GoBaseController use \CodeIgniter\API\ResponseTrait; - protected static $primaryModelName = 'App\Models\UserModel'; + protected static $primaryModelName = UserModel::class; + protected $modelName = ClientePlantillaPreciosLineasModel::class; protected static $singularObjectNameCc = 'user'; protected static $singularObjectName = 'User'; @@ -58,10 +61,8 @@ class Users extends \App\Controllers\GoBaseController public function index() { - $this->viewData['usingClientSideDataTable'] = true; + $this->viewData['usingServerSideDataTable'] = true; $this->viewData['pageSubTitle'] = lang('Basic.global.ManageAllRecords', [lang('Users.user')]); - $this->viewData['user_model'] = $this->user_model; - $this->viewData['userList2'] = auth()->getProvider()->findAll(); parent::index(); } @@ -313,8 +314,10 @@ class Users extends \App\Controllers\GoBaseController return $this->redirect2listView('errorMessage', $message); endif; + $this->chat_department_user_model->where("user_id", $id)->delete(); + $users = auth()->getProvider(); - $users->delete($user->id, true); + $users->delete($user->id); $message = "Usuario eliminado correctamente"; return $this->redirect2listView('successMessage', $message); @@ -373,6 +376,43 @@ class Users extends \App\Controllers\GoBaseController } } + public function datatable(){ + + if($this->request->isAJAX()){ + + $reqData = $this->request->getPost(); + if (!isset($reqData['draw']) || !isset($reqData['columns'])) { + $errstr = 'No data available in response to this specific request.'; + $response = $this->respond(Collection::datatable([], 0, 0, $errstr), 400, $errstr); + return $response; + } + $start = $reqData['start'] ?? 0; + $length = $reqData['length'] ?? 5; + $searchValues = get_filter_datatables_columns($reqData); + $requestedOrder = $reqData['order'] ?? []; + + $resourceData = $this->model->getResource($searchValues); + foreach ($requestedOrder as $order) { + $column = $order['column'] ?? 0; + $dir = $order['dir'] ?? 'asc'; + $orderColumn = UserModel::SORTABLE[$column] ?? null; + if ($orderColumn) { + $resourceData->orderBy($orderColumn, $dir); + } + } + $resourceData = $resourceData->limit($length, $start)->get()->getResultObject(); + + return $this->respond(Collection::datatable( + $resourceData, + $this->model->getResource([])->countAllResults(), + $this->model->getResource($searchValues)->countAllResults() + )); + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function getMenuComerciales() { if ($this->request->isAJAX()) { diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php index 48fa392c..18dc5743 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php @@ -1,4 +1,5 @@ -request->getJSON(); - if(count($postData->datos)>0){ + if (count($postData->datos) > 0) { $this->model->deleteServiciosNotInArray($requestedId, $postData->datos); - } - else{ + } else { $this->model->deleteAllServicios($requestedId); } - if(count($postData->datos)>0){ + if (count($postData->datos) > 0) { $this->model->updateTarifas($requestedId, $postData->datos); } @@ -58,14 +58,14 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $data = [ $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); } public function update($requestedId = null) { - if ($requestedId == null) : + if ($requestedId == null): return; endif; @@ -75,20 +75,20 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $POD = $postData->POD ?? 0; $result = []; - if(count($tarifas)>0){ - foreach ($tarifas as $tarifa){ + if (count($tarifas) > 0) { + foreach ($tarifas as $tarifa) { $values = $this->model->getPrecioTarifa($tarifa, $tirada, $POD); array_push($result, $values); } } - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); $data = [ 'lines' => $result, $csrfTokenName => $newTokenHash ]; - + return $this->respond($data); } @@ -101,7 +101,7 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $tirada = $reqData['tirada'] ?? 0; $proveedor_id = $reqData['proveedor_id'] ?? -1; $POD = $reqData['POD'] ?? 0; - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -119,17 +119,59 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController } } + public function getAcabados() + { + if ($this->request->isAJAX()) { + + $cubierta = $this->request->getGet("cubierta") ?? 0; + $sobrecubierta = $this->request->getGet("sobrecubierta") ?? 0; + + $model = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); + $query = $model->builder()->select( + [ + "id", + "nombre as name" + ] + ) + ->where("lg_tarifa_acabado.is_deleted", 0) + ->where("lg_tarifa_acabado.mostrar_en_presupuesto", 1); + + if($cubierta == 1){ + $query->where("lg_tarifa_acabado.acabado_cubierta", 1); + } + else if ($sobrecubierta == 1){ + $query->where("lg_tarifa_acabado.acabado_sobrecubierta", 1); + } + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("lg_tarifa_acabado.nombre", $this->request->getGet("q")) + ->groupEnd(); + } + + $items = $query->get()->getResultObject(); + // add a custom item at the beginning + $customItem = new \stdClass; + $customItem->id = 0; + $customItem->name = "Ninguno"; + array_unshift($items, $customItem); + + return $this->response->setJSON($items); + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } public function menuItems() { if ($this->request->isAJAX()) { $reqData = $this->request->getPost(); - try{ + try { $tarifa_id = $reqData['tarifa_id'] ?? -1; $tirada = $reqData['tirada'] ?? 0; - + $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); @@ -140,17 +182,15 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $csrfTokenName => $newTokenHash ]; - } - catch(Exception $e){ + } catch (Exception $e) { $data = [ 'error' => $e, $csrfTokenName => $newTokenHash ]; - } - finally{ + } finally { return $this->respond($data); } - + } else { return $this->failUnauthorized('Invalid request', 403); } diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index a7f3d0be..aca290a0 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -22,6 +22,7 @@ use App\Services\PresupuestoClienteService; use App\Services\PresupuestoService; use Exception; +use stdClass; use function PHPUnit\Framework\containsOnly; @@ -328,7 +329,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'gramajeCubierta' => intval($cubierta['gramajeCubierta']), 'carasCubierta' => intval($cubierta['carasImpresion'] ?? 0), 'solapasCubierta' => intval($cubierta['solapas'] ?? 0) == 1 ? intval($cubierta['tamanioSolapas']) : 0, - 'acabadosCubierta' => $cubierta['acabados'] ?? 0, + 'acabado' => $cubierta['acabado'] ?? 0, 'lomoRedondo' => $lomoRedondo, ]; @@ -338,7 +339,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'papel' => $modelPapelGenerico->getIdFromCode($sobrecubierta['papel']), 'gramaje' => intval($sobrecubierta['gramaje']), 'solapas' => intval($sobrecubierta['solapas'] ?? 0), - 'acabados' => $sobrecubierta['plastificado'] ?? 0, + 'acabado' => $sobrecubierta['acabado'] ?? 0, ]; } else $sobrecubierta = false; @@ -718,6 +719,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $reqData = $this->request->getPost(); + $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); + $id = $reqData['id'] ?? 0; $id = intval($id); @@ -794,7 +797,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'gramajeCubierta' => intval($cubierta['gramajeCubierta']), 'carasCubierta' => intval($cubierta['carasImpresion'] ?? 0), 'solapasCubierta' => intval($cubierta['solapas'] ?? 0) == 1 ? intval($cubierta['tamanioSolapas']) : 0, - 'acabadosCubierta' => $cubierta['acabados'] ?? 0, + 'acabado' => $cubierta['acabado'] ?? 0, 'lomoRedondo' => $cubierta['lomoRedondo'] ?? 0, 'cabezada' => $cubierta['cabezada'] ?? 'WHI', ]; @@ -805,7 +808,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'papel' => $modelPapelGenerico->getIdFromCode($sobrecubierta['papel']), 'gramaje' => intval($sobrecubierta['gramaje']), 'solapas' => intval($sobrecubierta['solapas'] ?? 0), - 'acabados' => $sobrecubierta['plastificado'] ?? 0, + 'acabado' => $sobrecubierta['acabado'] ?? 0, ]; } else $sobrecubierta = false; @@ -933,33 +936,13 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $borrar_antes = true; } - if ($datos_presupuesto['sobrecubierta']) { - $acabado_id = $this->obtenerTarifasAcabado(['plastificado' => $datos_presupuesto['sobrecubierta']['acabados']]); - if (count($acabado_id) > 0) { - $datos_presupuesto['sobrecubierta']['acabados'] = $acabado_id[0]; - } - } - $acabado_id = $this->obtenerTarifasAcabado($datos_presupuesto['cubierta']['acabadosCubierta']); - if (count($acabado_id) > 0) { - if (array_key_exists('plastificado', $acabado_id)) { - $datos_presupuesto['cubierta']['acabadosCubierta']['plastificado'] = $acabado_id['plastificado']; - } - if (array_key_exists('barniz', $acabado_id)) { - $datos_presupuesto['cubierta']['acabadosCubierta']['barniz'] = $acabado_id['barniz']; - } - if (array_key_exists('estampado', $acabado_id)) { - $datos_presupuesto['cubierta']['acabadosCubierta']['estampado'] = $acabado_id['estampado']; - } - } else { - $datos_presupuesto['cubierta']['acabadosCubierta']['id'] = 0; - } - $datos_presupuesto['prototipo'] = $prototipo; $datos_presupuesto['ferro'] = $ferro; $datos_presupuesto['ferro_digital'] = $ferroDigital; $datos_presupuesto['marcapaginas'] = $marcapaginas; $datos_presupuesto['retractilado'] = $retractilado; $datos_presupuesto['retractilado5'] = $retractilado5; + $datos_presupuesto['entrega_taller'] = $reqData['entrega_taller'] ?? 0; $id = $model_presupuesto->insertarPresupuestoCliente( $id, @@ -991,6 +974,29 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['guardas']); // Servicios + if ($sobrecubierta) { + if (intval($sobrecubierta['acabado']) > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $servicio = $model->getPrecioTarifa(intval($sobrecubierta['acabado']), intval($selected_tirada), -1, $POD); + + if (count($servicio) > 0) { + if ($servicio[0]->total > 0) { + $this->guardarServicio($id, $servicio[0], 'acabado', false, true); + } + } + } + } + if (intval($cubierta['acabado']) > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $servicio = $model->getPrecioTarifa(intval($cubierta['acabado']), intval($selected_tirada), -1, $POD); + + if (count($servicio) > 0) { + if ($servicio[0]->total > 0) { + $this->guardarServicio($id, $servicio[0], 'acabado', true, false); + } + } + + } foreach ($resultado_presupuesto['info']['serviciosDefecto'] as $servicio) { $this->guardarServicio($id, $servicio, 'encuadernacion'); } @@ -1092,26 +1098,22 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data['cubierta']['solapas_ancho'] = $presupuesto->solapas_ancho; $data['cubierta']['cabezada'] = $presupuesto->cabezada; $modelAcabado = model("App\Models\Tarifas\Acabados\TarifaAcabadoModel"); - $data['cubierta']['plastificado'] = $modelAcabado->getCodeFromId($presupuesto->acabado_cubierta_id); - if ($data['cubierta']['plastificado'] == '') { - $data['cubierta']['plastificado'] = 'NONE'; - } - $data['cubierta']['barniz'] = $modelAcabado->getCodeFromId($presupuesto->barniz_cubierta_id); - if ($data['cubierta']['barniz'] == '') { - $data['cubierta']['barniz'] = 'NONE'; - } - $data['cubierta']['estampado'] = $modelAcabado->getCodeFromId($presupuesto->estampado_cubierta_id); - if ($data['cubierta']['estampado'] == '') { - $data['cubierta']['estampado'] = 'NONE'; + $data['cubierta']['acabado']['id'] = $presupuesto->acabado_cubierta_id; + if ($presupuesto->acabado_cubierta_id == 0) { + $data['cubierta']['acabado']['text'] = "Ninguno"; + } else { + $data['cubierta']['acabado']['text'] = $modelAcabado->find($presupuesto->acabado_cubierta_id)->nombre; } $data['cubierta']['retractilado'] = $presupuesto->retractilado ? 1 : 0; $data['sobrecubierta'] = array_key_exists('sobrecubierta', $datos_papel) ? $datos_papel['sobrecubierta'] : []; $data['sobrecubierta']['solapas'] = $presupuesto->solapas_sobrecubierta ? 1 : 0; $data['sobrecubierta']['solapas_ancho'] = $presupuesto->solapas_ancho_sobrecubierta; - $data['sobrecubierta']['plastificado'] = $modelAcabado->getCodeFromId($presupuesto->acabado_sobrecubierta_id); - if ($data['sobrecubierta']['plastificado'] == '') { - $data['sobrecubierta']['plastificado'] = 'NONE'; + $data['sobrecubierta']['acabado']['id'] = $presupuesto->acabado_sobrecubierta_id; + if ($presupuesto->acabado_sobrecubierta_id == 0) { + $data['sobrecubierta']['acabado']['text'] = "Ninguno"; + } else { + $data['sobrecubierta']['acabado']['text'] = $modelAcabado->find($presupuesto->acabado_sobrecubierta_id)->nombre; } $data['guardas'] = array_key_exists('guardas', $datos_papel) ? $datos_papel['guardas'] : []; @@ -1122,7 +1124,12 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController [$data['datosGenerales']['paginasNegro'], $data['datosGenerales']['paginasColor']] = $this->getPaginas($lineas); - $data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id); + if (intval($presupuesto->envios_recoge_cliente) == 1) { + $data['direcciones']['entrega_taller'] = 1; + } else { + $data['direcciones']['entrega_taller'] = 0; + $data['direcciones'] = $this->obtenerDireccionesEnvio($id, $presupuesto->cliente_id); + } if (intval($presupuesto->estado_id) == 2) { $data['resumen']['base'] = $presupuesto->total_aceptado; @@ -1311,7 +1318,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } - protected function guardarServicio($presupuestoId, $servicio, $tipo) + protected function guardarServicio($presupuestoId, $servicio, $tipo, $cubierta = false, $sobrecubierta = false) { if ($tipo == 'encuadernacion') { @@ -1349,9 +1356,12 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data = [ 'presupuesto_id' => $presupuestoId, 'tarifa_acabado_id' => $servicio->tarifa_id, - 'precio_total' => $servicio->total, - 'precio_unidad' => $servicio->precio_unidad, + 'precio_total' => round($servicio->total, 2), + 'precio_unidad' => round($servicio->precio_unidad, 2), 'margen' => $servicio->margen, + 'proveedor_id' => $servicio->proveedor_id, + 'cubierta' => $cubierta, + 'sobrecubierta' => $sobrecubierta, ]; $model->insert($data); } else if ($tipo == 'manipulado') { @@ -1460,7 +1470,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $gramajeCubierta = $datos_entrada['cubierta']['gramajeCubierta']; $carasCubierta = $datos_entrada['cubierta']['carasCubierta']; $solapasCubierta = $datos_entrada['cubierta']['solapasCubierta']; - $acabadosCubierta = $datos_entrada['cubierta']['acabadosCubierta'] ?? []; $lomoRedondo = $datos_entrada['cubierta']['lomoRedondo']; // Sobrecubierta @@ -1698,20 +1707,18 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController ]; return $return_data; } - // Acabados Cubierta - $tarifaAcabadoCubierta = $this->obtenerTarifasAcabado($acabadosCubierta); - $acabadoCubierta = []; - foreach ($tarifaAcabadoCubierta as $tarifa) { - if ($tarifa == 0) - continue; + // Acabado Cubierta + if (intval($datos_entrada['cubierta']['acabado']) != 0) { + + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoCubierta = $model->getPrecioTarifa($tarifa, $datosPedido->tirada, -1, $POD); + $acabadoCubierta = $model->getPrecioTarifa(intval($datos_entrada['cubierta']['acabado']), $datosPedido->tirada, -1, $POD); if (count($acabadoCubierta) > 0) { if ($acabadoCubierta[0]->total <= 0) { - $input_data['tarifas_acabado_cubierta'] = $tarifaAcabadoCubierta; + $input_data['tarifas_acabado_cubierta'] = intval($datos_entrada['cubierta']['acabado']); $errorModel = new ErrorPresupuesto(); $errorModel->insertError( $datos_entrada['id'], @@ -1785,21 +1792,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } $lomo_sobrecubierta = $lomo + floatval($linea_sobrecubierta['mano']); - $tarifaAcabadoSobrecubierta = $this->obtenerTarifasAcabado(['plastificado' => $sobreCubierta['acabados']]); - $acabadoSobrecubierta = []; - foreach ($tarifaAcabadoSobrecubierta as $tarifa) { + // Acabado sobrecubierta + if (intval($datos_entrada['sobrecubierta']['acabado']) != 0) { - // NONE - if ($tarifaAcabadoSobrecubierta[0] == 0) - continue; $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoSobrecubierta = $model->getPrecioTarifa($tarifa, $datosPedido->tirada, -1, $POD); + $acabadoSobrecubierta = $model->getPrecioTarifa(intval($datos_entrada['sobrecubierta']['acabado']), $datosPedido->tirada, -1, $POD); if (count($acabadoSobrecubierta) > 0) { if ($acabadoSobrecubierta[0]->total <= 0) { - $input_data['tarifas_acabado_sobrecubierta'] = $tarifaAcabadoSobrecubierta; + $input_data['tarifas_acabado_sobrecubierta'] = intval($datos_entrada['sobrecubierta']['acabado']); $errorModel = new ErrorPresupuesto(); $errorModel->insertError( $datos_entrada['id'], @@ -2250,22 +2253,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController return $data; } - protected function getAcabadosCubierta() - { - $model = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); - $data = $model->getServiciosAcabadoCubierta(); - array_unshift($data, (object) ['id' => '', 'label' => lang('Basic.global.None')]); - return $data; - } - - protected function getAcabadosSobrecubierta() - { - $model = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); - $data = $model->getServiciosAcabadoSobrecubierta(); - array_unshift($data, (object) ['id' => '', 'label' => lang('Basic.global.None')]); - return $data; - } - protected function getClienteListItems($selId = null) { $data = ['' => lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Clientes.cliente'))])]; @@ -2403,7 +2390,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController { $model = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); $model_direcciones = model('App\Models\Clientes\ClienteDireccionesModel'); - $model_pais = model('App\Models\Configuracion\PaisModel'); $direcciones = $model->where('presupuesto_id', $id)->findAll(); $result = []; @@ -2447,16 +2433,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController foreach ($data as $linea) { if ($linea->tipo == 'lp_bn' || $linea->tipo == 'lp_bnhq' || $linea->tipo == 'lp_rot_bn') { $return_data['interior']['negro']['tipo'] = $linea->tipo == 'lp_bn' || $linea->tipo == 'lp_rot_bn' ? 'negroEstandar' : 'negroPremium'; - $return_data['interior']['negro']['papel'] = $modelPapelGenerico->getCodeFromId($linea->papel_id); + $return_data['interior']['negro']['papel'] = $modelPapelGenerico->getNombre($linea->papel_id); $return_data['interior']['negro']['papel']['id'] = $linea->papel_id; $return_data['interior']['negro']['gramaje'] = $linea->gramaje; } else if ($linea->tipo == 'lp_color' || $linea->tipo == 'lp_colorhq' || $linea->tipo == 'lp_rot_color') { $return_data['interior']['color']['tipo'] = $linea->tipo == 'lp_color' || $linea->tipo == 'lp_rot_color' ? 'colorEstandar' : 'colorPremium'; - $return_data['interior']['color']['papel'] = $modelPapelGenerico->getCodeFromId($linea->papel_id); + $return_data['interior']['color']['papel'] = $modelPapelGenerico->getNombre($linea->papel_id); $return_data['interior']['color']['papel']['id'] = $linea->papel_id; $return_data['interior']['color']['gramaje'] = $linea->gramaje; } else if ($linea->tipo == 'lp_cubierta') { - $return_data['cubierta']['papel'] = $modelPapelGenerico->getCodeFromId($linea->papel_id); + $return_data['cubierta']['papel'] = $modelPapelGenerico->getNombre($linea->papel_id); $return_data['cubierta']['papel']['id'] = $linea->papel_id; $return_data['cubierta']['gramaje'] = $linea->gramaje; $return_data['cubierta']['paginas'] = $linea->paginas; @@ -2590,10 +2576,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($value != 'NONE') { $data = $model->where('code', $value)->first(); - $data = $data->id; - array_push($tarifas, [$acabado => $data]); - } else { - array_push($tarifas, 0); + $tarifas[$acabado] = $data->id; } } diff --git a/ci4/app/Database/Migrations/2024-12-14-121014_RemoveEstampadoBarnizado.php b/ci4/app/Database/Migrations/2024-12-14-121014_RemoveEstampadoBarnizado.php new file mode 100644 index 00000000..37f96362 --- /dev/null +++ b/ci4/app/Database/Migrations/2024-12-14-121014_RemoveEstampadoBarnizado.php @@ -0,0 +1,36 @@ +forge->dropColumn('presupuestos', 'barniz_cubierta_id'); + $this->forge->dropColumn('presupuestos', 'estampado_cubierta_id'); + } + + public function down() + { + $fields = [ + 'barniz_cubierta_id' => [ + 'type' => 'INT', + 'constraint' => 10, + 'unsigned' => true, + 'null' => false, + 'default' => 0, + ], + 'estampado_cubierta_id' => [ + 'type' => 'INT', + 'constraint' => 10, + 'unsigned' => true, + 'null' => false, + 'default' => 0, + ], + ]; + + $this->forge->addColumn('presupuestos', $fields); + } +} diff --git a/ci4/app/Entities/Pedidos/PedidoEntity.php b/ci4/app/Entities/Pedidos/PedidoEntity.php index 6e210b8a..32a1bf01 100644 --- a/ci4/app/Entities/Pedidos/PedidoEntity.php +++ b/ci4/app/Entities/Pedidos/PedidoEntity.php @@ -4,6 +4,8 @@ namespace App\Entities\Pedidos; use App\Entities\Presupuestos\PresupuestoEntity; use App\Entities\Produccion\OrdenTrabajoEntity; use App\Models\OrdenTrabajo\OrdenTrabajoModel; +use App\Entities\Clientes\ClienteEntity; +use App\Models\Clientes\ClienteModel; use App\Models\Pedidos\PedidoLineaModel; use App\Models\Presupuestos\PresupuestoModel; use CodeIgniter\Entity; @@ -63,4 +65,14 @@ class PedidoEntity extends \CodeIgniter\Entity\Entity return $m->where("pedido_id",$this->attributes["id"])->first(); } + + public function cliente() : ?ClienteEntity + { + $m = model(ClienteModel::class); + $pl = model(PedidoLineaModel::class); + $pm = model(PresupuestoModel::class); + $pedido_linea = $pl->where('pedido_id',$this->attributes["id"])->first(); + $pre = $pm->find($pedido_linea->presupuesto_id); + return $m->find($pre->cliente_id); + } } diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php index 1fb887c2..fee02953 100755 --- a/ci4/app/Language/es/Presupuestos.php +++ b/ci4/app/Language/es/Presupuestos.php @@ -67,6 +67,7 @@ return [ 'papelFormatoPersonalizado' => 'Tamaño personalizado', 'papelFormatoAncho' => 'Ancho', 'papelFormatoAlto' => 'Alto', + 'acabado' => 'Acabado', 'acabadosExteriores' => 'Acabados exteriores', 'acabadoCubierta' => 'Acabado Cubierta', 'acabadoSobrecubierta' => 'Acabado Sobrecubierta', diff --git a/ci4/app/Language/es/Users.php b/ci4/app/Language/es/Users.php index ff61a685..81059ba3 100755 --- a/ci4/app/Language/es/Users.php +++ b/ci4/app/Language/es/Users.php @@ -3,6 +3,7 @@ return [ + 'add' => 'Añadir', 'address' => 'Dirección', 'blocked' => 'Bloqueado', 'non_blocked' => 'No bloqueado', @@ -38,6 +39,7 @@ return [ 'user' => 'Usuario', 'userList' => 'Lista de usuarios', 'users' => 'Usuarios', + 'usersAvailables' => 'Usuarios disponibles', 'zipCode' => 'Código postal', 'admin' => 'Administrador', @@ -52,6 +54,8 @@ return [ 'editor' => 'Editor', 'beta' => 'Beta', + 'cliente' => 'Cliente', + 'errors' => [ 'cliente_sin_clienteID' => 'El usuario debe de tener un cliente asignado cuando se usa algún rol de cliente.', ], diff --git a/ci4/app/Models/Chat/ChatDeparmentUserModel.php b/ci4/app/Models/Chat/ChatDeparmentUserModel.php index 0c701d14..717c738a 100644 --- a/ci4/app/Models/Chat/ChatDeparmentUserModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentUserModel.php @@ -11,7 +11,7 @@ class ChatDeparmentUserModel extends Model protected $primaryKey = 'id'; protected $useAutoIncrement = true; protected $returnType = 'array'; - protected $useSoftDeletes = false; + protected $useSoftDeletes = true; protected $protectFields = true; protected $allowedFields = [ "chat_department_id", diff --git a/ci4/app/Models/Clientes/ClienteModel.php b/ci4/app/Models/Clientes/ClienteModel.php index a1193860..ccc7f509 100755 --- a/ci4/app/Models/Clientes/ClienteModel.php +++ b/ci4/app/Models/Clientes/ClienteModel.php @@ -14,13 +14,14 @@ class ClienteModel extends \App\Models\BaseModel protected $useAutoIncrement = true; const SORTABLE = [ - 0 => "t1.nombre", - 1 => "t1.alias", - 2 => "t1.cif", - 3 => "t1.email", - 4 => "t1.comercial_id", - 5 => "t1.forma_pago_id", - 6 => "t1.vencimiento", + 0 => "t1.id", + 1 => "t1.nombre", + 2 => "t1.alias", + 3 => "t1.cif", + 4 => "t1.email", + 5 => "t1.comercial_id", + 6 => "t1.forma_pago_id", + 7 => "t1.vencimiento", ]; protected $allowedFields = [ @@ -63,7 +64,7 @@ class ClienteModel extends \App\Models\BaseModel ]; protected $returnType = "App\Entities\Clientes\ClienteEntity"; - protected $deletedField = 'deleted_at'; + protected $deletedField = 'deleted_at'; public static $labelField = "nombre"; @@ -245,7 +246,7 @@ class ClienteModel extends \App\Models\BaseModel "required" => "Clientes.validation.vencimiento.required", ], ]; - public function findAllWithAllRelations(string $selcols = "*", int $limit = null, int $offset = 0) + public function findAllWithAllRelations($selcols = "*", int $limit = null, int $offset = 0) { $sql = "SELECT t1." . @@ -279,35 +280,30 @@ class ClienteModel extends \App\Models\BaseModel * * @return \CodeIgniter\Database\BaseBuilder */ - public function getResource(string $search = "") + public function getResource($search = []) { $builder = $this->db ->table($this->table . " t1") ->select( "t1.id AS id, t1.nombre AS nombre, t1.alias AS alias, t1.cif AS cif, t1.email AS email, t1.vencimiento AS vencimiento, t5.first_name AS comercial, t7.nombre AS forma_pago_id" ) - ->where("is_deleted", 0);; + ->where("is_deleted", 0); + ; $builder->join("users t5", "t1.comercial_id = t5.id", "left"); $builder->join("formas_pago t7", "t1.forma_pago_id = t7.id", "left"); - - return empty($search) - ? $builder - : $builder - ->groupStart() - ->like("t1.nombre", $search) - ->orLike("t1.alias", $search) - ->orLike("t1.cif", $search) - ->orLike("t1.email", $search) - ->orLike("t1.soporte_id", $search) - ->orLike("t1.forma_pago_id", $search) - ->orLike("t1.vencimiento", $search) - ->orLike("t5.id", $search) - ->orLike("t5.first_name", $search) - ->orLike("t5.last_name", $search) - ->orLike("t7.id", $search) - ->orLike("t7.nombre", $search) - ->groupEnd(); + if (empty($search)) + return $builder; + else { + $builder->groupStart(); + foreach ($search as $col_search) { + $column = self::SORTABLE[$col_search[0]]; + $value = $col_search[2]; + $builder->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%"); + } + $builder->groupEnd(); + return $builder; + } } /* @@ -353,7 +349,7 @@ class ClienteModel extends \App\Models\BaseModel ->join("pedidos", "pedidos.id = pedidos_linea.pedido_id", "left") ->join("facturas_pedidos_lineas", "facturas_pedidos_lineas.pedido_linea_id = pedidos_linea.id", "left") ->where("t1.id", $cliente_id); - $data = $query->get()->getResultObject(); + $data = $query->get()->getResultObject(); $facturas = []; $presupuestos = []; $pedidos = []; diff --git a/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php b/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php index 4a948f0e..9e1b6852 100755 --- a/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php +++ b/ci4/app/Models/Clientes/ClientePlantillaPreciosLineasModel.php @@ -160,7 +160,7 @@ class ClientePlantillaPreciosLineasModel extends \App\Models\BaseModel else { $builder->groupStart(); foreach ($search as $col_search) { - if ($col_search[1] > 0 && $col_search[0] < 4) + 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]); diff --git a/ci4/app/Models/Clientes/ClienteUsuariosModel.php b/ci4/app/Models/Clientes/ClienteUsuariosModel.php index 474b6ce3..4eedadf5 100644 --- a/ci4/app/Models/Clientes/ClienteUsuariosModel.php +++ b/ci4/app/Models/Clientes/ClienteUsuariosModel.php @@ -16,9 +16,10 @@ class ClienteUsuariosModel extends ShieldUserModel protected $useAutoIncrement = true; const SORTABLE = [ - 0 => "t1.first_name", - 1 => "t1.last_name", - 2 => "t2.secret", + 0 => "t1.id", + 1 => "t1.first_name", + 2 => "t1.last_name", + 3 => "t2.secret", ]; protected $allowedFields = ["id", "first_name", "last_name", "email"]; @@ -83,6 +84,19 @@ class ClienteUsuariosModel extends ShieldUserModel return $result; } + public function removeClienteFromUser($user_id = -1){ + + $this->db->table($this->table)->where('id', $user_id)->update(['cliente_id' => null]); + } + + + public function addUserToClient($user_id = -1, $cliente_id = -1){ + if($user_id < 1 || $cliente_id < 1){ + return; + } + $this->db->table($this->table)->where('id', $user_id)->update(['cliente_id' => $cliente_id]); + } + /** * Get resource data. * @@ -100,15 +114,8 @@ class ClienteUsuariosModel extends ShieldUserModel ); $builder->join("auth_identities t2", "t1.id = t2.user_id", "left"); - $builder->where('t1.id', $cliente_id); + $builder->where('t1.cliente_id', $cliente_id); - return empty($search) - ? $builder - : $builder - ->groupStart() - ->like("t1.first_name", $search) - ->orLike("t1.last_name", $search) - ->orLike("t2.secret", $search) - ->groupEnd(); + return $builder; } } diff --git a/ci4/app/Models/Configuracion/MaquinaModel.php b/ci4/app/Models/Configuracion/MaquinaModel.php index 0cefa19a..650162e6 100755 --- a/ci4/app/Models/Configuracion/MaquinaModel.php +++ b/ci4/app/Models/Configuracion/MaquinaModel.php @@ -14,22 +14,13 @@ class MaquinaModel extends \App\Models\BaseModel protected $useAutoIncrement = true; const SORTABLE = [ - //1 => "t1.id", - 0 => "t1.nombre", + 0 => "t1.id", 1 => "t2.nombre", 2 => "t1.tipo", - 3 => "t1.velocidad", - 4 => "t1.duracion_jornada", - 5 => "t1.ancho", - 6 => "t1.alto", - 7 => "t1.ancho_impresion", - 8 => "t1.alto_impresion", - 9 => "t1.orden_planning", - 10 => "t1.min", - 11 => "t1.max", - - - ]; + 3 => "t1.ancho_impresion", + 4 => "t1.alto_impresion", + 5 => "t1.min", + 6 => "t1.max", ]; protected $allowedFields = [ "nombre", @@ -295,7 +286,7 @@ class MaquinaModel extends \App\Models\BaseModel * * @return \CodeIgniter\Database\BaseBuilder */ - public function getResource(string $search = "") + public function getResource($search = []) { $builder = $this->db ->table($this->table . " t1") @@ -313,56 +304,18 @@ class MaquinaModel extends \App\Models\BaseModel //JJO $builder->where("t1.is_deleted", 0); - return empty($search) - ? $builder - : $builder - ->groupStart() - ->like("t1.id", $search) - ->orLike("t1.nombre", $search) - ->orLike("t1.tipo", $search) - ->orLike("t1.velocidad", $search) - ->orLike("t1.ancho", $search) - ->orLike("t1.alto", $search) - ->orLike("t1.ancho_impresion", $search) - ->orLike("t1.alto_impresion", $search) - ->orLike("t1.alto_click", $search) - ->orLike("t1.min", $search) - ->orLike("t1.max", $search) - ->orLike("t1.duracion_jornada", $search) - ->orLike("t1.orden_planning", $search) - ->orLike("t1.precio_tinta_negro", $search) - ->orLike("t1.precio_tinta_color", $search) - ->orLike("t1.velocidad_corte", $search) - ->orLike("t1.precio_hora_corte", $search) - ->orLike("t1.metrosxminuto", $search) - ->orLike("t1.forzar_num_formas_horizontales_cubierta", $search) - ->orLike("t1.forzar_num_formas_verticales_cubierta", $search) - ->orLike("t1.observaciones", $search) - ->orLike("t2.id", $search) - ->orLike("t1.id", $search) - ->orLike("t1.nombre", $search) - ->orLike("t1.tipo", $search) - ->orLike("t1.velocidad", $search) - ->orLike("t1.ancho", $search) - ->orLike("t1.alto", $search) - ->orLike("t1.ancho_impresion", $search) - ->orLike("t1.alto_impresion", $search) - ->orLike("t1.alto_click", $search) - ->orLike("t1.padre_id", $search) - ->orLike("t1.min", $search) - ->orLike("t1.max", $search) - ->orLike("t1.duracion_jornada", $search) - ->orLike("t1.orden_planning", $search) - ->orLike("t1.precio_tinta_negro", $search) - ->orLike("t1.precio_tinta_color", $search) - ->orLike("t1.velocidad_corte", $search) - ->orLike("t1.precio_hora_corte", $search) - ->orLike("t1.metrosxminuto", $search) - ->orLike("t1.forzar_num_formas_horizontales_cubierta", $search) - ->orLike("t1.forzar_num_formas_verticales_cubierta", $search) - ->orLike("t1.observaciones", $search) - ->orLike("t2.nombre", $search) - ->groupEnd(); + if (empty($search)) + return $builder; + else { + $builder->groupStart(); + foreach ($search as $col_search) { + $column = self::SORTABLE[$col_search[0]]; + $value = $col_search[2]; + $builder->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%"); + } + $builder->groupEnd(); + return $builder; + } } public function getMaquinaImpresionForPresupuesto($is_rotativa, $tarifa_tipo, $uso_tarifa , $tirada, $papel_impresion_id = -1) diff --git a/ci4/app/Models/Configuracion/PapelGenericoModel.php b/ci4/app/Models/Configuracion/PapelGenericoModel.php index 70c0447c..4f2d8cf9 100755 --- a/ci4/app/Models/Configuracion/PapelGenericoModel.php +++ b/ci4/app/Models/Configuracion/PapelGenericoModel.php @@ -94,6 +94,20 @@ class PapelGenericoModel extends \App\Models\BaseModel return $data; } + public function getNombre($id = 0) + { + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.nombre AS nombre" + ) + ->where("t1.id", $id) + ->where("t1.is_deleted", 0); + $data = $builder->get()->getFirstRow(); + // se convierte a de stdClass a array + $data = json_decode(json_encode($data), true); + return $data; + } /** * Get resource data. diff --git a/ci4/app/Models/Presupuestos/BuscadorModel.php b/ci4/app/Models/Presupuestos/BuscadorModel.php index e1df2343..df051c59 100644 --- a/ci4/app/Models/Presupuestos/BuscadorModel.php +++ b/ci4/app/Models/Presupuestos/BuscadorModel.php @@ -132,7 +132,7 @@ class BuscadorModel extends \App\Models\BaseModel t6.estado AS estado" ); $builder->join("clientes t2", "t1.cliente_id = t2.id", "left"); - $builder->join("users t3", "t1.user_update_id = t3.id", "left"); + $builder->join("users t3", "t2.comercial_id = t3.id", "left"); $builder->join("lg_paises t5", "t1.pais_id = t5.id", "left"); $builder->join("presupuesto_estados t6", "t1.estado_id = t6.id", "left"); $builder->join("tipos_presupuestos t7", "t1.tipo_impresion_id = t7.id", "left"); diff --git a/ci4/app/Models/Presupuestos/PresupuestoModel.php b/ci4/app/Models/Presupuestos/PresupuestoModel.php index 974c29fa..135efbc2 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoModel.php @@ -434,6 +434,8 @@ class PresupuestoModel extends \App\Models\BaseModel 'merma_cubierta' => $extra_info['merma'], 'paginasCuadernillo' => $data['paginasCuadernillo'], + 'recoger_en_taller' => $data['entrega_taller'], + 'comp_pos_paginas_color' => $data['interior']['pos_paginas_color'], 'paginas_color_consecutivas' => $data['interior']['paginas_color_consecutivas'], 'papel_interior_diferente' => $data['interior']['papelInteriorDiferente'], @@ -443,10 +445,8 @@ class PresupuestoModel extends \App\Models\BaseModel 'comparador_json_data' => $this->generateJson($data), - 'acabado_cubierta_id' => $data['cubierta']['acabadosCubierta']['plastificado'], - 'barniz_cubierta_id' => $data['cubierta']['acabadosCubierta']['barniz'], - 'estampado_cubierta_id' => $data['cubierta']['acabadosCubierta']['estampado'], - 'acabado_sobrecubierta_id' => !$data['sobrecubierta'] ? 0 : $data['sobrecubierta']['acabados'], + 'acabado_cubierta_id' => $data['cubierta']['acabado'], + 'acabado_sobrecubierta_id' => !$data['sobrecubierta'] ? 0 : $data['sobrecubierta']['acabado'], 'comp_tipo_impresion' => $data['isHq'] ? ($data['isColor'] ? 'colorhq' : 'negrohq') : ($data['isColor'] ? 'color' : 'negro'), diff --git a/ci4/app/Models/UserModel.php b/ci4/app/Models/UserModel.php index 752a22a7..cd7d2944 100644 --- a/ci4/app/Models/UserModel.php +++ b/ci4/app/Models/UserModel.php @@ -25,6 +25,15 @@ class UserModel extends ShieldUserModel ]; } + const SORTABLE = [ + 0 => "t1.id", + 1 => "t1.first_name", + 2 => "t1.last_name", + 3 => "t2.secret", + 4 => "t3.nombre", + 5 => "t1.last_active", + ]; + protected $returnType = UsersEntity::class; protected $useSoftDeletes = true; @@ -36,6 +45,7 @@ class UserModel extends ShieldUserModel protected $validationRules = [ "first_name" => "required|trim|max_length[150]", "last_name" => "required|trim|max_length[150]", + "email" => "required|valid_email|max_length[150]", 'new_pwd' => 'permit_empty|min_length[8]', 'new_pwd_confirm' => 'permit_empty|required_with[new_pwd]|matches[new_pwd]', "comments" => "permit_empty|trim|max_length[512]" @@ -59,9 +69,42 @@ class UserModel extends ShieldUserModel 'comments' => [ "max_length" => "Users.validation.last_name.max_length", ], + 'email' => [ + "required" => "Users.validation.email.required", + "valid_email" => "Users.validation.email.valid_email", + "max_length" => "Users.validation.email.max_length" + ] ]; + public function getResource($search = []) + { + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.id as id, t1.first_name AS first_name, t1.last_name AS last_name, + t2.secret AS email, t1.last_active AS last_active, t3.nombre AS cliente" + ); + + $builder->join("auth_identities t2", "t1.id = t2.user_id", "left"); + $builder->join("clientes t3", "t1.cliente_id = t3.id", "left"); + + $builder->where('t1.deleted_at', null)->groupBy("t1.id"); + + if (empty($search)) + return $builder; + else { + $builder->groupStart(); + foreach ($search as $col_search) { + $column = self::SORTABLE[$col_search[0]]; + $value = $col_search[2]; + $builder->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%"); + } + $builder->groupEnd(); + return $builder; + } + } + public function getComerciales() { diff --git a/ci4/app/Views/themes/vuexy/components/chat_factura.php b/ci4/app/Views/themes/vuexy/components/chat_factura.php index f3e13cdf..c9e9748d 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_factura.php +++ b/ci4/app/Views/themes/vuexy/components/chat_factura.php @@ -1,4 +1,9 @@
+user()->inGroup('admin')) { ?> +
+ +
+
@@ -119,6 +124,8 @@
+ $modelId]) ?> +
section('css') ?> diff --git a/ci4/app/Views/themes/vuexy/components/chat_pedido.php b/ci4/app/Views/themes/vuexy/components/chat_pedido.php index 64cb9c3c..9422acf7 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_pedido.php +++ b/ci4/app/Views/themes/vuexy/components/chat_pedido.php @@ -1,5 +1,9 @@
- +user()->inGroup('admin')) { ?> +
+ +
+
@@ -117,6 +121,8 @@
+ $modelId]) ?> +
diff --git a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php index 76c30928..238a7477 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php +++ b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php @@ -1,7 +1,11 @@
-
+ user()->inGroup('admin')) { ?> +
+ +
+ +
-
@@ -30,8 +34,8 @@
    - - + +
@@ -116,6 +120,7 @@
+ $modelId]) ?>
section('css') ?> diff --git a/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php b/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php new file mode 100644 index 00000000..c2f6759f --- /dev/null +++ b/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php @@ -0,0 +1,47 @@ + + \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php index 5766a61f..6c67d6a6 100644 --- a/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php +++ b/ci4/app/Views/themes/vuexy/form/clientes/cliente/_clienteFormItems.php @@ -654,6 +654,24 @@
+ +
+ +
+
+ + + +
+
+
+ +
+
+ @@ -1104,67 +1122,6 @@ function delete_direccion_envio(dataId){ endSection() ?> -section("additionalInlineJs") ?> -/**************************************** - Contactos -*****************************************/ - - const lastColNrCU = $('#tableOfClienteUsuarios').find("tr:first th").length - 1; - - var theTableCU = $('#tableOfClienteUsuarios').DataTable( { - serverSide: true, - processing: true, - autoWidth: true, - responsive: true, - lengthMenu: [ 5, 10, 25], - order: [[ 0, "asc" ], [ 1, "asc" ]], - pageLength: 10, - lengthChange: true, - searching: false, - paging: true, - info: false, - dom: '<"mt-4"><"float-end"B><"float-start"l><"mt-4 mb-3"p>', - ajax : $.fn.dataTable.pipeline( { - url: '', - data: { - //id_cliente: id, - id_cliente: 1, - }, - method: 'POST', - headers: {'X-Requested-With': 'XMLHttpRequest'}, - async: true, - }), - columns: [ - { 'data': 'id' }, - { 'data': 'nombre' }, - { 'data': 'apellidos' }, - { 'data': 'email' }, - { - data: actionBtns, - className: 'row-edit dt-center' - } - ], - columnDefs: [ - { - orderable: false, - searchable: false, - targets: [lastColNrCU] - }, - { - "orderData": [ 0, 1 ], - "targets": 0 - }, - - ], - language: { - url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" - } - } ); - -endSection() ?> - - - section('css') ?> diff --git a/ci4/app/Views/themes/vuexy/form/clientes/cliente/viewClienteList.php b/ci4/app/Views/themes/vuexy/form/clientes/cliente/viewClienteList.php index f2448cbc..dd4eca4e 100644 --- a/ci4/app/Views/themes/vuexy/form/clientes/cliente/viewClienteList.php +++ b/ci4/app/Views/themes/vuexy/form/clientes/cliente/viewClienteList.php @@ -1,35 +1,35 @@ include('themes/_commonPartialsBs/select2bs5') ?> include('themes/_commonPartialsBs/datatables') ?> -include('themes/_commonPartialsBs/_confirm2delete') ?> extend('themes/vuexy/main/defaultlayout') ?> -section('content'); ?> +section('content'); ?>
-

- 'btn btn-primary float-end']); ?> -
+

+ 'btn btn-primary float-end']); ?> +
- -
- - - - - - - - - - - - - + +
+ + + + + + + + + + + + + + - -
ID
+ +
@@ -37,111 +37,28 @@ -endSection() ?> +endSection() ?> -section('additionalInlineJs') ?> - - const lastColNr = $('#tableOfClientes').find("tr:first th").length - 1; - const actionBtns = function(data) { - return ` - -
- - -
- `; - }; - - theTable = $('#tableOfClientes').DataTable({ - processing: true, - serverSide: true, - autoWidth: true, - responsive: true, - scrollX: true, - lengthMenu: [ 5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500 ], - pageLength: 10, - lengthChange: true, - "dom": 'lfBrtip', - "buttons": [ - 'copy', 'csv', 'excel', 'print', { - extend: 'pdfHtml5', - orientation: 'landscape', - pageSize: 'A4' - } - ], - stateSave: true, - order: [[0, 'asc']], - language: { - url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" - }, - ajax : $.fn.dataTable.pipeline( { - url: '', - method: 'POST', - headers: {'X-Requested-With': 'XMLHttpRequest'}, - async: true, - }), - columnDefs: [ - { - orderable: false, - searchable: false, - targets: [lastColNr] - } - ], - columns : [ - { 'data': 'nombre' }, - { 'data': 'alias' }, - { 'data': 'cif' }, - { 'data': 'email' }, - { 'data': 'comercial' }, - { 'data': 'forma_pago_id' }, - { 'data': 'vencimiento' }, - { 'data': actionBtns } - ] - }); - - - $(document).on('click', '.btn-edit', function(e) { - window.location.href = `/clientes/cliente/edit/${$(this).attr('data-id')}`; - }); - - $(document).on('click', '.btn-delete', function(e) { - $(".btn-remove").attr('data-id', $(this).attr('data-id')); - }); - - $(document).on('click', '.btn-remove', function(e) { - const dataId = $(this).attr('data-id'); - const row = $(this).closest('tr'); - if ($.isNumeric(dataId)) { - $.ajax({ - url: `/clientes/cliente/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) - }) - } - }); - -endSection() ?> - - -section('css') ?> -"> -endSection() ?> +section('css') ?> +"> +endSection() ?> section('additionalExternalJs') ?> - - - - - - - -endSection() ?> + + + + + + + + + + +endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/configuracion/maquinas/viewMaquinaList.php b/ci4/app/Views/themes/vuexy/form/configuracion/maquinas/viewMaquinaList.php index c3e7a1b0..a6d48422 100644 --- a/ci4/app/Views/themes/vuexy/form/configuracion/maquinas/viewMaquinaList.php +++ b/ci4/app/Views/themes/vuexy/form/configuracion/maquinas/viewMaquinaList.php @@ -18,13 +18,14 @@ + - + @@ -42,102 +43,6 @@ endSection() ?> -section('additionalInlineJs') ?> - - const lastColNr = $('#tableOfMaquinas').find("tr:first th").length - 1; - const actionBtns = function(data) { - return ` - `; - }; - theTable = $('#tableOfMaquinas').DataTable({ - processing: true, - serverSide: true, - autoWidth: true, - responsive: true, - scrollX: true, - lengthMenu: [ 5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500 ], - pageLength: 10, - lengthChange: true, - "dom": 'lfBrtip', - "buttons": [ - 'copy', 'csv', 'excel', 'print', { - extend: 'pdfHtml5', - orientation: 'landscape', - pageSize: 'A4' - } - ], - stateSave: true, - order: [[0, 'asc']], - language: { - url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" - }, - ajax : $.fn.dataTable.pipeline( { - url: '', - method: 'POST', - headers: {'X-Requested-With': 'XMLHttpRequest'}, - async: true, - }), - columnDefs: [ - { - orderable: false, - searchable: false, - targets: [lastColNr] - } - ], - columns : [ - { 'data': 'nombre' }, - { 'data': 'tipo' }, - { 'data': 'ancho_impresion' }, - { 'data': 'alto_impresion' }, - { 'data': 'min' }, - { 'data': 'max' }, - { 'data': actionBtns } - ] - }); - - - theTable.on( 'draw.dt', function () { - const boolCols = []; - for (let coln of boolCols) { - theTable.column(coln, { page: 'current' }).nodes().each( function (cell, i) { - cell.innerHTML = cell.innerHTML == '1' ? '' : ''; - }); - } - }); - - $(document).on('click', '.btn-edit', function(e) { - window.location.href = `/configuracion/maquinas/edit/${$(this).attr('data-id')}`; - }); - - $(document).on('click', '.btn-delete', function(e) { - $(".btn-remove").attr('data-id', $(this).attr('data-id')); - }); - - $(document).on('click', '.btn-remove', function(e) { - const dataId = $(this).attr('data-id'); - const row = $(this).closest('tr'); - if ($.isNumeric(dataId)) { - $.ajax({ - url: `/configuracion/maquinas/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) - }) - } - }); -endSection() ?> - - section('css') ?> "> endSection() ?> @@ -151,5 +56,7 @@ + + endSection() ?> diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_datosLibroItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_datosLibroItems.php deleted file mode 100644 index d0d58e27..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_datosLibroItems.php +++ /dev/null @@ -1,94 +0,0 @@ -
- - - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
- - -
- - -
- -
- -
- - diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php deleted file mode 100644 index eb4fe1d7..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php +++ /dev/null @@ -1,48 +0,0 @@ -
- -
-
- -
- -
- - -
-
- - -
-
- -
- -
-
-
-
- - -
-
-
- -
- -
-
- -section("additionalInlineJs") ?> - -window.direcciones = direcciones_envio) ?>; -window.direcciones_sel_tirada = selected_tirada) ?>; -window.routes_direcciones = { - direcciones: "", - getDatos: "", - nuevaDireccion: "", -} -endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php deleted file mode 100644 index 0516df66..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php +++ /dev/null @@ -1,665 +0,0 @@ -
- - - -
- -

Fresado

- -
-
- - -
-
- -
-
user()->inGroup('admin') || auth()->user()->inGroup('beta')) ?' style="display:none;"':''?>> - - -
- - -
- - -
-
- -
- -
-
> - -
-
-
-
> - -
-
- -
- -
-
-
Datos presupuesto
-
-
- -
- - - -
-
- - -
- -
- - -
- -
- - -
- -
- - -
-
- -
- - -
- -
- - -
- -
- - -
- -
- -
- -
papel_formato_personalizado == false ? '' : 'style="display: none"'; ?>> - - - -
- -
papel_formato_personalizado == true ? '' : 'style="display: none"'; ?>> -
- - -
-
- -
papel_formato_personalizado == true ? '' : 'style="display: none"'; ?>> -
- - -
-
- -
-
- papel_formato_personalizado == true ? 'checked' : ''; ?>> - -
-
- -
- -
-
-
Interior
-
-
- - - -
Color del interior
- -
- -
- -
-
- - color_impresion == 'negro' ? ' checked=""': ''); ?> > -
- -
-
Blanco y Negro Estándar
-
-
- - -
-
- - color_impresion == 'negroHq' ? ' checked=""': ''); ?> > -
- -
-
Blanco y Negro Premium
-
-
-
- - -
- -
-
- - color_impresion == 'color' ? ' checked=""': ''); ?> > -
- -
-
Color Estándar
-
-
- - -
-
- - color_impresion == 'colorHq' ? ' checked=""': ''); ?> > -
- -
-
Color Premium
-
-
-
-
- -
-
- - -
-
- -
Papel
-
- -
- - -
- -
- - -
- -
- - -
Opciones extra
- - - -
-
-
Cubierta
-
-
- - - -
Papel
-
- -
- - -
- -
- - -
- -
- -
- -
- - -
- -
- - -
Opciones extra
- -
- -
-
- solapas == true ? 'checked' : ''; ?>> - -
-
- -
solapas == true ? '' : 'style="display: none;"'; ?>> - - -
- -
- -
- -
- - -
- -
- - - -
-
-
Sobrecubierta
-
-
- - - -
-
-
- papel_sobrecubierta) && $presupuestoEntity->papel_sobrecubierta>0) : - echo 'checked'; - endif; ?> - > - -
-
-
- -
papel_sobrecubierta) && $presupuestoEntity->papel_sobrecubierta>0) : - echo ''; - else: - echo 'style="display: none;"'; - endif; ?> - > Papel
-
- -
- - -
- -
- - -
- -
- -
papel_sobrecubierta) && $presupuestoEntity->papel_sobrecubierta>0) : - echo ''; - else: - echo 'style="display: none;"'; - endif; ?> - > Opciones extra
- -
papel_sobrecubierta) && $presupuestoEntity->papel_sobrecubierta>0) : - echo ''; - else: - echo 'style="display: none;"'; - endif; ?> - > - -
- - -
- -
- -
papel_sobrecubierta) && $presupuestoEntity->papel_sobrecubierta>0) : - echo ''; - else: - echo 'style="display: none;"'; - endif; ?> - > - -
- - -
- -
- - - -
-
-
Guardas
-
-
- - - -
-
- - -
-
- -
-
- - -
-
- - - -
-
-
Servicios Extra
-
-
- -
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- - -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
- -
-
-
- -
-
-
- -
- - -
-
-
Otras opciones
-
-
- -
-
- - -
- -

Se verificará que el pedido cumpla con los requisitos establecidos en el Artículo 91 de la Ley 37/1992, sobre inserción de publicidad, antes de proceder con su producción, lo que garantiza la aplicación del IVA reducido del 4%.

-
- -
-
- - -section("additionalInlineJs") ?> - - -window.datosDisenioLibro = { - papel_interior: papel_interior ? $presupuestoEntity->papel_interior : 'null'; ?>, - gramaje_interior: gramaje_interior ? $presupuestoEntity->gramaje_interior : 'null'; ?>, - papel_cubierta: papel_cubierta ? $presupuestoEntity->papel_cubierta : 'null'; ?>, - gramaje_cubierta: gramaje_cubierta ? $presupuestoEntity->gramaje_cubierta : 'null'; ?>, - papel_sobrecubierta: papel_sobrecubierta ? $presupuestoEntity->papel_sobrecubierta : 'null'; ?>, - gramaje_sobrecubierta: gramaje_sobrecubierta ? $presupuestoEntity->gramaje_sobrecubierta : 'null'; ?>, -} -window.routes_disenio_libro = { - obtenerGramaje: "", - presupuestoCliente: "", -} -endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php deleted file mode 100644 index f9cf2d07..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php +++ /dev/null @@ -1,316 +0,0 @@ -
-
- estado_id==2): ?> -

PRESUPUESTO ACEPTADO

- lomo_cubierta ?>> -
- -

Resumen

-
-
Libro
-

resumen->titulo)?$presupuestoEntity->resumen->titulo:'') ?>

-

Tamaño: resumen->tamanio)?$presupuestoEntity->resumen->tamanio:'') ?>

-

Número de páginas: paginas ?>

-

Tirada: tirada ?>

-

Prototipo: prototipo?'SI':'NO') ?>

-

Ferro: ferro?'SI':'NO') ?>

- -
Interior
-

Impresion: - resumen->tipo_impresion)?$presupuestoEntity->resumen->tipo_impresion:'') ?> -

-

paginasColor==0?'style="display:none"':'')?>> - Páginas a color: paginasColor?>

-

Papel: - papel_interior_nombre)?$presupuestoEntity->papel_interior_nombre:'') ?> - gramaje_interior)?$presupuestoEntity->gramaje_interior:'') ?>gr/m²

- -
Cubierta
-

Papel: - papel_cubierta_nombre)?$presupuestoEntity->papel_cubierta_nombre:''); ?> - gramaje_cubierta)?$presupuestoEntity->gramaje_cubierta:''); ?>gr/m²

-

Impresión: paginas_cubierta==2?"1 cara":"2 caras");?>

- solapas_ancho>0 || $presupuestoEntity->estado_id==1): ?> -

Solapas: solapas_ancho;?>mm

- - acabado_cubierta_id>0 || $presupuestoEntity->estado_id==1): ?> -

Acabado: - acabadosCubierta) && is_array($datosPresupuesto->acabadosCubierta) && !empty($datosPresupuesto->acabadosCubierta)) : - foreach ($datosPresupuesto->acabadosCubierta as $acabado) : - if ($acabado->id == $presupuestoEntity->acabado_cubierta_id): - echo $acabado->label; - endif; - endforeach; - endif; ?> -

- - - papel_sobrecubierta || $presupuestoEntity->estado_id==1): ?> -
Sobrecubierta
-

Papel: - papel_sobrecubierta_nombre)?$presupuestoEntity->papel_sobrecubierta_nombre:'') ?> - gramaje_sobrecubierta)?$presupuestoEntity->gramaje_sobrecubierta:'') ?>gr/m²

- solapas_ancho_sobrecubierta>0 || $presupuestoEntity->estado_id==1): ?> -

Ancho solapas: solapas_ancho_sobrecubierta;?>mm

- -

Acabado: - acabadosSobrecubierta) && is_array($datosPresupuesto->acabadosSobrecubierta) && !empty($datosPresupuesto->acabadosSobrecubierta)) : - foreach ($datosPresupuesto->acabadosSobrecubierta as $acabado) : - if ($acabado->id == $presupuestoEntity->acabado_sobrecubierta_id): - echo $acabado->label; - endif; - endforeach; - endif; ?> -

- - - papel_guardas || $presupuestoEntity->estado_id==1): ?> -
Guardas
-

Papel: - papel_guardas_nombre)?$presupuestoEntity->papel_guardas_nombre:''); ?> - 170gr/m²

-

Impresión: - paginas_guardas) || $presupuestoEntity->paginas_guardas==0): - echo "Sin impresion"; - elseif($presupuestoEntity->paginas_guardas==4): - echo "1 cara"; - else: - echo "2 caras"; - endif; ?>

- - - retractiladol || $presupuestoEntity->retractilado5 || $presupuestoEntity->faja_color || $presupuestoEntity->estado_id==1): ?> -
Extras
- - retractiladol): ?> -

Retractilado individual

- retractilado5): ?> -

Retractilado de 5

- faja_color): ?> -

Imprimir faja a color

- -
- -
- - estado_id==2): - $total = $presupuestoEntity->total_aceptado; - $iva = $presupuestoEntity->iva_reducido?1.04:1.21; - $total *= $iva; - $total_unidad = $presupuestoEntity->total_precio_unidad * $iva;; - echo '

Total: ' . round($total, 2) . '€

'; - echo '
' . round($total_unidad, 4) . '€/ud
' - ?> - -

Total: 100€

-
10.4€/ud
- -
-
-
- -
-
-
-
- estado_id==2): - echo '
'; - echo '

Direcciones de envío

'; - echo '
'; - if(isset($presupuestoEntity->direcciones_envio)): - foreach ($presupuestoEntity->direcciones_envio as $direccion): - echo '
'; - echo '
'; - echo ''; - echo '
'; - echo '
'; - endforeach; - endif; - echo '
'; - echo '
'; - endif; ?> - - estado_id==2): ?> -
-

Ficheros

-
-
-
- Arrastre aquí los ficheros o haga click -
-
- -
-
-
- -
- -
- - - - - -section("additionalInlineJs") ?> -window.estado = estado_id ?? 1?>; -window.tirada = selected_tirada ?? 0?>; -window.total = total_aceptado ?? 0?>; -window.total_unidad = total_precio_unidad ?? 0 ?>; -window.routes_resumen = { - guardarPresupuesto: "", - duplicarPresupuesto: "", -} - -estado_id===2): ?> - previewEsquemaCubierta(true); - - const previewTemplate = `
-
-
- -
-
-
-
-
-
-
-
-
-
-
`; - - Dropzone.autoDiscover = false; - - var dropzoneMulti = new Dropzone('#dropzone-multi', { - url: "", - addRemoveLinks: true, - previewTemplate: previewTemplate, - paramName: "file", - uploadMultiple: true, - parallelUploads: 4, // Ajusta este número al máximo número de archivos que esperas subir a la vez - maxFiles: 5, // Ajusta este número al máximo número de archivos que esperas subir a la vez - autoProcessQueue: true, - dictRemoveFile: "Eliminar", - acceptedFiles: 'image/*, application/pdf', - maxFilesize: 5e+7, // Bytes - init: function() { - thisDropzone = this; - $('#loader').show(); - - $.ajax({ - url: "", - type: 'POST', - data: { presupuesto_id: id ?> }, - - }).done(function(response) { - if(response == null || response == ""){ - return; - } - values = JSON.parse(response); - for(var i = 0; i < values.length; i++){ - var mockFile = { name: values[i].name, size: values[i].size, hash: values[i].hash}; - - thisDropzone.files.push(mockFile); // add to files array - thisDropzone.emit("addedfile", mockFile); - thisDropzone.emit("thumbnail", mockFile, window.location.host + "/sistema/intranet/presupuestos/"+values[i].hash); - thisDropzone.emit("complete", mockFile); - thisDropzone.options.success.call(thisDropzone, mockFile); - }; - }).always(function() { - $('#loader').hide(); - }); - - this.on("addedfile", function (file) { - if(file.hash){ - var viewButton = Dropzone.createElement("Ver"); - file.previewElement.appendChild(viewButton); - // Listen to the view button click event - viewButton.addEventListener("click", function (e) { - - window.open(window.location.protocol + "//" + window.location.host + "/sistema/intranet/presupuestos/"+file.hash, '_blank'); - }); - } - }); - } - }); - - $('#presupuesto-cliente-form').submit(function(e){ - e.preventDefault(); - var files = dropzoneMulti.files; - $('#loader').show(); - - var formData = new FormData(); - var oldFiles = []; - var counter = 0; - for (var i = 0; i < files.length; i++) { - - if(files[i].upload){ - var file = files[i]; - formData.append('file[' + counter + ']', file); - counter += 1; - } - else{ - oldFiles.push(files[i].name); - } - } - formData.append('oldFiles', JSON.stringify(oldFiles)); - - formData.append('presupuesto_id', id ?>); - - $.ajax({ - url: "", - type: 'POST', - data: formData, - processData: false, // Indicar a jQuery que no procese los datos - contentType: false // Indicar a jQuery que no establezca el tipo de contenido - }).done(function(response) { - // Aquí puedes manejar la respuesta del servidor - }).always(function() { - $('#loader').hide(); - }) - - return false; - }); - -endSection() ?> diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php deleted file mode 100644 index 54cf1280..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php +++ /dev/null @@ -1,122 +0,0 @@ -
-
- - lomo_cubierta ?>> - -
- -
-
-
- > - - tipo_libro == 'cosido' || $datosPresupuesto->tipo_libro == ''){ - echo 'checked=""'; - } - ?> - > -
-

Rústica cosido

-
-
- -
-
-
> - - tipo_libro)=='fresado'? 'checked=""':''); ?> > -
-

Rústica fresado

-
-
- -
-
-
> - - tipo_libro)=='grapado'? 'checked=""':''); ?> > -
-

Cosido con grapas

-
-
-
- -
-
-
-
> - - tipo_libro)=='espiral'? 'checked=""':''); ?> > -
-

Espiral

-
-
- -
-
-
> - - tipo_libro)=='wireo'? 'checked=""':''); ?> > -
-

Wire-o

-
-
- -
-
-
\ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js deleted file mode 100644 index 5a264add..00000000 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js +++ /dev/null @@ -1,387 +0,0 @@ -function initDirecciones() { - data = { - id: $('#clienteId').val() - }, - data = Object.assign(data, window.token_ajax); - $('#errorDirecciones').hide(); - - $.ajax({ - url: window.routes_direcciones.direcciones, - type: 'POST', - data: data, - success: function(response) { - $("#direcciones").empty(); - $.each(response.menu, function(index, value) { - $("#direcciones").append(''); - }); - $("#direcciones").val(''); - }, - error: function() { - $("#direcciones").empty(); - }, - }); -} - -function initTiradasDirecciones() { - const _this = this - let sel_index = 1; - - $('#containerTiradasEnvios').empty(); - - for (i = 1; i <= 4; i++) { - let id = "tiradaPrecio" + i; - if ($('#' + id).length > 0) { - - let tirada_id = "ud_tiradaPrecio" + i; - let total_id = "tot_tiradaPrecio" + i; - let precio_u_id = "pu_tiradaPrecio" + i; - let peso = $('#' + id).attr('peso'); - - let html = ''; - html += '
'; - html += '
'; - html += ''; - html += '
'; - html += '
'; - - $('#containerTiradasEnvios').append(html); - - if(parseInt($('#' + tirada_id).text().split(' ')[0]) == window.direcciones_sel_tirada){ - sel_index = i; - } - - $('#' + id).hide(); - } - } - $(('#env_tiradaPrecio' + sel_index)).trigger('click'); - - cargarDirecciones(); - - const tiradasDireccionesList = [].slice.call(document.querySelectorAll('.custom-option-tiradasDirecciones .form-check-input')) - tiradasDireccionesList.map(function (customOptionEL) { - // Update custom options check on page load - _this.updateTiradasDireccionesCheck(customOptionEL) - - // Update custom options check on click - customOptionEL.addEventListener('click', e => { - _this.updateTiradasDireccionesCheck(customOptionEL) - }) - }) -} - -function cargarDirecciones(){ - $('#loader').show(); - $('#divDirecciones').empty(); - - if(window.direcciones == null){ - $('#loader').hide(); - return; - } - for(let i=0; i'; - html += '
'; - html += ''; - html += '
'; - html += ''; - - $('#divDirecciones').append(html); - $('#errorDirecciones').hide(); - $('#loader').hide(); - } -} - -function updateTiradasDireccionesCheck(el) { - if (el.checked) { - // If custom option element is radio, remove checked from the siblings (closest `.row`) - if (el.type === 'radio') { - const customRadioOptionList = [].slice.call(el.closest('.row').querySelectorAll('.custom-option-tiradasDirecciones')) - customRadioOptionList.map(function (customRadioOptionEL) { - customRadioOptionEL.closest('.custom-option-tiradasDirecciones').classList.remove('checked') - let id_temp = customRadioOptionEL.id.split('-')[1]; - $('#' + id_temp).prop('checked', false); - }) - } - const element = el.closest('.custom-option-tiradasDirecciones'); - element.classList.add('checked'); - - let id = element.id.split('-')[1]; - $('#' + id).prop('checked', true); - - } else { - el.closest('.custom-option-tiradasDirecciones').classList.remove('checked') - } -} - - -function obtenerUnidadesEnvio(){ - - const elements = $('#divDirecciones').find('.row.mb-3'); - let total = 0; - - if(elements.length > 0) { - for (let index=0; index 0 ) { - - let unidades = $('#unidadesEnvio').val(); - if(unidades == '' || isNaN(unidades) || parseInt(unidades) <= 0){ - return false; - } - unidades = parseInt(unidades); - - const seleccion = $('.custom-option-tiradasDirecciones.checked'); - if(seleccion.length == 0) { - return false; - } - - const element_tirada =($(seleccion[0]).find('label input')[0]); - const number = element_tirada.id.match(/\d+$/); - if (number.length == 0) { - return false; - } - let tirada = parseInt($('#tiradaDireccionesValue' + number[0]).text()); - - let total = obtenerUnidadesEnvio(); - - if($('#prototipo').is(':checked')) { - tirada += 1; - } - - if(total + unidades <= tirada) { - - data = { - id: $('#direcciones').val(), - peso: $('#env_tiradaPrecio' + number[0]).attr('peso'), - unidades: unidades, - entregaPieCalle: $('#entregaPieCalle').is(':checked')?1:0, - }, - data = Object.assign(data, window.token_ajax) - - $('#loader').show(); - - $.ajax({ - url: window.routes_direcciones.getDatos, - type: 'POST', - data: data, - success: function(response) { - if(response.data.length > 0) { - let html = ''; - html += '
'; - html += '
'; - html += ''; - html += '
'; - html += '
'; - - $('#divDirecciones').append(html); - $('#errorDirecciones').hide(); - $('#loader').hide(); - } - }, - error: function() { - $("#direcciones").empty(); - $('#loader').hide(); - }, - }); - } - else{ - $('#errorDirecciones').text('El número de unidades supera la tirada seleccionada.'); - $('#errorDirecciones').show(); - } - } - return false; -}) - - - -$(document).on('click', '.eliminar-direccion', function(e) { - - $(this).closest('.row.mb-3').remove(); - - const seleccion = $('.custom-option-tiradasDirecciones.checked'); - if(seleccion.length == 0) { - return false; - } - - const element_tirada =($(seleccion[0]).find('label input')[0]); - const number = element_tirada.id.match(/\d+$/); - if (number.length == 0) { - return false; - } - - let tirada = parseInt($('#tiradaDireccionesValue' + number[0]).text()); - - const elements = $('#divDirecciones').find('.row.mb-3'); - - let total = 0; - if(elements.length > 0) { - for (let index=0; index' + value.text + ''); - }); - $("#direcciones").val(''); - $('#addressForm').modal('hide'); - }, - error: function() { - $('#addressForm').modal('hide'); - }, - }); - - } -} - -function validarEnvio(){ - - const seleccion = $('.custom-option-tiradasDirecciones.checked'); - if(seleccion.length == 0) { - return false; - } - - const element_tirada =($(seleccion[0]).find('label input')[0]); - - const number = element_tirada.id.match(/\d+$/); - if (number.length == 0) { - return false; - } - let tirada = parseInt($('#tiradaDireccionesValue' + number[0]).text()); - - let total = obtenerUnidadesEnvio(); - - if($('#prototipo').is(':checked')) { - tirada += 1; - } - - if(total != tirada){ - return false; - } - return true; -} - -function getDireccionesEnvio(){ - - const elements = $('#divDirecciones').find('.row.mb-3'); - - let direcciones = []; - - if(elements.length > 0) { - for (let index=0; index { - _this.updateTapaCheck(customOptionEL) - }) - }) -} - -function updateTapaCheck(el) { - if (el.checked) { - // If custom option element is radio, remove checked from the siblings (closest `.row`) - if (el.type === 'radio') { - const customRadioOptionList = [].slice.call(el.closest('.row').querySelectorAll('.custom-option-tapa')) - customRadioOptionList.map(function (customRadioOptionEL) { - customRadioOptionEL.closest('.custom-option-tapa').classList.remove('checked') - }) - } - el.closest('.custom-option-tapa').classList.add('checked') - if (el.closest('.custom-option-tapa').id == 'tapaBlandaInnerDiv') { - $('#tapaBlanda').prop('checked', true); - $('#tapaDura').prop('checked', false); - } - else { - $('#tapaBlanda').prop('checked', false); - $('#tapaDura').prop('checked', true); - } - } else { - el.closest('.custom-option-tapa').classList.remove('checked') - } -} - - -function initColorCheck() { - const _this = this - - const custopOptionList = [].slice.call(document.querySelectorAll('.custom-option-color .form-check-input')) - custopOptionList.map(function (customOptionEL) { - // Update custom options check on page load - _this.updateColorCheck(customOptionEL) - - // Update custom options check on click - customOptionEL.addEventListener('click', e => { - _this.updateColorCheck(customOptionEL) - }) - }) -} - -function updateColorCheck(el) { - if (el.checked) { - // If custom option element is radio, remove checked from the siblings (closest `.row`) - if (el.type === 'radio') { - const customRadioOptionList = [].slice.call(el.closest('.row-color').querySelectorAll('.custom-option-color')) - customRadioOptionList.map(function (customRadioOptionEL) { - customRadioOptionEL.closest('.custom-option-color').classList.remove('checked') - }) - } - el.closest('.custom-option-color').classList.add('checked') - if (el.closest('.custom-option-color').id == 'colorNegroDiv') { - $('#colorNegro').prop('checked', true); - $('#colorNegroHq').prop('checked', false); - $('#colorColor').prop('checked', false); - $('#colorColorHq').prop('checked', false); - } - else if (el.closest('.custom-option-color').id == 'colorNegroHqDiv') { - $('#colorNegro').prop('checked', false); - $('#colorNegroHq').prop('checked', true); - $('#colorColor').prop('checked', false); - $('#colorColorHq').prop('checked', false); - } - else if (el.closest('.custom-option-color').id == 'colorColorDiv') { - $('#colorNegro').prop('checked', false); - $('#colorNegroHq').prop('checked', false); - $('#colorColor').prop('checked', true); - $('#colorColorHq').prop('checked', false); - } - else { - $('#colorNegro').prop('checked', false); - $('#colorNegroHq').prop('checked', false); - $('#colorColor').prop('checked', false); - $('#colorColorHq').prop('checked', true); - } - - } else { - el.closest('.custom-option-color').classList.remove('checked') - } -} - - -$('#enableSobrecubierta').on('change', function () { - if ($(this).is(":checked")) { - $('.enable-sobrecubierta').show(); - } else { - $('#gramajeSobrecubierta').val('').trigger('change'); - $('#paperSobrecubierta').val('').trigger('change'); - $('#acabadosSobrecubierta').val('').trigger('change'); - $('#tamanioSolapasSobrecubierta').val(); - $('.enable-sobrecubierta').hide(); - - } -}); - - -function initDisenioLibro() { - initTapaCheck(); - initColorCheck(); - - $('.elementos-libro').trigger('change'); - $('.change-tipo-impresion').trigger('change'); - - $('#papelInterior').trigger('change'); - $('#papelInterior').val(window.datosDisenioLibro.papel_interior); - $('#gramajeInterior').append($(''); - - } -} - - -$('.calcular-presupuesto').on('change', function () { - - // se obtiene el id del elemento que ha disparado el evento - if($(this).hasClass('input-sobrecubierta')){ - if($('#papelSobrecubierta option:selected').val() == '' || $('#gramajeSobrecubierta option:selected').val() == ''){ - return; - } - } - calcularPresupuesto(); -}); - -function comprobarTiradasPOD(){ - const tiradas = getTiradas(); - - //Comprobar que todos los elementos del array tiradas estan por encima de 30 o por debajo - const tiradasPOD = tiradas.every(tirada => tirada <= 30); - const tiradasNoPOD = tiradas.every(tirada => tirada > 30); - if (tiradasPOD == !tiradasNoPOD) { - return true; - } - return false; -} - -$('#clienteId').on('select2:change', function () { - calcularPresupuesto(); -}); - - -async function calcularPresupuesto() { - - let isColor = false; - if($('#colorColorDiv').hasClass('checked') || $('#colorColorHqDiv').hasClass('checked')) - isColor = true; - let isHq = false; - if($('#colorNegroHqDiv').hasClass('checked') || $('#colorColorHqDiv').hasClass('checked')) - isHq = true; - - if(!comprobarTiradasPOD()){ - $('#errorTiradas').show(); - return; - } - $('#errorTiradas').hide(); - - // se obtiene la propiedad serv_id de los checkboxes seleccionados de la clase .servicio-extra - if (!checkValues()) { - return; - } - - let servicios = []; - $('.servicio-extra:checked').each(function () { - servicios.push($(this).attr('serv_id')); - }) - - let datos = { - tamanio: getDimensionLibro(), - tirada: getTiradas(), - paginas: $('#paginas').val(), - paginasColor: $('#paginasColor').val(), - tipo: $('.custom-option-tipo.checked').attr('id').replace('Div', ''), - tapa: $('#tapaDura').is(':checked') ? 'dura' : 'blanda', - isColor: isColor ? 1 : 0, - isHq: isHq ? 1 : 0, - papelInterior: $('#papelInterior option:selected').val(), - papelInteriorNombre: $('#papelInterior option:selected').text().trim(), - gramajeInterior: $('#gramajeInterior option:selected').text(), - excluirRotativa: $('#excluirRotativa').is(':checked')? 1 : 0, - papelCubierta: $('#papelCubierta option:selected').val(), - papelCubiertaNombre: $('#papelCubierta option:selected').text().trim(), - gramajeCubierta: $('#gramajeCubierta option:selected').text(), - carasCubierta: $('#carasCubierta').val(), - acabadoCubierta: $('#acabadosCubierta').val(), - clienteId: $('#clienteId').val(), - servicios: servicios, - } - - // Si es cosido, se añade el número de páginas del cuadernillo - if ($('#cosidoDiv').hasClass('checked')) { - datos.paginasCuadernillo = $('#paginasCuadernillo').val(); - } - // Si hay solapas de cubierta - if ($('#solapasCubierta').is(':checked')) { - datos.solapasCubierta = $('#anchoSolapasCubierta').val() - } - - - - // Si hay sobrecubierta - if ($('#enableSobrecubierta').is(':checked')) { - if($('#papelSobrecubierta option:selected').val()>0 && $('#gramajeSobrecubierta option:selected').val()>0){ - - datos.sobrecubierta = { - papel: $('#papelSobrecubierta option:selected').val(), - papel_nombre: $('#papelSobrecubierta option:selected').text().trim(), - gramaje: $('#gramajeSobrecubierta option:selected').text(), - acabado: $('#acabadosSobrecubierta').val() - } - - datos.sobrecubierta.solapas = $('#anchoSolapasSobrecubierta').val() - } - } - - if ($('#divGuardas').is(':visible')) { - datos.guardas = { - papel: $('#papelGuardas option:selected').val(), - papel_nombre: $('#papelGuardas option:selected').text().trim(), - gramaje: 170, - caras: $('#impresionGuardas option:selected').val() - } - } - - datos = Object.assign(datos, window.token_ajax) - - $('.divTiradasPrecio').empty(); - $('#loader').show(); - - $.ajax({ - url: window.routes_disenio_libro.presupuestoCliente, - type: 'POST', - data: datos, - success: function (response) { - error = false; - $('#errorGeneral').hide(); - try{ - - - if(response.errors.interior.length > 0){ - $('#errorInterior').show(); - error = true; - } - else - $('#errorInterior').hide(); - if(response.errors.cubierta.length > 0){ - $('#errorCubierta').show(); - error = true; - } - else - $('#errorCubierta').hide(); - - if(response.errors.sobrecubierta.length > 0){ - $('#errorSobrecubierta').show(); - error = true; - } - else - $('#errorSobrecubierta').hide(); - - - if(response.errors.guardas.length > 0){ - $('#errorGuardas').show(); - error = true; - } - else - $('#errorGuardas').hide(); - - if(response.errors.servicios.length > 0 || response.errors.serviciosDefecto.length > 0){ - error = true; - $('#errorGeneral').show(); - } - else{ - $('#errorGeneral').hide(); - } - } - catch(error){ - } - - //For debug only - //console.log(response); - - $('#loader').hide(); - - $('.divTiradasPrecio').empty(); - - if(!error){ - - $('#lomo_cubierta').val(response.info.lomo_cubierta); - - $('#precios').show(); - - if(response.tiradas){ - for (i = 0; i < response.tiradas.length; i++) { - const total = (parseFloat(response.precio_u[i]) * parseInt(response.tiradas[i])).toFixed(2) ; - const label = "tiradaPrecio" + parseInt(i+1); - - let html = ''; - - html += ''; - - $('.divTiradasPrecio').append(html); - } - } - - if($('#resumen-libro').hasClass('active')) { - initDirecciones(); - initTiradasDirecciones(); - generarResumen(); - previewEsquemaCubierta(true); - } - - } - }, - error: function (error) { - $('#loader').hide(); - $('.divTiradasPrecio').empty(); - } - }); -} \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_direcciones.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_direcciones.php index 67af53db..a35d6b5e 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_direcciones.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_direcciones.php @@ -13,7 +13,15 @@
-
+
+
+ + +
+
+ +
@@ -36,7 +44,7 @@
-
+
-
+
- +
-
+
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_disenioCubierta.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_disenioCubierta.php index 5b242bca..705495f1 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_disenioCubierta.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/items/_disenioCubierta.php @@ -171,46 +171,12 @@
-
- - -
- -
- - -
- -
-
- -
- -
+
" @@ -230,11 +196,11 @@

Extras

-
+
-
+ -
+
@@ -266,20 +232,14 @@
-
+
-
- -
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/loader.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/loader.php index a0ef0448..c1098b6f 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/loader.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/loader.php @@ -1,4 +1,4 @@ -
+ - - + + + - - - - - - - - - - -
ID
-
- - -
-
ID
- first_name) || strlen($item->first_name) < 51 ? esc($item->first_name) : character_limiter(esc($item->first_name), 50) ?> - - last_name) || strlen($item->last_name) < 51 ? esc($item->last_name) : character_limiter(esc($item->last_name), 50) ?> - - getProvider()->findById($item->id)->email) ? "" : character_limiter(esc(auth()->getProvider()->findById($item->id)->email), 50) ?> - - last_active) ? '' : date('d/m/Y H:m:s', strtotime($item->last_active)) ?> - - id), "", ['class' => 'text-body', 'data-id' => $item->id,]); ?> - ", ['class' => 'text-body', 'data-href' => route_to('deleteUser', $item->id), 'data-bs-toggle' => 'modal', 'data-bs-target' => '#confirm2delete']); ?> -
@@ -56,4 +37,24 @@ -endSection() ?> \ No newline at end of file +endSection() ?> + + +section('css') ?> + "> +endSection() ?> + +section('additionalExternalJs') ?> + + + + + + + + + + + + +endSection() ?> diff --git a/httpdocs/assets/js/safekat/components/alerts/alert.js b/httpdocs/assets/js/safekat/components/alerts/alert.js index ace6fde9..25595040 100644 --- a/httpdocs/assets/js/safekat/components/alerts/alert.js +++ b/httpdocs/assets/js/safekat/components/alerts/alert.js @@ -7,6 +7,8 @@ class Alert { this.icon = this.item.find(".icon-alert") this.iconSuccess = "ti-circle-check" this.iconError = "ti-exclamation-mark" + this.iconInfo = "ti-question-mark" + @@ -14,6 +16,7 @@ class Alert { setIcon(iconClass){ this.icon.removeClass(this.iconSuccess) this.icon.removeClass(this.iconError) + this.icon.removeClass(this.iconInfo) this.icon.addClass(iconClass) } setAsError() { @@ -24,16 +27,25 @@ class Alert { } setAsSuccess() { this.item.removeClass("alert-danger") + this.item.removeClass("alert-warning") + this.item.removeClass("alert-info") this.item.addClass("alert-success") this.setIcon(this.iconSuccess) } setAsWarning() { this.item.removeClass("alert-success") + this.item.removeClass("alert-danger") + this.item.removeClass("alert-info") this.item.addClass("alert-warning") + this.setIcon(this.iconError) + } setAsInfo() { - this.item.removeClass("alert-*") + this.item.removeClass("alert-success") + this.item.removeClass("alert-danger") + this.item.addClass("alert-warning") this.item.addClass("alert-info") + this.setIcon(this.iconInfo) } show() { this.item.removeClass("d-none") @@ -48,6 +60,16 @@ class Alert { this.body.append(content) } setErrors() { } + reset(){ + this.item.removeClass("alert-success") + this.item.removeClass("alert-danger") + this.item.removeClass("alert-warning") + this.item.removeClass("alert-info") + this.item.setContent("") + this.item.setHeadingTitle("") + this.item.hide() + + } } export default Alert; \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/components/modalYesNo.js b/httpdocs/assets/js/safekat/components/modalYesNo.js index 2a88cc59..d9531dcc 100644 --- a/httpdocs/assets/js/safekat/components/modalYesNo.js +++ b/httpdocs/assets/js/safekat/components/modalYesNo.js @@ -7,8 +7,10 @@ class ModalYesNo { this.btnCancelId = alias !== "" ? `btnCancelModal-${alias}` : 'btnCancelModal'; this.btnConfirmId = alias !== "" ? `btnYesModal-${alias}` : 'btnYesModal'; + this.callback = () => {}; + this.modalHtml = ` -