keepr 0.3.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +14 -10
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +4 -4
- data/Rakefile +3 -1
- data/ci/Gemfile-rails-4-2 +5 -5
- data/ci/Gemfile-rails-5-0 +5 -5
- data/ci/Gemfile-rails-5-1 +12 -0
- data/ci/Gemfile-rails-5-2 +12 -0
- data/ci/Gemfile-rails-6-0 +12 -0
- data/keepr.gemspec +15 -14
- data/lib/generators/keepr/migration/migration_generator.rb +5 -3
- data/lib/generators/keepr/migration/templates/migration.rb +27 -25
- data/lib/keepr.rb +8 -0
- data/lib/keepr/account.rb +66 -61
- data/lib/keepr/account_export.rb +10 -14
- data/lib/keepr/active_record_extension.rb +10 -8
- data/lib/keepr/contact_export.rb +6 -7
- data/lib/keepr/cost_center.rb +3 -1
- data/lib/keepr/group.rb +25 -16
- data/lib/keepr/groups_creator.rb +27 -14
- data/lib/keepr/groups_creator/{asset.txt → de/asset.txt} +0 -0
- data/lib/keepr/groups_creator/{liability.txt → de/liability.txt} +0 -0
- data/lib/keepr/groups_creator/{profit_and_loss.txt → de/profit_and_loss.txt} +0 -0
- data/lib/keepr/groups_creator/en/asset.txt +36 -0
- data/lib/keepr/groups_creator/en/liability.txt +28 -0
- data/lib/keepr/groups_creator/en/profit_and_loss.txt +31 -0
- data/lib/keepr/groups_creator/es/asset.txt +36 -0
- data/lib/keepr/groups_creator/es/liability.txt +28 -0
- data/lib/keepr/groups_creator/es/profit_and_loss.txt +31 -0
- data/lib/keepr/journal.rb +19 -16
- data/lib/keepr/journal_export.rb +10 -7
- data/lib/keepr/posting.rb +26 -21
- data/lib/keepr/tax.rb +4 -2
- data/lib/keepr/version.rb +3 -1
- data/spec/factories/account.rb +6 -4
- data/spec/factories/cost_center.rb +5 -3
- data/spec/factories/group.rb +5 -3
- data/spec/factories/tax.rb +7 -5
- data/spec/keepr/account_export_spec.rb +22 -19
- data/spec/keepr/account_spec.rb +92 -87
- data/spec/keepr/active_record_extension_spec.rb +38 -36
- data/spec/keepr/contact_export_spec.rb +17 -14
- data/spec/keepr/cost_center_spec.rb +9 -7
- data/spec/keepr/group_spec.rb +53 -49
- data/spec/keepr/groups_creator_spec.rb +13 -10
- data/spec/keepr/journal_export_spec.rb +54 -53
- data/spec/keepr/journal_spec.rb +48 -46
- data/spec/keepr/posting_spec.rb +25 -23
- data/spec/keepr/tax_spec.rb +21 -14
- data/spec/spec_helper.rb +13 -11
- data/spec/support/contact.rb +2 -0
- data/spec/support/document.rb +2 -0
- data/spec/support/ledger.rb +2 -0
- data/spec/support/spec_migration.rb +3 -1
- metadata +35 -28
- data/ci/Gemfile-rails-4-1 +0 -12
@@ -0,0 +1,31 @@
|
|
1
|
+
01. Ventas
|
2
|
+
02. Aumento o disminución de existencias de productos terminados y sin terminar
|
3
|
+
03. otro trabajo propio capitalizado
|
4
|
+
04. otros ingresos operativos
|
5
|
+
05. Costo de materiales
|
6
|
+
a) Gastos por materias primas, consumibles y suministros y por bienes adquiridos
|
7
|
+
b) Gastos por servicios adquiridos
|
8
|
+
06. Gastos de personal
|
9
|
+
a) Sueldos y salarios
|
10
|
+
b) Seguridad social y gastos de pensión y manutención.
|
11
|
+
de eso para pensiones
|
12
|
+
07. Depreciación
|
13
|
+
a) sobre activos intangibles y propiedades, planta y equipo
|
14
|
+
b) de los activos corrientes, en la medida en que estos excedan la depreciación habitual en la corporación
|
15
|
+
08. otros gastos operativos
|
16
|
+
09. Ingresos de inversiones
|
17
|
+
a) de los cuales de empresas afiliadas
|
18
|
+
10. Ingresos de otros valores y préstamos de activos financieros
|
19
|
+
a) de los cuales de empresas afiliadas
|
20
|
+
11. otros intereses e ingresos similares
|
21
|
+
a) de los cuales de empresas afiliadas
|
22
|
+
12. Depreciación de activos financieros y valores mantenidos como activo corriente
|
23
|
+
13. Intereses y gastos similares
|
24
|
+
de los cuales a empresas afiliadas
|
25
|
+
14. Resultados de las actividades comerciales ordinarias
|
26
|
+
15. Ingresos extraordinarios
|
27
|
+
16. Gastos extraordinarios
|
28
|
+
17. Resultado extraordinario
|
29
|
+
18. Impuestos sobre la renta y las ganancias
|
30
|
+
19. Otros impuestos
|
31
|
+
20. Superávit anual / déficit anual
|
data/lib/keepr/journal.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Keepr::Journal < ActiveRecord::Base
|
2
4
|
self.table_name = 'keepr_journals'
|
3
5
|
|
4
6
|
validates_presence_of :date
|
5
|
-
validates_uniqueness_of :number, :
|
7
|
+
validates_uniqueness_of :number, allow_blank: true
|
6
8
|
|
7
|
-
has_many :keepr_postings, -> { order(:
|
8
|
-
:
|
9
|
+
has_many :keepr_postings, -> { order(amount: :desc) },
|
10
|
+
class_name: 'Keepr::Posting', foreign_key: 'keepr_journal_id', dependent: :destroy
|
9
11
|
|
10
|
-
belongs_to :accountable, :
|
12
|
+
belongs_to :accountable, polymorphic: true
|
11
13
|
|
12
|
-
accepts_nested_attributes_for :keepr_postings, :
|
14
|
+
accepts_nested_attributes_for :keepr_postings, allow_destroy: true, reject_if: :all_blank
|
13
15
|
|
14
|
-
default_scope { order({:
|
16
|
+
default_scope { order({ date: :desc }, id: :desc) }
|
15
17
|
|
16
18
|
validate :validate_postings
|
17
19
|
|
@@ -31,7 +33,8 @@ class Keepr::Journal < ActiveRecord::Base
|
|
31
33
|
before_update :check_permanent
|
32
34
|
before_destroy :check_permanent
|
33
35
|
|
34
|
-
private
|
36
|
+
private
|
37
|
+
|
35
38
|
def existing_postings
|
36
39
|
keepr_postings.to_a.delete_if(&:marked_for_destruction?)
|
37
40
|
end
|
@@ -51,15 +54,15 @@ private
|
|
51
54
|
end
|
52
55
|
|
53
56
|
def check_permanent
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
return unless permanent_was
|
58
|
+
|
59
|
+
# If marked as permanent, no changes are allowed
|
60
|
+
errors.add :base, :changes_not_allowed
|
61
|
+
|
62
|
+
if ActiveRecord::VERSION::MAJOR < 5
|
63
|
+
false
|
64
|
+
else
|
65
|
+
throw :abort
|
63
66
|
end
|
64
67
|
end
|
65
68
|
end
|
data/lib/keepr/journal_export.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Keepr::JournalExport
|
2
|
-
def initialize(journals, header_options={}, &block)
|
4
|
+
def initialize(journals, header_options = {}, &block)
|
3
5
|
@journals = journals
|
4
6
|
@header_options = header_options
|
5
7
|
@block = block
|
@@ -13,12 +15,12 @@ class Keepr::JournalExport
|
|
13
15
|
export.to_file(filename)
|
14
16
|
end
|
15
17
|
|
16
|
-
private
|
18
|
+
private
|
17
19
|
|
18
20
|
def export
|
19
21
|
export = Datev::BookingExport.new(@header_options)
|
20
22
|
|
21
|
-
@journals.includes(:
|
23
|
+
@journals.includes(keepr_postings: :keepr_account).reorder(:date, :id).each do |journal|
|
22
24
|
to_datev(journal).each do |hash|
|
23
25
|
export << hash
|
24
26
|
end
|
@@ -29,19 +31,20 @@ private
|
|
29
31
|
|
30
32
|
def to_datev(journal)
|
31
33
|
main_posting = journal.keepr_postings.find { |p| p.keepr_account.debtor? || p.keepr_account.creditor? }
|
32
|
-
main_posting ||= journal.keepr_postings.
|
34
|
+
main_posting ||= journal.keepr_postings.max_by(&:amount)
|
33
35
|
|
34
|
-
journal.keepr_postings.sort_by { |p| [
|
36
|
+
journal.keepr_postings.sort_by { |p| [p.side == main_posting.side ? 1 : 0, -p.amount] }.map do |posting|
|
35
37
|
next if posting == main_posting
|
36
38
|
|
37
|
-
{
|
39
|
+
{
|
40
|
+
'Umsatz (ohne Soll/Haben-Kz)' => posting.amount,
|
38
41
|
'Soll/Haben-Kennzeichen' => 'S',
|
39
42
|
'Konto' => posting.debit? ? posting.keepr_account.number : main_posting.keepr_account.number,
|
40
43
|
'Gegenkonto (ohne BU-Schlüssel)' => posting.credit? ? posting.keepr_account.number : main_posting.keepr_account.number,
|
41
44
|
'BU-Schlüssel' => '40', # Steuerautomatik deaktivieren
|
42
45
|
'Belegdatum' => journal.date,
|
43
46
|
'Belegfeld 1' => journal.number,
|
44
|
-
'Buchungstext' => journal.subject.slice(0,60),
|
47
|
+
'Buchungstext' => journal.subject.slice(0, 60),
|
45
48
|
'Festschreibung' => journal.permanent
|
46
49
|
}.merge(@block ? @block.call(posting) : {})
|
47
50
|
end.compact
|
data/lib/keepr/posting.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Keepr::Posting < ActiveRecord::Base
|
2
4
|
self.table_name = 'keepr_postings'
|
3
5
|
|
4
6
|
validates_presence_of :keepr_account_id, :amount
|
5
7
|
validate :cost_center_validation
|
6
8
|
|
7
|
-
belongs_to :keepr_account, :
|
8
|
-
belongs_to :keepr_journal, :
|
9
|
-
belongs_to :keepr_cost_center, :
|
10
|
-
belongs_to :accountable, :
|
9
|
+
belongs_to :keepr_account, class_name: 'Keepr::Account'
|
10
|
+
belongs_to :keepr_journal, class_name: 'Keepr::Journal'
|
11
|
+
belongs_to :keepr_cost_center, class_name: 'Keepr::CostCenter'
|
12
|
+
belongs_to :accountable, polymorphic: true
|
11
13
|
|
12
14
|
SIDE_DEBIT = 'debit'
|
13
15
|
SIDE_CREDIT = 'credit'
|
@@ -17,19 +19,20 @@ class Keepr::Posting < ActiveRecord::Base
|
|
17
19
|
|
18
20
|
def side
|
19
21
|
@side || begin
|
20
|
-
(raw_amount
|
22
|
+
(raw_amount.negative? ? SIDE_CREDIT : SIDE_DEBIT) if raw_amount
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
26
|
def side=(value)
|
27
|
+
raise ArgumentError unless [SIDE_DEBIT, SIDE_CREDIT].include?(value)
|
28
|
+
|
25
29
|
@side = value
|
30
|
+
return unless amount
|
26
31
|
|
27
32
|
if credit?
|
28
|
-
self.raw_amount = -amount
|
33
|
+
self.raw_amount = -amount.to_d
|
29
34
|
elsif debit?
|
30
|
-
self.raw_amount = amount
|
31
|
-
else
|
32
|
-
raise ArgumentError
|
35
|
+
self.raw_amount = amount.to_d
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
@@ -54,23 +57,25 @@ class Keepr::Posting < ActiveRecord::Base
|
|
54
57
|
end
|
55
58
|
|
56
59
|
def amount=(value)
|
57
|
-
raise ArgumentError.new('Negative amount not allowed!') if value.to_f < 0
|
58
60
|
@side ||= SIDE_DEBIT
|
59
61
|
|
60
|
-
|
61
|
-
self.raw_amount =
|
62
|
-
|
63
|
-
self.raw_amount = value
|
62
|
+
unless value
|
63
|
+
self.raw_amount = nil
|
64
|
+
return
|
64
65
|
end
|
66
|
+
|
67
|
+
raise ArgumentError, 'Negative amount not allowed!' if value.to_d.negative?
|
68
|
+
|
69
|
+
self.raw_amount = credit? ? -value.to_d : value.to_d
|
65
70
|
end
|
66
71
|
|
67
|
-
private
|
72
|
+
private
|
73
|
+
|
68
74
|
def cost_center_validation
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end
|
75
|
+
return unless keepr_cost_center
|
76
|
+
return if keepr_account.profit_and_loss?
|
77
|
+
|
78
|
+
# allowed for expense or revenue accounts only
|
79
|
+
errors.add :keepr_cost_center_id, :allowed_for_expense_or_revenue_only
|
75
80
|
end
|
76
81
|
end
|
data/lib/keepr/tax.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Keepr::Tax < ActiveRecord::Base
|
2
4
|
self.table_name = 'keepr_taxes'
|
3
5
|
|
4
6
|
validates_presence_of :name, :value, :keepr_account_id
|
5
7
|
validates_numericality_of :value
|
6
8
|
|
7
|
-
belongs_to :keepr_account, :
|
8
|
-
has_many :keepr_accounts, :
|
9
|
+
belongs_to :keepr_account, class_name: 'Keepr::Account'
|
10
|
+
has_many :keepr_accounts, class_name: 'Keepr::Account', foreign_key: 'keepr_tax_id', dependent: :restrict_with_error
|
9
11
|
|
10
12
|
validate do |tax|
|
11
13
|
tax.errors.add(:keepr_account_id, :circular_reference) if tax.keepr_account.try(:keepr_tax) == tax
|
data/lib/keepr/version.rb
CHANGED
data/spec/factories/account.rb
CHANGED
data/spec/factories/group.rb
CHANGED
data/spec/factories/tax.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
2
4
|
factory :tax, class: Keepr::Tax do
|
3
|
-
name 'USt19'
|
4
|
-
description 'Umsatzsteuer 19%'
|
5
|
-
value 19.0
|
6
|
-
keepr_account {
|
5
|
+
name { 'USt19' }
|
6
|
+
description { 'Umsatzsteuer 19%' }
|
7
|
+
value { 19.0 }
|
8
|
+
keepr_account { FactoryBot.create :account, number: 1776 }
|
7
9
|
end
|
8
10
|
end
|
@@ -1,26 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Keepr::AccountExport do
|
4
|
-
let!(:account_1000) {
|
5
|
-
let!(:account_1776) {
|
6
|
-
let!(:account_4920) {
|
7
|
-
let!(:account_8400) {
|
8
|
-
let!(:account_9000) {
|
9
|
-
let!(:account_10000) {
|
10
|
-
let!(:account_70000) {
|
6
|
+
let!(:account_1000) { FactoryBot.create :account, kind: :asset, number: 1000, name: 'Kasse' }
|
7
|
+
let!(:account_1776) { FactoryBot.create :account, kind: :liability, number: 1776, name: 'Umsatzsteuer 19 %' }
|
8
|
+
let!(:account_4920) { FactoryBot.create :account, kind: :expense, number: 4920, name: 'Telefon' }
|
9
|
+
let!(:account_8400) { FactoryBot.create :account, kind: :revenue, number: 8400, name: 'Erlöse 19 %' }
|
10
|
+
let!(:account_9000) { FactoryBot.create :account, kind: :forward, number: 9000, name: 'Saldenvorträge Sachkonten' }
|
11
|
+
let!(:account_10000) { FactoryBot.create :account, kind: :creditor, number: 10_000, name: 'Diverse Kreditoren' }
|
12
|
+
let!(:account_70000) { FactoryBot.create :account, kind: :debtor, number: 70_000, name: 'Diverse Debitoren' }
|
11
13
|
|
12
14
|
let(:scope) { Keepr::Account.all }
|
13
15
|
|
14
|
-
let(:export)
|
15
|
-
Keepr::AccountExport.new(
|
16
|
-
|
17
|
-
'
|
18
|
-
'
|
16
|
+
let(:export) do
|
17
|
+
Keepr::AccountExport.new(
|
18
|
+
scope,
|
19
|
+
'Berater' => 1_234_567,
|
20
|
+
'Mandant' => 78_901,
|
21
|
+
'WJ-Beginn' => Date.new(2016, 1, 1),
|
19
22
|
'Bezeichnung' => 'Keepr-Konten'
|
20
|
-
) do
|
23
|
+
) do
|
21
24
|
{ 'Sprach-ID' => 'de-DE' }
|
22
25
|
end
|
23
|
-
|
26
|
+
end
|
24
27
|
|
25
28
|
describe :to_s do
|
26
29
|
subject { export.to_s }
|
@@ -29,17 +32,17 @@ describe Keepr::AccountExport do
|
|
29
32
|
subject.lines[2..-1].map { |line| line.encode(Encoding::UTF_8) }
|
30
33
|
end
|
31
34
|
|
32
|
-
it
|
35
|
+
it 'should return CSV lines' do
|
33
36
|
subject.lines.each { |line| expect(line).to include(';') }
|
34
37
|
end
|
35
38
|
|
36
|
-
it
|
39
|
+
it 'should include header data' do
|
37
40
|
expect(subject.lines[0]).to include('1234567;')
|
38
41
|
expect(subject.lines[0]).to include('78901;')
|
39
42
|
expect(subject.lines[0]).to include('"Keepr-Konten";')
|
40
43
|
end
|
41
44
|
|
42
|
-
it
|
45
|
+
it 'should include all accounts except debtor/creditor' do
|
43
46
|
expect(account_lines.count).to eq(5)
|
44
47
|
|
45
48
|
expect(account_lines[0]).to include('1000;')
|
@@ -58,14 +61,14 @@ describe Keepr::AccountExport do
|
|
58
61
|
expect(account_lines[4]).to include('"Saldenvorträge Sachkonten";')
|
59
62
|
end
|
60
63
|
|
61
|
-
it
|
64
|
+
it 'should include data from block' do
|
62
65
|
expect(account_lines[0]).to include(';"de-DE"')
|
63
66
|
expect(account_lines[1]).to include(';"de-DE"')
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
67
70
|
describe :to_file do
|
68
|
-
it
|
71
|
+
it 'should create CSV file' do
|
69
72
|
Dir.mktmpdir do |dir|
|
70
73
|
filename = "#{dir}/EXTF_Kontenbeschriftungen.csv"
|
71
74
|
export.to_file(filename)
|
data/spec/keepr/account_spec.rb
CHANGED
@@ -1,89 +1,90 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'spec_helper'
|
3
4
|
|
4
5
|
describe Keepr::Account do
|
5
6
|
describe :number_as_string do
|
6
|
-
it
|
7
|
-
account = Keepr::Account.new(:
|
7
|
+
it 'should return number with leading zeros for low values' do
|
8
|
+
account = Keepr::Account.new(number: 999)
|
8
9
|
expect(account.number_as_string).to eq('0999')
|
9
10
|
end
|
10
11
|
|
11
|
-
it
|
12
|
-
account = Keepr::Account.new(:
|
12
|
+
it 'should return number unchanged for high values' do
|
13
|
+
account = Keepr::Account.new(number: 70_000)
|
13
14
|
expect(account.number_as_string).to eq('70000')
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
18
|
describe :to_s do
|
18
|
-
it
|
19
|
-
account = Keepr::Account.new(:
|
19
|
+
it 'should format' do
|
20
|
+
account = Keepr::Account.new(number: 27, name: 'Software')
|
20
21
|
expect(account.to_s).to eq('0027 (Software)')
|
21
22
|
end
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
26
|
describe Keepr::Account do
|
26
|
-
let!(:account_1000) {
|
27
|
-
let!(:account_1200) {
|
27
|
+
let!(:account_1000) { FactoryBot.create(:account, number: 1000) }
|
28
|
+
let!(:account_1200) { FactoryBot.create(:account, number: 1200) }
|
28
29
|
|
29
30
|
before :each do
|
30
|
-
Keepr::Journal.create! :
|
31
|
-
:
|
32
|
-
:
|
33
|
-
{ :
|
34
|
-
{ :
|
35
|
-
|
36
|
-
|
37
|
-
Keepr::Journal.create! :
|
38
|
-
:
|
39
|
-
{ :
|
40
|
-
{ :
|
41
|
-
|
42
|
-
|
43
|
-
Keepr::Journal.create! :
|
44
|
-
:
|
45
|
-
{ :
|
46
|
-
{ :
|
47
|
-
|
48
|
-
|
49
|
-
Keepr::Journal.create! :
|
50
|
-
:
|
51
|
-
{ :
|
52
|
-
{ :
|
53
|
-
|
31
|
+
Keepr::Journal.create! date: Date.yesterday,
|
32
|
+
permanent: true,
|
33
|
+
keepr_postings_attributes: [
|
34
|
+
{ keepr_account: account_1000, amount: 20, side: 'debit' },
|
35
|
+
{ keepr_account: account_1200, amount: 20, side: 'credit' }
|
36
|
+
]
|
37
|
+
|
38
|
+
Keepr::Journal.create! date: Date.yesterday,
|
39
|
+
keepr_postings_attributes: [
|
40
|
+
{ keepr_account: account_1000, amount: 10, side: 'credit' },
|
41
|
+
{ keepr_account: account_1200, amount: 10, side: 'debit' }
|
42
|
+
]
|
43
|
+
|
44
|
+
Keepr::Journal.create! date: Date.current,
|
45
|
+
keepr_postings_attributes: [
|
46
|
+
{ keepr_account: account_1000, amount: 200, side: 'debit' },
|
47
|
+
{ keepr_account: account_1200, amount: 200, side: 'credit' }
|
48
|
+
]
|
49
|
+
|
50
|
+
Keepr::Journal.create! date: Date.current,
|
51
|
+
keepr_postings_attributes: [
|
52
|
+
{ keepr_account: account_1000, amount: 100, side: 'credit' },
|
53
|
+
{ keepr_account: account_1200, amount: 100, side: 'debit' }
|
54
|
+
]
|
54
55
|
end
|
55
56
|
|
56
57
|
describe 'validations' do
|
57
|
-
let!(:result_group) {
|
58
|
-
let!(:liability_group) {
|
59
|
-
let!(:asset_group) {
|
58
|
+
let!(:result_group) { FactoryBot.create(:group, target: :liability, is_result: true) }
|
59
|
+
let!(:liability_group) { FactoryBot.create(:group, target: :liability) }
|
60
|
+
let!(:asset_group) { FactoryBot.create(:group, target: :asset) }
|
60
61
|
|
61
|
-
it
|
62
|
-
account =
|
62
|
+
it 'should not allow assigning to result group' do
|
63
|
+
account = FactoryBot.build(:account, keepr_group: result_group)
|
63
64
|
expect(account).to_not be_valid
|
64
|
-
expect(account.errors.added?
|
65
|
+
expect(account.errors.added?(:keepr_group_id, :no_group_allowed_for_result)).to eq(true)
|
65
66
|
end
|
66
67
|
|
67
|
-
it
|
68
|
-
account =
|
68
|
+
it 'should not allow assigning asset account to liability group' do
|
69
|
+
account = FactoryBot.build(:account, kind: :asset, keepr_group: liability_group)
|
69
70
|
expect(account).to_not be_valid
|
70
|
-
expect(account.errors.added?
|
71
|
+
expect(account.errors.added?(:kind, :group_mismatch)).to eq(true)
|
71
72
|
end
|
72
73
|
|
73
|
-
it
|
74
|
-
account =
|
74
|
+
it 'should not allow assigning liability account to asset group' do
|
75
|
+
account = FactoryBot.build(:account, kind: :liability, keepr_group: asset_group)
|
75
76
|
expect(account).to_not be_valid
|
76
|
-
expect(account.errors.added?
|
77
|
+
expect(account.errors.added?(:kind, :group_mismatch)).to eq(true)
|
77
78
|
end
|
78
79
|
|
79
|
-
it
|
80
|
-
account =
|
80
|
+
it 'should not allow assigning forward account to asset group' do
|
81
|
+
account = FactoryBot.build(:account, kind: :forward, keepr_group: asset_group)
|
81
82
|
expect(account).to_not be_valid
|
82
|
-
expect(account.errors.added?
|
83
|
+
expect(account.errors.added?(:kind, :group_conflict)).to eq(true)
|
83
84
|
end
|
84
85
|
|
85
|
-
it
|
86
|
-
account =
|
86
|
+
it 'should allow target match' do
|
87
|
+
account = FactoryBot.build(:account, kind: :asset, keepr_group: asset_group)
|
87
88
|
expect(account).to be_valid
|
88
89
|
end
|
89
90
|
end
|
@@ -131,7 +132,7 @@ describe Keepr::Account do
|
|
131
132
|
|
132
133
|
context 'with date option' do
|
133
134
|
it 'should work with Date' do
|
134
|
-
account1, account2 = Keepr::Account.with_sums(:
|
135
|
+
account1, account2 = Keepr::Account.with_sums(date: Date.yesterday)
|
135
136
|
|
136
137
|
expect(account1.number).to eq(1000)
|
137
138
|
expect(account1.sum_amount).to eq(10)
|
@@ -140,7 +141,7 @@ describe Keepr::Account do
|
|
140
141
|
end
|
141
142
|
|
142
143
|
it 'should work with Range' do
|
143
|
-
account1, account2 = Keepr::Account.with_sums(:
|
144
|
+
account1, account2 = Keepr::Account.with_sums(date: Date.today..Date.tomorrow)
|
144
145
|
|
145
146
|
expect(account1.number).to eq(1000)
|
146
147
|
expect(account1.sum_amount).to eq(100)
|
@@ -149,14 +150,14 @@ describe Keepr::Account do
|
|
149
150
|
end
|
150
151
|
|
151
152
|
it 'should raise for other class' do
|
152
|
-
expect { Keepr::Account.with_sums(:
|
153
|
-
expect { Keepr::Account.with_sums(:
|
153
|
+
expect { Keepr::Account.with_sums(date: Time.current) }.to raise_error(ArgumentError)
|
154
|
+
expect { Keepr::Account.with_sums(date: :foo) }.to raise_error(ArgumentError)
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
157
158
|
context 'with permanent_only option' do
|
158
159
|
it 'should filter the permanent journals' do
|
159
|
-
account1, account2 = Keepr::Account.with_sums(:
|
160
|
+
account1, account2 = Keepr::Account.with_sums(permanent_only: true)
|
160
161
|
|
161
162
|
expect(account1.number).to eq(1000)
|
162
163
|
expect(account1.sum_amount).to eq(20)
|
@@ -175,17 +176,17 @@ describe Keepr::Account do
|
|
175
176
|
end
|
176
177
|
|
177
178
|
describe Keepr::Account, 'with subaccounts' do
|
178
|
-
let!(:account_1400) {
|
179
|
-
let!(:account_10000) {
|
180
|
-
let!(:account_10001) {
|
181
|
-
let!(:account_8400) {
|
179
|
+
let!(:account_1400) { FactoryBot.create(:account, number: 1400) }
|
180
|
+
let!(:account_10000) { FactoryBot.create(:account, number: 10_000, parent: account_1400) }
|
181
|
+
let!(:account_10001) { FactoryBot.create(:account, number: 10_001, parent: account_1400) }
|
182
|
+
let!(:account_8400) { FactoryBot.create(:account, number: 8400) }
|
182
183
|
|
183
184
|
before :each do
|
184
|
-
Keepr::Journal.create! :
|
185
|
-
:
|
186
|
-
{ :
|
187
|
-
{ :
|
188
|
-
|
185
|
+
Keepr::Journal.create! date: Date.yesterday,
|
186
|
+
keepr_postings_attributes: [
|
187
|
+
{ keepr_account: account_10000, amount: 20, side: 'debit' },
|
188
|
+
{ keepr_account: account_8400, amount: 20, side: 'credit' }
|
189
|
+
]
|
189
190
|
end
|
190
191
|
|
191
192
|
describe :keepr_postings do
|
@@ -209,42 +210,46 @@ describe Keepr::Account, 'with subaccounts' do
|
|
209
210
|
|
210
211
|
describe :with_sums do
|
211
212
|
it 'should calc balance' do
|
212
|
-
expect(Keepr::Account.with_sums
|
213
|
-
select(&:sum_amount)
|
214
|
-
map { |a| [a.number, a.sum_amount] })
|
215
|
-
|
213
|
+
expect(Keepr::Account.with_sums
|
214
|
+
.select(&:sum_amount)
|
215
|
+
.map { |a| [a.number, a.sum_amount] })
|
216
|
+
.to eq([[8400, -20], [10_000, 20]])
|
216
217
|
end
|
217
218
|
end
|
218
219
|
|
219
220
|
describe :merged_with_sums do
|
220
221
|
it 'should calc merged balance' do
|
221
|
-
expect(Keepr::Account.merged_with_sums
|
222
|
-
select(&:sum_amount)
|
223
|
-
map { |a| [a.number, a.sum_amount] })
|
224
|
-
|
222
|
+
expect(Keepr::Account.merged_with_sums
|
223
|
+
.select(&:sum_amount)
|
224
|
+
.map { |a| [a.number, a.sum_amount] })
|
225
|
+
.to eq([[1400, 20], [8400, -20]])
|
225
226
|
end
|
226
227
|
end
|
227
228
|
end
|
228
229
|
|
229
230
|
describe Keepr::Account, 'with tax' do
|
230
|
-
let!(:tax_account)
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
231
|
+
let!(:tax_account) do
|
232
|
+
Keepr::Account.create! number: 1776,
|
233
|
+
name: 'Umsatzsteuer 19%',
|
234
|
+
kind: :asset
|
235
|
+
end
|
236
|
+
|
237
|
+
let!(:tax) do
|
238
|
+
Keepr::Tax.create! name: 'USt19',
|
239
|
+
description: 'Umsatzsteuer 19%',
|
240
|
+
value: 19.0,
|
241
|
+
keepr_account: tax_account
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'should link to tax' do
|
245
|
+
account = Keepr::Account.new number: 8400,
|
246
|
+
name: 'Erlöse 19% USt',
|
247
|
+
kind: :revenue,
|
248
|
+
keepr_tax: tax
|
244
249
|
expect(account).to be_valid
|
245
250
|
end
|
246
251
|
|
247
|
-
it
|
252
|
+
it 'should avoid circular reference' do
|
248
253
|
tax_account.keepr_tax_id = tax.id
|
249
254
|
expect(tax_account).to be_invalid
|
250
255
|
end
|