Merge branch 'main' into feat/view-maquinista

This commit is contained in:
amazuecos
2025-04-22 10:34:06 +02:00
41 changed files with 4024 additions and 1586 deletions

View File

@ -0,0 +1,85 @@
<?php
namespace App\Models\Albaranes;
class AlbaranLineaModel extends \App\Models\BaseModel
{
protected $table = "albaranes_lineas";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $primaryKey = 'id';
protected $returnType = 'App\Entities\Albaranes\AlbaranLineaEntity';
protected $allowedFields = [
'albaran_id',
'pedido_linea_id',
'titulo',
'isbn',
'ref_cliente',
'cantidad',
'precio_unidad',
'total',
'iva_reducido',
'user_created_id',
'user_updated_id',
'created_at',
'updated_at',
'deleted_at',
];
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
/**
* Get resource data for creating PDFs.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResourceForPdf($albaran_id = -1)
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id, t1.titulo as titulo, t1.isbn as isbn, t1.ref_cliente as ref_cliente,
t1.cantidad as unidades, t1.precio_unidad as precio_unidad, t1.iva_reducido as iva_reducido,
t1.total as total, pedidos.id AS pedido"
)
->join("pedidos_linea", "t1.pedido_linea_id = pedidos_linea.id", "left")
->join("pedidos", "pedidos_linea.pedido_id = pedidos.id", "left");
$builder->where("t1.deleted_at IS NULL");
$builder->where("t1.albaran_id", $albaran_id);
return $builder;
}
public function getDatatableQuery($albaran_id = null)
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id, t1.titulo as titulo, t1.isbn as isbn, t1.ref_cliente as ref_cliente,
t1.cantidad as unidades, t1.precio_unidad as precio_unidad, t1.iva_reducido as iva_reducido,
t1.total as total, pedidos.id AS pedido"
)
->join("pedidos_linea", "t1.pedido_linea_id = pedidos_linea.id", "left")
->join("pedidos", "pedidos_linea.pedido_id = pedidos.id", "left");
$builder->where("t1.deleted_at IS NULL");
$builder->where("t1.albaran_id", $albaran_id);
return $builder;
}
}

View File

@ -0,0 +1,206 @@
<?php
namespace App\Models\Albaranes;
class AlbaranModel extends \App\Models\BaseModel
{
protected $table = "albaranes";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $primaryKey = 'id';
protected $returnType = 'App\Entities\Albaranes\AlbaranEntity';
protected $allowedFields = [
'envio_id',
'cliente_id',
'serie_id',
'numero_albaran',
'mostrar_precios',
'direccion_albaran',
'fecha_albaran',
'att_albaran',
'user_created_id',
'user_updated_id',
'created_at',
'updated_at',
'deleted_at',
'cajas',
];
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
public function generarAlbaranes($envio_id, $envio_lineas, $cajas)
{
$user_id = auth()->user()->id;
if (!$envio_id || !$envio_lineas) {
return [
'status' => false
];
}
// el albaran es para el mismo cliente, por lo que se obtiene el cliente_id de la primera_linea
$cliente_id = $this->db->table('envios_lineas')
->select('presupuestos.cliente_id')
->join('presupuestos', 'presupuestos.id = envios_lineas.presupuesto_id')
->where('envios_lineas.id', $envio_lineas[0])
->get()
->getRow()->cliente_id;
// se genera el numero de albaran
$model_series = model('App\Models\Configuracion\SeriesFacturasModel');
$serie = $model_series->find(11);
$numero_albaran = str_replace('{number}', $serie->next, $serie->formato);
$numero_albaran = str_replace('{year}', date("Y"), $numero_albaran);
$serie->next = $serie->next + 1;
$model_series->save($serie);
// Se genera el albaran con los datos del envio
$model_envio = model('App\Models\Logistica\EnvioModel');
$envio = $model_envio->find($envio_id);
$data = [
'envio_id' => $envio->id,
'cliente_id' => $cliente_id,
'serie_id' => 11, // Serie de albaranes
'numero_albaran' => $numero_albaran,
'mostrar_precios' => 0,
'direccion_albaran' => $envio->direccion,
'att_albaran' => $envio->att,
'user_created_id' => $user_id,
'cajas' => $cajas,
];
$id_albaran = $this->insert($data);
if(!$id_albaran) {
return [
'status' => false
];
}
// Se generan las lineas del albaran
$model_albaran_linea = model('App\Models\Albaranes\AlbaranLineaModel');
$albaran_linea = [];
foreach ($envio_lineas as $linea) {
$modelLineaEnvio = model('App\Models\Logistica\EnvioLineaModel');
$datosLinea = $this->db->table('envios_lineas')
->select('presupuestos.titulo as titulo, presupuestos.isbn as isbn, presupuestos.referencia_cliente as ref_cliente,
envios_lineas.unidades_envio as cantidad, presupuestos.total_precio_unidad as precio_unidad, presupuestos.iva_reducido as iva_reducido,
ROUND(envios_lineas.unidades_envio * presupuestos.total_precio_unidad, 2) as total, pedidos_linea.id as pedido_linea_id')
->join('presupuestos', 'presupuestos.id = envios_lineas.presupuesto_id')
->join('pedidos', 'pedidos.id = envios_lineas.pedido_id')
->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id')
->where('envios_lineas.id', $linea)
->get()
->getRow();
$linea = $modelLineaEnvio->find($linea);
if (!$linea) {
continue;
}
$albaran_linea = [
'albaran_id' => $id_albaran,
'titulo' => $datosLinea->titulo,
'isbn' => $datosLinea->isbn,
'ref_cliente' => $datosLinea->ref_cliente,
'cantidad' => $datosLinea->cantidad,
'precio_unidad' => $datosLinea->precio_unidad,
'iva_reducido' => $datosLinea->iva_reducido,
'total' => $datosLinea->total,
'user_created_id' => $user_id,
'user_updated_id' => $user_id,
'pedido_linea_id' => $datosLinea->pedido_linea_id,
];
$model_albaran_linea->insert($albaran_linea);
}
$albaran_data = $this->db->table('albaranes t1')
->select("
t1.id,
t1.att_albaran AS att,
t1.direccion_albaran AS direccion,
t1.envio_id,
t1.numero_albaran AS numero_albaran,
DATE_FORMAT(t1.created_at, '%d/%m/%Y') AS fecha_creacion,
DATE_FORMAT(t1.fecha_albaran, '%d/%m/%Y') AS fecha_albaran,
t1.mostrar_precios AS mostrar_precios,
t1.cajas AS cajas,
")
->where('t1.id', $id_albaran)
->get()
->getResultObject();
$modelCliente = model('App\Models\Clientes\ClienteModel');
$cliente = $modelCliente->find($cliente_id);
$albaran_data[0]->cliente = $cliente->nombre;
return [
'status' => true,
'albaran' => $albaran_data[0],
];
}
public function getAlbaranesEnvio($envio_id=null){
if (!$envio_id) {
return [];
}
$albaran_data = $this->db->table('albaranes t1')
->select("
t1.id,
t1.att_albaran AS att,
t1.direccion_albaran AS direccion,
t1.envio_id,
t1.numero_albaran AS numero_albaran,
DATE_FORMAT(t1.created_at, '%d/%m/%Y') AS fecha_creacion,
DATE_FORMAT(t1.fecha_albaran, '%d/%m/%Y') AS fecha_albaran,
t1.mostrar_precios AS mostrar_precios,
t2.nombre AS cliente,
t1.cajas AS cajas
")
->join('clientes t2', 't1.cliente_id = t2.id', 'left')
->where('t1.envio_id', $envio_id)
->where('t1.deleted_at IS NULL')
->get()
->getResultObject();
return $albaran_data;
}
/**
* Get resource data for creating PDFs.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResourceForPdf($albaran_id = -1)
{
$builder = $this->db
->table($this->table . " t1")
->select("
t1.id,
t1.att_albaran AS att,
t1.direccion_albaran AS direccion,
t1.envio_id,
t1.numero_albaran AS numero_albaran,
DATE_FORMAT(t1.created_at, '%d/%m/%Y') AS fecha_creacion,
DATE_FORMAT(t1.fecha_albaran, '%d/%m/%Y') AS fecha_albaran,
t1.mostrar_precios AS mostrar_precios,
t2.nombre AS cliente,
t1.cajas AS cajas
") ;
$builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
$builder->where("t1.deleted_at IS NULL");
$builder->where("t1.id", $albaran_id);
return $builder;
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Models\Logistica;
use CodeIgniter\Model;
use CodeIgniter\Database\BaseBuilder;
class EnvioLineaModel extends Model
{
protected $table = 'envios_lineas';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = \App\Entities\Logistica\EnvioLineaEntity::class;
protected $useSoftDeletes = false;
protected $allowedFields = [
'envio_id',
'pedido_id',
'unidades_envio',
'unidades_total',
'created_at',
'updated_at',
'created_by',
'updated_by',
'presupuesto_id',
];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
public function getDatatableQuery($envio_id = null): BaseBuilder
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id, t1.pedido_id as pedido, t3.id as presupuesto,
t3.titulo as titulo, t1.unidades_envio as unidadesEnvio, t1.unidades_envio as unidadesEnvioRaw,
t1.unidades_total as unidadesTotal,
IFNULL((
SELECT SUM(t_sub.unidades_envio)
FROM " . $this->table . " t_sub
JOIN envios e ON e.id = t_sub.envio_id
JOIN presupuesto_direcciones d ON d.presupuesto_id = t_sub.presupuesto_id
WHERE e.finalizado = 1
AND t_sub.pedido_id = t1.pedido_id
AND e.direccion = d.direccion COLLATE utf8mb3_general_ci
), 0) as unidadesEnviadas,
IFNULL((
SELECT ROUND(SUM(peso) / 1000, 1)
FROM presupuesto_linea
WHERE presupuesto_id = t3.id
), 0) AS pesoUnidad"
);
$builder->join("presupuestos t3", "t1.presupuesto_id = t3.id", "left");
$builder->where("t1.envio_id", $envio_id);
return $builder;
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace App\Models\Logistica;
use CodeIgniter\Database\BaseBuilder;
use CodeIgniter\Model;
class EnvioModel extends Model
{
protected $table = 'envios';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = \App\Entities\Logistica\EnvioEntity::class;
protected $useSoftDeletes = false;
protected $allowedFields = [
'finalizado',
'codigo_seguimiento',
'proveedor_id',
'comentarios',
'cliente_id',
'att',
'direccion',
'ciudad',
'cp',
'email',
'telefono',
'pais_id',
'mostrar_precios',
'mostrar_iva',
'created_at',
'updated_at',
'cajas',
];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
public function getDatatableQuery(): BaseBuilder
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id, GROUP_CONCAT(DISTINCT t2.pedido_id) AS pedidos,
COUNT(t2.id) AS num_lineas,
t1.att, t1.direccion, t1.ciudad, t3.nombre as pais, t1.cp, t1.email, t1.telefono, t1.finalizado"
);
$builder->join("envios_lineas t2", "t2.envio_id = t1.id", "left");
$builder->join("lg_paises t3", "t3.id = t1.pais_id", "left");
$builder->groupBy("t1.id");
return $builder;
}
}

View File

@ -1,66 +0,0 @@
<?php
namespace App\Models\Pedidos;
class AlbaranLineaModel extends \App\Models\BaseModel
{
protected $table = "albaranes_lineas";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $primaryKey = 'id';
protected $returnType = 'App\Entities\Pedidos\AlbaranLineaEntity';
protected $allowedFields = [
'albaran_id',
'titulo',
'isbn',
'ref_cliente',
'cantidad',
'cajas',
'ejemplares_por_caja',
'precio_unidad',
'total',
'user_created_id',
'user_updated_id',
'created_at',
'updated_at',
'deleted_at',
];
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
/**
* Get resource data for creating PDFs.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResourceForPdf($albaran_id = -1)
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.albaran_id AS albaran_id, t1.titulo AS titulo, t1.isbn AS isbn,
t1.ref_cliente AS ref_cliente, t1.cantidad AS cantidad, t1.cajas AS cajas,
t1.ejemplares_por_caja AS ejemplares_por_caja, t1.precio_unidad AS precio_unidad,
t1.total AS total"
);
$builder->where("t1.deleted_at IS NULL");
$builder->where("t1.albaran_id", $albaran_id);
return $builder;
}
}

View File

@ -1,161 +0,0 @@
<?php
namespace App\Models\Pedidos;
class AlbaranModel extends \App\Models\BaseModel
{
protected $table = "albaranes";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $primaryKey = 'id';
protected $returnType = 'App\Entities\Pedidos\AlbaranEntity';
protected $allowedFields = [
'pedido_id',
'presupuesto_id',
'presupuesto_direccion_id',
'cliente_id',
'serie_id',
'numero_albaran',
'mostrar_precios',
'total',
'direccion_albaran',
'att_albaran',
'user_created_id',
'user_updated_id',
'created_at',
'updated_at',
'deleted_at',
];
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
public function generarAlbaranes($pedido_id, $presupuestos_id, $user_id){
$model_presupuesto = model('App\Models\Presupuestos\PresupuestoModel');
$model_presupuesto_direcciones = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$model_series = model('App\Models\Configuracion\SeriesFacturasModel');
$presupuestos = $model_presupuesto->find($presupuestos_id);
$return_data = [];
foreach ($presupuestos as $presupuesto) {
$envios = $model_presupuesto_direcciones->where('presupuesto_id', $presupuesto->id)->findAll();
foreach($envios as $envio){
// se buscan los albaranes en este presupuesto con la misma direccion y con el mismo presupuesto_id en albaran
// en albaran linea para obtener la cantidad total enviada
$model_albaran = model('App\Models\Pedidos\AlbaranModel');
$model_albaran_linea = model('App\Models\Pedidos\AlbaranLineaModel');
$albaranes = $model_albaran->where('presupuesto_id', $presupuesto->id)
->where('presupuesto_direccion_id', $envio->id)->findAll();
// se suman las cantidades de los albaranes
$cantidad_enviada = 0;
foreach($albaranes as $albaran){
$lineas = $model_albaran_linea->where('albaran_id', $albaran->id)->findAll();
foreach($lineas as $linea){
$cantidad_enviada += $linea->cantidad;
}
}
if($cantidad_enviada >= intval($envio->cantidad)){
continue;
}
// calculo precio_unidad
$precio_unidad = $presupuesto->total_aceptado/$presupuesto->tirada;
$albaran_linea = [];
$albaran_linea = [
'titulo' => $presupuesto->titulo,
'isbn' => $presupuesto->isbn,
'ref_cliente' => $presupuesto->ref_cliente,
'cantidad' => intval($envio->cantidad)-$cantidad_enviada,
'cajas' => 1,
'ejemplares_por_caja' => intval($envio->cantidad)-$cantidad_enviada,
'precio_unidad' => $precio_unidad,
'total' => $precio_unidad * $envio->cantidad,
'user_created_id' => $user_id,
'user_updated_id' => $user_id,
];
$serie = $model_series->find(11);
$numero_albaran = str_replace('{number}', $serie->next, $serie->formato);
$numero_albaran = str_replace( '{year}', date("Y"), $numero_albaran);
$serie->next = $serie->next + 1;
$model_series->save($serie);
$albaran = [
'pedido_id' => $pedido_id,
'presupuesto_id' => $presupuesto->id,
'presupuesto_direccion_id' => $envio->id,
'cliente_id' => $presupuesto->cliente_id,
'serie_id' => 11, // Serie de albaranes
'numero_albaran' => $numero_albaran,
'mostrar_precios' => 0,
'total' => $albaran_linea['total'],
'direccion_albaran' => $envio->direccion,
'att_albaran' => $envio->att,
'user_created_id' => $user_id,
'user_updated_id' => $user_id,
'fecha_albaran' => date('d/m/Y'),
];
$id_albaran = $this->insert($albaran);
$model_albaran_linea = model('App\Models\Pedidos\AlbaranLineaModel');
$albaran['id'] = $id_albaran;
$albaran_linea['albaran_id'] = $id_albaran;
$id_albaran_linea =$model_albaran_linea->insert($albaran_linea);
$albaran_linea['id'] = $id_albaran_linea;
array_push($return_data, ["albaran"=>$albaran, "lineas" =>[$albaran_linea]]);
}
}
return $return_data;
}
/**
* Get resource data for creating PDFs.
*
* @param string $search
*
* @return \CodeIgniter\Database\BaseBuilder
*/
public function getResourceForPdf($albaran_id = -1)
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id AS id, t1.pedido_id AS pedido_id, t1.presupuesto_id AS presupuesto_id,
t1.presupuesto_direccion_id AS presupuesto_direccion_id, t1.cliente_id AS cliente_id,
t1.serie_id AS serie_id, t1.numero_albaran AS numero_albaran, t1.mostrar_precios AS mostrar_precios,
t1.total AS total, t1.direccion_albaran AS direccion_albaran, t1.att_albaran AS att_albaran,
t1.user_created_id AS user_created_id, t1.user_updated_id AS user_updated_id,
t1.created_at AS created_at, t1.updated_at AS updated_at,
t2.nombre AS cliente"
);
$builder->join("clientes t2", "t1.cliente_id = t2.id", "left");
$builder->where("t1.deleted_at IS NULL");
$builder->where("t1.id", $albaran_id);
return $builder;
}
}