Integração do sistema de PDV com o MFE (Módulo Fiscal Eletrônico) – Equipamento que atende à especificação nacional do SAT (CF-e-SAT), prevista no ATO COTEPE 33/2011, com especificações adicionais do Estado do Ceará, responsável pela emissão do Cupom Fiscal Eletrônico – CF-e. A função desse equipamento é substituir o equipamento SAT já utilizado no estado de São Paulo.
Comunicação:
Para realizar a comunicação do equipamento MFE com a Secretaria da Fazenda do Estado do Ceará - SEFAZ-CE, foi desenvolvido um aplicativo chamado Integrador Fiscal, que é uma plataforma de comunicação disponibilizada pela SEFAZ-CE para a integração de AC/PDV dos estabelecimentos contribuintes do ICMS do estado. O Integrador é responsável por realizar o envio das solicitações de pagamento e dados das vendas para o MFE e para a SEFAZ. As requisições são passadas para o Integrador através do repositório de entrada do Integrador, onde o MID-e Client grava um arquivo XML que é consumido pelo Integrador. Após processar as requisições o Integrador gera um XML de retorno na sua pasta de saída, que é consumido e apagado pelo MID-e Client, que devolve os dados do retorno ao PDV. A comunicação da AC/PDV com o Integrador Fiscal é realizada através do MID-e Client, cabendo ao AC/PDV enviar as requisições via API no formato JSON.
Antes de realizar a emissão do CF-e, será obrigatório enviar a SEFAZ os dados do Recebimento da venda quando este for realizado via TEF ou POS, para isso foi criado o VFP-e ou sistema de verificação de pagamentos eletrônico. O sistema VFP-e visa cruzar as informações do recebimento com a nota emitida, garantindo que todo pagamento recebido via cartão seja vinculado a um documento fiscal. Caso os dados do pagamento não sejam enviados para o verificador a emissão do CF-e não poderá ser realizada.
Instalação:
Para maiores informações, documentos, manuais e instaladores referentes ao MFE, favor acessar os seguintes links para download
Estrutura do Banco de Dados:
Para o controle dos pagamentos via TEF ou POS enviados a SEFAZ-CE, foi necessário a criação de tabelas para gravar os dados obrigatórios do pagamento. Foram adicionadas no Banco de Dados do sistema as seguintes tabelas: TAB_PAGAMENTO_MFE_ABERTO (armazena os dados dos pagamentos a cartão TEF ou POS enquanto os mesmos ainda estão abertos), TAB_PAGAMENTO_MFE (armazena os dados dos pagamentos), TAB_CADASTRO_POS (Armazena os dados dos terminais de POS, cadastrados no Sistema de Gestão). Além das tabelas adicionadas foi alterado a procedure SP_GRAVA_CUPOM_FISCAL para gravar os dados da TAB_PAGAMENTO_MFE_ABERTO para a TAB_PAGAMENTO_MFE.
CREATE TABLE TAB_PAGAMENTO_MFE_ABERTO ( NOM_HOST VARCHAR(30) NOT NULL, NUM_SERIE_ECF VARCHAR(20) NOT NULL, NUM_CUPOM INTEGER NOT NULL, SEQ_PAGAMENTO INTEGER NOT NULL, COD_RESPOSTA_MFE VARCHAR(4), VAL_RESPOSTA_MFE VARCHAR(32), ID_REFERENCIA_ORIGINAL INTEGER, ID_REFERENCIA_CLIENT INTEGER, ID_PAGAMENTO INTEGER, DES_MENSAGEM_MFE VARCHAR(255), DES_STATUS_PAGAMENTO VARCHAR(100), COD_AUTORIZACAO_MFE VARCHAR(20), NUM_BIN_CARTAO VARCHAR(8), NOM_DONO_CARTAO VARCHAR(120), DTA_EXPIRACAO VARCHAR(5), DES_INSTITUICAO_FINANCEIRA VARCHAR(100), NUM_PARCELAS VARCHAR(100), NUM_ULTIMOS_QUATRO_DIGITOS VARCHAR(6), COD_PAGAMENTO VARCHAR(20), VAL_PARAMETRO VARCHAR(20), ID_FILA INTEGER, DES_TIPO VARCHAR(10), DES_RETORNO VARCHAR(100), NUM_NSU VARCHAR(10), NUM_APROVACAO VARCHAR(20), DES_BANDEIRA VARCHAR(100), DES_ADQUIRENTE VARCHAR(100), IND_TIPO_PAGTO VARCHAR(15), COD_POS INTEGER ); ALTER TABLE TAB_PAGAMENTO_MFE_ABERTO ADD CONSTRAINT PK_TAB_PAGAMENTO_MFE_ABERTO PRIMARY KEY (NOM_HOST, NUM_SERIE_ECF, NUM_CUPOM, SEQ_PAGAMENTO); |
DDL TAB_PAGAMENTO_MFE_ABERTO
CREATE TABLE TAB_PAGAMENTO_MFE ( SEQ_CUPOM INTEGER NOT NULL, SEQ_PAGAMENTO INTEGER NOT NULL, COD_RESPOSTA_MFE VARCHAR(4), VAL_RESPOSTA_MFE VARCHAR(32), ID_REFERENCIA_ORIGINAL INTEGER, ID_REFERENCIA_CLIENT INTEGER, ID_PAGAMENTO INTEGER, DES_MENSAGEM_MFE VARCHAR(255), DES_STATUS_PAGAMENTO VARCHAR(100), COD_AUTORIZACAO_MFE VARCHAR(20), NUM_BIN_CARTAO VARCHAR(8), NOM_DONO_CARTAO VARCHAR(120), DTA_EXPIRACAO VARCHAR(5), DES_INSTITUICAO_FINANCEIRA VARCHAR(100), NUM_PARCELAS VARCHAR(100), NUM_ULTIMOS_QUATRO_DIGITOS VARCHAR(6), COD_PAGAMENTO VARCHAR(20), VAL_PARAMETRO VARCHAR(20), ID_FILA INTEGER, DES_TIPO VARCHAR(10), DES_RETORNO VARCHAR(100), NUM_NSU VARCHAR(10), NUM_APROVACAO VARCHAR(20), DES_BANDEIRA VARCHAR(100), DES_ADQUIRENTE VARCHAR(100), IND_TIPO_PAGTO VARCHAR(15), COD_POS INTEGER ); ALTER TABLE TAB_PAGAMENTO_MFE ADD CONSTRAINT PK_TAB_PAGAMENTO_MFE PRIMARY KEY (SEQ_CUPOM, SEQ_PAGAMENTO); |
DDL TAB_PAGAMENTO_MFE
CREATE TABLE TAB_CADASTRO_POS ( COD_POS INTEGER NOT NULL, DES_POS VARCHAR(100), NUM_SERIE_POS VARCHAR(50), NOM_HOST VARCHAR(30), NUM_CNPJ_ADQUIRENTE VARCHAR(14), DES_GUID VARCHAR(32), COD_ESTABELECIMENTO VARCHAR(5) ); ALTER TABLE TAB_CADASTRO_POS ADD CONSTRAINT UNQ1_TAB_CADASTRO_POS UNIQUE (NUM_SERIE_POS); ALTER TABLE TAB_CADASTRO_POS ADD CONSTRAINT PK_TAB_CADASTRO_POS PRIMARY KEY (COD_POS); |
DDL TAB_CADASTRO_POS
CREATE OR ALTER PROCEDURE SP_GRAVA_CUPOM_FISCAL ( SEQTURNO INTEGER, NOMHOST VARCHAR(30), NUMSERIEECF VARCHAR(20), NUMCUPOM INTEGER) AS DECLARE VARIABLE SEQHAVER INTEGER; DECLARE VARIABLE SEQCUPOM INTEGER; DECLARE VARIABLE DOTZ INTEGER; DECLARE VARIABLE VALDESCUPOM NUMERIC(9,2); DECLARE VARIABLE VALACRCUPOM NUMERIC(9,2); DECLARE VARIABLE VALTOTALCUPOM NUMERIC(9,2); DECLARE VARIABLE VALTOTALITENS NUMERIC(9,2); DECLARE VARIABLE VALTOTALPAGTOS NUMERIC(9,2); BEGIN / CONSISTE VALOR TOTAL DO CUPOM, DOS ITENS E PAGAMENTOS*/* SELECT VAL_DESCONTO, VAL_ACRESCIMO, VAL_TOTAL_CUPOM FROM TAB_CUPOM_FISCAL_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM INTO :VALDESCUPOM, :VALACRCUPOM, :VALTOTALCUPOM; SELECT SUM(VAL_TOTAL_ITEM) - :VALDESCUPOM + :VALACRCUPOM FROM TAB_ITEM_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM AND IND_CANCELADO = 'N' INTO :VALTOTALITENS; SELECT COALESCE(SUM(VAL_PAGAMENTO), 0) FROM TAB_PAGAMENTO_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM INTO :VALTOTALPAGTOS; IF (((UDF_TRUNCDEC(VALTOTALCUPOM, 2) <> UDF_TRUNCDEC(VALTOTALITENS, 2)) AND (UDF_TRUNCDEC(VALTOTALCUPOM, 2) <> 0)) OR (UDF_TRUNCDEC(VALTOTALPAGTOS, 2) < UDF_TRUNCDEC(VALTOTALCUPOM, 2))) THEN *EXCEPTION E0011 ' - TOTAL CUPOM: ' | CAST(:VALTOTALCUPOM AS VARCHAR(10)) | ' TOTAL ITENS: ' | CAST(:VALTOTALITENS AS VARCHAR(10)) | | CAST(:VALTOTALPAGTOS AS VARCHAR(10));* SEQCUPOM = GEN_ID(GEN_CUPOM_FISCAL, 1); */GRAVA O SEQCUPOM NA TAB_CHEQUE_TROCO/* UPDATE TAB_CHEQUE_TROCO SET SEQ_CUPOM = :SEQCUPOM WHERE SEQ_TURNO = :SEQTURNO AND NUM_CUPOM = :NUMCUPOM; */TRANSFERE TODOS OS CHEQUES UTILIZADOS NO CUPOM PARA A TAB_CHEQUE_TROCO_CUPOM/ INSERT INTO TAB_CHEQUE_TROCO_CUPOM* |
---|
SELECT SEQ_CHEQUE, SEQ_CUPOM, DTA_EMISSAO, NUM_CHEQUE, VAL_CHEQUE FROM TAB_CHEQUE_TROCO WHERE SEQ_CUPOM = :SEQCUPOM; INSERT INTO TAB_CUPOM_FISCAL (SEQ_CUPOM, SEQ_TURNO, NUM_SERIE_ECF, NUM_CUPOM, DTA_CUPOM, COD_CLIENTE, COD_VENDEDOR, VAL_TOTAL_ITEM, VAL_DESCONTO, VAL_ACRESCIMO, VAL_TOTAL_CUPOM, VAL_TROCO, IND_CANCELADO, IND_IMPRESSAO_AUTOMATICA, NUM_PLACA, DES_VEICULO, NUM_ODOMETRO, QTD_QUILOMETRAGEM, HRA_INICIO, HRA_FIM, IND_VENDA_SINCRONIZADA, IND_CANCELAMENTO_SINCRONIZADO, DES_OBSERVACAO, NOM_CLIENTE, NUM_CNPJ_CPF, NUM_IE_RG, DES_LOGRADOURO, NUM_REQUISICAO, DES_FROTA, NUM_CARTAO, NOM_MOTORISTA, NOM_OPERADOR, DES_CAMPO1, DES_CAMPO2, DES_CAMPO3, DES_CAMPO4, DES_CAMPO5, SITUACAO_VEICULO, NUM_REDZ, NUM_DIST_PERC_SEMANA, NUM_CCF, HRA_INICIO_COMPLETO, SEQ_PRE_VENDA_MOBILE) SELECT :SEQCUPOM, :SEQTURNO, NUM_SERIE_ECF, NUM_CUPOM, DTA_CUPOM, COD_CLIENTE, COD_VENDEDOR, VAL_TOTAL_ITEM, VAL_DESCONTO, VAL_ACRESCIMO, VAL_TOTAL_CUPOM, VAL_TROCO, 'N', IND_IMPRESSAO_AUTOMATICA, NUM_PLACA, DES_VEICULO, NUM_ODOMETRO, QTD_QUILOMETRAGEM, HRA_INICIO, HRA_FIM, 'N', 'N', DES_OBSERVACAO, NOM_CLIENTE, NUM_CNPJ_CPF, NUM_IE_RG, DES_LOGRADOURO, NUM_REQUISICAO, |
DES_FROTA, NUM_CARTAO, NOM_MOTORISTA, NOM_OPERADOR, DES_CAMPO1, DES_CAMPO2, DES_CAMPO3, DES_CAMPO4, DES_CAMPO5, SITUACAO_VEICULO, NUM_REDZ, NUM_DIST_PERC_SEMANA, NUM_CCF, HRA_INICIO_COMPLETO, SEQ_PRE_VENDA_MOBILE FROM TAB_CUPOM_FISCAL_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; SELECT SUM(QTD_PONTOS) AS QTD_PONTOS FROM TAB_ITEM_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM AND IND_CANCELADO = 'N' INTO :DOTZ; IF (:DOTZ > 0) THEN BEGIN INSERT INTO TAB_CUPOM_FISCAL_DOTZ ( SEQ_CUPOM, NUM_CPF_CNPJ, NUM_CARTAO_DOTZ, DES_EMAIL) SELECT :SEQCUPOM, NUM_CPF_CNPJ_DOTZ, NUM_CARTAO_DOTZ, DES_EMAIL FROM TAB_CUPOM_FISCAL_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; END DELETE FROM TAB_CUPOM_FISCAL_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; INSERT INTO TAB_ITEM_CUPOM (SEQ_CUPOM, SEQ_ITEM, COD_BARRA, DES_ITEM, QTD_ITEM, VAL_UNITARIO, VAL_BRUTO_ITEM, VAL_DESCONTO, VAL_ACRESCIMO, VAL_TOTAL_ITEM, VAL_DESCONTO_RATEADO, VAL_ACRESCIMO_RATEADO, COD_REGISTRADOR_FISCAL, IND_CANCELADO, COD_BICO, NUM_ENCERRANTE, DTA_ABASTECIMENTO, HRA_ABASTECIMENTO, QTD_PONTO_OBTIDO, SEQ_ABASTECIMENTO, COD_VENDEDOR, SEQ_PEDIDO, NOM_OPERADOR, SEQ_ITEM_MIX, COD_BARRA_MIX, IND_ARREDONDA_TRUNCAMENTO, IND_PRODUCAO_PROPRIA_TERCEIRO, |
QTD_CASAS_QUANTIDADE, QTD_CASAS_VAL_UNITARIO, SEQ_MOVIMENTO_ENCERRANTE, VAL_DESCONTO_PROMOCAO, SEQ_NCM, VAL_ALIQUOTA_IMPOSTO, VAL_IMPOSTO, PER_ALIQUOTA_FEDERAL, VAL_IMPOSTO_FEDERAL, PER_ALIQUOTA_MUNICIPAL, VAL_IMPOSTO_MUNICIPAL, DES_ORIGEM, VAL_DESCONTO_AMBEV, QTD_APROVADA_AMBEV, COD_TRIBUTACAO, PER_ALIQUOTA, IND_TRUNCA_ARREDONDA ) SELECT :SEQCUPOM, SEQ_ITEM, COD_BARRA, DES_ITEM, QTD_ITEM, VAL_UNITARIO, VAL_BRUTO_ITEM, VAL_DESCONTO, VAL_ACRESCIMO, VAL_TOTAL_ITEM, VAL_DESCONTO_RATEADO, VAL_ACRESCIMO_RATEADO, COD_REGISTRADOR_FISCAL, IND_CANCELADO, COD_BICO, NUM_ENCERRANTE, DTA_ABASTECIMENTO, HRA_ABASTECIMENTO, QTD_PONTO_OBTIDO, SEQ_ABASTECIMENTO, COD_VENDEDOR, SEQ_PEDIDO, NOM_OPERADOR, SEQ_ITEM_MIX, COD_BARRA_MIX, IND_ARREDONDA_TRUNCAMENTO, IND_PRODUCAO_PROPRIA_TERCEIRO, QTD_CASAS_QUANTIDADE, QTD_CASAS_VAL_UNITARIO, SEQ_MOVIMENTO_ENCERRANTE, VAL_DESCONTO_PROMOCAO, SEQ_NCM, VAL_ALIQUOTA_IMPOSTO, VAL_IMPOSTO, PER_ALIQUOTA_FEDERAL, VAL_IMPOSTO_FEDERAL, PER_ALIQUOTA_MUNICIPAL, VAL_IMPOSTO_MUNICIPAL, DES_ORIGEM, VAL_DESCONTO_AMBEV, QTD_APROVADA_AMBEV, COD_TRIBUTACAO, PER_ALIQUOTA, IND_TRUNCA_ARREDONDA FROM TAB_ITEM_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; IF (:DOTZ > 0) THEN BEGIN INSERT INTO TAB_ITEM_CUPOM_FISCAL_DOTZ ( SEQ_CUPOM, SEQ_ITEM, COD_PROMOCAO_DOTZ, QTD_PONTOS) SELECT :SEQCUPOM, SEQ_ITEM, COD_PROMOCAO_DOTZ, QTD_PONTOS FROM TAB_ITEM_CUPOM_ABERTO |
WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; END DELETE FROM TAB_ITEM_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; EXECUTE PROCEDURE SP_ATUALIZA_DESCONTO_ACRESCIMO(0, 0, 0, :NUMSERIEECF, :NUMCUPOM, SEQCUPOM); INSERT INTO TAB_PAGAMENTO_CUPOM (SEQ_CUPOM, SEQ_PAGAMENTO, COD_FORMA_PAGTO, VAL_PAGAMENTO, COD_BANCO, NUM_AGENCIA, NUM_CONTA, NUM_CHEQUE, VAL_CHEQUE, DTA_CHEQUE, NUM_CNPJ_CPF, DTA_PREDATADO, NUM_TELEFONE, NOM_REDE_TEF, NOM_ADMINISTRADORA_TEF, NUM_TRANSACAO_TEF, DTA_TRANSACAO_TEF, HRA_TRANSACAO_TEF, IND_TIPO_TRANSACAO_TEF, QTD_PARCELAS_TEF, NUM_CARTA_FRETE, NUM_ADIANTAMENTO_FRETE, SEQ_HAVER, NUM_CMC7, VAL_TROCO_TEF, COD_PESSOA_SACADO, NUM_AUTORIZACAO_POS, NUM_GNF, DES_FORMA_PAGTO_ECF, NSU_SEM_PARAR, NOM_REDE_TEF_ORIGINAL, IND_TRANSACAO_TEF_CANCELADA, VAL_DESCONTO_TEF, COD_TIPO_DOCUMENTO_PAF, COD_AUTORIZACAO_TRASACAO_TEF, NSU_PIT_STOP, COD_AUTORIZACAO_ACELERA, VAL_SALDO_CLIENTE_FIDEL, SEQ_CARTA_FRETE, NUM_CNPJ_CREDENCIADORA, COD_BANDEIRA_CREDENCIADORA) SELECT :SEQCUPOM, SEQ_PAGAMENTO, COD_FORMA_PAGTO, VAL_PAGAMENTO, COD_BANCO, NUM_AGENCIA, NUM_CONTA, NUM_CHEQUE, VAL_CHEQUE, DTA_CHEQUE, NUM_CNPJ_CPF, DTA_PREDATADO, NUM_TELEFONE, NOM_REDE_TEF, NOM_ADMINISTRADORA_TEF, NUM_TRANSACAO_TEF, DTA_TRANSACAO_TEF, HRA_TRANSACAO_TEF, IND_TIPO_TRANSACAO_TEF, QTD_PARCELAS_TEF, NUM_CARTA_FRETE, NUM_ADIANTAMENTO_FRETE, SEQ_HAVER, NUM_CMC7, VAL_TROCO_TEF, COD_PESSOA_SACADO, |
NUM_AUTORIZACAO_POS, NUM_GNF, DES_FORMA_PAGTO_ECF, NSU_SEM_PARAR, NOM_REDE_TEF_ORIGINAL, IND_TRANSACAO_TEF_CANCELADA, VAL_DESCONTO_TEF, COD_TIPO_DOCUMENTO_PAF, COD_AUTORIZACAO_TRASACAO_TEF, NSU_PIT_STOP, COD_AUTORIZACAO_ACELERA, VAL_SALDO_CLIENTE_FIDEL, SEQ_CARTA_FRETE, NUM_CNPJ_CREDENCIADORA, COD_BANDEIRA_CREDENCIADORA FROM TAB_PAGAMENTO_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; DELETE FROM TAB_PAGAMENTO_CUPOM_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; INSERT INTO TAB_PAGTO_CUPOM_CF ( SEQ_CUPOM, SEQ_PAGAMENTO, SEQ_PAGAMENTO_CF, COD_FORMA_PAGTO, VAL_PAGAMENTO, NUM_ADIANTAMENTO_FRETE, NUM_CARTA_FRETE, COD_PESSOA_SACADO, SEQ_CARTA_FRETE, DES_FORMA_PAGTO_ECF) SELECT :SEQCUPOM, SEQ_PAGAMENTO, SEQ_PAGAMENTO_CF, COD_FORMA_PAGTO, VAL_PAGAMENTO, NUM_ADIANTAMENTO_FRETE, NUM_CARTA_FRETE, COD_PESSOA_SACADO, SEQ_CARTA_FRETE, DES_FORMA_PAGTO_ECF FROM TAB_PAGTO_CUPOM_CF_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; DELETE FROM TAB_PAGTO_CUPOM_CF_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; INSERT INTO TAB_PAGAMENTO_MFE ( SEQ_CUPOM, SEQ_PAGAMENTO, COD_RESPOSTA_MFE, VAL_RESPOSTA_MFE, ID_REFERENCIA_ORIGINAL, ID_REFERENCIA_CLIENT, ID_PAGAMENTO, DES_MENSAGEM_MFE, DES_STATUS_PAGAMENTO, COD_AUTORIZACAO_MFE, NUM_BIN_CARTAO, NOM_DONO_CARTAO, DTA_EXPIRACAO, DES_INSTITUICAO_FINANCEIRA, NUM_PARCELAS, NUM_ULTIMOS_QUATRO_DIGITOS, COD_PAGAMENTO, VAL_PARAMETRO, ID_FILA, DES_TIPO, DES_RETORNO, NUM_NSU, NUM_APROVACAO, |
DES_BANDEIRA, DES_ADQUIRENTE, IND_TIPO_PAGTO, COD_POS) SELECT :SEQCUPOM, SEQ_PAGAMENTO, COD_RESPOSTA_MFE, VAL_RESPOSTA_MFE, ID_REFERENCIA_ORIGINAL, ID_REFERENCIA_CLIENT, ID_PAGAMENTO, DES_MENSAGEM_MFE, DES_STATUS_PAGAMENTO, COD_AUTORIZACAO_MFE, NUM_BIN_CARTAO, NOM_DONO_CARTAO, DTA_EXPIRACAO, DES_INSTITUICAO_FINANCEIRA, NUM_PARCELAS, NUM_ULTIMOS_QUATRO_DIGITOS, COD_PAGAMENTO, VAL_PARAMETRO, ID_FILA, DES_TIPO, DES_RETORNO, NUM_NSU, NUM_APROVACAO, DES_BANDEIRA, DES_ADQUIRENTE, IND_TIPO_PAGTO, COD_POS FROM TAB_PAGAMENTO_MFE_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; DELETE FROM TAB_PAGAMENTO_MFE_ABERTO WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; UPDATE TAB_PAGTO_ADIANTAMENTO_PDV SET SEQ_CUPOM = :SEQCUPOM WHERE NOM_HOST = :NOMHOST AND NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM AND ((SEQ_CUPOM IS NULL) OR (SEQ_CUPOM = 0)) ; INSERT INTO TAB_DESCONTO_FIDELIDADE ( SEQ_DESCONTO, SEQ_CUPOM, SEQ_ITEM, NUM_CARTAO, COD_FORMA_PAGTO, VAL_DESCONTO) SELECT SEQ_DESCONTO, :SEQCUPOM, SEQ_ITEM, NUM_CARTAO, COD_FORMA_PAGTO, VAL_DESCONTO FROM TAB_DESCONTO_FIDELIDADE_ABERTO WHERE NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; DELETE FROM TAB_DESCONTO_FIDELIDADE_ABERTO WHERE NUM_SERIE_ECF = :NUMSERIEECF AND NUM_CUPOM = :NUMCUPOM; SELECT A.SEQ_HAVER FROM TAB_VALE_HAVER A WHERE A.NUM_CUPOM = :NUMCUPOM AND A.SEQ_TURNO = :SEQTURNO INTO :SEQHAVER; IF (:SEQHAVER > 0) THEN BEGIN UPDATE TAB_VALE_HAVER SET SEQ_CUPOM = :SEQCUPOM WHERE SEQ_HAVER = :SEQHAVER; END |
END
DDL SP_GRAVA_CUPOM_FISCAL
Configuração:
Para utilização do MFE será necessário configurar no Configurador dos sistemas os seguintes parâmetros na aba MIDe:
- Produtos MIDe (parâmetro 16001) >> opção "4 – MFE";
Figura 1: Produtos MIDe (parâmetro 16001)
- Chave Acesso Validador (parâmetro 16018) >> copiar e colar a Chave Acesso Validador disponível nas configurações do MID-e Client >> Emissores.
de 19
Figura 3: Chave Acesso Validador
Chave Acesso Validador (parâmetro 16018)
Utilização do sistema:
O fluxo de venda não sofreu alterações devido as implementações da integração do sistema com o MFE, sendo assim, a venda de produtos e/ou serviços continuam da mesma forma. Os efeitos das implementações ocorrem no fechamento da venda, no fluxo de pagamentos da conta.
Na escolha da forma de pagamento, independente de qual seja o tipo da forma de pagamento, será realizada uma requisição de consulta do status do Integrador, caso esteja inativo ou sem comunicação, o MID-e Client retornará a seguinte mensagem: "MC009 – Não foi possível se comunicar com o integrador", devendo o PDV interromper o processo até que a comunicação com o Integrador se restabeleça. Estando o Integrador ativo o processo segue o fluxo normalmente.
Observação: Somente pagamentos a cartão (TEF ou POS) devem realizar o envio do pagamento, as outras formas de pagamento deverão ser enviadas juntamente com os dados de encerramento da venda.
O PDV deverá informar ao Integrador os dados de cada pagamento realizado via CARTÃO, esse processo deverá ser realizado antes do operador realizar a transação, utilizando a API "IniciarVenda". Caso a forma de pagamento escolhida seja do tipo cartão ('CC', 'CD', 'VO' ou 'PL'), os dados dos pagamentos serão enviados ao Integrador, que irá registrar o pagamento e devolverá o id do pagamento (IdPagamento), que vinculará o CF-e ao pagamento realizado. Na requisição da API "IniciarVenda", caso o Integrador esteja inativo ou sem comunicação, o
MID-e Client retornará a seguinte mensagem: "MC009 – Não foi possível se comunicar com o integrador", devendo o PDV interromper o processo até que a comunicação com o Integrador se restabeleça.
A próxima etapa será a realização da transação TEF ou POS, devendo o PDV seguir as seguintes regras:
• Pagamento via POS: Será necessário enviar os dados do pagamento POS para validação através da API "ValidarPagamento", para que o MID-e Client possa validar os dados entre o pagamento registrado junto a SEFAZ e os dados de pagamento registrados pelo PDV. Caso o Integrador esteja off-line por falta de internet ou problema de comunicação com a SEFAZ, será retornado o erro "MC010 – O integrador não conseguiu se comunicar com a SEFAZ", cabendo ao PDV apresentar uma tela para que as informações do pagamento sejam inseridas manualmente, permitindo assim o PDV realizar o encerramento da venda.
Mensagem para realizar a transação POS
Mensagem quando retorno MC010 – O Integrador não conseguiu se comunicar com a SEFAZ
Tela para que as informações do pagamento sejam inseridas manualmente
• Pagamentos TEF: Não é necessário chamar a API "ValidarPagamento", nessa modalidade os dados do pagamento serão enviados juntamente com os dados de encerramento da venda.
Após a realização dos pagamentos, o sistema deverá enviar o encerramento da venda, utilizando o mesmo método para operações com SAT em São Paulo, incluindo apenas as informações dos pagamentos realizados via TEF ou POS.
O MID-e cliente irá vincular os dados dos pagamentos a venda realizada e enviará essa venda ao equipamento MFE para autorização da venda, retornando os dados do CF-e autorizado ou o erro apresentado em caso de rejeição ou falha no equipamento.
Observação: Caso ocorra o retorno MC010 durante alguma etapa do processo de venda, o PDV deverá obter o IDPagamento, IDFila e retorno da resposta fiscal através da API "/Integrador/GetRetornoConciliacaoByChaveNota?". Essas informações deverão ser gravadas no banco do PDV, conforme as exigências da SEFAZ CE. Essa conciliação é realizada automaticamente a cada 10 minutos.
Exemplos Json Web API:
{"ChaveAcessoValidador":"25CFE38D-3B92-46C0-91CA CFF751A82D3D","ChaveRequisicao":"54517628-0116-0102-0580- 019100000000","Estabelecimento":10,"SerialPos":"999999999104","Cnpj":"54517628001160"," IcmsBase":5.9,"ValorTotalVenda":5.9,"HabilitarMultiplosPagamentos":"true","HabilitarCon