private List <TimesheetEntryFragment> GetTimesheetFragmentsForAssets(MongoCursor <BsonDocument> timesheetEntryCursor) { var resultFragments = new List <TimesheetEntryFragment>();; foreach (BsonDocument timesheetEntry in timesheetEntryCursor) { try { TimesheetEntryFragment entryFragment = GetTimesheetFragmentForAsset(timesheetEntry); List <TimesheetEntryFragment> entryFragments = IntegrationHelpers.SplitTimesheetFragmentsToDays(new List <TimesheetEntryFragment> { entryFragment }); IntegrationHelpers.RemoveTooShortFragments(entryFragments, logger, MinTimeFragmentSize); resultFragments.AddRange(entryFragments.ToArray()); succeededExports.Add((ObjectId)timesheetEntry[DBQuery.Id]); } catch (Exception ex) { logger.LogError("Failed to handle timesheet entry (for assets). Skipping this entry", ex, timesheetEntry[DBQuery.Id]); IncreaseExportFailureCount(timesheetEntry, "timesheetentry"); failedExports.Add((ObjectId)timesheetEntry[DBQuery.Id]); } } return(resultFragments); }
/// <summary> /// Get timesheet fragment for asset. Fragment can be returned directly because we always have just one fragment /// and no extra details (overtime etc...). /// </summary> /// <param name="timesheetEntry"></param> /// <returns></returns> private TimesheetEntryFragment GetTimesheetFragmentForAsset(BsonDocument timesheetEntry) { if (!timesheetEntry.Contains("starttimestamp") || !timesheetEntry.Contains("endtimestamp")) { throw new HandlerException("Start or end time missing in asset timesheet entry."); } MongoCollection <BsonDocument> assetsCollection = database.GetCollection("asset"); BsonDocument asset = assetsCollection.FindOne(Query.EQ(DBQuery.Id, timesheetEntry["asset"][0])); MongoCollection <BsonDocument> projectsCollection = database.GetCollection("project"); IMongoQuery query = Query.EQ(DBQuery.Id, timesheetEntry["project"]); BsonDocument project = projectsCollection.FindOne(Query.EQ(DBQuery.Id, (ObjectId)timesheetEntry["project"][0])); if (project == null) { throw new HandlerException("Project not found for asset timesheet entry."); } if (asset == null) { throw new HandlerException("Asset not found for timesheet entry."); } if (!project.Contains("identifier")) { throw new HandlerException("Project is missing an identifier."); } if (!asset.Contains("identifier")) { throw new HandlerException("Asset is missing an identifier."); } if (!asset.Contains("projectcategory")) { throw new HandlerException("Asset is missing category."); } MongoCollection <BsonDocument> projectCategories = database.GetCollection("projectcategory"); BsonDocument projectCategory = projectCategories.FindOne(Query.EQ(DBQuery.Id, asset["projectcategory"][0])); var timesheetEntryWithDetails = new TimesheetEntryWithDetails(); var fragment = new TimesheetEntryFragment(); fragment.Detail = timesheetEntry; fragment.IsRootEntry = true; fragment.ProjectCategoryBase = (string)projectCategory["identifier"]; fragment.ProjectId = (string)project["identifier"]; fragment.Start = ((DateTime)timesheetEntry["starttimestamp"]).ToLocalTime(); fragment.End = ((DateTime)timesheetEntry["endtimestamp"]).ToLocalTime(); fragment.WorkerId = (string)asset["identifier"]; return(fragment); }
private void AddPayType(TimesheetEntryFragment fragment, string payType, double payTypeFactor, bool isPrimary) { var csvLine = new TroToVismaCsvLine(); csvLine.Values[(int)TroToVismaColumns.PersonnelNumber] = fragment.WorkerId; csvLine.Values[(int)TroToVismaColumns.Paytype] = payType; TimeSpan duration = fragment.End - fragment.Start; // Hours + minutes in one value with the accuracy of two decimal spaces. Double hours = Math.Round(((double)duration.Hours + ((double)duration.Minutes) / 60) * payTypeFactor, 2) + ((int)duration.TotalDays * 24); csvLine.Values[(int)TroToVismaColumns.Hours] = Convert.ToString(hours, new CultureInfo("fi-FI")); csvLine.Values[(int)TroToVismaColumns.Days] = "0"; // Amount and sum are only added to the primary pay type. if (fragment.Detail != null && isPrimary) { csvLine.Values[(int)TroToVismaColumns.Amount] = Convert.ToString(fragment.Detail.GetValue("amount", 0)); csvLine.Values[(int)TroToVismaColumns.Euro] = Convert.ToString(fragment.Detail.GetValue("sum", 0), new CultureInfo("fi-FI")); } else { csvLine.Values[(int)TroToVismaColumns.Amount] = "0"; csvLine.Values[(int)TroToVismaColumns.Euro] = "0"; } csvLine.Values[(int)TroToVismaColumns.StartDate] = string.Format("{0:00}.{1:00}.{2:0000}", fragment.Start.Day, fragment.Start.Month, fragment.Start.Year); csvLine.Values[(int)TroToVismaColumns.ProfitCenter] = fragment.WorkerProfitCenter; if (fragment.Detail != null && (bool)fragment.Detail.GetValue("substractlunchbreak", false)) { csvLine.Values[(int)TroToVismaColumns.LunchBreak] = "true"; } else { csvLine.Values[(int)TroToVismaColumns.LunchBreak] = "false"; } rawCsvLines.Add(csvLine); }
private string GetCategoryIdFromTimesheetFragment(TimesheetEntryFragment timesheetEntryFragment) { bool isOvertime50 = false; bool isOvertime100 = false; bool isOvertime150 = false; bool isOvertime200 = false; string category = timesheetEntryFragment.ProjectCategoryBase; // Category is defined explicitly and not built based on different data. bool directCategory = false; if (timesheetEntryFragment.PayType != null) { isOvertime50 = (bool)timesheetEntryFragment.PayType.GetValue("isovertime50", false); isOvertime100 = (bool)timesheetEntryFragment.PayType.GetValue("isovertime100", false); isOvertime150 = (bool)timesheetEntryFragment.PayType.GetValue("isovertime150", false); isOvertime200 = (bool)timesheetEntryFragment.PayType.GetValue("isovertime200", false); if (timesheetEntryFragment.PayType.Contains("projectcategory") && timesheetEntryFragment.PayType["projectcategory"] != string.Empty) { MongoCollection <BsonDocument> projectCategoryCollection = database.GetCollection("projectcategory"); BsonDocument categoryElement = projectCategoryCollection.FindOne(Query.EQ(DBQuery.Id, timesheetEntryFragment.PayType["projectcategory"][0])); if (categoryElement == null) { throw new Exception("Project category for timesheet entry detail does't exist. Category: " + timesheetEntryFragment.PayType["projectcategory"][0]); } category = (string)categoryElement["identifier"]; directCategory = true; } } if (!directCategory) { if (isOvertime50) { category += "-050"; } else if (isOvertime100) { category += "-100"; } else if (isOvertime150) { category += "-150"; } else if (isOvertime200) { category += "-200"; } else { category += "-000"; } if (timesheetEntryFragment.IsTravelTime) { category += "-01"; } else { category += "-00"; } } return(category); }