mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
80 lines
2.1 KiB
PHP
80 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Models\Catalogo;
|
|
|
|
use CodeIgniter\Model;
|
|
use RuntimeException;
|
|
|
|
class IdentificadorIskModel extends Model
|
|
{
|
|
protected $table = 'identificadores_isk';
|
|
protected $primaryKey = 'id';
|
|
protected $returnType = \App\Entities\Catalogo\IdentificadorIsk::class;
|
|
protected $useSoftDeletes = false; // No soft delete
|
|
protected $useTimestamps = true;
|
|
protected $allowedFields = ['isk'];
|
|
|
|
protected $beforeInsert = ['agregarIsk'];
|
|
|
|
/**
|
|
* Crea un nuevo registro con un ISK único y lo devuelve.
|
|
*/
|
|
public function newIsk(string $contexto = 'libro'): string
|
|
{
|
|
$isk = $this->generarIskUnico($contexto);
|
|
$this->insert(['isk' => $isk]);
|
|
|
|
return $isk;
|
|
}
|
|
|
|
/**
|
|
* Genera un ISK único validado contra la base de datos.
|
|
*/
|
|
private function generarIskUnico(string $contexto): string
|
|
{
|
|
do {
|
|
$isk = $this->generarIsk($contexto);
|
|
} while ($this->where('isk', $isk)->countAllResults() > 0);
|
|
|
|
return $isk;
|
|
}
|
|
|
|
/**
|
|
* Formato legible de ISK, ejemplo: isk_libro_20250419_ab12c
|
|
*/
|
|
private function generarIsk(string $contexto): string
|
|
{
|
|
$fecha = date('Ymd');
|
|
$random = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789'), 0, 5);
|
|
return "isk_{$contexto}_{$fecha}_{$random}";
|
|
}
|
|
|
|
/**
|
|
* Hook para generar el ISK automáticamente al insertar.
|
|
*/
|
|
protected function agregarIsk(array $data): array
|
|
{
|
|
if (!isset($data['data']['isk']) || empty($data['data']['isk'])) {
|
|
$data['data']['isk'] = $this->generarIskUnico('registro');
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
// Bloqueo total de eliminaciones
|
|
public function delete($id = null, bool $purge = false)
|
|
{
|
|
throw new RuntimeException('La eliminación de registros está deshabilitada.');
|
|
}
|
|
|
|
public function deleteWhere($where)
|
|
{
|
|
throw new RuntimeException('La eliminación de registros está deshabilitada.');
|
|
}
|
|
|
|
public function deleteBatch($where)
|
|
{
|
|
throw new RuntimeException('La eliminación de registros está deshabilitada.');
|
|
}
|
|
}
|