Class: Abank::Big
- Inherits:
-
Object
- Object
- Abank::Big
- Defined in:
- lib/abank/big1.rb,
lib/abank/big2.rb,
lib/abank/big3.rb
Overview
Direct Known Subclasses
Constant Summary collapse
- DF =
'%Y-%m-%d'
Instance Attribute Summary collapse
-
#bqnrs ⇒ Integer
readonly
Numero linhas afetadas pelo Data Manipulation Language (DML) no bigquery.
-
#bqres ⇒ Google::Cloud::Bigquery::Data
readonly
Resultado do Structured Query Language (SQL) no bigquery.
-
#ctpos ⇒ Integer
readonly
Contrato arrendamento em tratamento.
-
#mvpos ⇒ Integer
readonly
Movimento do contrato arrendamento em tratamento.
-
#opcao ⇒ Hash
readonly
Opcoes trabalho.
Instance Method Summary collapse
-
#ano ⇒ Integer
Ano da renda.
-
#bqapi ⇒ Google::Cloud::Bigquery
API bigquery.
-
#cnt ⇒ Integer
Numero da renda (0-12).
-
#ct_apaga ⇒ Object
apaga contrato arrendamento.
-
#ct_cria ⇒ Object
cria contrato arrendamento.
-
#ct_dados ⇒ Big
optem lista dados contrato arrendamento (inclui lista movimentos novos).
-
#ct_existe? ⇒ Boolean
Contrato arrendamento ja existe sim/nao?.
-
#ct_rendas(lre = []) ⇒ Array<String>
Lista rendas novas duma lista contratos arrendamento.
-
#ctlct ⇒ Array<Hash>
Lista dados contrato arrendamento (inclui lista movimentos novos).
-
#dias ⇒ Integer
Dias atraso/antecipo neste pagamento renda.
-
#dml(cmd) ⇒ Integer
executa Data Manipulation Language (DML) no bigquery.
-
#initialize(opcoes = {}) ⇒ Hash
constructor
acesso a base dados abank no bigquery.
-
#job(cmd) ⇒ Google::Cloud::Bigquery::QueryJob
Tarefa SQL/DML no bigquery.
-
#ky_mv ⇒ String
Expressao sql da chave de movimentos.
-
#mv_classifica ⇒ Object
classifica movimentos.
-
#mv_delete ⇒ Big
apaga movimentos & suas rendas associadas no bigquery.
-
#mv_delete_dml ⇒ Object
apaga movimentos no bigquery.
-
#mvkys ⇒ String
Movimentos a apagar (keysin.mv).
-
#re_apaga ⇒ Big
apaga rendas da lista de contrato arrendamento.
-
#re_atual ⇒ Hash
Dados contrato arrendamento atual (inclui lista movimentos novos).
-
#re_atual_mv ⇒ Hash
Movimento atual contrato arrendamento.
-
#re_atualiza ⇒ Object
atualiza rendas dos contratos ativos.
-
#re_delete_dml ⇒ Object
apaga rendas da lista de contratos arrendamento.
-
#re_insert ⇒ Object
insere rendas associadas a lista contratos arrendamento no bigquery.
-
#re_nova_renda ⇒ String
Renda formatada (values.re).
-
#re_proximos_dados ⇒ Hash
Dados contrato arrendamento (inclui lista movimentos novos).
-
#re_rendas ⇒ Array<String>
Lista rendas novas dum contrato arrendamento.
-
#re_saldo_mv? ⇒ Boolean
Movimento com saldo suficiente?.
-
#sql(cmd, erro = []) ⇒ Google::Cloud::Bigquery::Data
executa Structured Query Language (SQL) no bigquery.
-
#sql_contrato_mv ⇒ String
Sql para obter dados do inicio contrato arrendamento.
-
#sql_last_re ⇒ String
Sql para obter ultima renda do contrato arrendamento.
-
#sql_novo_mv(mdl) ⇒ String
Sql para obter movimentos novos (depois da ultima renda do contrato arrendamento).
-
#str_lc(sep = "'") ⇒ String
Texto formatado que representa lista de contratos arrendamento.
Constructor Details
#initialize(opcoes = {}) ⇒ Hash
acesso a base dados abank no bigquery
25 26 27 28 |
# File 'lib/abank/big1.rb', line 25 def initialize(opcoes = {}) @opcao = opcoes opcao end |
Instance Attribute Details
#bqnrs ⇒ Integer (readonly)
Returns numero linhas afetadas pelo Data Manipulation Language (DML) no bigquery.
15 16 17 |
# File 'lib/abank/big1.rb', line 15 def bqnrs @bqnrs end |
#bqres ⇒ Google::Cloud::Bigquery::Data (readonly)
Returns resultado do Structured Query Language (SQL) no bigquery.
12 13 14 |
# File 'lib/abank/big1.rb', line 12 def bqres @bqres end |
#ctpos ⇒ Integer (readonly)
Returns contrato arrendamento em tratamento.
9 10 11 |
# File 'lib/abank/big2.rb', line 9 def ctpos @ctpos end |
#mvpos ⇒ Integer (readonly)
Returns movimento do contrato arrendamento em tratamento.
7 8 9 |
# File 'lib/abank/big3.rb', line 7 def mvpos @mvpos end |
#opcao ⇒ Hash (readonly)
Returns opcoes trabalho.
9 10 11 |
# File 'lib/abank/big1.rb', line 9 def opcao @opcao end |
Instance Method Details
#ano ⇒ Integer
Returns ano da renda.
87 88 89 |
# File 'lib/abank/big3.rb', line 87 def ano re_atual[:ano] end |
#bqapi ⇒ Google::Cloud::Bigquery
Returns API bigquery.
31 32 33 |
# File 'lib/abank/big1.rb', line 31 def bqapi @bqapi ||= Google::Cloud::Bigquery.new end |
#cnt ⇒ Integer
Returns numero da renda (0-12).
92 93 94 |
# File 'lib/abank/big3.rb', line 92 def cnt re_atual[:cnt] end |
#ct_apaga ⇒ Object
apaga contrato arrendamento
36 37 38 39 |
# File 'lib/abank/big2.rb', line 36 def ct_apaga @ctlct = [{ ct: opcao[:c] }] re_delete_dml end |
#ct_cria ⇒ Object
cria contrato arrendamento
12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/abank/big2.rb', line 12 def ct_cria unless ct_existe? dml("insert into #{BD}.re #{sql_contrato_mv}") puts("CONTRATO #{opcao[:c]} #{bqnrs.zero? ? 'NAO ' : ''}INSERIDO") end # processar rendas sim/nao? return unless bqnrs.positive? && opcao[:t] # processa rendas associadas ao contrato arrendamento ct_dados.re_insert end |
#ct_dados ⇒ Big
optem lista dados contrato arrendamento (inclui lista movimentos novos)
44 45 46 47 48 49 50 51 |
# File 'lib/abank/big2.rb', line 44 def ct_dados ctlct.map! do |ctr| opcao[:c] = ctr[:ct] lre = sql(sql_last_re)[0] ctr.merge(lre, mv: sql(sql_novo_mv(lre[:dl]))) end self end |
#ct_existe? ⇒ Boolean
Returns contrato arrendamento ja existe sim/nao?.
25 26 27 28 29 30 31 32 33 |
# File 'lib/abank/big2.rb', line 25 def ct_existe? @ctlct = [{ ct: opcao[:c] }] vaz = sql("select ct from #{BD}.re where ct in(#{str_lc}) and cnt=0").empty? unless vaz @bqnrs = 1 puts('CONTRATO JA EXISTE') end !vaz end |
#ct_rendas(lre = []) ⇒ Array<String>
Returns lista rendas novas duma lista contratos arrendamento.
55 56 57 58 59 60 61 62 |
# File 'lib/abank/big2.rb', line 55 def ct_rendas(lre = []) while ctpos < ctlct.size @mvpos = 0 lre += re_rendas @ctpos += 1 end lre end |
#ctlct ⇒ Array<Hash>
Returns lista dados contrato arrendamento (inclui lista movimentos novos).
69 70 71 |
# File 'lib/abank/big2.rb', line 69 def ctlct @ctlct ||= [] end |
#dias ⇒ Integer
Returns dias atraso/antecipo neste pagamento renda.
97 98 99 |
# File 'lib/abank/big3.rb', line 97 def dias re_atual_mv[:dl].mjd - (Date.new(ano, cnt, 1) >> (re_atual[:dc].month - 1)).mjd end |
#dml(cmd) ⇒ Integer
executa Data Manipulation Language (DML) no bigquery
101 102 103 104 105 106 |
# File 'lib/abank/big1.rb', line 101 def dml(cmd) # se job.failed? executa Integer(nil) => StandardError @bqnrs = Integer(job(cmd).num_dml_affected_rows) rescue StandardError @bqnrs = 0 end |
#job(cmd) ⇒ Google::Cloud::Bigquery::QueryJob
Returns tarefa SQL/DML no bigquery.
77 78 79 80 81 82 83 |
# File 'lib/abank/big1.rb', line 77 def job(cmd) bqjob = bqapi.query_job(cmd) bqjob.wait_until_done! err = bqjob.error puts(err['message']) if err bqjob end |
#ky_mv ⇒ String
Returns expressao sql da chave de movimentos.
71 72 73 |
# File 'lib/abank/big1.rb', line 71 def ky_mv 'FARM_FINGERPRINT(CONCAT(CAST(mv.nc as STRING),mv.ds,CAST(mv.dl as STRING),CAST(mv.vl as STRING)))' end |
#mv_classifica ⇒ Object
classifica movimentos
63 64 65 66 67 68 |
# File 'lib/abank/big1.rb', line 63 def mv_classifica dml("update #{BD}.mv set mv.ct=tt.nct from (select * from #{BD}.cl) as tt where #{ky_mv}=tt.ky") puts("MOVIMENTOS CLASSIFICADOS #{bqnrs}") @ctlct = sql("select distinct ct from #{BD}.re") if bqnrs.positive? self end |
#mv_delete ⇒ Big
apaga movimentos & suas rendas associadas no bigquery
43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/abank/big1.rb', line 43 def mv_delete @ctlct = [] unless mvkys.empty? # obtem lista contratos arrendamento associados aos movimentos a apagar @ctlct = sql("select distinct ct from #{BD}.mv where #{ky_mv} in(#{mvkys}) and substr(ct,1,1)='r'") # apaga todas as rendas dos contratos arrendamento associados aos movimentos a apagar opcao[:t] = true unless ctlct.empty? re_apaga.mv_delete_dml end self end |
#mv_delete_dml ⇒ Object
apaga movimentos no bigquery
57 58 59 60 |
# File 'lib/abank/big1.rb', line 57 def mv_delete_dml dml("delete from #{BD}.mv where #{ky_mv} in(#{mvkys})") puts("MOVIMENTOS APAGADOS #{bqnrs}") end |
#mvkys ⇒ String
Returns movimentos a apagar (keysin.mv).
36 37 38 |
# File 'lib/abank/big1.rb', line 36 def mvkys opcao[:k][/([-+]*\d)+(,[-+]*\d+)*/].to_s end |
#re_apaga ⇒ Big
apaga rendas da lista de contrato arrendamento
31 32 33 34 35 36 37 38 39 |
# File 'lib/abank/big3.rb', line 31 def re_apaga return self if !opcao[:t] || ctlct.empty? # para nao apagar contrato arrendamento - somente as rendas opcao[:t] = false re_delete_dml self end |
#re_atual ⇒ Hash
Returns dados contrato arrendamento atual (inclui lista movimentos novos).
77 78 79 |
# File 'lib/abank/big3.rb', line 77 def re_atual ctlct[ctpos] end |
#re_atual_mv ⇒ Hash
Returns movimento atual contrato arrendamento.
82 83 84 |
# File 'lib/abank/big3.rb', line 82 def re_atual_mv re_atual[:mv][mvpos] end |
#re_atualiza ⇒ Object
atualiza rendas dos contratos ativos
10 11 12 13 14 |
# File 'lib/abank/big3.rb', line 10 def re_atualiza # [re]cria rendas novas/todas dos contratos ativos @ctlct = sql("select distinct ct from #{BD}.re") re_apaga.ct_dados.re_insert end |
#re_delete_dml ⇒ Object
apaga rendas da lista de contratos arrendamento
66 67 68 69 |
# File 'lib/abank/big3.rb', line 66 def re_delete_dml dml("delete from #{BD}.re where ct in(#{str_lc})#{opcao[:t] ? '' : ' and cnt>0'}") puts("RENDAS #{str_lc('')} APAGADAS #{bqnrs}") end |
#re_insert ⇒ Object
insere rendas associadas a lista contratos arrendamento no bigquery
17 18 19 20 21 22 23 24 25 26 |
# File 'lib/abank/big3.rb', line 17 def re_insert @ctpos = 0 vls = ct_rendas.join(',') if vls.empty? puts('NAO EXISTEM RENDAS NOVAS') else dml("insert #{BD}.re VALUES#{vls}") puts("RENDAS #{str_lc('')} CRIADAS #{bqnrs}") end end |
#re_nova_renda ⇒ String
Returns renda formatada (values.re).
52 53 54 55 |
# File 'lib/abank/big3.rb', line 52 def re_nova_renda re_proximos_dados "('#{re_atual[:ct]}',#{ano},#{cnt},'#{re_atual_mv[:dl].strftime(DF)}',#{dias})" end |
#re_proximos_dados ⇒ Hash
Returns dados contrato arrendamento (inclui lista movimentos novos).
58 59 60 61 62 63 |
# File 'lib/abank/big3.rb', line 58 def re_proximos_dados # valor renda paga retirada do movimento re_atual_mv[:vl] -= re_atual[:vr] dre = cnt.zero? ? Date.new(ano, 1, 1) : Date.new(ano, cnt, 1) >> 1 re_atual.merge!(ano: dre.year, cnt: dre.month) end |
#re_rendas ⇒ Array<String>
Returns lista rendas novas dum contrato arrendamento.
42 43 44 45 46 47 48 49 |
# File 'lib/abank/big3.rb', line 42 def re_rendas lre = [] while mvpos < re_atual[:mv].size && re_saldo_mv? lre << re_nova_renda @mvpos += 1 unless re_saldo_mv? end lre end |
#re_saldo_mv? ⇒ Boolean
Returns movimento com saldo suficiente?.
72 73 74 |
# File 'lib/abank/big3.rb', line 72 def re_saldo_mv? re_atual_mv[:vl] >= re_atual[:vr] end |
#sql(cmd, erro = []) ⇒ Google::Cloud::Bigquery::Data
executa Structured Query Language (SQL) no bigquery
90 91 92 93 94 95 |
# File 'lib/abank/big1.rb', line 90 def sql(cmd, erro = []) # se job.failed? executa job(cmd).data => StandardError @bqres = job(cmd).data rescue StandardError @bqres = erro end |
#sql_contrato_mv ⇒ String
Returns sql para obter dados do inicio contrato arrendamento.
91 92 93 94 95 96 97 98 99 100 |
# File 'lib/abank/big2.rb', line 91 def sql_contrato_mv cti = opcao[:c] dat = opcao[:d] if dat.empty? 'select ct,EXTRACT(YEAR FROM DATE_TRUNC(dl,MONTH)) ano,0 cnt,DATE_TRUNC(dl,MONTH) dl,0 dias '\ "from #{BD}.mv where ct='#{cti}' order by dl limit 1" else "select '#{cti}' ct,EXTRACT(YEAR FROM DATE '#{dat}') ano,0 cnt,DATE '#{dat}' dl,0 dias" end end |
#sql_last_re ⇒ String
Returns sql para obter ultima renda do contrato arrendamento.
79 80 81 82 83 |
# File 'lib/abank/big2.rb', line 79 def sql_last_re 'select ct,DATE_SUB(DATE_SUB(dl,INTERVAL dias DAY),INTERVAL IF(cnt=0,0,cnt-1) MONTH) dc,ano,cnt,dl'\ ',CAST(REGEXP_EXTRACT(ct,r"\d+") as numeric)/100 vr '\ "from #{BD}.re where ct='#{opcao[:c]}' order by ano desc,cnt desc limit 1" end |
#sql_novo_mv(mdl) ⇒ String
Returns sql para obter movimentos novos (depois da ultima renda do contrato arrendamento).
86 87 88 |
# File 'lib/abank/big2.rb', line 86 def sql_novo_mv(mdl) "select dl,vl from #{BD}.mv where ct='#{opcao[:c]}' and dl>='#{(mdl + 1).strftime(DF)}' order by dl,dv" end |
#str_lc(sep = "'") ⇒ String
Returns texto formatado que representa lista de contratos arrendamento.
74 75 76 |
# File 'lib/abank/big2.rb', line 74 def str_lc(sep = "'") ctlct.map { |cid| sep + cid[:ct] + sep }.join(',') end |