authenticateWithProcurador method

Future<void> authenticateWithProcurador({
  1. required String consumerKey,
  2. required String consumerSecret,
  3. required String contratanteNumero,
  4. required String autorPedidoDadosNumero,
  5. String? certificadoDigitalBase64,
  6. String? certificadoDigitalPath,
  7. String? senhaCertificado,
  8. String ambiente = 'trial',
  9. String? contratanteNome,
  10. String? autorNome,
  11. String? contribuinteNumero,
  12. String? autorNumero,
  13. String? certificadoProcuradorPath,
  14. String? certificadoProcuradorBase64,
  15. String? certificadoProcuradorPassword,
})

Autenticação Unificada: OAuth2 + Procurador em um único passo

Este método combina a autenticação OAuth2 básica com a autenticação do procurador em uma única chamada, facilitando o uso quando ambas são necessárias.

consumerKey: Chave do consumidor fornecida pelo SERPRO consumerSecret: Segredo do consumidor forneida pelo SERPRO contratanteNumero: CNPJ da empresa contratante autorPedidoDadosNumero: CPF/CNPJ do autor do pedido certificadoDigitalBase64: Certificado digital em Base64 (opcional) certificadoDigitalPath: Caminho para o arquivo do certificado digital (opcional) senhaCertificado: Senha do certificado digital (opcional) ambiente: Ambiente de execução ('trial' ou 'producao')

Parâmetros do Procurador (se fornecidos, faz autenticação completa): contratanteNome: Nome da empresa contratante autorNome: Nome do autor da procuração contribuinteNumero: CNPJ do contribuinte (se diferente do contratante) autorNumero: CPF/CNPJ do autor (se diferente do autorPedidoDadosNumero) certificadoProcuradorPath: Caminho do certificado do procurador certificadoProcuradorBase64: Certificado do procurador em Base64 certificadoProcuradorPassword: Senha do certificado do procurador

Implementation

Future<void> authenticateWithProcurador({
  required String consumerKey,
  required String consumerSecret,
  required String contratanteNumero,
  required String autorPedidoDadosNumero,
  String? certificadoDigitalBase64,
  String? certificadoDigitalPath,
  String? senhaCertificado,
  String ambiente = 'trial',

  // Parâmetros do Procurador (se fornecidos, faz autenticação completa)
  String? contratanteNome,
  String? autorNome,
  String? contribuinteNumero,
  String? autorNumero,
  String? certificadoProcuradorPath,
  String? certificadoProcuradorBase64,
  String? certificadoProcuradorPassword,
}) async {
  // Limpar dados da autenticação anterior para evitar conflitos
  clearAuthentication();

  // Usar autenticação procurador via Cloud Function se URL estiver configurada
  if (_urlAutenticacaoProcurado != null &&
      _urlAutenticacaoProcurado!.isNotEmpty &&
      contratanteNome != null &&
      autorNome != null) {
    // Armazenar certificado para uso no proxy
    _cloudFunctionCertBase64 =
        certificadoProcuradorBase64 ?? certificadoDigitalBase64;
    _cloudFunctionCertPassword =
        certificadoProcuradorPassword ?? senhaCertificado;

    await _authenticateWithProcuradorViaCloudFunction(
      consumerKey: consumerKey,
      consumerSecret: consumerSecret,
      contratanteNumero: contratanteNumero,
      contratanteNome: contratanteNome,
      autorPedidoDadosNumero: autorNumero ?? autorPedidoDadosNumero,
      autorNome: autorNome,
      ambiente: ambiente,
      contribuinteNumero: contribuinteNumero ?? contratanteNumero,
      certificadoDigitalBase64: certificadoDigitalBase64,
      senhaCertificado: senhaCertificado,
      certificadoProcuradorBase64: certificadoProcuradorBase64,
      certificadoProcuradorPassword: certificadoProcuradorPassword,
    );
    _contribuinteNumero = contribuinteNumero ?? contratanteNumero;
    return;
  }

  // Validações dos parâmetros do procurador (se fornecidos)
  if (contratanteNome != null || autorNome != null) {
    // Se forneceu um parâmetro do procurador, todos os obrigatórios devem estar presentes
    if (contratanteNome == null || contratanteNome.trim().isEmpty) {
      throw Exception('Parâmetro obrigatório ausente: contratanteNome');
    }
    if (autorNome == null || autorNome.trim().isEmpty) {
      throw Exception('Parâmetro obrigatório ausente: autorNome');
    }

    // Validar se há pelo menos um certificado disponível
    final hasCertificadoDigital =
        certificadoDigitalPath != null || certificadoDigitalBase64 != null;
    final hasCertificadoProcurador =
        certificadoProcuradorPath != null ||
        certificadoProcuradorBase64 != null;

    if (!hasCertificadoDigital && !hasCertificadoProcurador) {
      throw Exception(
        'Certificado digital necessário. Forneça certificadoDigitalPath/Base64 ou certificadoProcuradorPath/Base64',
      );
    }
  }

  // 1. Fazer autenticação OAuth2 normal
  await authenticate(
    consumerKey: consumerKey,
    consumerSecret: consumerSecret,
    contratanteNumero: contratanteNumero,
    autorPedidoDadosNumero: autorPedidoDadosNumero,
    certificadoDigitalBase64: certificadoDigitalBase64,
    certificadoDigitalPath: certificadoDigitalPath,
    senhaCertificado: senhaCertificado,
    ambiente: ambiente,
  );

  // Armazenar contribuinteNumero para uso como padrão nos serviços
  _contribuinteNumero = contribuinteNumero ?? contratanteNumero;

  // 2. Se parâmetros do procurador foram fornecidos, fazer autenticação do procurador
  if (contratanteNome != null && autorNome != null) {
    // Validar se a autenticação OAuth2 foi bem-sucedida
    if (_authModel == null) {
      throw Exception(
        'Falha na autenticação OAuth2. Não é possível prosseguir com a autenticação do procurador.',
      );
    }
    final service = AutenticaProcuradorService(this);
    final response = await service.autenticarProcurador(
      contratanteNumero: contratanteNumero,
      contratanteNome: contratanteNome,
      autorNome: autorNome,
      contribuinteNumero: contribuinteNumero ?? contratanteNumero,
      autorNumero: autorNumero ?? autorPedidoDadosNumero,
      certificadoPath: certificadoProcuradorPath ?? certificadoDigitalPath,
      certificadoBase64: certificadoProcuradorBase64,
      certificadoPassword: certificadoProcuradorPassword ?? senhaCertificado,
    );

    if (!response.sucesso) {
      throw Exception(
        'Falha na autenticação do procurador.: ${response.mensagemPrincipal}',
      );
    }

    // Atualizar o _authModel com o token do procurador
    _updateProcuradorToken(response.autenticarProcuradorToken ?? '');
  }
}