Merge branch 'dev/actualizar_presupuesto' into 'main'

Dev/actualizar presupuesto

See merge request jjimenez/safekat!197
This commit is contained in:
2024-04-01 15:25:41 +00:00
21 changed files with 108844 additions and 344 deletions

View File

@ -102,6 +102,10 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$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) ) :
@ -191,10 +195,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$sanitizedData = $this->sanitized($postData, $nullIfEmpty);
// 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;
}
@ -339,28 +346,33 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$this->viewData['papelGenericoRotativaNegroList'] = $this->getPapelGenericoRotativaNegro();
$this->viewData['papelGenericoRotativaColorList'] = $this->getPapelGenericoRotativaColor();
$this->viewData['direccionesList'] = $this->getDirecciones($id);
// Acabados exteriores
$this->viewData['acabadosCubierta'] = $this->getAcabadosCubierta();
$this->viewData['acabadosSobrecubierta'] = $this->getAcabadosSobrecubierta();
// Lineas Presupuesto
$this->viewData['lineasPresupuesto'] = (new PresupuestoLineaModel())->getLineasPresupuesto($id);
[$cambios_lineas, $this->viewData['lineasPresupuesto']] = $this->getLineasPresupuesto($presupuestoEntity);
$this->viewData['presupuestoEntity']->cambios_lineas=$cambios_lineas;
// Tarifas
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
// Servicios
$this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion();
$this->viewData['serviciosPreimpresion'] = $this->getServiciosPreimpresion();
$this->viewData['serviciosEncuadernacion'] = $this->getServiciosEncuadernacion();
$this->viewData['serviciosManipulado'] = $this->getServiciosManipulado();
$this->viewData['serviciosEncuadernacionList'] = (new PresupuestoEncuadernacionesModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosAcabadosList'] = (new PresupuestoAcabadosModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosManipuladoList'] = (new PresupuestoManipuladosModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosPreimpresionList'] = (new PresupuestoPreimpresionesModel())->getResource($id)->get()->getResultObject();
$this->viewData['serviciosAcabado'] = $this->getServiciosAcabado();
[$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;
// Direciones presupuesto
$this->viewData['presupuestoDirecciones'] = (new PresupuestoDireccionesModel())->getResource("", $id)->get()->getResultObject();
[$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'] = [
@ -378,8 +390,13 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$this->viewData['formAction'] = route_to('updateCosidotapablanda', $id);
$this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . $this->viewData['pageTitle'] . ' ' . lang('Basic.global.edit3');
// 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(...)
@ -524,6 +541,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$item->ws_externo_json_data = character_limiter($item->ws_externo_json_data, 100);
endif;
endforeach;
} else {
$isColor = $reqData['color'] ?? false;
@ -548,7 +566,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$cliente_id = $reqData['cliente_id'] ?? -1;
$resourceData = [];
if ($type == 'interior' || $type == 'guardas') {
@ -568,6 +586,7 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
}
if ($type == 'guardas') {
$datosPedido->paginas_impresion = intval($reqData['paginas_impresion']) ?? 0;
// 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
@ -581,16 +600,21 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
$a_favor_fibra = $reqData['a_favor_fibra'] ?? false;
$resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog, $a_favor_fibra);
$input_data = array(
'uso' => $type,
'tipo_impresion_id' => $tipo_impresion_id,
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'isColor' => $isColor,
'isHq' => $isHq,
'cliente_id' => $cliente_id,
'datosTipolog' => $datosTipolog,
'a_favor_fibra' => $a_favor_fibra
);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
return $this->respond($data);
} else if ($type == 'interior_rot') {
$paginas = (object)array(
@ -612,36 +636,45 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
array_push($datosTipolog, $data);
}
$resourceData = $this->getCompIntRotData($datosPedido, $papel_generico, $gramaje, $paginas, $cliente_id, $datosTipolog);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
$input_data = [
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'paginas' => $paginas,
'cliente_id' => $cliente_id,
'datosTipolog' => $datosTipolog
];
$resourceData = PresupuestoService::obtenerComparadorRotativa($input_data);
return $this->respond($data);
} else if ($type == 'cubierta' || $type == 'sobrecubierta') {
$datosPedido->solapas = $reqData['solapas'];
$datosPedido->solapas_ancho = $reqData['solapas_ancho'];
$datosPedido->lomo = $reqData['lomo'];
$datosPedido->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($type, $tipo_impresion_id, $datosPedido);
$datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($type, $tipo_impresion_id, $datosPedido);
// Cubierta y sobrecubierta siempre color HQ
$resourceData = $this->getCompIntData($type, $datosPedido, $papel_generico, $gramaje, $isColor, 1, $cliente_id);
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
return $this->respond($data);
$input_data = array(
'uso' => $type,
'tipo_impresion_id' => $tipo_impresion_id,
'datosPedido' => $datosPedido,
'papel_generico' => $papel_generico,
'gramaje' => $gramaje,
'isColor' => 1, // Cubierta y sobrecubierta siempre color HQ
'isHq' => 1,
'cliente_id' => $cliente_id,
);
$resourceData = PresupuestoService::obtenerComparadorPlana($input_data);
}
$newTokenHash = csrf_hash();
$csrfTokenName = csrf_token();
$data = [
'lineas' => $resourceData,
$csrfTokenName => $newTokenHash
];
return $this->respond($data);
}
return $this->respond(Collection::datatable(
@ -809,215 +842,75 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
return $viewData;
}
private function getCompIntData($uso, $datosPedido, $papel_generico, $gramaje, $isColor, $isHq, $cliente_id, $datosTipolog = null, $a_favor_fibra = false)
{
$tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro');
$opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor);
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 0,
tarifa_tipo: $tipo,
uso_tarifa: ($uso == 'guardas') ? 'interior' : $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['opciones_papel'] = $opciones_papel;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['isColor'] = $isColor;
$data['a_favor_fibra'] = $a_favor_fibra;
$data['datosTipolog'] = $datosTipolog;
$data['gramaje'] = $gramaje;
$linea = PresupuestoService::getLineaPresupuestoPlana($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
/**
* Duplica un presupuesto dado por su ID.
*
* Esta función duplica un presupuesto y todas sus entidades relacionadas como acabados, encuadernaciones, manipulados,
* preimpresiones, direcciones y lineas. El presupuesto duplicado se marca como tal y a su título se le añade
* una cadena 'duplicado'. La función devuelve un array con un estado de éxito y el ID del nuevo presupuesto.
*
* @param int $id El ID del presupuesto a duplicar.
* @return array Un array asociativo que contiene una clave 'success' que indica el estado de éxito de la operación,
* y una clave 'id' que contiene el ID del nuevo presupuesto si la operación fue exitosa.
* Si ocurre una excepción, la clave 'success' será false y una clave 'message' contendrá el mensaje de la excepción.
* @throws \Exception Si ocurre un error durante la operación.
*/
private function duplicarPresupuesto($id){
try{
$presupuesto = $this->model->find($id);
$presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
$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);
}
$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 [
'success' => true,
'id' => $new_id
];
}catch(\Exception $e){
return [
'success' => false,
'message' => $e->getMessage()
];
}
}
private function getCompIntRotData($datosPedido, $papel_generico, $gramaje, $paginas, $cliente_id, $datosTipolog = null)
{
$uso = 'interior';
$tipo = $paginas->color > 0 ? 'color' : 'negro';
$parametrosRotativa = (object)array(
'a_favor_fibra' => $datosPedido->a_favor_fibra,
'bnPages' => $paginas->negro,
'colorPages' => $paginas->color,
'rotativa_gota_negro' => 0,
'rotativa_gota_color' => 0,
);
$opciones_papel = array(
'rotativa' => 1,
);
$tipo = array();
if ($paginas->color > 0) {
$tipo = 'color';
$opciones_papel['color'] = 1;
}
else {
$opciones_papel['bn'] = 1;
$tipo = 'negro';
}
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel();
if (is_null($datosTipolog)) {
$datosTipologias = $papelImpresionTipologiaModel
->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages > 0 ? 'color' : 'negro')
->get()->getResultObject();
if (count($datosTipologias) == 0) {
continue;
}
} else {
$datosTipologias = $datosTipolog;
}
$parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro;
$parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color;
$parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro;
$parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan;
$parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta;
$parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo;
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 1,
tarifa_tipo: $tipo,
uso_tarifa: $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['parametrosRotativa'] = $parametrosRotativa;
$data['paginas'] = $paginas;
$data['gramaje'] = $gramaje;
$linea = PresupuestoService::getLineaPresupuestoRotativa($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
try{
$presupuesto = $this->model->find($id);
$presupuesto->titulo = $presupuesto->titulo .' - ' . lang('Presupuestos.duplicado');
$presupuesto->is_duplicado = 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);
}
$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 [
'success' => true,
'id' => $new_id
];
}catch(\Exception $e){
return [
'success' => false,
'message' => $e->getMessage()
];
}
}
public function allItemsSelect()
{
@ -1186,8 +1079,6 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
}
protected function getPapelGenericoRotativaNegro()
{
$model = model('App\Models\Configuracion\PapelGenericoModel');
@ -1338,8 +1229,57 @@ class Cosidotapablanda extends \App\Controllers\GoBaseResourceController
return $model->getPOD();
}
protected function getDirecciones($presupuesto_id){
protected function getLineasPresupuesto($presupuestoEntity){
$lineas = (new PresupuestoLineaModel())->getLineasPresupuesto($presupuestoEntity->id);
$input_data = [];
$input_data['presupuesto'] = $presupuestoEntity;
return PresupuestoService::checkLineasPresupuesto($input_data, $lineas);
}
protected function getLineasServicios($presupuestoEntity){
$serviciosPresupuesto = (object)array();
$serviciosPresupuesto->serviciosAcabado = (new PresupuestoAcabadosModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosPreimpresion = (new PresupuestoPreimpresionesModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosEncuadernacion = (new PresupuestoEncuadernacionesModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$serviciosPresupuesto->serviciosManipulado = (new PresupuestoManipuladosModel())->getResource($presupuestoEntity->id)->get()->getResultObject();
$input_data = [];
$input_data['presupuesto_id'] = $presupuestoEntity->id;
$input_data['tipo_impresion_id'] = $presupuestoEntity->tipo_impresion_id;
$input_data['tirada'] = $presupuestoEntity->tirada;
$input_data['POD'] = $this->getPOD();
$input_data['paginas'] = $presupuestoEntity->paginas;
$input_data['is_duplicado'] = $presupuestoEntity->is_duplicado;
if($presupuestoEntity->papel_formato_personalizado){
$input_data['ancho'] = $presupuestoEntity->ancho;
$input_data['alto'] = $presupuestoEntity->alto;
}
else{
$model = model("App\Models\Configuracion\PapelFormatoModel");
$papel = $model->find($presupuestoEntity->papel_formato_id);
if($papel){
$input_data['ancho'] = $papel->ancho;
$input_data['alto'] = $papel->alto;
}
else{
$input_data['ancho'] = 0;
$input_data['alto'] = 0;
}
}
return PresupuestoService::checkLineasServicios($input_data, $serviciosPresupuesto);
}
protected function getLineasDirecciones($presupuestoEntity){
$model = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
return $model->where('presupuesto_id', $presupuesto_id)->findAll();
$direccionesEnvio = $model->where('presupuesto_id', $presupuestoEntity->id)->findAll();
return PresupuestoService::checkLineasEnvios($direccionesEnvio);
}
}

View File

@ -17,19 +17,9 @@ class Test extends BaseController
public function index()
{
$presupuestoModel = model('App\Models\Presupuestos\PresupuestoModel');
$presupuesto = $presupuestoModel->find(44);
$presupuestoAcabadosModel = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
echo '<pre>';
$presupuestoLineaModel = model('App\Models\Presupuestos\PresupuestoLineaModel');
$presupuestoLineaModel->duplicateLineasPresupuesto(48, 75);
echo '</pre>';
$status = PresupuestoService::checkMaquina(1995);
var_dump($status);
echo xdebug_info();
}

View File

@ -51,7 +51,8 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"comentarios_pdf" => null,
"comentarios_tarifa" => null,
"comentarios_produccion" => null,
"lomo" => null,
"lomo_cubierta" => null,
"lomo_sobrecubierta" => null,
"total_presupuesto" => null,
"envios_recoge_cliente" => false,
"tirada_alternativa_json_data" => null,
@ -86,6 +87,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor_ponderado" => null,
"acabado_cubierta_id" => null,
"acabado_sobrecubierta_id" => null,
"is_duplicado" => false,
];
protected $casts = [
"cliente_id" => "int",
@ -120,7 +122,8 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"sobrecubiertas_ancho" => "float",
"merma" => "float",
"merma_cubierta" => "float",
"lomo" => "?int",
"lomo_cubierta" => "?float",
"lomo_sobrecubierta" => "?float",
"total_presupuesto" => "?float",
"envios_recoge_cliente" => "boolean",
"aprobado_user_id" => "?int",
@ -147,5 +150,6 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor_ponderado" => "?float",
"acabado_cubierta_id" => "int",
"acabado_sobrecubierta_id" => "int",
"is_duplicado" => "boolean",
];
}

View File

@ -254,8 +254,15 @@ return [
'duplicado' => 'DUPLICADO',
'duplicarConTipologias' => 'El presupuesto contiene lineas de presupuesto con datos de tipologías. Se va a duplicar el presupuesto con las mismas tipologías',
'presupuestoDuplicadoActualizacion' => 'El presupuesto ha sido creado duplicando un presupuesto existente. Se han actualizado los precios y las líneas de presupuesto con las tarifas actuales. Por favor, revíse la información.',
'actualizacionPrecios' => 'Los siguientes datos del presupuesto se han actualizado debido a un cambio de tarifas o de los consumibles/maquinaria disponible en el sistema. Revise la información.',
'actualizacionPreciosLP' => '<br> - Líneas de presupuesto',
'actualizacionPreciosServicios' => '<br> - Servicios',
'actualizacionPreciosEnvios' => '<br> - Precio envíos',
'validation' => [
'decimal' => 'El campo {field} debe contener un número decimal.',
'integer' => 'El campo {field} debe contener un número entero.',

View File

@ -95,7 +95,7 @@ class MaquinasTarifasImpresionModel extends \App\Models\GoBaseModel
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.tipo AS tipo, t1.precio AS precio, t1.uso AS uso, t1.margen AS margen"
"t1.id AS id, t1.tipo AS tipo, t1.precio AS precio, t1.uso AS uso, t1.margen AS margen, t1.is_deleted AS is_deleted, t2.nombre AS maquina"
);
//JJO

View File

@ -75,23 +75,7 @@ class PresupuestoAcabadosModel extends \App\Models\GoBaseModel
return [];
}
private function calcularTarifa($tarifa, $tirada, $is_POD=false){
$precio_unidad = floatval($tarifa->precio_min) - (floatval($tarifa->precio_min) - floatval($tarifa->precio_max))/($tarifa->tirada_max - $tarifa->tirada_min) * ($tirada - $tarifa->tirada_min);
if ($tirada > $tarifa->tirada_max)
$precio_unidad = $tarifa->precio_max;
$precio_unidad = $precio_unidad* (1+ floatval($tarifa->margen)/100.0);
$total = $precio_unidad * $tirada;
$margen = floatval($tarifa->margen);
if (!$is_POD){
$total += floatval($tarifa->tarifa_importe_fijo);
}
return [$precio_unidad, $total, $margen];
}
public function deleteAllServicios($presupuesto_id){
$this->db
@ -261,4 +245,21 @@ class PresupuestoAcabadosModel extends \App\Models\GoBaseModel
return $builder;
}
private function calcularTarifa($tarifa, $tirada, $is_POD=false){
$precio_unidad = floatval($tarifa->precio_min) - (floatval($tarifa->precio_min) - floatval($tarifa->precio_max))/($tarifa->tirada_max - $tarifa->tirada_min) * ($tirada - $tarifa->tirada_min);
if ($tirada > $tarifa->tirada_max)
$precio_unidad = $tarifa->precio_max;
$precio_unidad = $precio_unidad* (1+ floatval($tarifa->margen)/100.0);
$total = $precio_unidad * $tirada;
$margen = floatval($tarifa->margen);
if (!$is_POD){
$total += floatval($tarifa->tarifa_importe_fijo);
}
return [$precio_unidad, $total, $margen];
}
}

View File

@ -90,6 +90,16 @@ class PresupuestoDireccionesModel extends \App\Models\GoBaseModel
->groupEnd();
}
public function updateLineaEnvio($lineaEnvio){
$lineaTemp = $lineaEnvio;
unset($lineaTemp->pais);
$this->save($lineaTemp);
}
/**
* Get resource data for pdf generation.
*

View File

@ -337,6 +337,81 @@ class PresupuestoLineaModel extends \App\Models\GoBaseModel
return $builder->orderBy("t1.id", "asc")->get()->getResultObject();
}
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;
$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),
"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,
"rotativa_a_favor_fibra" => $new_linea['fields']['a_favor_fibra'] ?? 0,
"rotativa_mxm" => $new_linea['fields']['maquina_velocidad'] ?? 0,
"rotativa_resolucion" => $new_linea['fields']['resolucion'] ?? 0,
"rotativa_area_paginas" => $new_linea['fields']['superficie'] ?? 0,
"rotativa_num_gotas_negro" => $new_linea['fields']['num_gotas_negro'] ?? 0,
"rotativa_num_gotas_cyan" => $new_linea['fields']['num_gotas_cyan'] ?? 0,
"rotativa_num_gotas_magenta" => $new_linea['fields']['num_gotas_magenta'] ?? 0,
"rotativa_num_gotas_amarillo" => $new_linea['fields']['num_gotas_amarillo'] ?? 0,
"rotativa_num_gotas_cg" => $new_linea['fields']['num_gotas_cg'] ?? 0,
"rotativa_peso_gotas_negro" => $new_linea["fields"]["peso_gotas_negro"] ?? 0,
"rotativa_peso_gotas_cyan" => $new_linea['fields']['peso_gotas_cyan'] ?? 0,
"rotativa_peso_gotas_magenta" => $new_linea['fields']['peso_gotas_magenta'] ?? 0,
"rotativa_peso_gotas_amarillo" => $new_linea['fields']['peso_gotas_amarillo'] ?? 0,
"rotativa_peso_gotas_cg" => $new_linea['fields']['peso_gotas_cg'] ?? 0,
"rotativa_peso_gotas_negro_pedido" => $new_linea["fields"]["peso_gotas_negro_pedido"] ?? 0,
"rotativa_peso_gotas_cyan_pedido" => $new_linea["fields"]["peso_gotas_cyan_pedido"] ?? 0,
"rotativa_peso_gotas_magenta_pedido" => $new_linea["fields"]["peso_gotas_magenta_pedido"] ?? 0,
"rotativa_peso_gotas_amarillo_pedido" => $new_linea["fields"]["peso_gotas_amarillo_pedido"] ?? 0,
"rotativa_peso_gotas_cg_pedido" => $new_linea["fields"]["peso_gotas_cg_pedido"] ?? 0,
"rotativa_precio_pag_negro" => $new_linea['fields']['precio_pagina_negro'] ?? 0,
"rotativa_precio_pag_color" => $new_linea['fields']['precio_pagina_color'] ?? 0,
"rotativa_factor_altura" => $new_linea['fields']['factor_altura'] ?? 0,
"rotativa_factor_anchura" => $new_linea['fields']['factor_anchura'] ?? 0,
"rotativa_pag_por_pliego" => $new_linea['fields']['paginas_por_pliego'] ?? 0,
"rotativa_metros_libro" => $new_linea['fields']['metros_papel_libro'] ?? 0,
"rotativa_metros_total" => $new_linea['fields']['metros_papel_total'] ?? 0,
"rotativa_clicks_libro" => $new_linea['fields']['clicks_libro'] ?? 0,
"rotativa_clicks_total" => $new_linea['fields']['clicks_pedido'] ?? 0,
"rotativa_precio_tinta" => $new_linea['fields']['precio_tinta'] ?? 0,
"rotativa_velocidad_corte" => $new_linea['fields']['velocidad_corte'] ?? 0,
"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),
"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'])){
$data += [
"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,
"rotativa_cg" => $new_linea['fields']['datosTipologias']->cg ?? 0,
"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)
->set($data)
->update();
}
public function deleteLineasPresupuesto($presupuesto_id)
{
$this->db

View File

@ -72,7 +72,8 @@ class PresupuestoModel extends \App\Models\GoBaseModel
"comentarios_pdf",
"comentarios_tarifa",
"comentarios_produccion",
"lomo",
"lomo_cubierta",
"lomo_sobrecubierta",
"total_presupuesto",
"envios_recoge_cliente",
"tirada_alternativa_json_data",
@ -104,6 +105,7 @@ class PresupuestoModel extends \App\Models\GoBaseModel
"total_factor_ponderado",
"acabado_cubierta_id",
"acabado_sobrecubierta_id",
"is_duplicado"
];
protected $returnType = "App\Entities\Presupuestos\PresupuestoEntity";
@ -263,6 +265,13 @@ class PresupuestoModel extends \App\Models\GoBaseModel
}
public function removeIsDuplicado($presupuesto_id){
$this->db
->table($this->table . " t1")
->where('id', $presupuesto_id)
->set('is_duplicado', false)
->update();
}
/**
* Get resource data for creating PDFs.
@ -277,8 +286,9 @@ class PresupuestoModel extends \App\Models\GoBaseModel
->table($this->table . " t1")
->select(
"t1.id AS id, t1.created_at AS fecha, t1.titulo AS titulo, t1.autor AS autor, t1.ferro AS ferro,
t1.ferro_digital AS ferro_digital, t1.prototipo AS prototipo, t1.solapas AS solapas, t1.lomo AS lomo,
t1.solapas_ancho AS solapas_ancho, t1.paginas AS paginas, t1.tirada AS tirada, t1.coleccion AS coleccion,
t1.ferro_digital AS ferro_digital, t1.prototipo AS prototipo, t1.solapas AS solapas, t1.solapas_sobrecubierta AS solapas_sobrecubierta,
t1.lomo_cubierta AS lomo_cubierta, t1.lomo_sobrecubierta AS lomo_sobrecubierta,
t1.solapas_ancho AS solapas_ancho, t1.solapas_sobrecubierta_ancho AS solapas_sobrecubierta_ancho, t1.paginas AS paginas, t1.tirada AS tirada, t1.coleccion AS coleccion,
t1.retractilado AS retractilado, t1.guardas AS guardas, t1.marcapaginas AS marcapaginas,
t1.comentarios_pdf AS comentarios_pdf, t1.tirada_alternativa_json_data AS tiradas_alternativas,
t1.total_presupuesto AS total_presupuesto, t1.total_precio_unidad AS total_precio_unidad,
@ -297,6 +307,4 @@ class PresupuestoModel extends \App\Models\GoBaseModel
return $builder;
}
}

View File

@ -6,6 +6,20 @@ use CodeIgniter\Config\BaseService;
use App\Models\Configuracion\MaquinasTarifasImpresionModel;
use App\Models\Clientes\ClientePreciosModel;
use App\Models\Configuracion\MaquinaModel;
use App\Models\Configuracion\PapelImpresionModel;
use App\Models\Configuracion\PapelGenericoModel;
use App\Models\Configuracion\TipoPresupuestoModel;
use App\Models\Configuracion\PapelFormatoModel;
use App\Models\Presupuestos\PresupuestoLineaModel;
use App\Models\Presupuestos\PresupuestoAcabadosModel;
use App\Models\Presupuestos\PresupuestoManipuladosModel;
use App\Models\Presupuestos\PresupuestoEncuadernacionesModel;
use App\Models\Presupuestos\PresupuestoDireccionesModel;
use App\Models\Tarifas\TarifaEnvioModel;
@ -218,6 +232,9 @@ class PresupuestoService extends BaseService
// precio del pliego de impresion
$linea['fields'] = PresupuestoService::getCostesLineaRotativa($maquina, $papel, $datosPedido, $parametrosRotativa);
if(count($linea['fields']) == 0){
return [];
}
[$precio_pliego_impresion, $margen_pliego_impresion] = PresupuestoService::getPrecioPliego($maquina, $papel, $datosPedido->paginas);
@ -449,6 +466,10 @@ class PresupuestoService extends BaseService
$factor_altura = round($maquina->alto_impresion / ($data['alto'] + self::MARGEN_PAGINAS_ROTATIVA), 2);
$factor_altura_click = round($maquina->alto_click / ($data['alto'] + self::MARGEN_PAGINAS_ROTATIVA), 2);
if(floor($factor_anchura) == 0){
return [];
}
$multiplicador_pliego = $datosPedido->isCosido ? 4 : 2;
$paginas_por_pliego = round(floor($factor_anchura) * $factor_altura * $multiplicador_pliego, 2);
$pliegos_libro = round($paginas_por_pliego ? $datosPedido->paginas / $paginas_por_pliego : 0, 2);
@ -949,6 +970,803 @@ class PresupuestoService extends BaseService
return $opciones_papel;
}
public static function actualizarResumenPresupuesto($presupuesto_id)
{
$presupuesto = (new PresupuestoModel())->find($presupuesto_id);
$lineas = (new LineaPresupuestoModel())->where('presupuesto_id', $presupuesto_id)->findAll();
}
public static function checkLineasPresupuesto($input_data, $array_lineas)
{
$data['tipo_impresion_id'] = ($input_data['presupuesto'])->tipo_impresion_id;
$data['tirada'] = ($input_data['presupuesto'])->tirada;
$data['merma'] = ($input_data['presupuesto'])->merma;
$data['papel_formato_id'] = ($input_data['presupuesto'])->papel_formato_id;
$data['papel_formato_personalizado'] = ($input_data['presupuesto'])->papel_formato_personalizado;
$data['papel_formato_ancho'] = ($input_data['presupuesto'])->papel_formato_ancho;
$data['papel_formato_alto'] = ($input_data['presupuesto'])->papel_formato_alto;
$data['cliente_id'] = ($input_data['presupuesto'])->cliente_id;
$data['solapas'] = ($input_data['presupuesto'])->solapas;
$data['solapas_ancho'] = ($input_data['presupuesto'])->solapas_ancho;
$data['solapas_sobrecubierta'] = ($input_data['presupuesto'])->solapas_sobrecubierta;
$data['solapas_ancho_sobrecubierta'] = ($input_data['presupuesto'])->solapas_ancho_sobrecubierta;
$data['lomo_cubierta'] = ($input_data['presupuesto'])->lomo_cubierta;
$data['lomo_sobrecubierta'] = ($input_data['presupuesto'])->lomo_sobrecubierta;
$cambios = false;
$lineas = [];
foreach ($array_lineas as $linea) {
// Si el papel o la máquina no existen, se utiliza la más barata del comparador
if (!PresupuestoService::checkMaquina($linea->maquina_id) || !PresupuestoService::checkPapelImpresion($linea->papel_impresion_id)) {
if(($input_data['presupuesto'])->papel_formato_personalizado == 0){
$papel_formato = (new PapelFormatoModel())->find(($input_data['presupuesto'])->papel_formato_id);
$ancho = $papel_formato->ancho;
$alto = $papel_formato->alto;
}
else
{
$ancho = ($input_data['presupuesto'])->papel_formato_ancho;
$alto = ($input_data['presupuesto'])->papel_formato_alto;
}
$papel_generico = (new PapelGenericoModel)->find($linea->papel_id);
$papel_generico = [
'id' => $papel_generico->id,
'nombre' => $papel_generico->nombre,
];
// Hay que ver si es rotativa o plana
// Si es rotativa
if(str_contains($linea->tipo, '_rot_')){
$datos = [
'datosPedido' => (object)array(
'paginas' => ($input_data['presupuesto'])->paginas,
'tirada' => ($input_data['presupuesto'])->tirada,
'merma' => ($input_data['presupuesto'])->merma,
'ancho' => $ancho,
'alto' => $alto,
'a_favor_fibra' => $linea->rotativa_a_favor_fibra,
'isCosido' => (new TipoPresupuestoModel())->get_isCosido(($input_data['presupuesto'])->tipo_impresion_id),
),
'papel_generico' => $papel_generico,
'gramaje' => $linea->gramaje,
'paginas' => (object)array(
'negro' => ($input_data['presupuesto'])->paginas - $linea->rotativa_pag_color,
'color' => $linea->rotativa_pag_color,
),
'cliente_id' => ($input_data['presupuesto'])->cliente_id,
'datosTipolog' => [(object)array(
'negro' => $linea->rotativa_negro,
'cyan' => $linea->rotativa_cyan,
'magenta' => $linea->rotativa_magenta,
'amarillo' => $linea->rotativa_amarillo,
'cg' => $linea->rotativa_cg,
'gota_negro' => $linea->rotativa_gota_negro,
'gota_color' => $linea->rotativa_gota_color,
)]
];
$comp_data = PresupuestoService::obtenerComparadorRotativa($datos);
}
// Si es plana
else{
$datos = [
'tipo_impresion_id' => $data['tipo_impresion_id'],
'datosPedido' => (object)array(
'paginas' => ($input_data['presupuesto'])->paginas,
'tirada' => ($input_data['presupuesto'])->tirada,
'merma' => ($input_data['presupuesto'])->merma,
'ancho' => $ancho,
'alto' => $alto,
'a_favor_fibra' => $linea->rotativa_a_favor_fibra,
'isCosido' => (new TipoPresupuestoModel())->get_isCosido(($input_data['presupuesto'])->tipo_impresion_id),
),
'a_favor_fibra' => $linea->rotativa_a_favor_fibra,
'papel_generico' => $papel_generico,
'gramaje' => $linea->gramaje,
'cliente_id' => ($input_data['presupuesto'])->cliente_id,
'datosTipolog' => [(object)array(
'negro' => $linea->rotativa_negro,
'cyan' => $linea->rotativa_cyan,
'magenta' => $linea->rotativa_magenta,
'amarillo' => $linea->rotativa_amarillo,
'cg' => $linea->rotativa_cg,
'gota_negro' => $linea->rotativa_gota_negro,
'gota_color' => $linea->rotativa_gota_color,
)]
];
// si la línea es cubierta o sobrecubierta, es HQ y color
if( str_contains($linea->tipo, 'cubierta') ){
$datos['isColor'] = true;
$datos['isHq'] = true;
// además se añade los campos de lomo y solapas y el uso
if( str_contains($linea->tipo, 'sobrecubierta') ){
$datos['datosPedido']->solapas = ($input_data['presupuesto'])->solapas_sobrecubierta;
$datos['datosPedido']->solapas_ancho = ($input_data['presupuesto'])->solapas_ancho_sobrecubierta;
$datos['datosPedido']->lomo = ($input_data['presupuesto'])->lomo_sobrecubierta;
$datos['uso'] = 'sobrecubierta';
}
else{
$datos['datosPedido']->solapas = ($input_data['presupuesto'])->solapas;
$datos['datosPedido']->solapas_ancho = ($input_data['presupuesto'])->solapas_ancho;
$datos['datosPedido']->lomo = ($input_data['presupuesto'])->lomo_cubierta;
$datos['uso'] = 'cubierta';
}
}
else{
$datos['isColor'] = str_contains($linea->tipo, '_color') ? true : false;
$datos['isHq'] = str_contains($linea->tipo, 'hq') ? true : false;
$datos['uso'] = 'interior';
}
if( str_contains($linea->tipo, 'guardas') ){
$datos['uso'] = 'guardas';
$datos['datosPedido']->paginas_impresion = linea->paginas_impresion;
}
$comp_data = PresupuestoService::obtenerComparadorPlana($datos);
}
// se ordena $comp_data usando el campo ['fields]['total_impresion']
usort($comp_data, function($a, $b) {
return $a['fields']['total_impresion'] <=> $b['fields']['total_impresion'];
});
(new PresupuestoLineaModel())->updatePreciosLineasPresupuesto($linea->id, $comp_data[0]);
$linea_to_save = (new PresupuestoLineaModel())->find($linea->id);
$cambios = true;
array_push($lineas, $linea_to_save);
}
// Si existe el papel y la máquina, se recalcula el precio con los mismos
// parámetros y se comprueba
else{
$nueva_linea = PresupuestoService::obtenerValorLineaPresupuesto($data, $linea);
if(count($nueva_linea) >0){
if(round($nueva_linea['fields']['total_impresion'],2) != $linea->total_linea){
(new PresupuestoLineaModel())->updatePreciosLineasPresupuesto($linea->id, $nueva_linea);
$linea_to_save = (new PresupuestoLineaModel())->find($linea->id);
$cambios = true;
array_push($lineas, $linea_to_save);
}
else{
array_push($lineas, $linea);
}
}
}
}
return [$cambios, $lineas];
}
private static function obtenerValorLineaPresupuesto($input_data, $linea){
$tipo_impresion_id = $input_data['tipo_impresion_id'];
$tirada = $input_data['tirada'];
$merma = $input_data['merma'];
$papel_formato_id = $input_data['papel_formato_id'];
$papel_formato_personalizado = $input_data['papel_formato_personalizado'];
$ancho = $input_data['papel_formato_ancho'];
$alto = $input_data['papel_formato_alto'];
$cliente_id = $input_data['cliente_id'];
$solapas = $input_data['solapas'];
$solapas_sobrecubierta = $input_data['solapas_sobrecubierta'];
$solapas_ancho_cubierta = $input_data['solapas_ancho'];
$solapas_ancho_sobrecubierta = $input_data['solapas_ancho_sobrecubierta'];
$lomo_cubierta = $input_data['lomo_cubierta'];
$lomo_sobrecubierta = $input_data['lomo_sobrecubierta'];
if($papel_formato_personalizado == 0){
$papel_formato = (new PapelFormatoModel())->find($papel_formato_id);
$ancho = $papel_formato->ancho;
$alto = $papel_formato->alto;
}
$data = [];
$output_data = [];
$papel_impresion = (new PapelImpresionModel())->find($linea->papel_impresion_id);
$maquina = (new MaquinaModel())->find($linea->maquina_id);
$maquina->maquina_id = $maquina->id;
$maquina->maquina = $maquina->nombre;
$papel_generico = (new PapelGenericoModel())->find($linea->papel_id);
$papel_generico = array(
'id' => $papel_generico->id,
'nombre' => $papel_generico->nombre,
);
$data['datosPedido'] = (object)array(
'paginas' => $linea->paginas,
'tirada' => $tirada,
'merma' => $merma,
'ancho' => $ancho,
'alto' => $alto,
'a_favor_fibra' => $linea->rotativa_a_favor_fibra,
'isCosido' => (new TipoPresupuestoModel())->get_isCosido($tipo_impresion_id),
);
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel_impresion;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['a_favor_fibra'] = $linea->rotativa_a_favor_fibra;
$data['datosTipolog'] = [(object)array(
'negro' => $linea->rotativa_negro,
'cyan' => $linea->rotativa_cyan,
'magenta' => $linea->rotativa_magenta,
'amarillo' => $linea->rotativa_amarillo,
'cg' => $linea->rotativa_cg,
'gota_negro' => $linea->rotativa_gota_negro,
'gota_color' => $linea->rotativa_gota_color,
)];
$data['gramaje'] = $linea->gramaje;
switch($linea->tipo){
case 'lp_bn':
case 'lp_bnhq':
case 'lp_color':
case 'lp_colorhq':
case 'lp_guardas':
$data['uso'] = 'interior';
$isColor = strpos($linea->tipo, 'color') !== false;
$isHq = strpos($linea->tipo, 'hq') !== false;
$tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro');
$opciones_papel = PresupuestoService::get_opciones_papel('interior', $isColor);
if($linea->tipo == 'lp_guardas'){
$data['datosPedido']->paginas_impresion = $linea->paginas_impresion;
// 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) {
$data['datosPedido']->isCosido = true;
} else if ($tipo_impresion_id == 5 || $tipo_impresion_id == 7) {
$data['datosPedido']->isCosido = false;
}
}
$data['tipo'] = $tipo;
$data['isColor'] = $isColor;
$data['opciones_papel'] = $opciones_papel;
$output_data = PresupuestoService::getLineaPresupuestoPlana($data);
break;
case 'lp_rot_color':
case 'lp_rot_bn':
$data['uso'] = 'interior';
$tipo = $linea->rotativa_pag_color>0 ? 'color' : 'negro';
$data['paginas'] = (object)array(
'negro' => $linea->paginas-$linea->rotativa_pag_color,
'color' => $linea->rotativa_pag_color,
);
$data['tipo'] = $tipo;
$data['parametrosRotativa'] = (object)array(
'a_favor_fibra' => $linea->rotativa_a_favor_fibra,
'bnPages' => $data['paginas']->negro,
'colorPages' => $data['paginas']->color,
'rotativa_negro' => $linea->rotativa_negro,
'rotativa_cyan' => $linea->rotativa_cyan,
'rotativa_magenta' => $linea->rotativa_magenta,
'rotativa_amarillo' => $linea->rotativa_amarillo,
'rotativa_gota_negro' => $linea->rotativa_gota_negro,
'rotativa_gota_color' => $linea->rotativa_gota_color,
);
$output_data = PresupuestoService::getLineaPresupuestoRotativa($data);
break;
case 'lp_cubierta':
case 'lp_sobrecubierta':
$data['uso'] = ($linea->tipo == 'lp_cubierta')? 'cubierta':'sobrecubierta';
$data['tipo'] = 'colorhq';
$data['isColor'] = true;
$data['datosPedido']->solapas = ($linea->tipo == 'lp cubierta')? $solapas : $solapas_sobrecubierta;
$data['datosPedido']->solapas_ancho = ($linea->tipo == 'lp cubierta')? $solapas_ancho_cubierta : $solapas_ancho_sobrecubierta;
$data['datosPedido']->lomo = ($linea->tipo == 'lp cubierta')? $lomo_cubierta : $lomo_sobrecubierta;
$opciones_papel = PresupuestoService::get_opciones_papel($data['uso'], true);
$data['opciones_papel'] = $opciones_papel;
$data['datosPedido']->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($data['uso'], $tipo_impresion_id, $data['datosPedido']);
$data['datosPedido']->altoExteriores = PresupuestoService::getAltoTotalExteriores($data['uso'], $tipo_impresion_id, $data['datosPedido']);
$output_data = PresupuestoService::getLineaPresupuestoPlana($data);
break;
}
return $output_data;
}
// Funcion que procesa los servicios y actualiza los precios en caso de cambio
public static function checkLineasServicios($input_data, $servicios){
$cambio_en_servicios = false;
$cambio = false;
if(count($servicios->serviciosAcabado)>0){
[$cambio, $servicios->serviciosAcabado] =
PresupuestoService::procesarServiciosAcabado($input_data, $servicios->serviciosAcabado);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
if(count($servicios->serviciosManipulado)>0){
[$cambio, $servicios->serviciosManipulado] =
PresupuestoService::procesarServiciosManipulado($input_data, $servicios->serviciosManipulado);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
if(count($servicios->serviciosEncuadernacion)>0){
[$cambio, $servicios->serviciosEncuadernacion] =
PresupuestoService::procesarServiciosEncuadernacion($input_data, $servicios->serviciosEncuadernacion);
$cambio_en_servicios = $cambio_en_servicios? $cambio_en_servicios: $cambio;
}
// Los servicios de preimpresion se dejan tal y como esten
return [$cambio_en_servicios, $servicios];
}
// Funcion que procesa los servicios de acabado del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosAcabado($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoAcabadosModel();
foreach ($servicios as $servicio) {
$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 ||
$nueva_tarifa[0]->margen != $servicio->margen){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_acabado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
// Funcion que procesa los servicios de manipulado del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosManipulado($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoManipuladosModel();
foreach ($servicios as $servicio) {
$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 ||
$nueva_tarifa[0]->margen != $servicio->margen){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_manipulado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
// Funcion que procesa los servicios de encuadernacion del presupuesto
// y actualiza los precios en caso de cambio de valor en precio_unidad
private static function procesarServiciosEncuadernacion($input_data, $servicios){
$serviciosUpdated = [];
$cambio = false;
$model = new PresupuestoEncuadernacionesModel();
$tarifaModel = model('App\Models\Tarifas\TarifaEncuadernacionModel');
foreach ($servicios as $servicio) {
// Si es un presupuesto duplicado hay que buscar el proveedor más barato
if($input_data['is_duplicado']){
if($tarifaModel->isTarifaPorHoras($servicio->tarifa_encuadernado_id)){
$nueva_tarifa = $model->getPrecioTarifaHoras(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
-1,
$input_data['POD']);
}else{
$nueva_tarifa = $model->getPrecioTarifa(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$input_data['ancho'],
$input_data['alto'],
-1,
$input_data['POD']);
}
}
// En caso de que el presupuesto no sea duplicado, recalcular la tarifa
// con el mismo proveedor
else{
if($tarifaModel->isTarifaPorHoras($servicio->tarifa_encuadernado_id)){
$nueva_tarifa = $model->getPrecioTarifaHoras(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$servicio->proveedor_id,
$input_data['POD']);
}else{
$nueva_tarifa = $model->getPrecioTarifa(
$servicio->tarifa_encuadernado_id,
$input_data['paginas'],
$input_data['tirada'],
$input_data['ancho'],
$input_data['alto'],
$servicio->proveedor_id,
$input_data['POD']);
}
}
if($nueva_tarifa && count($nueva_tarifa)>0){
if(!isset($nueva_tarifa[0]->proveedor_id)){
$nueva_tarifa[0]->proveedor_id = null;
}
// 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){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$cambio = true;
}
else if($input_data['is_duplicado'] && $nueva_tarifa[0]->proveedor_id != $servicio->proveedor_id){
$servicio->precio_unidad = round($nueva_tarifa[0]->precio_unidad, 2);
$servicio->precio_total = round($nueva_tarifa[0]->total, 2);
$servicio->margen = round($nueva_tarifa[0]->margen);
$servicio->proveedor = $nueva_tarifa[0]->proveedor;
$servicio->proveedor_id = $nueva_tarifa[0]->proveedor_id;
$cambio = true;
}
array_push($serviciosUpdated, $servicio);
$servicio_temp = $servicio;
$servicio_temp->tarifa_id = $servicio_temp->tarifa_encuadernado_id;
$model->updateTarifas($input_data['presupuesto_id'], array($servicio_temp));
}
}
return [$cambio, $serviciosUpdated];
}
public static function checkLineasEnvios($envios){
$cambio = false;
if(count($envios)>0){
$model = new TarifaEnvioModel();
foreach ($envios as $envio) {
$paisId = $envio->pais_id;
$cp= $envio->cp;
$peso= $envio->peso;
$tipo_envio= $envio->entregaPieCalle==1?'palets':'cajas';
$nueva_tarifa = $model->getTarifaEnvio($paisId, $cp, $peso, $tipo_envio);
if($nueva_tarifa && count($nueva_tarifa)>0){
$coste = 0;
$margen = 0;
if($peso>$nueva_tarifa[0]->peso_max){
$coste += floatval($nueva_tarifa[0]->peso_min) + ($peso-floatval($nueva_tarifa[0]->peso_min))*floatval($nueva_tarifa[0]->precio_adicional);
}
// si no se calcula linealmente
else{
$m=(floatval($nueva_tarifa[0]->precio_max)-floatval($nueva_tarifa[0]->precio_min)) / ((floatval($nueva_tarifa[0]->peso_max)-floatval($nueva_tarifa[0]->peso_min)));
$b=floatval($nueva_tarifa[0]->precio_max)-$m*floatval($nueva_tarifa[0]->peso_max);
$coste += floatval($m*$peso+$b);
}
$margen += $coste*floatval($nueva_tarifa[0]->margen)/100.0;
if(round($coste, 2) != $envio->precio ||
$margen != $envio->margen || $nueva_tarifa[0]->id != $envio->tarifa_id){
$envio->precio = round($coste, 2);
$envio->margen = $margen;
$envio->tarifa_id = $nueva_tarifa[0]->id;
$cambio = true;
$presupuestoDirecciones = new PresupuestoDireccionesModel();
$presupuestoDirecciones->updateLineaEnvio($envio);
}
}
}
}
return [$cambio, $envios];
}
// Funcion que obtiene el coste para impresión en rotativa
// y devuelve un array con los datos de la lineas
// Parametros de entrada: $input_data es un array con los siguientes datos:
// - paginas: objeto con las paginas a imprimir en color y negro
// - datosPedido: un objeto que contiene los siguientes campos
// * paginas: numero total de páginas
// * tirada: numero de ejemplares a imprimir
// * merma: número de ejemplares extra a imprimir
// * ancho: ancho del libro
// * alto: alto del libro
// * a_favor_fibra: dirección de la impresión
// * isCosido: indica si el libro es cosido o no
// - papel_generico: objeto que contiene el id y el nombre del papel generico
// - gramaje: gramaje del papel seleccionado
// - cliente_id: id del cliente al que va destinado el presupuesto
// - datosTipolog: datos referentes a las tintas
public static function obtenerComparadorRotativa($input_data){
$paginas = $input_data['paginas'];
$datosPedido = $input_data['datosPedido'];
$gramaje = $input_data['gramaje'];
$papel_generico = $input_data['papel_generico'];
$cliente_id = $input_data['cliente_id'];
$datosTipolog = $input_data['datosTipolog'];
$tipo = $paginas->color > 0 ? 'color' : 'negro';
$uso = 'interior';
$parametrosRotativa = (object)array(
'a_favor_fibra' => $datosPedido->a_favor_fibra,
'bnPages' => $paginas->negro,
'colorPages' => $paginas->color,
'rotativa_gota_negro' => 0,
'rotativa_gota_color' => 0,
);
$opciones_papel = array(
'rotativa' => 1,
);
$tipo = array();
if ($paginas->color > 0) {
$tipo = 'color';
$opciones_papel['color'] = 1;
}
else {
$opciones_papel['bn'] = 1;
$tipo = 'negro';
}
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$papelImpresionTipologiaModel = new \App\Models\Configuracion\PapelImpresionTipologiaModel();
if (is_null($datosTipolog)) {
$datosTipologias = $papelImpresionTipologiaModel
->findTipologiasForPapelImpresion($papel->id, $parametrosRotativa->colorPages > 0 ? 'color' : 'negro')
->get()->getResultObject();
if (count($datosTipologias) == 0) {
continue;
}
} else {
$datosTipologias = $datosTipolog;
}
$parametrosRotativa->rotativa_gota_negro = $datosTipologias[0]->gota_negro;
$parametrosRotativa->rotativa_gota_color = $datosTipologias[0]->gota_color;
$parametrosRotativa->rotativa_negro = $datosTipologias[0]->negro;
$parametrosRotativa->rotativa_cyan = $datosTipologias[0]->cyan;
$parametrosRotativa->rotativa_magenta = $datosTipologias[0]->magenta;
$parametrosRotativa->rotativa_amarillo = $datosTipologias[0]->amarillo;
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 1,
tarifa_tipo: $tipo,
uso_tarifa: $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['papel_generico'] = $papel_generico;
$data['parametrosRotativa'] = $parametrosRotativa;
$data['paginas'] = $paginas;
$data['gramaje'] = $gramaje;
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['maquina'] = $maquina;
$linea = PresupuestoService::getLineaPresupuestoRotativa($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
// Funcion que obtiene el coste para impresión en plana
// y devuelve un array con los datos de la lineas
// Parametros de entrada: $input_data es un array con los siguientes datos:
// - uso: 'interior', 'guardas', 'cubierta' o 'sobrecubierta'
// - tipo_impresion_id: id del tipo de impresion
// - datosPedido: un objeto que contiene los siguientes campos
// * paginas: numero total de páginas
// * tirada: numero de ejemplares a imprimir
// * merma: número de ejemplares extra a imprimir
// * ancho: ancho del libro
// * alto: alto del libro
// * a_favor_fibra: dirección de la impresión
// * isCosido: indica si el libro es cosido o no
// * solapas: (solo cubierta y sobrecubierta) indica si hay o no solapas
// * solapas_ancho: (solo cubierta y sobrecubierta) indica el ancho de las solapas
// * lomo: (solo cubierta y sobrecubierta) ancho del lomo del libro (o libro mas cubierta)
// - papel_generico: objeto que contiene el id y el nombre del papel generico
// - gramaje: gramaje del papel seleccionado
// - cliente_id: id del cliente al que va destinado el presupuesto
// - datosTipolog: datos referentes a las tintas (opcional)
// - a_favor_fibra: dirección de la impresión
public static function obtenerComparadorPlana($input_data){
$uso = $input_data['uso'];
$tipo_impresion_id = $input_data['tipo_impresion_id'];
$datosPedido = $input_data['datosPedido'];
$papel_generico = $input_data['papel_generico'];
$gramaje = $input_data['gramaje'];
$isColor = $input_data['isColor'];
$isHq = $input_data['isHq'];
$cliente_id = $input_data['cliente_id'];
$datosTipolog = $input_data['datosTipolog'] ?? null;
$a_favor_fibra = $datosPedido->a_favor_fibra ?? false;
$tipo = $isColor ? ($isHq ? 'colorhq' : 'color') : ($isHq ? 'negrohq' : 'negro');
if ($uso == 'cubierta' || $uso == 'sobrecubierta') {
$datosPedido->anchoExteriores = PresupuestoService::getAnchoTotalExteriores($uso, $tipo_impresion_id, $datosPedido);
$datosPedido->altoExteriores = PresupuestoService::getAltoTotalExteriores($uso, $tipo_impresion_id, $datosPedido);
}
$opciones_papel = PresupuestoService::get_opciones_papel($uso, $isColor);
// Se obtienen los papeles disponibles
$papelimpresionmodel = new PapelImpresionModel();
$papeles = $papelimpresionmodel->getIdPapelesImpresionForPresupuesto(
papel_generico_id: $papel_generico['id'],
gramaje: $gramaje,
options: $opciones_papel
);
$lineas = array();
// Para cada papel, se obtienen las maquinas disponibles
foreach ($papeles as $papel) {
$maquinamodel = new MaquinaModel();
$maquinas = $maquinamodel->getMaquinaImpresionForPresupuesto(
is_rotativa: 0,
tarifa_tipo: $tipo,
uso_tarifa: ($uso == 'guardas') ? 'interior' : $uso,
tirada: $datosPedido->tirada + $datosPedido->merma,
papel_impresion_id: $papel->id,
);
// Se recorren las máquinas y se calcula el coste de linea por cada una
foreach ($maquinas as $maquina) {
$data['uso'] = $uso;
$data['tipo'] = $tipo;
$data['datosPedido'] = $datosPedido;
$data['cliente_id'] = $cliente_id;
$data['papel'] = $papel;
$data['opciones_papel'] = $opciones_papel;
$data['maquina'] = $maquina;
$data['papel_generico'] = $papel_generico;
$data['isColor'] = $isColor;
$data['a_favor_fibra'] = $a_favor_fibra;
$data['datosTipolog'] = $datosTipolog;
$data['gramaje'] = $gramaje;
$linea = PresupuestoService::getLineaPresupuestoPlana($data);
if(empty($linea))
continue;
array_push($lineas, $linea);
}
}
return $lineas;
}
// Funcion que comprueba si existe una maquina
private static function checkMaquina($maquina_id){
$maquina = (new MaquinaModel())->find($maquina_id);
if (!$maquina) {
return false;
}
return true;
}
// Funcion que comprueba si existe un papel de impresion
private static function checkPapelImpresion($papel_impresion_id){
$papel = (new PapelImpresionModel())->find($papel_impresion_id);
if (!$papel) {
return false;
}
return true;
}
/**
* Devuelve la dimensión del lomo interior.
*/

View File

@ -27,7 +27,7 @@ function asyncMessageDialog(title, msg, callback) {
$("#labelMsgMessageDialog").html(msg);
$("#okButton").off('click').click(function () {
callback();
$confirmDialog.modal("hide");
$messageDialog.modal("hide");
});
}

View File

@ -51,6 +51,7 @@
<th><?= lang('MaquinasTarifasImpresions.tipo') ?></th>
<th><?= lang('MaquinasTarifasImpresions.precio') ?></th>
<th><?= lang('MaquinasTarifasImpresions.margen') ?></th>
<th>is_deleted</th>
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
</tr>
</thead>
@ -489,6 +490,7 @@
},
{ 'data': 'precio' },
{ 'data': 'margen' },
{ 'data': 'is_deleted',},
{
data: actionBtns,
className: 'row-edit dt-center'
@ -496,6 +498,10 @@
],
columnDefs: [
{
target: 4,
visible: false
},
{
orderable: false,
searchable: false,

View File

@ -390,11 +390,11 @@ function get_datos_acabado(){
values['tarifa_id'] = $(this).text()
break
case 1:
if($(this).text().includes(' '+ window.Presupuestos.cubierta))
if($(this).text().includes(window.Presupuestos.cubierta))
values['cubierta'] = 1
else
values['cubierta'] = 0
if($(this).text().includes(' '+ window.Presupuestos.sobrecubierta))
if($(this).text().includes(window.Presupuestos.sobrecubierta))
values['sobrecubierta'] = 1
else
values['sobrecubierta'] = 0
@ -527,6 +527,8 @@ function init_servicio_encuadernado(){
data: function (params) {
const dimension = getDimensionLibro();
if(parseInt($('#tirada').val())>0){
var tirada = parseInt($('#tirada').val())
}
@ -538,8 +540,8 @@ function init_servicio_encuadernado(){
tarifa_id: tarifa_id,
paginas: parseInt($('#paginas').val())>0?parseInt($('#paginas').val()):0,
tirada: tirada,
ancho: ancho_libro,
alto: alto_libro,
ancho: dimension.ancho,
alto: dimension.alto,
searchtxt: params.term, // search term
};
return_data = Object.assign(return_data, window.token_ajax);
@ -1509,4 +1511,24 @@ async function actualizar_servicios(update_preimpresion=false){
)
)
}
function popAlert(message, alertClass, alertIcon, containerId = 'sk-alert'){
var htmlString = `
<div class="alert ${alertClass} d-flex align-items-baseline" role="alert">
<span class="alert-icon alert-icon-lg text-primary me-2">
<i class="ti ${alertIcon} ti-sm"></i>
</span>
<div class="d-flex flex-column ps-1">
<h5 class="alert-heading mb-2">${message}</h5>
</div>
</div>`;
if(containerId == 'sk-alert'){
$(window).scrollTop(0);
}
$('#' + containerId).hide().empty().html(htmlString).fadeIn("slow", function(){
setTimeout(function(){
$('#' + containerId).fadeOut("slow");
}, 5000);
});
}

View File

@ -245,7 +245,7 @@
window.routes_servicios = {
dataTableOfPresupuestoAcabados: "<?=route_to('dataTableOfPresupuestoAcabados') ?>",
dataTableOfPresupuestoPreimpresion: "<?=route_to('dataTableOfPresupuestoPreimpresion') ?>",
dataTableOfPresupuestoPreimpresion: "<?=route_to('dataTableOfPresupuestoPreimpresiones') ?>",
dataTableOfPresupuestoEncuadernaciones: "<?=route_to('dataTableOfPresupuestoEncuadernaciones') ?>",
dataTableOfPresupuestoManipulados: "<?=route_to('dataTableOfPresupuestoManipulados') ?>",
menuItemsOfPresupuestoEncuadernaciones: '<?= route_to("menuItemsOfPresupuestoEncuadernaciones") ?>',

View File

@ -2977,7 +2977,7 @@ function clear_lp_rot_bn(clear_selectors){
$(".lp-rot-bn-input" ).val("0")
$("#lp_rot_bn_paginas" ).val(pags)
if(clear_selectors)
$( ".lp-rotbn-select").empty()
$( ".lp-rot-bn-select").empty()
}
@ -3324,7 +3324,7 @@ function clear_lp_rot_color(clear_selectors){
$(".lp-rot-color-input" ).val("0")
$("#lp_rot_color_paginas" ).val(pags)
if(clear_selectors)
$( ".lp-rotcolor-select").empty()
$( ".lp-rot-color-select").empty()
}
@ -4001,7 +4001,7 @@ async function calcularPresupuesto_sobrecubierta(fromComparador=false, input_dat
merma: parseInt($('#mermacubierta').val()),
ancho: dimension.ancho,
alto: dimension.alto,
lomo: getLomoLineasPresupuesto() + getLomoCubiertaLineasPresupuesto,
lomo: getLomoLineasPresupuesto() + getLomoCubiertaLineasPresupuesto(),
papel_generico_id: input_data.papel_generico_id,
papel_generico: input_data.papel_generico,
gramaje: input_data.gramaje,
@ -4137,6 +4137,7 @@ function getLomoLineasPresupuesto(){
catch(error){
lomoTotal = 0
}
$('#lomo_cubierta').val(lomoTotal)
return lomoTotal
}
@ -4152,6 +4153,7 @@ function getLomoCubiertaLineasPresupuesto(){
catch(error){
lomoTotal = 0
}
$('#lomo_sobrecubierta').val(lomoTotal+parseFloat($('#lomo_cubierta').val()))
return lomoTotal
}

View File

@ -59,19 +59,24 @@ function updateTotales(updateLP=true, updateServicios=true, updateEnvio=true){
var porcentajeMargenPapel = isNaN(margenPapel/(totalPapel)*100.0)?0:margenPapel/(totalPapel)*100.0
$('#porcentajeMargenPapel').text(porcentajeMargenPapel.toFixed(0) + '%')
$('#totalCostePapel').text(totalPapel.toFixed(2)+ '€')
$('#margenPapel').text(margenPapel.toFixed(2) + '€')
$('#totalCostePapel').text((addSeparatorsNF(totalPapel.toFixed(2), ".", ",", ".")) + "€")
$('#margenPapel').text((addSeparatorsNF(margenPapel.toFixed(2), ".", ",", ".")) + "€")
$('#totalCostePapel').attr('val',totalPapel.toFixed(2))
$('#margenPapel').attr('val',margenPapel.toFixed(2))
var porcentajeMargenImpresion = isNaN(margenImpresion/(totalImpresion)*100.0)?0:margenImpresion/(totalImpresion)*100.0
$('#porcentajeMargenImpresion').text(porcentajeMargenImpresion.toFixed(0) + '%')
$('#totalCosteImpresion').text(totalImpresion.toFixed(2) + '€')
$('#margenImpresion').text(margenImpresion.toFixed(2) + '€')
$('#totalCosteImpresion').text((addSeparatorsNF(totalImpresion.toFixed(2), ".", ",", ".")) + "€")
$('#margenImpresion').text((addSeparatorsNF(margenImpresion.toFixed(2), ".", ",", ".")) + "€")
$('#totalCosteImpresion').attr('val',totalImpresion.toFixed(2))
$('#margenImpresion').attr('val',margenImpresion.toFixed(2))
}
else{
totalPapel = parseFloat($('#totalCostePapel').text().replace('€', ''))
margenPapel = parseFloat($('#margenPapel').text().replace('€', ''))
totalImpresion = parseFloat($('#totalCosteImpresion').text().replace('€', ''))
margenImpresion = parseFloat($('#margenImpresion').text().replace('€', ''))
totalPapel = parseFloat($('#totalCostePapel').attr('val'))
margenPapel = parseFloat($('#margenPapel').attr('val'))
totalImpresion = parseFloat($('#totalCosteImpresion').attr('val'))
margenImpresion = parseFloat($('#margenImpresion').attr('val'))
}
sumForFactorPonderado = sumForFactor;
@ -126,14 +131,16 @@ function updateTotales(updateLP=true, updateServicios=true, updateEnvio=true){
var porcentajeMargenServicios = margenServicios/(margenServicios+totalServicios)*100
$('#porcentajeMargenServicios').text(isNaN(porcentajeMargenServicios.toFixed(0))?0:porcentajeMargenServicios.toFixed(0) + '%')
$('#totalServicios').text(totalServicios.toFixed(2) + '€')
$('#margenServicios').text(margenServicios.toFixed(2) + '€')
$('#totalServicios').text((addSeparatorsNF(totalServicios.toFixed(2), ".", ",", ".")) + "€")
$('#margenServicios').text((addSeparatorsNF(margenServicios.toFixed(2), ".", ",", ".")) + "€")
$('#totalServicios').attr('val',totalServicios.toFixed(2) + '€')
$('#margenServicios').attr('val',margenServicios.toFixed(2) + '€')
}
else{
totalServicios = parseFloat($('#totalServicios').text().replace('€', ''))
margenServicios = parseFloat($('#margenServicios').text().replace('€', ''))
totalServicios = parseFloat($('#totalServicios').attr('val'))
margenServicios = parseFloat($('#margenServicios').attr('val'))
sumForFactorPonderado += totalServicios;
}
@ -149,18 +156,22 @@ function updateTotales(updateLP=true, updateServicios=true, updateEnvio=true){
}
totalEnvios -= margenEnvios
$('#totalEnvios').text(totalEnvios.toFixed(2) + '€')
$('#margenEnvios').text(margenEnvios.toFixed(2) + '€')
$('#totalEnvios').text((addSeparatorsNF(totalEnvios.toFixed(2), ".", ",", ".")) + "€")
$('#margenEnvios').text((addSeparatorsNF(margenEnvios.toFixed(2), ".", ",", ".")) + "€")
$('#totalEnvios').attr('val',totalEnvios.toFixed(2) + '€')
$('#margenEnvios').attr('val',margenEnvios.toFixed(2) + '€')
}
else{
totalEnvios = parseFloat($('#totalEnvios').text().replace('€', ''))
margenEnvios = parseFloat($('#margenEnvios').text().replace('€', ''))
totalEnvios = parseFloat($('#totalEnvios').attr('val'))
margenEnvios = parseFloat($('#margenEnvios').attr('val'))
}
var totalCostes = totalPapel + totalImpresion + totalServicios + totalEnvios
var totalMargenes = margenPapel + margenImpresion + margenServicios + margenEnvios
$('#totalCostes').text((totalCostes).toFixed(2) + '€')
$('#totalMargenes').text((totalMargenes).toFixed(2) + '€')
$('#totalCostes').text((addSeparatorsNF(totalCostes.toFixed(2), ".", ",", ".")) + "€")
$('#totalMargenes').text((addSeparatorsNF(totalMargenes.toFixed(2), ".", ",", ".")) + "€")
$('#totalCostes').attr('val',(totalCostes).toFixed(2) + '€')
$('#totalMargenes').attr('val',(totalMargenes).toFixed(2) + '€')
if($('#total_descuentoPercent').val()<0){
$('#total_descuentoPercent').val(0)
@ -170,40 +181,64 @@ function updateTotales(updateLP=true, updateServicios=true, updateEnvio=true){
var totalPresupuesto = totalAntesDescuento - totalDescuento
var precioUnidad = totalPresupuesto/parseInt($('#tirada').val())
$('#totalAntesDescuento').text((totalAntesDescuento).toFixed(2) + '€')
$('#descuentoTotal').text((totalDescuento).toFixed(2) + '€')
$('#totalDespuesDecuento').text((totalPresupuesto).toFixed(2) + '€')
$('#precioUnidadPresupuesto').text((precioUnidad).toFixed(2) + '€')
$('#totalAntesDescuento').text((addSeparatorsNF(totalAntesDescuento.toFixed(2), ".", ",", ".")) + "€")
$('#descuentoTotal').text((addSeparatorsNF(totalDescuento.toFixed(2), ".", ",", ".")) + "€")
$('#totalDespuesDecuento').text((addSeparatorsNF(totalPresupuesto.toFixed(2), ".", ",", ".")) + "€")
$('#precioUnidadPresupuesto').text((addSeparatorsNF(precioUnidad.toFixed(4), ".", ",", ".")) + "€")
$('#totalAntesDescuento').attr('val',(totalAntesDescuento).toFixed(2))
$('#descuentoTotal').attr('val',(totalDescuento).toFixed(2))
$('#totalDespuesDecuento').attr('val',(totalPresupuesto).toFixed(2))
$('#precioUnidadPresupuesto').attr('val',(precioUnidad).toFixed(4))
$('#factor').text(((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactor).toFixed(2))
$('#factor_ponderado').text(((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactorPonderado).toFixed(2))
$('#factor').text(addSeparatorsNF(((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactor).toFixed(2), ".", ",", "."))
$('#factor').attr('val', ((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactor).toFixed(2))
$('#factor_ponderado').text(addSeparatorsNF(((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactorPonderado).toFixed(2), ".", ",", "."))
$('#factor_ponderado').attr('val',((totalPresupuesto-totalEnvios-margenEnvios)/sumForFactorPonderado).toFixed(2))
}
function addSeparatorsNF(nStr, inD, outD, sep)
{
nStr += '';
var dpos = nStr.indexOf(inD);
var nStrEnd = '';
if (dpos != -1) {
nStrEnd = outD + nStr.substring(dpos + 1, nStr.length);
nStr = nStr.substring(0, dpos);
}
var rgx = /(\d+)(\d{3})/;
while (rgx.test(nStr)) {
nStr = nStr.replace(rgx, '$1' + sep + '$2');
}
return nStr + nStrEnd;
}
function getValuesResumenForm(){
var formResumen = ""
formResumen += '&total_coste_papel=' + $('#totalCostePapel').text().replace('€', '')
formResumen += '&total_margen_papel=' + $('#margenPapel').text().replace('€', '')
formResumen += '&total_coste_papel=' + $('#totalCostePapel').attr('val')
formResumen += '&total_margen_papel=' + $('#margenPapel').attr('val')
formResumen += '&total_margenPercent_papel=' + $('#porcentajeMargenPapel').text().replace('%', '')
formResumen += '&total_coste_impresion=' + $('#totalCosteImpresion').text().replace('€', '')
formResumen += '&total_margen_impresion=' + $('#margenImpresion').text().replace('€', '')
formResumen += '&total_coste_impresion=' + $('#totalCosteImpresion').attr('val')
formResumen += '&total_margen_impresion=' + $('#margenImpresion').attr('val')
formResumen += '&total_margenPercent_impresion=' + $('#porcentajeMargenImpresion').text().replace('%', '')
formResumen += '&total_coste_servicios=' + $('#totalServicios').text().replace('€', '')
formResumen += '&total_margen_servicios=' + $('#margenServicios').text().replace('€', '')
formResumen += '&total_coste_servicios=' + $('#totalServicios').attr('val')
formResumen += '&total_margen_servicios=' + $('#margenServicios').attr('val')
formResumen += '&total_margenPercent_servicios=' + $('#porcentajeMargenServicios').text().replace('%', '')
formResumen += '&total_coste_envios=' + $('#totalEnvios').text().replace('€', '')
formResumen += '&total_margen_envios=' + $('#margenEnvios').text().replace('€', '')
formResumen += '&total_coste_envios=' + $('#totalEnvios').attr('val')
formResumen += '&total_margen_envios=' + $('#margenEnvios').attr('val')
formResumen += '&total_costes=' + $('#totalCostes').text().replace('€', '')
formResumen += '&total_margenes=' + $('#totalMargenes').text().replace('€', '')
formResumen += '&total_costes=' + $('#totalCostes').attr('val')
formResumen += '&total_margenes=' + $('#totalMargenes').attr('val')
formResumen += '&total_antes_descuento=' + $('#totalAntesDescuento').text().replace('€', '')
formResumen += '&total_descuento=' + $('#descuentoTotal').text().replace('€', '')
formResumen += '&total_antes_descuento=' + $('#totalAntesDescuento').attr('val')
formResumen += '&total_descuento=' + $('#descuentoTotal').attr('val')
formResumen += '&total_descuentoPercent=' + $('#total_descuentoPercent').val()
formResumen += '&total_presupuesto=' + $('#totalDespuesDecuento').text().replace('€', '')
formResumen += '&total_precio_unidad=' + $('#precioUnidadPresupuesto').text().replace('€', '')
formResumen += '&total_presupuesto=' + $('#totalDespuesDecuento').attr('val')
formResumen += '&total_precio_unidad=' + $('#precioUnidadPresupuesto').attr('val')
formResumen += '&total_factor=' + $('#total_factor').text()
formResumen += '&total_factor_ponderado=' + $('#total_factor_ponderado').text()

View File

@ -157,7 +157,7 @@ async function add_tirada_alternativa(tirada_alt) {
coste_envio: coste_envio.toFixed(2),
margen: ((margen_total + margen_servicios + margen_envio)/(coste_total+coste_envio)*100.0).toFixed(2),
total_pedido: (coste_total + costes_servicios + coste_envio).toFixed(2),
precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(2),
precio_unidad: ((coste_total + costes_servicios + coste_envio) / datos.tirada).toFixed(4),
}).draw(false);
}

View File

@ -17,6 +17,10 @@
value="<?= $presupuestoEntity->id ?>"></input>
<input type="hidden" name="tipo_impresion_id" id="tipo_impresion_id" class="form-control"
value="<?= $tipo_impresion_id ?>"></input>
<input type="hidden" name="lomo_cubierta" id="lomo_cubierta" class="form-control"
value="<?= is_null($presupuestoEntity->lomo_cubierta)?0:$presupuestoEntity->lomo_cubierta ?>"></input>
<input type="hidden" name="lomo_sobrecubierta" id="lomo_sobrecubierta" class="form-control"
value="<?= is_null($presupuestoEntity->lomo_sobrecubierta)?0:$presupuestoEntity->lomo_sobrecubierta ?>"></input>
<input type="hidden" name="isCosido" id="isCosido" class="form-control"
value="<?= $isCosido ?>"></input>
<input type="hidden" name="POD" id="POD" class="form-control"
@ -81,6 +85,13 @@
})
if(gotaNegro){
const domain = window.location.origin
const url = window.location.href;
const url_parts = url.split('/');
var id = -1;
if(url_parts[url_parts.length-2] == 'edit'){
id = url_parts[url_parts.length-1];
}
asyncMessageDialog('<?= lang("Basic.global.Warning") ?>', '<?= lang("Presupuestos.duplicarConTipologias") ?>', function() {
$.ajax({
type: 'post',
@ -291,9 +302,36 @@
<?php endif; ?>
<?php if (str_contains($formAction, 'edit')): ?>
<?= $this->section("additionalInlineJs") ?>
if(<?php echo $presupuestoEntity->is_duplicado?'true':'false'; ?>){
asyncMessageDialog(
'<?= lang("Basic.global.Warning") ?>',
'<?= lang("Presupuestos.presupuestoDuplicadoActualizacion") ?>',
function(){});
}
else if(<?php echo ($presupuestoEntity->cambios_lineas? 'true':'false'); ?> ||
<?php echo ($presupuestoEntity->cambios_servicios? 'true':'false'); ?> ||
<?php echo ($presupuestoEntity->cambios_envios ? 'true':'false'); ?>){
let text = '<?= lang("Presupuestos.actualizacionPrecios") ?>';
if(<?php echo ($presupuestoEntity->cambios_lineas ? 'true':'false'); ?>){
text += '<?= lang("Presupuestos.actualizacionPreciosLP") ?>';
}
else if (<?php echo ($presupuestoEntity->cambios_servicios ? 'true':'false'); ?>){
text += '<?= lang("Presupuestos.actualizacionPreciosServicios") ?>';
}
else if (<?php echo ($presupuestoEntity->cambios_envios ? 'true':'false'); ?>){
text += '<?= lang("Presupuestos.actualizacionPreciosEnvios") ?>';
}
asyncMessageDialog(
'<?= lang("Basic.global.Warning") ?>',
text,
function(){});
}
<?= $this->endSection() ?>
<?php endif; ?>
<!------------------------------------------->
<!-- Variables generales usadas en los ficheros js -->