Var
// Instancias comunes independientes de la version
OpenSSL : IOpenSSL;
PacEcodex : IProveedorAutorizadoCertificacion;
CertificadoSellos : ICertificadoDeSellos;
CredencialesPAC : TFacturacionCredencialesPAC;
CredencialesIntegrador : TFacturacionCredencialesPAC;
//Variables
Reintentar : Boolean;
RutaCertificado, RutaLlavePrivada, ClaveLlavePrivada: String;
Const
_NUEMRO_TRANSACCION_INICIAL = 1;
// El primer sello es para Ecodex
RutaCertificado := ExtractFilePath(Application.ExeName) + 'CSD Pruebas\CSD_Pruebas_CFDI_VOC990129I26.cer';
RutaLlavePrivada := ExtractFilePath(Application.ExeName) + 'CSD Pruebas\CSD_Pruebas_CFDI_VOC990129I26.cer.key';
ClaveLlavePrivada:= '12345678a';
OpenSSL:= TOpenSSL.Create;
OpenSSL.AsignarLlavePrivada(rutaLlavePrivada, claveLlavePrivada);
CertificadoSellos:= TCertificadoDeSellos.Create;
CertificadoSellos.Leer(rutaCertificado);
// Verificando certificado de sellos y llave privada... sean pareja
IF Not openSSL.SonPareja(RutaCertificado, RutaLlavePrivada, ClaveLlavePrivada) Then
Begin
Application.MessageBox('Los Archivos de Certificado y Llave Privada No Son Pareja. Favor de Verificar','Certificado SAT ',mb_Ok+mb_iconInformation);
Exit;
End;
PacEcodex:= TProveedorEcodex.Create; //Writeln('Creando instancia de PAC...');
CredencialesPAC.RFC :='VOC990129I26';
CredencialesPAC.DistribuidorID:= '2b3a8764-d586-4543-9b7e-82834443f219';
PacEcodex.Configurar(_URL_ECODEX_4N8T_V33, _URL_ECODEX_4N8T_V33, _URL_ECODEX_4N8T_V33, credencialesPAC, credencialesIntegrador,_NUEMRO_TRANSACCION_INICIAL);
// Inicializamos la variable de re-intentar en verdadero para intentar timbrar cada vez que falle el servicio del PAC
Reintentar:= True;
While Reintentar Do
Begin
Try
IF pacEcodex.CancelarDocumento(Busqueda_INGFm.UniQ_Facturas.FieldByName('FE_TIMBRE_UUID').AsString) Then
Begin
//Actualizar en la Base de Datos, Causa y STATUS de Cancelación del CFDI
With UniQ_Operations Do
Begin
Close;
SQL.Clear;
SQL.Add('UPDATE ING_FACTURAS');
SQL.Add('SET C_CANCEL = ''' + Trim(UpperCase(Causa.Text)) + ''', ');
SQL.Add('STATUS = ''CA'''+', ');
SQL.Add('PC_UPDATE = ''' + Terminal + ''' ');
SQL.Add('WHERE EJERCICIO = ' + MenuGralFm.UniQ_Ejercicio.FieldByName('EJERCICIO').AsString + '');
SQL.Add('AND FOLIO = ''' + Busqueda_INGFm.UniQ_Facturas.FieldByName('FOLIO').AsString + '''');
ExecSQL;
End;
MenuGralFm.UniTransactionWrite.CommitRetaining;
Application.MessageBox('El FOLIO CFDI Seleccionado, Fue CANCELADO con Exito','Cancelación CFDI.',mb_Ok+mb_iconInformation);
// Recibimos el Timbre CANCELACION de forma exitosa, dejamos de "reintentar"
Reintentar:= False;
Btn_CancelarClick(Sender);
End
Except
On E: EPACErrorGenericoException do
Begin
AllocConsole;
Writeln('--------------------------------------------------');
Writeln('Problema Temporal al Timbrar LA CANCELACION, Re-Intentando en 3 segundos: ', E.Message);
Sleep(3000);
FreeConsole;
End;
End;
End;