/// <summary> /// Get all files for the transaction type and import date. /// </summary> /// <param name="type">trasnaction type</param> /// <param name="reportDate">import date</param> /// <returns>the list of files</returns> public NameValueCollection GetFileList(FtpTransactionType type, DateTime reportDate) { var fileList = new NameValueCollection(); try { var folderUrl = string.Empty; if (type == FtpTransactionType.Completed) { folderUrl = AirbnbFtpConfig.CompletedFtpUrl + "/" + reportDate.ToString("MMMM d yyyy"); } else if (type == FtpTransactionType.Future) { folderUrl = AirbnbFtpConfig.FutureFtpUrl + "/Future Transactions - " + reportDate.ToString("MMMM d yyyy"); } else { folderUrl = AirbnbFtpConfig.GrossEarningsFtpUrl + "/" + reportDate.ToString("MMMM d yyyy"); } string ftpUrl = folderUrl; if (!folderUrl.StartsWith("ftp://")) { ftpUrl = Path.Combine(_FtpServerUrl, folderUrl); } var files = GetDataList(ftpUrl); //Loop through the resulting file names. foreach (var fileName in files) { if (Path.HasExtension(fileName)) { fileList.Add(fileName, ftpUrl + "/" + fileName); } } } catch { // no file available } return(fileList); }
public ActionResult ImportAirbnb(AirbnbImportFormModel form) { if (!AuthorizationProvider.IsDataImporter()) { return(Forbidden()); } try { List <ImportFile> completedTransactionFiles = JsonConvert.DeserializeObject <List <ImportFile> >(form.CompletedTransactionFiles); List <ImportFile> futureTransactionFiles = JsonConvert.DeserializeObject <List <ImportFile> >(form.FutureTransactionFiles); List <ImportFile> grossTransactionFiles = JsonConvert.DeserializeObject <List <ImportFile> >(form.GrossTransactionFiles); FtpTransactionType FileTransactionType = form.TransactionFileType; ProcessResult result = new ProcessResult(); if (FileTransactionType == FtpTransactionType.Completed) { result = ImportAirbnbTrasactions(completedTransactionFiles, form.ReportDate, FileTransactionType); } else if (FileTransactionType == FtpTransactionType.Future) { result = ImportAirbnbTrasactions(futureTransactionFiles, form.ReportDate, FileTransactionType); } else if (FileTransactionType == FtpTransactionType.Gross) { result = ImportAirbnbTrasactions(grossTransactionFiles, form.ReportDate, FileTransactionType); } else if (FileTransactionType == FtpTransactionType.LogMissingTransactions) { var logDate = new DateTime(2017, 12, 30); result = LogMissingAirbnbTrasactions(completedTransactionFiles, logDate, FileTransactionType); } return(Json(result, JsonRequestBehavior.AllowGet)); } catch (Exception ex) { ProcessResult result = new ProcessResult(); result.Count = -1; result.Message = ex.Message; return(Json(-1, JsonRequestBehavior.AllowGet)); } }
public JsonResult GetImportFileList(DateTime reportDate, FtpTransactionType reportType) { List <SelectListItem> fileList = new List <SelectListItem>(); try { var fptService = new AirbnbFtpService(); NameValueCollection urlList; if (reportType == FtpTransactionType.Completed) { urlList = fptService.GetFileList(FtpTransactionType.Completed, reportDate); } else if (reportType == FtpTransactionType.Future) { urlList = fptService.GetFileList(FtpTransactionType.Future, reportDate); } else { urlList = fptService.GetFileList(FtpTransactionType.Gross, reportDate); } // map NameValueCollection to SelectListItem foreach (var key in urlList.AllKeys) { fileList.Add(new SelectListItem { Text = key, Value = key + ";" + urlList[key] // js uses this format to parse out the filename and url }); } return(Json(fileList, JsonRequestBehavior.AllowGet)); } catch (Exception ex) { DojoLogger.Error(ex.Message, typeof(OwnerPayoutController)); Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; // code = 500 return(Json(fileList, JsonRequestBehavior.AllowGet)); } }
private ProcessResult LogMissingAirbnbTrasactions(List <ImportFile> importFiles, DateTime logDate, FtpTransactionType fileTransactionType) { var result = new ProcessResult(); string localFile = string.Empty; try { // speed up bulk insertion _dbContext.Configuration.AutoDetectChangesEnabled = false; _dbContext.Configuration.ValidateOnSaveEnabled = false; string tempFolder = GetDownloadFolder(); var ftpService = new AirbnbFtpService(); var importService = new AirbnbImportService(); var payoutProvider = new OwnerPayoutService(_dbContext); foreach (var importFile in importFiles) { result.Count++; // download file from ftp site string csvFileUrl = importFile.Id; localFile = Path.Combine(tempFolder, importFile.Name); ftpService.Download(csvFileUrl, localFile); //DojoLogger.Info(string.Format("Download file {0} completed.", localFile)); // process only those data that is later than the most recent imported payout date in db DateTime?startPayoutDate = payoutProvider.GetMostRecentPayoutDate(importFile.Name); var count = importService.LogMissingCompletedAirbnbTransactions( localFile, logDate.ToString("yyyy-MM-dd"), startPayoutDate); if (count == -1) { result.Skip++; } else { result.Bad += count; } importService.DeleteFileIfAllowed(localFile); } } catch (Exception ex) { DojoLogger.Error(string.Format("Import file {0} fails. Exception: {1}", localFile, ex.Message)); // fall through } result.Good = result.Count - result.Bad - result.Skip; return(result); }
private ProcessResult ImportAirbnbTrasactions(List <ImportFile> importFiles, DateTime importDate, FtpTransactionType fileTransactionType) { var result = new ProcessResult(); string localFile = string.Empty; try { // speed up bulk insertion _dbContext.Configuration.AutoDetectChangesEnabled = false; _dbContext.Configuration.ValidateOnSaveEnabled = false; string tempFolder = GetDownloadFolder(); var ftpService = new AirbnbFtpService(); var importService = new AirbnbImportService(); DojoLogger.Info(string.Format("Temporary download folder is {0} for {1} files from FTP server.", tempFolder, importFiles.Count.ToString())); if (fileTransactionType == FtpTransactionType.Completed) { var payoutProvider = new OwnerPayoutService(_dbContext); foreach (var importFile in importFiles) { result.Count++; // download file from ftp site string csvFileUrl = importFile.Id; localFile = Path.Combine(tempFolder, importFile.Name); ftpService.Download(csvFileUrl, localFile); //DojoLogger.Info(string.Format("Download file {0} completed.", localFile)); // process only those data that is later than the most recent imported payout date in db DateTime?startPayoutDate = payoutProvider.GetMostRecentPayoutDate(importFile.Name); var count = importService.ImportCompletedAirbnbTransactions( localFile, importDate.ToString("yyyy-MM-dd"), startPayoutDate); if (count == -1) { result.Skip++; } else { result.Bad += count; } importService.DeleteFileIfAllowed(localFile); } } else if (fileTransactionType == FtpTransactionType.Future) { var reservationProvider = new ReservationService(_dbContext); string mostRecentDateString = reservationProvider.GetMostRecentFutureDate(); foreach (var importFile in importFiles) { result.Count++; //string sortableDate = importService.ParseDateFromTransactionFileUrl(importFile.Id); //if (string.Compare(sortableDate, mostRecentDateString) > 0) //{ // download file from ftp site string csvFileUrl = importFile.Id; localFile = Path.Combine(tempFolder, importFile.Name); ftpService.Download(csvFileUrl, localFile); var count = importService.ImportFutureAirbnbTransactions(localFile, importDate.ToString("yyyy-MM-dd")); if (count == -1) { result.Skip++; } else { result.Bad += count; } importService.DeleteFileIfAllowed(localFile); //} //else // result.Skip++; } } else { var reservationProvider = new ReservationService(_dbContext); string mostRecentDateString = reservationProvider.GetMostRecentGrossDate(); foreach (var importFile in importFiles) { result.Count++; //string sortableDate = importService.ParseDateFromTransactionFileUrl(importFile.Id); //if (string.Compare(sortableDate, mostRecentDateString) > 0) //{ // download file from ftp site string csvFileUrl = importFile.Id; localFile = Path.Combine(tempFolder, importFile.Name); ftpService.Download(csvFileUrl, localFile); var count = importService.ImportGrossEarningTransactions(localFile, importDate.ToString("yyyy-MM-dd")); if (count == -1) { result.Skip++; } else { result.Bad += count; } importService.DeleteFileIfAllowed(localFile); } } } catch (Exception ex) { DojoLogger.Error(string.Format("Import file {0} fails. Exception: {1}", localFile, ex.Message)); // fall through } result.Good = result.Count - result.Bad - result.Skip; return(result); }