private DataTable GetRecordsFromTextFile(string file, string txtFilename, DataTable dtRawDataTable) { DataTable tempTable = new DataTable(); tempTable = _pipeDelimitedReportHelper.Read(file, ","); if (IsColumnNameValid(tempTable, file, txtFilename)) { DataColumn dc = new DataColumn(); dc.ColumnName = "FileName"; dc.DefaultValue = txtFilename; tempTable.Columns.Add(dc); dc = new DataColumn(); dc.ColumnName = "IsParse"; dc.DataType = System.Type.GetType("System.Boolean"); dc.DefaultValue = false; tempTable.Columns.Add(dc); if (tempTable.Rows.Count() > 0) { dtRawDataTable.Merge(tempTable); MovedParsedFile(file); _loggerForClient.Info("Total " + tempTable.Rows.Count() + " records found from text file " + txtFilename); } else { MovedParsedFile(file); _loggerForClient.Info("There is no records found from text file " + txtFilename); } } return(dtRawDataTable); }
public void PollForOutboundCareCoding() { var outboundUploads = _outboundUploadRepository.GetAllUploadedFilesByType((long)OutboundUploadType.CareCodingOutbound); if (outboundUploads == null || !outboundUploads.Any()) { _logger.Info("No new files uploaded."); return; } var accountIds = _accountIds.Split(','); foreach (var accountId in accountIds) { var account = _corporateAccountRepository.GetById(Convert.ToInt32(accountId)); var fileLocation = _mediaRepository.GetOutboundUploadMediaFileLocation(account.FolderName, "CareCoding"); var archivedFileLocation = _mediaRepository.GetOutboundUploadMediaFileLocation(account.FolderName, "CareCodingArchived"); foreach (var outboundUpload in outboundUploads) { try { outboundUpload.StatusId = (long)OutboundUploadStatus.Parsing; outboundUpload.ParseStartTime = DateTime.Now; _outboundUploadRepository.Save(outboundUpload); var file = _fileRepository.GetById(outboundUpload.FileId); _logger.Info("Importing File : " + file.Path); DataTable table = _pipeDelimitedReportHelper.Read(fileLocation.PhysicalPath + file.Path); if (table.Rows.Count <= 0) { _logger.Info("No rows found."); outboundUpload.ParseEndTime = DateTime.Now; outboundUpload.StatusId = (long)OutboundUploadStatus.Parsed; _outboundUploadRepository.Save(outboundUpload); continue; } var csvStringBuilder = new StringBuilder(); csvStringBuilder.Append(LogHeader + Environment.NewLine); var successRows = 0; foreach (DataRow row in table.Rows) { var model = GetCareCodingOutboundModel(row); var errorRow = model.TenantId + "|" + model.ClientId + "|" + model.CampaignId + "|" + model.IndividualIdNumber + "|" + model.ContractNumber + "|" + model.ContractPersonNumber + "|" + model.ConsumerId; try { var chaseOutbound = _chaseOutboundRepository.GetByIndividualIdNumber(model.IndividualIdNumber, model.ConsumerId); if (chaseOutbound == null) { csvStringBuilder.Append(errorRow + "|" + "Could not find a Customer with Individual_Id_Number : " + model.IndividualIdNumber + " and Consumer_Id : " + model.ConsumerId); continue; } /*var existingCareCoding = _careCodingOutboundRepository.GetByCustomerId(chaseOutbound.CustomerId);*/ var careCodingOutbound = _careCodingOutboundFactory.Create(model); careCodingOutbound.CustomerId = chaseOutbound.CustomerId; if (!string.IsNullOrEmpty(model.MedicalCodeServiceDate)) { try { careCodingOutbound.MedicalCodeServiceDate = Convert.ToDateTime(model.MedicalCodeServiceDate); } catch (Exception) { csvStringBuilder.Append(errorRow + "|" + "Medical_Code_Service_Date is not in correct format. Please Provide in DD/MM/YYYY" + Environment.NewLine); continue; } } _careCodingOutboundRepository.Save(careCodingOutbound); successRows++; } catch (Exception ex) { _logger.Error("While Parsing Care Coding"); _logger.Error("Message: " + ex.Message); _logger.Error("Stack Tracke: " + ex.StackTrace); csvStringBuilder.Append(errorRow + "|" + ex.Message + Environment.NewLine); } } if (successRows < table.Rows.Count) { var logFileName = _pipeDelimitedReportHelper.GetReportName(ReportType.Exception); var logFile = SaveLogFile(fileLocation.PhysicalPath + logFileName + ".txt", csvStringBuilder); outboundUpload.LogFileId = logFile.Id; } outboundUpload.SuccessUploadCount = successRows; outboundUpload.FailedUploadCount = table.Rows.Count - successRows; outboundUpload.ParseEndTime = DateTime.Now; outboundUpload.StatusId = successRows > 0 ? (long)OutboundUploadStatus.Parsed : (long)OutboundUploadStatus.ParseFailed; _outboundUploadRepository.Save(outboundUpload); if (successRows > 1) { System.IO.File.Move(fileLocation.PhysicalPath + file.Path, archivedFileLocation.PhysicalPath + file.Path); ((IFileRepository)_fileRepository).MarkasArchived(file.Id); } } catch (Exception ex) { _logger.Error("While Parsing File "); _logger.Error("Message: " + ex.Message); _logger.Error("Stack Tracke: " + ex.StackTrace); outboundUpload.StatusId = (long)OutboundUploadStatus.ParseFailed; _outboundUploadRepository.Save(outboundUpload); } } } }
public void PollForOutboundChase() { var outboundUploads = _outboundUploadRepository.GetAllUploadedFilesByType((long)OutboundUploadType.ChaseOutbound); if (outboundUploads == null || !outboundUploads.Any()) { _logger.Info("No new files uploaded."); return; } var accountIds = _accountIds.Split(','); //var activityTypes = _activityTypeRepository.GetAll(); foreach (var accountId in accountIds) { var account = _corporateAccountRepository.GetById(Convert.ToInt32(accountId)); var fileLocation = _mediaRepository.GetOutboundUploadMediaFileLocation(account.FolderName, "Chase"); var archivedFileLocation = _mediaRepository.GetOutboundUploadMediaFileLocation(account.FolderName, "ChaseArchived"); foreach (var outboundUpload in outboundUploads) { try { var file = GetFile(outboundUpload.FileId); if (!System.IO.File.Exists(fileLocation.PhysicalPath + file.Path)) { _logger.Info("File not found : " + fileLocation.PhysicalPath + file.Path); continue; } _logger.Info("Importing File : " + file.Path); outboundUpload.StatusId = (long)OutboundUploadStatus.Parsing; outboundUpload.ParseStartTime = DateTime.Now; _outboundUploadRepository.Save(outboundUpload); DataTable table = _pipeDelimitedReportHelper.Read(fileLocation.PhysicalPath + file.Path); if (table.Rows.Count <= 0) { _logger.Info("No rows found."); outboundUpload.ParseEndTime = DateTime.Now; outboundUpload.StatusId = (long)OutboundUploadStatus.Parsed; _outboundUploadRepository.Save(outboundUpload); continue; } var csvStringBuilder = new StringBuilder(); csvStringBuilder.Append(LogHeader + Environment.NewLine); var languages = _languageRepository.GetAll(); var labs = _labRepository.GetAll(); var successRows = 0; foreach (DataRow row in table.Rows) { var model = GetChaseOutboundModel(row); var errorRow = model.TenantId + "|" + model.ClientId + "|" + model.CampaignId + "|" + model.IndividualId + "|" + model.ContractNumber + "|" + model.ContractPersonNumber + "|" + model.ConsumerId; try { if (!string.IsNullOrEmpty(model.HomeAddressState)) { try { var state = _stateRepository.GetStatebyCode(model.HomeAddressState) ?? _stateRepository.GetState(model.HomeAddressState); if (state != null) { model.HomeAddressState = state.Name; } else { csvStringBuilder.Append(errorRow + "|" + "Invalid Home_Addr_State" + Environment.NewLine); continue; } } catch (Exception ex) { _logger.Error("Error importing data."); _logger.Error("Message: " + ex.Message + "\nStack Trace; " + ex.StackTrace); csvStringBuilder.Append(errorRow + "|" + ex.Message + Environment.NewLine); continue; } } if (!string.IsNullOrEmpty(model.AddressState)) { try { var state = _stateRepository.GetStatebyCode(model.AddressState) ?? _stateRepository.GetState(model.AddressState); if (state != null) { model.AddressState = state.Name; } else { csvStringBuilder.Append(errorRow + "|" + "Invalid Addr_State" + Environment.NewLine); continue; } } catch (Exception ex) { _logger.Error("Error importing data."); _logger.Error("Message: " + ex.Message + "\nStack Trace; " + ex.StackTrace); csvStringBuilder.Append(errorRow + "|" + ex.Message + Environment.NewLine); continue; } } if (!string.IsNullOrEmpty(model.ProviderOfRecordAddressState)) { try { var state = _stateRepository.GetStatebyCode(model.ProviderOfRecordAddressState) ?? _stateRepository.GetState(model.ProviderOfRecordAddressState); if (state != null) { model.ProviderOfRecordAddressState = state.Name; } else { csvStringBuilder.Append(errorRow + "|" + "Invalid Provider_Addr_State" + Environment.NewLine); continue; } } catch (Exception ex) { _logger.Error("Error importing data."); _logger.Error("Message: " + ex.Message + "\nStack Trace; " + ex.StackTrace); csvStringBuilder.Append(errorRow + "|" + ex.Message + Environment.NewLine); continue; } } var chaseOutbound = _chaseOutboundFactory.Create(model); var corporateCustomerEditModel = _chaseOutboundFactory.CreateCorporateCustomerEditModel(model); var createdBy = _organizationRoleUserRepository.GetOrganizationRoleUser(1); StringBuilder sb = new StringBuilder(); //var activityType = activityTypes.FirstOrDefault(x => x.Alias == corporateCustomerEditModel.Activity); bool isNewCustomer = false; DateTime?dob = null; if (!string.IsNullOrEmpty(corporateCustomerEditModel.Dob)) { try { dob = Convert.ToDateTime(corporateCustomerEditModel.Dob); } catch (Exception ex) { throw new Exception("DOB is not in correct format. Please Provide in MM/DD/YYYY", ex); } } var customer = _customerRepository.GetCustomerForCorporate(corporateCustomerEditModel.FirstName, corporateCustomerEditModel.MiddleName, corporateCustomerEditModel.LastName, corporateCustomerEditModel.Email, PhoneNumber.ToNumber(corporateCustomerEditModel.PhoneHome), PhoneNumber.ToNumber(corporateCustomerEditModel.PhoneCell), dob, account.Tag, sb); var updatedCustomer = _customerRegistrationService.RegisterCorporateCustomer(customer, corporateCustomerEditModel, account.Tag, createdBy, languages, labs, sb, (long)UploadActivityType.BothMailAndCall, null, out isNewCustomer); chaseOutbound.CustomerId = updatedCustomer.CustomerId; var address = new Address(model.AddressLine1, model.AddressLine2, model.AddressCity, model.AddressState, model.AddressZipCode, "USA"); address = _addressService.SaveAfterSanitizing(address); if (address.Id > 0) { _customerRepository.UpdateBillingAddress(updatedCustomer.CustomerId, address.Id); } var customTags = model.CustomTags.Split(','); if (customTags != null && customTags.Any() && updatedCustomer != null) { foreach (var customTag in customTags) { _corporateCustomerCustomTagService.Save(new CorporateCustomerCustomTag { CustomerId = updatedCustomer.CustomerId, IsActive = true, Tag = customTag, DataRecorderMetaData = new DataRecorderMetaData(new OrganizationRoleUser(createdBy.Id), DateTime.Now, null) }); } } if (!string.IsNullOrEmpty(model.RelationshipCode) || !string.IsNullOrEmpty(model.RelationshipDescription)) { var relationship = GetRelationship(model.RelationshipCode, model.RelationshipDescription); chaseOutbound.RelationshipId = relationship.Id; } chaseOutbound = _chaseOutboundRepository.Save(chaseOutbound); // _chaseProductRepository.DeleteByCustomerId(chaseOutbound.CustomerId); if (!string.IsNullOrEmpty(model.ProductLevel1)) { SaveChaseProduct(model.ProductLevel1, 1, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ProductLevel2)) { SaveChaseProduct(model.ProductLevel2, 2, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ProductLevel3)) { SaveChaseProduct(model.ProductLevel3, 3, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ProductLevel4)) { SaveChaseProduct(model.ProductLevel4, 4, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ProductLevel5)) { SaveChaseProduct(model.ProductLevel5, 5, chaseOutbound.CustomerId, chaseOutbound.Id); } // _chaseChannelLevelRepository.DeleteByCustomerId(chaseOutbound.CustomerId); if (!string.IsNullOrEmpty(model.ChannelLevel2)) { SaveChaseChannel(model.ChannelLevel2, 2, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ChannelLevel3)) { SaveChaseChannel(model.ChannelLevel3, 3, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.GroupName) || !string.IsNullOrEmpty(model.GroupNumber) || !string.IsNullOrEmpty(model.GroupDivision)) { var chaseGroup = GetChaseGroup(model.GroupName, model.GroupNumber, model.GroupDivision); chaseOutbound.ChaseGroupId = chaseGroup.Id; } if (string.IsNullOrEmpty(model.CampaignId) || string.IsNullOrEmpty(model.CampaignName)) { _logger.Info("Campaign Id/Name missing. Incomplete Data"); /*csvStringBuilder.Append(errorRow + "|" + "Campaign Id/Name missing. Incomplete Data." + Environment.NewLine); * continue;*/ } else { SaveCampaign(model, chaseOutbound.CustomerId, chaseOutbound.Id); } if (!string.IsNullOrEmpty(model.ForecastedOutreachDate)) { try { chaseOutbound.ForecastedOutreachDate = Convert.ToDateTime(model.ForecastedOutreachDate); } catch (Exception) { csvStringBuilder.Append(errorRow + "|" + "Forecasted_Outreach_Date is not in correct format. Please Provide in MM/DD/YYYY" + Environment.NewLine); continue; } } if (!string.IsNullOrEmpty(model.RecordProcessDate)) { try { chaseOutbound.RecordProcessDate = Convert.ToDateTime(model.RecordProcessDate); } catch (Exception) { csvStringBuilder.Append(errorRow + "|" + "Record_Process_Date is not in correct format. Please Provide in MM/DD/YYYY" + Environment.NewLine); continue; } } successRows++; } catch (Exception ex) { _logger.Error("Error importing data."); _logger.Error("Message: " + ex.Message + "\nStack Trace; " + ex.StackTrace); csvStringBuilder.Append(errorRow + "|" + ex.Message + Environment.NewLine); } } if (successRows < table.Rows.Count) { var logFileName = _pipeDelimitedReportHelper.GetReportName(ReportType.Exception); var logFile = SaveLogFile(fileLocation.PhysicalPath + logFileName + ".txt", csvStringBuilder); outboundUpload.LogFileId = logFile.Id; } outboundUpload.SuccessUploadCount = successRows; outboundUpload.FailedUploadCount = table.Rows.Count - successRows; outboundUpload.ParseEndTime = DateTime.Now; outboundUpload.StatusId = successRows > 0 ? (long)OutboundUploadStatus.Parsed : (long)OutboundUploadStatus.ParseFailed; _outboundUploadRepository.Save(outboundUpload); if (successRows > 1) { System.IO.File.Move(fileLocation.PhysicalPath + file.Path, archivedFileLocation.PhysicalPath + file.Path); ((IFileRepository)_fileRepository).MarkasArchived(file.Id); } } catch (Exception ex) { outboundUpload.StatusId = (long)OutboundUploadStatus.ParseFailed; _outboundUploadRepository.Save(outboundUpload); _logger.Error(string.Format("while Parsing File")); _logger.Error("Ex Message" + ex.Message); _logger.Error("Ex Stack Trace " + ex.StackTrace); } } } }
public void PollForParsePatientDataFromAces() { try { _logger.Info("Entering Parse Patient Data From Aces Polling Agent @:" + DateTime.Now); var sftpFileLocation = _settings.ParsePatientDataSftpPath; var mediaLocation = _mediaRepository.GetParsePatientDataMediaFileLocation(); var archiveFolder = Path.Combine(mediaLocation.PhysicalPath, "Archive", DateTime.Today.ToString("yyyyMMdd")); var failedFolder = Path.Combine(mediaLocation.PhysicalPath, "Failed", DateTime.Today.ToString("yyyyMMdd")); var getFilesFromSftp = DirectoryOperationsHelper.GetFiles(sftpFileLocation, "TCPA_AcesID_HipID*.txt"); if (getFilesFromSftp.IsNullOrEmpty()) { _logger.Info("No files found for parsing."); return; } DirectoryOperationsHelper.CreateDirectoryIfNotExist(archiveFolder); foreach (var file in getFilesFromSftp) { var fileName = Path.GetFileName(file); MoveFile(file, Path.Combine(mediaLocation.PhysicalPath, fileName)); } var filesToParse = DirectoryOperationsHelper.GetFiles(mediaLocation.PhysicalPath, "*.txt"); _logger.Info("Number of files to Parse:" + filesToParse.Count()); const int pageSize = 100; foreach (var file in filesToParse) { try { var fileName = Path.GetFileName(file); var sourceFile = Path.Combine(mediaLocation.PhysicalPath, fileName); var patientData = _pipeDelimitedReportHelper.Read(sourceFile); var recordsInFile = patientData.Rows.Count; if (recordsInFile == 0) { _logger.Info("No record found in " + fileName); MoveFile(sourceFile, Path.Combine(archiveFolder, fileName)); continue; } _logger.Info("Parsing file: " + fileName); _logger.Info("Total number of records to file: " + recordsInFile); var failedRecords = new List <PatientParsedDataViewModel>(); var parsedPatientData = ParsePatientData(patientData.AsEnumerable(), failedRecords); if (parsedPatientData.Any()) { var pageNumber = 1; int totalRecords = parsedPatientData.Count(); var totalPages = (totalRecords / pageSize) + (totalRecords % pageSize != 0 ? 1 : 0); do { var pagedCustomers = parsedPatientData.Skip(pageSize * (pageNumber - 1)).Take(pageSize); var parsedCustomerIds = pagedCustomers.Select(x => x.CustomerId).ToArray(); var customerIds = _customerRepository.CheckCustomerExists(parsedCustomerIds).ToArray(); if (parsedCustomerIds.Count() != customerIds.Count()) { var customerIdNotExist = parsedCustomerIds.Except(customerIds); var failedCustomers = pagedCustomers.Where(x => customerIdNotExist.Contains(x.CustomerId)); failedCustomers.ForEach(x => x.Error = "HIPID does not exist."); failedRecords.AddRange(failedCustomers); pagedCustomers = pagedCustomers.Where(x => customerIds.Contains(x.CustomerId)); } var customerIdsAlreadyHaveAcesId = _customerRepository.CheckCustomerAlreadyHaveAcesId(customerIds); if (customerIdsAlreadyHaveAcesId.Count() != 0) { var customersAlreadyHaveAcesId = pagedCustomers.Where(x => customerIdsAlreadyHaveAcesId.Contains(x.CustomerId)); customersAlreadyHaveAcesId.ForEach(x => x.Error = "Patient already have ACESID."); failedRecords.AddRange(customersAlreadyHaveAcesId); pagedCustomers = pagedCustomers.Where(x => !customerIdsAlreadyHaveAcesId.Contains(x.CustomerId)); } var acesIdAlreadyAssignedToCustomers = _customerRepository.CheckAcesIdAlreadyAssignedToCustomer(pagedCustomers.Select(x => x.AcesId.ToLower()).ToArray()); if (acesIdAlreadyAssignedToCustomers.Count() != 0) { var acesIdAlreadyAssignedCustomers = pagedCustomers.Where(x => acesIdAlreadyAssignedToCustomers.Contains(x.AcesId)); acesIdAlreadyAssignedCustomers.ForEach(x => x.Error = "ACESID already assigned to a patient."); failedRecords.AddRange(acesIdAlreadyAssignedCustomers); pagedCustomers = pagedCustomers.Where(x => !acesIdAlreadyAssignedToCustomers.Contains(x.AcesId.ToLower())); } _logger.Info(string.Format("Number of customer to parse: {0} in page: {1}", pagedCustomers.Count(), pageNumber)); foreach (var customer in pagedCustomers) { try { _logger.Info("Parsing data for CustomerId: " + customer.CustomerId); var customerEligibility = _customerEligibilityRepository.GetByCustomerIdAndYear(customer.CustomerId, DateTime.Today.Year); var customerProfileHistoryId = _customerProfileHistoryRepository.CreateCustomerHistory(customer.CustomerId, orgRoleId, customerEligibility); _eventCustomerRepository.UpdateCustomerProfileIdByCustomerId(customer.CustomerId, customerProfileHistoryId); _customerRepository.UpdateAcesId(customer.CustomerId, customer.AcesId); } catch (Exception ex) { failedRecords.Add(new PatientParsedDataViewModel() { AcesId = customer.AcesId, CustomerId = customer.CustomerId, Error = "Some error occurred while updating." }); _logger.Error(string.Format("Error occurred while updating record for CustomerId: {0}.\nMessage: {1}\n\tStackTrace: {2}", customer.CustomerId, ex.Message, ex.StackTrace)); } } pageNumber++; }while (totalPages >= pageNumber); } CreateFailedPatientFile(fileName, failedFolder, failedRecords); MoveFile(sourceFile, Path.Combine(archiveFolder, fileName)); } catch (Exception ex) { _logger.Error(string.Format("Error occurred while processing the {0}.\nMessage: {1}\n\tStackTrace: {2}", file, ex.Message, ex.StackTrace)); var fileName = Path.GetFileName(file); MoveFile(file, Path.Combine(archiveFolder, fileName)); } } _logger.Info("File parsing completed @ " + DateTime.Now); } catch (Exception ex) { _logger.Error(string.Format("Exception occurred during execution of servcie. \nException Message: {0}\n\tStackTrace:{1}", ex.Message, ex.StackTrace)); return; } }