private async Task <List <ConceptPayment> > GetAllConceptsSettlement(IEnumerable <int> codes, IEnumerable <string> fiscalCodes, Guid identityWorkID, Guid instanceID) { var manager = new MiddlewareManager <ConceptPayment>(new BaseRecordManager <ConceptPayment>(), new ConceptPaymentValidator()); return(await manager.FindByExpressionAsync(x => instanceID == x.InstanceID && (fiscalCodes.Contains(x.SATGroupCode) || codes.Contains(x.Code) || x.AutomaticDismissal), identityWorkID)); }
private async Task UpdateDetails(Guid OrdinaryID, Guid IndemnizationOverID, List <Guid> OrdinaryOverDetailsIDs, List <Guid> IndemnizationOverDetailsIDs, Guid identityWorkId, Guid instanceID) { var manager = new MiddlewareManager <OverdraftDetail>(new BaseRecordManager <OverdraftDetail>(), new OverdraftDetailValidator()); var allGuids = new List <Guid>(OrdinaryOverDetailsIDs); allGuids.AddRange(IndemnizationOverDetailsIDs); var allDetailsDelete = await manager.FindByExpressionAsync(x => x.InstanceID == instanceID && (x.OverdraftID == IndemnizationOverID || x.OverdraftID == OrdinaryID), identityWorkId, new string[] { "ConceptPayment" }); var allDetails = allDetailsDelete.Where(x => OrdinaryOverDetailsIDs.Contains(x.ID) || IndemnizationOverDetailsIDs.Contains(x.ID)).ToList(); var oldOrdinaryDetailsCompensation = allDetailsDelete.Where(x => x.OverdraftID == OrdinaryID && (x.ConceptPayment.Code == ISRFINIQUITOCONCEPTCODE || COMPENSATIONSATCODES.Contains(x.ConceptPayment.SATGroupCode))).ToList(); allDetails.Where(x => OrdinaryOverDetailsIDs.Contains(x.ID)).AsParallel().ForAll(y => { y.OverdraftID = OrdinaryID; y.ConceptPayment = null; }); //se elimina porke no hace nada //allDetails.Where(x => OrdinaryOverDetailsIDs.Contains(x.ID)).Where(p => p.Active); allDetails.Where(x => IndemnizationOverDetailsIDs.Contains(x.ID)).AsParallel().ForAll(y => { y.OverdraftID = IndemnizationOverID; y.ConceptPayment = null; }); await manager.UpdateAsync(allDetails, identityWorkId); if (oldOrdinaryDetailsCompensation.Any()) { oldOrdinaryDetailsCompensation.AsParallel().ForAll(item => item.ConceptPayment = null); await manager.DeleteAsync(oldOrdinaryDetailsCompensation.Select(x => x.ID).ToList(), identityWorkId); } }
private async Task <List <Overdraft> > GetOverdraftsAsync(Guid instanceID, Guid identityWorkID, Guid periodDetailID, List <OverdraftStatus> statusOverdrafts, int bankCode) { var manager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); var overdrafts = await manager.FindByExpressionAsync(x => x.InstanceID == instanceID && x.OverdraftType == OverdraftType.Ordinary && statusOverdrafts.Contains(x.OverdraftStatus) && x.PeriodDetailID == periodDetailID && x.Employee.Bank.Code == bankCode, identityWorkID, new string[] { "OverdraftDetails", "OverdraftDetails.ConceptPayment", "Employee" }); return(overdrafts); }
private async Task <List <Overdraft> > GetOverdrafts(Guid employeeID, Guid instanceID, Guid identityWorkID, List <OverdraftType> overdraftType) { var manager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); List <Overdraft> overdrafts = null; overdrafts = await manager.FindByExpressionAsync(x => x.InstanceID == instanceID && x.EmployeeID == employeeID && overdraftType.Contains(x.OverdraftType) && x.OverdraftStatus == OverdraftStatus.None, identityWorkID, new string[] { "OverdraftDetails", "OverdraftDetails.ConceptPayment" }); return(overdrafts); }
private async Task <List <Overdraft> > GetOverdraftByIDs(List <Guid> ids, Guid identityWorkID) { var manager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); var overdrafts = await manager.FindByExpressionAsync(p => ids.Contains(p.ID) && p.company == identityWorkID && p.Active, identityWorkID, new string[] { "OverdraftDetails", "OverdraftDetails.ConceptPayment", "PeriodDetail", "PeriodDetail.Period", "Employee", "Employee.HistoricEmployeeSalaryAdjustments", }); return(overdrafts); }
private async Task <List <Overdraft> > GetOverdrafts(Guid employeeID, Guid instanceID, Guid identityWorkID, Guid periodDetailID, List <OverdraftType> overdraftType) { var manager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); List <Overdraft> overdrafts = null; if (periodDetailID != Guid.Empty) { overdrafts = await manager.FindByExpressionAsync(x => x.InstanceID == instanceID && x.EmployeeID == employeeID && x.PeriodDetailID == periodDetailID && overdraftType.Contains(x.OverdraftType) && x.OverdraftStatus == OverdraftStatus.None, identityWorkID, new string[] { "OverdraftDetails", "OverdraftDetails.ConceptPayment" }); } else { throw new CotorraException(108, "108", "No se estableció el periodo correspondiente", null); } return(overdrafts); }
public async Task <List <Overdraft> > Calculate(CalculateSettlementProcessParams parameters) { Guid identityWorkID = parameters.IdentityWorkID; Guid instanceId = parameters.InstanceID; Guid periodDetailID = parameters.PeriodDetailID; Guid employeeID = parameters.EmployeeID; var oversGenerated = new List <Overdraft>(); var codes = parameters.ConceptsToApply.Select(x => x.Code).ToList(); codes.Add(ISRFINIQUITOCONCEPTCODE); var allConcepts = await GetAllConceptsSettlement(codes, COMPENSATIONSATCODES, identityWorkID, instanceId); var employeeManager = new MiddlewareManager <Employee>(new BaseRecordManager <Employee>(), new EmployeeValidator()); var employee = employeeManager.FindByExpressionAsync(x => x.ID == employeeID && x.InstanceID == instanceId && x.Active == true, identityWorkID); using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var previousSettlementOverdrafts = await GetOverdrafts(parameters.EmployeeID, parameters.InstanceID, parameters.IdentityWorkID, new List <OverdraftType>() { OverdraftType.OrdinarySettlement, OverdraftType.CompensationSettlement }); await UpdateEmployee(parameters, (await employee).FirstOrDefault()); await DeleteOverdrafts(previousSettlementOverdrafts, parameters.IdentityWorkID); oversGenerated.Add(await GenerateOrdinaryOverdraft(parameters, allConcepts)); var compensation = await GenerateCompensationOverdraft(parameters, allConcepts); if (compensation != null) { oversGenerated.Add(compensation); } scope.Complete(); } oversGenerated.ForEach(over => over.OverdraftDetails = over.OverdraftDetails.OrderBy(x => x.ConceptPayment.Code).ToList()); return(oversGenerated); }
/// <summary> /// Create or Get the EmployeeIdentiyRegistration /// </summary> /// <param name="middlewareManagerRegis"></param> /// <param name="employee"></param> /// <param name="company"></param> /// <returns></returns> private async Task <EmployeeIdentityRegistration> createEmployeeIdentityRegistration(MiddlewareManager <EmployeeIdentityRegistration> middlewareManagerRegis, Employee employee, Guid company) { var currentProcess = await middlewareManagerRegis.FindByExpressionAsync(p => p.EmployeeID == employee.ID && p.Email == employee.Email && p.EmployeeIdentityRegistrationStatus != EmployeeIdentityRegistrationStatus.Completed, company); List <EmployeeIdentityRegistration> lstToCreate = null; //No debe de existir un registro pendiente //Paso 1. Crear el registro if (!currentProcess.Any()) { lstToCreate = new List <EmployeeIdentityRegistration>() { new EmployeeIdentityRegistration() { Active = true, CreationDate = DateTime.UtcNow, DeleteDate = null, Description = "", Email = employee.Email, EmployeeID = employee.ID, ID = Guid.NewGuid(), EmployeeIdentityRegistrationStatus = EmployeeIdentityRegistrationStatus.MailSent, ActivationCode = CodeGenerator.GetRandomCode(8), IdentityUserID = null, Name = "", StatusID = 1, Timestamp = DateTime.UtcNow } }; await middlewareManagerRegis.CreateAsync(lstToCreate, company); } else { //El registro ya se relacionó correctamente lstToCreate = currentProcess; } return(lstToCreate.FirstOrDefault()); }
public async Task UpdateAmountAsync(UpdateAmountConceptDetailParams parameters) { Guid OverdraftDetailID = parameters.OverdraftDetailID; Decimal Amount = parameters.Amount; List <ConceptRelationUpdateAmountDTO> ConceptRelationsAmountApplied = parameters.ConceptRelationsAmountApplied; Guid identityWorkID = parameters.IdentityWorkID; Guid instanceID = parameters.InstanceID; var ids = ConceptRelationsAmountApplied.Select(x => x.ID); var relationDetailDB = _mgrEmployeeConceptsRelationDetail.FindByExpressionAsync(x => ids.Contains(x.ID) && x.InstanceID == instanceID, identityWorkID); var overdraftdetailDB = _clientOverdraftDetail.FindByExpressionAsync(x => x.ID == OverdraftDetailID && x.InstanceID == instanceID, identityWorkID); var details = (await relationDetailDB); details.ForEach(item => { item.AmountApplied = ConceptRelationsAmountApplied.FirstOrDefault(x => x.ID == item.ID) != null ? ConceptRelationsAmountApplied.FirstOrDefault(x => x.ID == item.ID).AmountApplied : 0; item.IsAmountAppliedCapturedByUser = ConceptRelationsAmountApplied.FirstOrDefault(x => x.ID == item.ID) != null ? ConceptRelationsAmountApplied.FirstOrDefault(x => x.ID == item.ID).IsAmountAppliedCapturedByUser : false; }); var overDetails = (await overdraftdetailDB); overDetails.ForEach(item => { item.Amount = Amount; item.IsTotalAmountCapturedByUser = details.Any(x => x.IsAmountAppliedCapturedByUser); }); using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { await _mgrEmployeeConceptsRelationDetail.UpdateAsync(details, identityWorkID); await _clientOverdraftDetail.UpdateAsync(overDetails, identityWorkID); scope.Complete(); } }
/// <summary> /// Generates the settlement letter indicates writer. /// </summary> /// <param name="activeOverdraft">The active overdraft.</param> /// <param name="identityWorkID">The identity work identifier.</param> /// <param name="instanceID">The instance identifier.</param> /// <param name="writer">The writer.</param> /// <returns></returns> public async Task <string> GenerateSettlementLetter(List <Overdraft> activeOverdrafts, Guid identityWorkID, Guid instanceID, string token, IMSSpreadsheetWriter writer) { var instanceMgr = new InstanceManager(); var instance = await instanceMgr.GetByIDAsync(token, instanceID); var payrrollCompanyConfigurationMgr = new MiddlewareManager <PayrollCompanyConfiguration>( new BaseRecordManager <PayrollCompanyConfiguration>(), new PayrollCompanyConfigurationValidator()); var address = (await payrrollCompanyConfigurationMgr.FindByExpressionAsync(x => x.InstanceID == instanceID, identityWorkID, new string[] { "Address" })).FirstOrDefault().Address; var fullAddress = string.Empty; if (address != null) { fullAddress = $" {address.Street}, {address.ZipCode}, {address.Municipality}, {address.FederalEntity}"; } var overdraftManager = new OverdraftManager(); OverdraftTotalsResult totals = new OverdraftTotalsResult(); activeOverdrafts.ForEach(activeOverdraft => { var totalSalaryPayments = activeOverdraft.OverdraftDetails.Where(p => p.ConceptPayment.ConceptType == ConceptType.SalaryPayment && p.ConceptPayment.Print && !p.ConceptPayment.Kind). Select(y => y.Amount).Sum(); var totalDeductionPayments = activeOverdraft.OverdraftDetails.Where(p => p.ConceptPayment.ConceptType == ConceptType.DeductionPayment && p.ConceptPayment.Print && !p.ConceptPayment.Kind). Select(y => y.Amount).Sum(); totals.TotalSalaryPayments += Math.Round(totalSalaryPayments, 2); totals.TotalDeductionPayments += Math.Round(totalDeductionPayments, 2); totals.Total += Math.Round(totals.TotalSalaryPayments - totals.TotalDeductionPayments, 2); }); string header = $"Recibí de la empresa {instance.Name} con domicilio en \n" + $"{fullAddress} " + $"la cantidad de: \n"; string header2 = " por concepto de mi finiquito con motivo de la terminación\n" + "de mi relación laboral con la empresa con fecha indicada en el documento, cantidad \n" + "que resulta de los siguientes conceptos:"; string footer = "Así mismo manifiesto que hasta el momento en que se da por terminada la relación laboral\n" + "no se me adeuda ninguna cantidad de dinero por concepto de salarios devengados,\n" + "diferencia de los mismos, participacion de utilidades, comisiones, horas extras, \n" + "vacaciones, septimos días, días festivos, prima dominical, vacacional y de antigüedad\n" + "y demás prestaciones que otorga la Ley Federal Del Trabajo, ya que las mismas siempre\n" + "me fueron íntegramente cubiertas en los términos de la ley. También hago constar para\n" + "todos los efectos legales conducentes, que durante la vigencia de mi relación\n" + "obrero-patronal no fui objeto de riesgo profesional alguno, motivo por el cual libero\n" + "a mi patron de toda responsabilidad laboral y de seguridad\n" + "social o de cualquier otro concpeto derivado del contrato de trabajo."; string date = DateTime.Now.ToString("MM/dd/yyyy"); var newHeader = ConcatenateHeader(header, header2, totals); var filename = "CartaFiniquito - " + activeOverdrafts.FirstOrDefault().Employee.FullName + ".xlsx"; IWorkbook wb = GenerateSettlementLetter(activeOverdrafts, newHeader, footer, date, activeOverdrafts.FirstOrDefault().Employee.FullName, totals); var url = await WriteSettlementLetterAsync(instanceID, filename, wb, writer); return(url); }
public async Task <CancelPayrollStampingResult> CancelPayrollStampingAsync(CancelPayrollStampingParams cancelPayrollStampingParams) { //Create cancelation instance ICancelStamping cancelStamping = CancelStampingFactory.CreateInstance(cancelPayrollStampingParams.FiscalStampingVersion); //Get overdrafts and validate var overdraftMiddlewareManager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); var overdraftsIds = cancelPayrollStampingParams.OverdraftIDs; var overdraftsToCancel = await overdraftMiddlewareManager.FindByExpressionAsync(p => p.company == cancelPayrollStampingParams.IdentityWorkID && p.InstanceID == cancelPayrollStampingParams.InstanceID && overdraftsIds.Contains(p.ID) && p.OverdraftStatus == OverdraftStatus.Stamped && p.Active, cancelPayrollStampingParams.IdentityWorkID); if (!overdraftsToCancel.Any()) { throw new CotorraException(106, "106", "No existen recibos a cancelar con los datos proporcionados.", null); } //Get configuration company var payrollMiddlewareManager = new MiddlewareManager <PayrollCompanyConfiguration>(new BaseRecordManager <PayrollCompanyConfiguration>(), new PayrollCompanyConfigurationValidator()); var payrollCompanyConfiguration = await payrollMiddlewareManager.FindByExpressionAsync(p => p.InstanceID == cancelPayrollStampingParams.InstanceID, cancelPayrollStampingParams.IdentityWorkID, new string[] { "Address" }); if (!payrollCompanyConfiguration.Any()) { throw new CotorraException(106, "106", "No existe configuración de la compañia.", null); } //Get configuration company var fiscalInformationManager = new MiddlewareManager <EmployerFiscalInformation>(new BaseRecordManager <EmployerFiscalInformation>(), new EmployerFiscalInformationValidator()); var employerFiscalInformations = await fiscalInformationManager.FindByExpressionAsync(p => p.InstanceID == cancelPayrollStampingParams.InstanceID, cancelPayrollStampingParams.IdentityWorkID); if (!employerFiscalInformations.Any()) { throw new CotorraException(106, "106", "No hay certificados válidos registrados para la compañia.", null); } //Zipcode Manager IEnumerable <string> zipCodesToFind = payrollCompanyConfiguration.Select(p => p.Address?.ZipCode); var zipCodeMiddlewareManager = new MiddlewareManager <catCFDI_CodigoPostal>( new BaseRecordManager <catCFDI_CodigoPostal>(), new catCFDI_CodigoPostalValidator()); var zipCodes = await zipCodeMiddlewareManager.FindByExpressionAsync(p => zipCodesToFind.Contains(p.c_CodigoPostal) , cancelPayrollStampingParams.IdentityWorkID); if (!zipCodes.Any()) { throw new CotorraException(106, "106", "No hay codigo postal registrado para la compañia.", null); } //UUIDs to Cancel var uuids = overdraftsToCancel.Select(p => p.UUID).ToList(); //3. Sign XML var certificateCER = employerFiscalInformations.FirstOrDefault().CertificateCER; var certificateKey = employerFiscalInformations.FirstOrDefault().CertificateKEY; var certPassword = employerFiscalInformations.FirstOrDefault().CertificatePwd; //Decrypt and get certificate (var certificatebytesCER, var certificatebytesKEY, var certPasswordResult) = Crypto(cancelPayrollStampingParams, certificateCER, certificateKey, certPassword); //Cancel Document Details var cancelDocumentParamsDetails = new List <CancelDocumentParamsDetail>(); uuids.ForEach(p => { var cancelDetail = new CancelDocumentParamsDetail(); cancelDetail.OverdraftID = overdraftsToCancel.FirstOrDefault(q => q.UUID == p).ID; cancelDetail.UUID = p; cancelDocumentParamsDetails.Add(cancelDetail); }); CancelDocumentParams cancelDocumentParams = new CancelDocumentParams() { ZipCodes = zipCodes, IssuerZipCode = payrollCompanyConfiguration.FirstOrDefault().Address?.ZipCode, IssuerRFC = payrollCompanyConfiguration.FirstOrDefault().RFC, CertificateCER = certificatebytesCER, CertificateKey = certificatebytesKEY, Password = certPasswordResult, IdentityWorkID = cancelPayrollStampingParams.IdentityWorkID, InstanceID = cancelPayrollStampingParams.InstanceID, user = cancelPayrollStampingParams.user, CancelDocumentParamsDetails = cancelDocumentParamsDetails }; //cancel cfdi document var result = await cancelStamping.CancelDocumetAsync(cancelDocumentParams); if (result.WithErrors) { throw new CotorraException(107, "107", $"Error al cancelar el recibo: {result.Message}", null); } //Fill Save Cancelation Object var cancelationRequestXMLID = Guid.NewGuid(); var cancelationResponseXMLID = Guid.NewGuid(); var cancelSPFiscalParams = new List <CancelationStoreProcedureParams>(); result.CancelPayrollStampingResultDetails.ForEach(p => { var cancelationStoreProcedure = new CancelationStoreProcedureParams(); cancelationStoreProcedure.OverdraftID = overdraftsToCancel.FirstOrDefault(q => q.UUID == p.UUID).ID; cancelationStoreProcedure.CancelationFiscalDocumentStatus = p.PayrollStampingResultStatus == PayrollStampingResultStatus.Success ? CancelationFiscalDocumentStatus.Done : CancelationFiscalDocumentStatus.ErrorInRequest; cancelSPFiscalParams.Add(cancelationStoreProcedure); }); //Database await saveCancelFiscalStamping(cancelPayrollStampingParams, cancelationRequestXMLID, cancelationResponseXMLID, cancelSPFiscalParams); //Save XML of cancelation in blob (request) var blobStorageUtil = new BlobStorageUtil(cancelDocumentParams.InstanceID); await blobStorageUtil.InitializeAsync(); await blobStorageUtil.UploadDocumentAsync($"{cancelationRequestXMLID}.xml", result.CancelacionXMLRequest); //Save XML of cancelation acknowledgement in blob (response) await blobStorageUtil.InitializeAsync(); await blobStorageUtil.UploadDocumentAsync($"{cancelationResponseXMLID}.xml", result.CancelacionXMLAcknowledgeResponse); return(result); }
public async Task <List <Vacation> > BreakAsync(Vacation vacation, Guid identityWorkID, Guid instanceID, HolidayPaymentConfiguration config) { var initialVacationDate = vacation.InitialDate; var finalVacationDate = vacation.FinalDate; List <Vacation> result = new List <Vacation>(); MiddlewareManager <PeriodType> middlewareManager = new MiddlewareManager <PeriodType>(new BaseRecordManager <PeriodType>(), new PeriodTypeValidator()); MiddlewareManager <Employee> employeeMiddlewareManager = new MiddlewareManager <Employee>(new BaseRecordManager <Employee>(), new EmployeeValidator()); var employee = (await employeeMiddlewareManager.FindByExpressionAsync(p => p.ID == vacation.EmployeeID && p.Active == true && p.InstanceID == instanceID, identityWorkID, new string[] { "PeriodType", "PeriodType.Periods", "PeriodType.Periods.PeriodDetails" })).FirstOrDefault(); var periodTypes = employee.PeriodType; if (periodTypes != null) { var allDetails = periodTypes.Periods.SelectMany(x => x.PeriodDetails).ToList(); var periodDetails = allDetails.Where(p => (initialVacationDate >= p.InitialDate && initialVacationDate <= p.FinalDate) || (finalVacationDate >= p.FinalDate && p.InitialDate >= initialVacationDate) || finalVacationDate >= p.InitialDate && finalVacationDate <= p.FinalDate).OrderBy("InitialDate").ToList(); var totalCards = periodDetails.Count(); if (totalCards == 1) { result.Add(vacation); return(result); } int index = 0; periodDetails.ForEach(periodDetail => { Vacation clonedVacation = (Vacation)vacation.Clone(); clonedVacation.ID = Guid.NewGuid(); if (index == 0) { if (periodDetail.InitialDate != initialVacationDate) { clonedVacation.InitialDate = initialVacationDate; } else { clonedVacation.InitialDate = periodDetail.InitialDate; } clonedVacation.FinalDate = periodDetail.FinalDate; } else if (index == totalCards - 1) { if (periodDetail.FinalDate != finalVacationDate) { clonedVacation.FinalDate = finalVacationDate; } else { clonedVacation.FinalDate = periodDetail.FinalDate; } clonedVacation.InitialDate = periodDetail.InitialDate; } else { clonedVacation.InitialDate = periodDetail.InitialDate; clonedVacation.FinalDate = periodDetail.FinalDate; } index++; result.Add(clonedVacation); SetDaysOffAndVacationDays(clonedVacation, vacation, config); }); return(result); } return(result); }
public async Task <PayrollStampingResult> PayrollIndividualStampingAsync(PayrollIndividualStampingParams payrollIndividualStampingParams) { //Obtiene todos los historic overdrafts del periodo seleccionado var historicOverdraftManager = new MiddlewareManager <Overdraft>(new BaseRecordManager <Overdraft>(), new OverdraftValidator()); var incidentsManager = new MiddlewareManager <Incident>(new BaseRecordManager <Incident>(), new IncidentValidator()); var inhabilitiesManager = new MiddlewareManager <Inhability>( new BaseRecordManager <Inhability>(), new InhabilityValidator()); var historicOverdraftsToStamp = await historicOverdraftManager.FindByExpressionAsync(p => p.company == payrollIndividualStampingParams.IdentityWorkID && p.InstanceID == payrollIndividualStampingParams.InstanceID && p.PeriodDetailID == payrollIndividualStampingParams.PeriodDetailID && p.ID == payrollIndividualStampingParams.OverdraftID && p.OverdraftStatus == OverdraftStatus.Authorized && p.Active, payrollIndividualStampingParams.IdentityWorkID, new string[] { "OverdraftPreviousCancelRelationship", "OverdraftDetails", "OverdraftDetails.ConceptPayment", "PeriodDetail", "PeriodDetail.Period", "HistoricEmployee", "HistoricEmployee.Employee", "HistoricEmployee.Employee.Workshift", "HistoricEmployee.Employee.EmployerRegistration" }); var incidents = await incidentsManager.FindByExpressionAsync(p => p.PeriodDetailID == payrollIndividualStampingParams.PeriodDetailID && p.InstanceID == payrollIndividualStampingParams.InstanceID, payrollIndividualStampingParams.IdentityWorkID, new string[] { "IncidentType" }); var initialDate = historicOverdraftsToStamp.FirstOrDefault().PeriodDetail.InitialDate; var finalDate = historicOverdraftsToStamp.FirstOrDefault().PeriodDetail.FinalDate; //Incapacidades dentro del periodo var inhabilities = await inhabilitiesManager.FindByExpressionAsync(p => p.InstanceID == payrollIndividualStampingParams.InstanceID && ( (p.InitialDate >= initialDate && p.InitialDate.AddDays(p.AuthorizedDays - 1) <= finalDate) || (p.InitialDate >= initialDate && p.InitialDate.AddDays(p.AuthorizedDays - 1) > finalDate) || (p.InitialDate < initialDate && p.InitialDate.AddDays(p.AuthorizedDays - 1) <= finalDate) || (p.InitialDate <initialDate && p.InitialDate.AddDays(p.AuthorizedDays - 1)> finalDate) ), payrollIndividualStampingParams.IdentityWorkID); //Obtiene la información fiscal del patrón, certificados var employerFiscalInformationManager = new MiddlewareManager <EmployerFiscalInformation>(new BaseRecordManager <EmployerFiscalInformation>(), new EmployerFiscalInformationValidator()); var employerFiscalInformations = await employerFiscalInformationManager.FindByExpressionAsync(p => p.company == payrollIndividualStampingParams.IdentityWorkID && p.InstanceID == payrollIndividualStampingParams.InstanceID, payrollIndividualStampingParams.IdentityWorkID); if (!employerFiscalInformations.Any()) { throw new CotorraException(105, "105", "No se han configurado los certificados (CSD) de la empresa para poder timbrar. Ve al menú Catálogos -> Certificados -> Agregar nuevo", null); } //Obtiene la configuración general de la empresa var payrollCompanyConfigurationManager = new MiddlewareManager <PayrollCompanyConfiguration>(new BaseRecordManager <PayrollCompanyConfiguration>(), new PayrollCompanyConfigurationValidator()); var payrollConfigurations = await payrollCompanyConfigurationManager.FindByExpressionAsync(p => p.company == payrollIndividualStampingParams.IdentityWorkID && p.InstanceID == payrollIndividualStampingParams.InstanceID, payrollIndividualStampingParams.IdentityWorkID, new string[] { "Address" }); if (!historicOverdraftsToStamp.Any()) { throw new CotorraException(101, "101", "No hay ningún sobrerecibo a timbrar en estatus autorizado, con los parámetros proporcionados.", null); } var payrollStampingParams = _mapper.Map <PayrollIndividualStampingParams, PayrollStampingParams>(payrollIndividualStampingParams); return(await payrollStampingCoreAsync(payrollStampingParams, historicOverdraftsToStamp, incidents, inhabilities, employerFiscalInformations, payrollConfigurations)); }
private async Task <PayrollStampingResult> payrollStampingCoreAsync(PayrollStampingParams payrollStampingParams, List <Overdraft> historicOverdraftsToStamp, List <Incident> incidents, List <Inhability> inhabilities, List <EmployerFiscalInformation> employerFiscalInformations, List <PayrollCompanyConfiguration> payrollConfigurations) { var payrollStampingResult = new PayrollStampingResult(); List <string> zipCodesToFind = historicOverdraftsToStamp.Select(p => p.HistoricEmployee.EmployerRegistrationZipCode).ToList(); zipCodesToFind.AddRange(payrollConfigurations.Select(p => p.Address?.ZipCode)); //Obtener los zipCodes var zipCodeMiddlewareManager = new MiddlewareManager <catCFDI_CodigoPostal>( new BaseRecordManager <catCFDI_CodigoPostal>(), new catCFDI_CodigoPostalValidator()); var zipCodes = await zipCodeMiddlewareManager.FindByExpressionAsync(p => zipCodesToFind.Contains(p.c_CodigoPostal) , payrollStampingParams.IdentityWorkID); //Round for currency var roundUtil = new RoundUtil(payrollStampingParams.Currency.ToString()); //Zip Code manager var zipCodeManager = new ZipCodeManager(zipCodes); //Blob Storage Util var blobStorageUtil = new BlobStorageUtil(payrollStampingParams.InstanceID); await blobStorageUtil.InitializeAsync(); ISendMailProvider sendMailProvider = FactoryMailProvider.CreateInstance(SendMailProvider.SendGrid); var tasks = new List <Task <List <PayrollStampingResultDetail> > >(); foreach (var overdraftToStamp in historicOverdraftsToStamp) { tasks.Add(doWorkAsync(overdraftToStamp, roundUtil, zipCodeManager, payrollStampingParams, blobStorageUtil, sendMailProvider, incidents, inhabilities, employerFiscalInformations, payrollConfigurations)); } ConcurrentBag <PayrollStampingResultDetail> payrollStampingDetails = new ConcurrentBag <PayrollStampingResultDetail>(); foreach (var task in await Task.WhenAll(tasks)) { foreach (var insideTask in task) { payrollStampingDetails.Add(insideTask); } } payrollStampingResult.PayrollStampingResultDetails = payrollStampingDetails.ToList(); //Update DB indicate that Overdraft was stamped correctly / PeriodDetail await saveOverdraftStampedAsync(payrollStampingParams, payrollStampingResult); //Errors preparation if (payrollStampingResult.PayrollStampingResultDetails.Any(p => p.PayrollStampingResultStatus == PayrollStampingResultStatus.Fail)) { var errorMessages = payrollStampingResult.PayrollStampingResultDetails.Select(p => p.Message); throw new CotorraException(109, "109", string.Join("\n", errorMessages), null); } return(payrollStampingResult); }