erp_txns_and_accts 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|