diff --git a/api/common/Service/TiposCambios.php b/api/common/Service/TiposCambios.php index be9f88d..7319c30 100644 --- a/api/common/Service/TiposCambios.php +++ b/api/common/Service/TiposCambios.php @@ -20,27 +20,19 @@ class TiposCambios { $this->base_url = $api_url; $this->key = $api_key; } - public function get(string $fecha, int $moneda_id) { - $fecha = Carbon::parse($fecha); - $moneda = $this->factory->find(Moneda::class)->one($moneda_id); - if ($moneda->codigo == 'USD') { - if ($fecha->weekday() == 0) { - $fecha = $fecha->subWeek()->weekday(5); - } - if ($fecha->weekday() == 6) { - $fecha = $fecha->weekday(5); - } + protected function getWeekday(\DateTimeInterface $fecha) { + if ($fecha->weekday() == 0) { + return $fecha->subWeek()->weekday(5); } - $cambio = $moneda->cambio($fecha); - if ($cambio) { - if ($cambio->desde()->id != $moneda->id) { - return 1 / $cambio->valor; - } - return $cambio->valor; + if ($fecha->weekday() == 6) { + return $fecha->weekday(5); } + return $fecha; + } + protected function getValor(\DateTimeInterface $fecha, string $moneda_codigo) { $data = [ 'fecha' => $fecha->format('Y-m-d'), - 'desde' => $moneda->codigo + 'desde' => $moneda_codigo ]; $headers = [ 'Authorization' => 'Bearer ' . $this->key @@ -60,7 +52,23 @@ class TiposCambios { return null; } $result = json_decode($response->getBody()); - $valor = $result->serie[0]->valor; + return $result->serie[0]->valor; + } + public function get(string $fecha, int $moneda_id) { + $fecha = Carbon::parse($fecha); + $moneda = $this->factory->find(Moneda::class)->one($moneda_id); + if ($moneda->codigo == 'USD') { + $fecha = $this->getWeekday($fecha); + } + // If a value exists in the database + $cambio = $moneda->cambio($fecha); + if ($cambio) { + if ($cambio->desde()->id != $moneda->id) { + return 1 / $cambio->valor; + } + return $cambio->valor; + } + $valor = $this->getValor($fecha, $moneda->codigo); $data = [ 'fecha' => $fecha->format('Y-m-d H:i:s'), 'desde_id' => $moneda->id, diff --git a/api/src/Categoria.php b/api/src/Categoria.php index be3cd78..8680751 100644 --- a/api/src/Categoria.php +++ b/api/src/Categoria.php @@ -18,6 +18,11 @@ class Categoria extends Model { public function cuentas() { if ($this->cuentas === null) { $this->cuentas = $this->parentOf(Cuenta::class, [Model::CHILD_KEY => 'categoria_id']); + if ($this->cuentas !== null) { + usort($this->cuentas, function($a, $b) { + return strcmp($a->nombre, $b->nombre); + }); + } } return $this->cuentas; } diff --git a/ui/public/assets/scripts/cuentas.show.js b/ui/public/assets/scripts/cuentas.show.js index cc551ab..525327e 100644 --- a/ui/public/assets/scripts/cuentas.show.js +++ b/ui/public/assets/scripts/cuentas.show.js @@ -50,7 +50,7 @@ class Transaccion { ).append( $('').attr('class', 'right aligned').html(format.format(saldo)) ).append( - $('').attr('class', 'right aligned')/*.append( + $('').attr('class', 'right aligned').append( $('').attr('class', 'ui tiny circular icon button').append( $('').attr('class', 'edit icon') ).click((e) => { @@ -58,7 +58,7 @@ class Transaccion { this.edit() return false }) - )*/.append( + ).append( $('').attr('class', 'ui tiny circular red icon button').append( $('').attr('class', 'remove icon') ).click((e) => { @@ -71,7 +71,15 @@ class Transaccion { } edit() { const form = this.modal.find('form') - form.find("[name='fecha']") + form.trigger('reset') + form.find("[name='id']").val(this.id) + form.find(".ui.calendar").calendar('set date', new Date(this.fecha.fecha)) + form.find("[name='cuenta']").dropdown('set selected', (this.isDebito()) ? this.credito_id : this.credito_id) + form.find("[name='glosa']").val(this.glosa) + form.find("[name='detalle']").val(this.detalle) + form.find("[name='valor']").val(((this.isDebito()) ? -1 : 1) * this.valor.valor) + modalToEdit(this.modal) + this.modal.modal('show') } remove() { sendDelete(_urls.api + '/transaccion/' + this.id + '/delete').then(() => { @@ -90,6 +98,7 @@ const transacciones = { get: function() { return { transacciones: () => { + this.draw().loading() let promises = [] sendGet(_urls.api + '/cuenta/' + this.cuenta_id + '/transacciones/amount').then((data) => { if (data.cuenta === null) { @@ -128,10 +137,10 @@ const transacciones = { return (new Date(b.fecha)) - (new Date(a.fecha)) }) }).then(() => { - this.draw() + this.draw().table() }) } else { - this.draw() + this.draw().table() } }) }) @@ -161,13 +170,30 @@ const transacciones = { } }, draw: function() { - const format = Intl.NumberFormat('es-CL', {style: 'currency', currency: this.cuenta.moneda.codigo}) - const parent = $(this.id) - parent.html('') - $.each(this.transacciones, (i, el) => { - parent.append(el.draw({saldo: this.saldo, format: format})) - this.saldo = this.saldo + parseInt(el.valor.valor) * ((el.isIncrement()) ? 1 : -1) - }) + return { + loading: () => { + const parent = $(this.id) + parent.html('') + parent.append( + $('').append( + $('').attr('colspan', 7).append( + $('
').attr('class', 'ui active dimmer').append( + $('
').attr('class', 'ui indeterminate elastic text loader').html('Buscando los datos') + ) + ) + ) + ) + }, + table: () => { + const format = Intl.NumberFormat('es-CL', {style: 'currency', currency: this.cuenta.moneda.codigo}) + const parent = $(this.id) + parent.html('') + $.each(this.transacciones, (i, el) => { + parent.append(el.draw({saldo: this.saldo, format: format})) + this.saldo = this.saldo + parseInt(el.valor.valor) * ((el.isIncrement()) ? 1 : -1) + }) + } + } }, add: function() { return { @@ -202,6 +228,27 @@ const transacciones = { } } }, + edit: function() { + const id = $("[name='id']").val() + const fecha = $("[name='fecha']").val() + const valor = $("[name='valor']").val() + const cuenta = $("[name='cuenta']").val() + const data = JSON.stringify({ + debito_id: (valor < 0) ? this.cuenta_id : cuenta, + credito_id: (valor < 0) ? cuenta : this.cuenta_id, + fecha, + glosa, + detalle, + valor: (valor < 0) ? -valor : valor + }) + return sendPut(_urls.api + '/transaccion/' + id + '/edit', data).then(() => { + this.modal.modal('hide') + this.get().transacciones() + }) + }, + refresh: function () { + this.get().transacciones() + }, build: function() { return { modal: () => { @@ -212,7 +259,12 @@ const transacciones = { }) this.modal.find('form').submit((e) => { e.preventDefault() - this.add().exec() + const add = $(e.currentTarget).find('.plus.icon') + if (add.length > 0) { + this.add().exec() + } else { + this.edit() + } return false }) this.modal.find('.ui.calendar').calendar({ @@ -234,7 +286,10 @@ const transacciones = { }, setup: function() { this.build().modal() - $(this.id).parent().find('.ui.button').click(() => { + $(this.id).parent().find('#refresh').click(() => { + this.refresh() + }) + $(this.id).parent().find('#add').click(() => { this.add().show() }) this.get().transacciones() diff --git a/ui/public/assets/scripts/home.js b/ui/public/assets/scripts/home.js index 382b948..6f23a51 100644 --- a/ui/public/assets/scripts/home.js +++ b/ui/public/assets/scripts/home.js @@ -39,7 +39,20 @@ class Cuenta { } tr.append(td) }) - $("[data-id='" + this.categoria_id + "'][data-class='categoria']").after(tr) + const prev = this.prev() + prev.after(tr) + } + prev() { + let prev = $("[data-id='" + this.categoria_id + "'][data-class='categoria']") + let n = 0 + while (prev.next().attr('data-class') === 'cuenta') { + prev = prev.next() + n ++; + if (n >= 100) { + return prev + } + } + return prev } remove() { $("[data-id='" + this.id + "'][data-class='cuenta']").remove() diff --git a/ui/resources/views/cuentas/show.blade.php b/ui/resources/views/cuentas/show.blade.php index 41037b6..f2614e5 100644 --- a/ui/resources/views/cuentas/show.blade.php +++ b/ui/resources/views/cuentas/show.blade.php @@ -27,23 +27,16 @@ Saldo - + - - - -
-
- Buscando los datos -
-
- - - +