Guardar factura

This commit is contained in:
Juan Pablo Vial
2025-02-03 22:17:57 -03:00
parent 71615050f3
commit 59a28a353b
11 changed files with 296 additions and 122 deletions

View File

@ -9,10 +9,12 @@ use Incoviba\Common\Implement;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Model;
use Incoviba\Repository;
use Incoviba\Service;
class Factura extends Ideal\Repository
{
public function __construct(Implement\Connection $connection, protected Repository\Venta $ventaRepository,
protected Service\Persona $personaService,
protected Repository\Persona $personaRepository, protected Unidad $unidadRepository)
{
parent::__construct($connection);
@ -30,31 +32,67 @@ class Factura extends Ideal\Repository
->register('cliente_rut', (new Implement\Repository\Mapper())
->setProperty('cliente')
->setFunction(function($data) {
return $this->personaRepository->fetchById($data['cliente_rut']);
return $this->personaService->getById($data['cliente_rut']);
}));
$factura = $this->parseData(new Model\Venta\Factura(), $data, $map);
return $this->createDatos($factura);
return $this->createDatos($factura, $data);
}
public function createDatos(Model\Venta\Factura &$factura): Model\Venta\Factura
public function createDatos(Model\Venta\Factura &$factura, ?array $data = null): Model\Venta\Factura
{
try {
$result = $this->getDatos($factura->venta->id);
$factura->fecha = new DateTimeImmutable($result['fecha']);
$factura->uf = json_decode($result['uf']);
$factura->uf->fecha = new DateTimeImmutable($factura->uf->fecha);
$factura->ipc = json_decode($result['ipc']);
$factura->ipc->fecha = new DateTimeImmutable($factura->ipc->fecha);
$factura->unidades = array_map(function($datos) use ($factura) {
$unidad = $this->unidadRepository->fetchById($datos->unidad_id);
return (object) [
'unidad' => $unidad,
'descripcion' => implode(' ', [ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion), $unidad->descripcion]),
'precio' => $datos->precio,
'prorrateo' => $datos->prorrateo
];
}, json_decode($result['unidades']));
$factura->terreno = $result['terreno'];
} catch (EmptyResult) {}
if ($result['fecha'] !== null) {
$factura->fecha = new DateTimeImmutable($result['fecha']);
}
if ($result['uf'] !== null) {
$factura->uf = json_decode($result['uf']);
$factura->uf->fecha = new DateTimeImmutable($factura->uf->fecha);
}
if ($result['ipc'] !== null) {
$factura->ipc = json_decode($result['ipc']);
$factura->ipc->fecha = new DateTimeImmutable($factura->ipc->fecha);
}
if ($result['unidades'] !== null) {
$factura->unidades = array_map(function($datos) use ($factura) {
$unidad = $this->unidadRepository->fetchById($datos->unidad_id);
return (object) [
'unidad' => $unidad,
'descripcion' => implode(' ', [ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion), $unidad->descripcion]),
'precio' => $datos->precio,
'prorrateo' => $datos->prorrateo
];
}, json_decode($result['unidades']));
}
if ($result['terreno'] !== null) {
$factura->terreno = $result['terreno'];
}
} catch (EmptyResult) {
if (isset($data['fecha'])) {
$factura->fecha = new DateTimeImmutable($data['fecha']);
}
if (isset($data['uf'])) {
$factura->uf = json_decode($data['uf']);
$factura->uf->fecha = new DateTimeImmutable($factura->uf->fecha);
}
if (isset($data['ipc'])) {
$factura->ipc = json_decode($data['ipc']);
$factura->ipc->fecha = new DateTimeImmutable($factura->ipc->fecha);
}
if (isset($data['unidades'])) {
$factura->unidades = array_map(function($datos) use ($factura) {
$unidad = $this->unidadRepository->fetchById($datos->unidad_id);
return (object) [
'unidad' => $unidad,
'descripcion' => implode(' ', [ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion), $unidad->descripcion]),
'precio' => $datos->precio,
'prorrateo' => $datos->prorrateo
];
}, json_decode($data['unidades']));
}
if (isset($data['terreno'])) {
$factura->terreno = (int) $data['terreno'];
}
}
return $factura;
}
@ -93,20 +131,27 @@ class Factura extends Ideal\Repository
$query = $this->connection->getQueryBuilder()
->insert()
->into('venta_datos_facturas')
->columns([
'venta_id',
'fecha',
'unidades',
'terreno',
'uf',
'ipc'
])
->values([
'venta_id' => $factura->venta->id,
'index' => $factura->index,
'proporcion' => $factura->proporcion,
'unidades' => json_encode(array_map(function($unidad) {
'fecha' => $factura->fecha?->format('Y-m-d'),
'unidades' => (isset($factura->unidades)) ? json_encode(array_map(function($unidad) {
return [
'unidad_id' => $unidad->unidad->id,
'precio' => $unidad->precio,
'prorrateo' => $unidad->prorrateo
];
}, $factura->unidades)),
'terreno' => $factura->terreno,
'uf' => json_encode($factura->uf),
'ipc' => json_encode($factura->ipc)
}, $factura?->unidades)) : null,
'terreno' => $factura?->terreno,
'uf' => (isset($factura->uf)) ? json_encode(['fecha' => $factura->uf?->fecha->format('Y-m-d'), 'valor' => $factura->uf?->valor]) : null,
'ipc' => (isset($factura->ipc)) ? json_encode(['fecha' => $factura->ipc?->fecha->format('Y-m-d'), 'valor' => $factura->ipc?->valor]) : null
]);
$this->connection->execute($query);
}