has_accounts 1.0.2 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,163 @@
|
|
1
|
+
class BookingTemplate < ActiveRecord::Base
|
2
|
+
# Access restrictions
|
3
|
+
attr_accessible :title, :code, :amount, :amount_relates_to, :comments
|
4
|
+
|
5
|
+
# Associations
|
6
|
+
belongs_to :debit_account, :foreign_key => 'debit_account_id', :class_name => "Account"
|
7
|
+
attr_accessible :debit_account_id
|
8
|
+
belongs_to :credit_account, :foreign_key => 'credit_account_id', :class_name => "Account"
|
9
|
+
attr_accessible :credit_account_id
|
10
|
+
|
11
|
+
# Default ordering
|
12
|
+
default_scope order(:code)
|
13
|
+
|
14
|
+
# Scopes
|
15
|
+
scope :by_type, lambda{|value| where("code LIKE ?", value + ':%')}
|
16
|
+
|
17
|
+
# Standard methods
|
18
|
+
include ApplicationHelper
|
19
|
+
def to_s(format = :default)
|
20
|
+
case format
|
21
|
+
when :short
|
22
|
+
"%s / %s %s" % [
|
23
|
+
credit_account ? credit_account.to_s(:short) : '?',
|
24
|
+
debit_account ? debit_account.to_s(:short) : '?',
|
25
|
+
amount ? "%0.2f" % amount.to_f : '?',
|
26
|
+
]
|
27
|
+
when :long
|
28
|
+
"%s an %s %s, %s (%s)" % [
|
29
|
+
credit_account ? credit_account.to_s : '?',
|
30
|
+
debit_account ? debit_account.to_s : '?',
|
31
|
+
amount ? "%0.2f" % amount.to_f : '?',
|
32
|
+
title.present? ? title : '?',
|
33
|
+
comments.present? ? comments : '?'
|
34
|
+
]
|
35
|
+
else
|
36
|
+
title
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def amount_to_s
|
41
|
+
if amount_relates_to.present?
|
42
|
+
return "%.2f%%" % (amount.to_f * 100)
|
43
|
+
else
|
44
|
+
return currency_fmt(amount)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Tagging
|
49
|
+
# =======
|
50
|
+
acts_as_taggable
|
51
|
+
attr_accessible :tag_list
|
52
|
+
|
53
|
+
def booking_parameters(params = {})
|
54
|
+
params = HashWithIndifferentAccess.new(params)
|
55
|
+
|
56
|
+
# Prepare parameters set by template
|
57
|
+
booking_params = attributes.reject{|key, value| !["title", "comments", "credit_account_id", "debit_account_id"].include?(key)}
|
58
|
+
|
59
|
+
# Calculate amount
|
60
|
+
booking_amount = BigDecimal.new(self.amount.to_s || '0')
|
61
|
+
|
62
|
+
# Lookup reference
|
63
|
+
reference = params['reference']
|
64
|
+
unless reference
|
65
|
+
ref_type = params['reference_type']
|
66
|
+
ref_id = params['reference_id']
|
67
|
+
if ref_type.present? and ref_id.present?
|
68
|
+
reference = ref_type.constantize.find(ref_id)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
person_id = params.delete(:person_id)
|
73
|
+
|
74
|
+
if reference
|
75
|
+
# Calculate amount
|
76
|
+
booking_amount = amount(reference.value_date, :person_id => person_id) if person_id
|
77
|
+
|
78
|
+
case self.amount_relates_to
|
79
|
+
when 'reference_amount'
|
80
|
+
booking_amount *= reference.amount unless reference.amount.nil?
|
81
|
+
when 'reference_balance'
|
82
|
+
booking_amount *= reference.balance unless reference.balance.nil?
|
83
|
+
when 'reference_amount_minus_balance'
|
84
|
+
booking_amount *= reference.amount - reference.balance unless (reference.amount.nil? or reference.balance.nil?)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
booking_amount = booking_amount.try(:round, 2)
|
89
|
+
booking_params['amount'] = booking_amount
|
90
|
+
|
91
|
+
# Override by passed in parameters
|
92
|
+
HashWithIndifferentAccess.new(booking_params.merge!(params))
|
93
|
+
end
|
94
|
+
|
95
|
+
# Factory methods
|
96
|
+
def build_booking(params = {})
|
97
|
+
Booking.new(booking_parameters(params))
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_booking(params = {})
|
101
|
+
Booking.create(booking_parameters(params))
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.build_booking(code, params = {})
|
105
|
+
find_by_code(code).try(:build_booking, params)
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.create_booking(code, params = {})
|
109
|
+
find_by_code(code).try(:create_booking, params)
|
110
|
+
end
|
111
|
+
|
112
|
+
# LineItems
|
113
|
+
has_many :line_items
|
114
|
+
|
115
|
+
def build_line_item
|
116
|
+
if self.amount.match(/%/) or self.amount_relates_to.blank?
|
117
|
+
line_item_class = LineItem
|
118
|
+
else
|
119
|
+
line_item_class = SaldoLineItem
|
120
|
+
end
|
121
|
+
|
122
|
+
line_item = line_item_class.new(
|
123
|
+
:booking_template => self,
|
124
|
+
:title => self.title,
|
125
|
+
:code => self.code,
|
126
|
+
:credit_account => self.credit_account,
|
127
|
+
:debit_account => self.debit_account,
|
128
|
+
:position => self.position,
|
129
|
+
:include_in_saldo_list => self.include_in_saldo_list,
|
130
|
+
:reference_code => self.amount_relates_to
|
131
|
+
)
|
132
|
+
|
133
|
+
if self.amount.match(/%/)
|
134
|
+
line_item.quantity = '%'
|
135
|
+
line_item.times = self.amount.delete('%')
|
136
|
+
# TODO: hack
|
137
|
+
line_item.price = line_item.price
|
138
|
+
elsif self.amount_relates_to.present?
|
139
|
+
line_item.quantity = 'saldo_of'
|
140
|
+
# TODO: hack
|
141
|
+
line_item.price = line_item.price
|
142
|
+
else
|
143
|
+
line_item.quantity = 'x'
|
144
|
+
line_item.times = 1
|
145
|
+
line_item.price = self.amount
|
146
|
+
end
|
147
|
+
|
148
|
+
line_item
|
149
|
+
end
|
150
|
+
|
151
|
+
# Tagging
|
152
|
+
acts_as_taggable_on :include_in_saldo
|
153
|
+
|
154
|
+
# Importer
|
155
|
+
def self.import(struct)
|
156
|
+
templates = self.all.inject([]) do |found, template|
|
157
|
+
puts "matcher: " + template.matcher
|
158
|
+
puts 'text: ' + struct.text
|
159
|
+
found << template if not Regexp.new(template.matcher).match(struct.text).eql?nil
|
160
|
+
end
|
161
|
+
puts templates.inspect
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class CreateBookingTemplates < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :booking_templates do |t|
|
4
|
+
t.string "title"
|
5
|
+
t.string "amount"
|
6
|
+
t.integer "credit_account_id"
|
7
|
+
t.integer "debit_account_id"
|
8
|
+
t.text "comments"
|
9
|
+
t.datetime "created_at", :null => false
|
10
|
+
t.datetime "updated_at", :null => false
|
11
|
+
t.string "code"
|
12
|
+
t.string "matcher"
|
13
|
+
t.string "amount_relates_to"
|
14
|
+
t.string "type"
|
15
|
+
t.string "charge_rate_code"
|
16
|
+
t.string "salary_declaration_code"
|
17
|
+
t.integer "position"
|
18
|
+
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/has_accounts/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has_accounts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -107,12 +107,14 @@ files:
|
|
107
107
|
- app/models/bank.rb
|
108
108
|
- app/models/bank_account.rb
|
109
109
|
- app/models/booking.rb
|
110
|
+
- app/models/booking_template.rb
|
110
111
|
- config/locales/de.yml
|
111
112
|
- config/locales/en.yml
|
112
113
|
- db/migrate/20111108000000_create_has_accounts_tables.rb
|
113
114
|
- db/migrate/20111109093857_use_string_for_account_number.rb
|
114
115
|
- db/migrate/20111230121259_bank_now_inherits_from_person.rb
|
115
116
|
- db/migrate/20111230222702_add_template_to_bookings.rb
|
117
|
+
- db/migrate/20130707121400_create_booking_templates.rb
|
116
118
|
- lib/has_accounts.rb
|
117
119
|
- lib/has_accounts/class_methods.rb
|
118
120
|
- lib/has_accounts/core_ext/rounding.rb
|