* Se o processo é iniciado através da tela Ordens de Compra, armazena o código da Ordem de Compra selecionada;
* Se o processo é iniciado através da tela Declarações de Importação, armazena o código da DI selecionada;
* Se o processo é iniciado através da tela de Notas de Entrada, nenhuma informação de origem é armazenada e o resultado será uma nota de entrada avulsa.
* Abre o XML em memória;
* Verifica se já não existe uma chave de acesso da NF-e cadastrada e caso já exista, cancela a importação com a mensagem Já existe uma nota fiscal de entrada com a chave de acesso!;
* Busca o tipo de operação do XML;
  * Localiza o tipo de operação do XML no cadastro de tipos de operação. Tal qual como está no XML;
      * Caso não encontre, solicita para o usuário selecionar o tipo de operação do XML;
      * Verifica se o tipo de operação indicado pelo usuário está dentro de algum grupo de operações;
      * Inclui na lista de sinônimos dos tipos de operação o texto do XML para na próxima vez utilizar o mesmo;
  * Verifica se o tipo de operação não é de importação;
  * Se for de importação, utiliza o próprio tipo de operação;
      * Se não encontrar. O processo é suspenso nesse ponto, até que um usuário adicione manualmente o tipo de operação do XML na lista de sinônimos da operação de importação correta.
  * Se não for de importação, busca o tipo de operação inverso;
  * Armazena o tipo de operação definido pelos passos anteriores no cabeçalho de uma nova nota de entrada;

<BR>


```mermaid
graph TD;
ORDEM_COMPRA[Tela Ordem de Compra]-->COD_OC[Armazena o Código da OC];
DECLARACAO_IMPORTACAO[Tela Declaração de Importação]-->COD_DI[Armazena o Código da DI];
NF_ENTRADA[Tela de Nota Fiscal de Entrada]-->XML;
COD_OC-->XML[Abre XML]
COD_DI-->XML
XML-->VERIFICA_CHAVE[Existe Chave de Acesso Cadastrada?]
VERIFICA_CHAVE-->SIM[Sim]
VERIFICA_CHAVE-->NAO[Não]
SIM-->CANCELA_IMP[Cancela Importação];
CANCELA_IMP--Mensagem do Sistema-->MENSAGEM_EXISTE_CHAVE[Já existe NF com a Chave de Acesso]
NAO-->CAD_TIPO_OP[Localiza Tipo de Operação]
CAD_TIPO_OP-->OP_COMO_XML{Operação que está no XML está no cadastro?}
OP_COMO_XML--Sim-->VERIFICA_GRUPO_OP[Verifica se está em Grupo de Operações]
OP_COMO_XML--Nao-->SELECIONAR_TIPO[Usuário escolhe o Tipo de Operação do XML]
SELECIONAR_TIPO-->LISTA_SINONIMO[Inclui nos sinônimos a Operação conforme o XML];
LISTA_SINONIMO-->VERIFICA_GRUPO_OP;
VERIFICA_GRUPO_OP-->IMPORTACAO{É importação?}
IMPORTACAO--Sim-->OP_IMPORT[Usa o próprio tipo de operação]
IMPORTACAO--Nao-->BUSCA_OP_INVERSO[Busca o Tipo de Operação Inverso]
BUSCA_OP_INVERSO-->ARMAZENA_OP[Armazena o tipo de operação definido no cabeçalho de uma nova NF de entrada];
OP_IMPORT-->ARMAZENA_OP;
```
<br>


* Busca pela filial do XML;
  * Se for importação, busca a filial do CNPJ do campo Emitente da NF-e;
  * Se não for de importação, busca a filial do CNPJ do campo Destinatário da NF-e;
  * Verifica se a filial do XML é a filial logada;

<br>

```mermaid
graph TD;
BUSCA_FILIAL[Busca Filial]-->IMPORTACAO{Importação?}
IMPORTACAO--Sim-->FILIAL[Filial do CNPJ do campo Emitente da NF-e];
IMPORTACAO--Nao-->FILIAL_NAO[Filial do CNPJ do campo Destinatário da NF-e];
FILIAL-->VERIFICAR_FILIAL[Verifica Filial Logada x Filial do XML];
FILIAL_NAO-->VERIFICAR_FILIAL;
```

<br>


* Busca pelo fornecedor/pessoa da nota de entrada;
  * Se for importação, busca o fornecedor/pessoa da nota de entrada pelo nome do destinatário que aparece no XML;
  * Se não for importação, busca pelo CNPJ do emitente que aparece no XML;
  * Se o fornecedor possuir uma condição de pagamento padrão, armazena;
* Se for importação, busca as informações da DI;
* Se não for importação, verifica se a configuração de OC obrigatória está ligada
  * Se está ligada, busca o valor do frete, transportadora, data prevista de entrega, condição de pagamento, observação interna e observação pública da ordem de compra selecionada no início do processo;
  * Se está ligada, e não foi selecionada uma ordem de compra no início do processo. A importação é cancelada com a mensagem de erro Não foi encontrada uma Ordem de Compra como origem!
  * Se não está ligada, verifica os itens.
* Se não há uma condição de pagamento armazenada (do fornecedor ou da ordem de compra), busca a condição de pagamento configurada como _Nenhuma_ da configuração do sistema;

<br>

```mermaid
graph TD;
VERIFICAR_FILIAL[Verifica Filial Logada x Filial do XML]-->BUSCA_FORNECEDOR;
BUSCA_FORNECEDOR[Busca fornecedor/pessoa da nota de entrada]-->FORNEC_IMPORT
FORNEC_IMPORT{Importação?}--Sim-->BUSCA_DEST[Busca pelo nome do destinatário do XML];
FORNEC_IMPORT--Nao-->BUSCA_CNPJ[Busca pelo CNPJ do emitente do XML];
BUSCA_FORNECEDOR-->FORNEC_COND_PGTO{Fornecedor possui condição de pagamento padrão?};
BUSCA_DEST-->BUSCA_DI[Busca as informações da DI];
BUSCA_CNPJ-->VERIFICAR_OC{OC obrigatória na configuração do sistema?};
VERIFICAR_OC--Sim-->SELECIONADA_OC{Foi selecionada Ordem de Compra?}
SELECIONADA_OC--Sim-->BUSCA_DADOS_OC[Busca dados da Ordem de Compra];
BUSCA_DADOS_OC-->VERIFICA_ITENS;
VERIFICAR_OC--Nao-->VERIFICA_ITENS;
SELECIONADA_OC--Nao!Importação Cancelada!-->MENSAGEM[Não foi encontrada OC como Origem!];
FORNEC_COND_PGTO--Sim-->ARMAZENA[Armazena];
FORNEC_COND_PGTO--Nao-->COND_PGTO_NENHUMA[Busca condição 'Nenhuma' da configuração do Sistema];
COND_PGTO_NENHUMA-->ARMAZENA;
BUSCA_DI-->VERIFICA_ITENS[Verifica Itens do XML];
```
<br>


* Verifica os itens do XML;
  * Se for importação, verifica se a DI possui um item para o número da adição e sequencial dentro da adição em cada item do XML;
    * Caso não exista, cancela a importação com a mensagem de erro _Não foi encontrado um mapeamento para as adições e sequencial da adição!_
  * Se não for importação, verifica se no cadastro Itens dos Fornecedores existe um item com o código do item do XML para o fornecedor;
    * Caso não exista, insere um item com este código no cadastro Itens dos Fornecedores para o fornecedor e cancela a importação com a mensagem de erro _Não foi encontrado um mapeamento para os codigos dos fornecedor!_

<br>

```mermaid
graph TD;
VERIFICA_ITENS[Verifica Itens do XML];
VERIFICA_ITENS-->IMPORTACAO;
IMPORTACAO{Importação?}--Sim-->VERIFICA_DI{Todos os itens do XML existem na DI?};
VERIFICA_DI--Nao-->CANCELA[Cancela a Importação];
VERIFICA_DI--Sim-->SALVA_CABECALHO_SEM_ITEM[Salva o Cabeçalho da Nota sem Itens];
CANCELA--Mensagem do Sistema-->ERRO[Não foi encontrado mapeam. p/ as adições e seq. da adição!];
IMPORTACAO--Nao-->VERIFICA_ITENS_FORNECEDORES{Todos os itens do xml existem no itens dos fornecedores?};
VERIFICA_ITENS_FORNECEDORES--Nao-->INSERE[Insere um item com o cód. no Itens dos Fornec. p/ o Fornec.];
CANCELA_IMPORT[Cancela a Importação]--Mensagem do Sisitema-->ERRO2[Não foi encontrado um mapeam. para os cód. dos fornecedores!];
VERIFICA_ITENS_FORNECEDORES--Sim-->SALVA_CABECALHO_SEM_ITEM
INSERE-->CANCELA_IMPORT;
```
<br>


* Preenche as informações do cabeçalho da Nota Fiscal de Entrada a partir do XML e salva o cabeçalho da Nota Fiscal de Entrada sem itens:
    * Cliente/Fornecedor com o fornecedor/pessoa armazenado;
    * Filial com a filial armazenada;
    * Tipo de Operação com a operação armazenada;
    * Condição de pagamento com a condição de pagamento armazenada;
    * Código com o campo NNF do XML;
    * Status com o valor Inicial;
    * Emissão com a data de emissão do XML ou a atual do servidor, caso não tenha a DHEMI no XML;
    * Entrega com a data atual do servidor;
    * Série com o campo Serie do XML;
    * Chave de acesso com o campo ChaveAcesso do XML;
    * Marca a opção Cálculo Manual de Impostos;
    * Transação de origem com a DI ou OC do início do processo;
    * Transportadora com a transportadora armazenada;
    * Valor do frete com o campo VFrete do XML;
* Para as notas que não são de importação nas importações que começaram na tela Ordens de Compra preenche os seguintes campos a partir da OC:
    * Data Prevista de Entrega;
    * Condição de pagamento;
    * Obs. Interna;
    * Obs. Pública;
* Para as notas de importação com vínculo com a DI:
    * Via de Transporte;
    * Forma de Importação;
    * Tipo de Nota A Emitir;
    * DI;
    * DI Data;
    * DI Data de Desembaraço;
    * DI Local de Desembarque;
    * Marca os campos Peso Bruto Digitado e Peso Líquido Digitado;
* Se existe no XML informações de volume, pega o primeiro volume e usa para preencher os campos
     *  Peso Bruto;
     * Peso Líquido;
     * Marca;
     * Espécie;
     * Qtd. Volumes;
* Se não existe no XML informações de volume, preenche os seguintes campos a partir da DI:
     * Peso Bruto;
     * Peso Líquido;
     * Limpa o campo Marca;
     * Limpa o campo Espécie;
     * Limpa o campo Qtd. Volumes;
* Recarrega a Nota Fiscal de Entrada recém cadastrada a partir do banco de dados;

<br>

```mermaid
graph TD;
PREENCHE[Cabeçalho salvo sem os itens];
PREENCHE-->DADOS_ARMAZENADOS[Dados Armazenados e do XML];
DADOS_ARMAZENADOS-->IMPORTACAO{Importação?}
IMPORTACAO--Nao-->TELA_OC;
TELA_OC[Tela Ordem de Compra]-->PREENCHE_CAMPOS_OC[Preenche os campos a partir da OC];
IMPORTACAO--Sim-->VINCULO_DI[Vínculo com a DI];
VINCULO_DI-->PREENCHE_DI[Preenche com dados da DI]
PREENCHE_DI-->INFO_VOLUME{Existe informação de Volume no XML?}
PREENCHE_CAMPOS_OC-->INFO_VOLUME
INFO_VOLUME--Sim-->DADOS_VOLUME[Pega o primeiro volume e usa para preencher os campos];
INFO_VOLUME--Nao-->DADOS_VOLUME2[Preenche os campos a partir da DI]
DADOS_VOLUME-->RECARREGA[Recarrega a NF de Entrada a partir do Banco de Dados]
DADOS_VOLUME2-->RECARREGA
```

<br>


* Adiciona os itens do XML na Nota Fiscal de Entrada recém cadastrada. Para item executa:
  * Busca o CFOP;
     * Se não for importação, busca o CFOP inverso do CFOP do XML e caso não exista um CFOP inverso cancela a importação com a mensagem _Não foi encontrado um CFOP inverso para o CFOP!_;
     * Se for importação, copia o CFOP do XML e caso não exista no cadastro de CFOP cancela a importação com a mensagem _Não foi encontrado o CFOP!_;
  
<br>

```mermaid
graph TD;
RECARREGA[Recarrega a NF de Entrada a partir do Banco de dados];
RECARREGA-->ADIC_ITENS[Adiciona Itens do XML na NF recém cadastrada e executa];
ADIC_ITENS-->BUSCA_CFOP[Busca CFOP];
BUSCA_CFOP-->IMPORTACAO{Importação?}
IMPORTACAO--Nao-->CFOP_INVERSO{Existe CFOP Inverso do CFOP do XML?};
COPIA_CFOP--Sim-->ARMAZENA_CFOP;
CFOP_INVERSO--Nao-->CANCELA_IMPORTACAO[Cancela a Importação];
CANCELA_IMPORTACAO--Mensagem do Sistema-->ERRO[Não foi encontrado CFOP inverso para o CFOP!];
IMPORTACAO--Sim-->COPIA_CFOP{O CFOP do XML existe no cadastro de CFOP?};
COPIA_CFOP--Nao-->CANCELA_IMPORTACAO2[Cancela Importação];
CANCELA_IMPORTACAO2--Mensagem do Sitema-->ERRO2[Não foi encontrado o CFOP!];
CFOP_INVERSO--Sim-->ARMAZENA_CFOP[Armazena CFOP];
```
<br>


* Se for importação, busca as informações do item a partir do Número da Adição e Sequencial da Adição na DI. Item, Número da DI, Ordem na DI, Fabricante e Exportador;
  * Se não for importação, busca no cadastro Itens dos Fornecedores, a partir do fornecedor e do código do item no XML o Item do Fornecedor a ser inserido;
     * Se encontrar apenas um, utiliza este Item do Fornecedor;
     * Se encontrar mais de um, apresenta a lista para o usuário selecionar qual o Item do Fornecedor deve ser utilizado;
     * Com o Item do Fornecedor definido, avalia o campo tipo de vínculo do Item do Fornecedor:
        * Se for SKU, utiliza o SKU configurado;
        * Se for Item Pai, apresenta a lista dos SKU do item pai configurado na tela nova de itens dos forneedores, fltrado pela unidade.
        
No momento de buscar o item, ele busca apenas pelo fornecedor e código do item do fornecedor. Se não achar um SKU (pode ser que tenha o item do fornecedor em branco). Ele inclui um novo item do fornecedor com a descrição do XML e o SKU/Item Pai em branco.

Ao incluir um em branco, ele inclui um novo com o código e nova descrição. Se a descrição já existir, ele só reativa ela.
O sistema nunca altera a descrição de um que já existe. Apenas reativa.

<br>

```mermaid
graph TD;
IMPORTACAO[Importação]--Sim-->BUSCA_DADOS_DI[Busca info. do item a partir do número da adição e seq. da adição da DI];
IMPORTACAO--Nao-->ITENS_FORNEC[Busca no cadastro de Itens dos Fornecedores]
ITENS_FORNEC-->COD_ITEM[Busca a partir do fornecedor e cód. do item no XML o item do fornecedor a ser inserido];
COD_ITEM--Se encontrar apenas um-->ESTE_ITEM[Utiliza este item do fornecedor];
COD_ITEM--Se encontrar mais de um-->LISTA[Lista para o usuário selecionar qual utilizar];
ESTE_ITEM-->DEFINE[Item do fornecedor definido];
LISTA-->DEFINE;
DEFINE-->AVALIA{Avalia o campo Tipo de Vínculo do item do fornecedor}
AVALIA--Se fo SKU-->SKU[Utiliza o SKU configurado];
AVALIA--Se for Item Pai-->ITEM_PAI[Lista de SKU para selecionar qual deve ser utilizado];
SKU-->DEFINE_SKU[Definido SKU]
ITEM_PAI-->DEFINE_SKU;
```
<br>


  * Busca o NCM do item no XML;
  * Busca o NCM do item no cadastro;
  * Verifica a configuração que permite ou não divergência entre NCM da NF e do cadastro;
       * Se está configurado para permitir apenas para uma lista de perfis, verifica se o perfil está na lista dos permitidos. Senão cancela a importação com a mensagem _NCM do item diferente do NCM do item do xml!_;
       * Se está configurado para atualizar o item, atualiza o item com o NCM do XML;
       * Se está configurado para sempre permitir, utiliza o NCM do item;
         * Preenche o NCM do item após a verificação acima;
 
<br>

```mermaid
graph TD;
DEFINIDO_SKU[Definido SKU]-->BUSCA_NCM[Busca NCM do item no XML];
DEFINIDO_SKU-->BUSCA_NCM2[Busca NCM do Item no cadastro];
BUSCA_NCM-->VERIFICA_DIVERGENCIA{Verifica configuração: permite ou não divergência entre NCM da NF e do cadastro}
BUSCA_NCM2-->VERIFICA_DIVERGENCIA;
VERIFICA_DIVERGENCIA-->LISTA_PERFIS[Configurado para permitir lista de perfis];
LISTA_PERFIS-->VERIFICA_PERFIL[Verifica se o perfil está na lista dos permitidos];
VERIFICA_PERFIL--Nao-->CANCELA[Cancela Importação];
CANCELA--Mensagem do Sistema-->ERRO[NCM do item diferente do NCM do item no XML!];
VERIFICA_DIVERGENCIA-->CONFIG_ATUALIZA_ITEM[Configuradora p/atualizar o item?];
CONFIG_ATUALIZA_ITEM--Sim-->ATUALIZA_ITEM[Atualiza o item com o NCM do XML]
VERIFICA_DIVERGENCIA-->PERMITIR[Configurado para permitir sempre?];
PERMITIR--Sim-->UTILIZA_NCM[Utiliza NCM do item];
VERIFICA_PERFIL-->PREENCHE_NCM[Preenche NCM]
ATUALIZA_ITEM-->PREENCHE_NCM;
UTILIZA_NCM-->PREENCHE_NCM;
```
<br>


* Se for importação
   * Preenche o campo Exportador do cabeçalho (atenção, ficará o exportador do último item neste caso);
   * Preenche o número da DI;
   * Preenche o número sequencial da adição;
   * Preenche o campo Fabricante;
* Preenche o Item com o SKU indicado;
* Preenche o CFOP com o CFOP armazenado;
* Preenche o campo Ordem;
* Preenche o campo Qtd. com a multiplicação do campo múltiplo do cadastro de Itens do Fornecedor com o campo Quantidade do XML;
* Preenche o campo Valor Unitário a partir do XML;
* Preenche o campo Valor Total a partir do XML;

 
<br>

```mermaid
graph TD;
NCM_PREENCHIDO[NCM Preenchido]
NCM_PREENCHIDO-->IMPORTACAO{É importação?};
IMPORTACAO--Sim-->EXPORTADOR[Preenche o campo Exportador com o do último item];
EXPORTADOR-->DI[Número da DI];
DI-->SEQ_ADICAO[Sequencial da adoção];
SEQ_ADICAO-->FABRICANTE[Fabricante];
FABRICANTE-->ITEM[Preenche o item com o SKU indicado];
IMPORTACAO--Nao-->ITEM;
ITEM-->CFOP[Preenche o CFOP com o CFOP armazenado];
CFOP-->ORDEM[Preenche o campo Ordem];
ORDEM-->QTD[Multiplicação do Campo múltiplo + campo Quantidade do XML];
QTD-->VLR_UNITARIO[Preenche o campo Valor Unitário a partir do XML];
VLR_UNITARIO-->VLR_TOTAL[Preenche o campo Valor Total a partir do XMl];
```

<br>

 * Se não for importação, e o processo tiver iniciado por uma Ordem de Compra tenta vincular o item da Nota de Entrada com o item da Ordem de Compra:
      * Busca pelo campo NItemPed no XML. Se estiver preenchido, busca pelo item de mesma ordem que o NItemPed mas na OC;
      * Se não houver NItemPed, busca pelo campo NItem do XML e busca pelo item de mesma ordem que o NItem mas na OC;
      * Se não encontrar através do NItem busca pelo Código do item no XML e busca pelo item da ordem de compra que possui o mesmo código de item do fornecedor através do campo Item do Fornecedor nos itens da Ordem de Compra;
  * Preenche os impostos do item a partir dos impostos do XML;
* Recarrega a Nota Fiscal de Entrada recém cadastrada a partir do banco de dados para ter as informações atualizadas de impostos;
* Se for importação, ajusta o campo de observações e de despesas adicionais de importação da Nota Fiscal de Entrada recém cadastrada;
* Salva a nova nota de entrada;

<br>

```mermaid
graph TD;
FABRICANTE[Fabricante Preenchido]-->IMPORTACAO
IMPORTACAO[Importação]--Nao-->OC[Iniciou na tela de Ordem de Compra?];
OC--Sim-->VINCULA_ITEM[Vincula item da NF de Entrada com OC];
VINCULA_ITEM-->NITEMPED{Campo NItemPed preenchido?};
NITEMPED--Sim-->ITEM_ORDEM_OC[Busca pelo item de mesma ordem que o NItemPed na OC];
NITEMPED--Nao-->ITEM_XML[Busca pelo NItem do XML e item de mesma ordem que o NItem na OC];
ITEM_XML-->NITEM{Encontrou através do NItem?}
NITEM--Nao-->COD_ITEM_XML[Busca pelo Código do Item no XML];
COD_ITEM_XML-->ITEM_OC[Busca item da OC que possui mesmo cód. de item do Fornec. no itens da OC];
NITEM--Sim-->PREENCHE_IMPOSTOS;
ITEM_OC-->PREENCHE_IMPOSTOS;
ITEM_ORDEM_OC-->PREENCHE_IMPOSTOS[Preenche os impostos do item a partir dos impostos do XML];
PREENCHE_IMPOSTOS-->RECARREGA[Recarrega a NF para atualizar as info. atualizadas de impostos];
IMPORTACAO2{Importação?}--Sim-->CAMPO_OBS[Ajusta o campo observações e despesas de importação da NF];
IMPORTACAO2--Nao-->SALVA;
RECARREGA-->IMPORTACAO2;
CAMPO_OBS-->SALVA[Salva NF];
```