From 7b63cbc7576a252da8248beb3c0b409c54a0658f Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 14:02:12 -0300 Subject: [PATCH 1/8] FIX: Fechas revisadas. --- .../views/ventas/escriturar.blade.php | 19 +++++-- app/src/Service/Venta.php | 54 ++++++++++++------- app/src/Service/Venta/Pago.php | 24 +++++---- 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/app/resources/views/ventas/escriturar.blade.php b/app/resources/views/ventas/escriturar.blade.php index 23445e2..feb6786 100644 --- a/app/resources/views/ventas/escriturar.blade.php +++ b/app/resources/views/ventas/escriturar.blade.php @@ -251,12 +251,21 @@ event.preventDefault() const url = '{{$urls->api}}/venta/{{$venta->id}}/escriturar' const body = new FormData(event.currentTarget) - body.set('fecha', $('#fecha').calendar('get date').toISOString()) - if (body.get('fecha_pago') !== '') { - body.set('fecha_pago', $('#fecha_pago').calendar('get date').toISOString()) + const fecha = $('#fecha').calendar('get date') + body.set('fecha', [fecha.getFullYear(), fecha.getMonth()+1, fecha.getDate()].join('-')) + const $fechaPago = $('#fecha_pago') + if ($fechaPago.length > 0) { + const fechaPago = $fechaPago.calendar('get date') + if (fechaPago !== null) { + body.set('fecha_pago', [fechaPago.getFullYear(), fechaPago.getMonth()+1, fechaPago.getDate()].join('-')) + } } - if (body.get('fecha_reajuste') !== '') { - body.set('fecha_reajuste', $('#fecha_reajuste').calendar('get date').toISOString()) + const $fechaReajuste = $('#fecha_reajuste') + if ($fechaReajuste.length > 0) { + const fechaReajuste = $fechaReajuste.calendar('get date') + if (fechaReajuste !== null) { + body.set('fecha_reajuste', [fechaReajuste.getFullYear(), fechaReajuste.getMonth()+1, fechaReajuste.getDate()].join('-')) + } } fetchAPI(url, {method: 'post', body}).then(response => { if (response.ok) { diff --git a/app/src/Service/Venta.php b/app/src/Service/Venta.php index 596ebfb..70a761d 100644 --- a/app/src/Service/Venta.php +++ b/app/src/Service/Venta.php @@ -285,12 +285,13 @@ class Venta extends Service return $this->formaPagoService->add($data); } - /** - * @throws Exception - */ protected function addEstado(Model\Venta $venta, Model\Venta\TipoEstadoVenta $tipoEstadoVenta, array $data): void { - $fecha = new DateTimeImmutable($data['fecha']); + try { + $fecha = new DateTimeImmutable($data['fecha']); + } catch (\DateMalformedStringException) { + $fecha = new DateTimeImmutable(); + } $estadoData = [ 'venta' => $venta->id, 'estado' => $tipoEstadoVenta->id, @@ -343,12 +344,13 @@ class Venta extends Service return true; } - /** - * @throws Exception - */ protected function reajustarEscritura(Model\Venta $venta, array $data): void { - $fecha = new DateTimeImmutable($data['fecha_reajuste']); + try { + $fecha = new DateTimeImmutable($data['fecha_reajuste']); + } catch (\DateMalformedStringException) { + $fecha = new DateTimeImmutable(); + } $reajusteData = [ 'valor' => $this->valorService->clean($data['valor_reajuste']), 'fecha' => $fecha->format('Y-m-d') @@ -357,12 +359,13 @@ class Venta extends Service $this->pieService->reajustar($pie, $reajusteData); } - /** - * @throws Exception - */ protected function abonoEscritura(Model\Venta $venta, array $data): void { - $fecha = new DateTimeImmutable($data['fecha_pago']); + try { + $fecha = new DateTimeImmutable($data['fecha_pago']); + } catch (\DateMalformedStringException) { + $fecha = new DateTimeImmutable(); + } $uf = $this->moneyService->getUF($fecha); $valor = $data['valor_pago_ufs'] !== '' ? $this->valorService->clean($data['valor_pago_ufs']) * $uf : $this->valorService->clean($data['valor_pago_pesos']); $pagoData = [ @@ -382,12 +385,13 @@ class Venta extends Service $this->ventaRepository->edit($venta, ['escritura' => $escritura->id]); } - /** - * @throws Exception - */ protected function subsidioEscritura(Model\Venta $venta, array $data): void { - $fecha = new DateTimeImmutable($data['fecha']); + try { + $fecha = new DateTimeImmutable($data['fecha']); + } catch (\DateMalformedStringException) { + $fecha = new DateTimeImmutable(); + } $uf = $this->moneyService->getUF($fecha); $subsidioData = [ 'fecha_venta' => $fecha->format('Y-m-d'), @@ -399,15 +403,19 @@ class Venta extends Service $this->ventaRepository->edit($venta, ['subsidio' => $subsidio->id]); } - /** - * @throws Exception - */ protected function editCredito(Model\Venta $venta, array $data): void { - $fecha = new DateTimeImmutable($data['fecha']); + try { + $fecha = new DateTimeImmutable($data['fecha']); + } catch (\DateMalformedStringException) { + $fecha = new DateTimeImmutable(); + } $uf = $this->moneyService->getUF($fecha); $valor = $this->valorService->clean($data['valor_credito']) * $uf; if ($venta->formaPago()->credito === null) { + if ($data['valor_credito'] === 0) { + return; + } $pagoData = [ 'valor' => $valor, 'fecha' => $fecha->format('Y-m-d'), @@ -424,6 +432,12 @@ class Venta extends Service $this->ventaRepository->edit($venta, ['credito' => $credito->id]); return; } + if ($data['valor_credito'] === 0) { + $this->pagoRepository->remove($venta->formaPago()->credito->pago); + $this->creditoRepository->remove($venta->formaPago()->credito); + $this->ventaRepository->edit($venta, ['credito' => null]); + return; + } $this->pagoRepository->edit($venta->formaPago()->credito->pago, [ 'valor' => $valor, 'banco' => $data['banco_credito'], diff --git a/app/src/Service/Venta/Pago.php b/app/src/Service/Venta/Pago.php index 329541a..c211af5 100644 --- a/app/src/Service/Venta/Pago.php +++ b/app/src/Service/Venta/Pago.php @@ -117,13 +117,14 @@ class Pago return $this->process($this->pagoRepository->fetchDevolucionByVenta($venta_id)); } - /** - * @throws \Exception - */ public function add(array $data): Model\Venta\Pago { if (!isset($data['uf'])) { - $data['uf'] = $this->ufService->get(new DateTimeImmutable($data['fecha'])); + try { + $data['uf'] = $this->ufService->get(new DateTimeImmutable($data['fecha'])); + } catch (\DateMalformedStringException) { + $data['uf'] = 0; + } } $filtered_data = $this->pagoRepository->filterData($data); $filtered_data['valor'] = round($this->valorService->clean($filtered_data['valor'])); @@ -141,16 +142,21 @@ class Pago return $pago; } - /** - * @throws Exception - */ public function edit(Model\Venta\Pago $pago, array $data): Model\Venta\Pago { if (array_key_exists('fecha', $data)) { - $data['fecha'] = (new DateTimeImmutable($data['fecha']))->format('Y-m-d'); + try { + $data['fecha'] = (new DateTimeImmutable($data['fecha']))->format('Y-m-d'); + } catch (\DateMalformedStringException) { + $data['fecha'] = (new DateTimeImmutable())->format('Y-m-d'); + } } if (array_key_exists('uf', $data)) { - $data['uf'] = $this->ufService->get(new DateTimeImmutable($data['fecha'])); + try { + $data['uf'] = $this->ufService->get(new DateTimeImmutable($data['fecha'])); + } catch (\DateMalformedStringException) { + $data['uf'] = 0; + } } $filteredData = $this->pagoRepository->filterData($data); if (array_key_exists('valor', $filteredData)) { From 8116e012e75b3a7c5dc0efc338c62c90e924ce3b Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 15:47:58 -0300 Subject: [PATCH 2/8] FIX: Calculos corregidos en factura --- .../views/ventas/facturacion/show.blade.php | 9 +++-- .../ventas/facturacion/show/factura.blade.php | 33 ++++++++++++++----- .../ventas/facturacion/show/unidad.blade.php | 2 +- .../ventas/facturacion/show/venta.blade.php | 1 + 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/app/resources/views/ventas/facturacion/show.blade.php b/app/resources/views/ventas/facturacion/show.blade.php index d9bcaba..b47ece3 100644 --- a/app/resources/views/ventas/facturacion/show.blade.php +++ b/app/resources/views/ventas/facturacion/show.blade.php @@ -82,7 +82,7 @@ new Unidad({ id: {{$unidad->id}}, tipo: '{{ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}}', - descripcion: '{{ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}} {{ $unidad->descripcion }} (UF {{ number_format($unidad->precio($venta->currentEstado()->fecha)->valor, 2) }})', + descripcion: '{{ $unidad->descripcion }}', prorrateo: {{$unidad->prorrateo}}, propiedad_unidad_id: {{$unidad->pu_id}}, valor: {{($unidad->valor > 0) ? $unidad->valor : $unidad->precio($venta->currentEstado()->fecha)->valor}} @@ -96,7 +96,7 @@ @if ($terreno->fecha != null) fecha: new Date('{{$terreno->fecha->add(new DateInterval('P1D'))->format('Y-m-d')}}'), @else fecha: null, @endif - valor: {{($terreno->valor ?? 0) * (1+$ipc)}} + valor: {{($terreno->valor ?? 0) * (1 + $ipc)}} }, facturas: [] } @@ -112,7 +112,6 @@ venta: this.venta.props, index: {{$factura->index}}, fecha: new Date('{{$factura->fecha->format('Y-m-d')}}'), - proporcion: {{$factura->proporcion}}, emisor: { rut: '{{$factura->venta->proyecto()->inmobiliaria()->rut}}', nombre: '{{$factura->venta->proyecto()->inmobiliaria()->razon}}', @@ -137,7 +136,7 @@ unidad: new Unidad({ id: {{$unidad->unidad->id}}, tipo: '{{ucwords($unidad->unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}}', - descripcion: '{{ucwords($unidad->unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}} {{ $unidad->unidad->descripcion }} (UF {{ number_format(array_values(array_filter($venta->propiedad()->unidades, function($uni) use ($unidad, $factura) {return $uni->id === $unidad->unidad->id;}))[0]->precio($venta->currentEstado()->fecha)->valor * $factura->proporcion, 2) }})', + descripcion: '{{ $unidad->unidad->descripcion }}', prorrateo: {{$unidad->prorrateo}}, propiedad_unidad_id: {{ array_values(array_filter($venta->propiedad()->unidades, function($uni) use ($unidad) {return $uni->id === $unidad->unidad->id;}))[0]->pu_id }}, valor: {{$unidad->precio}} @@ -150,7 +149,7 @@ ], detalle: { base: {{ $factura->base() }}, - terreno: {{ $factura->terreno * $factura->proporcion }}, + terreno: {{ $factura->terreno * $factura->proporcion * $factura->prorrateo }}, neto: {{ $factura->neto() }}, iva: {{ $factura->iva() }}, bruto: {{ $factura->bruto() }}, diff --git a/app/resources/views/ventas/facturacion/show/factura.blade.php b/app/resources/views/ventas/facturacion/show/factura.blade.php index b039f68..61b40fb 100644 --- a/app/resources/views/ventas/facturacion/show/factura.blade.php +++ b/app/resources/views/ventas/facturacion/show/factura.blade.php @@ -5,6 +5,10 @@ venta: null, index: 0, proporcion: 0, + terreno: { + fecha: null, + valor: 0 + }, emisor: { rut: '', nombre: '', @@ -50,6 +54,9 @@ get saved() { return this.props.id > 0 } + get prorrateo() { + return this.props.unidades.reduce((sum, unidad) => sum + unidad.prorrateo, 0) + } draw() { return { divider: () => { @@ -186,7 +193,7 @@ return unidadesData.join("\n") }, unidad: ({unidad, no, classes, formatters}) => { - const descuento = this.props.detalle.terreno * unidad.prorrateo + const descuento = this.props.terreno.valor * unidad.prorrateo * this.props.proporcion const bruto = unidad.precio - descuento const neto = bruto / 1.19 const data = [ @@ -240,6 +247,10 @@ return row.join('') }, totales: ({formatters}) => { + let tooltip + if (this.props.total.total !== this.props.detalle.total) { + tooltip = ` data-tooltip="No coinciden totales! Promesa: ${formatters.pesos.format(this.props.detalle.total)} - Unidades: ${formatters.pesos.format(this.props.total.total)}"` + } return [ '
', '
', @@ -265,7 +276,7 @@ '', '', 'Monto Total', - ''+formatters.pesos.format(this.props.total.total)+'', + `${formatters.pesos.format(this.props.total.total)}`, '', '', '', @@ -364,12 +375,10 @@ this.props.uf.valor = venta.props.uf.valor this.update().propietario(venta.props.propietarios.find(propietario => propietario.props.index === this.props.index)) this.update().unidades(venta.props.unidades) - this.props.total.total = this.props.detalle.total = venta.props.valor * this.props.proporcion * venta.props.uf.valor - this.update().detalle(venta.props.facturas.terreno.valor * venta.prorrateo) - this.props.total.exento = this.props.detalle.terreno - this.props.total.iva = this.props.detalle.iva - this.props.total.neto = this.props.unidades.reduce((sum, unidad) => sum + unidad.precio, 0) + this.props.detalle.total = venta.props.valor * this.props.proporcion * venta.props.uf.valor + this.update().detalle(venta.props.facturas.terreno.valor * this.prorrateo) this.props.detalle.descuento = venta.prorrateo * this.props.proporcion + this.update().total() }, detalle: terreno => { this.props.detalle.terreno = terreno * this.props.proporcion @@ -378,14 +387,20 @@ this.props.detalle.iva = this.props.detalle.neto * 0.19 this.props.detalle.base = this.props.detalle.neto + this.props.detalle.terreno }, + total: () => { + this.props.total.exento = this.props.detalle.terreno + this.props.total.neto = (this.props.unidades.reduce((sum, unidad) => sum + unidad.precio, 0) - this.props.total.exento) / 1.19 + this.props.total.iva = this.props.total.neto * 0.19 + this.props.total.total = this.props.total.neto + this.props.total.iva + this.props.total.exento + }, unidades: unidades => { this.props.unidades = [] unidades.forEach(unidad => { this.props.unidades.push({ unidad: unidad, descripcion: unidad.changeDescripcion(this.props.proporcion || 1), - precio: unidad.props.valor * this.props.uf.valor * this.props.proporcion, - prorrateo: unidad.props.prorrateo * this.props.proporcion + precio: unidad.props.valor * this.props.uf.valor, + prorrateo: unidad.props.prorrateo }) }) }, diff --git a/app/resources/views/ventas/facturacion/show/unidad.blade.php b/app/resources/views/ventas/facturacion/show/unidad.blade.php index af57b94..e2aa9b6 100644 --- a/app/resources/views/ventas/facturacion/show/unidad.blade.php +++ b/app/resources/views/ventas/facturacion/show/unidad.blade.php @@ -14,7 +14,7 @@ } changeDescripcion(proporcion = 1) { - return this.descripcion = [this.props.tipo, this.props.descripcion, `[UF ${facturas.formatters.ufs.format(this.props.valor * proporcion)}]`].join(' ') + return this.descripcion = [this.props.tipo, this.props.descripcion, `(UF ${facturas.formatters.ufs.format(this.props.valor * proporcion)})`].join(' ') } update() { return { diff --git a/app/resources/views/ventas/facturacion/show/venta.blade.php b/app/resources/views/ventas/facturacion/show/venta.blade.php index e3638f5..7fd5da0 100644 --- a/app/resources/views/ventas/facturacion/show/venta.blade.php +++ b/app/resources/views/ventas/facturacion/show/venta.blade.php @@ -403,6 +403,7 @@ venta: this.props, index: propietario.props.index, proporcion: propietario.props.proporcion, + terreno: this.props.facturas.terreno, emisor: { rut: this.props.inmobiliaria.rut, nombre: this.props.inmobiliaria.nombre, From 15e0ff80f3364acb1b59d3a2a05a9dbc745bd4e0 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 15:47:58 -0300 Subject: [PATCH 3/8] FIX: Calculos corregidos en factura --- .../views/ventas/facturacion/show.blade.php | 9 ++-- .../ventas/facturacion/show/factura.blade.php | 47 ++++++++++++++----- .../ventas/facturacion/show/unidad.blade.php | 2 +- .../ventas/facturacion/show/venta.blade.php | 1 + 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/app/resources/views/ventas/facturacion/show.blade.php b/app/resources/views/ventas/facturacion/show.blade.php index d9bcaba..b47ece3 100644 --- a/app/resources/views/ventas/facturacion/show.blade.php +++ b/app/resources/views/ventas/facturacion/show.blade.php @@ -82,7 +82,7 @@ new Unidad({ id: {{$unidad->id}}, tipo: '{{ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}}', - descripcion: '{{ucwords($unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}} {{ $unidad->descripcion }} (UF {{ number_format($unidad->precio($venta->currentEstado()->fecha)->valor, 2) }})', + descripcion: '{{ $unidad->descripcion }}', prorrateo: {{$unidad->prorrateo}}, propiedad_unidad_id: {{$unidad->pu_id}}, valor: {{($unidad->valor > 0) ? $unidad->valor : $unidad->precio($venta->currentEstado()->fecha)->valor}} @@ -96,7 +96,7 @@ @if ($terreno->fecha != null) fecha: new Date('{{$terreno->fecha->add(new DateInterval('P1D'))->format('Y-m-d')}}'), @else fecha: null, @endif - valor: {{($terreno->valor ?? 0) * (1+$ipc)}} + valor: {{($terreno->valor ?? 0) * (1 + $ipc)}} }, facturas: [] } @@ -112,7 +112,6 @@ venta: this.venta.props, index: {{$factura->index}}, fecha: new Date('{{$factura->fecha->format('Y-m-d')}}'), - proporcion: {{$factura->proporcion}}, emisor: { rut: '{{$factura->venta->proyecto()->inmobiliaria()->rut}}', nombre: '{{$factura->venta->proyecto()->inmobiliaria()->razon}}', @@ -137,7 +136,7 @@ unidad: new Unidad({ id: {{$unidad->unidad->id}}, tipo: '{{ucwords($unidad->unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}}', - descripcion: '{{ucwords($unidad->unidad->proyectoTipoUnidad->tipoUnidad->descripcion)}} {{ $unidad->unidad->descripcion }} (UF {{ number_format(array_values(array_filter($venta->propiedad()->unidades, function($uni) use ($unidad, $factura) {return $uni->id === $unidad->unidad->id;}))[0]->precio($venta->currentEstado()->fecha)->valor * $factura->proporcion, 2) }})', + descripcion: '{{ $unidad->unidad->descripcion }}', prorrateo: {{$unidad->prorrateo}}, propiedad_unidad_id: {{ array_values(array_filter($venta->propiedad()->unidades, function($uni) use ($unidad) {return $uni->id === $unidad->unidad->id;}))[0]->pu_id }}, valor: {{$unidad->precio}} @@ -150,7 +149,7 @@ ], detalle: { base: {{ $factura->base() }}, - terreno: {{ $factura->terreno * $factura->proporcion }}, + terreno: {{ $factura->terreno * $factura->proporcion * $factura->prorrateo }}, neto: {{ $factura->neto() }}, iva: {{ $factura->iva() }}, bruto: {{ $factura->bruto() }}, diff --git a/app/resources/views/ventas/facturacion/show/factura.blade.php b/app/resources/views/ventas/facturacion/show/factura.blade.php index b039f68..f77ca5f 100644 --- a/app/resources/views/ventas/facturacion/show/factura.blade.php +++ b/app/resources/views/ventas/facturacion/show/factura.blade.php @@ -5,6 +5,10 @@ venta: null, index: 0, proporcion: 0, + terreno: { + fecha: null, + valor: 0 + }, emisor: { rut: '', nombre: '', @@ -50,6 +54,9 @@ get saved() { return this.props.id > 0 } + get prorrateo() { + return this.props.unidades.reduce((sum, unidad) => sum + unidad.prorrateo, 0) + } draw() { return { divider: () => { @@ -186,7 +193,7 @@ return unidadesData.join("\n") }, unidad: ({unidad, no, classes, formatters}) => { - const descuento = this.props.detalle.terreno * unidad.prorrateo + const descuento = this.props.terreno.valor * unidad.prorrateo * this.props.proporcion const bruto = unidad.precio - descuento const neto = bruto / 1.19 const data = [ @@ -240,6 +247,20 @@ return row.join('') }, totales: ({formatters}) => { + let tooltips = { + neto: null, + iva: null, + total: null + } + if (this.props.total.neto !== this.props.detalle.neto) { + tooltips.neto = ` data-tooltip="No coinciden netos! Promesa: ${formatters.pesos.format(this.props.detalle.neto)} - Unidades: ${formatters.pesos.format(this.props.total.neto)}"` + } + if (this.props.total.iva !== this.props.detalle.iva) { + tooltips.iva = ` data-tooltip="No coinciden ivas! Promesa: ${formatters.pesos.format(this.props.detalle.iva)} - Unidades: ${formatters.pesos.format(this.props.total.iva)}"` + } + if (this.props.total.total !== this.props.detalle.total) { + tooltips.total = ` data-tooltip="No coinciden totales! Promesa: ${formatters.pesos.format(this.props.detalle.total)} - Unidades: ${formatters.pesos.format(this.props.total.total)}"` + } return [ '
', '
', @@ -253,7 +274,7 @@ '', '', 'Monto Neto', - ''+formatters.pesos.format(this.props.total.neto)+'', + `${formatters.pesos.format(this.props.total.neto)}`, '', '', 'Monto Exento', @@ -261,11 +282,11 @@ '', '', '19% IVA', - ''+formatters.pesos.format(this.props.total.iva)+'', + `${formatters.pesos.format(this.props.total.iva)}`, '', '', 'Monto Total', - ''+formatters.pesos.format(this.props.total.total)+'', + `${formatters.pesos.format(this.props.total.total)}`, '', '', '', @@ -364,12 +385,10 @@ this.props.uf.valor = venta.props.uf.valor this.update().propietario(venta.props.propietarios.find(propietario => propietario.props.index === this.props.index)) this.update().unidades(venta.props.unidades) - this.props.total.total = this.props.detalle.total = venta.props.valor * this.props.proporcion * venta.props.uf.valor - this.update().detalle(venta.props.facturas.terreno.valor * venta.prorrateo) - this.props.total.exento = this.props.detalle.terreno - this.props.total.iva = this.props.detalle.iva - this.props.total.neto = this.props.unidades.reduce((sum, unidad) => sum + unidad.precio, 0) + this.props.detalle.total = venta.props.valor * this.props.proporcion * venta.props.uf.valor + this.update().detalle(venta.props.facturas.terreno.valor * this.prorrateo) this.props.detalle.descuento = venta.prorrateo * this.props.proporcion + this.update().total() }, detalle: terreno => { this.props.detalle.terreno = terreno * this.props.proporcion @@ -378,14 +397,20 @@ this.props.detalle.iva = this.props.detalle.neto * 0.19 this.props.detalle.base = this.props.detalle.neto + this.props.detalle.terreno }, + total: () => { + this.props.total.exento = this.props.detalle.terreno + this.props.total.neto = (this.props.unidades.reduce((sum, unidad) => sum + unidad.precio, 0) - this.props.total.exento) / 1.19 + this.props.total.iva = this.props.total.neto * 0.19 + this.props.total.total = this.props.total.neto + this.props.total.iva + this.props.total.exento + }, unidades: unidades => { this.props.unidades = [] unidades.forEach(unidad => { this.props.unidades.push({ unidad: unidad, descripcion: unidad.changeDescripcion(this.props.proporcion || 1), - precio: unidad.props.valor * this.props.uf.valor * this.props.proporcion, - prorrateo: unidad.props.prorrateo * this.props.proporcion + precio: unidad.props.valor * this.props.uf.valor, + prorrateo: unidad.props.prorrateo }) }) }, diff --git a/app/resources/views/ventas/facturacion/show/unidad.blade.php b/app/resources/views/ventas/facturacion/show/unidad.blade.php index af57b94..e2aa9b6 100644 --- a/app/resources/views/ventas/facturacion/show/unidad.blade.php +++ b/app/resources/views/ventas/facturacion/show/unidad.blade.php @@ -14,7 +14,7 @@ } changeDescripcion(proporcion = 1) { - return this.descripcion = [this.props.tipo, this.props.descripcion, `[UF ${facturas.formatters.ufs.format(this.props.valor * proporcion)}]`].join(' ') + return this.descripcion = [this.props.tipo, this.props.descripcion, `(UF ${facturas.formatters.ufs.format(this.props.valor * proporcion)})`].join(' ') } update() { return { diff --git a/app/resources/views/ventas/facturacion/show/venta.blade.php b/app/resources/views/ventas/facturacion/show/venta.blade.php index e3638f5..7fd5da0 100644 --- a/app/resources/views/ventas/facturacion/show/venta.blade.php +++ b/app/resources/views/ventas/facturacion/show/venta.blade.php @@ -403,6 +403,7 @@ venta: this.props, index: propietario.props.index, proporcion: propietario.props.proporcion, + terreno: this.props.facturas.terreno, emisor: { rut: this.props.inmobiliaria.rut, nombre: this.props.inmobiliaria.nombre, From 0c0fbab58541a71f81472260056cd524a9db789a Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 16:00:42 -0300 Subject: [PATCH 4/8] FIX: Proporcion recuperada --- app/resources/views/ventas/facturacion/show.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/resources/views/ventas/facturacion/show.blade.php b/app/resources/views/ventas/facturacion/show.blade.php index b47ece3..f936710 100644 --- a/app/resources/views/ventas/facturacion/show.blade.php +++ b/app/resources/views/ventas/facturacion/show.blade.php @@ -110,6 +110,7 @@ this.venta.props.facturas.facturas[{{$factura->index - 1}}] = new Factura({ id: {{ $factura->id }}, venta: this.venta.props, + proporcion: {{ $factura->proporcion }}, index: {{$factura->index}}, fecha: new Date('{{$factura->fecha->format('Y-m-d')}}'), emisor: { From b8af053c433235bb323336dc40ec2716a8651bd3 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 16:11:51 -0300 Subject: [PATCH 5/8] FIX: Indice de Repo/Propietario:rut --- app/src/Repository/Venta/Propietario.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/Repository/Venta/Propietario.php b/app/src/Repository/Venta/Propietario.php index 0f34621..d05b331 100644 --- a/app/src/Repository/Venta/Propietario.php +++ b/app/src/Repository/Venta/Propietario.php @@ -19,6 +19,10 @@ class Propietario extends Ideal\Repository { return 'rut'; } + protected function getIndex(Define\Model $model): mixed + { + return $model->rut; + } public function create(?array $data = null): Define\Model { From ab3c8da4f6c121728a6f15eac3b37158d1686c70 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 16:53:12 -0300 Subject: [PATCH 6/8] FIX: Escritura no grababa valor --- .../views/ventas/escrituras/show.blade.php | 11 ++++++----- app/src/Controller/API/Ventas/Escrituras.php | 4 ++-- app/src/Service/Venta/Escritura.php | 19 +++++++++++++++---- app/src/Service/Venta/Pago.php | 12 ++++++++++++ 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/resources/views/ventas/escrituras/show.blade.php b/app/resources/views/ventas/escrituras/show.blade.php index fd50174..a6da40f 100644 --- a/app/resources/views/ventas/escrituras/show.blade.php +++ b/app/resources/views/ventas/escrituras/show.blade.php @@ -37,7 +37,7 @@
$
- +
@@ -62,9 +62,9 @@ function editEscritura() { const url = '{{$urls->api}}/ventas/escritura/{{$venta->id}}/edit' const data = new FormData() - data.set('venta', {{$venta->id}}) const fecha = $('#fecha').calendar('get date') data.set('fecha', fecha.toISOString()) + data.set('valor', $('#valor').val()) data.set('estado', $('#estado').dropdown('get value')) return fetchAPI(url, {method: 'post', body: data}).then(response => { if (response.ok) { @@ -78,10 +78,11 @@ }) } $(document).ready(() => { - calendar_date_options.initialDate = new Date({{$venta->currentEstado()->fecha->format('Y, m-1, j')}}) + calendar_date_options.initialDate = new Date({{$venta->formaPago()->escritura->pago->currentEstado->fecha->format('Y, m-1, j')}}) $('#fecha').calendar(calendar_date_options) - $('#estado').dropdown() - $('#estado').dropdown('set selected', '{{$venta->currentEstado()->id}}') + const $estado = $('#estado') + $estado.dropdown() + $estado.dropdown('set selected', '{{$venta->formaPago()->escritura->pago->currentEstado->tipoEstadoPago->id}}') $('#edit_form').submit(event => { event.preventDefault() editEscritura() diff --git a/app/src/Controller/API/Ventas/Escrituras.php b/app/src/Controller/API/Ventas/Escrituras.php index c1d8cb1..200c472 100644 --- a/app/src/Controller/API/Ventas/Escrituras.php +++ b/app/src/Controller/API/Ventas/Escrituras.php @@ -37,11 +37,11 @@ class Escrituras $output = [ 'venta_id' => $venta_id, 'input' => $body, - 'edited' => false + 'success' => false ]; try { $escrituraService->edit($venta_id, $body); - $output['edited'] = true; + $output['success'] = true; } catch (EmptyResult) {} return $this->withJson($response, $output); } diff --git a/app/src/Service/Venta/Escritura.php b/app/src/Service/Venta/Escritura.php index f7fdb8d..9b6824f 100644 --- a/app/src/Service/Venta/Escritura.php +++ b/app/src/Service/Venta/Escritura.php @@ -55,16 +55,27 @@ class Escritura extends Ideal\Service /** * @throws EmptyResult - * @throws Exception */ - public function edit(int $venta_id, array $data): Model\Venta\EstadoVenta + public function edit(int $venta_id, array $data): Model\Venta\Escritura { $venta = $this->ventaService->getById($venta_id); $estado = $venta->currentEstado(); if (!in_array($estado->tipoEstadoVenta->descripcion, ['escriturando', 'firmado por inmobiliaria'])) { throw new EmptyResult(''); } - $data['fecha'] = (new DateTimeImmutable($data['fecha']))->format('Y-m-d'); - return $this->estadoVentaRepository->edit($estado, $data); + try { + $data['fecha'] = (new DateTimeImmutable($data['fecha']))->format('Y-m-d'); + } catch (\DateMalformedStringException) { + unset($data['fecha']); + } + + $escritura = $venta->formaPago()->escritura; + $pagoData = array_intersect_key($data, array_flip(['valor', 'fecha'])); + $pago = $escritura->pago; + $this->escrituraRepository->edit($escritura, $pagoData); + $this->pagoService->edit($pago, $pagoData); + $this->pagoService->updateEstado($pago, $data); + + return $this->escrituraRepository->fetchById($escritura->id); } } diff --git a/app/src/Service/Venta/Pago.php b/app/src/Service/Venta/Pago.php index c211af5..3273f58 100644 --- a/app/src/Service/Venta/Pago.php +++ b/app/src/Service/Venta/Pago.php @@ -175,6 +175,18 @@ class Pago return false; } } + public function updateEstado(Model\Venta\Pago $pago, array $data): Model\Venta\Pago + { + if ($pago->currentEstado->tipoEstadoPago->id === $data['estado']) { + return $pago; + } + + $data['pago'] = $pago->id; + $estado = $this->estadoPagoRepository->create($data); + $this->estadoPagoRepository->save($estado); + + return $this->process($this->pagoRepository->fetchById($pago->id)); + } protected function process($pago): Model\Venta\Pago { From c1528d667ab68753f92b3fa1992694ad847809a7 Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 18:15:16 -0300 Subject: [PATCH 7/8] Poder editar la direccion de un proyecto --- app/resources/routes/api/direcciones.php | 4 + app/resources/routes/api/regiones.php | 5 +- app/resources/views/proyectos/show.blade.php | 8 +- .../proyectos/show/edit_direccion.blade.php | 136 ++++++++++++++++++ app/src/Controller/API/Direcciones.php | 37 ++++- app/src/Controller/API/Regiones.php | 65 +++++++++ 6 files changed, 252 insertions(+), 3 deletions(-) create mode 100644 app/resources/views/proyectos/show/edit_direccion.blade.php diff --git a/app/resources/routes/api/direcciones.php b/app/resources/routes/api/direcciones.php index 61ea957..68f3c18 100644 --- a/app/resources/routes/api/direcciones.php +++ b/app/resources/routes/api/direcciones.php @@ -9,3 +9,7 @@ $app->group('/direcciones', function($app) { $app->post('/find[/]', [Direcciones::class, 'findComunas']); }); }); +$app->group('/direccion/{direccion_id:[0-9]+}', function($app) { + $app->post('/edit[/]', [Direcciones::class, 'edit']); + $app->get('[/]', [Direcciones::class, 'get']); +}); diff --git a/app/resources/routes/api/regiones.php b/app/resources/routes/api/regiones.php index 3f48645..4c5be1c 100644 --- a/app/resources/routes/api/regiones.php +++ b/app/resources/routes/api/regiones.php @@ -2,7 +2,10 @@ use Incoviba\Controller\API\Regiones; -//$app->group('/regiones', function($app) {}); +$app->group('/regiones', function($app) { + $app->get('[/]', Regiones::class); +}); $app->group('/region/{region_id}', function($app) { $app->get('/provincias[/]', [Regiones::class, 'provincias']); + $app->get('/comunas[/]', [Regiones::class, 'comunas']); }); diff --git a/app/resources/views/proyectos/show.blade.php b/app/resources/views/proyectos/show.blade.php index 568c0ca..e853fbc 100644 --- a/app/resources/views/proyectos/show.blade.php +++ b/app/resources/views/proyectos/show.blade.php @@ -15,7 +15,7 @@ - + @@ -137,6 +137,7 @@ @endsection +@include('proyectos.show.edit_direccion') @include('layout.body.scripts.chartjs') @push('page_scripts') @@ -485,6 +486,11 @@ ventas.setup({id_ventas: '#ventas', id_stock: '#stock', id_proyeccion: '#proyeccion', id_chart_general: '#chart_venta_general', id_chart_tipologias: '#chart_venta_tipologia', id_chart_velocidad: '#chart_venta_velocidad'}) + + document.getElementById('edit_direccion_button').addEventListener('click', event => { + event.preventDefault() + $('#edit_direccion_modal').modal('show') + }) }) @endpush diff --git a/app/resources/views/proyectos/show/edit_direccion.blade.php b/app/resources/views/proyectos/show/edit_direccion.blade.php new file mode 100644 index 0000000..ae6fe49 --- /dev/null +++ b/app/resources/views/proyectos/show/edit_direccion.blade.php @@ -0,0 +1,136 @@ + + +@push('page_scripts') + +@endpush diff --git a/app/src/Controller/API/Direcciones.php b/app/src/Controller/API/Direcciones.php index 1f59948..66b2ada 100644 --- a/app/src/Controller/API/Direcciones.php +++ b/app/src/Controller/API/Direcciones.php @@ -14,6 +14,24 @@ class Direcciones { use withRedis, withJson; + public function get(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, + Repository\Direccion $direccionRepository, int $direccion_id): ResponseInterface + { + $output = ['direccion_id' => $direccion_id, 'direccion' => null]; + $redisKey = "direcciones:{$direccion_id}"; + try { + $direccion = $this->fetchRedis($redisService, $redisKey); + $output['direccion'] = $direccion; + } catch (EmptyRedis) { + try { + $direccion = $direccionRepository->fetchById($direccion_id); + $output['direccion'] = $direccion; + $this->saveRedis($redisService, $redisKey, $direccion, 60 * 60 * 24 * 30); + } catch (EmptyResult) {} + } + + return $this->withJson($response, $output); + } public function comunas(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, Repository\Region $regionRepository, Repository\Comuna $comunaRepository, int $region_id) : ResponseInterface @@ -64,7 +82,7 @@ class Direcciones $body = $request->getBody(); $json = json_decode($body->getContents()); $output = ['input' => $json, 'total' => 0, 'comunas' => []]; - $redisKey = "comunas:direccion:{$json->direccion}"; + $redisKey = "direcciones:{$json->direccion}:comuna"; try { $output['comunas'] = $this->fetchRedis($redisService, $redisKey); } catch (EmptyRedis) { @@ -77,4 +95,21 @@ class Direcciones } return $this->withJson($response, $output); } + + public function edit(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, + Repository\Direccion $direccionRepository, int $direccion_id): ResponseInterface + { + $body = $request->getParsedBody(); + $output = ['direccion_id' => $direccion_id, 'input' => $body, 'direccion' => [], 'success' => false]; + $redisKey = "direcciones:{$direccion_id}"; + try { + $direccion = $direccionRepository->fetchById($direccion_id); + $filteredData = $direccionRepository->filterData($body); + $output['direccion'] = $direccionRepository->edit($direccion, $filteredData); + $output['success'] = true; + $this->saveRedis($redisService, $redisKey, $output['direccion'], 60 * 60 * 24 * 30); + } catch (EmptyResult) {} + + return $this->withJson($response, $output); + } } diff --git a/app/src/Controller/API/Regiones.php b/app/src/Controller/API/Regiones.php index 75ac94f..1aeeac0 100644 --- a/app/src/Controller/API/Regiones.php +++ b/app/src/Controller/API/Regiones.php @@ -14,6 +14,21 @@ class Regiones { use withRedis, withJson; + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, + Repository\Region $regionRepository): ResponseInterface + { + $regiones = []; + try { + $regiones = $this->fetchRedis($redisService, 'regiones'); + } catch (EmptyRedis) { + try { + $regiones = $regionRepository->fetchAll(); + $this->saveRedis($redisService, 'regiones', $regiones, 60 * 60 * 24 * 30); + } catch (EmptyResult) {} + } + return $this->withJson($response, compact('regiones')); + } + public function provincias(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, Repository\Provincia $provinciaRepository, int $region_id): ResponseInterface { @@ -36,4 +51,54 @@ class Regiones } return $this->withJson($response, $output); } + public function comunas(ServerRequestInterface $request, ResponseInterface $response, Service\Redis $redisService, + Repository\Provincia $provinciaRepository, + Repository\Comuna $comunaRepository, int $region_id): ResponseInterface + { + $output = [ + 'region_id' => $region_id, + 'comunas' => [] + ]; + $comunas = []; + try { + $redisKey = "provincias:region:{$region_id}"; + $provincias = $this->fetchRedis($redisService, $redisKey); + foreach ($provincias as $provincia) { + $comunas = array_merge($comunas, $this->fetchComunasByProvincia($redisService, $comunaRepository, $provincia->id)); + } + } catch (EmptyRedis) { + try { + $provincias = $provinciaRepository->fetchByRegion($region_id); + usort($provincias, function (Model\Provincia $a, Model\Provincia $b) { + return strcmp($a->descripcion, $b->descripcion); + }); + $this->saveRedis($redisService, $redisKey, $provincias, 60 * 60 * 24 * 30); + foreach ($provincias as $provincia) { + $comunas = array_merge($comunas, $this->fetchComunasByProvincia($redisService, $comunaRepository, $provincia->id)); + } + } catch (EmptyResult) {} + } finally { + usort($comunas, function ($a, $b) { + return strcmp($a->descripcion, $b->descripcion); + }); + $output['comunas'] = $comunas; + } + + return $this->withJson($response, $output); + } + + protected function fetchComunasByProvincia(Service\Redis $redisService, Repository\Comuna $comunaRepository, int $provincia_id): array + { + $redisKey = "comunas:provincia:{$provincia_id}"; + try { + $comunas = $this->fetchRedis($redisService, $redisKey); + } catch (EmptyRedis) { + $comunas = $comunaRepository->fetchByProvincia($provincia_id); + usort($comunas, function (Model\Comuna $a, Model\Comuna $b) { + return strcmp($a->descripcion, $b->descripcion); + }); + $this->saveRedis($redisService, $redisKey, $comunas, 60 * 60 * 24 * 30); + } + return $comunas; + } } From d02732b0dd4a37d469c83f71ae361b91b06b075e Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Mon, 24 Feb 2025 21:36:03 -0300 Subject: [PATCH 8/8] NotAllowed exception catch --- app/setup/middlewares/96_not_found.php | 1 + app/src/Middleware/NotAllowed.php | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 app/src/Middleware/NotAllowed.php diff --git a/app/setup/middlewares/96_not_found.php b/app/setup/middlewares/96_not_found.php index 14d5c25..e02acd1 100644 --- a/app/setup/middlewares/96_not_found.php +++ b/app/setup/middlewares/96_not_found.php @@ -1,3 +1,4 @@ add($app->getContainer()->get(Incoviba\Middleware\NotFound::class)); +$app->add($app->getContainer()->get(Incoviba\Middleware\NotAllowed::class)); $app->add($app->getContainer()->get(Incoviba\Middleware\Errors::class)); diff --git a/app/src/Middleware/NotAllowed.php b/app/src/Middleware/NotAllowed.php new file mode 100644 index 0000000..ae17038 --- /dev/null +++ b/app/src/Middleware/NotAllowed.php @@ -0,0 +1,22 @@ +handle($request); + } catch (HttpMethodNotAllowedException) { + return $this->responseFactory->createResponse(405, 'Method Not Allowed'); + } + } +}
Dirección{{$proyecto->direccion()}}{{$proyecto->direccion()}}
Inmobiliaria