Class: Abank::Big

Inherits:
Object
  • Object
show all
Defined in:
lib/abank/big1.rb,
lib/abank/big2.rb,
lib/abank/big3.rb

Overview

See Also:

Direct Known Subclasses

Folha

Constant Summary collapse

DF =
'%Y-%m-%d'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opcoes = {}) ⇒ Hash

acesso a base dados abank no bigquery

Parameters:

  • opcoes (Thor::CoreExt::HashWithIndifferentAccess) (defaults to: {})

    trabalho

Options Hash (opcoes):

  • :k (String) — default: ''

    movimentos a apagar (keysin.mv)

  • :c (String) — default: ''

    id contrato arrendamento (re)

  • :d (String) — default: ''

    data inicio contrato arrendamento (re)

  • :t (Boolean) — default: false

    trabalha todas as rendas? (re)



25
26
27
28
# File 'lib/abank/big1.rb', line 25

def initialize(opcoes = {})
  @opcao = opcoes
  opcao
end

Instance Attribute Details

#bqnrsInteger (readonly)

Returns numero linhas afetadas pelo Data Manipulation Language (DML) no bigquery.

Returns:

  • (Integer)

    numero linhas afetadas pelo Data Manipulation Language (DML) no bigquery



15
16
17
# File 'lib/abank/big1.rb', line 15

def bqnrs
  @bqnrs
end

#bqresGoogle::Cloud::Bigquery::Data (readonly)

Returns resultado do Structured Query Language (SQL) no bigquery.

Returns:

  • (Google::Cloud::Bigquery::Data)

    resultado do Structured Query Language (SQL) no bigquery



12
13
14
# File 'lib/abank/big1.rb', line 12

def bqres
  @bqres
end

#ctposInteger (readonly)

Returns contrato arrendamento em tratamento.

Returns:

  • (Integer)

    contrato arrendamento em tratamento



9
10
11
# File 'lib/abank/big2.rb', line 9

def ctpos
  @ctpos
end

#mvposInteger (readonly)

Returns movimento do contrato arrendamento em tratamento.

Returns:

  • (Integer)

    movimento do contrato arrendamento em tratamento



7
8
9
# File 'lib/abank/big3.rb', line 7

def mvpos
  @mvpos
end

#opcaoHash (readonly)

Returns opcoes trabalho.

Returns:

  • (Hash)

    opcoes trabalho



9
10
11
# File 'lib/abank/big1.rb', line 9

def opcao
  @opcao
end

Instance Method Details

#anoInteger

Returns ano da renda.

Returns:

  • (Integer)

    ano da renda



87
88
89
# File 'lib/abank/big3.rb', line 87

def ano
  re_atual[:ano]
end

#bqapiGoogle::Cloud::Bigquery

Returns API bigquery.

Returns:

  • (Google::Cloud::Bigquery)

    API bigquery



31
32
33
# File 'lib/abank/big1.rb', line 31

def bqapi
  @bqapi ||= Google::Cloud::Bigquery.new
end

#cntInteger

Returns numero da renda (0-12).

Returns:

  • (Integer)

    numero da renda (0-12)



92
93
94
# File 'lib/abank/big3.rb', line 92

def cnt
  re_atual[:cnt]
end

#ct_apagaObject

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_criaObject

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_dadosBig

optem lista dados contrato arrendamento (inclui lista movimentos novos)

Returns:

  • (Big)

    acesso a base dados abank no bigquery



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?.

Returns:

  • (Boolean)

    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.

Parameters:

  • are (Array)

    lista rendas novas atual

Returns:

  • (Array<String>)

    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

#ctlctArray<Hash>

Returns lista dados contrato arrendamento (inclui lista movimentos novos).

Examples:

sem dados movimentos

[{ ct: 'r03000' }, ...]

com dados movimentos

[{ct: 'r03000', dc: '2020-03-01', ano: 2020, cnt: 0, dl: '2020-03-01', mv: [{dl: '2020-03-02', vl: 30}, ...]  }]

Returns:

  • (Array<Hash>)

    lista dados contrato arrendamento (inclui lista movimentos novos)



69
70
71
# File 'lib/abank/big2.rb', line 69

def ctlct
  @ctlct ||= []
end

#diasInteger

Returns dias atraso/antecipo neste pagamento renda.

Returns:

  • (Integer)

    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

Parameters:

  • cmd (String)

    comando a executar

Returns:

  • (Integer)

    numero rows afetadas pelo DML



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.

Parameters:

  • cmd (String)

    comando a executar

Returns:

  • (Google::Cloud::Bigquery::QueryJob)

    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_mvString

Returns expressao sql da chave de movimentos.

Returns:

  • (String)

    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_classificaObject

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_deleteBig

apaga movimentos & suas rendas associadas no bigquery

Returns:

  • (Big)

    acesso a base dados abank 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_dmlObject

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

#mvkysString

Returns movimentos a apagar (keysin.mv).

Returns:

  • (String)

    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_apagaBig

apaga rendas da lista de contrato arrendamento

Returns:

  • (Big)

    acesso a base dados abank no bigquery



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_atualHash

Returns dados contrato arrendamento atual (inclui lista movimentos novos).

Returns:

  • (Hash)

    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_mvHash

Returns movimento atual contrato arrendamento.

Returns:

  • (Hash)

    movimento atual contrato arrendamento



82
83
84
# File 'lib/abank/big3.rb', line 82

def re_atual_mv
  re_atual[:mv][mvpos]
end

#re_atualizaObject

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_dmlObject

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_insertObject

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_rendaString

Returns renda formatada (values.re).

Returns:

  • (String)

    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_dadosHash

Returns dados contrato arrendamento (inclui lista movimentos novos).

Returns:

  • (Hash)

    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_rendasArray<String>

Returns lista rendas novas dum contrato arrendamento.

Returns:

  • (Array<String>)

    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?.

Returns:

  • (Boolean)

    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

Parameters:

  • erro (Array) (defaults to: [])

    resultado quando falha execucao

  • cmd (String)

    comando a executar

Returns:

  • (Google::Cloud::Bigquery::Data)

    resultado do SQL



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_mvString

Returns sql para obter dados do inicio contrato arrendamento.

Returns:

  • (String)

    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_reString

Returns sql para obter ultima renda do contrato arrendamento.

Returns:

  • (String)

    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).

Returns:

  • (String)

    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.

Returns:

  • (String)

    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