Implementacion agregar abono a escritura

This commit is contained in:
Juan Pablo Vial
2024-02-14 13:54:01 -03:00
parent 338f290539
commit 1621d6fe30
8 changed files with 257 additions and 11 deletions

View File

@ -13,6 +13,50 @@ class Escrituras
{
use withJson;
public function add(ServerRequestInterface $request, ResponseInterface $response,
Repository\Venta $ventaRepository, Service\Venta $ventaService,
Repository\Venta\Escritura $escrituraRepository, Service\Venta\Pago $pagoService,
Service\UF $ufService, int $venta_id): ResponseInterface
{
$body = $request->getParsedBody();
$output = [
'venta_id' => $venta_id,
'input' => $body,
'status' => false
];
try {
$venta = $ventaService->getById($venta_id);
if (isset($venta->formaPago()->escritura)) {
throw new EmptyResult('');
}
$fecha = new DateTimeImmutable($body['fecha']);
$uf = $ufService->get($fecha);
$valor = $body['valor'];
if (str_contains($valor, ',')) {
$valor = str_replace(['.', ','], ['', '.'], $valor);
}
$valor = ((float) $valor) * (($body['uf']) ? $uf : 1);
$data = [
'fecha' => $fecha->format('Y-m-d'),
'valor' => $valor,
'banco' => $body['banco'],
'tipo' => $body['tipo'],
'uf' => $uf
];
$pago = $pagoService->add($data);
$data = [
'valor' => $valor,
'fecha' => $fecha->format('Y-m-d'),
'uf' => $uf,
'pago' => $pago->id
];
$escritura = $escrituraRepository->create($data);
$escrituraRepository->save($escritura);
$ventaRepository->edit($venta, ['escritura' => $escritura->id]);
$output['status'] = true;
} catch (EmptyResult) {}
return $this->withJson($response, $output);
}
public function edit(ServerRequestInterface $request, ResponseInterface $response,
Service\Venta $ventaService, Repository\Venta\EstadoVenta $estadoVentaRepository,
int $venta_id): ResponseInterface

View File

@ -4,6 +4,7 @@ namespace Incoviba\Controller\Ventas;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Incoviba\Common\Alias\View;
use Incoviba\Repository;
use Incoviba\Service;
class Escrituras
@ -20,4 +21,12 @@ class Escrituras
$venta = $ventaService->getById($venta_id);
return $view->render($response, 'ventas.escrituras.informe', compact('venta'));
}
public function add(ServerRequestInterface $request, ResponseInterface $response, View $view,
Service\Venta $ventaService, Repository\Banco $bancoRepository,
int $venta_id): ResponseInterface
{
$venta = $ventaService->getById($venta_id);
$bancos = $bancoRepository->fetchAll('nombre');
return $view->render($response, 'ventas.escrituras.add', compact('venta', 'bancos'));
}
}

View File

@ -26,6 +26,17 @@ class FormaPago implements JsonSerializable
}
return $sum;
}
public function prometido(string $moneda = Pago::UF): float
{
$sum = 0;
if (isset($this->pie)) {
$sum += $this->pie->valor($moneda);
}
if (isset($this->escritura)) {
$sum += $this->escritura->pago->valor($moneda);
}
return $sum;
}
public function total(string $moneda = Pago::UF): float
{
$sum = $this->anticipo($moneda);

View File

@ -33,14 +33,19 @@ class Pie extends Model
});
}
public function valor(string $moneda = Pago::UF): float
{
$proporcion = $this->proporcion();
if ($this->asociado !== null) {
return $this->asociado->valor($moneda) * $proporcion;
}
return array_reduce($this->cuotas(), function(float $sum, Cuota $cuota) use ($moneda) {
return $sum + $cuota->pago->valor($moneda);
}, 0) * $proporcion;
}
public function pagado(string $moneda = Pago::UF): float
{
$proporcion = 1;
if (count($this->asociados()) > 0) {
$proporcion = $this->valor / ((($this->asociado) ? $this->asociado->valor : $this->valor) + array_reduce($this->asociados(), function(float $sum, Pie $pie) {
return $sum + $pie->valor;
}, 0));
}
$proporcion = $this->proporcion();
if ($this->asociado !== null) {
return $this->asociado->pagado($moneda) * $proporcion;
}
@ -49,6 +54,17 @@ class Pie extends Model
return $sum + $cuota->pago->valor($moneda);
}, 0) * $proporcion;
}
protected function proporcion(): float
{
$proporcion = 1;
if (count($this->asociados()) > 0) {
$proporcion = $this->valor / ((($this->asociado) ? $this->asociado->valor : $this->valor) + array_reduce($this->asociados(), function(float $sum, Pie $pie) {
return $sum + $pie->valor;
}, 0));
}
return $proporcion;
}
public ?array $asociados;
public function asociados(): array
{

View File

@ -47,15 +47,19 @@ class EstadoVenta extends Ideal\Repository
public function fetchByVenta(int $venta_id): array
{
$query = "SELECT * FROM `{$this->getTable()}` WHERE `venta` = ?";
$query = $this->connection->getQueryBuilder()
->select()
->from($this->getTable())
->where('venta = ?');
return $this->fetchMany($query, [$venta_id]);
}
public function fetchCurrentByVenta(int $venta_id): Model\Venta\EstadoVenta
{
$query = "SELECT a.*
FROM `{$this->getTable()}` a
JOIN (SELECT MAX(`id`) AS 'id', `venta` FROM `{$this->getTable()}` GROUP BY `venta`) e0 ON e0.`id` = a.`id`
WHERE a.`venta` = ?";
$query = $this->connection->getQueryBuilder()
->select('a.*')
->from("{$this->getTable()} a")
->joined("JOIN (SELECT MAX(id) AS id, venta FROM {$this->getTable()} GROUP BY venta) ev0 ON ev0.id = a.id")
->where('a.venta = ?');
return $this->fetchOne($query, [$venta_id]);
}
}