Merge branch 'feat/iskn_presupuestos' into 'main'

Feat/iskn presupuestos

See merge request jjimenez/safekat!892
This commit is contained in:
Ignacio Martinez Navajas
2025-07-25 10:37:25 +00:00
9 changed files with 112 additions and 41 deletions

View File

@ -587,6 +587,7 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$data['datosGenerales']['coleccion'] = $presupuesto->coleccion; $data['datosGenerales']['coleccion'] = $presupuesto->coleccion;
$data['datosGenerales']['numero_edicion'] = $presupuesto->numero_edicion; $data['datosGenerales']['numero_edicion'] = $presupuesto->numero_edicion;
$data['datosGenerales']['isbn'] = $presupuesto->isbn; $data['datosGenerales']['isbn'] = $presupuesto->isbn;
$data['datosGenerales']['iskn'] = $presupuesto->iskn;
$data['datosGenerales']['pais'] = $presupuesto->pais_id; $data['datosGenerales']['pais'] = $presupuesto->pais_id;
$data['datosGenerales']['pais_nombre'] = model('App\Models\Configuracion\PaisModel')->find($presupuesto->pais_id)->nombre; $data['datosGenerales']['pais_nombre'] = model('App\Models\Configuracion\PaisModel')->find($presupuesto->pais_id)->nombre;
$data['datosGenerales']['cliente']['id'] = $presupuesto->cliente_id; $data['datosGenerales']['cliente']['id'] = $presupuesto->cliente_id;

View File

@ -0,0 +1,27 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddIsknToPresupuestos extends Migration
{
public function up()
{
$this->forge->addColumn('presupuestos', [
'iskn' => [
'type' => 'VARCHAR',
'constraint' => 64,
'null' => true,
'default' => null,
'after' => 'coleccion', // o cualquier campo existente tras el cual quieras insertarlo
'collation' => 'utf8_unicode_ci',
],
]);
}
public function down()
{
$this->forge->dropColumn('presupuestos', 'iskn');
}
}

View File

@ -47,6 +47,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"titulo" => "", "titulo" => "",
"autor" => null, "autor" => null,
"coleccion" => null, "coleccion" => null,
"iskn" => null,
"numero_edicion" => null, "numero_edicion" => null,
"isbn" => null, "isbn" => null,
"referencia_cliente" => null, "referencia_cliente" => null,

View File

@ -35,6 +35,7 @@ return [
'coleccion' => 'Collection', 'coleccion' => 'Collection',
'numeroEdicion' => 'Edition number', 'numeroEdicion' => 'Edition number',
'isbn' => 'ISBN', 'isbn' => 'ISBN',
'iskn' => 'Identificador ISKN',
'referenciaCliente' => 'Customer reference', 'referenciaCliente' => 'Customer reference',
'formatoLibro' => "Book format", 'formatoLibro' => "Book format",
'papelFormatoId' => "Size", 'papelFormatoId' => "Size",

View File

@ -67,6 +67,7 @@ class PresupuestoModel extends \App\Models\BaseModel
"titulo", "titulo",
"autor", "autor",
"coleccion", "coleccion",
"iskn",
"numero_edicion", "numero_edicion",
"isbn", "isbn",
"referencia_cliente", "referencia_cliente",
@ -401,15 +402,27 @@ class PresupuestoModel extends \App\Models\BaseModel
} }
} }
function confirmarPresupuesto($presupuesto_id) /**
* Confirma un presupuesto (cambia su estado a 'confirmado') y,
* si no tiene asignado un ISKN, lo genera y lo asigna automáticamente.
*
* @param int $presupuesto_id ID del presupuesto a confirmar.
* @return void
*/
public function confirmarPresupuesto($presupuesto_id)
{ {
// Cambiar el estado del presupuesto a '2' (confirmado)
$this->db $this->db
->table($this->table . " t1") ->table($this->table . " t1")
->where('t1.id', $presupuesto_id) ->where('t1.id', $presupuesto_id)
->set('t1.estado_id', 2) ->set('t1.estado_id', 2)
->update(); ->update();
// Si existe y aún no tiene ISKN asignado, lo generamos y asignamos
$this->asignarIskn($presupuesto_id);
} }
function insertarPresupuestoCliente($id, $tirada, $data, $data_cabecera, $extra_info, $resumen_totales, $iva_reducido, $excluir_rotativa, $tiradas_alternativas) function insertarPresupuestoCliente($id, $tirada, $data, $data_cabecera, $extra_info, $resumen_totales, $iva_reducido, $excluir_rotativa, $tiradas_alternativas)
{ {
@ -635,7 +648,6 @@ class PresupuestoModel extends \App\Models\BaseModel
'gramaje' => intval($data['faja']['gramaje']), 'gramaje' => intval($data['faja']['gramaje']),
); );
} }
} }
$json = json_encode($values); $json = json_encode($values);
return $json; return $json;
@ -915,5 +927,19 @@ class PresupuestoModel extends \App\Models\BaseModel
]); ]);
} }
public function asignarIskn(int $presupuesto_id): bool
{
$presupuesto = $this->find($presupuesto_id);
// Si no existe o ya tiene ISKN, no lo modificamos
if (!$presupuesto || !empty($presupuesto->iskn)) {
return false;
}
return $this->update($presupuesto_id, [
'iskn' => model('App\Models\Catalogo\IdentificadorIsknModel')->newIskn(),
'updated_at' => date('Y-m-d H:i:s'),
'user_update_id' => auth()->id(),
]);
}
} }

View File

@ -137,7 +137,7 @@
</div> <!--//.row --> </div> <!--//.row -->
<!-- Fila 3 --> <!-- Fila 4 -->
<div class="row"> <div class="row">
<div class="col-md-12 col-lg-6 px-4"> <div class="col-md-12 col-lg-6 px-4">
<div class="mb-3"> <div class="mb-3">
@ -152,7 +152,7 @@
</div><!--//.mb-3 --> </div><!--//.mb-3 -->
</div><!--//.col --> </div><!--//.col -->
<div class="col-md-12 col-lg-6 px-4"> <div class="col-md-12 col-lg-3 px-4">
<div class="mb-3"> <div class="mb-3">
<label for="referenciaCliente" class="form-label"> <label for="referenciaCliente" class="form-label">
<?= lang('Presupuestos.referenciaCliente') ?> <?= lang('Presupuestos.referenciaCliente') ?>
@ -162,6 +162,18 @@
</div><!--//.col --> </div><!--//.col -->
<div class="col-md-12 col-lg-3 px-4">
<div class="mb-3">
<label for="iskn" class="form-label">
<?= lang('Presupuestos.iskn') ?>
</label>
<input type="text" id="iskn" name="iskn" class="form-control" readonly
value="" maxlength="64"
style="background: #E8E8E8;">
</div><!--//.mb-3 -->
</div><!--//.col -->
</div> <!--//.row --> </div> <!--//.row -->
</div> <!-- //.accordion-body --> </div> <!-- //.accordion-body -->

View File

@ -234,6 +234,7 @@ class PresupuestoAdminEdit {
titulo: this.datosGenerales.titulo.val(), titulo: this.datosGenerales.titulo.val(),
autor: this.datosGenerales.autor.val(), autor: this.datosGenerales.autor.val(),
isbn: this.datosGenerales.isbn.val(), isbn: this.datosGenerales.isbn.val(),
iskn: this.datosGenerales.iskn.val(),
pais_id: this.datosGenerales.pais.getVal(), pais_id: this.datosGenerales.pais.getVal(),
coleccion: this.datosGenerales.coleccion.val(), coleccion: this.datosGenerales.coleccion.val(),
numero_edicion: this.datosGenerales.numeroEdicion.val(), numero_edicion: this.datosGenerales.numeroEdicion.val(),

View File

@ -15,6 +15,7 @@ class DatosGenerales{
this.coleccion = this.domItem.find('#coleccion'); this.coleccion = this.domItem.find('#coleccion');
this.numeroEdicion = this.domItem.find('#numeroEdicion'); this.numeroEdicion = this.domItem.find('#numeroEdicion');
this.isbn = this.domItem.find('#isbn'); this.isbn = this.domItem.find('#isbn');
this.iskn = this.domItem.find('#iskn');
this.cliente = new ClassSelect($('#clienteId'), '/clientes/cliente/getSelect2', 'Seleccione cliente'); this.cliente = new ClassSelect($('#clienteId'), '/clientes/cliente/getSelect2', 'Seleccione cliente');
@ -46,6 +47,7 @@ class DatosGenerales{
this.coleccion.val(datos.coleccion); this.coleccion.val(datos.coleccion);
this.numeroEdicion.val(datos.numero_edicion); this.numeroEdicion.val(datos.numero_edicion);
this.isbn.val(datos.isbn); this.isbn.val(datos.isbn);
this.iskn.val(datos.iskn);
this.cliente.setOption(datos.cliente.id, datos.cliente.nombre); this.cliente.setOption(datos.cliente.id, datos.cliente.nombre);