2023-09-12

This commit is contained in:
Juan Pablo Vial
2023-09-13 18:51:46 -03:00
parent fa15da1ee2
commit 0cd357b6cb
47 changed files with 1225 additions and 102 deletions

View File

@ -0,0 +1,15 @@
<?php
namespace Incoviba\Service\Venta;
use Incoviba\Repository;
use Incoviba\Model;
class BonoPie
{
public function __construct(protected Repository\Venta\BonoPie $bonoPieRepository) {}
public function add(array $data): Model\Venta\BonoPie
{
return new Model\Venta\BonoPie();
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Incoviba\Service\Venta;
use DateTimeImmutable;
use Incoviba\Repository;
use Incoviba\Model;
use Incoviba\Service\Money;
class Credito
{
public function __construct(
protected Repository\Venta\Credito $creditoRepository,
protected Repository\Venta\Pago $pagoRepository,
protected Repository\Venta\TipoPago $tipoPagoRepository,
protected Repository\Venta\EstadoPago $estadoPagoRepository,
protected Repository\Venta\TipoEstadoPago $tipoEstadoPagoRepository,
protected Money $moneyService
) {}
public function add(array $data): Model\Venta\Credito
{
$fecha = new DateTimeImmutable($data['fecha']);
$uf = $data['uf'] ?? $this->moneyService->getUF($fecha);
$tipoPago = $this->tipoPagoRepository->fetchByDescripcion('carta de resguardo');
$pago = $this->addPago(['fecha' => $fecha->format('Y-m-d'), 'valor' => $data['valor'] * $uf, 'uf' => $uf, 'tipo' => $tipoPago->id]);
$credito = $this->creditoRepository->create([
'valor' => $data['valor'],
'fecha' => $fecha->format('Y-m-d'),
'pago' => $pago->id
]);
return $this->creditoRepository->save($credito);
}
protected function addPago(array $data): Model\Venta\Pago
{
$pago = $this->pagoRepository->create($data);
$pago = $this->pagoRepository->save($pago);
$tipoEstado = $this->tipoEstadoPagoRepository->fetchByDescripcion('no pagado');
$data = [
'pago' => $pago->id,
'fecha' => $pago->fecha->format('Y-m-d'),
'estado' => $tipoEstado->id
];
$estado = $this->estadoPagoRepository->create($data);
$this->estadoPagoRepository->save($estado);
return $pago;
}
}

View File

@ -5,10 +5,15 @@ use DateTimeImmutable;
use DateInterval;
use IntlDateFormatter;
use Incoviba\Repository;
use Incoviba\Model;
class Cuota
{
public function __construct(protected Repository\Venta\Cuota $cuotaRepository) {}
public function __construct(
protected Repository\Venta\Cuota $cuotaRepository,
protected Pago $pagoService,
protected Repository\Venta\TipoPago $tipoPagoRepository
) {}
public function pendientes(): array
{
@ -68,4 +73,41 @@ class Cuota
}
return $cuotas_depositadas;
}
public function getVigenteByPie(int $pie_id): array
{
return $this->cuotaRepository->fetchVigenteByPie($pie_id);
}
public function add(array $data): Model\Venta\Cuota
{
$tipoPago = $this->tipoPagoRepository->fetchByDescripcion('cheque');
$fields = array_fill_keys([
'fecha',
'banco',
'valor',
'identificador'
], 0);
$filtered_data = array_intersect_key($data, $fields);
$pago_data = array_merge($filtered_data, ['tipo' => $tipoPago->id]);
$pago = $this->pagoService->add($pago_data);
$data['pago'] = $pago->id;
$data['estado'] = $pago->currentEstado->tipoEstadoPago->id;
$fields = array_fill_keys([
'pie',
'fecha',
'valor',
'estado',
'banco',
'uf',
'pago',
'numero'
], 0);
$filtered_data = array_intersect_key($data, $fields);
$mapped_data = $filtered_data;
$mapped_data['valor_$'] = $mapped_data['valor'];
unset($mapped_data['valor']);
$cuota = $this->cuotaRepository->create($mapped_data);
$this->cuotaRepository->save($cuota);
return $cuota;
}
}

View File

@ -3,15 +3,20 @@ namespace Incoviba\Service\Venta;
use DateTimeInterface;
use DateTimeImmutable;
use Incoviba\Service\Money;
use PDOException;
use Incoviba\Repository;
use Incoviba\Model;
use Incoviba\Service;
class Pago
{
public function __construct(protected Repository\Venta\Pago $pagoRepository,
protected Repository\Venta\EstadoPago $estadoPagoRepository,
protected Repository\Venta\TipoEstadoPago $tipoEstadoPagoRepository) {}
public function __construct(
protected Repository\Venta\Pago $pagoRepository,
protected Repository\Venta\EstadoPago $estadoPagoRepository,
protected Repository\Venta\TipoEstadoPago $tipoEstadoPagoRepository,
protected Service\Money $moneyService
) {}
public function depositar(Model\Venta\Pago $pago, DateTimeInterface $fecha): bool
{
@ -66,6 +71,12 @@ class Pago
$pago = $this->pagoRepository->fetchById($pago_id);
$pago->estados = $this->estadoPagoRepository->fetchByPago($pago_id);
$pago->currentEstado = $this->estadoPagoRepository->fetchCurrentByPago($pago_id);
if (($pago->uf === null or $pago->uf === 0.0) and $pago->fecha < new DateTimeImmutable()) {
$pago->uf = $this->moneyService->getUF($pago->fecha);
if ($pago->uf !== 0.0) {
$this->pagoRepository->edit($pago, ['uf' => $pago->uf]);
}
}
return $pago;
}
@ -81,4 +92,33 @@ class Pago
{
return [];
}
public function add(array $data): Model\Venta\Pago
{
if (!isset($data['uf'])) {
$data['uf'] = $this->moneyService->getUF(new DateTimeImmutable($data['fecha']));
}
$fields = array_fill_keys([
'valor',
'banco',
'tipo',
'identificador',
'fecha',
'uf',
'pagador',
'asociado'
], 0);
$filtered_data = array_intersect_key($data, $fields);
$pago = $this->pagoRepository->create($filtered_data);
$pago = $this->pagoRepository->save($pago);
$tipoEstado = $this->tipoEstadoPagoRepository->fetchByDescripcion('no pagado');
$estado = $this->estadoPagoRepository->create([
'pago' => $pago->id,
'fecha' => $pago->fecha->format('Y-m-d'),
'estado' => $tipoEstado->id
]);
$estado = $this->estadoPagoRepository->save($estado);
$pago->currentEstado = $estado;
return $pago;
}
}

View File

@ -8,13 +8,23 @@ class Pie
{
public function __construct(
protected Repository\Venta\Pie $pieRepository,
protected Repository\Venta\Cuota $cuotaRepository
protected Cuota $cuotaService
) {}
public function getById(int $pie_id): Model\Venta\Pie
{
$pie = $this->pieRepository->fetchById($pie_id);
$pie->cuotasArray = $this->cuotaRepository->fetchVigenteByPie($pie_id);
$pie->cuotasArray = $this->cuotaService->getVigenteByPie($pie_id);
return $pie;
}
public function add(array $data): Model\Venta\Pie
{
$pie = $this->pieRepository->create($data);
return $this->pieRepository->save($pie);
}
public function addCuota(array $data): Model\Venta\Cuota
{
return $this->cuotaService->add($data);
}
}

View File

@ -0,0 +1,87 @@
<?php
namespace Incoviba\Service\Venta;
use PDO;
use PDOException;
use Incoviba\Common\Define;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Repository;
use Incoviba\Model;
class Propiedad
{
public function __construct(
protected Repository\Venta\Propiedad $propiedadRepository,
protected Repository\Venta\Unidad $unidadRepository,
protected Define\Connection $connection
) {}
public function addPropiedad(array $ids): Model\Venta\Propiedad
{
$unidades = [];
foreach ($ids as $unidad_id) {
$unidades []= $this->unidadRepository->fetchById($unidad_id);
}
usort($unidades, function(Model\Venta\Unidad $a, Model\Venta\Unidad $b) {
$t = $a->proyectoTipoUnidad->tipoUnidad->orden - $b->proyectoTipoUnidad->tipoUnidad->orden;
if ($t === 0) {
return strcmp(str_pad($a->descripcion, 4, '0', STR_PAD_LEFT), str_pad($b->descripcion, 4, '0', STR_PAD_LEFT));
}
return $t;
});
try {
$propiedad = $this->propiedadRepository->fetchVigenteByUnidad($unidades[0]->id);
} catch (EmptyResult) {
$propiedad = $this->propiedadRepository->create([
'unidad_principal' => $unidades[0]->id,
'estado' => 1
]);
$propiedad = $this->propiedadRepository->save($propiedad);
}
$this->addUnidades($propiedad, $unidades);
$this->cleanUpUnidades($propiedad, $unidades);
return $propiedad;
}
protected function addUnidades(Model\Venta\Propiedad $propiedad, array $unidades): void
{
$query = "SELECT 1 FROM `propiedad_unidad` WHERE `propiedad` = ? AND `unidad` = ?";
$statement = $this->connection->prepare($query);
$query2 = "INSERT INTO `propiedad_unidad` (`propiedad`, `unidad`, `principal`) VALUES (?, ?, ?)";
$insert = $this->connection->prepare($query2);
foreach ($unidades as $ix => $unidad) {
try {
$statement->execute([$propiedad->id, $unidad->id]);
$result = $statement->fetch(PDO::FETCH_ASSOC);
if (!$result) {
throw new EmptyResult($query);
}
} catch (PDOException|EmptyResult) {
$insert->execute([$propiedad->id, $unidad->id, ($ix === 0) ? 1 : 0]);
}
}
}
protected function cleanUpUnidades(Model\Venta\Propiedad $propiedad, array $unidades): void
{
$query = "SELECT `unidad` FROM `propiedad_unidad` WHERE `propiedad` = ?";
$statement = $this->connection->prepare($query);
$statement->execute([$propiedad->id]);
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
if (!$results) {
return;
}
$all_ids = array_map(function($row) {return $row['unidad'];}, $results);
$new_ids = array_map(function(Model\Venta\Unidad $unidad) {return $unidad->id;}, $unidades);
$diff = array_diff($all_ids, $new_ids);
if (count($diff) === 0) {
return;
}
$query = "DELECT FROM `propiedad_unidad` WHERE `propiedad` = ? AND `unidad` = ?";
$statement = $this->connection->prepare($query);
foreach ($diff as $id) {
$statement->execute([$propiedad->id, $id]);
}
}
}

View File

@ -0,0 +1,102 @@
<?php
namespace Incoviba\Service\Venta;
use Incoviba\Common\Implement\Exception\EmptyResult;
use Incoviba\Repository;
use Incoviba\Model;
class Propietario
{
public function __construct(
protected Repository\Venta\Propietario $propietarioRepository,
protected Repository\Direccion $direccionRepository
) {}
public function addPropietario(array $data): Model\Venta\Propietario
{
$direccion = $this->addDireccion($data);
$data['direccion'] = $direccion->id;
if (str_contains($data['rut'], '-')) {
$data['rut'] = explode('-', $data['rut'])[0];
}
$fields = array_fill_keys([
'rut',
'nombres',
'apellido_paterno',
'apellido_materno',
'direccion'
], 0);
$filtered_data = array_intersect_key($data, $fields);
try {
$propietario = $this->propietarioRepository->fetchById($data['rut']);
$edits = [];
if ($propietario->datos->direccion->id !== $filtered_data['direccion']) {
$edits['direccion'] = $filtered_data['direccion'];
}
$propietario = $this->propietarioRepository->edit($propietario, $edits);
} catch (EmptyResult) {
$propietario = $this->propietarioRepository->create($filtered_data);
$propietario = $this->propietarioRepository->save($propietario);
}
return $propietario;
}
public function addSociedad(array $data): Model\Venta\Propietario
{
$direccion = $this->addDireccion($data);
$data['direccion'] = $direccion->id;
if (str_contains($data['rut'], '-')) {
$data['rut'] = explode('-', $data['rut'])[0];
}
$fields = array_fill_keys([
'rut',
'razon_social',
'direccion',
'representante'
], 0);
$filtered_data = array_intersect_key($data, $fields);
$mapped_data = array_combine([
'rut',
'nombres',
'direccion',
'representante'
], $filtered_data);
try {
$sociedad = $this->propietarioRepository->fetchById($data['rut']);
$edits = [];
if ($sociedad->datos->direccion->id !== $mapped_data['direccion']) {
$edits['direccion'] = $mapped_data['direccion'];
}
if ($sociedad->representante->rut !== $mapped_data['representante']) {
$edits['representante'] = $mapped_data['representante'];
}
$sociedad = $this->propietarioRepository->edit($sociedad, $edits);
} catch (EmptyResult) {
$sociedad = $this->propietarioRepository->create($mapped_data);
$sociedad = $this->propietarioRepository->save($sociedad);
}
return $sociedad;
}
protected function addDireccion(array $data): Model\Direccion
{
$fields = array_fill_keys([
'calle',
'numero',
'extra',
'comuna'
], 0);
$filtered_data = array_intersect_key($data, $fields);
try {
$direccion = $this->direccionRepository->fetchByCalleAndNumeroAndExtra($filtered_data['calle'], $filtered_data['numero'], $filtered_data['extra']);
} catch (EmptyResult) {
$direccion = $this->direccionRepository->create($filtered_data);
$direccion = $this->direccionRepository->save($direccion);
}
return $direccion;
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace Incoviba\Service\Venta;
use DateTimeImmutable;
use Incoviba\Repository;
use Incoviba\Model;
use Incoviba\Service;
class Subsidio
{
public function __construct(
protected Repository\Venta\Subsidio $subsidioRepository,
protected Repository\Venta\Pago $pagoRepository,
protected Repository\Venta\TipoPago $tipoPagoRepository,
protected Repository\Venta\EstadoPago $estadoPagoRepository,
protected Repository\Venta\TipoEstadoPago $tipoEstadoPagoRepository,
protected Service\Money $moneyService
) {}
public function add(array $data): Model\Venta\Subsidio
{
$fecha = new DateTimeImmutable($data['fecha']);
$uf = $data['uf'] ?? $this->moneyService->getUF($fecha);
$tipoPago = $this->tipoPagoRepository->fetchByDescripcion('vale vista');
$ahorro = $this->addPago(['fecha' => $fecha->format('Y-m-d'), 'valor' => $data['ahorro'] * $uf, 'uf' => $uf, 'tipo' => $tipoPago->id]);
$subsidio = $this->addPago(['fecha' => $fecha->format('Y-m-d'), 'valor' => $data['subsidio'] * $uf, 'uf' => $uf, 'tipo' => $tipoPago->id]);
$subsidio = $this->subsidioRepository->create(['pago' => $ahorro->id, 'subsidio' => $subsidio->id]);
return $this->subsidioRepository->save($subsidio);
}
protected function addPago(array $data): Model\Venta\Pago
{
$pago = $this->pagoRepository->create($data);
$pago = $this->pagoRepository->save($pago);
$tipoEstado = $this->tipoEstadoPagoRepository->fetchByDescripcion('no pagado');
$data = [
'pago' => $pago->id,
'fecha' => $pago->fecha->format('Y-m-d'),
'estado' => $tipoEstado->id
];
$estado = $this->estadoPagoRepository->create($data);
$this->estadoPagoRepository->save($estado);
return $pago;
}
}