Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Portal de Notas Ficais com Template Method

Em um portal de notas fiscais, diferentes tipos de documentos seguem fluxos similares mas com particularidades específicas, certo ?

a Pergunta é:

Extensibilidade !
**
Como Novos tipos de nota (NFCe, CTe) podem ser adicionados, de forma simples ?**

indo mais a fundo:
Endpoint

// routes/api.php (Laravel)
Route::post('/notas-fiscais/processar', [NotaFiscalController::class, 'processar']);

// Ou usando PHP puro
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['REQUEST_URI'] === '/api/processar-nota') {
    $controller = new NotaFiscalController();
    $input = json_decode(file_get_contents('php://input'), true);
    echo json_encode($controller->processarNota($input));
}

a i.a me trouxe,

// processar_nota.php
<?php
if ($_POST['acao'] === 'processar') {
    $tipo = $_POST['tipo_nota']; // 'NFE_PRODUTO', 'NFSE_SERVICO', etc.
    
    // Criar dados da nota a partir do formulário
    $dados = new DadosNota(
        $_POST['cnpj_emitente'],
        $_POST['cnpj_destinatario'],
        floatval($_POST['valor_total']),
        criarItensDoFormulario($_POST['itens'])
    );
    
    // Processar usando o Template Method
    $processador = ProcessadorFactory::criar($tipo);
    $resultado = $processador->processarNotaFiscal($dados);
    
    echo "<div class='alert alert-success'>$resultado</div>";
}
?>

o Cloud.ia me trouxe a estrutura:

3 respostas
solução!

Oi, Anderson! Como vai?

Você está certo: com o Template Method, novos tipos de notas como NFCe ou CTe podem ser adicionados com extensibilidade e baixa duplicação. Basta criar uma nova classe que estenda a classe base ProcessadorNotaFiscal, implementando os métodos específicos para aquele tipo de nota.

Veja este exemplo:


// Novo tipo: NFCe
class ProcessadorNFCe extends ProcessadorNotaFiscal {

    protected function validarDadosEspecificos(DadosNota $dados): bool {
        // Validacoes da NFCe
        return true;
    }

    protected function calcularImpostos(DadosNota $dados): float {
        // Calculo de ICMS + outros impostos da NFCe
        return 0.0;
    }

    protected function gerarXML(DadosNota $dados): string {
        return "<NFCe>...</NFCe>";
    }
}

Agora é só registrar na factory:


class ProcessadorFactory {
    public static function criar(string $tipo): ProcessadorNotaFiscal {
        switch ($tipo) {
            case 'NFE_PRODUTO':
                return new ProcessadorNFeProduto();
            case 'NFSE_SERVICO':
                return new ProcessadorNFSeServico();
            case 'NFCE':
                return new ProcessadorNFCe(); // novo!
            default:
                throw new InvalidArgumentException("Tipo nao suportado: $tipo");
        }
    }
}

Com isso, o endpoint continua igual e agora suporta novos tipos de nota sem alterar o código existente. Isso é abertura para extensão, mas fechamento para modificação, lembra?

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.