Skip to content

Instantly share code, notes, and snippets.

@wladpaiva
Created September 23, 2022 13:36
Show Gist options
  • Save wladpaiva/d5729b35e431c904772ddba01deb7836 to your computer and use it in GitHub Desktop.
Save wladpaiva/d5729b35e431c904772ddba01deb7836 to your computer and use it in GitHub Desktop.
Integracao com o PDV Ecletica em typescript
// 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',
},
],
},
},
}
// 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