public async static Task <object> Generate(DateTime datefrom, DateTime dateto) { EntityModel employeeModel = await MetadataToModelConverter.GetEntityModelByModelAsync("Employee", 0); EntityModel businessTripModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.BusinessTrip); EntityModel sickLeaveModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.SickLeave); EntityModel vacationModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.Vacation); var filter = Filter.And.In(WorkflowReport.FinalStates, "State").Merge( Filter.And.LessOrEqual(dateto, "DateStart").GreaterOrEqual(datefrom, "DateEnd")); var employees = await employeeModel.GetAsync(Filter.Empty); var businessTripFilter = DocumentTypes.GetFilter(DocumentTypes.BusinessTrip) .Merge(filter) .Merge(Document.GetViewFilterForCurrentUser(businessTripModel)); var businessTrips = await businessTripModel.GetAsync(businessTripFilter); businessTrips.ForEach((item) => { var i = (dynamic)item; if (!string.IsNullOrEmpty(i.Employees)) { i.EmployeesList = JsonConvert.DeserializeObject <List <Guid> >(i.Employees); var names = new List <string>(); foreach (Guid empId in i.EmployeesList) { var emp = employees.Select(c => c as dynamic).Where(c => c.Id == empId).FirstOrDefault(); names.Add(emp?.Name); } i.EmployeesNames = names.OrderBy(c => c).ToList(); } }); var sickLeaveFilter = DocumentTypes.GetFilter(DocumentTypes.SickLeave) .Merge(filter) .Merge(Document.GetViewFilterForCurrentUser(sickLeaveModel)); var sickLeaves = await sickLeaveModel.GetAsync(sickLeaveFilter); var vacationFilter = DocumentTypes.GetFilter(DocumentTypes.Vacation) .Merge(filter) .Merge(Document.GetViewFilterForCurrentUser(vacationModel)); var vacations = await vacationModel.GetAsync(vacationFilter); var res = new List <WorkCalendarEvent>(); res.AddRange(businessTrips.Select(c => new WorkCalendarEvent(c, "businesstrip", "Business Trip"))); res.AddRange(sickLeaves.Select(c => new WorkCalendarEvent(c, "sickleave", "Sick Leave"))); res.AddRange(vacations.Select(c => new WorkCalendarEvent(c, "vacation", "Vacation"))); return(res); }
public static async Task <object> Generate(DateTime dateFrom, DateTime dateTo, string parameter, int period) { EntityModel employeeSalaryModel = await MetadataToModelConverter.GetEntityModelByModelAsync("EmployeeSalary", 0); var employees = await Employee.SelectAsync(Filter.Empty, Order.StartAsc("DepartmentName").Asc("LocationName").Asc("Name")); var employeeSalaryList = await employeeSalaryModel.GetAsync(Filter.Empty); DateTime start, end; if (period == 0)// month { start = new DateTime(dateFrom.Year, dateFrom.Month, 1); end = new DateTime(dateTo.Year, dateTo.Month, 1).AddMonths(1).AddSeconds(-1); } else //year { start = new DateTime(dateFrom.Year, 1, 1, 0, 0, 0); end = new DateTime(dateFrom.Year, 1, 1, 0, 0, 0).AddYears(1).AddSeconds(-1); } #region Documents EntityModel businessTripModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.BusinessTrip, 1); EntityModel sickLeaveModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.SickLeave, 1); EntityModel compensationModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.Compensation, 1); EntityModel vacationModel = await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.Vacation, 1); var periodFilter = Filter.And.LessOrEqual(end, "DateStart").GreaterOrEqual(start, "DateEnd"); var dateFilter = Filter.And.GreaterOrEqual(start, "Date").LessOrEqual(end, "Date"); var periodAndStateFilter = Filter.And.In(WorkflowReport.FinalStates, "State").Merge(periodFilter); var dateAndStateFilter = Filter.And.In(WorkflowReport.FinalStates, "State").Merge(dateFilter); var businessTrips = await businessTripModel.GetAsync(Filter.And.Equal("BusinessTrip", "Type").Merge(periodAndStateFilter)); businessTrips.ForEach((item) => { var i = (dynamic)item; if (!string.IsNullOrEmpty(i.Employees)) { i.EmployeesList = JsonConvert.DeserializeObject <List <Guid> >(i.Employees); } }); var sickLeaves = await sickLeaveModel.GetAsync(DocumentTypes.GetFilter(DocumentTypes.SickLeave).Merge(periodAndStateFilter)); var compensations = await compensationModel.GetAsync(DocumentTypes.GetFilter(DocumentTypes.Compensation).Merge(dateAndStateFilter)); var vacations = await vacationModel.GetAsync(DocumentTypes.GetFilter(DocumentTypes.Vacation).Merge(periodAndStateFilter)); #endregion var res = new List <Dictionary <string, object> >(); foreach (var emp in employees) { var item = new Dictionary <string, object>(); item["Id"] = emp.Id; item["Department"] = emp.DepartmentName; item["Location"] = emp.LocationName; item["Name"] = emp.Name; item["Title"] = emp.Title; DateTime currentDate = period == 0 ? new DateTime(dateFrom.Year, dateFrom.Month, 1) : new DateTime(dateFrom.Year, 1, 1); while (currentDate < dateTo) { var key = period == 0 ? currentDate.ToString("MM/yy") : currentDate.ToString("yyyy") + "Y"; switch (parameter) { case "totalamount": var salary = GetSalary(emp, employeeSalaryList, currentDate, period); var tax = GetTax(emp, employeeSalaryList, currentDate, period); var compensation = GetCompensation(emp.Id, compensations, currentDate, period); item[key] = (salary + tax + compensation).ToString("N"); break; case "salary": item[key] = GetSalary(emp, employeeSalaryList, currentDate, period).ToString("N"); break; case "tax": item[key] = GetTax(emp, employeeSalaryList, currentDate, period).ToString("N"); break; case "compensation": item[key] = GetCompensation(emp.Id, compensations, currentDate, period).ToString("N"); break; case "tripdays": item[key] = GetTripDays(emp.Id, businessTrips, currentDate, period); break; case "sickleavedays": item[key] = GetSickLeaveDays(emp.Id, sickLeaves, currentDate, period); break; case "vacationdays": item[key] = GetVacationDays(emp.Id, vacations, currentDate, period); break; } currentDate = period == 0 ? currentDate.AddMonths(1) : currentDate.AddYears(1); } res.Add(item); } return(res); }
public async static Task <DashboardInfo> Generate() { var res = new DashboardInfo(); var employeeModel = (await MetadataToModelConverter.GetEntityModelByModelAsync("Employee")); var businessTripModel = (await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.BusinessTrip)); var CompensationModel = (await MetadataToModelConverter.GetEntityModelByModelAsync(DocumentTypes.Compensation)); if (DWKitRuntime.Security.CheckPermission("Dashboard", "ViewCompanyInfo")) { Filter notDraft = Filter.And.NotIn(WorkflowReport.DraftStates, "State"); res.BusinessTripCount = await Document.GetDocumentTypeCountAsync(DocumentTypes.BusinessTrip, notDraft); res.SickLeaveCount = await Document.GetDocumentTypeCountAsync(DocumentTypes.SickLeave, notDraft); res.VacationCount = await Document.GetDocumentTypeCountAsync(DocumentTypes.Vacation, notDraft); res.CompensationCount = await Document.GetDocumentTypeCountAsync(DocumentTypes.Compensation, notDraft); res.RecruitmentCount = await Document.GetDocumentTypeCountAsync(DocumentTypes.Recruitment, notDraft); res.EmployeeReport = await EmployeeReport.GenerateForDashboard(DateTime.Now.AddMonths(-5), DateTime.Now); } if (DWKitRuntime.Security.CurrentUser != null) { #region For Users Guid id = DWKitRuntime.Security.CurrentUser.Id; Filter userBusinessTripFilter = DocumentTypes.GetFilter(DocumentTypes.BusinessTrip).NotIn(WorkflowReport.DraftStates, "State").LikeRightLeft(id.ToString(), "Employees"); var trips = await businessTripModel.GetAsync(userBusinessTripFilter, Order.StartAsc("DateStart")); Filter userCompenstationFilter = DocumentTypes.GetFilter(DocumentTypes.Compensation).NotIn(WorkflowReport.DraftStates, "State").Equal(id, "EmployeeId"); var Compensations = await CompensationModel.GetAsync(userCompenstationFilter); res.UserBusinessTripExpenses = 0; res.UserBusinessTripExpensesApproved = 0; foreach (dynamic trip in trips) { if (trip.Amount == null || trip.Amount == 0) { continue; } if (WorkflowReport.FinalStates.Contains(trip.State)) { res.UserBusinessTripExpensesApproved += (decimal)trip.Amount; } else { res.UserBusinessTripExpenses += (decimal)trip.Amount; } } res.UserCompensationAmount = 0; res.UserCompensationAmountApproved = 0; foreach (dynamic c in Compensations) { if (c.Amount == null || c.Amount == 0) { continue; } if (WorkflowReport.FinalStates.Contains(c.State)) { res.UserCompensationAmountApproved += (decimal)c.Amount; } else { res.UserCompensationAmount += (decimal)c.Amount; } } res.UserBusinessTrips = trips.Where(c => ((dynamic)c).DateEnd > DateTime.Now).Select(c => c.ToDictionary(true)).ToList(); #endregion } return(res); }