erp_txns_and_accts 3.0.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.
- data/GPL-3-LICENSE +674 -0
- data/README.rdoc +2 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/erp_txns_and_accts/application.js +9 -0
- data/app/assets/stylesheets/erp_txns_and_accts/application.css +7 -0
- data/app/controllers/erp_txns_and_accts/application_controller.rb +4 -0
- data/app/helpers/erp_txns_and_accts/application_helper.rb +4 -0
- data/app/models/base_txn_context.rb +6 -0
- data/app/models/biz_acct_txn_task.rb +3 -0
- data/app/models/biz_txn_acct_party_role.rb +23 -0
- data/app/models/biz_txn_acct_pty_rtype.rb +3 -0
- data/app/models/biz_txn_acct_rel_type.rb +3 -0
- data/app/models/biz_txn_acct_relationship.rb +8 -0
- data/app/models/biz_txn_acct_root.rb +21 -0
- data/app/models/biz_txn_acct_status.rb +3 -0
- data/app/models/biz_txn_acct_status_type.rb +3 -0
- data/app/models/biz_txn_acct_type.rb +4 -0
- data/app/models/biz_txn_agreement_role.rb +7 -0
- data/app/models/biz_txn_agreement_role_type.rb +4 -0
- data/app/models/biz_txn_event.rb +61 -0
- data/app/models/biz_txn_event_desc.rb +5 -0
- data/app/models/biz_txn_party_role.rb +7 -0
- data/app/models/biz_txn_party_role_type.rb +4 -0
- data/app/models/biz_txn_rel_type.rb +4 -0
- data/app/models/biz_txn_relationship.rb +8 -0
- data/app/models/biz_txn_status.rb +3 -0
- data/app/models/biz_txn_task.rb +3 -0
- data/app/models/biz_txn_task_type.rb +3 -0
- data/app/models/biz_txn_type.rb +36 -0
- data/app/models/extensions/charge_line.rb +8 -0
- data/app/models/extensions/charge_line_payment_txn.rb +3 -0
- data/app/models/extensions/money.rb +6 -0
- data/app/models/extensions/party.rb +27 -0
- data/app/models/financial_txn.rb +71 -0
- data/app/models/financial_txn_account.rb +71 -0
- data/app/views/layouts/erp_txns_and_accts/application.html.erb +14 -0
- data/config/routes.rb +2 -0
- data/db/data_migrations/20101014142230_financial_txn_types.rb +15 -0
- data/db/migrate/20080805000030_base_txns_and_accts.rb +360 -0
- data/db/migrate/20110609230152_update_financial_txns.rb +21 -0
- data/lib/erp_txns_and_accts.rb +6 -0
- data/lib/erp_txns_and_accts/delayed_jobs/payment_gateway_job.rb +24 -0
- data/lib/erp_txns_and_accts/engine.rb +12 -0
- data/lib/erp_txns_and_accts/extensions.rb +3 -0
- data/lib/erp_txns_and_accts/extensions/active_record/acts_as_biz_txn_account.rb +63 -0
- data/lib/erp_txns_and_accts/extensions/active_record/acts_as_biz_txn_event.rb +72 -0
- data/lib/erp_txns_and_accts/extensions/active_record/acts_as_financial_txn_account.rb +70 -0
- data/lib/erp_txns_and_accts/version.rb +3 -0
- data/lib/tasks/erp_txns_and_accts_tasks.rake +4 -0
- metadata +144 -0
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'ErpTxnsAndAccts'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
24
|
+
load 'rails/tasks/engine.rake'
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
28
|
+
require "rspec/core/rake_task"
|
29
|
+
RSpec::Core::RakeTask.new(:spec)
|
30
|
+
task :default => :spec
|
@@ -0,0 +1,9 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into including all the files listed below.
|
2
|
+
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
|
3
|
+
// be included in the compiled file accessible from http://example.com/assets/application.js
|
4
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
5
|
+
// the compiled file.
|
6
|
+
//
|
7
|
+
//= require jquery
|
8
|
+
//= require jquery_ujs
|
9
|
+
//= require_tree .
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
3
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
4
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
5
|
+
*= require_self
|
6
|
+
*= require_tree .
|
7
|
+
*/
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class BizTxnAcctPartyRole < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :biz_txn_acct_root
|
4
|
+
belongs_to :party
|
5
|
+
belongs_to :biz_txn_acct_pty_rtype
|
6
|
+
|
7
|
+
def role_type
|
8
|
+
biz_txn_acct_pty_rtype
|
9
|
+
end
|
10
|
+
|
11
|
+
def account_root
|
12
|
+
biz_txn_acct_root
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_label
|
16
|
+
"#{party.description}:#{role_type.description}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def description
|
20
|
+
"#{party.description}:#{role_type.description}"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class BizTxnAcctRelationship < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :account_from, :class_name => "BizTxnAcctRoot", :foreign_key => "biz_txn_acct_root_id_from"
|
4
|
+
belongs_to :account_to, :class_name => "BizTxnAcctRoot", :foreign_key => "biz_txn_acct_root_id_to"
|
5
|
+
|
6
|
+
belongs_to :biz_txn_acct_rel_type
|
7
|
+
|
8
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class BizTxnAcctRoot < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :biz_txn_acct, :polymorphic => true, :dependent => :destroy
|
4
|
+
belongs_to :biz_txn_acct_type
|
5
|
+
has_many :biz_txn_events, :dependent => :destroy
|
6
|
+
has_many :biz_txn_acct_party_roles, :dependent => :destroy
|
7
|
+
|
8
|
+
alias :account :biz_txn_acct
|
9
|
+
alias :txn_events :biz_txn_events
|
10
|
+
alias :txns :biz_txn_events
|
11
|
+
alias :account_type :biz_txn_acct_type
|
12
|
+
|
13
|
+
def to_label
|
14
|
+
"#{description}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"#{description}"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class BizTxnEvent < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :biz_txn_acct_root
|
4
|
+
belongs_to :biz_txn_record, :polymorphic => true
|
5
|
+
has_many :biz_txn_party_roles, :dependent => :destroy
|
6
|
+
has_many :biz_txn_event_descs, :dependent => :destroy
|
7
|
+
has_many :base_txn_contexts, :dependent => :destroy
|
8
|
+
has_many :biz_txn_agreement_roles
|
9
|
+
has_many :agreements, :through => :biz_txn_agreement_roles
|
10
|
+
|
11
|
+
#wrapper for...
|
12
|
+
#belongs_to :biz_txn_type
|
13
|
+
belongs_to_erp_type :biz_txn_type
|
14
|
+
#syntactic sugar
|
15
|
+
alias :txn_type :biz_txn_type
|
16
|
+
alias :txn_type= :biz_txn_type=
|
17
|
+
alias :txn :biz_txn_record
|
18
|
+
alias :txn= :biz_txn_record=
|
19
|
+
alias :account :biz_txn_acct_root
|
20
|
+
alias :account= :biz_txn_acct_root=
|
21
|
+
alias :descriptions :biz_txn_event_descs
|
22
|
+
|
23
|
+
|
24
|
+
#helps when looping through transactions comparing types
|
25
|
+
def txn_type_iid
|
26
|
+
biz_txn_type.internal_identifier if biz_txn_type
|
27
|
+
end
|
28
|
+
|
29
|
+
def account_root
|
30
|
+
biz_txn_acct_root
|
31
|
+
end
|
32
|
+
|
33
|
+
def amount
|
34
|
+
if biz_txn_record.respond_to? :amount
|
35
|
+
biz_txn_record.amount
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def amount_string
|
42
|
+
if biz_txn_record.respond_to? :amount_string
|
43
|
+
biz_txn_record.amount_string
|
44
|
+
else
|
45
|
+
"n/a"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_dependent_txns
|
50
|
+
#Template Method
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_label
|
54
|
+
"#{description}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_s
|
58
|
+
"#{description}"
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class BizTxnRelationship < ActiveRecord::Base
|
2
|
+
|
3
|
+
belongs_to :txn_event_from, :class_name => "BizTxnEvent", :foreign_key => "txn_event_id_from"
|
4
|
+
belongs_to :txn_event_to , :class_name => "BizTxnEvent", :foreign_key => "txn_event_id_to"
|
5
|
+
|
6
|
+
belongs_to :biz_txn_rel_type
|
7
|
+
|
8
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class BizTxnType < ActiveRecord::Base
|
2
|
+
|
3
|
+
acts_as_nested_set
|
4
|
+
include ErpTechSvcs::Utils::DefaultNestedSetMethods
|
5
|
+
acts_as_erp_type
|
6
|
+
|
7
|
+
belongs_to_erp_type :parent, :class_name => "BizTxnType"
|
8
|
+
|
9
|
+
# this method handles default behavior for find by type and subtype
|
10
|
+
def self.find_by_type_and_subtype(txn_type, txn_subtype)
|
11
|
+
return self.find_by_type_and_subtype_eid(txn_type, txn_subtype)
|
12
|
+
end
|
13
|
+
|
14
|
+
# find by type Internal Identifier and subtype Internal Identifier
|
15
|
+
def self.find_by_type_and_subtype_iid(txn_type, txn_subtype)
|
16
|
+
txn_type_recs = find_all_by_internal_identifier(txn_type.strip)
|
17
|
+
return nil if txn_type_recs.blank?
|
18
|
+
txn_type_recs.each do |txn_type_rec|
|
19
|
+
txn_subtype_rec = find_by_parent_id_and_internal_identifier(txn_type_rec.id, txn_subtype.strip)
|
20
|
+
return txn_subtype_rec unless txn_subtype_rec.nil?
|
21
|
+
end
|
22
|
+
return nil
|
23
|
+
end
|
24
|
+
|
25
|
+
# find by type External Identifier and subtype External Identifier
|
26
|
+
def self.find_by_type_and_subtype_eid(txn_type, txn_subtype)
|
27
|
+
txn_type_recs = find_all_by_external_identifier(txn_type.strip)
|
28
|
+
return nil if txn_type_recs.blank?
|
29
|
+
txn_type_recs.each do |txn_type_rec|
|
30
|
+
txn_subtype_rec = find_by_parent_id_and_external_identifier(txn_type_rec.id, txn_subtype.strip)
|
31
|
+
return txn_subtype_rec unless txn_subtype_rec.nil?
|
32
|
+
end
|
33
|
+
return nil
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Party.class_eval do
|
2
|
+
|
3
|
+
has_many :biz_txn_acct_party_roles
|
4
|
+
has_many :biz_txn_acct_roots, :through => :biz_txn_acct_party_roles, :dependent => :destroy
|
5
|
+
# has_many :entity_content_assignments, :as => :da_assignment
|
6
|
+
# has_many :credit_cards, :class_name => "CreditCard", :foreign_key => "cardholder_id"
|
7
|
+
|
8
|
+
|
9
|
+
# Wrapper to get all party accounts
|
10
|
+
def accounts
|
11
|
+
relationships
|
12
|
+
|
13
|
+
# old call:
|
14
|
+
#biz_txn_acct_roots
|
15
|
+
|
16
|
+
# TODO: Get data so we can use this optimized version:
|
17
|
+
#BizTxnAcctPartyRole.find(:all, :joins => [:party, :biz_txn_acct_root, :biz_txn_acct_pty_rtype], :conditions => ['party_id =?', id])
|
18
|
+
end
|
19
|
+
|
20
|
+
# Adds a business account (BizTxnAcctPartyRole)
|
21
|
+
def add_business_account( acct_root, role_type_id = 10000 )
|
22
|
+
apr = BizTxnAcctPartyRole.new
|
23
|
+
|
24
|
+
apr.biz_txn_acct_pty_rtype = BizTxnAcctPtyRtype.find(role_type_id)
|
25
|
+
biz_txn_acct_roots << acct_root
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
class FinancialTxn < ActiveRecord::Base
|
2
|
+
|
3
|
+
acts_as_biz_txn_event
|
4
|
+
has_many :charge_line_payment_txns, :as => :payment_txn, :dependent => :destroy
|
5
|
+
has_many :charge_lines, :through => :charge_line_payment_txns
|
6
|
+
belongs_to :money
|
7
|
+
has_many :payments
|
8
|
+
|
9
|
+
def authorize(credit_card, gateway_wrapper, gateway_options={})
|
10
|
+
credit_card[:charge_amount] = self.money.amount
|
11
|
+
gateway_options[:charge_lines] = self.charge_lines
|
12
|
+
gateway_options[:debug] = true
|
13
|
+
|
14
|
+
result = gateway_wrapper.authorize(credit_card, gateway_options)
|
15
|
+
|
16
|
+
unless result[:payment].nil?
|
17
|
+
result[:payment].financial_txn = self
|
18
|
+
result[:payment].save
|
19
|
+
self.payments << result[:payment]
|
20
|
+
self.save
|
21
|
+
end
|
22
|
+
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
26
|
+
def purchase(credit_card, gateway_wrapper, gateway_options={})
|
27
|
+
credit_card[:charge_amount] = self.money.amount
|
28
|
+
gateway_options[:charge_lines] = self.charge_lines
|
29
|
+
gateway_options[:debug] = true
|
30
|
+
|
31
|
+
result = gateway_wrapper.purchase(credit_card, gateway_options)
|
32
|
+
|
33
|
+
unless result[:payment].nil?
|
34
|
+
result[:payment].financial_txn = self
|
35
|
+
result[:payment].save
|
36
|
+
self.payments << result[:payment]
|
37
|
+
self.save
|
38
|
+
end
|
39
|
+
|
40
|
+
result
|
41
|
+
end
|
42
|
+
|
43
|
+
def capture(credit_card, gateway_wrapper, gateway_options={})
|
44
|
+
result = {:success => true}
|
45
|
+
payment = Payment.find(:first, :order => 'created_at desc', :conditions => ["current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, self.id])
|
46
|
+
#only capture this payment if it was authorized
|
47
|
+
if !payment.nil? && payment.current_state.to_sym == :authorized
|
48
|
+
credit_card[:charge_amount] = self.money.amount
|
49
|
+
gateway_options[:charge_lines] = self.charge_lines
|
50
|
+
gateway_options[:debug] = true
|
51
|
+
|
52
|
+
result = gateway_wrapper.capture(credit_card, payment, gateway_options)
|
53
|
+
end
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
def reverse_authorization(credit_card, gateway_wrapper, gateway_options={})
|
58
|
+
result = {:success => true}
|
59
|
+
payment = Payment.find(:first, :order => 'created_at desc', :conditions => ["current_state = ? and success = ? and financial_txn_id = ?",'authorized', 1, self.id])
|
60
|
+
#only reverse this payment if it was authorized
|
61
|
+
if !payment.nil? && payment.current_state.to_sym == :authorized
|
62
|
+
credit_card[:charge_amount] = self.money.amount
|
63
|
+
gateway_options[:charge_lines] = self.charge_lines
|
64
|
+
gateway_options[:debug] = true
|
65
|
+
|
66
|
+
result = gateway_wrapper.full_reverse_of_authorization(credit_card, payment, gateway_options)
|
67
|
+
end
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|