From d4923b44147a765f6ce98048fb241585cb2b9606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=BCneyt=20=C5=9Eent=C3=BCrk?= Date: Mon, 8 Jun 2020 19:08:13 +0300 Subject: [PATCH 1/3] Reconciliations multi currency and calculate fixed. --- app/Models/Banking/Transaction.php | 44 +++++++++++++ .../assets/js/components/AkauntingMoney.vue | 10 ++- .../js/views/banking/reconciliations.js | 20 ++++-- resources/lang/en-GB/reconciliations.php | 1 + .../banking/reconciliations/create.blade.php | 14 +++-- .../banking/reconciliations/edit.blade.php | 62 ++++++++++--------- .../views/partials/form/money_group.blade.php | 4 ++ 7 files changed, 118 insertions(+), 37 deletions(-) diff --git a/app/Models/Banking/Transaction.php b/app/Models/Banking/Transaction.php index 6f85c8255..a0eb5de63 100644 --- a/app/Models/Banking/Transaction.php +++ b/app/Models/Banking/Transaction.php @@ -96,6 +96,28 @@ class Transaction extends Model return $query->whereIn($this->table . '.type', (array) $types); } + /** + * Scope to include only income. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIncome($query) + { + return $query->where($this->table . '.type', '=', 'income'); + } + + /** + * Scope to include only expense. + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeExpense($query) + { + return $query->where($this->table . '.type', '=', 'expense'); + } + /** * Get only transfers. * @@ -196,6 +218,11 @@ class Transaction extends Model return $query->where('reconciled', 0); } + public function onCloning($src, $child = null) + { + $this->document_id = null; + } + /** * Convert amount to double. * @@ -218,6 +245,23 @@ class Transaction extends Model $this->attributes['currency_rate'] = (double) $value; } + /** + * Convert amount to double. + * + * @param string $value + * @return void + */ + public function getPriceAttribute($value) + { + if ($this->account->currency_code != $this->currency_code) { + $this->default_currency_code = $this->account->currency_code; + + return $this->convertFromDefault($this->amount, $this->currency_code, $this->currency_rate); + } + + return $this->amount; + } + /** * Get the current balance. * diff --git a/resources/assets/js/components/AkauntingMoney.vue b/resources/assets/js/components/AkauntingMoney.vue index 2b1f7d6f7..692f09281 100644 --- a/resources/assets/js/components/AkauntingMoney.vue +++ b/resources/assets/js/components/AkauntingMoney.vue @@ -10,7 +10,7 @@ - +
@@ -133,10 +133,14 @@ export default { change() { //this.$emit('change', this.model); //this.$emit('interface', this.model); + + this.$emit('input', this.model); }, input(event) { this.model = event; + this.$emit('input', event); + //this.$emit('change', this.model); //this.$emit('interface', this.model); } @@ -144,6 +148,10 @@ export default { watch: { dynamicCurrency: function (currency) { + if (!currency) { + return; + } + this.money = { decimal: currency.decimal_mark, thousands: currency.thousands_separator, diff --git a/resources/assets/js/views/banking/reconciliations.js b/resources/assets/js/views/banking/reconciliations.js index 89154d550..2985c9953 100644 --- a/resources/assets/js/views/banking/reconciliations.js +++ b/resources/assets/js/views/banking/reconciliations.js @@ -40,7 +40,9 @@ const app = new Vue({ }, mounted() { - this.totals.closing_balance = parseFloat(document.getElementById('closing_balance').value); + if (document.getElementById('closing_balance') != null) { + this.totals.closing_balance = parseFloat(document.getElementById('closing_balance').value); + } }, methods:{ @@ -59,10 +61,13 @@ const app = new Vue({ let transactions = this.form.transactions; let cleared_amount = 0; + let closing_balance = parseFloat(this.form.closing_balance); let difference = 0; let income_total = 0; let expense_total = 0; + this.totals.closing_balance = closing_balance; + if (transactions) { // get all transactions. Object.keys(transactions).forEach(function(transaction) { @@ -79,10 +84,17 @@ const app = new Vue({ } }); - cleared_amount = parseFloat(this.form.opening_balance) + parseFloat(income_total - expense_total); + + let transaction_total = income_total - expense_total; + + cleared_amount = parseFloat(this.form.opening_balance) + transaction_total; } - difference = parseFloat(this.form.closing_balance) - cleared_amount; + if (cleared_amount > 0) { + difference = parseFloat(this.form.closing_balance) - parseFloat(cleared_amount); + } else { + difference = parseFloat(this.form.closing_balance) + parseFloat(cleared_amount); + } if (difference != 0) { this.difference = 'table-danger'; @@ -92,7 +104,7 @@ const app = new Vue({ this.reconcile = false; } - this.totals.cleared_amount = cleared_amount; + this.totals.cleared_amount = parseFloat(cleared_amount); this.totals.difference = difference; }, diff --git a/resources/lang/en-GB/reconciliations.php b/resources/lang/en-GB/reconciliations.php index 8136223e9..967621945 100644 --- a/resources/lang/en-GB/reconciliations.php +++ b/resources/lang/en-GB/reconciliations.php @@ -4,6 +4,7 @@ return [ 'reconcile' => 'Reconcile', 'reconciled' => 'Reconciled', + 'opening_balance' => 'Opening Balance', 'closing_balance' => 'Closing Balance', 'unreconciled' => 'Unreconciled', 'transactions' => 'Transactions', diff --git a/resources/views/banking/reconciliations/create.blade.php b/resources/views/banking/reconciliations/create.blade.php index 2dbb5c4f7..4bed571c3 100644 --- a/resources/views/banking/reconciliations/create.blade.php +++ b/resources/views/banking/reconciliations/create.blade.php @@ -16,11 +16,11 @@
- {{ Form::dateGroup('started_at', trans('reconciliations.start_date'), 'calendar', ['id' => 'started_at', 'class' => 'form-control datepicker', 'required' => 'required', 'date-format' => 'Y-m-d', 'autocomplete' => 'off'], request('started_at'), 'col-xl-3') }} + {{ Form::dateGroup('started_at', trans('reconciliations.start_date'), 'calendar', ['id' => 'started_at', 'class' => 'form-control datepicker', 'required' => 'required', 'date-format' => 'Y-m-d', 'autocomplete' => 'off'], request('started_at', Date::now()->firstOfMonth()->toDateString()), 'col-xl-3') }} - {{ Form::dateGroup('ended_at', trans('reconciliations.end_date'), 'calendar', ['id' => 'ended_at', 'class' => 'form-control datepicker', 'required' => 'required', 'date-format' => 'Y-m-d', 'autocomplete' => 'off'], request('ended_at'), 'col-xl-3') }} + {{ Form::dateGroup('ended_at', trans('reconciliations.end_date'), 'calendar', ['id' => 'ended_at', 'class' => 'form-control datepicker', 'required' => 'required', 'date-format' => 'Y-m-d', 'autocomplete' => 'off'], request('ended_at', Date::now()->endOfMonth()->toDateString()), 'col-xl-3') }} - {{ Form::moneyGroup('closing_balance', trans('reconciliations.closing_balance'), 'balance-scale', ['required' => 'required', 'autofocus' => 'autofocus', 'currency' => $currency], request('closing_balance', 0.00), 'col-xl-2') }} + {{ Form::moneyGroup('closing_balance', trans('reconciliations.closing_balance'), 'balance-scale', ['required' => 'required', 'autofocus' => 'autofocus', 'currency' => $currency, 'dynamic-currency' => 'currency', 'input' => 'onCalculate'], request('closing_balance', 0.00), 'col-xl-2') }} {{ Form::selectAddNewGroup('account_id', trans_choice('general.accounts', 1), 'university', $accounts, request('account_id', setting('default.account')), ['required' => 'required', 'path' => route('modals.accounts.create'), 'change' => 'onChangeAccount'], 'col-xl-2') }} @@ -83,7 +83,7 @@ @endif
- {{ Form::checkbox($item->type . '_' . $item->id, $item->amount, $item->reconciled, [ + {{ Form::checkbox($item->type . '_' . $item->id, $item->price, $item->reconciled, [ 'data-field' => 'transactions', 'v-model' => 'form.transactions.' . $item->type . '_' . $item->id, 'id' => 'transaction-' . $item->id . '-'. $item->type, @@ -100,6 +100,12 @@ @if ($transactions->count()) + + + +
{{ trans('reconciliations.opening_balance') }}: + @money($opening_balance, $account->currency_code, true) +
{{ trans('reconciliations.closing_balance') }}: diff --git a/resources/views/banking/reconciliations/edit.blade.php b/resources/views/banking/reconciliations/edit.blade.php index b5227c98f..3a2df5943 100644 --- a/resources/views/banking/reconciliations/edit.blade.php +++ b/resources/views/banking/reconciliations/edit.blade.php @@ -70,34 +70,40 @@
@if ($transactions->count()) - - - - - - - - - - - - - - - -
{{ trans('reconciliations.closing_balance') }}: - {{ Form::moneyGroup('closing_balance_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.closing_balance', 'currency' => $currency, 'masked' => 'true'], $reconciliation->closing_balance, 'text-right d-none') }} - - @money($reconciliation->closing_balance, $account->currency_code, true) -
{{ trans('reconciliations.cleared_amount') }}: - {{ Form::moneyGroup('cleared_amount_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.cleared_amount', 'currency' => $currency, 'masked' => 'true'], 0.00, 'text-right d-none') }} - - @money(0, $account->currency_code, true) -
{{ trans('general.difference') }}: - {{ Form::moneyGroup('difference_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.difference', 'currency' => $currency, 'masked' => 'true'], 0.00, 'text-right d-none') }} - - @money(0, $account->currency_code, true) -
+ + + + + + + + + + + + + + + + + + + +
{{ trans('reconciliations.opening_balance') }}: + @money($opening_balance, $account->currency_code, true) +
{{ trans('reconciliations.closing_balance') }}: + {{ Form::moneyGroup('closing_balance_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.closing_balance', 'currency' => $currency, 'masked' => 'true'], $reconciliation->closing_balance, 'text-right d-none') }} + + @money($reconciliation->closing_balance, $account->currency_code, true) +
{{ trans('reconciliations.cleared_amount') }}: + {{ Form::moneyGroup('cleared_amount_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.cleared_amount', 'currency' => $currency, 'masked' => 'true'], 0.00, 'text-right d-none') }} + + @money(0, $account->currency_code, true) +
{{ trans('general.difference') }}: + {{ Form::moneyGroup('difference_total', '', '', ['disabled' => true, 'required' => 'required', 'v-model' => 'totals.difference', 'currency' => $currency, 'masked' => 'true'], 0.00, 'text-right d-none') }} + + @money(0, $account->currency_code, true) +
@endif
diff --git a/resources/views/partials/form/money_group.blade.php b/resources/views/partials/form/money_group.blade.php index b01366b58..d5e438e0c 100644 --- a/resources/views/partials/form/money_group.blade.php +++ b/resources/views/partials/form/money_group.blade.php @@ -49,6 +49,10 @@ @change="{{ $attributes['change'] }}($event)" @endif + @if (!empty($attributes['input'])) + @input="{{ $attributes['input'] }}" + @endif + @if (!empty($attributes['v-model'])) @interface="{{ $attributes['v-model'] . ' = $event' }}" @elseif (!empty($attributes['data-field'])) From 7e22facc2a60a6a6c6becd238d5c7b69b42949f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=BCneyt=20=C5=9Eent=C3=BCrk?= Date: Mon, 8 Jun 2020 23:40:09 +0300 Subject: [PATCH 2/3] Transaction price convert changed. --- app/Models/Banking/Transaction.php | 44 ++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/app/Models/Banking/Transaction.php b/app/Models/Banking/Transaction.php index a0eb5de63..99bc0d84b 100644 --- a/app/Models/Banking/Transaction.php +++ b/app/Models/Banking/Transaction.php @@ -40,6 +40,8 @@ class Transaction extends Model */ public $cloneable_relations = ['recurring']; + public static $currencies; + public function account() { return $this->belongsTo('App\Models\Banking\Account')->withDefault(['name' => trans('general.na')]); @@ -248,18 +250,44 @@ class Transaction extends Model /** * Convert amount to double. * - * @param string $value - * @return void + * @return float */ - public function getPriceAttribute($value) + public function getPriceAttribute() { - if ($this->account->currency_code != $this->currency_code) { - $this->default_currency_code = $this->account->currency_code; - - return $this->convertFromDefault($this->amount, $this->currency_code, $this->currency_rate); + if (empty($this->currencies)) { + $this->currencies = \App\Models\Setting\Currency::enabled()->pluck('rate', 'code')->toArray(); } - return $this->amount; + $amount = $this->amount; + + // Convert amount if not same currency + if ($this->account->currency_code != $this->currency_code) { + $default_currency = setting('default.currency', 'USD'); + + $default_amount = $this->amount; + + if ($default_currency != $this->currency_code) { + $default_amount_model = new Transaction(); + + $default_amount_model->default_currency_code = $default_currency; + $default_amount_model->amount = $this->amount; + $default_amount_model->currency_code = $this->currency_code; + $default_amount_model->currency_rate = $this->currency_rate; + + $default_amount = $default_amount_model->getAmountConvertedToDefault(); + } + + $transfer_amount = new Transaction(); + + $transfer_amount->default_currency_code = $this->currency_code; + $transfer_amount->amount = $default_amount; + $transfer_amount->currency_code = $this->account->currency_code; + $transfer_amount->currency_rate = $this->currencies[$this->account->currency_code]; + + $amount = $transfer_amount->getAmountConvertedFromDefault(); + } + + return $amount; } /** From a5c5713c9142a48a792d7a01073ddca6373b4f9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=BCneyt=20=C5=9Eent=C3=BCrk?= Date: Mon, 8 Jun 2020 23:53:47 +0300 Subject: [PATCH 3/3] reconciliations blade files.. --- .../views/banking/reconciliations/create.blade.php | 10 ++++++++-- resources/views/banking/reconciliations/edit.blade.php | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/resources/views/banking/reconciliations/create.blade.php b/resources/views/banking/reconciliations/create.blade.php index ad5089a55..4bed571c3 100644 --- a/resources/views/banking/reconciliations/create.blade.php +++ b/resources/views/banking/reconciliations/create.blade.php @@ -20,7 +20,7 @@ {{ Form::dateGroup('ended_at', trans('reconciliations.end_date'), 'calendar', ['id' => 'ended_at', 'class' => 'form-control datepicker', 'required' => 'required', 'date-format' => 'Y-m-d', 'autocomplete' => 'off'], request('ended_at', Date::now()->endOfMonth()->toDateString()), 'col-xl-3') }} - {{ Form::moneyGroup('closing_balance', trans('reconciliations.closing_balance'), 'balance-scale', ['required' => 'required', 'autofocus' => 'autofocus', 'currency' => $currency, 'dynamic-currency' => 'currency'], request('closing_balance', 0.00), 'col-xl-2') }} + {{ Form::moneyGroup('closing_balance', trans('reconciliations.closing_balance'), 'balance-scale', ['required' => 'required', 'autofocus' => 'autofocus', 'currency' => $currency, 'dynamic-currency' => 'currency', 'input' => 'onCalculate'], request('closing_balance', 0.00), 'col-xl-2') }} {{ Form::selectAddNewGroup('account_id', trans_choice('general.accounts', 1), 'university', $accounts, request('account_id', setting('default.account')), ['required' => 'required', 'path' => route('modals.accounts.create'), 'change' => 'onChangeAccount'], 'col-xl-2') }} @@ -83,7 +83,7 @@ @endif
- {{ Form::checkbox($item->type . '_' . $item->id, $item->amount, $item->reconciled, [ + {{ Form::checkbox($item->type . '_' . $item->id, $item->price, $item->reconciled, [ 'data-field' => 'transactions', 'v-model' => 'form.transactions.' . $item->type . '_' . $item->id, 'id' => 'transaction-' . $item->id . '-'. $item->type, @@ -100,6 +100,12 @@ @if ($transactions->count()) + + + +
{{ trans('reconciliations.opening_balance') }}: + @money($opening_balance, $account->currency_code, true) +
{{ trans('reconciliations.closing_balance') }}: diff --git a/resources/views/banking/reconciliations/edit.blade.php b/resources/views/banking/reconciliations/edit.blade.php index 3a2df5943..dba9f1155 100644 --- a/resources/views/banking/reconciliations/edit.blade.php +++ b/resources/views/banking/reconciliations/edit.blade.php @@ -55,7 +55,7 @@ @endif
- {{ Form::checkbox($item->type . '_' . $item->id, $item->amount, $item->reconciled, [ + {{ Form::checkbox($item->type . '_' . $item->id, $item->price, $item->reconciled, [ 'data-field' => 'transactions', 'v-model' => 'form.transactions.' . $item->type . '_' . $item->id, 'id' => 'transaction-' . $item->id . '-'. $item->type,