示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }