Histórico
O MDF-e é uma parte do projeto NF-e, cuja especificação técnica é controlada pela SEFAZ RS (vide https://mdfe-portal.sefaz.rs.gov.br/). MDF-e deverá ser emitido por empresas prestadoras de serviço de transporte para prestações com mais de um conhecimento de transporte ou pelas demais empresas nas operações, cujo transporte seja realizado em veículos próprios, arrendados, ou mediante contratação de transportador autônomo de cargas, com mais de uma nota fiscal.
...
Não é um documento novo, mas sim a escrituração digital do Manifesto de Carga, um documento opcional utilizado por empresas transportadoras de cargas onde são relacionados todos os conhecimentos de transporte que deveriam ser emitidos em uma operação de transporte de carga fracionada, ou seja, onde em um mesmo caminhão há mercadorias para diversos destinatários. Havendo a utilização do Manifesto de Carga, não há necessidade de emitir um conhecimento de transporte para cada destinatário, sendo emitido apenas um, acompanhado do manifesto de carga em cada operação. Sua existência se deu pelo Ajuste Sinief nº 15/89, que acrescentou o inciso XVIII no art. 1º do Ajuste Sinief 06/89, criando o modelo 25 dos documentos fiscais utilizados pelos contribuintes do ICMS. Também pode ser utilizado por empresas que possuem frota própria e fazem entregas de cargas a vários clientes. Agora o modelo do MDF-e será 58.
Modo de funcionamento do MDF-e
Empresas envolvidas: Empresa transportadora ou distribuidora de combustíveis
...
- Essa tela de Inclusão MDF-e já virá preenchida e dependendo da situação o usuário só precisará clicar no OK para processar o MDF-e.
- O campo série será sugerido do perfil da empresa. O usuário poderá trocar por outra série que seja do tipo Emissão Própria. Através da série será sugerido o Número do MDF.
- O modelo será sugerido do perfil da empresa e não poderá ser alterado.
- A Data/Hora de Emissão será sugerida conforme a data/hora atual e pode ser alterada pelo usuário.
- Os campos Frota, Carreta, Treminhão, Motorista e Transportadora serão sugeridos conforme as NF's selecionadas na tela anterior, não podendo ser alterados. No caso da Cidade Carregamento é a mesma regra, porém obtida do Cadastro do Depósito da NF.
- Os campos de Informações Adicionais e Informações Complementares serão do tipo Memo passível de alteração do usuário. Essas informações serão sugeridas do perfil da empresa.
- O campo Peso Total será sugerido com a soma dos Pesos das NF-s selecionadas (quando NF-e's) ou com 0 (zero) (quando CT-e's), podendo ser alterado pelo usuário.
- O campo Valor Total da Carga será sugerido com a soma dos Valores Totais das NF's selecionadas (quando NF-e's) ou com a soma dos Valores Toais nas NF's que acobertam o Conhecimento (quando CT-e's), podendo ser alterado pleo usuário.
- O grid de NF's selecionadas será preenchido com as NF's selecionadas na tela anterior.
- A cidade Final do MDF-e (de Descarregamento) será obtida da última NF apresentada no grid (que não permitirá ordenação de colunas pelo usuário). Assim, a ordem das NF's deve representar o percurso da viagem e o usuário deve utilizar as setas laterais para ajustar essa ordem caso não venha correta
- Caso tenha a necessidade de retirar uma NF do processo o usuário deve cancelar os dados dessa tela, o que retorna para tela anterior e desmarcar a NF a ser retirada.
- Ao dar OK teremos o seguinte processo:
- Salvamento dos dados principais do MDF-e
- Deve ser verificada a simultaneidade com outro usuário de forma a ajustar o Número do MDF (similar ao que fazemos na NF e no Conhecimento) caso já tenha sido utilizado o número sugerido na tela por outro usuário
- Deve ajustar na série informada o próximo número
- Salvamento das NF's vinculadas
- Além de salvar na tabela correspondente, deve salvar na NF o Sequencial do MDF. Para isso deve também ter controle de simultaneidade, de forma que uma NF não seja incluída em dois MDF's não cancelados ao mesmo tempo
- Salvamento do percurso
- A cada NF selecionada também será adicionada a cidade de Entrega na aba Percurso. Lembrando que não serão adicionadas cidades repetidas, nem a cidade que for igual à cidade do Carregamento do MDF-e
- Todos esses pontos acima farão parte de uma única transação no banco de dados. Ou seja, qualquer problema em qualquer dos pontos deve abortar a transação toda. Dando tudo certo continua os próximos passos.
- Verificação do perfil Off-line da empresa, que caso esteja desmarcadado força o envio do processamento de Recibo para SEFAZ (nos mesmos moldes da NF ou Conhecimento)
- Caso OK no Recibo, enviar processamento de Protocolo para SEFAZ.
- Independente do processo da SEFAZ ter sido enviado ou ter retornado com sucesso, questionar se quer imprimir DAMDFE (se perfil usuário "Pode imprimir MDF-e" estiver marcado), apresentando na mensagem se o MDF-e está autorizado ou não, sugerindo a impressora padrão e deixando alterar a impressora se perfil usuário "Direciona impressão MDF-e" estiver marcado. No caso de ser impresso o DAMDFE de um MDF-e não autorizado, no campo de Protocolo de Uso deve sair a mensagem sobre Contingência, conforme previsto no manual, página 101.
- Salvamento dos dados principais do MDF-e
- Essa tela de Inclusão MDF-e já virá preenchida e dependendo da situação o usuário só precisará clicar no OK para processar o MDF-e.
- Tela de MDF-e's Pendentes
- Essa tela será similar à tela de NF-e pendentes
- As opções de tipo de Pendência devem ser:
- Recibo: Quando o MDF-e foi incluído, mas seja pela empresa estar off-line ou por erro no processamento da SEFAZ, esse MDF-e não foi processado.
- Protocolo: Quando o MDF-e tem recibo, mas por algum erro (SEFAZ ou empresa) não conseguiu obter o protocolo
- Encerramento: Quando o MDF-e está autorizado (tem protocolo), não está cancelado e ainda não está encerrado. Útil para o usuário não esquecer que precisa encerrar o MDF-e.
- O grid deve apresentar os dados principais dos MDF-e's permitindo marcar cada um deles.
- Terá os botões:
- Processa:
- Caso a pendência seja de Recibo ou Protocolo será similar à NF-e, fazendo o envio do processamento para SEFAZ. No caso de Recibo, após processado o MDF-e retorna à tela como Pendente Protocolo, no caso de Protocolo o retorno será como Pendente Encerramento.
- Caso a pendência seja de Encerramento
- O usuário deverá indicar a Data/Hora de Encerramento (sendo sugerida a Data/Hora atual) e confirmar a Cidade de Descarregamento, que será sugerida conforme a última NF do percurso. Assim, caso seja necessário trocar uma dessas informações o usuário clica no botão Dados Encerramento e as ajusta. Nesta tela de Encerramento:
- A cidade a ser informada deve utilizar o cadastro de Cidades do Sispetro.
- Deve ser validado se a Data do Encerramento informada é maior que a Data de Autorização
- O usuário deverá indicar a Data/Hora de Encerramento (sendo sugerida a Data/Hora atual) e confirmar a Cidade de Descarregamento, que será sugerida conforme a última NF do percurso. Assim, caso seja necessário trocar uma dessas informações o usuário clica no botão Dados Encerramento e as ajusta. Nesta tela de Encerramento:
- Sincroniza: Fará a consulta da chave de acesso do MDF-e posicionado para identificar sua situação na SEFAZ.
- Processa:
- As opções de tipo de Pendência devem ser:
- Essa tela será similar à tela de NF-e pendentes
- Cancelamento de MDF-e
- O botão de Cancelamento só estará habilitado se o usuário tiver permissão para cancelamento e o MDF-e estiver com status Ativo
- Ao solicitar o cancelamento pela tela de Manutenção de MDF-e's o processo será similar ao que é feito na tela de Manutenção de NF's:
- Questionar o usuário se deseja realmente cancelar
- Fazer as validações para permitir o cancelamento via Servidor Sispetro, retornando uma lista de possíveis problemas:
- O MDF-e não pode estar cancelado
- O MDF-e não pode estar encerrado
- O MDF-e não pode estar com protocolo pendente (só com recibo pendente)
- O prazo de cancelamento deve estar de acordo com o configurado no perfil de sistema
- MDF-e autorizado: Intervalo entre Data/Hora de Autorização e a Data/Hora atual do servidor
- MDF-e NÃO autorizado: Intervalo entre Data/Hora de Inclusão e a Data/Hora atual do servidor
- Para MDF-e autorizado enviar o cancelamento para SEFAZ com os seguintes passos:
- Inclui dados na tabela de Processamento caso não tenha um Comando de Cancelamento como Não Solicitado. Caso tenha o Comando de Cancelamento como Não Solicitado utiliza o mesmo registro
- Envia o cancelamento para SEFAZ
- Salva os dados de retorno da SEFAZ (xml, resposta, data de processamento)
- Se rejeitado pela SEFAZ ou sem comunicação (status não solicitado) aborta todo o processo. Se autorizado continua o processo.
- Fazer o cancelamento efetivo no Sispetro, salvando Usuário e Data/Hora de Cancelamento
Estrutura de Dados
Tabela MDFe
Campo | Tipo |
---|---|
MDFeID | Integer Default AutoIncrement Primary Key |
CodEmpresa | Integer not null |
ChaveAcesso | char(44) not null |
Modelo | Integer not null |
Serie | char(10) |
NumeroMDF | Integer not null |
DataMDF | date not null |
HoraMDF | time not null |
SituacaoMDF | smallint not null |
CodigoDNCCarrega | char(09) not null |
CodigoDNCDescarrega | char(09) not null |
SeqFrota | Integer not null |
SeqFrotaCarreta | Integer |
SeqFrotaTrem | Integer |
CodTranspMotorista | char(05) not null |
CodTransp | char(05) not null |
Status | smallint Default 0 |
StatusSefaz | smallint |
DataInclusao | datetime Default Current |
UsuarioInclusao | char(10) |
DataAutorizacao | date |
DataEncerramento | date |
DataIncEncerramento | datetime Default Current |
UsuarioEncerramento | char(10) |
SeqMotivoCancto | Integer |
DataCancelamento | datetime Default Current |
UsuarioCancelamento | char(10) |
NumeroRecibo | char(15) |
DataProcessamentoRecibo | datetime |
NumeroProtocolo | char(15) |
XMLProtocolo | Long varchar |
DataProcessamentoProtocolo | datetime |
CodMsgSefaz | Integer |
MsgSefaz | char(200) |
NumeroProtocoloCancelamento | char(15) |
XMLAutorizacaoCancelamento | Long varchar |
DataProcessamentoCancelamento | datetime |
SeqEventoCancelamento | Integer |
Ambiente | smallint Default 0 |
XMLSolicitacaoCancelamento | Long varchar |
Tabela MDFeDoctoVinculado
Campo | Tipo |
---|---|
SeqMDFeDoctoVinculado | integer |
MDFeID | integer |
CodEmpresaNF | integer |
SequencialNF | integer |
Tabela MDFePercurso
Campo | Tipo |
---|---|
SeqMDFePercurso | integer |
MDFeID | integer |
UF | char(2) |
Ordem | smallint |
* Ter índice único para SequencialMDFe e CodigoDNC, ou seja, uma Cidade de percurso não pode estar repetida para o mesmo MDF-e
* Ter índice único para SequencialMDFe e Ordem, ou seja, não pode ter ordem repetida para o mesmo MDF-e
Tabela MDFeProcessamento
Campo | Tipo |
---|---|
SeqMDFeProcessamento | integer Default AutoIncrement Primary Key |
MDFeID | integer not null |
TipoComando | smallint not null |
Status | smallint Default 0 |
XMLEnviado | long Varchar |
XMLRecebido | long Varchar |
XMLProtocolo | long Varchar |
XML | long Varchar |
NumeroRecibo | char (15) |
NumeroProtocolo | char (15) |
StatusResposta | integer |
MotivoResposta | integer |
DataInclusao | datetime |
DataProcessamento | datetime |
Dicas para Homologação
- A
Controle de tempo dos Trabalhos
Tarefa | Especificação | Codificação | Total Desenv | Data Prev. Liberação |
---|---|---|---|---|
Alterações Servidor SisPetro | 16h - Ueliton | 40h - Ueliton | 56h | 21/01/2013 |
MDF-e - Perfis e Afins | 4h - Giovana | 6h - Paulo | 6h | 14/01/2013 |
Impressão de DAMDFe | 4h - Giovana | 8h - Paulo | 8h | 15/01/2013 |
Inclusão MDF-e e Manutenção Básica | 16h - Paulo | 32h - Paulo | 48h | 23/01/2013 |
MDF-e Pendente | 8h - Giovana | 24h | 32h | 27/01/2013 |
Manutenção MDF | 8h - Ueliton | 24h | 32h | 29/01/2013 |
Solução Detalhada
Inclusão de MDF-e
A tela de Inclusão será utilizada só no Normal. Porém trabalharemos com memDataSet para facilitar, caso no futuro, seja mudada para utilizar também no Remoto.
Ter uma tabela global temporary MDFeNFPendente com a estrutura dos campos necessários para apresentação na tela, inclusive NumNotasMotorista (para indicar o número de Notas por Motorista para o filtro da tela)
Ter uma procedure do banco MDFeIncluiNFPendente que receba como parametro as opções da tela de Inclusão do MDFe. Parametros:
Nome | Tipo | In/Out | Observacoes |
---|---|---|---|
xCodEmpresa | integer | in | |
xDataIni | date | in | |
xDataFin | date | in | |
xTipoCarga | smallint | in default -1 | 1 Lotação e 0 Fracionada |
xOperador | smallint | in default -1 | 0 : '=',1 : '<>', 2 : '>', 3 : '>=', 4 : '<',5 : '<=' |
xNumNotasMotorista | smallint | in default 0 | |
xCodDep | char(2) | in default '' | |
xSeqFrota | integer | in default 0 | |
xCodTranspMotorista | char(5) | in default '' |
Essa procedure terá o seguinte comportamento:
- Pelo código da empresa recebido deve identificar se a empresa é transportadora ou não
- Se a empresa for transportadora
Inserir dados na tabela MDFeNFPendente com o resultado de um select nas tabelas NotaFiscal e Conhecimento, considerando os parâmetros recebidos pela procedure (além dos filtros fixos citados na solução)
- Usar o recurso de execute immediate para montar o SQL conforme os parametros (ou seja, só terá na clausula where os filtros que tenham parametros informados)
- Se a empresa for Não transportadora
- Inserir dados na tabela MDFeNFPendente com o resultado de um select na tabela NotaFiscal considerando os parâmetros recebidos pela procedure, exceto Número de Notas por Motorista (além dos filtros fixos citados na solução)
- Usar o recurso de execute immediate para montar o SQL conforme os parametros (ou seja, só terá na clausula where os filtros que tenham parametros informados)
- Caso a opção de filtro de Número de Notas por Motorista seja diferente de >= 1
Preencher o campo NumNotasMotorista da tabela MDFeNFPendente com um update similar a:
Bloco de código update MDFeNFPendente n set NumNotasMotorista = (select count(*) from MDFeNFPendente where CodTranspMotorista = n.CodTranspMotorista)
Deletar os registros cujo NumNotasMotorista não atenda o filtro passado (usar também execute immediate
Esta procedure será utilizada pelo botão Atualiza da primeira tela para trazer as NF's pendentes de MDF-e
Especificação
Seguir a ordem de especificação abaixo
...
Aviso |
---|
Atenção para não criar os mesmos campos nas especificações acima. A maioria dos campos necessários para o Servidor SisPetro e Client's serão criados na especificação do Servidor. |
...