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']))