Pular para conteúdo

Natureza de Operação - Item de Terceiro (Ordem de Compra)

📋 Visão Geral

Este documento explica qual é a Natureza de Operação utilizada na tela de adição de itens em Ordens de Compra e por que ela é importante para o cálculo correto dos tributos.

URL da tela: http://localhost:8000/comercial/adicionar-item-estoque/{pedidoId}?tipoPedidoItem=OrdemCompra

🎯 Natureza de Operação Utilizada

TipoNaturezaOperacaoEnum.Compra

A Ordem de Compra utiliza a natureza de operação COMPRA, que representa uma operação de entrada de mercadorias.

📍 Onde é Definida

1. Inicialização no Controller

Arquivo: src/Nelmetais.SGE.WebApp/Areas/Comercial/Controllers/PedidoItemController.cs

// Linha 106-125
[Route("adicionar-item-estoque/{pedidoId:int}")]
[AuthorizeCustom(PermissaoTypeEnum.Pedido, PermissaoValueEnum.Adicionar)]
public async Task<IActionResult> Create(int pedidoId, TipoPedidoItemEnum tipoPedidoItem)
{
    var pedidoItemViewModel = new PedidoItemViewModel
    {
        PedidoId = pedidoId,
        Pedido = await ObterPedido(pedidoId),
        TipoPedidoItem = (int)tipoPedidoItem
    };

    // ← AQUI: Define Natureza de Operação como COMPRA
    if (tipoPedidoItem == TipoPedidoItemEnum.OrdemCompra)
        pedidoItemViewModel.OrdemCompraItem = new() {
            OrdemCompra = new() {
                NaturezaOperacaoId = (int)TipoNaturezaOperacaoEnum.Compra  // ← COMPRA
            }
        };

    if (pedidoItemViewModel.Pedido is null)
        return NotFound();

    pedidoItemViewModel = await PopularListasDropDown(pedidoItemViewModel);
    return View(pedidoItemViewModel);
}

2. Carregamento Completo dos Dados

// PedidoItemController.cs:267-304
private async Task<PedidoItemViewModel> PopularListasDropDown(PedidoItemViewModel viewModel)
{
    // ... outras populações de listas ...

    if (viewModel.TipoPedidoItem == (int)TipoPedidoItemEnum.OrdemCompra)
    {
        // ... configurações específicas de Ordem de Compra ...

        // ← Carrega dados completos da Natureza de Operação do banco
        if (viewModel.OrdemCompraItem?.OrdemCompra!.NaturezaOperacao is null)
            viewModel.OrdemCompraItem!.OrdemCompra!.NaturezaOperacao =
                await _naturezaOperacaoRepository.ObterNaturezaOperacao(
                    viewModel.OrdemCompraItem!.OrdemCompra!.NaturezaOperacaoId
                );

        // ... continua ...
    }

    viewModel = await PopularTributos(viewModel);

    return viewModel;
}

📊 Enum de Natureza de Operação

Arquivo: src/Nelmetais.SGE.Business/Enums/Cadastros/TipoNaturezaOperacaoEnum.cs

public enum TipoNaturezaOperacaoEnum
{
    Venda = 1,
    Compra = 2,
    Transferencia = 3,
    Devolucao = 4,
    Remessa = 5,
    Retorno = 6,
    Importacao = 7,
    Exportacao = 8
}

🔄 Diferença entre Tipos de Item

📦 Ordem de Compra (Item de Terceiro)

// TipoPedidoItem = OrdemCompra
NaturezaOperacaoId = (int)TipoNaturezaOperacaoEnum.Compra  // = 2

Características: - Operação de ENTRADA de mercadorias - Compra de fornecedores - CFOPs começam com 1 (entrada estadual) ou 2 (entrada interestadual) - Impostos calculados como crédito fiscal (na maioria dos casos)

📤 Pedido de Venda (Item Próprio)

// TipoPedidoItem = Pedido
NaturezaOperacaoId = (int)TipoNaturezaOperacaoEnum.Venda  // = 1

Características: - Operação de SAÍDA de mercadorias - Venda para clientes - CFOPs começam com 5 (saída estadual) ou 6 (saída interestadual) - Impostos calculados como débito fiscal

⚙️ Por que a Natureza de Operação é Importante?

A Natureza de Operação é fundamental para o cálculo correto dos tributos porque ela determina:

1️⃣ CFOP Correto

Natureza Direção Exemplos de CFOP Descrição
Compra Entrada 1101, 1102, 1111 Entrada no estado
Compra Entrada 2101, 2102, 2111 Entrada de outro estado
Venda Saída 5101, 5102, 5111 Saída no estado
Venda Saída 6101, 6102, 6111 Saída para outro estado

2️⃣ Alíquotas de ICMS

┌─────────────────────────────────────────────────────────┐
│ OPERAÇÃO DE COMPRA (Entrada)                           │
├─────────────────────────────────────────────────────────┤
│ - ICMS Normal: Crédito fiscal                          │
│ - Alíquota interestadual: 4%, 7% ou 12%               │
│ - Diferencial de alíquota (DIFAL) pode ser aplicado   │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│ OPERAÇÃO DE VENDA (Saída)                              │
├─────────────────────────────────────────────────────────┤
│ - ICMS Normal: Débito fiscal                           │
│ - Alíquota interna: geralmente 18%                    │
│ - ICMS ST pode ser aplicado                           │
└─────────────────────────────────────────────────────────┘

3️⃣ CST/CSOSN (Código de Situação Tributária)

Natureza CST Típico Descrição
Compra 00 Tributada integralmente
Compra 10 Tributada com cobrança de ICMS por ST
Compra 20 Com redução de base de cálculo
Venda 00 Tributada integralmente
Venda 10 Tributada com cobrança de ICMS por ST
Venda 60 ICMS cobrado anteriormente por ST

4️⃣ IPI, PIS e COFINS

Natureza IPI PIS COFINS Crédito/Débito
Compra Gera crédito Gera crédito Gera crédito Crédito
Venda Gera débito Gera débito Gera débito Débito

5️⃣ Configurações Fiscais Corretas

O sistema busca as configurações fiscais (CfopConfig, IcmsConfig, IpiConfig, PisCofinsConfig) adequadas para a Natureza de Operação:

// A natureza de operação é usada como filtro nas consultas
var cfopConfiguracoes = await _pedidoItemService.ObterCfopConfiguracoes(
    pedidoId,         // ← Pedido contém a Natureza de Operação
    mercadoriaId,
    tipoOrigemMercadoriaId
);

🔍 Fluxo de Uso da Natureza de Operação

┌─────────────────────────────────────────────────────────┐
│ 1. Usuário acessa tela de Ordem de Compra              │
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 2. Controller define:                                   │
│    NaturezaOperacaoId = TipoNaturezaOperacaoEnum.Compra│
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 3. Sistema carrega dados completos da Natureza         │
│    do banco via _naturezaOperacaoRepository             │
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 4. Natureza de Operação é usada para:                  │
│    ✓ Filtrar CFOPs corretos (entrada)                  │
│    ✓ Buscar alíquotas de ICMS apropriadas              │
│    ✓ Determinar CST/CSOSN                              │
│    ✓ Calcular IPI, PIS, COFINS corretamente           │
└────────────────────┬────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 5. Tributos são calculados corretamente                │
│    considerando a operação de ENTRADA                   │
└─────────────────────────────────────────────────────────┘

📦 Modelo de Dados

Tabela NaturezaOperacao

CREATE TABLE "NaturezaOperacao" (
    "Id" INTEGER PRIMARY KEY,
    "Nome" TEXT NOT NULL,
    "Tipo" INTEGER NOT NULL,  -- 1=Venda, 2=Compra, 3=Transferência, etc.
    "GerarFinanceiro" BOOLEAN,
    "GerarEstoque" BOOLEAN,
    "Ativo" BOOLEAN
);

Exemplos de Registros

Id Nome Tipo Descrição
1 Venda 1 Venda de mercadorias
2 Compra 2 Compra de fornecedores ← USADO
3 Transferência 3 Transferência entre filiais
4 Devolução 4 Devolução de mercadorias
5 Remessa 5 Remessa para beneficiamento
6 Retorno 6 Retorno de beneficiamento

🔗 Relacionamento com OrdemCompra

public class OrdemCompra
{
    public int Id { get; set; }

    // ← Relacionamento com Natureza de Operação
    public int NaturezaOperacaoId { get; set; }
    public NaturezaOperacao? NaturezaOperacao { get; set; }

    // Outros campos...
    public int FornecedorId { get; set; }
    public Pessoa? Fornecedor { get; set; }

    public decimal ValorTotal { get; set; }
    public decimal ValorLiquido { get; set; }

    // Relacionamento com itens
    public ICollection<OrdemCompraItem>? OrdemCompraItens { get; set; }
}

📝 Exemplo de CFOP por Natureza de Operação

COMPRA (Entrada)

CFOP Descrição Quando Usar
1101 Compra para industrialização Mercadoria será transformada
1102 Compra para comercialização Mercadoria será revendida
1111 Compra para industrialização de mercadoria recebida anteriormente em consignação industrial Casos específicos
2101 Compra para industrialização originada de outra UF Fornecedor de outro estado
2102 Compra para comercialização originada de outra UF Revenda, fornecedor de outro estado

VENDA (Saída)

CFOP Descrição Quando Usar
5101 Venda de produção do estabelecimento Produto fabricado pela empresa
5102 Venda de mercadoria adquirida ou recebida de terceiros Revenda
5405 Venda de mercadoria adquirida ou recebida de terceiros em operação com mercadoria sujeita ao regime de ST Com ST
6101 Venda de produção do estabelecimento para outro estado Fabricado, outro estado
6102 Venda de mercadoria adquirida ou recebida de terceiros para outro estado Revenda, outro estado

🔍 Como Verificar no Sistema

1. Via Controller

// No método Create do PedidoItemController
var naturezaOperacaoId = pedidoItemViewModel.OrdemCompraItem?.OrdemCompra?.NaturezaOperacaoId;
// Para Ordem de Compra: naturezaOperacaoId = 2 (Compra)

2. Via Repository

var naturezaOperacao = await _naturezaOperacaoRepository.ObterNaturezaOperacao(2);
// Retorna: { Id: 2, Nome: "Compra", Tipo: 2, ... }

3. Via JavaScript (Frontend)

// Não é diretamente acessível no frontend
// A natureza de operação é usada no backend para filtrar configurações

🎯 Impacto na Busca de Configurações Tributárias

Service Layer - PedidoItemService

public async Task<List<CfopConfig>> ObterCfopConfiguracoes(
    int? pedidoId,
    int? mercadoriaId,
    int? tipoOrigemMercadoriaId)
{
    // 1. Busca o Pedido (que contém a Natureza de Operação)
    var pedido = await _pedidoRepository.ObterPedido(pedidoId);

    // 2. Obtém a Natureza de Operação
    var naturezaOperacao = pedido?.OrdemCompra?.NaturezaOperacao;

    // 3. Filtra CFOPs compatíveis com a Natureza de Operação
    var cfops = await _cfopConfigRepository.ObterPorNaturezaOperacao(
        naturezaOperacao.Id,
        mercadoriaId,
        tipoOrigemMercadoriaId
    );

    return cfops;
}

📊 Resumo

Aspecto Ordem de Compra (Item de Terceiro)
Natureza de Operação TipoNaturezaOperacaoEnum.Compra (Id = 2)
Direção do Fluxo ENTRADA de mercadorias
CFOP Inicial 1xxx (estadual) ou 2xxx (interestadual)
Efeito Fiscal Gera créditos fiscais (ICMS, IPI, PIS, COFINS)
Finalidade Compra de mercadorias de fornecedores
Registro Contábil Débito: Estoque / Crédito: Fornecedores

🔗 Arquivos Relacionados

Backend

Arquivo Localização Responsabilidade
TipoNaturezaOperacaoEnum.cs Business/Enums/Cadastros/ Define tipos de natureza de operação
NaturezaOperacao.cs Business/Models/Cadastros/ Entidade de natureza de operação
INaturezaOperacaoRepository.cs Business/Interfaces/Cadastros/ Interface do repositório
NaturezaOperacaoRepository.cs Data/Repositories/Cadastros/ Implementação do repositório
PedidoItemController.cs WebApp/Areas/Comercial/Controllers/ Define natureza ao criar item

Database

-- Tabela principal
SELECT * FROM "NaturezaOperacao" WHERE "Id" = 2;

-- Tabelas relacionadas
SELECT * FROM "OrdemCompra" WHERE "NaturezaOperacaoId" = 2;
SELECT * FROM "CfopConfig" WHERE "NaturezaOperacaoId" = 2;

💡 Observações Importantes

  1. Imutabilidade: A Natureza de Operação é definida no momento da criação da Ordem de Compra e não deve ser alterada
  2. Validação: O sistema valida se as configurações tributárias são compatíveis com a Natureza de Operação
  3. Auditoria: Todas as operações com Natureza de Operação são registradas para fins fiscais e auditoria
  4. Performance: A Natureza de Operação é carregada uma única vez no carregamento da página
  5. Cache: Configurações tributárias por Natureza de Operação podem ser cacheadas para melhor performance

🚀 Exemplo Prático

Cenário: Compra de Aço de um Fornecedor de SP

┌─────────────────────────────────────────────────────┐
│ Dados da Operação                                   │
├─────────────────────────────────────────────────────┤
│ Natureza: COMPRA (Id: 2)                           │
│ Fornecedor: Fornecedor XYZ (SP)                    │
│ Empresa Compradora: Nelmetais (SP)                 │
│ Mercadoria: Chapa de Aço 1020                      │
│ Valor: R$ 10.000,00                                │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Sistema determina:                                  │
├─────────────────────────────────────────────────────┤
│ CFOP: 1101 (Compra para industrialização - SP)    │
│ ICMS: 18% = R$ 1.800,00 (CRÉDITO)                 │
│ IPI: 5% = R$ 500,00 (CRÉDITO)                     │
│ PIS: 1,65% = R$ 165,00 (CRÉDITO)                  │
│ COFINS: 7,6% = R$ 760,00 (CRÉDITO)                │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Resultado: Tributos corretos para ENTRADA          │
└─────────────────────────────────────────────────────┘

Última atualização: 2025-11-10 Relacionado: Ver também PREENCHIMENTO-AUTOMATICO-TRIBUTOS.md