Add option to ignore financial transaction when calculating the balance
This commit is contained in:
parent
a30d0d4453
commit
7d5155bef6
6 changed files with 68 additions and 16 deletions
|
@ -1,10 +1,14 @@
|
||||||
class FinancialTransactionClass < ApplicationRecord
|
class FinancialTransactionClass < ApplicationRecord
|
||||||
has_many :financial_transaction_types, dependent: :destroy
|
has_many :financial_transaction_types, dependent: :destroy
|
||||||
has_many :supplier_category, dependent: :restrict_with_exception
|
has_many :supplier_category, dependent: :restrict_with_exception
|
||||||
|
has_many :financial_transactions, through: :financial_transaction_types
|
||||||
|
has_many :ordergroups, -> { distinct }, through: :financial_transactions
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates_uniqueness_of :name
|
validates_uniqueness_of :name
|
||||||
|
|
||||||
|
after_save :update_balance_of_ordergroups
|
||||||
|
|
||||||
scope :sorted, -> { order(name: :asc) }
|
scope :sorted, -> { order(name: :asc) }
|
||||||
|
|
||||||
def self.has_multiple_classes
|
def self.has_multiple_classes
|
||||||
|
@ -18,4 +22,10 @@ class FinancialTransactionClass < ApplicationRecord
|
||||||
I18n.t('activerecord.attributes.financial_transaction.amount')
|
I18n.t('activerecord.attributes.financial_transaction.amount')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_balance_of_ordergroups
|
||||||
|
ordergroups.each { |og| og.update_balance! }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,7 @@ class FinancialTransactionType < ApplicationRecord
|
||||||
belongs_to :financial_transaction_class
|
belongs_to :financial_transaction_class
|
||||||
belongs_to :bank_account, optional: true
|
belongs_to :bank_account, optional: true
|
||||||
has_many :financial_transactions, dependent: :restrict_with_exception
|
has_many :financial_transactions, dependent: :restrict_with_exception
|
||||||
|
has_many :ordergroups, -> { distinct }, through: :financial_transactions
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
validates_uniqueness_of :name
|
validates_uniqueness_of :name
|
||||||
|
@ -9,6 +10,7 @@ class FinancialTransactionType < ApplicationRecord
|
||||||
validates_format_of :name_short, :with => /\A[A-Za-z]*\z/
|
validates_format_of :name_short, :with => /\A[A-Za-z]*\z/
|
||||||
validates :financial_transaction_class, presence: true
|
validates :financial_transaction_class, presence: true
|
||||||
|
|
||||||
|
after_save :update_balance_of_ordergroups
|
||||||
before_destroy :restrict_deleting_last_financial_transaction_type
|
before_destroy :restrict_deleting_last_financial_transaction_type
|
||||||
|
|
||||||
scope :with_name_short, -> { where.not(name_short: [nil, '']) }
|
scope :with_name_short, -> { where.not(name_short: [nil, '']) }
|
||||||
|
@ -27,4 +29,10 @@ class FinancialTransactionType < ApplicationRecord
|
||||||
def restrict_deleting_last_financial_transaction_type
|
def restrict_deleting_last_financial_transaction_type
|
||||||
raise I18n.t('model.financial_transaction_type.no_delete_last') if FinancialTransactionType.count == 1
|
raise I18n.t('model.financial_transaction_type.no_delete_last') if FinancialTransactionType.count == 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def update_balance_of_ordergroups
|
||||||
|
ordergroups.each { |og| og.update_balance! }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -103,7 +103,11 @@ class Ordergroup < Group
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_balance!
|
def update_balance!
|
||||||
update_attribute :account_balance, financial_transactions.sum('amount')
|
new_account_balance = financial_transactions
|
||||||
|
.joins(financial_transaction_type: [:financial_transaction_class])
|
||||||
|
.where({ financial_transaction_classes: { ignore_for_account_balance: false} })
|
||||||
|
.sum(:amount)
|
||||||
|
update_attribute :account_balance, new_account_balance
|
||||||
end
|
end
|
||||||
|
|
||||||
def avg_jobs_per_euro
|
def avg_jobs_per_euro
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
%h3= @financial_transaction_class.new_record? ? t('.title_new') : t('.title_edit')
|
%h3= @financial_transaction_class.new_record? ? t('.title_new') : t('.title_edit')
|
||||||
.modal-body
|
.modal-body
|
||||||
= f.input :name
|
= f.input :name
|
||||||
|
= f.input :ignore_for_account_balance
|
||||||
.modal-footer
|
.modal-footer
|
||||||
= link_to t('ui.close'), '#', class: 'btn', data: {dismiss: 'modal'}
|
= link_to t('ui.close'), '#', class: 'btn', data: {dismiss: 'modal'}
|
||||||
= f.submit class: 'btn btn-primary'
|
= f.submit class: 'btn btn-primary'
|
||||||
|
|
|
@ -101,6 +101,7 @@ ActiveRecord::Schema.define(version: 2021_02_05_090257) do
|
||||||
|
|
||||||
create_table "financial_transaction_classes", id: :integer, force: :cascade do |t|
|
create_table "financial_transaction_classes", id: :integer, force: :cascade do |t|
|
||||||
t.string "name", null: false
|
t.string "name", null: false
|
||||||
|
t.boolean "ignore_for_account_balance", default: false, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "financial_transaction_types", id: :integer, force: :cascade do |t|
|
create_table "financial_transaction_types", id: :integer, force: :cascade do |t|
|
||||||
|
|
|
@ -8,23 +8,51 @@ describe Ordergroup do
|
||||||
let(:ftt3) { create :financial_transaction_type, financial_transaction_class: ftc2 }
|
let(:ftt3) { create :financial_transaction_type, financial_transaction_class: ftc2 }
|
||||||
let(:user) { create :user, groups:[create(:ordergroup)] }
|
let(:user) { create :user, groups:[create(:ordergroup)] }
|
||||||
|
|
||||||
it 'has correct FinancialTransactionClass sums' do
|
context 'with financial transactions' do
|
||||||
og = user.ordergroup
|
before do
|
||||||
og.add_financial_transaction!(-1, '-1', user, ftt1)
|
og = user.ordergroup
|
||||||
og.add_financial_transaction!(2, '2', user, ftt1)
|
og.add_financial_transaction!(-1, '-1', user, ftt1)
|
||||||
og.add_financial_transaction!(3, '3', user, ftt1)
|
og.add_financial_transaction!(2, '2', user, ftt1)
|
||||||
|
og.add_financial_transaction!(3, '3', user, ftt1)
|
||||||
|
|
||||||
og.add_financial_transaction!(-10, '-10', user, ftt2)
|
og.add_financial_transaction!(-10, '-10', user, ftt2)
|
||||||
og.add_financial_transaction!(20, '20', user, ftt2)
|
og.add_financial_transaction!(20, '20', user, ftt2)
|
||||||
og.add_financial_transaction!(30, '30', user, ftt2)
|
og.add_financial_transaction!(30, '30', user, ftt2)
|
||||||
|
|
||||||
og.add_financial_transaction!(-100, '-100', user, ftt3)
|
og.add_financial_transaction!(-100, '-100', user, ftt3)
|
||||||
og.add_financial_transaction!(200, '200', user, ftt3)
|
og.add_financial_transaction!(200, '200', user, ftt3)
|
||||||
og.add_financial_transaction!(300, '300', user, ftt3)
|
og.add_financial_transaction!(300, '300', user, ftt3)
|
||||||
|
end
|
||||||
|
|
||||||
result = Ordergroup.include_transaction_class_sum.where(id: og).first
|
it 'has correct account balance' do
|
||||||
expect(result["sum_of_class_#{ftc1.id}"]).to eq 4
|
og = user.ordergroup
|
||||||
expect(result["sum_of_class_#{ftc2.id}"]).to eq 440
|
expect(og.account_balance).to eq 444
|
||||||
|
|
||||||
|
ftc1.reload
|
||||||
|
ftc1.update_attributes!(ignore_for_account_balance: true)
|
||||||
|
|
||||||
|
og.reload
|
||||||
|
expect(og.account_balance).to eq 440
|
||||||
|
|
||||||
|
ftt2.reload
|
||||||
|
ftt2.update_attributes!(financial_transaction_class: ftc1)
|
||||||
|
|
||||||
|
og.reload
|
||||||
|
expect(og.account_balance).to eq 400
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'has correct FinancialTransactionClass sums' do
|
||||||
|
og = user.ordergroup
|
||||||
|
result = Ordergroup.include_transaction_class_sum.where(id: og).first
|
||||||
|
expect(result["sum_of_class_#{ftc1.id}"]).to eq 4
|
||||||
|
expect(result["sum_of_class_#{ftc2.id}"]).to eq 440
|
||||||
|
|
||||||
|
ftt2.reload
|
||||||
|
ftt2.update_attributes!(financial_transaction_class: ftc1)
|
||||||
|
|
||||||
|
result = Ordergroup.include_transaction_class_sum.where(id: og).first
|
||||||
|
expect(result["sum_of_class_#{ftc1.id}"]).to eq 44
|
||||||
|
expect(result["sum_of_class_#{ftc2.id}"]).to eq 400
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue