diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php
index 529ce510..24000dc9 100755
--- a/ci4/app/Config/Routes.php
+++ b/ci4/app/Config/Routes.php
@@ -545,6 +545,7 @@ $routes->group('presupuestocliente', ['namespace' => 'App\Controllers\Presupuest
$routes->post('getDatosDireccion', 'Presupuestocliente::getDatosDireccion', ['as' => 'getDatosDireccion']);
$routes->post('getNuevaDireccion', 'Presupuestocliente::getNuevaDireccion', ['as' => 'nuevaDireccion']);
$routes->post('guardarPresupuesto', 'Presupuestocliente::guardarPresupuesto', ['as' => 'guardarPresupuesto']);
+ $routes->post('duplicarPresupuesto', 'Presupuestocliente::duplicarPresupuesto', ['as' => 'duplicarPresupuesto']);
});
$routes->resource('presupuestocliente', ['namespace' => 'App\Controllers\Presupuestos', 'controller' => 'Presupuestocliente', 'except' => 'show,new,create,update']);
diff --git a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php
index be81053d..33dfeaaf 100755
--- a/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php
+++ b/ci4/app/Controllers/Presupuestos/Cosidotapablanda.php
@@ -861,6 +861,7 @@ class Cosidotapablanda extends \App\Controllers\BaseResourceController
$presupuesto = $this->model->find($id);
$presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
$presupuesto->is_duplicado = 1;
+ $presupuesto->estado_id = 1;
$new_id = $this->model->insert($presupuesto);
$presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php
index fcf345fe..87f17a10 100755
--- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php
+++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php
@@ -169,6 +169,11 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$this->obtenerPaginasColor($presupuestoEntity);
$this->obtenerDireccionesEnvio($presupuestoEntity);
+ // Si el presupuesto está confirmado, se generan los datos del resumen
+ if($presupuestoEntity->estado_id == 2){
+ $this->generarResumen($presupuestoEntity);
+ }
+
$this->viewData['formAction'] = route_to('updateCosidotapablanda', $id);
$this->viewData['paisList'] = $this->getPaisListItems();
@@ -473,6 +478,91 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
}
+ public function duplicarPresupuesto(){
+ if ($this->request->isAJAX()) {
+
+ $reqData = $this->request->getPost();
+
+ $newTokenHash = csrf_hash();
+ $csrfTokenName = csrf_token();
+
+ $id = $reqData['id'] ?? 0;
+
+ if($id > 0){
+ try{
+
+ $presupuesto = $this->model->find($id);
+ $presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
+ $presupuesto->is_duplicado = 1;
+ $presupuesto->estado_id = 1;
+ $new_id = $this->model->insert($presupuesto);
+
+ $presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
+ foreach ($presupuestoAcabadosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $acabado) {
+ $acabado->presupuesto_id = $new_id;
+ $presupuestoAcabadosModel->insert($acabado);
+ }
+
+ $presupuestoEncuadernacionesModel = model('App\Models\Presupuestos\PresupuestoEncuadernacionesModel');
+ foreach ($presupuestoEncuadernacionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $encuadernacion) {
+ $encuadernacion->presupuesto_id = $new_id;
+ $presupuestoEncuadernacionesModel->insert($encuadernacion);
+ }
+
+ $presupuestoManipuladosModel = model('App\Models\Presupuestos\PresupuestoManipuladosModel');
+ foreach ($presupuestoManipuladosModel->where('presupuesto_id', $presupuesto->id)->findAll() as $manipulado) {
+ $manipulado->presupuesto_id = $new_id;
+ $presupuestoManipuladosModel->insert($manipulado);
+ }
+
+ $presupuestoPreimpresionesModel = model('App\Models\Presupuestos\PresupuestoPreimpresionesModel');
+ foreach ($presupuestoPreimpresionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $preimpresion) {
+ $preimpresion->presupuesto_id = $new_id;
+ $presupuestoPreimpresionesModel->insert($preimpresion);
+ }
+
+ $presupuestoServiciosExtraModel = model('App\Models\Presupuestos\PresupuestoServiciosExtraModel');
+ foreach ($presupuestoServiciosExtraModel->where('presupuesto_id', $presupuesto->id)->findAll() as $servicioExtra) {
+ $servicioExtra->presupuesto_id = $new_id;
+ $presupuestoServiciosExtraModel->insert($preimpresion);
+ }
+
+ $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
+ foreach ($presupuestoDireccionesModel->where('presupuesto_id', $presupuesto->id)->findAll() as $direccion) {
+ $direccion->presupuesto_id = $new_id;
+ $presupuestoDireccionesModel->insert($direccion);
+ }
+
+ $presupuestoLineaModel = model('App\Models\Presupuestos\PresupuestoLineaModel');
+ $presupuestoLineaModel->duplicateLineasPresupuesto($presupuesto->id, $new_id);
+
+ return $this->respond([
+ 'success' => true,
+ 'id' => $new_id,
+ $csrfTokenName => $newTokenHash
+ ]);
+
+ }catch(\Exception $e){
+ return $this->respond([
+ 'success' => false,
+ 'message' => $e->getMessage(),
+ $csrfTokenName => $newTokenHash
+ ]);
+ }
+ }
+
+ return $this->respond([
+ 'success' => false,
+ 'message' => "No existe el presupuesto",
+ $csrfTokenName => $newTokenHash
+
+ ]);
+
+ } else {
+ return $this->failUnauthorized('Invalid request', 403);
+ }
+ }
+
public function guardarPresupuesto()
{
if ($this->request->isAJAX()) {
@@ -1621,6 +1711,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
{
$model = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$model_direcciones = model('App\Models\Clientes\ClienteDireccionesModel');
+ $model_pais = model('App\Models\Configuracion\PaisModel');
$direcciones = $model->where('presupuesto_id', $presupuestoEntity->id)->findAll();
$result = [];
@@ -1636,6 +1727,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$direcciones[$i]->telefono);
if(count($direccion_id) > 0) {
$temp = $direcciones[$i]->toArray();
+ $temp['pais'] = $model_pais->where('id', $direcciones[$i]->pais_id)->first()->nombre;
$temp['direccion_id'] = $direccion_id[0]->id;
array_push($result, $temp);
}
@@ -1679,4 +1771,91 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
}
}
+
+ protected function generarResumen($presupuestoEntity){
+
+ $presupuestoEntity->resumen = (object)[
+ 'titulo' => $this->generarTitulo($presupuestoEntity),
+ 'tamanio' => $this->obtenerTamanio($presupuestoEntity),
+ 'tipo_impresion' => $this->obtenerTipoImpresion($presupuestoEntity)
+ ];
+
+ $model_papelGenerico = model('App\Models\Configuracion\PapelGenericoModel');
+ if(!is_null($presupuestoEntity->papel_interior)){
+ $nombre = $model_papelGenerico->where('id', $presupuestoEntity->papel_interior)->first()->nombre;
+ if($nombre != null)
+ $presupuestoEntity->papel_interior_nombre = $nombre;
+ }
+ if(!is_null($presupuestoEntity->papel_cubierta)){
+ $nombre = $model_papelGenerico->where('id', $presupuestoEntity->papel_interior)->first()->nombre;
+ if($nombre != null)
+ $presupuestoEntity->papel_cubierta_nombre = $nombre;
+ }
+ if(!is_null($presupuestoEntity->papel_sobrecubierta)){
+ $nombre = $model_papelGenerico->where('id', $presupuestoEntity->papel_sobrecubierta)->first()->nombre;
+ if($nombre != null)
+ $presupuestoEntity->papel_sobrecubierta_nombre = $nombre;
+ }
+ if(!is_null($presupuestoEntity->papel_guardas)){
+ $nombre = $model_papelGenerico->where('id', $presupuestoEntity->papel_guardas)->first()->nombre;
+ if($nombre != null)
+ $presupuestoEntity->papel_guardas_nombre = $nombre;
+ }
+ }
+
+ protected function generarTitulo($presupuestoEntity){
+
+ $model = model('App\Models\Configuracion\TipoPresupuestoModel');
+ $codigo = $model->where('id', $presupuestoEntity->tipo_impresion_id)->first()->codigo;
+ $titulo = lang('Presupuestos.titulos.'.$codigo);
+ return $titulo;
+ }
+
+ protected function obtenerTamanio($presupuestoEntity){
+
+ $ancho = 0;
+ $alto = 0;
+
+ $model = model('App\Models\Presupuestos\PresupuestoModel');
+ $data = $model->where('id', $presupuestoEntity->id)->first();
+
+ if($data != null){
+ if($data->papel_formato_personalizado == 0){
+
+ $model_papel_formato = model('App\Models\Configuracion\PapelFormatoModel');
+ $data_papel_formato = $model_papel_formato->where('id', $data->papel_formato_id)->first();
+ $ancho = $data_papel_formato->ancho;
+ $alto = $data_papel_formato->alto;
+ }
+ else{
+ $ancho = $data->papel_formato_ancho;
+ $alto = $data->papel_formato_alto;
+ }
+ }
+
+ return $ancho . "x" . $alto;
+ }
+
+ protected function obtenerTipoImpresion($presupuestoEntity){
+
+ $id = $presupuestoEntity->id;
+
+ $isColor = false;
+ $isHq = false;
+
+ $model = model('App\Models\Presupuestos\PresupuestoLineaModel');
+ $data = $model->where('presupuesto_id', $id)->findAll();
+ if (count($data) > 0) {
+ foreach ($data as $linea) {
+ if (strpos($linea->tipo, "hq") !== false) {
+ $isHq = true;
+ }
+ if (strpos($linea->tipo, "color") !== false) {
+ $isColor = true;
+ }
+ }
+ }
+ $tipo = "" . ($isColor ? "Color" : "Negro") . " " . ($isHq ? "premium" : "estándar");
+ return $tipo;
+ }
}
diff --git a/ci4/app/Language/es/Presupuestos.php b/ci4/app/Language/es/Presupuestos.php
index 96b1646b..efd583a9 100755
--- a/ci4/app/Language/es/Presupuestos.php
+++ b/ci4/app/Language/es/Presupuestos.php
@@ -276,6 +276,17 @@ return [
'actualizacionSolapasCubierta' => 'El tamaño de las solapas de la cubierta se ha actualizado debido a que supera el máximo permitido (este valor depende del ancho del libro y del número de páginas).',
'actualizacionSolapasSobrecubierta' => 'El tamaño de las solapas de la sobrecubierta se ha actualizado debido a que supera el máximo permitido (este valor depende del ancho del libro y del número de páginas).',
+ 'titulos' => [
+ 'libroFresadoTapaDura' => 'Rústica Fresado tapa dura',
+ 'libroFresadoTapaBlanda' => 'Rústica Fresado tapa blanda',
+ 'libroCosidoTapaDura' => 'Rústica Cosido tapa dura',
+ 'libroCosidoTapaBlanda' => 'Rústica Cosido tapa blanda',
+ 'libroEspiralTapaDura' => 'Espiral tapa dura',
+ 'libroEspiralTapaBlanda' => 'Espiral tapa blanda',
+ 'libroWireoTapaDura' => 'Wire-o tapa dura',
+ 'libroWireoTapaBlanda' => 'Wire-o tapa blanda',
+ 'libroGrapado' => 'Grapado',
+ ],
'validation' => [
'decimal' => 'El campo {field} debe contener un número decimal.',
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php
index 3324ecbb..09dd3a26 100644
--- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php
+++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php
@@ -7,47 +7,141 @@
Resumen
Libro
-
Rústica cosido tapa blanda
-
Tamaño: 100x100
-
Número de páginas: 200
-
Tirada: 200
-
Prototipo: NO
-
Ferro: NO
+
resumen->titulo)?$presupuestoEntity->resumen->titulo:'') ?>
+
Tamaño: resumen->tamanio)?$presupuestoEntity->resumen->tamanio:'') ?>
+
Número de páginas: paginas ?>
+
Tirada: tirada ?>
+
Prototipo: prototipo?'SI':'NO') ?>
+
Ferro: ferro?'SI':'NO') ?>
Interior
-
Impresion: Negro premium
-
Páginas a color: 100
-
Papel: Blanco Offset 70gr/m²
+
Impresion:
+ resumen->tipo_impresion)?$presupuestoEntity->resumen->tipo_impresion:'') ?>
+
+
paginasColor==0?'style="display:none"':'')?>>
+ Páginas a color: paginasColor?>
+
Papel:
+ papel_interior_nombre)?$presupuestoEntity->papel_interior_nombre:'') ?>
+ gramaje_interior)?$presupuestoEntity->gramaje_interior:'') ?>gr/m²
Cubierta
-
Papel: Blanco Offset 70gr/m²
-
Impresión: 1 cara
-
Solapas: 25mm
-
Acabado: Ninguno
+
Papel:
+ papel_cubierta_nombre)?$presupuestoEntity->papel_cubierta_nombre:''); ?>
+ gramaje_cubierta)?$presupuestoEntity->gramaje_cubierta:''); ?>gr/m²
+
Impresión: paginas_cubierta==2?"1 cara":"2 caras");?>
+ solapas_ancho>0 || $presupuestoEntity->estado_id==1): ?>
+
Solapas: solapas_ancho;?>mm
+
+ acabado_cubierta_id>0 || $presupuestoEntity->estado_id==1): ?>
+
Acabado:
+ acabadosCubierta) && is_array($datosPresupuesto->acabadosCubierta) && !empty($datosPresupuesto->acabadosCubierta)) :
+ foreach ($datosPresupuesto->acabadosCubierta as $acabado) :
+ if ($acabado->id == $presupuestoEntity->acabado_cubierta_id):
+ echo $acabado->label;
+ endif;
+ endforeach;
+ endif; ?>
+
+
-
Sobrecubierta
-
Papel: Blanco Offset 70gr/m²
-
Ancho solapas: 25mm
-
Acabado: Ninguno
+ papel_sobrecubierta || $presupuestoEntity->estado_id==1): ?>
+
Sobrecubierta
+
Papel:
+ papel_sobrecubierta_nombre)?$presupuestoEntity->papel_sobrecubierta_nombre:'') ?>
+ gramaje_sobrecubierta)?$presupuestoEntity->gramaje_sobrecubierta:'') ?>gr/m²
+ solapas_ancho_sobrecubierta>0 || $presupuestoEntity->estado_id==1): ?>
+
Ancho solapas: solapas_ancho_sobrecubierta;?>mm
+
+
Acabado:
+ acabadosSobrecubierta) && is_array($datosPresupuesto->acabadosSobrecubierta) && !empty($datosPresupuesto->acabadosSobrecubierta)) :
+ foreach ($datosPresupuesto->acabadosSobrecubierta as $acabado) :
+ if ($acabado->id == $presupuestoEntity->acabado_sobrecubierta_id):
+ echo $acabado->label;
+ endif;
+ endforeach;
+ endif; ?>
+
+
-
Guardas
-
Papel: Blanco Offset 70gr/m²
-
Impresión: 1 cara
+ papel_guardas || $presupuestoEntity->estado_id==1): ?>
+
Guardas
+
Papel:
+ papel_guardas_nombre)?$presupuestoEntity->papel_guardas_nombre:''); ?>
+ 170gr/m²
+
Impresión:
+ paginas_guardas) || $presupuestoEntity->paginas_guardas==0):
+ echo "Sin impresion";
+ elseif($presupuestoEntity->paginas_guardas==4):
+ echo "1 cara";
+ else:
+ echo "2 caras";
+ endif; ?>
+
-
-
-
-
+ retractiladol || $presupuestoEntity->retractilado5 || $presupuestoEntity->faja_color || $presupuestoEntity->estado_id==1): ?>
+
+
+ retractiladol): ?>
+
+ retractilado5): ?>
+
+ faja_color): ?>
+
+
-
Total: 100€
-
10.4€/ud
+
+ estado_id==2):
+ $total = $presupuestoEntity->total_aceptado;
+ $iva = $presupuestoEntity->iva_reducido?1.04:1.21;
+ $total *= $iva;
+ $total_unidad = $total / $presupuestoEntity->tirada;
+ echo '
Total: ' . round($total, 2) . '€
';
+ echo '
' . round($total_unidad, 4) . '€/ud
'
+ ?>
+
+
Total: 100€
+
10.4€/ud
+
+ estado_id==2):
+ echo '';
+ echo '
Direcciones de envío
';
+ echo '
';
+ if(isset($presupuestoEntity->direcciones_envio)):
+ foreach ($presupuestoEntity->direcciones_envio as $direccion):
+ echo '
';
+ echo '
';
+ echo '';
+ echo '
';
+ echo '
';
+ endforeach;
+ endif;
+
+ echo '
';
+ echo '
';
+ endif; ?>
@@ -59,5 +153,6 @@ window.total_unidad = = $presupuestoEntity->total_precio_unidad ?>;
window.iva_reducido= = $presupuestoEntity->iva_reducido ?>;
window.routes_resumen = {
guardarPresupuesto: "= route_to('guardarPresupuesto') ?>",
+ duplicarPresupuesto: "= route_to('duplicarPresupuesto') ?>",
}
= $this->endSection() ?>
\ No newline at end of file
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js
index 576969e7..d875620f 100644
--- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js
+++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js
@@ -44,7 +44,7 @@ function generarResumen(){
$('#resumenSolapasCubierta').text('Solapas: No')
}
- if ($('.enable-sobrecubierta').is(':visible')) {
+ if ($('#enableSobrecubierta').is(':checked')) {
$(".resumen-sobrecubierta").show();
$('#resumenPapelCubierta').text($('#papelSobrecubierta option:selected').text().trim() + ' ' +
$('#gramajeSobrecubierta option:selected').text() + 'gr/m²');
@@ -56,7 +56,8 @@ function generarResumen(){
$(".resumen-sobrecubierta").hide();
}
- if ($('.guardas').is(':visible')) {
+ if ($('#divGuardas').css('display') != 'none') {
+
$(".resumen-guardas").show();
$('#resumenGuardasPapel').text($('#papelGuardas option:selected').text().trim() + ' ' + '170gr/m²');
$('#resumenGuardasCaras').text('Impresión: ' + $('#impresionGuardas option:selected').text())
@@ -145,6 +146,41 @@ $('#btnConfirm').on('click', function() {
});
+$('#btnDuplicar').on('click', function() {
+
+ const paths = window.location.pathname.split("/").filter(path => path !== "");
+ let id=0;
+ if(paths.length > 0 && paths[paths.length - 2] == 'edit'){
+ id=paths[paths.length - 1];
+ }
+ datos = {
+ id: id,
+ }
+ datos = Object.assign(datos, window.token_ajax)
+
+ $('#loader').show();
+
+ $.ajax({
+ url: window.routes_resumen.duplicarPresupuesto,
+ type: 'POST',
+ data: datos,
+ success: function(response) {
+
+ if(Object.keys(response).length > 0) {
+ if(response.success){
+ $('#loader').hide();
+ window.location.href = document.location.origin + '/presupuestos/presupuestocliente/edit/' + response.id;
+ }
+ }
+ $('#loader').hide();
+
+ },
+ error: function() {
+ $('#loader').hide();
+ },
+ });
+});
+
$('#btnBack').on('click', function() {
window.location.href = document.location.origin + '/presupuestocliente/list';
@@ -241,7 +277,7 @@ function finalizarPresupuesto(confirmar){
tirada: tirada,
peso: peso_libro,
iva_reducido: $('#ivaReducido').val()==1?1:0,
- confirmar: confirmar,
+ confirmar: confirmar?1:0,
},
datos = Object.assign(datos, window.token_ajax)
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoList.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoList.php
index b0692def..f9194e68 100644
--- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoList.php
+++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoList.php
@@ -172,7 +172,7 @@ theTable = $('#tableOfPresupuestos').DataTable({
}
],
stateSave: false,
- order: [[1, 'asc']],
+ order: [[1, 'desc']],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
},
diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php
index 6e5bb084..aa0a6e08 100644
--- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php
+++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php
@@ -22,9 +22,6 @@
estado_id==1): ?>
-
-
-
+
-
- estado_id==1): ?>
-
-
-