Files
safekat/ci4/app/Models/Presupuestos/PresupuestoModel.php

534 lines
21 KiB
PHP
Executable File

<?php
namespace App\Models\Presupuestos;
use App\Models\Configuracion\TipoPresupuestoModel;
class PresupuestoModel extends \App\Models\BaseModel
{
protected $table = "presupuestos";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
const SORTABLE = [
0 => "t1.id",
1 => "t1.created_at",
2 => "t2.nombre",
3 => "t3.first_name",
4 => "t1.titulo",
5 => "t5.nombre",
6 => "t1.inc_rei",
7 => "t1.paginas",
8 => "t1.tirada",
9 => "t1.total_presupuesto",
10 => "t6.estado",
];
const SORTABLE_CLIENTE = [
0 => "t1.id",
1 => "t1.created_at",
2 => "t7.codigo",
3 => "t2.nombre",
4 => "t3.first_name",
5 => "t1.titulo",
6 => "t5.nombre",
8 => "t1.paginas",
9 => "t1.tirada",
10 => "t1.total_presupuesto",
11 => "t6.estado",
];
protected $allowedFields = [
"cliente_id",
"user_created_id",
"user_update_id",
"tipo_impresion_id",
"tipologia_id",
"pais_id",
"estado_id",
"inc_rei",
"causa_cancelacion",
"retractilado",
"retractilado5",
"guardas",
"faja_color",
"recoger_en_taller",
"ferro",
"ferro_digital",
"marcapaginas",
"prototipo",
"papel_formato_id",
"papel_formato_personalizado",
"papel_formato_ancho",
"papel_formato_alto",
"titulo",
"autor",
"coleccion",
"numero_edicion",
"isbn",
"referencia_cliente",
"paginas",
"tirada",
"solapas",
"solapas_ancho",
"solapas_sobrecubierta",
"solapas_ancho_sobrecubierta",
"cosido",
"sobrecubiertas",
"sobrecubiertas_ancho",
"merma",
"merma_cubierta",
"comentarios_cliente",
"comentarios_safekat",
"comentarios_pdf",
"comentarios_tarifa",
"comentarios_produccion",
"lomo_cubierta",
"lomo_sobrecubierta",
"total_presupuesto",
"envios_recoge_cliente",
"tirada_alternativa_json_data",
"aprobado_user_id",
"aprobado_at",
"comparador_json_data",
"is_deleted",
"comp_tipo_impresion",
"comp_pos_paginas_color",
"total_coste_papel",
"total_margen_papel",
"total_margenPercent_papel",
"total_coste_impresion",
"total_margen_impresion",
"total_margenPercent_impresion",
"total_coste_servicios",
"total_margen_servicios",
"total_margenPercent_servicios",
"total_coste_envios",
"total_margen_envios",
"total_costes",
"total_margenes",
"total_antes_descuento",
"total_descuento",
"total_descuentoPercent",
"total_presupuesto",
"total_precio_unidad",
"total_factor",
"total_factor_ponderado",
'total_aceptado',
'iva_reducido',
"acabado_cubierta_id",
"acabado_sobrecubierta_id",
"is_duplicado"
];
protected $returnType = "App\Entities\Presupuestos\PresupuestoEntity";
protected $useTimestamps = true;
protected $useSoftDeletes = false;
protected $createdField = "created_at";
protected $updatedField = "updated_at";
public static $labelField = "titulo";
protected $validationRulesAdd = [
"autor" => [
"label" => "Presupuestos.autor",
"rules" => "trim|max_length[150]",
],
"titulo" => [
"label" => "Presupuestos.titulo",
"rules" => "trim|required|max_length[30]",
],
"inc_rei" => [
"label" => "Presupuestos.incRei",
"rules" => "integer|permit_empty",
],
"coleccion" => [
"label" => "Presupuestos.incRei",
"rules" => "trim|max_length[255]",
],
"numero_edicion" => [
"label" => "Presupuestos.numeroEdicion",
"rules" => "trim|max_length[50]",
],
"isbn" => [
"label" => "Presupuestos.isbn",
"rules" => "trim|max_length[50]",
],
"pais_id" => [
"label" => "Presupuestos.paisId",
"rules" => "required|integer|greater_than[0]",
],
"cliente_id" => [
"label" => "Presupuestos.clienteId",
"rules" => "required|integer|greater_than[0]",
],
"referencia_cliente" => [
"label" => "Presupuestos.referenciaCliente",
"rules" => "trim|max_length[100]",
],
];
protected $validationMessagesAdd = [
"autor" => [
"max_length" => "Presupuestos.validation.max_length",
"required" => "Presupuestos.validation.requerido",
],
"titulo" => [
"max_length" => "Presupuestos.validation.max_length",
"required" => "Presupuestos.validation.requerido",
],
"inc_rei" => [
"integer" => "Presupuestos.validation.integer",
],
"coleccion" => [
"max_length" => "Presupuestos.validation.max_length",
],
"numero_edicion" => [
"max_length" => "Presupuestos.validation.max_length",
],
"isbn" => [
"max_length" => "Presupuestos.validation.max_length",
],
"pais_id" => [
"required" => "Presupuestos.validation.requerido",
],
"cliente_id" => [
"required" => "Presupuestos.validation.requerido",
],
"referencia_cliente" => [
"max_length" => "Presupuestos.validation.max_length",
],
];
public function findAllWithAllRelations(string $selcols = "*", int $limit = null, int $offset = 0)
{
$sql =
"SELECT t1." .
$selcols .
", t2.nombre AS cliente, t3.nombre AS forma_pago, t4.nombre AS tipo_impresion, t5.nombre AS tipologia, t6.nombre AS pais, t7.estado AS estado, t8.id AS papel_formato, t9.first_name AS total_confirmado_user, t10.first_name AS aprobado_user FROM " .
$this->table .
" t1 LEFT JOIN clientes
t2 ON t1.cliente_id = t2.id LEFT JOIN lg_formas_pago
t3 ON t1.forma_pago_id = t3.id LEFT JOIN lg_tipos_impresion
t4 ON t1.tipo_impresion_id = t4.id LEFT JOIN lg_tipologias_libros
t5 ON t1.tipologia_id = t5.id LEFT JOIN lg_paises
t6 ON t1.pais_id = t6.id = t7.id LEFT JOIN presupuesto_estados
t7 ON t1.estado_id = t8.id LEFT JOIN lg_papel_formato
t8 ON t1.papel_formato_id = t9.id LEFT JOIN lg_papel_generico
t9 ON t1.total_confirmado_user_id = t26.id LEFT JOIN users
t10 ON t1.aprobado_user_id = t27.id LEFT JOIN users";
if (!is_null($limit) && intval($limit) > 0) {
$sql .= " LIMIT " . intval($limit);
}
if (!is_null($offset) && intval($offset) > 0) {
$sql .= " OFFSET " . intval($offset);
}
$query = $this->db->query($sql);
$result = $query->getResultObject();
return $result;
}
/**
* Get resource data.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResource($search = [], $tipo_impresion_id = 4)
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.created_at AS fecha, t2.nombre AS cliente,
CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t1.titulo AS titulo,
t5.nombre AS pais, t1.inc_rei AS inc_rei, t1.paginas AS paginas, t1.tirada AS tirada,
t1.total_presupuesto AS total_presupuesto, t1.total_presupuesto AS total_presupuesto, t6.estado AS estado"
);
$builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
$builder->join("users t3", "t1.user_update_id = t3.id", "left");
$builder->join("lg_paises t5", "t1.pais_id = t5.id", "left");
$builder->join("presupuesto_estados t6", "t1.estado_id = t6.id", "left");
$builder->where("t1.is_deleted", 0);
$builder->where("t1.tipo_impresion_id", $tipo_impresion_id);
if (empty($search))
return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
if ($col_search[0] != 1)
$builder->like(self::SORTABLE[$col_search[0]], $col_search[2]);
else {
$dates = explode(" ", $col_search[2]);
$builder->where(self::SORTABLE[$col_search[0]] . ">=", $dates[0]);
$builder->where(self::SORTABLE[$col_search[0]] . "<=", $dates[1]);
}
}
$builder->groupEnd();
return $builder;
}
}
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.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResourceForPdf($presupuesto_id = -1)
{
$builder = $this->db
->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.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,
t1.papel_formato_personalizado AS isPersonalizado, t1.envios_recoge_cliente AS recoge_cliente,
CONCAT(t1.papel_formato_ancho, 'x', t1.papel_formato_alto) AS formatoPersonalizado,
t2.nombre AS cliente,
CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t3.email AS email_comercial,
CONCAT(t4.ancho, 'x', t4.alto) AS formato"
);
$builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
$builder->join("users t3", "t1.user_update_id = t3.id", "left");
$builder->join("lg_papel_formato t4", "t1.papel_formato_id = t4.id", "left");
$builder->where("t1.is_deleted", 0);
$builder->where("t1.id", $presupuesto_id);
return $builder;
}
function getListaPresupuestosCliente($search = [] , $clienteId){
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.created_at AS fecha, t7.codigo as codigo, t2.nombre AS cliente,
CONCAT(t3.first_name, ' ', t3.last_name) AS comercial, t1.titulo AS titulo,
t5.nombre AS pais, t1.inc_rei AS inc_rei, t1.paginas AS paginas, t1.tirada AS tirada,
t1.total_presupuesto AS total_presupuesto, t1.total_presupuesto AS total_presupuesto,
t6.estado AS estado"
);
$builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
$builder->join("users t3", "t1.user_update_id = t3.id", "left");
$builder->join("lg_paises t5", "t1.pais_id = t5.id", "left");
$builder->join("presupuesto_estados t6", "t1.estado_id = t6.id", "left");
$builder->join("tipos_presupuestos t7", "t1.tipo_impresion_id = t7.id", "left");
if($clienteId != 0)
$builder->where("t1.cliente_id", $clienteId);
$builder->where("t1.is_deleted", 0);
if (empty($search))
return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
if ($col_search[0] != 1)
$builder->like(self::SORTABLE_CLIENTE[$col_search[0]], $col_search[2]);
else {
$dates = explode(" ", $col_search[2]);
$builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . ">=", $dates[0]);
$builder->where(self::SORTABLE_CLIENTE[$col_search[0]] . "<=", $dates[1]);
}
}
$builder->groupEnd();
return $builder;
}
}
function confirmarPresupuesto($presupuesto_id)
{
$this->db
->table($this->table . " t1")
->where('t1.id', $presupuesto_id)
->set('t1.estado', 2)
->update();
}
function insertarPresupuestoCliente($tirada, $data, $data_cabecera, $extra_info, $resumen_totales, $iva_reducido, $excluir_rotativa, $tiradas_alternativas)
{
helper('date');
$model = model('App\Models\Configuracion\PapelFormatoModel');
$papel_formato_id = $model->where('ancho', $data['tamanio']['ancho'])->where('alto', $data['tamanio']['alto'])->first();
$is_cosido = (new TipoPresupuestoModel())->get_isCosido($data['tipo_impresion_id']);
$totalCostes = $resumen_totales['totalPapel'] + $resumen_totales['totalImpresion'] +
$resumen_totales['totalServicios']+$resumen_totales['coste_envio'];
$totalMargenes = $resumen_totales['margenPapel'] + $resumen_totales['margenImpresion'] +
$resumen_totales['margenServicios'] + $resumen_totales['margen_envio'];
$fields = [
'cliente_id' => $data['clienteId'],
'tipo_impresion_id' => $data['tipo_impresion_id'],
'pais_id' => 1,
'retractilado' => in_array(3, $data['servicios']) ? 1 : 0,
'retractilado5' => in_array(5, $data['servicios']) ? 1 : 0,
'guardas' => in_array(62, $data['servicios']) ? 1 : 0,
'faja_color' => in_array(16, $data['servicios']) ? 1 : 0,
'ferro' => in_array(24, $data['servicios']) ? 1 : 0,
'prototipo' => in_array(9, $data['servicios']) ? 1 : 0,
'papel_formato_id' => is_null($papel_formato_id) ? 0: $papel_formato_id->id,
'papel_formato_personalizado' => !$papel_formato_id ? 1:0,
'papel_formato_ancho' => !$papel_formato_id ? $data['tamanio']['ancho']:null,
'papel_formato_alto' => !$papel_formato_id ? $data['tamanio']['alto']:null,
'titulo' => $data_cabecera['titulo'],
'referencia_cliente' => $data_cabecera['referenciaCliente'],
'paginas' => $data['interior']['paginas'],
'tirada' => $tirada,
'solapas' => $data['cubierta']['solapasCubierta']>0 ? 1 : 0,
'solapas_ancho' => $data['cubierta']['solapasCubierta']>0 ? $data['cubierta']['solapasCubierta'] : 0,
'solapas_sobrecubierta' => is_null($data['sobrecubierta']) ? 0 :1,
'solapas_ancho_sobrecubierta' => is_null($data['sobrecubierta']) ? 0 : $data['sobrecubierta']['solapas'],
'cosido' => $is_cosido,
'merma' => $extra_info['merma'],
'merma_cubierta' => $extra_info['merma'],
'lomo_cubierta' => $extra_info['lomo_cubierta'],
'lomo_sobrecubierta' => $extra_info['lomo_sobrecubierta'],
'comparador_json_data' => $this->generateJson($data),
'acabado_cubierta_id' => $data['acabadoCubierta'],
'acabado_sobrecubierta_id' => is_null($data['sobrecubierta']) ? 0 : $data['sobrecubierta']['acabado'],
'comp_tipo_impresion' => $data['isHq']? ($data['isColor']? 'colorhq':'negrohq'):($data['isColor']? 'color':'negro'),
'user_created_id' => $extra_info['user_id'],
'created_at' => date('Y-m-d H:i:s', now()),
'updated_at' => date('Y-m-d H:i:s', now()),
'tirada_alternativa_json_data' => json_encode($tiradas_alternativas),
'total_coste_papel' => round($resumen_totales['totalPapel'], 2),
'total_margen_papel' => round($resumen_totales['margenPapel'], 2),
'total_margenPercent_papel' => round($resumen_totales['porcentajeMargenPapel'], 0),
'total_coste_impresion' => round($resumen_totales['totalImpresion'], 2),
'total_margen_impresion' => round($resumen_totales['margenImpresion'], 2),
'total_margenPercent_impresion' => round($resumen_totales['porcentajeMargenImpresion'], 0),
'total_coste_servicios' => round($resumen_totales['totalServicios'], 2),
'total_margen_servicios' => round($resumen_totales['margenServicios'], 2),
'total_margenPercent_servicios' => round($resumen_totales['porcentajeMargenServicios'], 2),
'total_coste_envios' => round($resumen_totales['coste_envio'], 2),
'total_margen_envios' => round($resumen_totales['margen_envio'], 2),
'total_costes' => round($totalCostes, 2),
'total_margenes' => round($totalMargenes, 2),
'total_antes_descuento' => round($totalCostes + $totalMargenes, 2),
'total_descuento' => 0,
'total_descuentoPercent' => 0,
'total_precio_unidad' => round(($totalCostes + $totalMargenes)/$tirada, 4),
'total_presupuesto' => round($totalCostes + $totalMargenes, 2),
'total_aceptado' => round($totalCostes + $totalMargenes, 2),
'total_factor' => round(($totalCostes + $totalMargenes-$resumen_totales['coste_envio']-$resumen_totales['margen_envio'])/$resumen_totales['sumForFactor'], 2),
'total_factor_ponderado' => round(($totalCostes + $totalMargenes-$resumen_totales['coste_envio']-$resumen_totales['margen_envio'])/$resumen_totales['sumForFactorPonderado'], 2),
'iva_reducido' => $iva_reducido,
'excluir_rotativa' => $excluir_rotativa,
];
$this->db->table($this->table)->insert($fields);
return $this->db->insertID();
}
private function generateJson($data)
{
$values = array();
if (is_array($data)) {
// -- INTERIOR --
// Si hay negro
if($data['interior']['paginas'] > $data['interior']['paginas_color']){
if($data['isHq'])
$key = 'bnhq';
else
$key = 'bn';
$values[$key] = array(
'paginas'=> intval($data['interior']['paginas'])-intval($data['interior']['paginas_color']),
'papel_id' => intval($data['interior']['papel_generico']['id']),
'gramaje' => intval($data['interior']['gramaje']),
);
}
// Si hay color
if($data['interior']['paginas_color']>0){
if($data['isHq'])
$key = 'colorhq';
else
$key = 'color';
$values[$key] = array(
'paginas'=> intval($data['interior']['paginas_color']),
'papel_id' => intval($data['interior']['papel_generico']['id']),
'gramaje' => intval($data['interior']['gramaje']),
);
}
// -- CUBIERTA --
$values['cubierta'] = array(
'papel_id' => intval($data['cubierta']['papel_generico_cubierta']['id']),
'gramaje' => intval($data['cubierta']['gramajeCubierta']),
'paginas' => intval($data['cubierta']['carasCubierta']),
);
// -- SOBRECUBIERTA --
if(!is_null($data['sobrecubierta'])){
$values['sobrecubierta'] = array(
'papel_id' => intval($data['sobrecubierta']['papel']),
'gramaje' => intval($data['sobrecubierta']['gramaje']),
'imprimir' => 1,
);
}
// -- GUARDAS --
if($data['datos_guardas'] != 0){
$values['guardas'] = array(
'papel_id' => intval($data['datos_guardas']['papel']),
'gramaje' => intval($data['datos_guardas']['gramaje']),
'paginas' => intval($data['datos_guardas']['caras']),
);
}
}
$json = json_encode($values);
return $json;
}
}