-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathPagamento.js
144 lines (122 loc) · 4.7 KB
/
Pagamento.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
class Pagamento {
constructor(configuracoesSitef) {
this.data = ''
this.continua = 0
this.transacao = ''
this.clisitefApi = new AgenteClisitefAPI()
this.clisitefApi.ConfigurarSitef(configuracoesSitef)
}
inicarPagamento = async(transacoes) => {
let resp
try {
//Percorre o vetor de transações, realizando todas elas.
for(let i = 0; i < transacoes.length; i++){
this.transacao = transacoes[i]
this.transacao.gerarDataHoraTransacao()
//Inicia a transação enviando dados de configuração e da transação do index atual no laço "for".
resp = await this.clisitefApi.startTransaction(await this.idSessaoAtual(), this.transacao)
.then(response => { return response })
.catch(error => { throw error })
//Caso clisitefStatus seja 10000 signfica que a transação foi iniciada com sucesso
//e está aguardando o "continueTransaction".
if(resp.clisitefStatus === 10000){
//Executa o conteudo do while pelo menos uma vez com o "do while"
//para confirmar que continua com estado de sucesso.
do{
resp = await this.clisitefApi.continueTransaction(await this.idSessaoAtual(), this.data, this.continua)
.then(response => { return response })
.catch(error => { throw error })
//Executa e/ou guarda dados para envio para o Sitef de acordo
//com o comando especificado em resp.commandId
this.fluxoSitef(resp.commandId, resp.data)
//Coleta os dados de transação. Ex.: Comprovante.
//Os dados que serão guardados são identificados de acordo com o campo resp.fieldId
//Tambem coleta os dados para uma transação com cartão digitado para envio ao Sitef.
this.coletaDadosDaTransacao(resp.fieldId, resp.data)
}
while(resp.clisitefStatus === 10000)
}
//Para de percorrer o laço de transações, caso alguma delas termine com estado diferente de 0(não OK)
if(resp.clisitefStatus != 0) break
}
//Bloco que finaliza a(s) transação(ões) dependendo do estado final da(s) mesma(s):
//Caso de sucesso[== 0], confirma a(s) transação(ões) pendente(s)
//Caso de falha[!= 0] cancela a(s) transação(ões) pendente(s)
if (resp.clisitefStatus === 0) {
await this.clisitefApi.finishTransaction(await this.idSessaoAtual(), this.transacao, 1)
.then(response => { console.log(response) })
.catch(error => { throw error })
}
else{
await this.clisitefApi.finishTransaction(await this.idSessaoAtual(), this.transacao, 0)
.then(response => { console.log(response) })
.catch(error => { throw error })
}
console.log(transacoes)
}
catch (error) { console.error(error) }
}
idSessaoAtual = async() => {
let sessionResp = await this.clisitefApi.getSession()
if (sessionResp.serviceStatus == 0) {
return sessionResp.sessionId
}
else{
return await this.clisitefApi.createSession('00000000', 'REST0001')
.then(response => { return response.sessionId })
.catch(error => { throw error })
}
}
cancelar = () => { this.continua = -1 }
coletaDadosDaTransacao = (fieldId, buffer) => {
switch (fieldId) {
case 121:
//COMPROVANTE DA TRANSAÇÃO
this.transacao.Comprovante = buffer
break
case 132:
//TIPO DO CARTÃO UTILIZADO
this.transacao.TipoCartao = buffer
break
case 133:
this.transacao.NsuSitef = buffer
break
case 134:
this.transacao.NsuHost = buffer
break
case 157:
this.transacao.CodigoEstabelecimento = buffer
break
//Coleta dos dados do cartão digitado
case 512:
this.data = this.transacao.NumeroCartaoDig
break
case 513:
this.data = this.transacao.DataCartaoDig
break
case 514:
this.data = this.transacao.CodigoCartaoDig
break
}
}
fluxoSitef = (comando, buffer) => {
switch (comando){
//Comandos que trazem mensagens no campo data
case 1:
case 2:
case 3:
case 22:
console.log(buffer)
break
case 21:
console.log(this.transacao)
//Caso o tipo do cartão seja "digitado(2)" ele solicitará o tipo.
//Caso contrário, solicitará a forma de financiamento.
this.data = this.transacao.TipoCartaoSitef == 2 ? this.transacao.TipoCartaoSitef : this.transacao.Financiamento
break
case 30:
this.data = this.transacao.NumeroDeParcelas
break
}
}
}