invoicing_payments_processing 1.1.58 → 1.1.63

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ffa569d58e22432b0ad9f214a6e83faef4f424c0
4
- data.tar.gz: 2dc2ab0fc91b4b7350985678eefb3865bbba9e2c
3
+ metadata.gz: ff9dee57e2b7e6dc8635871fe89ec8dbe98278e8
4
+ data.tar.gz: dc3a121367f28260594a13f3996adec7b0335df9
5
5
  SHA512:
6
- metadata.gz: fdd78f088152e5373a9eff70f66d7ab5629dd290349e84e8d9aa7c91ebb0ad3530ab2c97efda541ad0c56de463b932f05fa9f3f9f6f2231009779fe83ac940b7
7
- data.tar.gz: 20252301b10406afce4d398ebf1e5bcd9965b985b84afcbd5be6b98519661ad97d7e42bdf9aeebbefa66845babd6197e56f3b4102aa94d66904329beae5acb5f
6
+ metadata.gz: 104338f6525e2c8b45a0b120cd6e5ac2ee71573b2c95f7885c6c6da11236ed25e89d766f8528ea19f6c92d89b0ce765b5f6eeb76579e69fc5507d33d6d6b9590
7
+ data.tar.gz: 0a8d4411793c7dc01c02cd0e642487193d35eca8f22ea27985da375d5f63a1f43e866206b80ff0ea1e30c9bd25d18805c3a7c0d359aafa16fa9a75fa54a1bf66
@@ -9,14 +9,14 @@ module BlackStack
9
9
  self.calculate()
10
10
  end
11
11
 
12
- def calculate()
13
- if !self.up_time.nil?
12
+ def calculate(use_stat_balance=true)
13
+ if !self.up_time.nil? || !use_stat_balance
14
14
  q =
15
15
  "select cast(sum(cast(amount as numeric(18,12))) as numeric(18,6)) as amount, sum(credits) as credits " +
16
16
  "from movement with (nolock) " +
17
17
  "where id_client='#{self.client.id}' " +
18
18
  "and product_code='#{self.product_code}' " +
19
- "and create_time < '#{self.up_time.to_time.to_sql}' "
19
+ "and create_time <= '#{self.up_time.to_time.to_sql}' "
20
20
  else
21
21
  q =
22
22
  "select cast(sum(cast(amount as numeric(18,12))) as numeric(18,6)) as amount, sum(credits) as credits " +
@@ -24,7 +24,7 @@ module BlackStack
24
24
  "where x.id_client='#{self.client.id}' " +
25
25
  "and x.product_code='#{self.product_code}' "
26
26
  end
27
-
27
+ #puts "Balance.calculate:q:#{q}:."
28
28
  row = DB[q].first
29
29
  self.amount = row[:amount].to_f
30
30
  self.credits = row[:credits].to_f
@@ -8,8 +8,52 @@ module BlackStack
8
8
  one_to_many :customplans, :class=>:'BlackStack::CustomPlan', :key=>:id_client
9
9
  one_to_many :movements, :class=>:'BlackStack::Movement', :key=>:id_client
10
10
 
11
+ # how many minutes ago should have updated the table stat_balance with the amount and credits of this client, for each product.
12
+ def stat_balance_delay_minutes
13
+ row = DB[
14
+ "SELECT TOP 1 m.id " +
15
+ "FROM client c WITH (NOLOCK) " +
16
+ "JOIN movement m WITH (NOLOCK INDEX(IX_movement__id_client__create_time_desc)) ON ( c.id=m.id_client AND m.create_time > ISNULL(c.last_stat_balance_update_time, '1900-01-01') ) " +
17
+ "WHERE c.id = '#{self.id}' " +
18
+ "ORDER BY m.create_time DESC "
19
+ ].first
20
+
21
+ if row.nil?
22
+ return 0
23
+ else
24
+ return DB["SELECT DATEDIFF(MI, m.create_time, GETDATE()) AS n FROM movement m WITH (NOLOCK) WHERE m.id='#{row[:id]}'"].first[:n]
25
+ end
26
+ end
27
+
28
+ # update the table stat_balance with the amount and credits of this client, for each product.
29
+ def update_stat_balance(product_code=nil)
30
+ c = self
31
+ product_descriptors = BlackStack::InvoicingPaymentsProcessing::products_descriptor.clone
32
+ product_descriptors.select! { |hprod| hprod[:code] == product_code } if !product_code.nil?
33
+ product_descriptors.each { |hprod|
34
+ row = DB[
35
+ "select isnull(sum(isnull(m.credits,0)),0) as credits, isnull(sum(isnull(m.amount,0)),0) as amount " +
36
+ # "from movement m with (nolock index(IX_movement__id_client__product_code)) " +
37
+ "from movement m with (nolock) " +
38
+ "where m.id_client='#{c.id}' " +
39
+ "and m.product_code='#{hprod[:code]}' "
40
+ ].first
41
+ credits = row[:credits]
42
+ amount = row[:amount]
43
+ row = DB["SELECT * FROM stat_balance WHERE id_client='#{c.id}' AND product_code='#{hprod[:code]}'"].first
44
+ if row.nil?
45
+ DB.execute("INSERT INTO stat_balance (id_client, product_code, amount, credits) VALUES ('#{c.id}', '#{hprod[:code]}', #{amount.to_s}, #{credits.to_s})")
46
+ else
47
+ DB.execute("UPDATE stat_balance SET amount=#{amount.to_s}, credits=#{credits.to_s} WHERE id_client='#{c.id}' AND product_code='#{hprod[:code]}'")
48
+ end
49
+ DB.execute("UPDATE client SET last_stat_balance_update_time=GETDATE() WHERE [id]='#{c.id}'")
50
+ }
51
+ end
52
+
11
53
  # crea/actualiza un registro en la tabla movment, reduciendo la cantidad de creditos y saldo que tiene el cliente, para el producto indicado en product_code.
12
- def consume(product_code, number_of_credits=1, description=nil)
54
+ def consume(product_code, number_of_credits=1, description=nil, datetime=nil)
55
+ dt = datetime.nil? ? now() : datetime.to_time.to_sql
56
+
13
57
  # create the consumtion
14
58
  total_credits = 0.to_f - BlackStack::Balance.new(self.id, product_code).credits.to_f
15
59
  total_amount = 0.to_f - BlackStack::Balance.new(self.id, product_code).amount.to_f
@@ -18,7 +62,7 @@ module BlackStack
18
62
  cons = BlackStack::Movement.new
19
63
  cons.id = guid()
20
64
  cons.id_client = self.id
21
- cons.create_time = now()
65
+ cons.create_time = dt
22
66
  cons.type = BlackStack::Movement::MOVEMENT_TYPE_CANCELATION
23
67
  cons.description = description.nil? ? 'Consumption' : description
24
68
  cons.paypal1_amount = 0
@@ -85,18 +85,7 @@ module BlackStack
85
85
  def allowedToAddRemoveItems?
86
86
  return (self.status == STATUS_UNPAID || self.status == nil) && (self.disabled_for_add_remove_items == false || self.disabled_for_add_remove_items == nil)
87
87
  end
88
-
89
- # envia un email transaccional con informacion de facturacion, y pasos a seguir despues del pago
90
- def notificationSubject()
91
- "We Received Your Payment"
92
- end
93
-
94
- #
95
- def notificationBody()
96
- "<p>We received your payment for a total of $#{("%.2f" % self.total()).to_s}.</p>" +
97
- "<p>You can find your invoice <a href='#{CS_HOME_PAGE}/member/invoice?iid=#{self.id.to_guid}'><b>here</b></a></p>"
98
- end
99
-
88
+
100
89
  #
101
90
  def number()
102
91
  self.id.to_guid
@@ -121,7 +121,19 @@ module BlackStack
121
121
 
122
122
  # Returns the number of credits assigned in the movement that have been consumed.
123
123
  # The movment must be a payment or a bonus
124
- def credits_consumed()
124
+ #
125
+ # registraton_time: consider only movements before this time. If it is nil, this method will consider all the movements.
126
+ #
127
+ def credits_consumed(registraton_time=nil)
128
+ # le agrego 365 dias a la fecha actual, para abarcar todas las fechas ocurridas hasta hoy seguro
129
+ if registraton_time.nil?
130
+ registraton_time = (Time.now() + 365*24*60*60)
131
+ else
132
+ registraton_time = registraton_time.to_time if registraton_time.class != Time
133
+ end
134
+ # move time to the first second of the next day.
135
+ # example: '2020-11-12 15:49:43 -0300' will be converted to '2020-11-13 00:00:00 -0300'
136
+ registraton_time = (Date.strptime(registraton_time.strftime("%Y-%m-%d"), "%Y-%m-%d").to_time + 24*60*60)
125
137
  # the movment must be a payment or a bonus
126
138
  raise 'Movement must be either a payment or a bonus' if self.type != MOVEMENT_TYPE_ADD_PAYMENT && self.type != MOVEMENT_TYPE_ADD_BONUS
127
139
  #puts
@@ -131,7 +143,8 @@ module BlackStack
131
143
  self.client.movements.select { |o|
132
144
  (o.type == MOVEMENT_TYPE_ADD_PAYMENT || o.type == MOVEMENT_TYPE_ADD_BONUS) &&
133
145
  o.credits.to_f < 0 &&
134
- o.product_code.upcase == self.product_code.upcase
146
+ o.product_code.upcase == self.product_code.upcase &&
147
+ o.create_time.to_time < registraton_time.to_time
135
148
  }.sort_by { |o| o.create_time }.each { |o|
136
149
  paid += (0.to_f - o.credits.to_f)
137
150
  break if o.id.to_guid == self.id.to_guid
@@ -140,7 +153,8 @@ module BlackStack
140
153
  # calculo los credito para este producto, desde el primer dia; incluyendo cosumo, expiraciones, ajustes.
141
154
  consumed = self.client.movements.select { |o|
142
155
  o.credits.to_f > 0 &&
143
- o.product_code.upcase == self.product_code.upcase
156
+ o.product_code.upcase == self.product_code.upcase &&
157
+ o.create_time.to_time < registraton_time.to_time
144
158
  }.inject(0) { |sum, o| sum.to_f + o.credits.to_f }.to_f
145
159
  #puts "consumed:#{consumed.to_s}:."
146
160
  # calculo los creditos de este movimiento que voy a cancelar
@@ -184,19 +198,28 @@ module BlackStack
184
198
 
185
199
  # credits expiration
186
200
  def expire(registraton_time=nil, desc='Expiration Because Allocation is Renewed')
187
- credits_consumed = self.credits_consumed
201
+ #puts
202
+ #puts "registraton_time:#{registraton_time.to_s}:."
203
+ credits_consumed = self.credits_consumed(registraton_time)
204
+ #puts "credits_consumed:#{credits_consumed.to_s}:."
188
205
  #
189
206
  self.expiration_start_time = now()
190
207
  self.expiration_tries = self.expiration_tries.to_i + 1
191
208
  self.save
192
209
  #
193
- total_credits = 0.to_f - BlackStack::Balance.new(self.client.id, self.product_code, registraton_time).credits.to_f
194
- total_amount = 0.to_f - BlackStack::Balance.new(self.client.id, self.product_code, registraton_time).amount.to_f
210
+ balance = BlackStack::Balance.new(self.client.id, self.product_code, registraton_time)
211
+ balance.calculate(false)
212
+ #puts "balance.credits.to_s:#{balance.credits.to_s}:."
213
+ #puts "balance.amount.to_s:#{balance.amount.to_s}:."
214
+ total_credits = 0.to_f - balance.credits.to_f
215
+ total_amount = 0.to_f - balance.amount.to_f
195
216
  #
196
217
  credits = 0.to_i - self.credits.to_i
197
218
  #
198
219
  credits_to_expire = credits - credits_consumed.to_i #- (0.to_f - self.credits.to_f)).to_i
199
220
  amount_to_expire = total_credits.to_f == 0 ? 0 : credits_to_expire.to_f * ( total_amount.to_f / total_credits.to_f )
221
+ #puts "credits_to_expire.to_s:#{credits_to_expire.to_s}:."
222
+ #puts "amount_to_expire.to_s:#{amount_to_expire.to_s}:."
200
223
  #
201
224
  exp = BlackStack::Movement.new
202
225
  exp.id = guid()
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: invoicing_payments_processing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.58
4
+ version: 1.1.63
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leandro Daniel Sardi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-06 00:00:00.000000000 Z
11
+ date: 2020-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: websocket