entregarDeclaracaoComDas method

Future<EntregarDeclaracaoComDasResponse> entregarDeclaracaoComDas({
  1. String? cnpj,
  2. required int periodoApuracao,
  3. required Declaracao declaracao,
  4. bool indicadorTransmissao = true,
  5. bool indicadorComparacao = true,
  6. List<ValorDevido>? valoresParaComparacao,
  7. String? dataConsolidacao,
  8. String? contratanteNumero,
  9. String? autorPedidoDadosNumero,
})

Entregar declaração e gerar DAS automaticamente

Combina a entrega de declaração (TRANSDECLARACAO11) com geração automática do DAS (GERARDAS12) após sucesso.

Este método executa duas operações em sequência:

  1. Transmite a declaração para a RFB
  2. Se a declaração for bem-sucedida, gera o DAS automaticamente

cnpj CNPJ do contribuinte (14 dígitos sem formatação) periodoApuracao Período de apuração da declaração (formato: AAAAMM, exemplo: 202504) declaracao Objeto contendo os dados da declaração indicadorTransmissao Indica se a declaração deve ser transmitida (padrão: true) indicadorComparacao Indica se há necessidade de comparação dos valores (padrão: true) valoresParaComparacao Valores para comparação com o valor apurado pelo sistema (opcional) dataConsolidacao Data de consolidação futura para o DAS (opcional, formato: AAAAMMDD) contratanteNumero CNPJ do contratante (opcional, usa dados da autenticação se não informado) autorPedidoDadosNumero CPF/CNPJ do autor do pedido (opcional, usa dados da autenticação se não informado)

Returns: EntregarDeclaracaoComDasResponse com dados combinados de ambas operações

Comportamento em caso de erros:

  • Se a declaração falhar: Retorna erro imediatamente, não tenta gerar DAS
  • Se o DAS falhar: Retorna erro MAS preserva os dados da declaração

A resposta contém getters úteis:

  • sucesso: true se ambas operações foram bem-sucedidas
  • declaracaoEntregue: true se a declaração foi transmitida
  • dasGerado: true se o DAS foi gerado

IMPORTANTE: Se o DAS falhar mas a declaração foi entregue, você pode gerar o DAS manualmente usando o método gerarDas() com o período da declaração. O ID da declaração estará disponível em dadosDeclaracao.

Exemplo:

final resultado = await pgdasdService.entregarDeclaracaoComDas(
  cnpj: '12345678000100',
  periodoApuracao: 202504,
  declaracao: declaracao,
  autorPedidoDadosNumero: '12345678000100',
);

if (resultado.sucesso) {
  print('✅ Declaração e DAS gerados!');
  print('ID: ${resultado.dadosDeclaracao!.idDeclaracao}');
  print('DAS: ${resultado.dadosDas![0].detalhamento.numeroDocumento}');
} else if (resultado.declaracaoEntregue) {
  print('⚠️ Declaração OK, mas DAS falhou');
  print('Tente gerar DAS manualmente');
} else {
  print('❌ Erro ao entregar declaração');
}

Implementation

Future<EntregarDeclaracaoComDasResponse> entregarDeclaracaoComDas({
  String? cnpj,
  required int periodoApuracao,
  required Declaracao declaracao,
  bool indicadorTransmissao = true,
  bool indicadorComparacao = true,
  List<ValorDevido>? valoresParaComparacao,
  String? dataConsolidacao,
  String? contratanteNumero,
  String? autorPedidoDadosNumero,
}) async {
  // Passo 1: Entregar declaração usando o método refatorado
  final entregarResponse = await entregarDeclaracao(
    cnpj: cnpj,
    periodoApuracao: periodoApuracao,
    declaracao: declaracao,
    indicadorTransmissao: indicadorTransmissao,
    indicadorComparacao: indicadorComparacao,
    valoresParaComparacao: valoresParaComparacao,
    contratanteNumero: contratanteNumero,
    autorPedidoDadosNumero: autorPedidoDadosNumero,
  );

  // Passo 2: Verificar se a declaração foi bem-sucedida
  if (!entregarResponse.sucesso) {
    // Declaração falhou, retornar erro imediatamente
    return EntregarDeclaracaoComDasResponse.fromDeclaracaoError(
      declaracaoResponse: entregarResponse,
    );
  }

  // Passo 3: Converter período de apuração (int → String)
  final periodoApuracaoString = periodoApuracao.toString();

  // Passo 4: Tentar gerar DAS
  try {
    final gerarDasResponse = await gerarDas(
      contribuinteNumero: cnpj,
      periodoApuracao: periodoApuracaoString,
      dataConsolidacao: dataConsolidacao,
      contratanteNumero: contratanteNumero,
      autorPedidoDadosNumero: autorPedidoDadosNumero,
    );

    // Passo 5a: Verificar se DAS foi gerado com sucesso
    if (!gerarDasResponse.sucesso) {
      // DAS falhou, mas declaração foi entregue
      return EntregarDeclaracaoComDasResponse.fromDasError(
        declaracaoResponse: entregarResponse,
        dasResponse: gerarDasResponse,
      );
    }

    // Passo 5b: Ambas operações bem-sucedidas
    return EntregarDeclaracaoComDasResponse.fromResponses(
      declaracaoResponse: entregarResponse,
      dasResponse: gerarDasResponse,
    );
  } catch (e) {
    // DAS lançou exception, criar resposta de erro artificial
    final gerarDasResponseErro = GerarDasResponse(
      status: 500,
      mensagens: [
        gerar_das_models.Mensagem(
          codigo: 'ERRO_GERACAO_DAS',
          texto: 'Erro ao gerar DAS: ${e.toString()}',
        ),
      ],
      dados: null,
    );

    return EntregarDeclaracaoComDasResponse.fromDasError(
      declaracaoResponse: entregarResponse,
      dasResponse: gerarDasResponseErro,
    );
  }
}