diff --git a/.gitignore b/.gitignore index 2740fefd..2d42bcbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ ci4/.env .vscode/ -xdebug.log \ No newline at end of file +./xdebug.log \ No newline at end of file diff --git a/.idea/safekat.iml b/.idea/safekat.iml index c956989b..30e3cdd1 100755 --- a/.idea/safekat.iml +++ b/.idea/safekat.iml @@ -1,7 +1,13 @@ - + + + + + + + diff --git a/ci4/app/Config/RBAC/permissionMatrix.php b/ci4/app/Config/RBAC/permissionMatrix.php index 8dc1c381..c1c73039 100644 --- a/ci4/app/Config/RBAC/permissionMatrix.php +++ b/ci4/app/Config/RBAC/permissionMatrix.php @@ -5,34 +5,34 @@ const SK_PERMISSION_MATRIX = [ "clientes.edit", "clientes.delete", "clientes.menu", - "plantillaTarifa.create", - "plantillaTarifa.edit", - "plantillaTarifa.delete", - "plantillaTarifa.menu", + "plantilla-tarifa.create", + "plantilla-tarifa.edit", + "plantilla-tarifa.delete", + "plantilla-tarifa.menu", "presupuesto.create", "presupuesto.edit", "presupuesto.delete", "presupuesto.menu", - "tarifaPreimpresion.create", - "tarifaPreimpresion.edit", - "tarifaPreimpresion.delete", - "tarifaPreimpresion.menu", - "tarifaManipulado.create", - "tarifaManipulado.edit", - "tarifaManipulado.delete", - "tarifaManipulado.menu", - "tarifaAcabado.create", - "tarifaAcabado.edit", - "tarifaAcabado.delete", - "tarifaAcabado.menu", - "tarifaEncuadernacion.create", - "tarifaEncuadernacion.edit", - "tarifaEncuadernacion.delete", - "tarifaEncuadernacion.menu", - "tarifaEnvio.create", - "tarifaEnvio.edit", - "tarifaEnvio.delete", - "tarifaEnvio.menu", + "tarifa-preimpresion.create", + "tarifa-preimpresion.edit", + "tarifa-preimpresion.delete", + "tarifa-preimpresion.menu", + "tarifa-manipulado.create", + "tarifa-manipulado.edit", + "tarifa-manipulado.delete", + "tarifa-manipulado.menu", + "tarifa-acabado.create", + "tarifa-acabado.edit", + "tarifa-acabado.delete", + "tarifa-acabado.menu", + "tarifa-encuadernacion.create", + "tarifa-encuadernacion.edit", + "tarifa-encuadernacion.delete", + "tarifa-encuadernacion.menu", + "tarifa-envio.create", + "tarifa-envio.edit", + "tarifa-envio.delete", + "tarifa-envio.menu", "proveedores.create", "proveedores.edit", "proveedores.delete", @@ -45,8 +45,36 @@ const SK_PERMISSION_MATRIX = [ "actividad.edit", "actividad.delete", "actividad.menu", + "paises.create", + "paises.edit", + "paises.delete", + "paises.menu", + "maquinas.create", + "maquinas.edit", + "maquinas.delete", + "maquinas.menu", + "maquinas-defecto.create", + "maquinas-defecto.edit", + "maquinas-defecto.delete", + "maquinas-defecto.menu", + "papel-generico.create", + "papel-generico.edit", + "papel-generico.delete", + "papel-generico.menu", + "papel-impresion.create", + "papel-impresion.edit", + "papel-impresion.delete", + "papel-impresion.menu", + "usuarios.create", + "usuarios.edit", + "usuarios.delete", + "usuarios.menu", + "roles-permisos.create", + "roles-permisos.edit", + "roles-permisos.delete", + "roles-permisos.menu", ], - "cliente" => [ + "cliente-admin" => [ "clientes.create", "clientes.edit", "clientes.delete", @@ -56,6 +84,52 @@ const SK_PERMISSION_MATRIX = [ "presupuesto.delete", "presupuesto.menu", ], + "cliente-editor" => [ + "clientes.create", + "clientes.edit", + "clientes.delete", + "clientes.menu", + "plantilla-tarifa.create", + "plantilla-tarifa.edit", + "plantilla-tarifa.delete", + "plantilla-tarifa.menu", + "presupuesto.create", + "presupuesto.edit", + "presupuesto.delete", + "presupuesto.menu", + "tarifa-preimpresion.create", + "tarifa-preimpresion.edit", + "tarifa-preimpresion.delete", + "tarifa-preimpresion.menu", + "tarifa-manipulado.create", + "tarifa-manipulado.edit", + "tarifa-manipulado.delete", + "tarifa-manipulado.menu", + "tarifa-acabado.create", + "tarifa-acabado.edit", + "tarifa-acabado.delete", + "tarifa-acabado.menu", + "tarifa-encuadernacion.create", + "tarifa-encuadernacion.edit", + "tarifa-encuadernacion.delete", + "tarifa-encuadernacion.menu", + "tarifa-envio.create", + "tarifa-envio.edit", + "tarifa-envio.delete", + "tarifa-envio.menu", + "proveedores.create", + "proveedores.edit", + "proveedores.delete", + "proveedores.menu", + "ajustes.create", + "ajustes.edit", + "ajustes.delete", + "ajustes.menu", + "actividad.create", + "actividad.edit", + "actividad.delete", + "actividad.menu", + ], "comercial" => [ "token.token", "token.menu", @@ -86,4 +160,50 @@ const SK_PERMISSION_MATRIX = [ "Profile.index", "Profile.menu", ], + "beta" => [ + "clientes.create", + "clientes.edit", + "clientes.delete", + "clientes.menu", + "plantilla-tarifa.create", + "plantilla-tarifa.edit", + "plantilla-tarifa.delete", + "plantilla-tarifa.menu", + "presupuesto.create", + "presupuesto.edit", + "presupuesto.delete", + "presupuesto.menu", + "tarifa-preimpresion.create", + "tarifa-preimpresion.edit", + "tarifa-preimpresion.delete", + "tarifa-preimpresion.menu", + "tarifa-manipulado.create", + "tarifa-manipulado.edit", + "tarifa-manipulado.delete", + "tarifa-manipulado.menu", + "tarifa-acabado.create", + "tarifa-acabado.edit", + "tarifa-acabado.delete", + "tarifa-acabado.menu", + "tarifa-encuadernacion.create", + "tarifa-encuadernacion.edit", + "tarifa-encuadernacion.delete", + "tarifa-encuadernacion.menu", + "tarifa-envio.create", + "tarifa-envio.edit", + "tarifa-envio.delete", + "tarifa-envio.menu", + "proveedores.create", + "proveedores.edit", + "proveedores.delete", + "proveedores.menu", + "ajustes.create", + "ajustes.edit", + "ajustes.delete", + "ajustes.menu", + "actividad.create", + "actividad.edit", + "actividad.delete", + "actividad.menu", + ], ]; diff --git a/ci4/app/Config/RBAC/permissionMatrix.php.old b/ci4/app/Config/RBAC/permissionMatrix.php.old new file mode 100644 index 00000000..204d15f2 --- /dev/null +++ b/ci4/app/Config/RBAC/permissionMatrix.php.old @@ -0,0 +1,28 @@ + [ + "admin.*", + "users.*", + "beta.*" + ], + "admin"=> [ + "admin.access", + "users.create", + "users.edit", + "users.delete", + "beta.access" + ], + "developer"=> [ + "admin.access", + "admin.settings", + "users.create", + "users.edit", + "beta.access" + ], + "user"=> [ + "users.list" + ], + "beta"=> [ + "beta.access" + ] +]; \ No newline at end of file diff --git a/ci4/app/Config/RBAC/permissions.php b/ci4/app/Config/RBAC/permissions.php index 3899e9b1..aa6861aa 100644 --- a/ci4/app/Config/RBAC/permissions.php +++ b/ci4/app/Config/RBAC/permissions.php @@ -5,34 +5,34 @@ const SK_PERMISSIONS = [ 'clientes.edit' => 'Can edit', 'clientes.delete' => 'Can delete', 'clientes.menu' => 'Menu shall be visualize', - 'plantillaTarifa.create' => 'Can create', - 'plantillaTarifa.edit' => 'Can edit', - 'plantillaTarifa.delete' => 'Can delete', - 'plantillaTarifa.menu' => 'Menu shall be visualize', + 'plantilla-tarifa.create' => 'Can create', + 'plantilla-tarifa.edit' => 'Can edit', + 'plantilla-tarifa.delete' => 'Can delete', + 'plantilla-tarifa.menu' => 'Menu shall be visualize', 'presupuesto.create' => 'Can create', 'presupuesto.edit' => 'Can edit', 'presupuesto.delete' => 'Can delete', 'presupuesto.menu' => 'Menu shall be visualize', - 'tarifaPreimpresion.create' => 'Can create', - 'tarifaPreimpresion.edit' => 'Can edit', - 'tarifaPreimpresion.delete' => 'Can delete', - 'tarifaPreimpresion.menu' => 'Menu shall be visualize', - 'tarifaManipulado.create' => 'Can create', - 'tarifaManipulado.edit' => 'Can edit', - 'tarifaManipulado.delete' => 'Can delete', - 'tarifaManipulado.menu' => 'Menu shall be visualize', - 'tarifaAcabado.create' => 'Can create', - 'tarifaAcabado.edit' => 'Can edit', - 'tarifaAcabado.delete' => 'Can delete', - 'tarifaAcabado.menu' => 'Menu shall be visualize', - 'tarifaEncuadernacion.create' => 'Can create', - 'tarifaEncuadernacion.edit' => 'Can edit', - 'tarifaEncuadernacion.delete' => 'Can delete', - 'tarifaEncuadernacion.menu' => 'Menu shall be visualize', - 'tarifaEnvio.create' => 'Can create', - 'tarifaEnvio.edit' => 'Can edit', - 'tarifaEnvio.delete' => 'Can delete', - 'tarifaEnvio.menu' => 'Menu shall be visualize', + 'tarifa-preimpresion.create' => 'Can create', + 'tarifa-preimpresion.edit' => 'Can edit', + 'tarifa-preimpresion.delete' => 'Can delete', + 'tarifa-preimpresion.menu' => 'Menu shall be visualize', + 'tarifa-manipulado.create' => 'Can create', + 'tarifa-manipulado.edit' => 'Can edit', + 'tarifa-manipulado.delete' => 'Can delete', + 'tarifa-manipulado.menu' => 'Menu shall be visualize', + 'tarifa-acabado.create' => 'Can create', + 'tarifa-acabado.edit' => 'Can edit', + 'tarifa-acabado.delete' => 'Can delete', + 'tarifa-acabado.menu' => 'Menu shall be visualize', + 'tarifa-encuadernacion.create' => 'Can create', + 'tarifa-encuadernacion.edit' => 'Can edit', + 'tarifa-encuadernacion.delete' => 'Can delete', + 'tarifa-encuadernacion.menu' => 'Menu shall be visualize', + 'tarifa-envio.create' => 'Can create', + 'tarifa-envio.edit' => 'Can edit', + 'tarifa-envio.delete' => 'Can delete', + 'tarifa-envio.menu' => 'Menu shall be visualize', 'proveedores.create' => 'Can create', 'proveedores.edit' => 'Can edit', 'proveedores.delete' => 'Can delete', @@ -45,4 +45,32 @@ const SK_PERMISSIONS = [ 'actividad.edit' => 'Can edit', 'actividad.delete' => 'Can delete', 'actividad.menu' => 'Menu shall be visualize', + 'paises.create' => 'Can create', + 'paises.edit' => 'Can edit', + 'paises.delete' => 'Can delete', + 'paises.menu' => 'Menu shall be visualize', + 'maquinas.create' => 'Can create', + 'maquinas.edit' => 'Can edit', + 'maquinas.delete' => 'Can delete', + 'maquinas.menu' => 'Menu shall be visualize', + 'maquinas-defecto.create' => 'Can create', + 'maquinas-defecto.edit' => 'Can edit', + 'maquinas-defecto.delete' => 'Can delete', + 'maquinas-defecto.menu' => 'Menu shall be visualize', + 'papel-generico.create' => 'Can create', + 'papel-generico.edit' => 'Can edit', + 'papel-generico.delete' => 'Can delete', + 'papel-generico.menu' => 'Menu shall be visualize', + 'papel-impresion.create' => 'Can create', + 'papel-impresion.edit' => 'Can edit', + 'papel-impresion.delete' => 'Can delete', + 'papel-impresion.menu' => 'Menu shall be visualize', + 'usuarios.create' => 'Can create', + 'usuarios.edit' => 'Can edit', + 'usuarios.delete' => 'Can delete', + 'usuarios.menu' => 'Menu shall be visualize', + 'roles-permisos.create' => 'Can create', + 'roles-permisos.edit' => 'Can edit', + 'roles-permisos.delete' => 'Can delete', + 'roles-permisos.menu' => 'Menu shall be visualize', ]; diff --git a/ci4/app/Config/RBAC/permissions.php.old b/ci4/app/Config/RBAC/permissions.php.old new file mode 100644 index 00000000..7981a017 --- /dev/null +++ b/ci4/app/Config/RBAC/permissions.php.old @@ -0,0 +1,11 @@ + 'Can access the sites admin area', + 'admin.settings' => 'Can access the main site settings', + 'users.manage-admins' => 'Can manage other admins', + 'users.list' => 'Can list user stuff', + 'users.create' => 'Can create new non-admin users', + 'users.edit' => 'Can edit existing non-admin users', + 'users.delete' => 'Can delete existing non-admin users', + 'beta.access' => 'Can access beta-level features', +]; \ No newline at end of file diff --git a/ci4/app/Config/RBAC/roles.json b/ci4/app/Config/RBAC/roles.json new file mode 100644 index 00000000..a95d9582 --- /dev/null +++ b/ci4/app/Config/RBAC/roles.json @@ -0,0 +1,22 @@ +{ + "superadmin": { + "title": "Super Admin", + "description": "Complete control of the site." + }, + "admin": { + "title": "Admin", + "description": "Day to day administrators of the site." + }, + "developer": { + "title": "Developer", + "description": "Site programmers." + }, + "user": { + "title": "User", + "description": "General users of the site. Often customers." + }, + "beta": { + "title": "Beta User", + "description": "Has access to beta-level features." + } +} \ No newline at end of file diff --git a/ci4/app/Config/RBAC/roles.php b/ci4/app/Config/RBAC/roles.php index 4f0dda0c..217aaf1f 100644 --- a/ci4/app/Config/RBAC/roles.php +++ b/ci4/app/Config/RBAC/roles.php @@ -3,12 +3,16 @@ const SK_ROLES = [ 'admin' => [ 'title' => 'Administrador', - 'description' => 'Describeme', - ], - 'cliente' => [ - 'title' => 'Cliente', 'description' => '', ], + 'cliente-admin' => [ + 'title' => 'Cliente administrador', + 'description' => 'Rol de cliente con permisos de administración', + ], + 'cliente-editor' => [ + 'title' => 'Cliente editor', + 'description' => 'Rol de cliente con permisos de edición', + ], 'comercial' => [ 'title' => 'Comercial', 'description' => '', @@ -37,4 +41,8 @@ const SK_ROLES = [ 'title' => 'Editor', 'description' => '', ], + 'beta' => [ + 'title' => 'Beta', + 'description' => '', + ], ]; diff --git a/ci4/app/Config/RBAC/roles.php.old b/ci4/app/Config/RBAC/roles.php.old new file mode 100644 index 00000000..37505ff7 --- /dev/null +++ b/ci4/app/Config/RBAC/roles.php.old @@ -0,0 +1,23 @@ + [ + 'title' => 'Super Admin', + 'description' => 'Complete control of the site.', + ], + 'admin' => [ + 'title' => 'Admin', + 'description' => 'Day to day administrators of the site.', + ], + 'developer' => [ + 'title' => 'Developer', + 'description' => 'Site programmers.', + ], + 'user' => [ + 'title' => 'User', + 'description' => 'General users of the site. Often customers.', + ], + 'beta' => [ + 'title' => 'Beta User', + 'description' => 'Has access to beta-level features.', + ], +]; \ No newline at end of file diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 68f8b2ae..529ce510 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -534,16 +534,17 @@ $routes->group('cosidotapablanda', ['namespace' => 'App\Controllers\Presupuestos $routes->resource('cosidotapablanda', ['namespace' => 'App\Controllers\Presupuestos', 'controller' => 'Cosidotapablanda', 'except' => 'show,new,create,update']); $routes->group('presupuestocliente', ['namespace' => 'App\Controllers\Presupuestos'], function ($routes) { - $routes->get('list/(:num)', 'Presupuestocliente::list/$1', ['as' => 'listarPresupuestoCliente']); // HOMOGENIZAR CON ARGS DINAMICOS!!! + $routes->get('list', 'Presupuestocliente::list', ['as' => 'listaPresupuestos']); + $routes->post('datatable', 'Presupuestocliente::datatable', ['as' => 'datatableOfPresupuestos']); $routes->get('add', 'Presupuestocliente::add', ['as' => 'nuevoPresupuestoCliente']); $routes->post('add', 'Presupuestocliente::add', ['as' => 'crearPresupuestoCliente']); $routes->post('edit/(:num)', 'Presupuestocliente::edit/$1', ['as' => 'editarPresupuestoCliente']); - $routes->post('datatable', 'Cosidotapablanda::datatable', ['as' => 'tablaPresupuestosCliente']); $routes->post('getgramaje', 'Presupuestocliente::getGramaje', ['as' => 'obtenerGramaje']); $routes->post('presupuesto', 'Presupuestocliente::presupuesto', ['as' => 'presupuestoCliente']); $routes->post('getDireccionesCliente', 'Presupuestocliente::getDireccionesCliente', ['as' => 'getDirecciones']); $routes->post('getDatosDireccion', 'Presupuestocliente::getDatosDireccion', ['as' => 'getDatosDireccion']); $routes->post('getNuevaDireccion', 'Presupuestocliente::getNuevaDireccion', ['as' => 'nuevaDireccion']); + $routes->post('guardarPresupuesto', 'Presupuestocliente::guardarPresupuesto', ['as' => 'guardarPresupuesto']); }); $routes->resource('presupuestocliente', ['namespace' => 'App\Controllers\Presupuestos', 'controller' => 'Presupuestocliente', 'except' => 'show,new,create,update']); diff --git a/ci4/app/Controllers/Js_loader.php b/ci4/app/Controllers/Js_loader.php index 8dceddde..7fabccd0 100755 --- a/ci4/app/Controllers/Js_loader.php +++ b/ci4/app/Controllers/Js_loader.php @@ -111,5 +111,11 @@ class Js_loader extends BaseController $this->response->setHeader('Content-Type', 'text/javascript'); return view('themes/vuexy/form/presupuestos/cliente/resumen.js'); } + + function presupuestoClientePreview_js() + { + $this->response->setHeader('Content-Type', 'text/javascript'); + return view('themes/vuexy/form/presupuestos/cliente/previews.js'); + } } \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Buscador.php b/ci4/app/Controllers/Presupuestos/Buscador.php index ef261dea..30b7b53e 100644 --- a/ci4/app/Controllers/Presupuestos/Buscador.php +++ b/ci4/app/Controllers/Presupuestos/Buscador.php @@ -97,11 +97,11 @@ class Buscador extends \App\Controllers\BaseResourceController $order1 = PresupuestoModel::SORTABLE[$requestedOrder1 >= 0 ? $requestedOrder1 : 0]; $dir1 = $reqData['order']['0']['dir'] ?? 'asc'; $requestedOrder2 = $reqData['order']['1']['column'] ?? 0; - $order2 = PresupuestoModel::SORTABLE[$requestedOrder2 >= 0 ? $requestedOrder1 : 0]; - $dir2 = $reqData['order']['0']['dir'] ?? 'asc'; + $order2 = PresupuestoModel::SORTABLE[$requestedOrder2 >= 0 ? $requestedOrder2 : 0]; + $dir2 = $reqData['order']['1']['dir'] ?? 'asc'; $requestedOrder3 = $reqData['order']['2']['column'] ?? 0; - $order3 = PresupuestoModel::SORTABLE[$requestedOrder3 >= 0 ? $requestedOrder1 : 0]; - $dir3 = $reqData['order']['0']['dir'] ?? 'asc'; + $order3 = PresupuestoModel::SORTABLE[$requestedOrder3 >= 0 ? $requestedOrder3 : 0]; + $dir3 = $reqData['order']['2']['dir'] ?? 'asc'; $searchValues = get_filter_datatables_columns($reqData); diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 1806dd70..7346983f 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -15,8 +15,11 @@ use App\Models\Presupuestos\PresupuestoModel; use App\Models\Presupuestos\PresupuestoPreimpresionesModel; use App\Models\Presupuestos\PresupuestoServiciosExtraModel; use App\Services\PresupuestoClienteService; +use App\Services\PresupuestoService; use Exception; +use function PHPUnit\Framework\containsOnly; + class Presupuestocliente extends \App\Controllers\BaseResourceController { protected $modelName = "PresupuestoModel"; @@ -31,7 +34,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController protected static $viewPath = 'themes/vuexy/form/presupuestos/cliente/'; - protected $indexRoute = 'cosidotapablandaList'; + protected $indexRoute = 'listaPresupuestos'; @@ -52,90 +55,30 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } - public function list($tipo_impresion_id = 4) + public function list() { $viewData = [ 'currentModule' => static::$controllerSlug, 'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Presupuestos.presupuesto')]), 'presupuestoEntity' => new PresupuestoEntity(), 'usingServerSideDataTable' => true, - 'tipo_impresion_id' => $tipo_impresion_id + 'pageTitle' => lang('Presupuestos.presupuestos'), ]; - $viewData = array_merge($viewData, $this->getStringsFromTipoImpresion($tipo_impresion_id)); - $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class + if (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) { + $clienteId = 999; // Fijo hasta desarollar clientes usuarios + } else { + $clienteId = 0; + } - - return view(static::$viewPath . 'viewCosidotapablandaList', $viewData); + $viewData['clienteId'] = $clienteId; + return view(static::$viewPath . 'viewPresupuestoList', $viewData); } public function add() { - - // JJO - $session = session(); - - $requestMethod = $this->request->getMethod(); - - if ($requestMethod === 'post') : - - $nullIfEmpty = true; // !(phpversion() >= '8.1'); - - $postData = $this->request->getPost(); - - $sanitizedData = $this->sanitized($postData, $nullIfEmpty); - - // JJO - $sanitizedData['user_created_id'] = $session->id_user; - - if (!isset($sanitizedData['papel_formato_id']) || $sanitizedData['papel_formato_id'] == null) { - $sanitizedData['papel_formato_id'] = 0; - } - - if (!isset($sanitizedData['is_duplicado']) || $sanitizedData['is_duplicado'] == null) { - $sanitizedData['is_duplicado'] = 0; - } - - $noException = true; - if ($successfulResult = $this->canValidate($this->model->validationRulesAdd, $this->model->validationMessagesAdd)) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : - - if ($this->canValidate($this->model->validationRulesAdd, $this->model->validationMessagesAdd)) : - try { - $successfulResult = $this->model->skipValidation(true)->save($sanitizedData); - } catch (\Exception $e) { - $noException = false; - $this->dealWithException($e); - } - else : - $this->viewData['errorMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Presupuestos.presupuesto'))]); - $this->session->setFlashdata('formErrors', $this->model->errors()); - endif; - - $thenRedirect = true; // Change this to false if you want your user to stay on the form after submission - endif; - if ($noException && $successfulResult) : - - $id = $this->model->db->insertID(); - - $message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.'; - - if ($thenRedirect) : - if (!empty($this->indexRoute)) : - //return redirect()->to(route_to( $this->indexRoute ) )->with('sweet-success', $message); - return redirect()->to(site_url('presupuestos/cliente/edit/' . $id))->with('sweet-success', $message); - else : - return $this->redirect2listView('sweet-success', $message); - endif; - else : - $this->session->setFlashData('sweet-success', $message); - endif; - - endif; // $noException && $successfulResult - - endif; // ($requestMethod === 'post') - // Se obtiene el cliente ID a partir del usuario de la sesion $clienteId = 999; // Fijo hasta desarollar clientes usuarios @@ -159,6 +102,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $datosPresupuesto->acabadosCubierta = $this->getAcabadosCubierta(); $datosPresupuesto->acabadosSobrecubierta = $this->getAcabadosSobrecubierta(); + $datosPresupuesto->tipo_libro = ""; + $datosPresupuesto->color_impresion = 'negro'; + $datosPresupuesto->calidad_impresion = 'estandar'; + $datosPresupuesto->tapa = 'blanda'; + $datosPresupuesto->clienteList = $this->getClienteListItems($presupuestoEntity->cliente_id ?? null); $this->viewData['formAction'] = route_to('crearPresupuestoCliente'); @@ -192,218 +140,46 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $requestMethod = $this->request->getMethod(); - if ($requestMethod === 'post') : + $datosPresupuesto = (object)array(); + $datosPresupuesto->POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); + $datosPresupuesto->paisList = model('App\Models\Configuracion\PaisModel')->getAllForMenu('id, nombre', 'nombre', true); + $datosPresupuesto->papelFormatoList = $this->getPapelFormatoListItems($presupuestoEntity->papel_formato_id ?? null); - $nullIfEmpty = true; // !(phpversion() >= '8.1'); + $datosPresupuesto->papelInteriorNegro = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('negro', false, false, false, false, true); + $datosPresupuesto->papelInteriorNegroHq = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('negrohq', false, false, false, false, true); + $datosPresupuesto->papelInteriorColor = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('color', false, false, false, false, true); + $datosPresupuesto->papelInteriorColorHq = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('colorhq', false, false, false, false, true); - $postData = $this->request->getPost(); + $datosPresupuesto->papelCubierta = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('colorhq', true, false, false, false, true); + $datosPresupuesto->papelSobrecubierta = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('colorhq', false, true, false, false, true); + $datosPresupuesto->papelGuardas = model('App\Models\Configuracion\PapelGenericoModel')->getPapelForComparador('colorhq', false, false, false, true, false); - $postData['updated_at'] = gmdate('Y-m-d H:m:s', time()); + $datosPresupuesto->acabadosCubierta = $this->getAcabadosCubierta(); + $datosPresupuesto->acabadosSobrecubierta = $this->getAcabadosSobrecubierta(); - $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + $datosPresupuesto->tipo_libro = $this->getTipoLibro($presupuestoEntity->tipo_impresion_id ?? null); + [$datosPresupuesto->color_impresion, $datosPresupuesto->calidad_impresion] = + $this->getTipoInterior($presupuestoEntity->id ?? null); + $datosPresupuesto->tapa = $this->getTapa($presupuestoEntity->tipo_impresion_id ?? null); - // JJO - $sanitizedData['user_updated_id'] = $session->id_user; - - if ($this->request->getPost('is_duplicado') == null) { - $sanitizedData['is_duplicado'] = 0; - } - - if ($this->request->getPost('retractilado') == null) { - $sanitizedData['retractilado'] = false; - } - if ($this->request->getPost('retractilado5') == null) { - $sanitizedData['retractilado5'] = false; - } - if ($this->request->getPost('ferro') == null) { - $sanitizedData['ferro'] = false; - } - if ($this->request->getPost('ferro_digital') == null) { - $sanitizedData['ferro_digital'] = false; - } - if ($this->request->getPost('prototipo') == null) { - $sanitizedData['prototipo'] = false; - } - if ($this->request->getPost('marcapaginas') == null) { - $sanitizedData['marcapaginas'] = false; - } - if ($this->request->getPost('faja_color') == null) { - $sanitizedData['faja_color'] = false; - } - if ($this->request->getPost('papel_formato_personalizado') == null) { - $sanitizedData['papel_formato_personalizado'] = false; - } - - if ($this->request->getPost('papel_formato_id') == null) { - $sanitizedData['papel_formato_id'] = 0; - } - - if ($this->request->getPost('solapas') == null) { - $sanitizedData['solapas'] = 0; - } - if ($this->request->getPost('solapas_sobrecubierta') == null) { - $sanitizedData['solapas_sobrecubierta'] = 0; - } - - $noException = true; - if ( - $sanitizedData['papel_formato_id'] == null && $sanitizedData['papel_formato_ancho'] == null - && $sanitizedData['papel_formato_alto'] == null - ) { - if ($this->request->isAJAX()) { - $newTokenHash = csrf_hash(); - $csrfTokenName = csrf_token(); - $data = [ - 'errorMensaje' => lang('Presupuestos.errores.formato_papel'), - $csrfTokenName => $newTokenHash - ]; - return $this->respond($data); - } else { - $this->session->setFlashData('errorMessage', lang('Presupuestos.errores.formato_papel')); - } - $successfulResult = false; - } else { - - if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) - - if ($this->canValidate()) : - try { - $successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData); - } catch (\Exception $e) { - $noException = false; - $this->dealWithException($e); - } - else : - $this->viewData['warningMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('Presupuestos.presupuesto'))]); - $this->session->setFlashdata('formErrors', $this->model->errors()); - - endif; - - $presupuestoEntity->fill($sanitizedData); - - $thenRedirect = false; - endif; - } - - if ($noException && $successfulResult) : - $id = $presupuestoEntity->id ?? $id; - $message = lang('Basic.global.updateSuccess', [mb_strtolower(lang('Presupuestos.presupuesto'))]) . '.'; - - if ($thenRedirect) : - if (!empty($this->indexRoute)) : - return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); - else : - if ($this->request->isAJAX()) { - $newTokenHash = csrf_hash(); - $csrfTokenName = csrf_token(); - $data = [ - 'mensaje' => $message, - $csrfTokenName => $newTokenHash - ]; - return $this->respond($data); - } else { - return $this->redirect2listView('sweet-success', $message); - } - - endif; - else : - if ($this->request->isAJAX()) { - $newTokenHash = csrf_hash(); - $csrfTokenName = csrf_token(); - $data = [ - 'mensaje' => $message, - $csrfTokenName => $newTokenHash - ]; - return $this->respond($data); - } else { - $this->session->setFlashData('sweet-success', $message); - } - endif; - - endif; // $noException && $successfulResult - endif; // ($requestMethod === 'post') - - /* - $this->viewData['presupuestoId'] = $id; - $this->viewData['presupuestoEntity'] = $presupuestoEntity; - $this->viewData['isCosido'] = (new TipoPresupuestoModel())->get_isCosido($presupuestoEntity->tipo_impresion_id); - $this->viewData['isTapaDura'] = (new TipoPresupuestoModel())->get_isTapaDura($presupuestoEntity->tipo_impresion_id); - - if (!is_null($presupuestoEntity->comparador_json_data)) - $this->viewData['comp_data'] = json_decode($presupuestoEntity->comparador_json_data); - else - $this->viewData['comp_data'] = ""; - - $this->viewData['clienteList'] = $this->getClienteListItems($presupuestoEntity->cliente_id ?? null); - $this->viewData['paisList'] = $this->getPaisListItems(); - $this->viewData['ccaaList'] = $this->getCcaaListItems(); - - $this->viewData['clienteList'] = $this->getClienteListItems($presupuestoEntity->cliente_id ?? null); - $this->viewData['incReiList'] = array('incidencia' => lang('Presupuestos.incidencia'), 'reimpresion' => lang('Presupuestos.reimpresion'), 'sin_cargo' => lang('Presupuestos.sinCargo')); - $this->viewData['papelFormatoList'] = $this->getPapelFormatoListItems($presupuestoEntity->papel_formato_id ?? null); - $this->viewData['papelGenericoNegroList'] = $this->getPapelGenericoNegro(); - $this->viewData['papelGenericoNegroHQList'] = $this->getPapelGenericoNegroHQ(); - $this->viewData['papelGenericoColorList'] = $this->getPapelGenericoColor(); - $this->viewData['papelGenericoColorHQList'] = $this->getPapelGenericoColorHQ(); - $this->viewData['papelGenericoCubiertaList'] = $this->getPapelGenericoCubierta(); - $this->viewData['papelGenericoGuardasList'] = $this->getPapelGenericoGuardas(); - $this->viewData['papelGenericoSobrecubiertaList'] = $this->getPapelGenericoSobreCubierta(); - $this->viewData['papelGenericoRotativaNegroList'] = $this->getPapelGenericoRotativaNegro(); - $this->viewData['papelGenericoRotativaColorList'] = $this->getPapelGenericoRotativaColor(); - - // Acabados exteriores - $this->viewData['acabadosCubierta'] = $this->getAcabadosCubierta(); - $this->viewData['acabadosSobrecubierta'] = $this->getAcabadosSobrecubierta(); - - // Lineas Presupuesto - [$cambios_lineas, $this->viewData['lineasPresupuesto']] = $this->getLineasPresupuesto($presupuestoEntity); - $this->viewData['presupuestoEntity']->cambios_lineas=$cambios_lineas; - - // Servicios - $this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion(); - $this->viewData['serviciosEncuadernacion'] = $this->getServiciosEncuadernacion(); - $this->viewData['serviciosManipulado'] = $this->getServiciosManipulado(); - $this->viewData['serviciosAcabado'] = $this->getServiciosAcabado(); - $this->viewData['serviciosExtra'] = $this->getServiciosExtra(); - - [$cambios_en_servicios, $servicios] = $this->getLineasServicios($presupuestoEntity); - $this->viewData['presupuestoEntity']->cambios_servicios=$cambios_en_servicios; - - $this->viewData['serviciosEncuadernacionList'] = $servicios->serviciosEncuadernacion; - $this->viewData['serviciosAcabadosList'] = $servicios->serviciosAcabado; - $this->viewData['serviciosManipuladoList'] = $servicios->serviciosManipulado; - $this->viewData['serviciosPreimpresionList'] = $servicios->serviciosPreimpresion; - $this->viewData['serviciosExtraList'] = $servicios->serviciosExtra; - - // Direciones presupuesto - [$cambios_en_direcciones, $this->viewData['direccionesList']] = $this->getLineasDirecciones($presupuestoEntity); - $this->viewData['presupuestoEntity']->cambios_direcciones=$cambios_en_direcciones; - - $this->viewData['POD'] = $this->getPOD(); - - $this->viewData['serviciosAutomaticos'] = [ - 'retractilado' => 3, - 'retractilado5' => 5, - 'ferro' => 24, - 'prototipo' => 9, - 'fajaColor' => 16, - 'plegadoGuardas' => 62, - ]; - - $this->viewData['tipo_impresion_id'] = $presupuestoEntity->tipo_impresion_id; // Cosido tapa blanda JJO - - $this->viewData = array_merge($this->viewData, $this->getStringsFromTipoImpresion($presupuestoEntity->tipo_impresion_id)); + $datosPresupuesto->clienteList = $this->getClienteListItems($presupuestoEntity->cliente_id ?? null); $this->viewData['formAction'] = route_to('updateCosidotapablanda', $id); + $this->viewData['paisList'] = $this->getPaisListItems(); + + $this->viewData['presupuestoEntity'] = $presupuestoEntity; + $this->viewData['datosPresupuesto'] = $datosPresupuesto; + // Si se ha llamado a esta funcion porque se ha duplicado el presupuesto // se actualiza la bbdd para que sólo ejecute algunas funciones una vez if($presupuestoEntity->is_duplicado){ $this->model->removeIsDuplicado($presupuestoEntity->id); } + $this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.edit3'); -*/ + return $this->displayForm(__METHOD__, $id); } // end function edit(...) @@ -515,83 +291,37 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController if ($this->request->isAJAX()) { $reqData = $this->request->getPost(); - $type = $reqData['type'] ?? null; + $clienteId = $reqData['clienteId'] ?? 0; - if (is_null($type)) { - 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; - } - $search = $reqData['search']['value']; + 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; } + $search = $reqData['search']['value']; + $start = $reqData['start'] ?? 0; $length = $reqData['length'] ?? 5; $requestedOrder1 = $reqData['order']['0']['column'] ?? 0; - $order1 = PresupuestoModel::SORTABLE[$requestedOrder1 >= 0 ? $requestedOrder1 : 0]; + $order1 = PresupuestoModel::SORTABLE_CLIENTE[$requestedOrder1 >= 0 ? $requestedOrder1 : 0]; $dir1 = $reqData['order']['0']['dir'] ?? 'asc'; - $requestedOrder2 = $reqData['order']['1']['column'] ?? 0; - $order2 = PresupuestoModel::SORTABLE[$requestedOrder2 >= 0 ? $requestedOrder1 : 0]; - $dir2 = $reqData['order']['0']['dir'] ?? 'asc'; - $requestedOrder3 = $reqData['order']['2']['column'] ?? 0; - $order3 = PresupuestoModel::SORTABLE[$requestedOrder3 >= 0 ? $requestedOrder1 : 0]; - $dir3 = $reqData['order']['0']['dir'] ?? 'asc'; - - // por defecto, se deja cosido tapa blanda por ahora JJO - $tipo_impresion_id = $reqData['tipo_impresion_id'] ?? 4; - - + $requestedOrder2 = $reqData['order']['1']['column'] ?? $requestedOrder1; + $order2 = PresupuestoModel::SORTABLE_CLIENTE[$requestedOrder2 >= 0 ? $requestedOrder2 : 0]; + $dir2 = $reqData['order']['1']['dir'] ?? 'asc'; + $requestedOrder3 = $reqData['order']['2']['column'] ?? $requestedOrder1; + $order3 = PresupuestoModel::SORTABLE_CLIENTE[$requestedOrder3 >= 0 ? $requestedOrder3 : 0]; + $dir3 = $reqData['order']['2']['dir'] ?? 'asc'; $searchValues = get_filter_datatables_columns($reqData); - $resourceData = $this->model->getResource($searchValues, $tipo_impresion_id)->orderBy($order1, $dir1)->orderBy($order2, $dir2) + $resourceData = $this->model->getListaPresupuestosCliente($searchValues, $clienteId)->orderBy($order1, $dir1)->orderBy($order2, $dir2) ->orderBy($order3, $dir3)->limit($length, $start)->get()->getResultObject(); - foreach ($resourceData as $item) : - if (isset($item->comentarios_pdf) && strlen($item->comentarios_pdf) > 100) : - $item->comentarios_pdf = character_limiter($item->comentarios_pdf, 100); - endif; - if (isset($item->causa_cancelacion) && strlen($item->causa_cancelacion) > 100) : - $item->causa_cancelacion = character_limiter($item->causa_cancelacion, 100); - endif; - if (isset($item->comentarios_cliente) && strlen($item->comentarios_cliente) > 100) : - $item->comentarios_cliente = character_limiter($item->comentarios_cliente, 100); - endif; - if (isset($item->comentarios_safekat) && strlen($item->comentarios_safekat) > 100) : - $item->comentarios_safekat = character_limiter($item->comentarios_safekat, 100); - endif; - if (isset($item->comentarios_tarifa) && strlen($item->comentarios_tarifa) > 100) : - $item->comentarios_tarifa = character_limiter($item->comentarios_tarifa, 100); - endif; - if (isset($item->comentarios_produccion) && strlen($item->comentarios_produccion) > 100) : - $item->comentarios_produccion = character_limiter($item->comentarios_produccion, 100); - endif; - if (isset($item->tirada_alternativa_json_data) && strlen($item->tirada_alternativa_json_data) > 100) : - $item->tirada_alternativa_json_data = character_limiter($item->tirada_alternativa_json_data, 100); - endif; - if (isset($item->titulo) && strlen($item->titulo) > 100) : - $item->titulo = character_limiter($item->titulo, 100); - endif; - if (isset($item->paginas_color_posicion) && strlen($item->paginas_color_posicion) > 100) : - $item->paginas_color_posicion = character_limiter($item->paginas_color_posicion, 100); - endif; - if (isset($item->aprobado_json_data) && strlen($item->aprobado_json_data) > 100) : - $item->aprobado_json_data = character_limiter($item->aprobado_json_data, 100); - endif; - if (isset($item->comparador_json_data) && strlen($item->comparador_json_data) > 100) : - $item->comparador_json_data = character_limiter($item->comparador_json_data, 100); - endif; - if (isset($item->ws_externo_json_data) && strlen($item->ws_externo_json_data) > 100) : - $item->ws_externo_json_data = character_limiter($item->ws_externo_json_data, 100); - endif; - endforeach; - - return $this->respond(Collection::datatable( $resourceData, - $this->model->getResource("", $tipo_impresion_id)->countAllResults(), - $this->model->getResource($search, $tipo_impresion_id)->countAllResults() + $this->model->getListaPresupuestosCliente("", $clienteId)->countAllResults(), + $this->model->getListaPresupuestosCliente($search, $clienteId)->countAllResults() )); } else { return $this->failUnauthorized('Invalid request', 403); @@ -599,6 +329,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } + public function presupuesto() { if ($this->request->isAJAX()) { @@ -607,335 +338,70 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); - $error = (object)[ - 'interior' => "", - 'cubierta' => "", - 'sobrecubierta' => "", - 'guardas' => "", - 'servicios' => "", - 'serviciosDefecto' => "", - ]; - $coste_servicios = 0.0; - - $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); - - $tirada = $reqData['tirada'] ?? 0; $tamanio = $reqData['tamanio']; $tipo_impresion_id = $this->getTipoImpresion($reqData['tipo'], $reqData['tapa']); - $precio_u = []; - $peso = []; + $cliente_id = $reqData['clienteId'] ?? -1; + $isColor = intval($reqData['isColor']) ?? 0; + $isHq = intval($reqData['isHq']) ?? 0; - for ($t = 0; $t < count($tirada); $t++) { - $tirada[$t] = intval($tirada[$t]); + // Interior + $papel_generico = [ + 'id' => $reqData['papelInterior'] ?? 0, + 'nombre' => $reqData['papelInteriorNombre'] ?? "", + ]; + $gramaje = $reqData['gramajeInterior'] ?? 0; + $excluirRotativa = $reqData['excluirRotativa'] ?? 0; + $paginas = intval($reqData['paginas']) ?? 0; + $paginas_color = intval($reqData['paginasColor']) ?? 0; - $paginas_color = intval($reqData['paginasColor']) ?? 0; - $is_cosido = (new TipoPresupuestoModel())->get_isCosido($tipo_impresion_id); + // Cubierta + $papel_generico_cubierta = [ + 'id' => $reqData['papelCubierta'] ?? 0, + 'nombre' => $reqData['papelCubiertaNombre'] ?? "", + ]; + $gramajeCubierta = $reqData['gramajeCubierta'] ?? 0; + $carasCubierta = intval($reqData['carasCubierta'] ?? 0); + $solapasCubierta = intval($reqData['solapasCubierta'] ?? 0); + $acabadoCubierta = $reqData['datos_libro']['acabadoCubierta'] ?? 0; - $datosPedido = (object)array( - 'paginas' => intval($reqData['paginas']) ?? 0, - 'tirada' => $tirada[$t], - 'merma' => $tirada[$t] > $POD ? $this->calcular_merma($tirada[$t], $POD) : 0, - 'ancho' => intval($tamanio['ancho']) ?? 100000, - 'alto' => intval($tamanio['alto']) ?? 100000, - 'isCosido' => $is_cosido, - ); + // Sobrecubierta + $sobreCubierta = $reqData["sobrecubierta"] ?? null; - $papel_generico = [ - 'id' => $reqData['papelInterior'] ?? 0, - 'nombre' => $reqData['papelInteriorNombre'] ?? "", - ]; - $gramaje = $reqData['gramajeInterior'] ?? 0; - $cliente_id = $reqData['clienteId'] ?? -1; - $excluirRotativa = $reqData['excluirRotativa'] ?? 0; + // Guardas + $datos_guardas = $reqData['guardas'] ?? 0; - $input_data = array( - 'uso' => 'interior', - 'tipo_impresion_id' => $tipo_impresion_id, - 'datosPedido' => $datosPedido, + $servicios = $reqData['servicios'] ?? []; + + $datos_presupuesto = array( + 'tirada' => $tirada, + 'tamanio' => $tamanio, + 'tipo_impresion_id' => $tipo_impresion_id, + 'clienteId' => $cliente_id, + 'isColor' => $isColor, + 'isHq' => $isHq, + + 'interior' => array( 'papel_generico' => $papel_generico, 'gramaje' => $gramaje, - 'isColor' => intval($reqData['isColor']) ?? 0, - 'isHq' => intval($reqData['isHq']) ?? 0, - 'cliente_id' => $cliente_id, - 'paginas_color' => $paginas_color, 'excluirRotativa' => $excluirRotativa, - ); - - $interior = PresupuestoClienteService::obtenerInterior($input_data); - - $costeInterior = 0.0; - $peso_interior = 0.0; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $costeInterior += floatval($linea['total_impresion']); - $peso_interior += floatval($linea['peso']); - } - } - - if ($costeInterior <= 0) { - $error->interior = lang('Presupuestos.errores.noInterior'); - } - - // Si es POD hay que volver a calcular para incluir la merma correcta - if ($tirada[$t] <= $POD) { - $num_formas = []; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $formas_linea = $is_cosido ? intval($linea['num_formas']['value']) / 2 : intval($linea['num_formas']['value']); - array_push($num_formas, $formas_linea); - } - } - $input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); - - $interior = PresupuestoClienteService::obtenerInterior($input_data); - } - - $costeInterior = 0.0; - $peso_interior = 0.0; - foreach ($interior as $linea) { - if (count($linea) > 0) { - $costeInterior += floatval($linea['total_impresion']); - $peso_interior += floatval($linea['peso']); - } - } - - if ($costeInterior <= 0) - $error->interior = lang('Presupuestos.errores.noInterior'); - else - $error->interior = ""; - - - // Cubierta - $papel_generico = [ - 'id' => $reqData['papelCubierta'] ?? 0, - 'nombre' => $reqData['papelCubiertaNombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $reqData['gramajeCubierta'] ?? 0; - $input_data['datosPedido']->paginas = intval($reqData['carasCubierta'] ?? 0); - $input_data['paginas_color'] = intval($reqData['carasCubierta'] ?? 0); - $input_data['datosPedido']->solapas_ancho = intval($reqData['solapasCubierta'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; - $input_data['datosPedido']->lomo = $this->calcular_lomo($interior, 0); - $input_data['isColor'] = 1; - $input_data['isHq'] = 1; - $input_data['uso'] = 'cubierta'; - - $cubierta = PresupuestoClienteService::obtenerCubierta($input_data); - $coste_cubierta = 0.0; - $peso_cubierta = 0.0; - if (count($cubierta) > 0) { - $coste_cubierta += floatval($cubierta['total_impresion']); - $peso_cubierta += floatval($cubierta['peso']); - } - if ($coste_cubierta <= 0) - $error->cubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); - else - $error->cubierta = ""; - - $tarifaAcabadoCubierta = intval($reqData['acabadoCubierta'] ?? 0); - $acabadoCubierta = []; - if ($tarifaAcabadoCubierta > 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoCubierta = $model->getPrecioTarifa($tarifaAcabadoCubierta, $datosPedido->tirada, $POD); - } - if (count($acabadoCubierta) > 0) { - if ($acabadoCubierta[0]->total <= 0) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - $coste_servicios += floatval($acabadoCubierta[0]->total); - } - - // Sobrecubierta - $coste_sobrecubierta = 0.0; - $peso_sobrecubierta = 0.0; - $linea_sobrecubierta = []; - $acabadoSobrecubierta = []; - $sobreCubierta = $reqData["sobrecubierta"] ?? null; - if (!is_null($sobreCubierta)) { - - $papel_generico = [ - 'id' => $sobreCubierta['papel'] ?? 0, - 'nombre' => $sobreCubierta['papel_nombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $sobreCubierta['gramaje'] ?? 0; - $input_data['datosPedido']->paginas = 4; - $input_data['paginas_color'] = 4; - $input_data['datosPedido']->solapas_ancho = intval($sobreCubierta['solapas'] ?? 0); - $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; - $input_data['datosPedido']->lomo = $this->calcular_lomo([$cubierta], $input_data['datosPedido']->lomo); - $input_data['isColor'] = 1; - $input_data['isHq'] = 1; - $input_data['uso'] = 'sobrecubierta'; - - $linea_sobrecubierta = PresupuestoClienteService::obtenerSobrecubierta($input_data); - - if (count($linea_sobrecubierta) > 0) { - $coste_sobrecubierta += floatval($linea_sobrecubierta['total_impresion']); - $peso_sobrecubierta += floatval($linea_sobrecubierta['peso']); - } - if ($coste_sobrecubierta <= 0) - $error->sobrecubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); - else - $error->sobrecubierta = ""; - - $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado']) == 0 ? 0 : $sobreCubierta['acabado']); - $acabadoSobrecubierta = []; - if ($tarifaAcabadoSobrecubierta > 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoSobrecubierta = $model->getPrecioTarifa($tarifaAcabadoSobrecubierta, $datosPedido->tirada, $POD); - } - if (count($acabadoSobrecubierta) > 0) { - if ($acabadoSobrecubierta[0]->total <= 0) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - $coste_servicios += floatval($acabadoSobrecubierta[0]->total); - } - } - - //Guardas - $guardas = []; - $peso_guardas = 0.0; - $coste_guardas = 0.0; - if ($reqData['guardas'] ?? 0 > 0) { - - $guardas = $reqData['guardas']; - $papel_generico = [ - 'id' => $guardas['papel'] ?? 0, - 'nombre' => $guardas['nombre'] ?? "", - ]; - $input_data['papel_generico'] = $papel_generico; - $input_data['gramaje'] = $guardas['gramaje'] ?? 0; - $input_data['datosPedido']->paginas = 8; - $input_data['paginas_color'] = 8; - $input_data['datosPedido']->paginas_impresion = $guardas['caras'] ?? 0; - $input_data['datosPedido']->solapas_ancho = 0; - $input_data['datosPedido']->solapas = 0; - $input_data['isColor'] = 1; - $input_data['isHq'] = 1; - $input_data['uso'] = 'guardas'; - - // Para el caso de Fresado y Cosido tapa dura, las guardas son un diptico - // y hay que imprimirlas como "cosido" (dos hojas pegadas). En el caso de espiral - // o wire-o tapa dura, las guardas se imprimen como hojas sueltas - if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { - $input_data['datosPedido']->isCosido = true; - } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { - $input_data['datosPedido']->isCosido = false; - } - - $guardas = PresupuestoClienteService::obtenerGuardas($input_data); - - if (count($guardas) > 0) { - $coste_guardas += floatval($guardas['total_impresion']); - $peso_guardas += floatval($guardas['peso']); - } - if ($coste_guardas <= 0) - $error->guardas = lang('Presupuestos.errores.noGuardas'); - else - $error->guardas = ""; - } - - // Servicios defecto - $servDefecto = PresupuestoCLienteService::getServiciosEncuadernacionDefault([ - 'tipo_impresion_id' => $tipo_impresion_id, - 'tirada' => $datosPedido->tirada, - 'paginas' => intval($reqData['paginas']) ?? 0, - 'ancho' => $datosPedido->ancho, - 'alto' => $datosPedido->alto, - 'POD' => $POD, - 'solapas' => intval($reqData['solapasCubierta'] ?? 0) > 0 ? 1 : 0, - ]); - $costeServiciosDefecto = 0.0; - foreach ($servDefecto as $servicio) { - if ($servicio->total <= 0) - $error->serviciosDefecto = lang('Presupuestos.errores.errorPresupuesto'); - - $costeServiciosDefecto += floatval($servicio->total); - } - - // Servicios - $servicios = $reqData['servicios'] ?? []; - if ($reqData['guardas'] ?? 0 > 0) { - array_push($servicios, 62); // Plegado de guardas - } - /* - 'retractilado' => 3, - 'retractilado5' => 5, - 'ferro' => 24, - 'prototipo' => 9, - 'fajaColor' => 16, - 'plegadoGuardas' => 62, - */ - $serviciosAutomaticos = []; - - foreach ($servicios as $servicio) { - if (intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) { - // Servicios acabado - $resultado = PresupuestoCLienteService::getServiciosManipulado([ - 'tarifa_id' => $servicio, - 'tirada' => $datosPedido->tirada, - 'POD' => $POD, - ]); - array_push($serviciosAutomaticos, $resultado[0]); - if ($resultado[0]->total <= 0) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - - $coste_servicios += floatval($resultado[0]->total); - } else if (intval($servicio) == 24 || intval($servicio) == 9) { - // Servicios preimpresion - $resultado = PresupuestoCLienteService::getServiciosExtra([ - 'tarifa_id' => $servicio, - ]); - array_push($serviciosAutomaticos, $resultado[0]); - if ($resultado[0]->precio <= 0) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - - $coste_servicios += floatval($resultado[0]->precio); - } else if (intval($servicio) == 62) { - // Servicios manipulado - $resultado = PresupuestoCLienteService::getServiciosManipulado([ - 'tarifa_id' => $servicio, - 'tirada' => $datosPedido->tirada, - 'POD' => $POD, - ]); - array_push($serviciosAutomaticos, $resultado[0]); - if ($resultado[0]->total <= 0) - $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); - - $coste_servicios += floatval($resultado[0]->total); - } - } - - array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios) / $tirada[$t], 4)); - array_push($peso, round($peso_interior + $peso_cubierta + $peso_sobrecubierta + $peso_guardas, 2)); - foreach ($error as $err) { - if ($err != "") - break; - } - } - - - $return_data = [ - 'errors' => $error, - 'total_lp' => $costeInterior + $coste_cubierta + $coste_sobrecubierta, + 'paginas' => $paginas, + 'paginas_color' => $paginas_color, + ), + 'cubierta' => array( + 'papel_generico_cubierta' => $papel_generico_cubierta, + 'gramajeCubierta' => $gramajeCubierta, + 'carasCubierta' => $carasCubierta, + 'solapasCubierta' => $solapasCubierta, + ), 'acabadoCubierta' => $acabadoCubierta, - 'acabadoSobrecubierta' => $acabadoSobrecubierta, - 'total_servicios_defecto' => $costeServiciosDefecto, - 'total_servicios_automaticos' => $coste_servicios, - 'tiradas' => $tirada, - 'precio_u' => $precio_u, - 'peso' => $peso, - - 'interior' => $interior, - 'cubierta' => $cubierta, - 'sobrecubierta' => $linea_sobrecubierta, - 'guardas' => $guardas, - 'serviciosDefecto' => $servDefecto, - 'servicios_automaticos' => $serviciosAutomaticos, - $csrfTokenName => $newTokenHash - ]; + 'sobrecubierta' => $sobreCubierta, + 'datos_guardas' => $datos_guardas, + 'servicios' => $servicios, + ); + $return_data = $this->calcular_presupuesto($datos_presupuesto, 0, true); //TRUE FOR DEBUG + array_merge($return_data, [$csrfTokenName => $newTokenHash]); return $this->respond($return_data); } else { @@ -977,39 +443,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $direccionId = $reqData['id'] ?? 0; $peso = $reqData['peso'] ?? 0; $unidades = $reqData['unidades'] ?? 0; - $model = model('App\Models\Clientes\ClienteDireccionesModel'); - $data = $model->getDireccion($direccionId); + $entregaPieCalle = $reqData['entregaPieCalle'] ?? 0; - $modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel'); - $coste = 0; - if ($data > 0) { - $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $peso, $unidades, 'cajas'); - for ($i = 0; $i < count($tarifas_envio); $i++) { - if ($peso > $tarifas_envio[$i]->peso_max) { - $tarifas_envio[$i]->precio = number_format($tarifas_envio[$i]->peso_min + ($peso - $data[$i]->peso_min) * $data[$i]->precio_adicional, 2); - } - // si no se calcula linealmente - else { - $m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min)); - $b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max; - $tarifas_envio[$i]->precio = number_format($m * $peso + $b, 2); - } - $tarifas_envio[$i]->margen = $tarifas_envio[$i]->margen; - } - - if(count($tarifas_envio) > 1){ - $tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) { - return $current->precio < $previous->precio ? $current : $previous; - }); - $coste = $tarifa_final->precio; - } - else{ - $coste = $tarifas_envio[0]->precio; - } - - - } - $data[0]->coste = $coste; + $data = $this->calcular_coste_envio($direccionId, $peso, $unidades, $entregaPieCalle); return $this->respond([ 'data' => $data, @@ -1048,7 +484,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $menu = $model->getMenuDirecciones($data['cliente_id']); - return $this->respond([ 'data' => $menu, $csrfTokenName => $newTokenHash @@ -1058,12 +493,890 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } + public function guardarPresupuesto() + { + if ($this->request->isAJAX()) { + + $reqData = $this->request->getPost(); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $confirmar = $reqData['confirmar'] ?? 0; + + $datosCabecera = $reqData['datos_cabecera'] ?? []; + + $tirada = $reqData['datos_libro']['tirada'] ?? 0; + $selected_tirada = $reqData['tirada'] ?? 0; + $peso_libro = $reqData['peso'] ?? 0; + $tamanio = $reqData['datos_libro']['tamanio']; + $tipo_impresion_id = $this->getTipoImpresion($reqData['datos_libro']['tipo'], $reqData['datos_libro']['tapa']); + $cliente_id = $reqData['datos_libro']['clienteId'] ?? -1; + $isColor = intval($reqData['datos_libro']['isColor']) ?? 0; + $isHq = intval($reqData['datos_libro']['isHq']) ?? 0; + + // Interior + $papel_generico = [ + 'id' => $reqData['datos_libro']['papelInterior'] ?? 0, + 'nombre' => $reqData['datos_libro']['papelInteriorNombre'] ?? "", + ]; + $gramaje = $reqData['datos_libro']['gramajeInterior'] ?? 0; + $excluirRotativa = $reqData['datos_libro']['excluirRotativa'] ?? 0; + $paginas = intval($reqData['datos_libro']['paginas']) ?? 0; + $paginas_color = intval($reqData['datos_libro']['paginasColor']) ?? 0; + + // Cubierta + $papel_generico_cubierta = [ + 'id' => $reqData['datos_libro']['papelCubierta'] ?? 0, + 'nombre' => $reqData['datos_libro']['papelCubiertaNombre'] ?? "", + ]; + $gramajeCubierta = $reqData['datos_libro']['gramajeCubierta'] ?? 0; + $carasCubierta = intval($reqData['datos_libro']['carasCubierta'] ?? 0); + $solapasCubierta = intval($reqData['datos_libro']['solapasCubierta'] ?? 0); + $acabadoCubierta = $reqData['datos_libro']['acabadoCubierta'] ?? 0; + + // Sobrecubierta + $sobreCubierta = $reqData['datos_libro']["sobrecubierta"] ?? null; + + // Guardas + $datos_guardas = $reqData['datos_libro']['guardas'] ?? 0; + + $servicios = $reqData['datos_libro']['servicios'] ?? []; + $iva_reducido = $reqData['iva_reducido']; + + $datos_presupuesto = array( + 'tirada' => $tirada, + 'tamanio' => $tamanio, + 'tipo_impresion_id' => $tipo_impresion_id, + 'clienteId' => $cliente_id, + 'isColor' => $isColor, + 'isHq' => $isHq, + + 'interior' => array( + 'papel_generico' => $papel_generico, + 'gramaje' => $gramaje, + 'excluirRotativa' => $excluirRotativa, + 'paginas' => $paginas, + 'paginas_color' => $paginas_color, + ), + 'cubierta' => array( + 'papel_generico_cubierta' => $papel_generico_cubierta, + 'gramajeCubierta' => $gramajeCubierta, + 'carasCubierta' => $carasCubierta, + 'solapasCubierta' => $solapasCubierta, + ), + 'acabadoCubierta' => $acabadoCubierta, + 'sobrecubierta' => $sobreCubierta, + 'datos_guardas' => $datos_guardas, + 'servicios' => $servicios, + ); + + $resultado_presupuesto = $this->calcular_presupuesto($datos_presupuesto, $selected_tirada, true); + + if (isset($resultado_presupuesto['errors'])) { + $errors = $resultado_presupuesto['errors']; + foreach ($errors as $error) { + if (!empty($error)) { + return $this->respond([ + 'error' => $error, + $csrfTokenName => $newTokenHash + ]); + } + } + } else if (isset($resultado_presupuesto['exception'])) { + return $this->respond([ + 'error' => $resultado_presupuesto['exception'], + $csrfTokenName => $newTokenHash + ]); + } + + + for ($i = 0; $i < count($tirada); $i++) { + + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0; + + foreach ($reqData['direcciones'] as $direccion) { + + $proporcion = intval($direccion['unidades']) / $selected_tirada * 100.0; + $unidades_calculo = floor($tirada[$i] * $proporcion / 100.0); + $coste_envio = $this->calcular_coste_envio( + $direccion['id'], + $peso_libro, + $unidades_calculo, + $direccion['tipo'] == 'cajas' ? 0 : 1 + ); + if (count($coste_envio) > 0) { + $coste = floatval($coste_envio[0]->coste); + $margen = ($coste * floatval($coste_envio[0]->margen)) / 100.0; + $coste -= $margen; + $resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $coste; + $resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $margen; + } + } + } + + $model_presupuesto = new PresupuestoModel(); + $tiradas_alternativas = []; + $resumen_totales = []; + for ($i = 0; $i < count($tirada); $i++) { + if ($tirada[$i] != $selected_tirada) { + + $coste_total = $resultado_presupuesto['info']['totales'][$i]['totalImpresion'] + $resultado_presupuesto['info']['totales'][$i]['totalPapel'] + + $resultado_presupuesto['info']['totales'][$i]['margenImpresion'] + $resultado_presupuesto['info']['totales'][$i]['margenPapel']; + $coste_envio = $resultado_presupuesto['info']['totales'][$i]['coste_envio'] + $resultado_presupuesto['info']['totales'][$i]['margen_envio']; + $margen_total = round(($resultado_presupuesto['info']['totales'][$i]['margenImpresion'] + + $resultado_presupuesto['info']['totales'][$i]['margenPapel'] + + $resultado_presupuesto['info']['totales'][$i]['margen_envio']) / ($coste_total + $coste_envio) * 100.0, 2); + $total_pedido = round(($coste_total + $resultado_presupuesto['info']['totales'][$i]['totalServicios'] + $resultado_presupuesto['info']['totales'][$i]['margenServicios'] + $coste_envio), 2); + $precio_u = round(($coste_total + $resultado_presupuesto['info']['totales'][$i]['totalServicios'] + $resultado_presupuesto['info']['totales'][$i]['margenServicios'] + $coste_envio) / $tirada[$i], 4); + + array_push($tiradas_alternativas, (object)array( + 'tirada' => $tirada[$i], + 'coste_impresion' => round($coste_total, 2), + 'coste_envio' => $coste_envio, + 'margen' => $margen_total, + 'total_pedido' => $total_pedido, + 'precio_unidad' => $precio_u, + )); + } else { + $resumen_totales = $resultado_presupuesto['info']['totales'][$i]; + } + } + + $id = $model_presupuesto->insertarPresupuestoCliente( + $selected_tirada, + $datos_presupuesto, + $datosCabecera, + $resultado_presupuesto['info'], + $resumen_totales, + $iva_reducido, + $tiradas_alternativas + ); + + // Lineas Presupuesto + foreach ($resultado_presupuesto['info']['interior'] as $linea) { + + if (count($linea) > 0) + $this->guardarLineaPresupuesto($id, $linea); + } + if (count($resultado_presupuesto['info']['cubierta']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['cubierta']); + if (count($resultado_presupuesto['info']['sobrecubierta']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['sobrecubierta']); + if (count($resultado_presupuesto['info']['guardas']) > 0) + $this->guardarLineaPresupuesto($id, $resultado_presupuesto['info']['guardas']); + + // Servicios + foreach ($resultado_presupuesto['info']['serviciosDefecto'] as $servicio) { + $this->guardarServicio($id, $servicio, 'encuadernacion'); + } + foreach ($resultado_presupuesto['info']['servicios_automaticos'] as $servicio) { + if ($servicio->tarifa_id == 3 || $servicio->tarifa_id == 5 || $servicio->tarifa_id == 16) { + // Servicios acabado + $this->guardarServicio($id, $servicio, 'acabado'); + } else if ($servicio->tarifa_id == 24 || $servicio->tarifa_id == 9) { + // Servicios extra + $this->guardarServicio($id, $servicio, 'extra'); + } else if ($servicio->tarifa_id == 62) { + // Servicios manipulado + $this->guardarServicio($id, $servicio, 'manipulado'); + } + } + + foreach ($reqData['direcciones'] as $direccion) { + $this->guardarLineaEnvio($id, $direccion, $peso_libro); + } + + if($confirmar == 1){ + $model_presupuesto->confirmarPresupuesto($id); + } + + return $this->respond([ + 'status' => $id, + 'url' => site_url('presupuestocliente/list'), + 'message' => lang('Basic.global.saveSuccess', [lang('Basic.global.record')]), + $csrfTokenName => $newTokenHash + ]); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + /*********************** * * Funciones auxiliares * **********************/ + protected function guardarLineaPresupuesto($presupuestoId, $linea) + { + + $model = new PresupuestoLineaModel(); + $model->insertLPFromBackend($presupuestoId, $linea); + } + + + protected function guardarLineaEnvio($presupuestoId, $direccion, $peso_libro) + { + + $unidades = intval($direccion['unidades']); + $peso_envio = $peso_libro * $unidades / 1000.0; + + $data = $this->calcular_coste_envio($direccion['id'], $peso_libro, $direccion['unidades'], $direccion['tipo'] == 'cajas' ? 0 : 1); + if (count($data) > 0) { + + $data[0]->presupuesto_id = $presupuestoId; + $data[0]->tarifa_id = $data[0]->id; + unset($data[0]->id); + $data[0]->precio = $data[0]->coste; + unset($data[0]->coste); + $data[0]->entregaPieCalle = $direccion['tipo'] == 'cajas' ? 0 : 1; + unset($data[0]->tipo); + $data[0]->peso = $peso_envio; + $data[0]->cantidad = $unidades; + + $model = new PresupuestoDireccionesModel(); + $model->insert($data[0]); + } + } + + + protected function guardarServicio($presupuestoId, $servicio, $tipo) + { + + if ($tipo == 'encuadernacion') { + $model = new PresupuestoEncuadernacionesModel(); + + $data = [ + 'presupuesto_id' => $presupuestoId, + 'tarifa_encuadernado_id' => $servicio->tarifa_id, + 'proveedor_id' => $servicio->proveedor_id, + 'tiempo' => $servicio->tiempo, + 'precio_total' => $servicio->total, + 'precio_unidad' => $servicio->precio_unidad, + 'margen' => $servicio->margen, + ]; + $model->insert($data); + } else if ($tipo == 'extra') { + $model = new PresupuestoServiciosExtraModel(); + + $data = [ + 'presupuesto_id' => $presupuestoId, + 'tarifa_extra_id' => $servicio->tarifa_id, + 'precio_total' => $servicio->total, + 'precio_unidad' => $servicio->precio_unidad, + 'margen' => $servicio->margen, + ]; + $model->insert($data); + } else if ($tipo == 'acabado') { + $model = new PresupuestoAcabadosModel(); + + $data = [ + 'presupuesto_id' => $presupuestoId, + 'tarifa_acabado_id' => $servicio->tarifa_id, + 'precio_total' => $servicio->total, + 'precio_unidad' => $servicio->precio_unidad, + 'margen' => $servicio->margen, + ]; + $model->insert($data); + } else if ($tipo == 'manipulado') { + $model = new PresupuestoManipuladosModel(); + + $data = [ + 'presupuesto_id' => $presupuestoId, + 'tarifa_manipulado_id' => $servicio->tarifa_id, + 'precio_total' => $servicio->total, + 'precio_unidad' => $servicio->precio_unidad, + 'margen' => $servicio->margen, + ]; + $model->insert($data); + } + } + + + protected function calcular_coste_envio($direccionId, $peso, $unidades, $entregaPieCalle) + { + + $model = model('App\Models\Clientes\ClienteDireccionesModel'); + $data = $model->getDireccion($direccionId); + + $modelTarifaEnvio = model('App\Models\Tarifas\TarifaEnvioModel'); + $coste = 0; + $margen = 0; + + if ($data > 0) { + $peso_envio = $peso * $unidades / 1000.0; // peso libro * unidades y se pasa a kilogramos + $tarifas_envio = $modelTarifaEnvio->getTarifaEnvio($data[0]->pais_id, $data[0]->cp, $peso_envio, $entregaPieCalle ? 'palets' : 'cajas'); + for ($i = 0; $i < count($tarifas_envio); $i++) { + if ($peso_envio > $tarifas_envio[$i]->peso_max || floatval($tarifas_envio[$i]->precio_max) == 0) { + $tarifas_envio[$i]->precio = number_format(floatval($tarifas_envio[$i]->precio_min) + ($peso_envio - floatval($tarifas_envio[$i]->peso_min)) * floatval($tarifas_envio[$i]->precio_adicional), 2); + } + // si no se calcula linealmente + else { + $m = (($tarifas_envio[$i]->precio_max - $tarifas_envio[$i]->precio_min) / ($tarifas_envio[$i]->peso_max - $tarifas_envio[$i]->peso_min)); + $b = $tarifas_envio[$i]->precio_max - $m * $tarifas_envio[$i]->peso_max; + $tarifas_envio[$i]->precio = number_format($m * $peso_envio + $b, 2); + } + $margen = $tarifas_envio[$i]->margen; + } + + if (count($tarifas_envio) > 1) { + $tarifa_final = array_reduce($tarifas_envio, function ($previous, $current) { + return $current->precio < $previous->precio ? $current : $previous; + }); + $coste = $tarifa_final->precio; + } else { + if (count($tarifas_envio) > 0) + $coste = $tarifas_envio[0]->precio; + } + } + if (count($data) > 0) { + $data[0]->coste = $coste; + $data[0]->tipo = $entregaPieCalle ? 'palets' : 'cajas'; + $data[0]->margen = $margen; + $data[0]->proveedor = $tarifas_envio[0]->proveedor; + $data[0]->proveedor_id = $tarifas_envio[0]->proveedor_id; + } + + return $data; + } + + protected function calcular_presupuesto($datos_entrada, $selected_tirada, $extra_info = false) + { + try { + $return_data = []; + + if ($extra_info) { + $info = [ + 'merma' => 0, + 'lomo_cubierta' => 0.0, + 'lomo_sobrecubierta' => 0.0, + 'user_id' => auth()->user()->id, + ]; + } + + $tirada = $datos_entrada['tirada']; + $tamanio = $datos_entrada['tamanio']; + $tipo_impresion_id = $datos_entrada['tipo_impresion_id']; + $cliente_id = $datos_entrada['clienteId'] ?? -1; + $isColor = $datos_entrada['isColor']; + $isHq = $datos_entrada['isHq']; + + // Interior + $papel_generico = $datos_entrada['interior']['papel_generico']; + $gramaje = $datos_entrada['interior']['gramaje']; + $excluirRotativa = $datos_entrada['interior']['excluirRotativa']; + $paginas = $datos_entrada['interior']['paginas']; + $paginas_color = $datos_entrada['interior']['paginas_color']; + + // Cubierta + $papel_generico_cubierta = $datos_entrada['cubierta']['papel_generico_cubierta']; + $gramajeCubierta = $datos_entrada['cubierta']['gramajeCubierta']; + $carasCubierta = $datos_entrada['cubierta']['carasCubierta']; + $solapasCubierta = $datos_entrada['cubierta']['solapasCubierta']; + + // Sobrecubierta + $sobreCubierta = $datos_entrada["sobrecubierta"] ?? null; + + // Guardas + $datos_guardas = $datos_entrada['guardas'] ?? []; + + // Servicios + $servicios = $datos_entrada['servicios'] ?? []; + + $error = (object)[ + 'interior' => "", + 'cubierta' => "", + 'sobrecubierta' => "", + 'guardas' => "", + 'servicios' => "", + 'serviciosDefecto' => "", + ]; + $coste_servicios = 0.0; + + $POD = model('App\Models\Configuracion\ConfiguracionSistemaModel')->getPOD(); + + $precio_u = []; + $peso = []; + if ($extra_info) + $totales = []; + $lomo = 0.0; + + for ($t = 0; $t < count($tirada); $t++) { + + // Inicialización para los totalizadores + if ($extra_info) { + $totalPapel = 0.0; + $margenPapel = 0.0; + $totalImpresion = 0.0; + $margenImpresion = 0.0; + + $sumForFactor = 0.0; + $sumForFactorPonderado = 0.0; + + $totalServicios = 0.0; + $margenServicios = 0.0; + } + $tirada[$t] = intval($tirada[$t]); + + $is_cosido = (new TipoPresupuestoModel())->get_isCosido($tipo_impresion_id); + + $datosPedido = (object)array( + 'paginas' => $paginas, + 'tirada' => $tirada[$t], + 'merma' => $tirada[$t] > $POD ? $this->calcular_merma($tirada[$t], $POD) : 0, + 'ancho' => intval($tamanio['ancho']) ?? 100000, + 'alto' => intval($tamanio['alto']) ?? 100000, + 'isCosido' => $is_cosido, + ); + if ($extra_info) { + $info['merma'] = $datosPedido->merma; + } + + $input_data = array( + 'uso' => 'interior', + 'tipo_impresion_id' => $tipo_impresion_id, + 'datosPedido' => $datosPedido, + 'papel_generico' => $papel_generico, + 'gramaje' => $gramaje, + 'isColor' => $isColor, + 'isHq' => $isHq, + 'cliente_id' => $cliente_id, + 'paginas_color' => $paginas_color, + 'excluirRotativa' => $excluirRotativa, + ); + + $interior = PresupuestoClienteService::obtenerInterior($input_data); + + $costeInterior = 0.0; + $peso_interior = 0.0; + foreach ($interior as $linea) { + if (count($linea) > 0) { + $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); + $lomo += floatval($linea['mano']); + if ($extra_info) { + $this->calcular_coste_linea( + $linea, + $totalPapel, + $margenPapel, + $sumForFactor, + $totalImpresion, + $margenImpresion + ); + } + } + } + + if ($costeInterior <= 0) { + $error->interior = lang('Presupuestos.errores.noInterior'); + } + + // Si es POD hay que volver a calcular para incluir la merma correcta + if ($tirada[$t] <= $POD) { + $num_formas = []; + foreach ($interior as $linea) { + if (count($linea) > 0) { + $formas_linea = $is_cosido ? intval($linea['num_formas']['value']) / 2 : intval($linea['num_formas']['value']); + array_push($num_formas, $formas_linea); + } + } + $input_data['datosPedido']->merma = $this->calcular_merma($tirada[$t], $POD, $num_formas); + if ($extra_info) { + $info['merma'] = max($info['merma'], $input_data['datosPedido']->merma); + } + $interior = PresupuestoClienteService::obtenerInterior($input_data); + + $costeInterior = 0.0; + $peso_interior = 0.0; + $lomo = 0; + if ($extra_info) { + $totalPapel = 0.0; + $margenPapel = 0.0; + $sumForFactor = 0.0; + $totalImpresion = 0.0; + $margenImpresion = 0.0; + } + foreach ($interior as $linea) { + if (count($linea) > 0) { + $costeInterior += floatval($linea['total_impresion']); + $peso_interior += floatval($linea['peso']); + $lomo += floatval($linea['mano']); + if ($extra_info) { + + $this->calcular_coste_linea( + $linea, + $totalPapel, + $margenPapel, + $sumForFactor, + $totalImpresion, + $margenImpresion + ); + } + } + } + } + + if ($costeInterior <= 0) + $error->interior = lang('Presupuestos.errores.noInterior'); + else + $error->interior = ""; + + + // Cubierta + $input_data['papel_generico'] = $papel_generico_cubierta; + $input_data['gramaje'] = $gramajeCubierta; + $input_data['datosPedido']->paginas = $carasCubierta; + $input_data['paginas_color'] = $carasCubierta; + $input_data['datosPedido']->solapas_ancho = $solapasCubierta; + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; + $input_data['datosPedido']->lomo = $this->calcular_lomo($interior, 0); + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'cubierta'; + + $cubierta = PresupuestoClienteService::obtenerCubierta($input_data); + $coste_cubierta = 0.0; + $peso_cubierta = 0.0; + if (count($cubierta) > 0) { + $coste_cubierta += floatval($cubierta['total_impresion']); + $peso_cubierta += floatval($cubierta['peso']); + $lomo += floatval($cubierta['mano']); + if ($extra_info) { + + $this->calcular_coste_linea( + $linea, + $totalPapel, + $margenPapel, + $sumForFactor, + $totalImpresion, + $margenImpresion + ); + } + } + if ($coste_cubierta <= 0) + $error->cubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); + else + $error->cubierta = ""; + + $tarifaAcabadoCubierta = intval($datos_entrada['acabadoCubierta'] ?? 0); + $acabadoCubierta = []; + if ($tarifaAcabadoCubierta > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoCubierta = $model->getPrecioTarifa($tarifaAcabadoCubierta, $datosPedido->tirada, $POD); + } + if (count($acabadoCubierta) > 0) { + if ($acabadoCubierta[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + $coste_servicios += floatval($acabadoCubierta[0]->total); + } + + // Sobrecubierta + $coste_sobrecubierta = 0.0; + $peso_sobrecubierta = 0.0; + $linea_sobrecubierta = []; + $acabadoSobrecubierta = []; + $lomo_sobrecubierta = 0.0; + if (!is_null($sobreCubierta)) { + + $papel_generico = [ + 'id' => $sobreCubierta['papel'] ?? 0, + 'nombre' => $sobreCubierta['papel_nombre'] ?? "", + ]; + $input_data['papel_generico'] = $papel_generico; + $input_data['gramaje'] = $sobreCubierta['gramaje'] ?? 0; + $input_data['datosPedido']->paginas = 4; + $input_data['paginas_color'] = 4; + $input_data['datosPedido']->solapas_ancho = intval($sobreCubierta['solapas'] ?? 0); + $input_data['datosPedido']->solapas = $input_data['datosPedido']->solapas_ancho > 0 ? 1 : 0; + $input_data['datosPedido']->lomo = $this->calcular_lomo([$cubierta], $input_data['datosPedido']->lomo); + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'sobrecubierta'; + + $linea_sobrecubierta = PresupuestoClienteService::obtenerSobrecubierta($input_data); + + if (count($linea_sobrecubierta) > 0) { + $coste_sobrecubierta += floatval($linea_sobrecubierta['total_impresion']); + $peso_sobrecubierta += floatval($linea_sobrecubierta['peso']); + if ($extra_info) { + + $this->calcular_coste_linea( + $linea, + $totalPapel, + $margenPapel, + $sumForFactor, + $totalImpresion, + $margenImpresion + ); + } + } + if ($coste_sobrecubierta <= 0) + $error->sobrecubierta = lang('Presupuestos.errores.noCubiertaSobrecubierta'); + else + $error->sobrecubierta = ""; + + $lomo_sobrecubierta = $lomo + floatval($linea_sobrecubierta['mano']); + + $tarifaAcabadoSobrecubierta = intval(strlen($sobreCubierta['acabado']) == 0 ? 0 : $sobreCubierta['acabado']); + $acabadoSobrecubierta = []; + if ($tarifaAcabadoSobrecubierta > 0) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoSobrecubierta = $model->getPrecioTarifa($tarifaAcabadoSobrecubierta, $datosPedido->tirada, $POD); + } + if (count($acabadoSobrecubierta) > 0) { + if ($acabadoSobrecubierta[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + $coste_servicios += floatval($acabadoSobrecubierta[0]->total); + } + } + + //Guardas + $guardas = []; + $peso_guardas = 0.0; + $coste_guardas = 0.0; + + if (count($datos_guardas) != 0) { + + $guardas = $datos_guardas; + $papel_generico = [ + 'id' => $datos_guardas['papel'] ?? 0, + 'nombre' => $datos_guardas['nombre'] ?? "", + ]; + $input_data['papel_generico'] = $papel_generico; + $input_data['gramaje'] = $datos_guardas['gramaje'] ?? 0; + $input_data['datosPedido']->paginas = 8; + $input_data['paginas_color'] = 8; + $input_data['datosPedido']->paginas_impresion = $datos_guardas['caras'] ?? 0; + $input_data['datosPedido']->solapas_ancho = 0; + $input_data['datosPedido']->solapas = 0; + $input_data['isColor'] = 1; + $input_data['isHq'] = 1; + $input_data['uso'] = 'guardas'; + + // Para el caso de Fresado y Cosido tapa dura, las guardas son un diptico + // y hay que imprimirlas como "cosido" (dos hojas pegadas). En el caso de espiral + // o wire-o tapa dura, las guardas se imprimen como hojas sueltas + if ($tipo_impresion_id == 1 || $tipo_impresion_id == 3) { + $input_data['datosPedido']->isCosido = true; + } else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) { + $input_data['datosPedido']->isCosido = false; + } + + $guardas = PresupuestoClienteService::obtenerGuardas($input_data); + + if (count($guardas) > 0) { + $coste_guardas += floatval($guardas['total_impresion']); + $peso_guardas += floatval($guardas['peso']); + if ($extra_info) { + + $this->calcular_coste_linea( + $linea, + $totalPapel, + $margenPapel, + $sumForFactor, + $totalImpresion, + $margenImpresion + ); + } + } + if ($coste_guardas <= 0) + $error->guardas = lang('Presupuestos.errores.noGuardas'); + else + $error->guardas = ""; + } + + if ($extra_info) { + $totalPapel -= $margenPapel; + $totalImpresion -= $margenImpresion; + + $porcentajeMargenPapel = is_numeric($margenPapel / ($totalPapel) * 100.0) ? $margenPapel / ($totalPapel) * 100.0 : 0; + $porcentajeMargenImpresion = is_numeric($margenImpresion / ($totalImpresion) * 100.0) ? $margenImpresion / ($totalImpresion) * 100.0 : 0; + } + + // Servicios defecto + $servDefecto = PresupuestoCLienteService::getServiciosEncuadernacionDefault([ + 'tipo_impresion_id' => $tipo_impresion_id, + 'tirada' => $datosPedido->tirada, + 'paginas' => intval($paginas) ?? 0, + 'ancho' => $datosPedido->ancho, + 'alto' => $datosPedido->alto, + 'POD' => $POD, + 'solapas' => intval($solapasCubierta) > 0 ? 1 : 0, + ]); + $costeServiciosDefecto = 0.0; + foreach ($servDefecto as $servicio) { + if ($servicio->total <= 0) + $error->serviciosDefecto = lang('Presupuestos.errores.errorPresupuesto'); + + $costeServiciosDefecto += floatval($servicio->total); + if ($extra_info) { + $totalServicios += floatval($servicio->total); + $margenServicios += floatval($servicio->total) * floatval($servicio->margen) / 100.0; + } + } + + if ($extra_info) { + $sumForFactorPonderado = $sumForFactor; + } + + // Servicios + if ($datos_guardas > 0) { + array_push($servicios, 62); // Plegado de guardas + } + /* + 'retractilado' => 3, + 'retractilado5' => 5, + 'ferro' => 24, + 'prototipo' => 9, + 'fajaColor' => 16, + 'plegadoGuardas' => 62, + */ + $serviciosAutomaticos = []; + + foreach ($servicios as $servicio) { + if (intval($servicio) == 3 || intval($servicio) == 5 || intval($servicio) == 16) { + // Servicios acabado + $resultado = PresupuestoCLienteService::getServiciosAcabados([ + 'tarifa_id' => $servicio, + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->total); + if ($extra_info) { + $totalServicios += floatval($resultado[0]->total); + $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; + } + } else if (intval($servicio) == 24 || intval($servicio) == 9) { + // Servicios preimpresion + $resultado = PresupuestoCLienteService::getServiciosExtra([ + 'tarifa_id' => $servicio, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->precio <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->precio); + if ($extra_info) { + $totalServicios += floatval($resultado[0]->total); + $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; + } + } else if (intval($servicio) == 62) { + // Servicios manipulado + $resultado = PresupuestoCLienteService::getServiciosManipulado([ + 'tarifa_id' => $servicio, + 'tirada' => $datosPedido->tirada, + 'POD' => $POD, + ]); + array_push($serviciosAutomaticos, $resultado[0]); + if ($resultado[0]->total <= 0) + $error->servicios = lang('Presupuestos.errores.errorPresupuesto'); + + $coste_servicios += floatval($resultado[0]->total); + if ($extra_info) { + $totalServicios += floatval($resultado[0]->total); + $margenServicios += floatval($resultado[0]->total) * floatval($resultado[0]->margen) / 100.0; + } + } + } + + array_push($precio_u, round(($costeInterior + $coste_cubierta + $coste_sobrecubierta + $costeServiciosDefecto + $coste_servicios) / $tirada[$t], 4)); + array_push($peso, round($peso_interior + $peso_cubierta + $peso_sobrecubierta + $peso_guardas, 2)); + foreach ($error as $err) { + if ($err != "") + break; + } + + if ($extra_info) { + $totalServicios -= $margenServicios; + $porcentajeMargenServicios = $margenServicios / ($margenServicios + $totalServicios) * 100; + $sumForFactorPonderado += $totalServicios; + } + + if ($extra_info) { + array_push($totales, array( + 'totalPapel' => $totalPapel, + 'margenPapel' => $margenPapel, + 'totalImpresion' => $totalImpresion, + 'margenImpresion' => $margenImpresion, + + 'sumForFactor' => $sumForFactor, + 'sumForFactorPonderado' => $sumForFactorPonderado, + + 'totalServicios' => $totalServicios, + 'margenServicios' => $margenServicios, + + 'porcentajeMargenPapel' => $porcentajeMargenPapel, + 'porcentajeMargenImpresion' => $porcentajeMargenImpresion, + 'porcentajeMargenServicios' => $porcentajeMargenServicios + )); + } + + if ($extra_info && $tirada[$t] == $selected_tirada) { + + $info['lomo_cubierta'] = $lomo; + $info['lomo_sobrecubierta'] = $lomo_sobrecubierta; + $return_data['info'] = $info; + $return_data['info']['interior'] = $interior; + $return_data['info']['cubierta'] = $cubierta; + $return_data['info']['sobrecubierta'] = $linea_sobrecubierta; + $return_data['info']['guardas'] = $guardas; + $return_data['info']['serviciosDefecto'] = $servDefecto; + $return_data['info']['servicios_automaticos'] = $serviciosAutomaticos; + } + } + + $return_data += [ + 'errors' => $error, + 'total_lp' => $costeInterior + $coste_cubierta + $coste_sobrecubierta, + 'acabadoCubierta' => $acabadoCubierta, + 'acabadoSobrecubierta' => $acabadoSobrecubierta, + 'total_servicios_defecto' => $costeServiciosDefecto, + 'total_servicios_automaticos' => $coste_servicios, + 'tiradas' => $tirada, + 'precio_u' => $precio_u, + 'peso' => $peso, + ]; + + if ($extra_info) { + $return_data['info']['totales'] = $totales; + } + + return $return_data; + } catch (Exception $e) { + return ['exception' => $e->getMessage()]; + } + } + + + protected function calcular_coste_linea($linea, &$totalPapel, &$margenPapel, &$sumForFactor, &$totalImpresion, &$margenImpresion) + { + if (count($linea) == 0) + return; + $totalPapel += $linea['precio_pedido']; + $margenPapel += $linea['margen_papel_pedido']; + $sumForFactor += $linea['precio_pedido']; + $sumForFactor -= $linea['precio_pedido']; + + $totalImpresion += $linea['precio_impresion_horas']; + $totalImpresion += $linea['precio_click_pedido']; + $sumForFactor += $linea['precio_click_pedido']; + + if ($linea['tipo_maquina'] == 'inkjet') { + $totalImpresion += $linea['precio_tinta']; + $totalImpresion += $linea['total_corte']; + $sumForFactor += $linea['total_corte']; + } + $margenImpresion += $linea['margen_impresion_horas']; + $margenImpresion += $linea['margen_click_pedido']; + $sumForFactor -= $linea['margen_click_pedido']; + } + protected function calcular_lomo($lineas, $lomo_inicial) { $lomo = $lomo_inicial; @@ -1182,4 +1495,54 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController return $data; } + + protected function getTipoLibro($tipo_impresion_id){ + if($tipo_impresion_id == 1 || $tipo_impresion_id == 2){ + return 'fresado'; + } + else if ($tipo_impresion_id == 3 || $tipo_impresion_id == 4){ + return 'cosido'; + } + else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 6){ + return 'espiral'; + } + else if ($tipo_impresion_id == 7 || $tipo_impresion_id == 8){ + return 'wireo'; + } + else if ($tipo_impresion_id == 21){ + return 'grapado'; + } + else + return ''; + } + protected function getTipoInterior($presupuestoId){ + + $calidad = 'estandar'; + $color = 'negro'; + + $model = model('App\Models\Presupuestos\PresupuestoLineaModel'); + $data = $model->where('presupuestoId', $presupuestoId)->findAll();; + foreach($data as $linea){ + + if (strpos($linea->tipo, "hq") !== false) { // $linea->tipo contains the substring "hq" + $calidad='premium'; + } + if (strpos($linea->tipo, "hq") !== false) { // $linea->tipo contains the substring "hq" + $color='color'; + } + } + return [$color, $calidad]; + + } + + protected function getTapa($tipo_impresion_id ){ + + $tapa = 'blanda'; + + if($tipo_impresion_id == 1 || $tipo_impresion_id == 3 || + $tipo_impresion_id == 5 || $tipo_impresion_id == 7) + $tapa = 'dura'; + + return $tapa; + } } diff --git a/ci4/app/Entities/Presupuestos/PresupuestoEncuadernacionesEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoEncuadernacionesEntity.php index c402d7bb..cb8e4ce4 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoEncuadernacionesEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoEncuadernacionesEntity.php @@ -9,6 +9,7 @@ class PresupuestoEncuadernacionesEntity extends \CodeIgniter\Entity\Entity "id" => null, "presupuesto_id" => null, "tarifa_encuadernado_id" => null, + "proveedor_id" => null, "precio_unidad" => null, "tiempo" => null, "precio_total" => null, @@ -19,6 +20,7 @@ class PresupuestoEncuadernacionesEntity extends \CodeIgniter\Entity\Entity protected $casts = [ "presupuesto_id" => "int", "tarifa_encuadernado_id" => "int", + "proveedor_id" => "int", "precio_unidad" => "float", "tiempo" => "float", "precio_total" => "float", diff --git a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php index 14ef818b..2de27f54 100755 --- a/ci4/app/Entities/Presupuestos/PresupuestoEntity.php +++ b/ci4/app/Entities/Presupuestos/PresupuestoEntity.php @@ -85,6 +85,8 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity "total_precio_unidad" => null, "total_factor" => null, "total_factor_ponderado" => null, + 'total_aceptado' => null, + 'iva_reducido' => null, "acabado_cubierta_id" => null, "acabado_sobrecubierta_id" => null, "is_duplicado" => false, @@ -124,7 +126,6 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity "merma_cubierta" => "float", "lomo_cubierta" => "?float", "lomo_sobrecubierta" => "?float", - "total_presupuesto" => "?float", "envios_recoge_cliente" => "boolean", "aprobado_user_id" => "?int", "is_deleted" => "int", @@ -148,6 +149,8 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity "total_precio_unidad" => "?float", "total_factor" => "?float", "total_factor_ponderado" => "?float", + 'total_aceptado' => "?float", + 'iva_reducido' => "?boolean", "acabado_cubierta_id" => "int", "acabado_sobrecubierta_id" => "int", "is_duplicado" => "boolean", diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php index 6c92c66a..96b1646b 100755 --- a/ci4/app/Language/es/Presupuestos.php +++ b/ci4/app/Language/es/Presupuestos.php @@ -19,6 +19,7 @@ return [ 'presupuestoCosidotapaduraList' => 'Lista presupuestos Libros Cosido Tapa Dura', 'presupuestoCosidotapablandaList' => 'Lista presupuestos Libros Cosido Tapa Blanda', 'presupuesto' => 'Presupuesto', + 'presupuestos' => 'Presupuestos', 'libroCosidoTapaBlanda' => "Cosido Tapa Blanda", 'libroCosidoTapaDura' => "Cosido Tapa Dura", diff --git a/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php b/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php index d183932b..50b45fea 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoEncuadernacionesModel.php @@ -21,7 +21,7 @@ class PresupuestoEncuadernacionesModel extends \App\Models\BaseModel 4 => "t1.precio_total" ]; - protected $allowedFields = ["presupuesto_id", "tarifa_encuadernado_id", "nombre", "precio_total", "precio_unidad", "margen"]; + protected $allowedFields = ["presupuesto_id", "tarifa_encuadernado_id", "proveedor_id", "nombre", "precio_total", "precio_unidad", "tiempo", "margen"]; protected $returnType = "App\Entities\Presupuestos\PresupuestoEncuadernacionesEntity"; protected $useTimestamps = true; diff --git a/ci4/app/Models/Presupuestos/PresupuestoLineaModel.php b/ci4/app/Models/Presupuestos/PresupuestoLineaModel.php index e37350a2..50aa87b6 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoLineaModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoLineaModel.php @@ -12,7 +12,7 @@ class PresupuestoLineaModel extends \App\Models\BaseModel * @var bool */ protected $useAutoIncrement = true; - + protected $allowedFields = [ "presupuesto_id", "tipo", @@ -339,18 +339,18 @@ class PresupuestoLineaModel extends \App\Models\BaseModel public function updatePreciosLineasPresupuesto($id_linea, $new_linea) { - $rot_total_impresion = $new_linea['fields']['precio_click_pedido']??0.0 + - $new_linea['fields']['precio_tinta']??0.0+$new_linea['fields']['total_Corte']??0.0; - + $rot_total_impresion = $new_linea['fields']['precio_click_pedido'] ?? 0.0 + + $new_linea['fields']['precio_tinta'] ?? 0.0 + $new_linea['fields']['total_Corte'] ?? 0.0; + $data = [ "pliegos_precio" => $new_linea['fields']['precios_pliegos'], "libro" => $new_linea['fields']['precio_libro'], "total_papel_pedido" => round($new_linea['fields']['precio_pedido'], 2), "margen_papel_pedido" => round($new_linea['fields']['margen_papel_pedido'], 2), "mano" => $new_linea['fields']['mano'], - "precio_click" => round($new_linea['fields']['precio_click'], 6), - "precio_click_pedido" => round($new_linea['fields']['precio_click_pedido'], 2), - "margen_click_pedido" => round($new_linea['fields']['margen_click_pedido'], 2), + "precio_click" => round($new_linea['fields']['precio_click'], 6), + "precio_click_pedido" => round($new_linea['fields']['precio_click_pedido'], 2), + "margen_click_pedido" => round($new_linea['fields']['margen_click_pedido'], 2), "tiempo_maquina" => strtotime($new_linea['fields']['tiempo_maquina']) - strtotime('TODAY'), "tarifa_impresion_id" => $new_linea['fields']['tarifa_impresion_id'], "rotativa_total_impresion" => $rot_total_impresion, @@ -387,16 +387,16 @@ class PresupuestoLineaModel extends \App\Models\BaseModel "rotativa_tiempo_corte" => $new_linea['fields']['tiempo_corte'] ?? 0, "rotativa_precio_hora_corte" => $new_linea['fields']['precio_hora_corte'] ?? 0, "rotativa_total_corte" => $new_linea['fields']['total_corte'] ?? 0, - "horas_maquina" => round($new_linea['fields']['horas_maquina'],4), + "horas_maquina" => round($new_linea['fields']['horas_maquina'], 4), "precio_hora" => $new_linea['fields']['precio_hora'] ?? 0, "precio_impresion" => $new_linea['fields']['precio_impresion_horas'] ?? 0, "total_linea" => round($new_linea['fields']['total_impresion'], 2) ?? 0, "margen_impresion" => $new_linea['fields']['margen_impresion_horas'] ?? 0, ]; - if(array_key_exists('datosTipologias', $new_linea['fields'])){ + if (array_key_exists('datosTipologias', $new_linea['fields'])) { $data += [ - "rotativa_negro" => $new_linea['fields']['datosTipologias']->negro ?? 0, + "rotativa_negro" => $new_linea['fields']['datosTipologias']->negro ?? 0, "rotativa_cyan" => $new_linea['fields']['datosTipologias']->cyan ?? 0, "rotativa_magenta" => $new_linea['fields']['datosTipologias']->magenta ?? 0, "rotativa_amarillo" => $new_linea['fields']['datosTipologias']->amarillo ?? 0, @@ -404,7 +404,7 @@ class PresupuestoLineaModel extends \App\Models\BaseModel "rotativa_gota_negro" => $new_linea['fields']['datosTipologias']->gota_negro ?? 0, "rotativa_gota_color" => $new_linea['fields']['datosTipologias']->gota_color ]; - } + } $this->db ->table($this->table . " t1") ->where('id', $id_linea) @@ -412,6 +412,124 @@ class PresupuestoLineaModel extends \App\Models\BaseModel ->update(); } + public function insertLPFromBackend($presupuesto_id, $new_linea) + { + $rot_total_impresion = $new_linea['precio_click_pedido'] ?? 0.0 + + $new_linea['precio_tinta'] ?? 0.0 + $new_linea['total_Corte'] ?? 0.0; + + $formas = json_encode(array( + 'maquina_ancho'=> $new_linea['dimensiones_maquina'][0], + 'maquina_alto' => $new_linea['dimensiones_maquina'][1], + 'maquina_impresion_ancho'=> $new_linea['dimensiones_maquina_impresion'][0], + 'maquina_impresion_alto' => $new_linea['dimensiones_maquina_impresion'][1], + 'formas' => $new_linea['num_formas']['value'], + 'formas_v'=> $new_linea['num_formas']['num_formas_verticales'], + 'formas_h'=> $new_linea['num_formas']['num_formas_horizontales'], + 'formas_orientacion'=> $new_linea['num_formas']['posicion_formas'] + )); + + sscanf($new_linea['tiempo_maquina'], "%d:%d:%d", $hours, $minutes, $seconds); + $tiempo = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; + + $data = [ + 'presupuesto_id' => $presupuesto_id, + 'tipo' => $new_linea['tipo_linea'], + 'paginas' => $new_linea['paginas'], + 'papel_id' => $new_linea['papel_generico_id'], + 'papel_impresion_id' => $new_linea['papel_impresion_id'], + 'formas' => $formas, + 'gramaje' => $new_linea['gramaje'], + 'pliegos_libro' => $new_linea['pliegos_libro'], + 'pliegos_pedido' => $new_linea['pliegos_pedido'], + 'pliegos_precio' => $new_linea['precios_pliegos'], + 'libro' => $new_linea['precio_libro'], + 'total_papel_pedido' => $new_linea['precio_pedido'], + 'margen_papel_pedido' => $new_linea['margen_papel_pedido'], + 'mano' => $new_linea['mano'], + 'peso' => $new_linea['peso'], + 'check_papel_total' => 1, + 'check_impresion_total' => 1, + 'maquina_id' => $new_linea['maquina_id'], + 'tiempo_maquina' => $tiempo, + 'tarifa_impresion_id' => $new_linea['tarifa_impresion_id'], + 'precio_click' => $new_linea['precio_click'], + 'precio_click_pedido' => $new_linea['precio_click_pedido'], + 'maquina' => $new_linea['maquina'], + 'papel_impresion' => $new_linea['papel_impresion'], + 'maquina_tipo' => $new_linea['tipo_maquina'], + 'horas_maquina' => $new_linea['horas_maquina'], + 'precio_hora' => $new_linea['precio_hora'], + 'precio_impresion' => $new_linea['precio_impresion_horas'], + 'total_linea' => $new_linea['total_impresion'], + 'margen_impresion' => $new_linea['margen_impresion_horas'], + 'margen_click_pedido' => $new_linea['margen_click_pedido'], + ]; + + if($new_linea['tipo_maquina'] =='inkjet'){ + $data += [ + 'rotativa_total_impresion' => $rot_total_impresion, + + 'rotativa_negro' => $new_linea['datosTipologias']->negro ?? 0, + 'rotativa_cyan' => $new_linea['datosTipologias']->cyan ?? 0, + 'rotativa_magenta' => $new_linea['datosTipologias']->magenta ?? 0, + 'rotativa_amarillo' => $new_linea['datosTipologias']->amarillo ?? 0, + 'rotativa_cg' => $new_linea['datosTipologias']->cg ?? 0, + 'rotativa_gota_negro' => $new_linea['datosTipologias']->gota_negro ?? 0, + 'rotativa_gota_color' => $new_linea['datosTipologias']->gota_color ?? 0, + + 'rotativa_num_gotas_negro' => $new_linea['num_gotas_negro'] ?? 0, + 'rotativa_num_gotas_cyan' => $new_linea['num_gotas_cyan'] ?? 0, + 'rotativa_num_gotas_magenta' => $new_linea['num_gotas_magenta'] ?? 0, + 'rotativa_num_gotas_amarillo' => $new_linea['num_gotas_amarillo'] ?? 0, + 'rotativa_num_gotas_cg' => $new_linea['num_gotas_cg'] ?? 0, + 'rotativa_peso_gotas_negro' => $new_linea['peso_gotas_negro'] ?? 0, + 'rotativa_peso_gotas_cyan' => $new_linea['peso_gotas_cyan'] ?? 0, + 'rotativa_peso_gotas_magenta' => $new_linea['peso_gotas_magenta'] ?? 0, + 'rotativa_peso_gotas_amarillo' => $new_linea['peso_gotas_amarillo'] ?? 0, + 'rotativa_peso_gotas_cg' => $new_linea['peso_gotas_cg'] ?? 0, + 'rotativa_peso_gotas_negro_pedido' => $new_linea['peso_gotas_negro_pedido'] ?? 0, + 'rotativa_peso_gotas_cyan_pedido' => $new_linea['peso_gotas_cyan_pedido'] ?? 0, + 'rotativa_peso_gotas_magenta_pedido' => $new_linea['peso_gotas_magenta_pedido'] ?? 0, + 'rotativa_peso_gotas_amarillo_pedido' => $new_linea['peso_gotas_amarillo_pedido'] ?? 0, + 'rotativa_peso_gotas_cg_pedido' => $new_linea['peso_gotas_cg_pedido'] ?? 0, + + 'rotativa_pag_color' => $new_linea['paginas_color'], + 'rotativa_resolucion' => $new_linea['resolucion'], + 'rotativa_area_paginas' => $new_linea['superficie'], + 'rotativa_precio_pag_negro' => $new_linea['precio_pagina_negro'], + 'rotativa_precio_pag_color' => $new_linea['precio_pagina_color'], + 'rotativa_factor_altura' => $new_linea['factor_altura'], + 'rotativa_factor_anchura' => $new_linea['factor_anchura'], + 'rotativa_pag_por_pliego' => $new_linea['paginas_por_pliego'], + 'rotativa_clicks_libro' => $new_linea['clicks_libro'], + 'rotativa_clicks_total' => $new_linea['clicks_pedido'], + 'rotativa_precio_tinta' => $new_linea['precio_tinta'], + ]; + } + + if (strpos($new_linea['tipo_linea'], 'rot') !== false) { + $data += [ + 'rotativa_mxm' => $new_linea['maquina_velocidad'], + 'rotativa_metros_libro' => $new_linea['metros_papel_libro'], + 'rotativa_metros_total' => $new_linea['metros_papel_total'], + 'rotativa_velocidad_corte' => $new_linea['velocidad_corte'], + 'rotativa_precio_hora_corte' => $new_linea['precio_hora_corte'], + 'rotativa_tiempo_corte' => $new_linea['tiempo_corte'], + 'rotativa_total_corte' => $new_linea['total_corte'], + 'rotativa_a_favor_fibra' => $new_linea['a_favor_fibra'] + ]; + } + + if($new_linea['tipo_linea'] =='lp_guardas') + array_push($data, ['paginas_impresion' => $new_linea['paginas_impresion']]); + + return $this->db + ->table($this->table . " t1") + ->set($data) + ->insert(); + } + + public function deleteLineasPresupuesto($presupuesto_id) { $this->db @@ -431,7 +549,6 @@ class PresupuestoLineaModel extends \App\Models\BaseModel ->where("t1.presupuesto_id", $presupuesto_id) ->insert($linea); } - } public function getResourceByNForPdf($presupuesto_id = -1) @@ -498,9 +615,4 @@ class PresupuestoLineaModel extends \App\Models\BaseModel ->insert($linea); } } - - - } - - diff --git a/ci4/app/Models/Presupuestos/PresupuestoModel.php b/ci4/app/Models/Presupuestos/PresupuestoModel.php index f028ba81..0cc6e398 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoModel.php @@ -2,6 +2,9 @@ namespace App\Models\Presupuestos; +use App\Models\Configuracion\TipoPresupuestoModel; + + class PresupuestoModel extends \App\Models\BaseModel { protected $table = "presupuestos"; @@ -27,6 +30,20 @@ class PresupuestoModel extends \App\Models\BaseModel 10 => "t6.estado", ]; + const SORTABLE_CLIENTE = [ + 0 => "t1.id", + 1 => "t1.created_at", + 2 => "t7.codigo", + 3 => "t2.nombre", + 4 => "t3.first_name", + 5 => "t1.titulo", + 6 => "t5.nombre", + 8 => "t1.paginas", + 9 => "t1.tirada", + 10 => "t1.total_presupuesto", + 11 => "t6.estado", + ]; + protected $allowedFields = [ "cliente_id", "user_created_id", @@ -103,6 +120,8 @@ class PresupuestoModel extends \App\Models\BaseModel "total_precio_unidad", "total_factor", "total_factor_ponderado", + 'total_aceptado', + 'iva_reducido', "acabado_cubierta_id", "acabado_sobrecubierta_id", "is_duplicado" @@ -262,10 +281,10 @@ class PresupuestoModel extends \App\Models\BaseModel $builder->groupEnd(); return $builder; } - } - public function removeIsDuplicado($presupuesto_id){ + public function removeIsDuplicado($presupuesto_id) + { $this->db ->table($this->table . " t1") ->where('id', $presupuesto_id) @@ -307,4 +326,207 @@ class PresupuestoModel extends \App\Models\BaseModel return $builder; } + + function getListaPresupuestosCliente($search = [] , $clienteId){ + + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.id AS id, t1.created_at AS fecha, t7.codigo as codigo, t2.nombre AS cliente, + CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t1.titulo AS titulo, + t5.nombre AS pais, t1.inc_rei AS inc_rei, t1.paginas AS paginas, t1.tirada AS tirada, + t1.total_presupuesto AS total_presupuesto, t1.total_presupuesto AS total_presupuesto, + 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("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"); + + if($clienteId != 0) + $builder->where("t1.cliente_id", $clienteId); + + $builder->where("t1.is_deleted", 0); + + if (empty($search)) + return $builder; + else { + $builder->groupStart(); + foreach ($search as $col_search) { + if ($col_search[0] != 1) + $builder->like(self::SORTABLE_CLIENTE[$col_search[0]], $col_search[2]); + else { + $dates = explode(" ", $col_search[2]); + $builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . ">=", $dates[0]); + $builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . "<=", $dates[1]); + } + } + $builder->groupEnd(); + return $builder; + } + } + + function confirmarPresupuesto($presupuesto_id) + { + $this->db + ->table($this->table . " t1") + ->where('t1.id', $presupuesto_id) + ->set('t1.estado', 2) + ->update(); + } + + function insertarPresupuestoCliente($tirada, $data, $data_cabecera, $extra_info, $resumen_totales, $iva_reducido, $tiradas_alternativas) + { + + helper('date'); + + $model = model('App\Models\Configuracion\PapelFormatoModel'); + $papel_formato_id = $model->where('ancho', $data['tamanio']['ancho'])->where('alto', $data['tamanio']['alto'])->first(); + + $is_cosido = (new TipoPresupuestoModel())->get_isCosido($data['tipo_impresion_id']); + + $totalCostes = $resumen_totales['totalPapel'] + $resumen_totales['totalImpresion'] + + $resumen_totales['totalServicios']+$resumen_totales['coste_envio']; + $totalMargenes = $resumen_totales['margenPapel'] + $resumen_totales['margenImpresion'] + + $resumen_totales['margenServicios'] + $resumen_totales['margen_envio']; + + $fields = [ + 'cliente_id' => $data['clienteId'], + 'tipo_impresion_id' => $data['tipo_impresion_id'], + 'pais_id' => 1, + 'retractilado' => in_array(3, $data['servicios']) ? 1 : 0, + 'retractilado5' => in_array(5, $data['servicios']) ? 1 : 0, + 'guardas' => in_array(62, $data['servicios']) ? 1 : 0, + 'faja_color' => in_array(16, $data['servicios']) ? 1 : 0, + 'ferro' => in_array(24, $data['servicios']) ? 1 : 0, + 'prototipo' => in_array(9, $data['servicios']) ? 1 : 0, + 'papel_formato_id' => is_null($papel_formato_id) ? 0: $papel_formato_id->id, + 'papel_formato_personalizado' => !$papel_formato_id ? 1:0, + 'papel_formato_ancho' => !$papel_formato_id ? $data['tamanio']['ancho']:null, + 'papel_formato_alto' => !$papel_formato_id ? $data['tamanio']['alto']:null, + 'titulo' => $data_cabecera['titulo'], + 'referencia_cliente' => $data_cabecera['referenciaCliente'], + 'paginas' => $data['interior']['paginas'], + 'tirada' => $tirada, + 'solapas' => $data['cubierta']['solapasCubierta']>0 ? 1 : 0, + 'solapas_ancho' => $data['cubierta']['solapasCubierta']>0 ? $data['cubierta']['solapasCubierta'] : 0, + 'solapas_sobrecubierta' => is_null($data['sobrecubierta']) ? 0 :1, + 'solapas_ancho_sobrecubierta' => is_null($data['sobrecubierta']) ? 0 : $data['sobrecubierta']['solapas'], + 'cosido' => $is_cosido, + 'merma' => $extra_info['merma'], + 'merma_cubierta' => $extra_info['merma'], + + 'lomo_cubierta' => $extra_info['lomo_cubierta'], + 'lomo_sobrecubierta' => $extra_info['lomo_sobrecubierta'], + + 'comparador_json_data' => $this->generateJson($data), + + 'acabado_cubierta_id' => $data['acabadoCubierta'], + 'acabado_sobrecubierta_id' => is_null($data['sobrecubierta']) ? 0 : $data['sobrecubierta']['acabado'], + + 'comp_tipo_impresion' => $data['isHq']? ($data['isColor']? 'colorhq':'negrohq'):($data['isColor']? 'color':'negro'), + + 'user_created_id' => $extra_info['user_id'], + 'created_at' => date('Y-m-d H:i:s', now()), + 'updated_at' => date('Y-m-d H:i:s', now()), + + 'tirada_alternativa_json_data' => json_encode($tiradas_alternativas), + + 'total_coste_papel' => round($resumen_totales['totalPapel'], 2), + 'total_margen_papel' => round($resumen_totales['margenPapel'], 2), + 'total_margenPercent_papel' => round($resumen_totales['porcentajeMargenPapel'], 0), + 'total_coste_impresion' => round($resumen_totales['totalImpresion'], 2), + 'total_margen_impresion' => round($resumen_totales['margenImpresion'], 2), + 'total_margenPercent_impresion' => round($resumen_totales['porcentajeMargenImpresion'], 0), + 'total_coste_servicios' => round($resumen_totales['totalServicios'], 2), + 'total_margen_servicios' => round($resumen_totales['margenServicios'], 2), + 'total_margenPercent_servicios' => round($resumen_totales['porcentajeMargenServicios'], 2), + 'total_coste_envios' => round($resumen_totales['coste_envio'], 2), + 'total_margen_envios' => round($resumen_totales['margen_envio'], 2), + 'total_costes' => round($totalCostes, 2), + 'total_margenes' => round($totalMargenes, 2), + + 'total_antes_descuento' => round($totalCostes + $totalMargenes, 2), + 'total_descuento' => 0, + 'total_descuentoPercent' => 0, + + 'total_precio_unidad' => round(($totalCostes + $totalMargenes)/$tirada, 4), + 'total_presupuesto' => round($totalCostes + $totalMargenes, 2), + 'total_aceptado' => round($totalCostes + $totalMargenes, 2), + + 'total_factor' => round(($totalCostes + $totalMargenes-$resumen_totales['coste_envio']-$resumen_totales['margen_envio'])/$resumen_totales['sumForFactor'], 2), + 'total_factor_ponderado' => round(($totalCostes + $totalMargenes-$resumen_totales['coste_envio']-$resumen_totales['margen_envio'])/$resumen_totales['sumForFactorPonderado'], 2), + + 'iva_reducido' => $iva_reducido, + + ]; + + $this->db->table($this->table)->insert($fields); + return $this->db->insertID(); + } + + private function generateJson($data) + { + $values = array(); + if (is_array($data)) { + // -- INTERIOR -- + // Si hay negro + if($data['interior']['paginas'] > $data['interior']['paginas_color']){ + + if($data['isHq']) + $key = 'bnhq'; + else + $key = 'bn'; + $values[$key] = array( + 'paginas'=> intval($data['interior']['paginas'])-intval($data['interior']['paginas_color']), + 'papel_id' => intval($data['interior']['papel_generico']['id']), + 'gramaje' => intval($data['interior']['gramaje']), + ); + } + // Si hay color + if($data['interior']['paginas_color']>0){ + + if($data['isHq']) + $key = 'colorhq'; + else + $key = 'color'; + $values[$key] = array( + 'paginas'=> intval($data['interior']['paginas_color']), + 'papel_id' => intval($data['interior']['papel_generico']['id']), + 'gramaje' => intval($data['interior']['gramaje']), + ); + } + + // -- CUBIERTA -- + $values['cubierta'] = array( + 'papel_id' => intval($data['cubierta']['papel_generico_cubierta']['id']), + 'gramaje' => intval($data['cubierta']['gramajeCubierta']), + 'paginas' => intval($data['cubierta']['carasCubierta']), + ); + + // -- SOBRECUBIERTA -- + if(!is_null($data['sobrecubierta'])){ + $values['sobrecubierta'] = array( + 'papel_id' => intval($data['sobrecubierta']['papel']), + 'gramaje' => intval($data['sobrecubierta']['gramaje']), + 'imprimir' => 1, + ); + } + + // -- GUARDAS -- + if($data['datos_guardas'] != 0){ + $values['guardas'] = array( + 'papel_id' => intval($data['datos_guardas']['papel']), + 'gramaje' => intval($data['datos_guardas']['gramaje']), + 'paginas' => intval($data['datos_guardas']['caras']), + ); + } + + } + $json = json_encode($values); + return $json; + } + + } diff --git a/ci4/app/Models/Presupuestos/PresupuestoServiciosExtraModel.php b/ci4/app/Models/Presupuestos/PresupuestoServiciosExtraModel.php index 7675bda7..e161455e 100755 --- a/ci4/app/Models/Presupuestos/PresupuestoServiciosExtraModel.php +++ b/ci4/app/Models/Presupuestos/PresupuestoServiciosExtraModel.php @@ -19,7 +19,7 @@ class PresupuestoServiciosExtraModel extends \App\Models\BaseModel 2 => "t1.precio_total" ]; - protected $allowedFields = ["presupuesto_id", "tarifa_extra_id", "nombre", "precio_total", "precio_unidad", "margen"]; + protected $allowedFields = ["presupuesto_id", "tarifa_extra_id", "precio_total", "precio_unidad", "margen"]; protected $returnType = "App\Entities\Presupuestos\PresupuestoServiciosExtraEntity"; protected $useTimestamps = true; diff --git a/ci4/app/Services/PresupuestoClienteService.php b/ci4/app/Services/PresupuestoClienteService.php index 18245e3f..abd5b778 100644 --- a/ci4/app/Services/PresupuestoClienteService.php +++ b/ci4/app/Services/PresupuestoClienteService.php @@ -41,7 +41,7 @@ class PresupuestoClienteService extends BaseService } $total_rotativa = -1; - if (!$data['excluirRotativa'] && count($rotativa) > 0) { + if (!$data['excluirRotativa'] && count($rotativa) > 0 && $rotativa['num_formas']['posicion_formas'] != 'n/a') { $total_rotativa = floatval($rotativa['total_impresion']); } if ($total_plana < 0 && $total_rotativa < 0) diff --git a/ci4/app/Services/PresupuestoService.php b/ci4/app/Services/PresupuestoService.php index b703558b..12b0785e 100755 --- a/ci4/app/Services/PresupuestoService.php +++ b/ci4/app/Services/PresupuestoService.php @@ -1117,7 +1117,7 @@ class PresupuestoService extends BaseService if( str_contains($linea->tipo, 'guardas') ){ $datos['uso'] = 'guardas'; - $datos['datosPedido']->paginas_impresion = linea->paginas_impresion; + $datos['datosPedido']->paginas_impresion = $linea->paginas_impresion; } $comp_data = PresupuestoService::obtenerComparadorPlana($datos); @@ -1138,7 +1138,7 @@ class PresupuestoService extends BaseService else{ $nueva_linea = PresupuestoService::obtenerValorLineaPresupuesto($data, $linea); if(count($nueva_linea) >0){ - if(round($nueva_linea['fields']['total_impresion'],2) != $linea->total_linea){ + if(round($nueva_linea['fields']['total_impresion'],2) != round($linea->total_linea, 2)){ (new PresupuestoLineaModel())->updatePreciosLineasPresupuesto($linea->id, $nueva_linea); $linea_to_save = (new PresupuestoLineaModel())->find($linea->id); $cambios = true; @@ -1355,7 +1355,7 @@ class PresupuestoService extends BaseService $nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_acabado_id, $input_data['tirada'], $input_data['POD']); if($nueva_tarifa && count($nueva_tarifa)>0){ - if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad || + if(round($nueva_tarifa[0]->precio_unidad, 2) != round($servicio->precio_unidad,2) || $nueva_tarifa[0]->margen != $servicio->margen){ $servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2); @@ -1386,7 +1386,7 @@ class PresupuestoService extends BaseService $count = 0; $nueva_tarifa = $model->getPrecioTarifa($servicio->tarifa_manipulado_id, $input_data['tirada'], $input_data['POD']); if($nueva_tarifa && count($nueva_tarifa)>0){ - if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad || + if(round($nueva_tarifa[0]->precio_unidad, 2) != round($servicio->precio_unidad,2) || $nueva_tarifa[0]->margen != $servicio->margen){ $servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2); @@ -1468,12 +1468,16 @@ class PresupuestoService extends BaseService } // Si el presupuesto no es duplicado, se comprueba que // no ha cambiado el precio unidad - if(round($nueva_tarifa[0]->precio_unidad, 2) != $servicio->precio_unidad || - $nueva_tarifa[0]->margen != $servicio->margen || - $nueva_tarifa[0]->tiempo != $servicio->tiempo){ + if($nueva_tarifa[0]->tiempo==null) + $nueva_tarifa[0]->tiempo = 0; + if($servicio->tiempo == null) + $servicio->tiempo = 0; + if(round($nueva_tarifa[0]->precio_unidad, 2) != round(floatval($servicio->precio_unidad),2) || + $nueva_tarifa[0]->margen != floatval($servicio->margen) || + $nueva_tarifa[0]->tiempo != floatval($servicio->tiempo)){ $servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2); - $servicio->tiempo = $nueva_tarifa[0]->tiempo==null?"": round($nueva_tarifa[0]->tiempo, 2); + $servicio->tiempo = $nueva_tarifa[0]->tiempo==null?0: round($nueva_tarifa[0]->tiempo, 2); $servicio->precio_total = round($nueva_tarifa[0]->total, 2); $servicio->margen = round($nueva_tarifa[0]->margen); $cambio = true; diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php index e8c8273f..149ff801 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_direccionesItems.php @@ -1,11 +1,8 @@
- -
-
@@ -22,12 +19,20 @@
+
+
+
+
+ + +
- +
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php index 5f1baeb9..3cd9e9a9 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_disenioLibroItems.php @@ -44,9 +44,11 @@
-
+
>
-
+
> - + color_impresion == 'negro' ? ' checked=""': ''); ?> >
@@ -193,7 +198,8 @@ " alt=""> - + color_impresion == 'color' ? ' checked=""': ''); ?> >
@@ -212,9 +218,11 @@
-
+
>
-
+
calidad_impresion == 'premium' ? ' checked"': '"'); ?> >
-

Total: 100€

+

Total: 100€

10.4€/ud
-
Coste impresion (4% IVA): 104€
-
Envío: 30€
- +
+
+
+section("additionalInlineJs") ?> + +window.routes_resumen = { + guardarPresupuesto: "", +} +endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php index d07f3f6e..41dc47e2 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_tipoLibroItems.php @@ -1,11 +1,24 @@
+ + +
+ class="form-check custom-option-tipo custom-option custom-option-image custom-option-image-radio + tipo_libro == 'cosido' || $datosPresupuesto->tipo_libro == ''){ + echo ' checked"'; + } + else + { + echo '"'; + } + ?> + > + id="tipoCosido" + tipo_libro == 'cosido' || $datosPresupuesto->tipo_libro == ''){ + echo 'checked=""'; + } + ?> + >

Rústica cosido

@@ -23,7 +42,8 @@
+ class="form-check custom-option-tipo custom-option custom-option-image custom-option-image-radio + tipo_libro == 'fresado' ? ' checked"': '"'); ?> > + id="tipoFresado" tipo_libro)=='fresado'? 'checked=""':''); ?> >

Rústica fresado

@@ -41,7 +61,8 @@
+ class="form-check custom-option-tipo custom-option custom-option-image custom-option-image-radio + tipo_libro == 'grapado' ? ' checked"': '"'); ?> > + id="tipoGrapado" tipo_libro)=='grapado'? 'checked=""':''); ?> >

Cosido con grapas

@@ -61,7 +82,8 @@
+ class="form-check custom-option-tipo custom-option custom-option-image custom-option-image-radio + tipo_libro == 'espiral' ? ' checked"': '"'); ?> > + id="tipoEspiral" tipo_libro)=='espiral'? 'checked=""':''); ?> >

Espiral

@@ -79,7 +101,8 @@
+ class="form-check custom-option-tipo custom-option custom-option-image custom-option-image-radio + tipo_libro == 'wireo' ? ' checked"': '"'); ?> > + id="tipoWireO" tipo_libro)=='wireo'? 'checked=""':''); ?> >

Wire-o

diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js index d0b74ab9..dd133a6f 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/direcciones.js @@ -37,9 +37,9 @@ function initTiradasDirecciones() { let html = ''; html += '
'; - html += '
'; + html += '
'; html += '