invoicing_payments_processing 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/balance.rb +27 -0
- data/lib/bufferpaypalnotification.rb +391 -0
- data/lib/customplan.rb +33 -0
- data/lib/extend_client_by_invoicing_payments_processing.rb +128 -0
- data/lib/invoice.rb +617 -0
- data/lib/invoiceitem.rb +11 -0
- data/lib/invoicing_payments_processing.rb +127 -0
- data/lib/movement.rb +138 -0
- data/lib/paypalsubscription.rb +131 -0
- metadata +154 -0
data/lib/invoiceitem.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
module BlackStack
|
2
|
+
class InvoiceItem < Sequel::Model(:invoice_item)
|
3
|
+
InvoiceItem.dataset = InvoiceItem.dataset.disable_insert_output
|
4
|
+
many_to_one :invoice, :class=>:'BlackStack::Invoice', :key=>:id_invoice
|
5
|
+
|
6
|
+
def plan_descriptor()
|
7
|
+
BlackStack::InvoicingPaymentsProcessing::plan_descriptor(self.item_number)
|
8
|
+
end
|
9
|
+
|
10
|
+
end # class LocalInvoiceItem
|
11
|
+
end # module BlackStack
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'blackstack_commons'
|
2
|
+
require 'pampa_workers'
|
3
|
+
|
4
|
+
#
|
5
|
+
#
|
6
|
+
#
|
7
|
+
module BlackStack
|
8
|
+
|
9
|
+
module InvoicingPaymentsProcessing
|
10
|
+
|
11
|
+
# constants
|
12
|
+
PAYPAL_ORDERS_URL = "https://www.paypal.com"
|
13
|
+
|
14
|
+
# static attributes
|
15
|
+
@@paypal_business_email = "sardi.leandro.daniel@gmail.com"
|
16
|
+
@@products_descriptor = []
|
17
|
+
@@plans_descriptor = []
|
18
|
+
|
19
|
+
# getters & setters
|
20
|
+
def self.set_paypal_business_email(email)
|
21
|
+
@@paypal_business_email = email
|
22
|
+
end # def self.set_paypal_business_email
|
23
|
+
|
24
|
+
def self.paypal_business_email()
|
25
|
+
@@paypal_business_email
|
26
|
+
end # def self.set_paypal_business_email
|
27
|
+
|
28
|
+
def self.paypal_ipn_listener()
|
29
|
+
"#{BlackStack::Pampa::api_url.to_s}/api1.3/accounting/paypal/notify_new_invoice.json"
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def self.set_products(h)
|
34
|
+
@@products_descriptor = h
|
35
|
+
end # def self.set_products
|
36
|
+
|
37
|
+
def self.products_descriptor()
|
38
|
+
@@products_descriptor
|
39
|
+
end # def self.products_descriptor
|
40
|
+
|
41
|
+
|
42
|
+
def self.set_plans(h)
|
43
|
+
@@plans_descriptor = h
|
44
|
+
end # def self.set_plans
|
45
|
+
|
46
|
+
def self.plans_descriptor()
|
47
|
+
@@plans_descriptor
|
48
|
+
end # def self.plans_descriptor
|
49
|
+
|
50
|
+
|
51
|
+
def self.plan_descriptor(item_number)
|
52
|
+
plan = BlackStack::InvoicingPaymentsProcessing::plans_descriptor.select { |h| h[:item_number].to_s == item_number.to_s }.first
|
53
|
+
raise "Plan not found" if plan.nil?
|
54
|
+
plan
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.product_descriptor(product_code)
|
58
|
+
ret = BlackStack::InvoicingPaymentsProcessing::products_descriptor.select { |h| h[:code] == product_code }.first
|
59
|
+
raise "Product not found" if ret.nil?
|
60
|
+
ret
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def self.require_db_classes()
|
65
|
+
# You have to load all the Sinatra classes after connect the database.
|
66
|
+
require_relative '../lib/balance.rb'
|
67
|
+
require_relative '../lib/bufferpaypalnotification.rb'
|
68
|
+
require_relative '../lib/customplan.rb'
|
69
|
+
require_relative '../lib/invoice.rb'
|
70
|
+
require_relative '../lib/invoiceitem.rb'
|
71
|
+
require_relative '../lib/movement.rb'
|
72
|
+
require_relative '../lib/paypalsubscription.rb'
|
73
|
+
require_relative '../lib/extend_client_by_invoicing_payments_processing.rb'
|
74
|
+
end
|
75
|
+
|
76
|
+
class BasePlan
|
77
|
+
PAYMENT_PAY_AS_YOU_GO = 'G'
|
78
|
+
PAYMENT_SUBSCRIPTION = 'S'
|
79
|
+
|
80
|
+
CONSUMPTION_BY_UNIT = 0 # el producto se conume credito por credito. Ejemplo: lead records.
|
81
|
+
CONSUMPTION_BY_TIME = 1 # el producto exira al final del periodo de la factura. Ejemplos: Publicidad. Membresía.
|
82
|
+
|
83
|
+
PRODUCT_WAREHOUSE = 'Warehouse Service'
|
84
|
+
PRODUCT_SOFTWARE = 'Software Service'
|
85
|
+
PRODUCT_AGENCY = 'Agency Service'
|
86
|
+
PRODUCT_EDUCATION = 'Education Service'
|
87
|
+
PRODUCT_OTHER = 'Other Service'
|
88
|
+
|
89
|
+
#
|
90
|
+
def self.payment_types()
|
91
|
+
[PAYMENT_PAY_AS_YOU_GO, PAYMENT_SUBSCRIPTION]
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.payment_type_description(type)
|
95
|
+
return 'Pay as You Go' if type == PAYMENT_PAY_AS_YOU_GO
|
96
|
+
return 'Subscription' if type == PAYMENT_SUBSCRIPTION
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
def self.consumption_types()
|
101
|
+
[CONSUMPTION_BY_UNIT, CONSUMPTION_BY_TIME]
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.consumption_type_description(type)
|
105
|
+
return 'Pay as You Go' if type == CONSUMPTION_BY_UNIT
|
106
|
+
return 'Subscription' if type == CONSUMPTION_BY_TIME
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
def self.product_types()
|
111
|
+
[PRODUCT_WAREHOUSE, PRODUCT_SOFTWARE, PRODUCT_AGENCY, PRODUCT_EDUCATION, PRODUCT_OTHER]
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.product_type_icon(s)
|
115
|
+
return "icon-cloud" if s == PRODUCT_WAREHOUSE
|
116
|
+
return "icon-desktop" if s == PRODUCT_SOFTWARE
|
117
|
+
return "icon-coffee" if s == PRODUCT_AGENCY
|
118
|
+
return "icon-book" if s == PRODUCT_EDUCATION
|
119
|
+
return "icon-help" if s == PRODUCT_OTHER
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end # class BasePlan
|
124
|
+
|
125
|
+
end # module InvoicingPaymentsProcessing
|
126
|
+
|
127
|
+
end # module BlackStack
|
data/lib/movement.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
module BlackStack
|
2
|
+
class Movement < Sequel::Model(:movement)
|
3
|
+
BlackStack::Movement.dataset = BlackStack::Movement.dataset.disable_insert_output
|
4
|
+
self.dataset = self.dataset.disable_insert_output
|
5
|
+
|
6
|
+
many_to_one :invoiceItem, :class=>:'BlackStack::InvoiceItem', :key=>:id_invoice_item
|
7
|
+
many_to_one :client, :class=>:'BlackStack::Client', :key=>:id_client
|
8
|
+
|
9
|
+
MOVEMENT_TYPE_ADD_PAYMENT = 0
|
10
|
+
MOVEMENT_TYPE_ADD_BONUS = 1
|
11
|
+
MOVEMENT_TYPE_REASSIGN_BALANCE = 2
|
12
|
+
MOVEMENT_TYPE_REFUND_BALANCE = 3
|
13
|
+
MOVEMENT_TYPE_CANCELATION = 4 # liability with the client is reduced due service delivery
|
14
|
+
MOVEMENT_TYPE_EXPIRATION = 5 # liability with the client is reduced due credits expiration
|
15
|
+
|
16
|
+
def typeName()
|
17
|
+
if (self.type==MOVEMENT_TYPE_ADD_PAYMENT)
|
18
|
+
return "Payment"
|
19
|
+
elsif (self.type==MOVEMENT_TYPE_ADD_BONUS)
|
20
|
+
return "Bonus"
|
21
|
+
elsif (self.type==MOVEMENT_TYPE_REASSIGN_BALANCE)
|
22
|
+
return "Reassignation"
|
23
|
+
elsif (self.type==MOVEMENT_TYPE_REFUND_BALANCE)
|
24
|
+
return "Refund"
|
25
|
+
elsif (self.type==MOVEMENT_TYPE_CANCELATION)
|
26
|
+
return "Service"
|
27
|
+
elsif (self.type==MOVEMENT_TYPE_EXPIRATION)
|
28
|
+
return "Expiration"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def typeColorName()
|
33
|
+
if (self.type==MOVEMENT_TYPE_ADD_PAYMENT)
|
34
|
+
return "green"
|
35
|
+
elsif (self.type==MOVEMENT_TYPE_ADD_BONUS)
|
36
|
+
return "orange"
|
37
|
+
elsif (self.type==MOVEMENT_TYPE_REASSIGN_BALANCE)
|
38
|
+
return "black"
|
39
|
+
elsif (self.type==MOVEMENT_TYPE_REFUND_BALANCE)
|
40
|
+
return "red"
|
41
|
+
elsif (self.type==MOVEMENT_TYPE_CANCELATION)
|
42
|
+
return "blue"
|
43
|
+
elsif (self.type==MOVEMENT_TYPE_EXPIRATION)
|
44
|
+
return "blue"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# actualiza el registro con los valores del item de una factura
|
49
|
+
# type may be either MOVEMENT_TYPE_ADD_PAYMENT or MOVEMENT_TYPE_ADD_BONUS, but not other value
|
50
|
+
def parse(item, type=MOVEMENT_TYPE_ADD_PAYMENT, description='n/a')
|
51
|
+
plan = BlackStack::InvoicingPaymentsProcessing.plan_descriptor(item.item_number)
|
52
|
+
prod = BlackStack::InvoicingPaymentsProcessing.product_descriptor(plan[:product_code])
|
53
|
+
|
54
|
+
if (self.id==nil)
|
55
|
+
self.id=guid()
|
56
|
+
end
|
57
|
+
self.id_client = item.invoice.id_client
|
58
|
+
self.id_invoice_item = item.id
|
59
|
+
self.create_time = item.invoice.billing_period_from
|
60
|
+
self.type = type
|
61
|
+
if (type != MOVEMENT_TYPE_ADD_BONUS)
|
62
|
+
self.paypal1_amount = item.amount.to_f
|
63
|
+
self.bonus_amount = 0
|
64
|
+
else
|
65
|
+
self.paypal1_amount = 0
|
66
|
+
self.bonus_amount = item.amount.to_f
|
67
|
+
end
|
68
|
+
self.amount = 0-item.amount.to_f
|
69
|
+
self.credits = 0-item.units.to_i
|
70
|
+
self.product_code = item.product_code
|
71
|
+
self.profits_amount = 0
|
72
|
+
self.description = description
|
73
|
+
self.expiration_time = DB["SELECT DATEADD(#{prod[:credits_expiration_period].to_s}#{prod[:credits_expiration_period].to_s}, +#{prod[:credits_expiration_units].to_s}, GETDATE()) AS d"].first[:d].to_s
|
74
|
+
self.save()
|
75
|
+
end
|
76
|
+
|
77
|
+
# Creates a new record in the table movement, as an expiration of the unused credits of this movement.
|
78
|
+
# This movement must be either a payment or a bonus.
|
79
|
+
# This movement must have an expiration time.
|
80
|
+
# The expiraton time of this movement is lower than the current date-time.
|
81
|
+
def expire()
|
82
|
+
m = self
|
83
|
+
p = BlackStack::InvoicingPaymentsProcessing::product_descriptor(m.product_code)
|
84
|
+
|
85
|
+
if m.type != MOVEMENT_TYPE_ADD_PAYMENT && m.type != MOVEMENT_TYPE_ADD_BONUS
|
86
|
+
raise "Movement type mismatch."
|
87
|
+
end
|
88
|
+
|
89
|
+
if m.expiration_time.nil?
|
90
|
+
raise "Expiration time is null."
|
91
|
+
end
|
92
|
+
|
93
|
+
if m.expiration_time >= Time::now()
|
94
|
+
raise "Expiration time is pending."
|
95
|
+
end
|
96
|
+
|
97
|
+
if m.expiration_time <= m.create_time
|
98
|
+
raise "Expiration time is lower then creation time."
|
99
|
+
end
|
100
|
+
|
101
|
+
# calculo cuantos creditos tiene este cliente
|
102
|
+
x = 0.to_f - BlackStack::Balance.new(m.client.id, p[:code]).credits.to_f
|
103
|
+
|
104
|
+
# calculo el credito adquirido luego de este movimiento que voy a cancelar
|
105
|
+
y = m.client.movements.select { |o|
|
106
|
+
(
|
107
|
+
o.type == BlackStack::Movement::MOVEMENT_TYPE_ADD_PAYMENT ||
|
108
|
+
o.type == BlackStack::Movement::MOVEMENT_TYPE_ADD_BONUS
|
109
|
+
) &&
|
110
|
+
o.product_code.upcase == p[:code].upcase &&
|
111
|
+
o.create_time > m.create_time
|
112
|
+
}.inject(0) { |sum, o| sum.to_f + (0.to_f - o.credits.to_f) }.to_f
|
113
|
+
|
114
|
+
# calculo el # de creditos no usados de este movimiento que ha expirado
|
115
|
+
z = x-y>0 ? x-y : 0
|
116
|
+
|
117
|
+
# si el monto expirado es positivo, entonces registro
|
118
|
+
# una cancelacion de saldo
|
119
|
+
if z>0
|
120
|
+
amount = ( m.amount.to_f / m.credits.to_f ) * z.to_f
|
121
|
+
m = BlackStack::Movement.new(
|
122
|
+
:id_client => m.client.id,
|
123
|
+
:create_time => now(),
|
124
|
+
:type => BlackStack::Movement::MOVEMENT_TYPE_EXPIRATION,
|
125
|
+
:description => "Expiration of #{m.id.to_guid}",
|
126
|
+
:paypal1_amount => 0,
|
127
|
+
:bonus_amount => 0,
|
128
|
+
:amount => amount,
|
129
|
+
:credits => z,
|
130
|
+
:profits_amount => -amount,
|
131
|
+
:product_code => p[:code],
|
132
|
+
)
|
133
|
+
m.id = guid()
|
134
|
+
m.save
|
135
|
+
end # z>0
|
136
|
+
end # def expire
|
137
|
+
end # class Movement
|
138
|
+
end # module BlackStack
|
@@ -0,0 +1,131 @@
|
|
1
|
+
module BlackStack
|
2
|
+
class PayPalSubscription < Sequel::Model(:payPal_subscription)
|
3
|
+
BlackStack::PayPalSubscription.dataset = BlackStack::PayPalSubscription.dataset.disable_insert_output
|
4
|
+
many_to_one :buffer_paypal_notification, :class=>:'BlackStack::BufferPayPalNotification', :key=>:id_buffer_paypal_notification
|
5
|
+
many_to_one :client, :class=>:'BlackStack::Client', :key=>:id_client
|
6
|
+
one_to_many :invoices, :class=>:'BlackStack::Invoice', :key=>:id_paypal_subscription
|
7
|
+
|
8
|
+
# -----------------------------------------------------------------------------------------
|
9
|
+
# Factory
|
10
|
+
# -----------------------------------------------------------------------------------------
|
11
|
+
#
|
12
|
+
|
13
|
+
# retorna true si existe un registro en :payPal_subscription con el mismo valor subscr_id.
|
14
|
+
# sin retorna false.
|
15
|
+
def self.load(params)
|
16
|
+
BlackStack::PayPalSubscription.where(:subscr_id=>params['subscr_id']).first
|
17
|
+
end
|
18
|
+
|
19
|
+
# crea un nuevo objeto BufferPayPalNotification, y le mapea los atributos en el hash params.
|
20
|
+
# no guarda el objeto en la base de datos.
|
21
|
+
# retorna el objeto creado.
|
22
|
+
def self.create(params)
|
23
|
+
s = BlackStack::PayPalSubscription.new()
|
24
|
+
s.subscr_id = params['subscr_id'].to_s
|
25
|
+
s.last_name = params['last_name'].to_s
|
26
|
+
s.residence_country = params['residence_country'].to_s
|
27
|
+
s.mc_currency = params['mc_currency'].to_s
|
28
|
+
s.item_name = params['item_name'].to_s
|
29
|
+
s.amount1 = params['amount1'].to_s
|
30
|
+
s.business = params['business'].to_s
|
31
|
+
s.amount3 = params['amount3'].to_s
|
32
|
+
s.recurring = params['recurring'].to_s
|
33
|
+
s.verify_sign = params['verify_sign'].to_s
|
34
|
+
s.payer_status = params['payer_status'].to_s
|
35
|
+
s.test_ipn = params['test_ipn'].to_s
|
36
|
+
s.payer_email = params['payer_email'].to_s
|
37
|
+
s.first_name = params['first_name'].to_s
|
38
|
+
s.receiver_email = params['receiver_email'].to_s
|
39
|
+
s.payer_id = params['payer_id'].to_s
|
40
|
+
s.invoice = params['invoice'].to_s
|
41
|
+
s.reattempt = params['reattempt'].to_s
|
42
|
+
s.item_number = params['item_number'].to_s
|
43
|
+
s.subscr_date = params['subscr_date'].to_s
|
44
|
+
s.charset = params['charset'].to_s
|
45
|
+
s.notify_version = params['notify_version'].to_s
|
46
|
+
s.period1 = params['period1'].to_s
|
47
|
+
s.mc_amount1 = params['mc_amount1'].to_s
|
48
|
+
s.period3 = params['period3'].to_s
|
49
|
+
s.mc_amount3 = params['mc_amount3'].to_s
|
50
|
+
s.ipn_track_id = params['ipn_track_id'].to_s
|
51
|
+
s
|
52
|
+
end
|
53
|
+
|
54
|
+
# retorna un hash descriptor de este objecto
|
55
|
+
def to_hash()
|
56
|
+
ret = {}
|
57
|
+
# campos de uso interno
|
58
|
+
ret['id'] = self.id
|
59
|
+
ret['create_time'] = self.create_time.datetime_sql_to_api
|
60
|
+
ret['id_client'] = self.id_client
|
61
|
+
ret['id_buffer_paypal_notification'] = self.id_buffer_paypal_notification
|
62
|
+
ret['active'] = self.active
|
63
|
+
# vinculacion a objetos
|
64
|
+
ret['id_pipeline'] = self.id_pipeline
|
65
|
+
ret['id_lngroup'] = self.id_lngroup
|
66
|
+
ret['id_crmlist'] = self.id_crmlist
|
67
|
+
# campos replicados del ipn
|
68
|
+
ret['subscr_id'] = self.subscr_id
|
69
|
+
ret['last_name'] = self.last_name
|
70
|
+
ret['residence_country'] = self.residence_country
|
71
|
+
ret['mc_currency'] = self.mc_currency
|
72
|
+
ret['item_name'] = self.item_name
|
73
|
+
ret['amount1'] = self.amount1
|
74
|
+
ret['business'] = self.business
|
75
|
+
ret['amount3'] = self.amount3
|
76
|
+
ret['recurring'] = self.recurring
|
77
|
+
ret['verify_sign'] = self.verify_sign
|
78
|
+
ret['payer_status'] = self.payer_status
|
79
|
+
ret['test_ipn'] = self.test_ipn
|
80
|
+
ret['payer_email'] = self.payer_email
|
81
|
+
ret['first_name'] = self.first_name
|
82
|
+
ret['receiver_email'] = self.receiver_email
|
83
|
+
ret['payer_id'] = self.payer_id
|
84
|
+
ret['invoice'] = self.invoice
|
85
|
+
ret['reattempt'] = self.reattempt
|
86
|
+
ret['item_number'] = self.item_number
|
87
|
+
ret['subscr_date'] = self.subscr_date
|
88
|
+
ret['charset'] = self.charset
|
89
|
+
ret['notify_version'] = self.notify_version
|
90
|
+
ret['period1'] = self.period1
|
91
|
+
ret['mc_amount1'] = self.mc_amount1
|
92
|
+
ret['period3'] = self.period3
|
93
|
+
ret['mc_amount3'] = self.mc_amount3
|
94
|
+
ret['ipn_track_id'] = self.ipn_track_id
|
95
|
+
ret
|
96
|
+
end
|
97
|
+
|
98
|
+
# TODO: deprecated
|
99
|
+
# Retorna el objeto vinculado a esta suscripcion
|
100
|
+
def assignedObject()
|
101
|
+
if (self.item_number =~ /^#{PRODUCT_SSM}\./)
|
102
|
+
return self.pipeline
|
103
|
+
elsif (self.item_number =~ /^#{PRODUCT_FLD}\./)
|
104
|
+
return self.crmlist
|
105
|
+
elsif (self.item_number =~ /^#{PRODUCT_IPJ}\./)
|
106
|
+
return self.lngroup
|
107
|
+
else # unknown
|
108
|
+
return nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# retorna un array con facturas de esta suscripcion
|
113
|
+
def invoices()
|
114
|
+
a = []
|
115
|
+
if self.subscr_id.to_s.size > 0
|
116
|
+
DB[
|
117
|
+
"SELECT DISTINCT i.id " +
|
118
|
+
"FROM invoice i WITH (NOLOCK) " +
|
119
|
+
"JOIN buffer_paypal_notification b WITH (NOLOCK) ON (b.id=i.id_buffer_paypal_notification AND b.subscr_id='#{self.subscr_id.to_s}') "
|
120
|
+
].all { |row|
|
121
|
+
a << BlackStack::Invoice.where(:id=>row[:id]).first
|
122
|
+
# release resources
|
123
|
+
DB.disconnect
|
124
|
+
GC.start
|
125
|
+
}
|
126
|
+
end
|
127
|
+
a
|
128
|
+
end # def invoices
|
129
|
+
|
130
|
+
end # class PayPalSubscription
|
131
|
+
end # module BlackStack
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: invoicing_payments_processing
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Leandro Daniel Sardi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: websocket
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.8
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.2.8
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.2.8
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.2.8
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: json
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.8.1
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 1.8.1
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.8.1
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.8.1
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: tiny_tds
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.0.5
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 1.0.5
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.0.5
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 1.0.5
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: sequel
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 4.28.0
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.28.0
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 4.28.0
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 4.28.0
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: pampa_workers
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 1.1.1
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.1.1
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.1.1
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.1.1
|
113
|
+
description: 'THIS GEM IS STILL IN DEVELOPMENT STAGE. Find documentation here: https://github.com/leandrosardi/invoicing_payments_processing.'
|
114
|
+
email: leandro.sardi@expandedventure.com
|
115
|
+
executables: []
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- lib/balance.rb
|
120
|
+
- lib/bufferpaypalnotification.rb
|
121
|
+
- lib/customplan.rb
|
122
|
+
- lib/extend_client_by_invoicing_payments_processing.rb
|
123
|
+
- lib/invoice.rb
|
124
|
+
- lib/invoiceitem.rb
|
125
|
+
- lib/invoicing_payments_processing.rb
|
126
|
+
- lib/movement.rb
|
127
|
+
- lib/paypalsubscription.rb
|
128
|
+
homepage: https://rubygems.org/gems/invoicing_payments_processing
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
metadata: {}
|
132
|
+
post_install_message:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 2.4.5.1
|
149
|
+
signing_key:
|
150
|
+
specification_version: 4
|
151
|
+
summary: THIS GEM IS STILL IN DEVELOPMENT STAGE. Invoicing and Payments Processing
|
152
|
+
gem (a.k.a. I+2P) is a Ruby gem to setup amazing offers in your website, track them,
|
153
|
+
and also process payments automatically using PayPal.
|
154
|
+
test_files: []
|