Created
September 23, 2022 13:36
-
-
Save wladpaiva/d5729b35e431c904772ddba01deb7836 to your computer and use it in GitHub Desktop.
Integracao com o PDV Ecletica em typescript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Endpoint(produção): | |
// https://www.pedidoviaweb.com.br/ws/integracao/index.php?metodo=enviaPedido&rede=XXX&loja=XXX | |
// Endpoint(Homologação): | |
// https://www.pedidoviaweb.com.br/teste/ws/integracao/index.php?metodo=enviaPedido&rede=XXX&loja=XXX | |
import {rest} from 'msw' | |
import {setupServer} from 'msw/node' | |
import {Ecletica} from './ecletica.server' | |
const URL = 'https://www.pedidoviaweb.com.br' | |
const PUSH_ORDER_ENDPOINT = | |
'ws/integracao/index.php?metodo=enviaPedido&rede=:redeId&loja=:lojaId' | |
// Initialize the integration with the testing data | |
const integration = new Ecletica({ | |
hash: '.........', | |
rede: 999, | |
loja: 9999, | |
sigla: 'BTC', | |
}) | |
// Setup a mock server | |
const server = setupServer( | |
rest.post(`${URL}/teste/${PUSH_ORDER_ENDPOINT}`, async (req, res, ctx) => { | |
const data = await req.json() | |
let response | |
switch (data.enviaPedidoJSON.dadosPedido.id_transacao) { | |
case '100OCA': | |
response = { | |
cod: '000', | |
msg: 'Operação efetuada com sucesso', | |
dados_adicionais: {prev_entrega: 30}, | |
} | |
break | |
case '102OCA': | |
response = { | |
cod: '006', | |
msg: 'Loja sem internet', | |
dados_adicionais: {pedido_em_processamento: true}, | |
} | |
break | |
default: | |
response = { | |
cod: '006', | |
msg: 'Loja sem internet', | |
dados_adicionais: {pedido_em_processamento: false}, | |
} | |
break | |
} | |
return res(ctx.json(response)) | |
}), | |
) | |
beforeAll(() => { | |
// Establish requests interception layer before all tests. | |
server.listen() | |
}) | |
afterAll(() => { | |
// Clean up after all tests are done, preventing this | |
// interception layer from affecting irrelevant tests. | |
server.close() | |
}) | |
test('should have order integrated', async () => { | |
const result = await integration.enviaPedido(retirada.enviaPedidoJSON) | |
expect(result).toEqual(true) | |
}) | |
test('should have order integrated when the store is no internet but the order is processing', async () => { | |
const result = await integration.enviaPedido(fast.enviaPedidoJSON) | |
expect(result).toEqual(true) | |
}) | |
test('should not have order integrated', async () => { | |
const result = await integration.enviaPedido({ | |
...fast.enviaPedidoJSON, | |
dadosPedido: { | |
...fast.enviaPedidoJSON.dadosPedido, | |
id_transacao: '9990CA', | |
}, | |
}) | |
expect(result).toEqual(false) | |
}) | |
// RETIRADA | |
const retirada: Ecletica.Pedido = { | |
enviaPedidoJSON: { | |
dadosCliente: { | |
nome: 'Joao dos Santos', | |
telefone: '1134567763', | |
telefone_celular: '', | |
email: '[email protected]', | |
logradouro: 'R', | |
endereco: 'Sao Jorge', | |
numero_endereco: 77, | |
complemento: '', | |
ponto_referencia: 'Proximo ao Supermercados Extra', | |
bairro: 'Bom Retiro', | |
cidade: 'São Paulo', | |
uf: 'SP', | |
cep: '04418270', | |
latitude: -23.45678, | |
longitude: -46.126, | |
tipo_cadastro: 'N', | |
cpf_cnpj: '31532277132', | |
obs_cliente: '', | |
}, | |
itensPedido: [ | |
{ | |
id_produto: 1, | |
nome: 'Pepsi 2L', | |
quantidade: 2.0, | |
agrupamento: 1, | |
obs: 'Bem gelada por favor', | |
valor_unitario: 7.0, | |
produto_brinde: 'N', | |
}, | |
{ | |
id_produto: 3, | |
nome: 'Pizza Mussarela', | |
quantidade: 1.0, | |
agrupamento: 2, | |
obs: '', | |
valor_unitario: 25.0, | |
produto_brinde: 'N', | |
}, | |
], | |
dadosPedido: { | |
tipo_pedido: 'E', | |
data_retirada: '03/06/2021', | |
hora_retirada: '13:00:00', | |
id_transacao: '100OCA', | |
rede: '999', | |
loja: '9999', | |
obs: 'CPF na Nota', | |
pagamento: { | |
total: 39.0, | |
vlr_dinheiro: 0.0, | |
vlr_ticket: 0.0, | |
vlr_cartao: 19.0, | |
vlr_cheque: 0.0, | |
vlr_outras: 0.0, | |
pago_online: true, | |
desconto: 0.0, | |
troco: 0.0, | |
taxa_entrega: 0.0, | |
obs: 'CPF na Nota', | |
}, | |
comprovante_pagto: [ | |
{ | |
cod_loja_adquirente: '4753444332', | |
cod_transacao: '1302130158100004392', | |
autorizacao_adquirente: '15811401201394574', | |
nome_bandeira: 'VISA', | |
numero_cartao: '213566******7164', | |
nome_cartao: 'Joao dos Santos', | |
valor_pagamento: 19.0, | |
tipo_detalhe: 'C', | |
codigo_detalhe: '1', | |
}, | |
], | |
detalhe_bandeira: [ | |
{ | |
codigo: 1, | |
valor: 19.0, | |
descricao: 'VISA CRÉDITO', | |
tipo: 'C', | |
}, | |
], | |
}, | |
}, | |
} | |
const fast: Ecletica.Pedido = { | |
enviaPedidoJSON: { | |
dadosCliente: { | |
nome: 'João dos Santos', | |
telefone: '1145636578', | |
telefone_celular: '11934567763 ', | |
email: '[email protected]', | |
logradouro: 'R', | |
endereco: 'São Jorge', | |
numero_endereco: 77, | |
complemento: '', | |
ponto_referencia: 'Proximo ao Supermercados Extra', | |
bairro: 'Bom Retiro', | |
cidade: 'São Paulo', | |
uf: 'SP', | |
cep: '04108870', | |
latitude: -23.45678, | |
longitude: -46.126, | |
tipo_cadastro: 'N', | |
cpf_cnpj: '31572217832', | |
obs_cliente: '', | |
}, | |
itensPedido: [ | |
{ | |
id_produto: 1, | |
nome: 'Pepsi 2L', | |
quantidade: 2.0, | |
agrupamento: 1, | |
obs: 'Bem gelada por favor', | |
valor_unitario: 7.0, | |
produto_brinde: 'N', | |
}, | |
{ | |
id_produto: 3, | |
nome: 'Pizza Mussarela', | |
quantidade: 1.0, | |
agrupamento: 2, | |
obs: '', | |
valor_unitario: 25.0, | |
produto_brinde: 'N', | |
}, | |
], | |
dadosPedido: { | |
tipo_pedido: 'F', | |
id_transacao: '102OCA', | |
rede: '999', | |
loja: '210', | |
pagamento: { | |
total: 38.0, | |
vlr_dinheiro: 0.0, | |
vlr_ticket: 0.0, | |
vlr_cartao: 38.0, | |
vlr_cheque: 0.0, | |
vlr_outras: 0.0, | |
pago_online: true, | |
desconto: 1.0, | |
troco: 0.0, | |
taxa_entrega: 0.0, | |
obs: 'CPF na Nota', | |
}, | |
comprovante_pagto: [ | |
{ | |
cod_loja_adquirente: '4753444332', | |
cod_transacao: '1302130158100004392', | |
autorizacao_adquirente: '15811401201394574', | |
nome_bandeira: 'VISA', | |
numero_cartao: '213566******7164', | |
nome_cartao: 'Joao dos Santos', | |
valor_pagamento: 38.0, | |
tipo_detalhe: 'C', | |
codigo_detalhe: '1', | |
}, | |
], | |
detalhe_bandeira: [ | |
{ | |
codigo: 1, | |
valor: 38.0, | |
descricao: 'VISA CRÉDITO', | |
tipo: 'C', | |
}, | |
], | |
}, | |
}, | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Endpoint(produção): | |
// https://www.pedidoviaweb.com.br/ws/integracao/index.php?metodo=enviaPedido&rede=XXX&loja=XXX | |
// Endpoint(Homologação): | |
// https://www.pedidoviaweb.com.br/teste/ws/integracao/index.php?metodo=enviaPedido&rede=XXX&loja=XXX | |
const URL = 'https://www.pedidoviaweb.com.br' | |
export namespace Ecletica { | |
/** | |
* Configuração de integração com o Ecletica | |
*/ | |
export type Config = { | |
hash: string | |
rede: number | |
loja: number | |
sigla: string | |
} | |
/** | |
* Dados do cliente que está realizando o pedido | |
*/ | |
export type Cliente = { | |
nome: string | |
telefone: string | |
telefone_celular?: string | |
email: string | |
logradouro: string | |
endereco: string | |
numero_endereco: number | |
complemento?: string | |
ponto_referencia?: string | |
bairro: string | |
cidade: string | |
uf: string | |
cep: string | |
latitude: number | |
longitude: number | |
tipo_cadastro: 'N' // | "C", | |
cpf_cnpj?: string | |
obs_cliente?: string | |
} | |
/** | |
* Produtos pedidos pelo cliente. | |
* Detalhe: o Ecletica não aceita customizações de produtos | |
*/ | |
export type ItemPedido = { | |
id_produto: number | |
nome: string | |
quantidade: number | |
agrupamento: number | |
obs?: string | |
valor_unitario: number | |
produto_brinde: 'N' | |
} | |
/** | |
* Como o cliente irá pagar pelo pedido | |
*/ | |
export type Pagamento = { | |
total: number | |
vlr_dinheiro: number | |
vlr_ticket: number | |
vlr_cartao: number | |
vlr_cheque: number | |
vlr_outras: number | |
pago_online: true | |
desconto: number | |
troco: number | |
taxa_entrega: number | |
obs?: string | |
} | |
/** | |
* Comprovante de pagamento do pedido | |
*/ | |
export type ComprovantePagamento = { | |
cod_loja_adquirente: string | |
cod_transacao: string | |
autorizacao_adquirente: string | |
nome_bandeira: string | |
numero_cartao: string | |
nome_cartao: string | |
valor_pagamento: number | |
tipo_detalhe: 'C' // cartão | |
codigo_detalhe: string | |
} | |
/** | |
* Detalhes do cartao de crédito utilizado para pagamento | |
*/ | |
export type DetalheBandeira = { | |
codigo: number | |
valor: number | |
descricao: string | |
tipo: 'C' // cartão | |
} | |
/** | |
* Dados do pedido | |
*/ | |
export type DadosPedidoComun = { | |
id_transacao: string | |
rede: string | |
loja: string | |
obs?: string | |
pagamento: Pagamento | |
comprovante_pagto: ComprovantePagamento[] | |
detalhe_bandeira: DetalheBandeira[] | |
} | |
/** | |
* Tipo de pedido que é retirado pelo cliente | |
*/ | |
export type Retirada = DadosPedidoComun & { | |
tipo_pedido: 'E' | |
data_retirada: string | |
hora_retirada: string | |
} | |
/** | |
* Tipo de pedido Balcao, porem eles usam o nome de Fastfila (usam o example de praca de alimentacao) | |
*/ | |
export type Fastfila = DadosPedidoComun & { | |
tipo_pedido: 'F' | |
} | |
/** | |
* Dados do pedido que será enviado para o Ecletica | |
*/ | |
export type DadosPedido = Retirada | Fastfila | |
/** | |
* JSON enviado para o Ecletica | |
*/ | |
export type Pedido = { | |
enviaPedidoJSON: { | |
dadosCliente: Cliente | |
itensPedido: ItemPedido[] | |
dadosPedido: DadosPedido | |
} | |
} | |
} | |
export class Ecletica { | |
private hash: string | |
private rede: number | |
private loja: number | |
private sigla: string | |
constructor({hash, rede, loja, sigla}: Ecletica.Config) { | |
this.hash = hash | |
this.rede = rede | |
this.loja = loja | |
this.sigla = sigla | |
} | |
public async enviaPedido( | |
enviaPedidoJSON: Ecletica.Pedido['enviaPedidoJSON'], | |
) { | |
const pedido: Ecletica.Pedido = { | |
enviaPedidoJSON, | |
} | |
// adiciona a sigla no final da id_transacao | |
const {id_transacao} = pedido.enviaPedidoJSON.dadosPedido | |
pedido.enviaPedidoJSON.dadosPedido.id_transacao = id_transacao.endsWith( | |
this.sigla, | |
) | |
? id_transacao | |
: `${id_transacao}${this.sigla}` | |
try { | |
const request = await fetch( | |
`${URL}/teste/ws/integracao/index.php?metodo=enviaPedido&rede=${this.rede}&loja=${this.loja}`, | |
{ | |
method: 'POST', | |
headers: { | |
loginToken: this.hash, | |
}, | |
body: JSON.stringify(pedido), | |
}, | |
) | |
const result = await request.json() | |
return ( | |
result.cod === '000' || | |
(result.cod === '006' && | |
result.dados_adicionais?.pedido_em_processamento === true) | |
) | |
} catch (error) { | |
console.log(error) | |
return false | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment