consultarUltimaDeclaracaoComPagamento method

Future<ConsultarUltimaDeclaracaoComPagamentoResponse> consultarUltimaDeclaracaoComPagamento({
  1. String? contribuinteNumero,
  2. required String periodoApuracao,
  3. String? contratanteNumero,
  4. String? autorPedidoDadosNumero,
})

Consultar última declaração com informação de pagamento do DAS

Combina a consulta da última declaração (CONSULTIMADECREC14) com consulta de declarações para obter status de pagamento do DAS.

Este método executa duas operações:

  1. Consulta a última declaração do período (PDFs e detalhes)
  2. Consulta as declarações do ano para obter status de pagamento do DAS

contribuinteNumero CNPJ do contribuinte periodoApuracao Período de apuração (formato: AAAAMM, exemplo: "202504") 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: ConsultarUltimaDeclaracaoComPagamentoResponse com todos os dados da declaração mais o campo adicional dasPago indicando se o DAS foi pago.

O campo dasPago:

  • true: DAS foi pago OU não foi encontrado DAS para o período (assume pago)
  • false: DAS existe e não consta pagamento

Throws: Exception se a consulta da última declaração falhar

Exemplo:

final resultado = await pgdasdService.consultarUltimaDeclaracaoComPagamento(
  contribuinteNumero: '12345678000100',
  periodoApuracao: '202504',
);

print('Número: ${resultado.dados?.numeroDeclaracao}');
print('DAS Pago: ${resultado.dasPago ? "Sim" : "Não"}');

Implementation

Future<ConsultarUltimaDeclaracaoComPagamentoResponse>
consultarUltimaDeclaracaoComPagamento({
  String? contribuinteNumero,
  required String periodoApuracao,
  String? contratanteNumero,
  String? autorPedidoDadosNumero,
}) async {
  // Passo 1: Consultar última declaração
  final ultimaDeclaracaoResponse = await consultarUltimaDeclaracao(
    contribuinteNumero: contribuinteNumero,
    periodoApuracao: periodoApuracao,
    contratanteNumero: contratanteNumero,
    autorPedidoDadosNumero: autorPedidoDadosNumero,
  );

  // Passo 2: Extrair ano calendário do período (primeiros 4 dígitos)
  final anoCalendario = periodoApuracao.substring(0, 4);

  // Passo 3: Consultar declarações para obter status de pagamento
  bool dasPago = true; // Default: assume pago
  String? alertaPagamento;

  try {
    final declaracoesResponse = await consultarDeclaracoes(
      contribuinteNumero: contribuinteNumero,
      anoCalendario: anoCalendario,
      contratanteNumero: contratanteNumero,
      autorPedidoDadosNumero: autorPedidoDadosNumero,
    );

    // Passo 4: Procurar período correspondente e extrair dasPago + coletar pendências do ano
    if (declaracoesResponse.sucesso && declaracoesResponse.dados != null) {
      final periodoInt = int.parse(periodoApuracao);
      final pendenciasNoAno = <String>[];

      // Iterar pelos períodos do ano
      for (final periodo in declaracoesResponse.dados!.listaPeriodos) {
        bool periodoTemPendente = false;

        // Verificar se qualquer operação do período possui um DAS não pago
        for (final operacao in periodo.operacoes) {
          if (operacao.indiceDas != null && !operacao.indiceDas!.dasPago) {
            periodoTemPendente = true;

            // Se for o mês solicitado, atualiza o status principal
            if (periodo.periodoApuracao == periodoInt) {
              dasPago = false;
            }
            break;
          }
        }

        if (periodoTemPendente) {
          // Formatar período de AAAAMM para MM/AAAA
          final paStr = periodo.periodoApuracao.toString();
          if (paStr.length == 6) {
            final mes = paStr.substring(4, 6);
            final ano = paStr.substring(0, 4);
            pendenciasNoAno.add('$mes/$ano');
          }
        }
      }

      if (pendenciasNoAno.isNotEmpty) {
        alertaPagamento =
            'Atenção: Constam guias em aberto para os meses: ${pendenciasNoAno.join(', ')}';
      }
    }
  } catch (e) {
    // Se falhar ao consultar declarações, mantém default dasPago = true
    // Não falha o método composto, apenas usa o valor padrão
  }

  // Passo 5: Criar resposta composta
  return ConsultarUltimaDeclaracaoComPagamentoResponse.fromBase(
    baseResponse: ultimaDeclaracaoResponse,
    dasPago: dasPago,
    alertaPagamento: alertaPagamento,
  );
}