/// <summary> /// Sign the comprobante document /// </summary> /// <typeparam name="T"></typeparam> /// <param name="oComprobante"></param> /// <returns></returns> public virtual SignDocumentResult <ICFDINomProvider> SignDocument(ICFDINomProvider cFDINomProvider, byte[] certificateCER, byte[] privateKey, string password) { //Instance CFDI Provider - Arrange SignDocumentResult <ICFDINomProvider> signDocumentResult = new SignDocumentResult <ICFDINomProvider>(); var digitalSign = new Cotorra.DigitalSign.DigitalSign(); //Certificate B64 y Certificate Number signDocumentResult.CertificateB64 = digitalSign.GetCerticate(certificateCER); signDocumentResult.CertificateNumber = digitalSign.GetCertificateNumber(certificateCER); //Complete CFDI cFDINomProvider.Certificado = signDocumentResult.CertificateB64; cFDINomProvider.NoCertificado = signDocumentResult.CertificateNumber; //Get XML var xml = CreateXml(cFDINomProvider, false); //Get Original String var originalString = GetOriginalString(xml); //Sign Document signDocumentResult.SignString = digitalSign.Sign(originalString, privateKey, password); cFDINomProvider.Sello = signDocumentResult.SignString; //CFDIProvider signDocumentResult.CFDI = cFDINomProvider; signDocumentResult.OriginalString = originalString; return(signDocumentResult); }
private async Task <List <PayrollStampingResultDetail> > doWorkAsync(Overdraft overdraftToStamp, RoundUtil roundUtil, ZipCodeManager zipCodeManager, PayrollStampingParams payrollStampingParams, BlobStorageUtil blobStorageUtil, ISendMailProvider sendMailProvider, List <Incident> incidents, List <Inhability> inhabilities, List <EmployerFiscalInformation> employerFiscalInformations, List <PayrollCompanyConfiguration> payrollConfigurations) { var payrollStampingResultDetail = new PayrollStampingResultDetail(); var payrollStampingResultDetails = new List <PayrollStampingResultDetail>(); //Obtiene los xmls de los comprobantes segun la version de CFDI especificada IFiscalStamping fiscalStamping = FiscalStampingFactory.CreateInstance(payrollStampingParams.FiscalStampingVersion); //1. Get totals var overdraftResults = new OverdraftManager().GetTotals(overdraftToStamp, roundUtil); //1.1 Datetime for zipCode (var zipcode, var datetimeFromZipCode) = await zipCodeManager.GetZipCode(overdraftToStamp, payrollConfigurations.FirstOrDefault()); //2. Get XML - Creates comprobante var payrolllStampingDetail = payrollStampingParams.Detail .FirstOrDefault(detail => detail.OverdraftID == overdraftToStamp.ID); ICFDINomProvider cfdi = null; try { cfdi = fiscalStamping.CreateComprobante(new CreateComprobanteParams() { PayrollStampingDetail = payrolllStampingDetail, PayrollStampingParams = payrollStampingParams, Overdraft = overdraftToStamp, OverdraftResults = overdraftResults, PayrollCompanyConfiguration = payrollConfigurations.FirstOrDefault(), CFDIDateTimeStamp = datetimeFromZipCode, ZipCode = zipcode, RoundUtil = roundUtil, Incidents = incidents, Inhabilities = inhabilities }); } catch (Exception ex) { //Errores en validaciónes de armado / fiscales payrollStampingResultDetail.Message = ex.Message; payrollStampingResultDetail.PayrollStampingResultStatus = PayrollStampingResultStatus.Fail; payrollStampingResultDetail.HistoricEmployeeID = overdraftToStamp.HistoricEmployeeID.Value; payrollStampingResultDetail.EmployeeID = overdraftToStamp.HistoricEmployee.EmployeeID; payrollStampingResultDetail.OverdraftID = overdraftToStamp.ID; payrollStampingResultDetail.Overdraft = overdraftToStamp; payrollStampingResultDetail.PeriodDetailID = overdraftToStamp.PeriodDetailID; payrollStampingResultDetail.PeriodDetail = overdraftToStamp.PeriodDetail; payrollStampingResultDetails.Add(payrollStampingResultDetail); return(payrollStampingResultDetails); } //3. Sign XML var certificateCER = employerFiscalInformations.FirstOrDefault().CertificateCER; var certificateKey = employerFiscalInformations.FirstOrDefault().CertificateKEY; var certPassword = employerFiscalInformations.FirstOrDefault().CertificatePwd; //Decrypt (var certificatebytesCER, var certificatebytesKEY, var certPasswordResult) = Crypto(payrollStampingParams, certificateCER, certificateKey, certPassword); var stampingResult = fiscalStamping.SignDocument(cfdi, certificatebytesCER, certificatebytesKEY, certPasswordResult); //Set the employer stampingResult.EmployerRFC = payrollConfigurations.FirstOrDefault().RFC; //4. Stamp XML stampingResult = await fiscalStamping.StampDocumetAsync(stampingResult); if (stampingResult.WithErrors) { //error en el timbrado var errrorMessage = $"\nPara el empleado <strong>'{overdraftToStamp.HistoricEmployee.FullName}'</strong> encontramos los siguientes errores de timbrado: '{stampingResult.Details}'"; payrollStampingResultDetail.Message = errrorMessage; payrollStampingResultDetail.PayrollStampingResultStatus = PayrollStampingResultStatus.Fail; } else { //5. Return the complete XML stampingResult.XML = fiscalStamping.CreateXml <ICFDINomProvider>(stampingResult.CFDI, true); //5.5 Fill the result data payrollStampingResultDetail.Message = String.Empty; payrollStampingResultDetail.UUID = stampingResult.UUID; payrollStampingResultDetail.XML = stampingResult.XML; payrollStampingResultDetail.PayrollStampingResultStatus = PayrollStampingResultStatus.Success; //6. Fill the result data overdraftToStamp.UUID = stampingResult.UUID; overdraftToStamp.OverdraftStatus = OverdraftStatus.Stamped; //Fire and forget convertion and sending email fireAndForgetAsync(payrollStampingParams, overdraftToStamp, payrollConfigurations, blobStorageUtil, sendMailProvider, payrollStampingResultDetail.UUID, payrollStampingResultDetail.XML); //Fill the result object payrollStampingResultDetail.HistoricEmployeeID = overdraftToStamp.HistoricEmployeeID.Value; payrollStampingResultDetail.EmployeeID = overdraftToStamp.HistoricEmployee.EmployeeID; payrollStampingResultDetail.OverdraftID = overdraftToStamp.ID; payrollStampingResultDetail.Overdraft = overdraftToStamp; payrollStampingResultDetail.PeriodDetailID = overdraftToStamp.PeriodDetailID; payrollStampingResultDetail.PeriodDetail = overdraftToStamp.PeriodDetail; } payrollStampingResultDetails.Add(payrollStampingResultDetail); return(payrollStampingResultDetails); }