예제 #1
0
        public ActionResult approveday(string selectedday)
        {
            DateTime day = DateTime.ParseExact(selectedday, "yyyyMMdd", CultureInfo.InvariantCulture);

            day = new DateTime(day.Year, day.Month, day.Day, day.Hour, day.Minute, day.Second, DateTimeKind.Utc);

            var query = new DBQuery("workentries", "unacceptedentrydata");

            query.AddParameter("start", day);
            query.AddParameter("end", day);
            query.AddParameter("user", new ObjectId(Runtime.SessionManager.CurrentUser[DBQuery.Id]));

            DBResponse response = query.Find();

            DBCollection timesheetEntries = response["timesheetentry"];
            DBCollection abseneceEntries  = response["absenceentry"];
            DBCollection dayEntries       = response["dayentry"];
            DBCollection articleEntries   = response["articleentry"];
            DBCollection assetEntries     = response["assetentry"];

            var tasks = new List <Task <DBUpdateResponse> >();

            tasks.Add(ApproveEntriesInCollection(timesheetEntries));
            tasks.Add(ApproveEntriesInCollection(abseneceEntries));
            tasks.Add(ApproveEntriesInCollection(dayEntries));
            tasks.Add(ApproveEntriesInCollection(articleEntries));
            tasks.Add(ApproveEntriesInCollection(assetEntries));

            Task.WaitAll(tasks.ToArray());

            return(new AjaxResult("success"));
        }
예제 #2
0
        internal DataTree GetSuggestedAllocationsForUser(string userId, DateTime dayInitial, int days)
        {
            if (string.IsNullOrEmpty(userId))
            {
                userId = Runtime.SessionManager.CurrentUser[DBQuery.Id];
            }

            // Get all allocation entries
            var allocationEntryQuery = new DBQuery();

            DateTime dayStart = new DateTime(dayInitial.Year, dayInitial.Month, dayInitial.Day);
            DateTime dayEnd;

            // From start of today to start of tomorrow
            dayEnd = dayInitial.AddDays(days);
            dayEnd = new DateTime(dayEnd.Year, dayEnd.Month, dayEnd.Day);

            // StartDate is less than end of the day and end date is more than start of the day
            List <IMongoQuery> dateRangeQueries = new List <IMongoQuery>();

            dateRangeQueries.Add(Query.LT("starttimestamp", new BsonDateTime(dayEnd)));
            dateRangeQueries.Add(Query.GT("endtimestamp", new BsonDateTime(dayStart)));

            List <IMongoQuery> searchQueries = new List <IMongoQuery>();

            searchQueries.Add(Query.And(dateRangeQueries));
            searchQueries.Add(Query.EQ("user", new ObjectId(userId)));

            allocationEntryQuery["allocationentry"][DBQuery.Condition] = Query.And(searchQueries).ToString();
            allocationEntryQuery["allocationentry"][DBQuery.OrderBy]   = "endtimestamp";

            return((DataTree)allocationEntryQuery.Find().FirstCollection);
        }
예제 #3
0
        private bool CheckForUnapprovedEntries(DBDocument allocationEntry)
        {
            logger.LogTrace("Checking whether allocation has unapproved entries");

            bool hasUnapprovedEntries = false;

            var query = new DBQuery("homescreenprojects", "unapprovedentriesforproject");

            query.AddParameter("project", allocationEntry["project"]);
            query.AddParameter("user", allocationEntry["user"]);

            DBResponse response = query.Find();


            if (response["timesheetentry"].Count > 0)
            {
                hasUnapprovedEntries = true;
            }
            else if (response["absenceentry"].Count > 0)
            {
                hasUnapprovedEntries = true;
            }
            else if (response["dayentry"].Count > 0)
            {
                hasUnapprovedEntries = true;
            }
            else if (response["articleentry"].Count > 0)
            {
                hasUnapprovedEntries = true;
            }
            return(hasUnapprovedEntries);
        }
예제 #4
0
        public ActionResult getprojects(
            string projectmanager,
            string searchterms,
            string orderby,
            bool ascending,
            int documentsperpage,
            int page)
        {
            var splitters = new char[] { ' ' };

            string[] splitTerms = searchterms.Split(splitters, StringSplitOptions.RemoveEmptyEntries);

            DBQuery query = QueryGetProjects(
                splitTerms,
                orderby,
                ascending,
                documentsperpage,
                page,
                projectmanager);

            if (query != null)
            {
                DBResponse response = query.Find();
                DataTree   qi       = response.QueryInfo;
                return(new AjaxResult(GetJsonFromProjectsCollection((DataTree)response.FirstCollection)));


                int totalRecords = (int)qi["totalrecords"];

                // Max page to refer to is number of pages -1
                int maxPage = (int)Math.Ceiling((decimal)totalRecords / (decimal)documentsperpage) - 1;

                totalRecords = (int)qi["totalrecords"];
                return(new AjaxResult(GetJsonFromProjectsCollection((DataTree)query.Find().FirstCollection)));
            }
            else
            {
                return(new AjaxResult(""));
            }
        }
예제 #5
0
        public ActionResult getresultscollection(
            string terms,
            string rootschema,
            string collection,
            int documentperpage     = -1,
            string filtercontroller = "",
            string filteraction     = "")
        {
            var splitters = new char[] { ' ' };

            string[] splitTerms = terms.Split(splitters, StringSplitOptions.RemoveEmptyEntries);

            if (removeWildcards)
            {
                RemoveWildcards(splitTerms);
            }

            DataTree schema = Runtime.RunBlock("core", "schemafor", collection);

            var         filterQueries = new List <IMongoQuery>();
            IMongoQuery query         = Runtime.Filters.GetFilterQuery(filtercontroller, filteraction);

            if (query != null)
            {
                filterQueries.Add(query);
            }

            DBQuery resultsQuery = QuerySearchFilterTerm(splitTerms, schema, collection, documentperpage, filterQueries.ToArray());

            DBResponse response = null;

            if (resultsQuery != null)
            {
                response = resultsQuery.Find();

                List <string> nameFields = Schema.GetNameFields(schema);

                // Todo: consider not casting to datatree and using the collection.
                FilterResults((DataTree)response.FirstCollection, Schema.GetSearchFields(schema), nameFields);
            }

            if (response != null && response.FirstCollection.Count > 0)
            {
                return(NamedView("searchfilter", "searchfilterresult", (MC2Value)response.FirstCollection, response.QueryInfo));
            }
            else
            {
                return(NamedView("searchfilter", "searchfilterresult", MC2EmptyValue.EmptyValue));
            }
        }
예제 #6
0
        public ActionResult projectallocations(string projectid, string selectedday, string projectname)
        {
            DateTime day = DateTime.ParseExact(selectedday, "yyyyMMdd", CultureInfo.InvariantCulture);

            day = new DateTime(day.Year, day.Month, day.Day, day.Hour, day.Minute, day.Second, DateTimeKind.Utc);

            var query = new DBQuery("homescreenprojects", "allocationsforproject");

            query.AddParameter("project", new ObjectId(projectid));
            query.AddParameter("start", day);
            query.AddParameter("end", day);

            return(View((DataTree)query.Find().FirstCollection, projectname));
        }
예제 #7
0
        public ActionResult getEntryData(DateTime start, DateTime end)
        {
            var entriesQuery = new DBQuery("workdatawidget", "entrydata");

            entriesQuery.AddParameter("user", Runtime.SessionManager.CurrentUser[DBQuery.Id]);
            entriesQuery.AddParameter("start", start);
            entriesQuery.AddParameter("end", end);

            DBResponse response    = entriesQuery.Find();
            var        allocations = response["allocationentry"];

            foreach (DBDocument allocation in allocations)
            {
                allocation["project"] = DBDocument.FindOne("project", allocation["project"][DBDocument.Id]);
            }

            return(new AjaxResult((DataTree)response));
        }
예제 #8
0
        public ActionResult getprojectresults(string terms, string userid)
        {
            var splitters = new char[] { ' ' };

            string[] splitTerms = terms.Split(splitters, StringSplitOptions.RemoveEmptyEntries);

            if (removeWildcards)
            {
                RemoveWildcards(splitTerms);
            }

            DataTree resultData = null;

            if (splitTerms.Length > 0)
            {
                var dbQueries = new List <DBQuery>();

                DataTree schema = Runtime.RunBlock("core", "schemafor", "project");

                DBQuery resultsQuery = QuerySearchFilterTerm(splitTerms, schema, "project");

                if (resultsQuery != null)
                {
                    resultData = (DataTree)resultsQuery.Find().FirstCollection;

                    List <string> nameFields = Schema.GetNameFields(schema);

                    FilterResults(resultData, Schema.GetSearchFields(schema), nameFields);
                }
            }

            if (resultData != null && resultData.Count > 0)
            {
                return(NamedView("searchfilter", "searchfilterresult", resultData));
            }
            else
            {
                return(NamedView("searchfilter", "searchfilterresult", MC2EmptyValue.EmptyValue));
            }
        }
예제 #9
0
        /// <summary>
        /// Generated code for MC2 widget "approveworkhelper".
        /// </summary>
        public ActionResult getdetailsdata(string detailids)
        {
            string[] identifiers = detailids.Split(',');

            var query = new DBQuery();

            query["details"][DBQuery.CollectionName] = "timesheetentry";

            var orQueries = new List <IMongoQuery>();

            foreach (string strId in identifiers)
            {
                var id = new ObjectId(strId);
                orQueries.Add(Query.EQ("parent", id));
            }

            query["details"][DBQuery.Condition] = Query.Or(orQueries).ToString();

            DBCollection results = query.Find().FirstCollection;

            return(new AjaxResult((DataTree)results));
        }
예제 #10
0
        private void UpdatePayTypesIfNeeded()
        {
            if (payTypeUpdateStopwatch.Elapsed.Minutes > PayTypeUpdateIntervalMinutes ||
                expenseTypes == null || payTypes == null)
            {
                var query  = new DBQuery("totalwork", "paytypes");
                var result = query.Find();

                lock (payTypeLock)
                {
                    payTypes     = result["timesheetentrydetailpaytype"];
                    expenseTypes = result["dayentrytype"];

                    if (result["socialproject"].Count >= 0)
                    {
                        socialProject = result["socialproject"][0];
                    }
                }

                payTypeUpdateStopwatch.Restart();
            }
        }
예제 #11
0
        public ActionResult getsubprojects(
            string parentproject)
        {
            int MaxSubProjects = (int)Runtime.Config["tro"]["dataview"]["maxsubprojects"].GetValueOrDefault(300);

            DBQuery query = QueryGetProjects(
                null,
                "name",
                false,
                MaxSubProjects,
                0,
                string.Empty);

            if (query != null)
            {
                DBResponse response = query.Find();
                DataTree   qi       = response.QueryInfo;
                return(new AjaxResult(GetJsonFromProjectsCollection((DataTree)response.FirstCollection)));
            }
            else
            {
                return(new AjaxResult(""));
            }
        }
예제 #12
0
        public ActionResult pasteday(string sourceday, string targetday)
        {
            if ((bool)Runtime.Features["timetracking"])
            {
                return(new AjaxResult("Copying not supported for timetracking."));
            }

            logger.LogInfo("copying entries from one date to another", sourceday, targetday);

            DateTime sourceDay = DateTime.ParseExact(sourceday, "yyyyMMdd", CultureInfo.InvariantCulture);

            sourceDay = new DateTime(sourceDay.Year, sourceDay.Month, sourceDay.Day, sourceDay.Hour, sourceDay.Minute, sourceDay.Second, DateTimeKind.Utc);

            DateTime targetDay = DateTime.ParseExact(targetday, "yyyyMMdd", CultureInfo.InvariantCulture);

            targetDay = new DateTime(targetDay.Year, targetDay.Month, targetDay.Day, targetDay.Hour, targetDay.Minute, targetDay.Second, DateTimeKind.Utc);

            var query = new DBQuery("workentries", "workforday");

            query.AddParameter("start", sourceDay);
            query.AddParameter("end", sourceDay);
            query.AddParameter("user", new ObjectId(Runtime.SessionManager.CurrentUser[DBQuery.Id]));

            DBResponse response = query.Find();

            DBCollection timesheetEntries = response["timesheetentry"];
            DBCollection abseneceEntries  = response["absenceentry"];
            DBCollection dayEntries       = response["dayentry"];

            var tasks = new List <Task <bool> >();

            bool isTargetInThePast = (DateTime.Compare(DateTime.UtcNow, targetDay) > 0);


            // Only ever copy absences for future
            if (isTargetInThePast)
            {
                tasks.Add(CopyEntriesToDay(timesheetEntries, targetDay));
                tasks.Add(CopyEntriesToDay(dayEntries, targetDay));
                tasks.Add(CopyEntriesToDay(abseneceEntries, targetDay));
            }
            else
            {
                logger.LogDebug("Copy target date is in the future");

                if ((bool)Runtime.Features["allowfutureabsences"])
                {
                    tasks.Add(CopyEntriesToDay(abseneceEntries, targetDay));
                }
            }

            Task.WaitAll(tasks.ToArray());

            bool somethingFiltered = false;

            foreach (var task in tasks)
            {
                if (task.Result)
                {
                    somethingFiltered = true;
                }
            }

            return(new AjaxResult(somethingFiltered ? "filtered" : "success"));
        }
예제 #13
0
        public ActionResult getresultsrelation(
            string terms,
            string rootschema,
            string collection,
            string valuename,
            string relationtarget,
            string itemid           = "",
            string filtercontroller = "",
            string filteraction     = "")
        {
            var splitters = new char[] { ' ' };

            string[] splitTerms = terms.Split(splitters, StringSplitOptions.RemoveEmptyEntries);

            if (removeWildcards)
            {
                RemoveWildcards(splitTerms);
            }

            // In case there are no search terms, use the default value.
            if (splitTerms.Length == 0)
            {
                DataTree results =
                    GetDefaultResults(
                        rootschema,
                        collection,
                        valuename,
                        relationtarget,
                        itemid,
                        filtercontroller,
                        filteraction);

                if (results == null)
                {
                    return(NamedView("searchfilter", "searchfilterresult", MC2EmptyValue.EmptyValue));
                }
                else
                {
                    return(NamedView("searchfilter", "searchfilterresult", results));
                }
            }

            List <IMongoQuery> filterQueries = new List <IMongoQuery>();

            IMongoQuery query = Runtime.Filters.GetFilterQuery(filtercontroller, filteraction);

            if (query != null)
            {
                filterQueries.Add(query);
            }

            string   relationTarget = Runtime.Schema.GetRelationTarget(rootschema, collection, valuename);
            DataTree schema         = Runtime.RunBlock("core", "schemafor", relationTarget);

            DBQuery resultsQuery = QuerySearchFilterTerm(splitTerms, schema, relationTarget, -1, filterQueries.ToArray());

            DBResponse response = null;

            if (resultsQuery != null)
            {
                response = resultsQuery.Find();

                List <string> nameFields = Schema.GetNameFields(schema);

                FilterResults((DataTree)response.FirstCollection, Schema.GetSearchFields(schema), nameFields);
            }

            if (response != null && response.FirstCollection.Count > 0)
            {
                return(NamedView("searchfilter", "searchfilterresult", (MC2Value)response.FirstCollection, response.QueryInfo));
            }
            else
            {
                return(NamedView("searchfilter", "searchfilterresult", MC2EmptyValue.EmptyValue));
            }
        }
예제 #14
0
        public ActionResult relationdropdown(
            string collection,
            string filtercontroller = "",
            string filteraction     = "")
        {
            DataTree schema = Runtime.Schema.First[collection];
            string   filter = schema["collection"]["listfilter"];

            string orderBy   = schema["collection"]["orderby"];
            bool   ascending = (bool)schema["collection"]["ascending"].GetValueOrDefault(false);

            // Combine given filter and filter from schema.
            if (!string.IsNullOrEmpty(filtercontroller) && !string.IsNullOrEmpty(filteraction))
            {
                IMongoQuery customFilter = this.Runtime.Filters.GetFilterQuery(filtercontroller, filteraction);

                if (string.IsNullOrEmpty(filter))
                {
                }
                else
                {
                    BsonDocument doc = MongoDB.Bson.Serialization
                                       .BsonSerializer.Deserialize <BsonDocument>(filter);

                    var combinedFilter = Query.And(new QueryDocument(doc), customFilter);
                    filter = combinedFilter.ToString();
                }
            }

            var query = new DBQuery();

            if (!string.IsNullOrEmpty(orderBy))
            {
                query[collection][DBQuery.OrderBy]   = orderBy;
                query[collection][DBQuery.Ascending] = ascending;
            }

            if (string.IsNullOrEmpty(filter))
            {
                query[collection][DBQuery.Condition] = DBQuery.All;
            }
            else
            {
                query[collection][DBQuery.Condition] = filter;
            }

            query[collection][DBQuery.DocumentsPerPage] = DropdownMaxDocuments;

            DBResponse response = query.Find();

            DataTree filteredResults = new DataTree("results");

            foreach (DataTree result in response.FirstCollection)
            {
                DataTree filteredResult = filteredResults.Add(result.Name);

                List <string> nameFields = Schema.GetNameFields(Runtime.Schema.First[collection]);

                string displayName = "";

                bool first = false;
                foreach (string nameField in nameFields)
                {
                    if (first)
                    {
                        first = false;
                    }
                    else if (!displayName.EndsWith(" ") && !string.IsNullOrEmpty(displayName))
                    {
                        displayName += " ";
                    }

                    displayName += result[nameField];
                }

                filteredResult["name"] = displayName;
            }

            return(new AjaxResult(filteredResults));
        }
예제 #15
0
        public AjaxResult gettotals(
            string userfilter,
            string projectfilter,
            string assetfilter,
            string profitcenterfilter,
            string resourceprofitcenterfilter,
            string resourcebusinessarea,
            string resourcefunctionalarea,
            string managerprojectsfilter,
            string payrollperiodfilter,
            string favouriteusersfilter,
            bool showonlyentriesnotaccepted,
            MC2DateTimeValue daterangestart = null,
            MC2DateTimeValue daterangeend   = null)
        {
            int maxTotalDocuments = (int)Runtime.Config["totalwork"]["maxdocuments"].GetValueOrDefault(1000);

            var timesheetQueries = new List <IMongoQuery>();
            var absenceQueries   = new List <IMongoQuery>();
            var expenseQueries   = new List <IMongoQuery>();

            SystemsGarden.mc2.tro.approveworklistview.AddFiltersToQuery(
                "timesheetentry",
                userfilter, projectfilter, assetfilter, profitcenterfilter, resourceprofitcenterfilter,
                resourcebusinessarea, resourcefunctionalarea, managerprojectsfilter, payrollperiodfilter,
                favouriteusersfilter, daterangestart, daterangeend, showonlyentriesnotaccepted, timesheetQueries);

            SystemsGarden.mc2.tro.approveworklistview.AddFiltersToQuery(
                "absenceentry",
                userfilter, projectfilter, assetfilter, profitcenterfilter, resourceprofitcenterfilter,
                resourcebusinessarea, resourcefunctionalarea, managerprojectsfilter, payrollperiodfilter,
                favouriteusersfilter, daterangestart, daterangeend, showonlyentriesnotaccepted, absenceQueries);

            SystemsGarden.mc2.tro.approveworklistview.AddFiltersToQuery(
                "dayentry",
                userfilter, projectfilter, assetfilter, profitcenterfilter, resourceprofitcenterfilter,
                resourcebusinessarea, resourcefunctionalarea, managerprojectsfilter, payrollperiodfilter,
                favouriteusersfilter, daterangestart, daterangeend, showonlyentriesnotaccepted, expenseQueries);

            DBQuery totalsQuery = new DBQuery();

            totalsQuery["timesheetentry"][DBQuery.Condition]           = Query.And(timesheetQueries).ToString();
            totalsQuery["timesheetentry"][DBQuery.DocumentsPerPage]    = maxTotalDocuments;
            totalsQuery["timesheetentry"][DBQuery.SpecifiedFieldsOnly] = true;
            totalsQuery["timesheetentry"]["duration"].Create();
            totalsQuery["timesheetentry"]["timesheetentrydetailpaytype"].Create();
            totalsQuery["timesheetentry"]["user"].Create();
            totalsQuery["timesheetentry"]["project"].Create();


            totalsQuery["absenceentry"][DBQuery.Condition]           = Query.And(absenceQueries).ToString();
            totalsQuery["absenceentry"][DBQuery.DocumentsPerPage]    = maxTotalDocuments;
            totalsQuery["absenceentry"][DBQuery.SpecifiedFieldsOnly] = true;
            totalsQuery["absenceentry"]["duration"].Create();
            totalsQuery["absenceentry"]["absenceentrytype"].Create();
            totalsQuery["absenceentry"]["user"].Create();

            totalsQuery["dayentry"][DBQuery.Condition]           = Query.And(expenseQueries).ToString();
            totalsQuery["dayentry"][DBQuery.DocumentsPerPage]    = maxTotalDocuments;
            totalsQuery["dayentry"][DBQuery.SpecifiedFieldsOnly] = true;
            totalsQuery["dayentry"]["amount"].Create();
            totalsQuery["dayentry"]["dayentrytype"].Create();
            totalsQuery["dayentry"]["user"].Create();

            DBResponse totalsResult = totalsQuery.Find();

            if (totalsResult["timesheetentry"].Count >= maxTotalDocuments ||
                totalsResult["dayentry"].Count >= maxTotalDocuments ||
                totalsResult["absenceentry"].Count >= maxTotalDocuments)
            {
                return(new AjaxResult("too many results"));
            }

            DataTree userTotals = CountResults(totalsResult);

            return(new AjaxResult((DataTree)userTotals));
        }