Implementacion agregar abono a escritura
This commit is contained in:
@ -28,6 +28,9 @@ $app->group('/venta/{venta_id:[0-9]+}', function($app) {
|
|||||||
});
|
});
|
||||||
$app->get('[/]', [Ventas::class, 'pie']);
|
$app->get('[/]', [Ventas::class, 'pie']);
|
||||||
});
|
});
|
||||||
|
$app->group('/escritura', function($app) {
|
||||||
|
$app->get('/add[/]', [Ventas\Escrituras::class, 'add']);
|
||||||
|
});
|
||||||
$app->get('/escriturar[/]', [Ventas::class, 'escriturar']);
|
$app->get('/escriturar[/]', [Ventas::class, 'escriturar']);
|
||||||
$app->get('/desistir[/]', [Ventas::class, 'desistir']);
|
$app->get('/desistir[/]', [Ventas::class, 'desistir']);
|
||||||
$app->get('/desistida[/]', [Ventas::class, 'desistida']);
|
$app->get('/desistida[/]', [Ventas::class, 'desistida']);
|
||||||
|
@ -19,11 +19,17 @@ $app->group('/ventas', function($app) {
|
|||||||
$app->group('/escrituras', function($app) {
|
$app->group('/escrituras', function($app) {
|
||||||
$app->post('/estados[/]', [Ventas::class, 'escrituras']);
|
$app->post('/estados[/]', [Ventas::class, 'escrituras']);
|
||||||
});
|
});
|
||||||
|
$app->group('/by', function($app) {
|
||||||
|
$app->get('/unidad/{unidad_id}', [Ventas::class, 'unidad']);
|
||||||
|
});
|
||||||
$app->post('[/]', [Ventas::class, 'proyecto']);
|
$app->post('[/]', [Ventas::class, 'proyecto']);
|
||||||
});
|
});
|
||||||
$app->group('/venta/{venta_id}', function($app) {
|
$app->group('/venta/{venta_id}', function($app) {
|
||||||
$app->get('/unidades[/]', [Ventas::class, 'unidades']);
|
$app->get('/unidades[/]', [Ventas::class, 'unidades']);
|
||||||
$app->get('/comentarios[/]', [Ventas::class, 'comentarios']);
|
$app->get('/comentarios[/]', [Ventas::class, 'comentarios']);
|
||||||
|
$app->group('/escritura', function($app) {
|
||||||
|
$app->post('/add[/]', [Ventas\Escrituras::class, 'add']);
|
||||||
|
});
|
||||||
$app->post('/escriturar[/]', [Ventas::class, 'escriturar']);
|
$app->post('/escriturar[/]', [Ventas::class, 'escriturar']);
|
||||||
$app->group('/desistir', function($app) {
|
$app->group('/desistir', function($app) {
|
||||||
$app->get('/eliminar[/]', [Ventas::class, 'insistir']);
|
$app->get('/eliminar[/]', [Ventas::class, 'insistir']);
|
||||||
|
153
app/resources/views/ventas/escrituras/add.blade.php
Normal file
153
app/resources/views/ventas/escrituras/add.blade.php
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
@extends('ventas.base')
|
||||||
|
|
||||||
|
@section('venta_subtitle')
|
||||||
|
Agregar Abono en Escritura
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('venta_content')
|
||||||
|
<div class="ui basic segment">
|
||||||
|
<p>Valor Promesa {{$format->ufs($venta->valor)}}</p>
|
||||||
|
@if (isset($venta->formaPago()->pie))
|
||||||
|
<p>Valor Anticipo {{$format->ufs($venta->formaPago()->pie->valor)}}</p>
|
||||||
|
@endif
|
||||||
|
@if (isset($venta->formaPago()->credito))
|
||||||
|
<p>Crédito {{$format->ufs($venta->formaPago()->credito->pago->valor())}}</p>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<form class="ui form" id="add_form">
|
||||||
|
<div class="three wide field">
|
||||||
|
<label for="fecha">Fecha</label>
|
||||||
|
<div class="ui calendar" id="fecha">
|
||||||
|
<div class="ui left icon input">
|
||||||
|
<i class="calendar icon"></i>
|
||||||
|
<input type="text" name="fecha" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<label for="valor">Valor</label>
|
||||||
|
<div class="ui labeled input" id="valor">
|
||||||
|
<div class="ui basic label">$</div>
|
||||||
|
<input type="text" name="valor" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui checkbox" id="uf">
|
||||||
|
<input type="checkbox" name="uf" />
|
||||||
|
<label>Valor en UFs</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="three wide field">
|
||||||
|
<label for="bancos">Banco</label>
|
||||||
|
<div class="ui search selection dropdown" id="bancos">
|
||||||
|
<input type="hidden" name="banco" />
|
||||||
|
<i class="dropdown icon"></i>
|
||||||
|
<div class="default text">Banco</div>
|
||||||
|
<div class="menu">
|
||||||
|
@foreach ($bancos as $banco)
|
||||||
|
<div class="item" data-value="{{$banco->id}}">{{$banco->nombre}}</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="fields">
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input type="radio" name="tipo" value="1" checked="checked" />
|
||||||
|
<label>Cheque</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<div class="ui radio checkbox">
|
||||||
|
<input type="radio" name="tipo" value="3" />
|
||||||
|
<label>Vale Vista</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="ui button">Agregar</button>
|
||||||
|
</form>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('page_scripts')
|
||||||
|
<script>
|
||||||
|
const escritura = {
|
||||||
|
ids: {},
|
||||||
|
add() {
|
||||||
|
return {
|
||||||
|
escritura: event => {
|
||||||
|
event.preventDefault()
|
||||||
|
const body = new FormData(event.currentTarget)
|
||||||
|
const fecha = $(this.ids.fecha).calendar('get date')
|
||||||
|
body.set('fecha', [fecha.getFullYear(), fecha.getMonth()+1, fecha.getDate()].join('-'))
|
||||||
|
const status = $(this.ids.checkbox).checkbox('is checked')
|
||||||
|
body.set('uf', status)
|
||||||
|
|
||||||
|
const url = '{{$urls->api}}/venta/{{$venta->id}}/escritura/add'
|
||||||
|
fetchAPI(url, {method: 'post', body}).then(response => {
|
||||||
|
if (!response) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return response.json().then(json => {
|
||||||
|
if (json.status) {
|
||||||
|
window.location = '{{$urls->base}}/venta/{{$venta->id}}'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toggle() {
|
||||||
|
return {
|
||||||
|
checkbox: () => {
|
||||||
|
const status = $(this.ids.checkbox).checkbox('is checked')
|
||||||
|
if (status) {
|
||||||
|
return this.toggle().uf()
|
||||||
|
}
|
||||||
|
return this.toggle().pesos()
|
||||||
|
},
|
||||||
|
uf: () => {
|
||||||
|
const valor = $(this.ids.valor)
|
||||||
|
valor.attr('class', 'ui right labeled input')
|
||||||
|
valor.find('.label').remove()
|
||||||
|
valor.append(
|
||||||
|
$('<div></div>').addClass('ui basic label').html('UF')
|
||||||
|
)
|
||||||
|
},
|
||||||
|
pesos: () => {
|
||||||
|
const valor = $(this.ids.valor)
|
||||||
|
valor.attr('class', 'ui labeled input')
|
||||||
|
valor.find('.label').remove()
|
||||||
|
valor.prepend(
|
||||||
|
$('<div></div>').addClass('ui basic label').html('$')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setup(ids) {
|
||||||
|
this.ids = ids
|
||||||
|
|
||||||
|
$(this.ids.fecha).calendar(calendar_date_options)
|
||||||
|
$(this.ids.checkbox).checkbox({
|
||||||
|
fireOnInit: true,
|
||||||
|
onChange: this.toggle().checkbox
|
||||||
|
})
|
||||||
|
$(this.ids.bancos).dropdown()
|
||||||
|
$(this.ids.form).submit(this.add().escritura)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$(document).ready(() => {
|
||||||
|
escritura.setup({
|
||||||
|
form: '#add_form',
|
||||||
|
fecha: '#fecha',
|
||||||
|
checkbox: '#uf',
|
||||||
|
valor: '#valor',
|
||||||
|
bancos: '#bancos'
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
@ -13,6 +13,50 @@ class Escrituras
|
|||||||
{
|
{
|
||||||
use withJson;
|
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,
|
public function edit(ServerRequestInterface $request, ResponseInterface $response,
|
||||||
Service\Venta $ventaService, Repository\Venta\EstadoVenta $estadoVentaRepository,
|
Service\Venta $ventaService, Repository\Venta\EstadoVenta $estadoVentaRepository,
|
||||||
int $venta_id): ResponseInterface
|
int $venta_id): ResponseInterface
|
||||||
|
@ -4,6 +4,7 @@ namespace Incoviba\Controller\Ventas;
|
|||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use Incoviba\Common\Alias\View;
|
use Incoviba\Common\Alias\View;
|
||||||
|
use Incoviba\Repository;
|
||||||
use Incoviba\Service;
|
use Incoviba\Service;
|
||||||
|
|
||||||
class Escrituras
|
class Escrituras
|
||||||
@ -20,4 +21,12 @@ class Escrituras
|
|||||||
$venta = $ventaService->getById($venta_id);
|
$venta = $ventaService->getById($venta_id);
|
||||||
return $view->render($response, 'ventas.escrituras.informe', compact('venta'));
|
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'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,17 @@ class FormaPago implements JsonSerializable
|
|||||||
}
|
}
|
||||||
return $sum;
|
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
|
public function total(string $moneda = Pago::UF): float
|
||||||
{
|
{
|
||||||
$sum = $this->anticipo($moneda);
|
$sum = $this->anticipo($moneda);
|
||||||
|
@ -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
|
public function pagado(string $moneda = Pago::UF): float
|
||||||
{
|
{
|
||||||
$proporcion = 1;
|
$proporcion = $this->proporcion();
|
||||||
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));
|
|
||||||
}
|
|
||||||
if ($this->asociado !== null) {
|
if ($this->asociado !== null) {
|
||||||
return $this->asociado->pagado($moneda) * $proporcion;
|
return $this->asociado->pagado($moneda) * $proporcion;
|
||||||
}
|
}
|
||||||
@ -49,6 +54,17 @@ class Pie extends Model
|
|||||||
return $sum + $cuota->pago->valor($moneda);
|
return $sum + $cuota->pago->valor($moneda);
|
||||||
}, 0) * $proporcion;
|
}, 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 ?array $asociados;
|
||||||
public function asociados(): array
|
public function asociados(): array
|
||||||
{
|
{
|
||||||
|
@ -47,15 +47,19 @@ class EstadoVenta extends Ideal\Repository
|
|||||||
|
|
||||||
public function fetchByVenta(int $venta_id): array
|
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]);
|
return $this->fetchMany($query, [$venta_id]);
|
||||||
}
|
}
|
||||||
public function fetchCurrentByVenta(int $venta_id): Model\Venta\EstadoVenta
|
public function fetchCurrentByVenta(int $venta_id): Model\Venta\EstadoVenta
|
||||||
{
|
{
|
||||||
$query = "SELECT a.*
|
$query = $this->connection->getQueryBuilder()
|
||||||
FROM `{$this->getTable()}` a
|
->select('a.*')
|
||||||
JOIN (SELECT MAX(`id`) AS 'id', `venta` FROM `{$this->getTable()}` GROUP BY `venta`) e0 ON e0.`id` = a.`id`
|
->from("{$this->getTable()} a")
|
||||||
WHERE a.`venta` = ?";
|
->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]);
|
return $this->fetchOne($query, [$venta_id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user