Ejemplo n.º 1
0
        public async Task <List <TMJournalLineError> > ValidateLines(List <TMJournalLineClient> lines,
                                                                     DateTime startDate,
                                                                     DateTime endDate,
                                                                     Uniconta.DataModel.Employee employee)
        {
            var t = LoadingTask;

            if (t != null && !t.IsCompleted)
            {
                await t;
            }

            checkErrors = new List <TMJournalLineError>();

            this.employee = employee;
            var approveDate = employee._TMApproveDate;

            this.startDate = approveDate >= startDate?approveDate.AddDays(1) : startDate;

            this.endDate = endDate;
            string lastProjNo  = null;
            string lastPayroll = null;
            string lastTaskId  = null;

            foreach (var rec in lines)
            {
                rec.ErrorInfo = string.Empty;
                err           = false;

                if (lastPayroll != rec.PayrollCategory)
                {
                    lastPayroll = rec.PayrollCategory;
                    payrollCat  = (EmpPayrollCategory)payrollCategoryCache.Get(lastPayroll);
                    prCategory  = (Uniconta.DataModel.PrCategory)prCategoryCache.Get(payrollCat?._PrCategory);
                }

                if (lastProjNo != rec._Project)
                {
                    lastProjNo = rec._Project;
                    proj       = (Uniconta.DataModel.Project)projectCache.Get(lastProjNo);
                    projGroup  = (Uniconta.DataModel.ProjectGroup)projectGrpCache.Get(proj?._Group);

                    if (proj != null && comp.ProjectTask && proj.Tasks == null)
                    {
                        await proj.LoadTasks(api);
                    }
                }

                if (rec._Project != null && rec._Task != null && lastTaskId != string.Concat(rec._Project, rec._Task))
                {
                    lastTaskId = string.Concat(rec._Project, rec._Task);
                    prTask     = proj.Tasks != null?proj.Tasks.FirstOrDefault(s => s.Task == rec.Task) : null;
                }

                ValidateGeneral(rec);
                ValidateProject(rec);
                ValidateTask(rec);
                ValidateProjectCategory(rec);
                ValidatePrice(rec);

                if (!err)
                {
                    rec.ErrorInfo = VALIDATE_OK;
                }
            }

            return(checkErrors);
        }
Ejemplo n.º 2
0
        private void CreateBudget()
        {
            var cwCreateBjt = new CwCreateUpdateBudget(api);

#if !SILVERLIGHT
            cwCreateBjt.DialogTableId = 2000000074;
#endif
            cwCreateBjt.Closed += async delegate
            {
                if (cwCreateBjt.DialogResult == true)
                {
                    int      budgetMethod   = 0;
                    DateTime dFromDate      = CwCreateUpdateBudget.FromDate;
                    DateTime dToDate        = CwCreateUpdateBudget.ToDate;
                    string   dEmplNumber    = CwCreateUpdateBudget.Employee;
                    string   dProjectNumber = CwCreateUpdateBudget.Project;
                    string   dBudgetGroup   = CwCreateUpdateBudget.Group;
                    string   dBudgetComment = CwCreateUpdateBudget.Comment;

                    dBudgetComment = string.IsNullOrEmpty(dBudgetComment) ? Uniconta.ClientTools.Localization.lookup("Budget") : dBudgetComment;  //

                    if (string.IsNullOrEmpty(CwCreateUpdateBudget.Group))
                    {
                        UnicontaMessageBox.Show(FieldCannotBeEmpty(Uniconta.ClientTools.Localization.lookup("BudgetGroup")), Uniconta.ClientTools.Localization.lookup("Warning"), MessageBoxButton.OK);
                        return;
                    }

                    if (dFromDate == DateTime.MinValue)
                    {
                        UnicontaMessageBox.Show(FieldCannotBeEmpty(Uniconta.ClientTools.Localization.lookup("FromDate")), Uniconta.ClientTools.Localization.lookup("Warning"), MessageBoxButton.OK);
                        return;
                    }

                    if (dToDate == DateTime.MinValue)
                    {
                        UnicontaMessageBox.Show(FieldCannotBeEmpty(Uniconta.ClientTools.Localization.lookup("ToDate")), Uniconta.ClientTools.Localization.lookup("Warning"), MessageBoxButton.OK);
                        return;
                    }

                    ErrorCodes res;
                    var        master = new List <UnicontaBaseEntity>();

                    //Delete Budget Lines >>
                    ProjectBudgetGroup budgetGrp = budgetGroupCache.Get(dBudgetGroup);

                    if (budgetGrp._Blocked)
                    {
                        UnicontaMessageBox.Show(string.Format(Uniconta.ClientTools.Localization.lookup("IsBlockedOBJ"), Uniconta.ClientTools.Localization.lookup("Budget")), Uniconta.ClientTools.Localization.lookup("Warning"), MessageBoxButton.OK);
                        return;
                    }

                    busyIndicator.IsBusy = true;

                    master.Add(budgetGrp);

                    if (!string.IsNullOrEmpty(dEmplNumber))
                    {
                        master.Add(employeeCache.Get(dEmplNumber));
                    }

                    if (!string.IsNullOrEmpty(dProjectNumber))
                    {
                        master.Add(projectCache.Get(dProjectNumber));
                    }

                    List <PropValuePair> pairLine = new List <PropValuePair>();
                    pairLine.Add(PropValuePair.GenereteWhereElements(nameof(ProjectBudgetLine._Date), typeof(DateTime), String.Format("{0:d}..{1:d}", dFromDate, dToDate)));

                    var projBudgetLineDelete = await api.Query <ProjectBudgetLine>(master, pairLine);

                    if (projBudgetLineDelete.Length != 0)
                    {
                        res = await api.Delete(projBudgetLineDelete);
                    }
                    //Delete Budget Lines <<


                    List <PropValuePair> pairBudget = new List <PropValuePair>();
                    pairBudget.Add(PropValuePair.GenereteWhereElements(nameof(ProjectBudget._Group), typeof(string), dBudgetGroup));
                    var projBudgetLst = await api.Query <ProjectBudget>(pairBudget);

                    var dictProjBudget = new Dictionary <string, ProjectBudget>();
                    foreach (ProjectBudget rec in projBudgetLst)
                    {
                        ProjectBudget projBudget;
                        bool          hasValue = dictProjBudget.TryGetValue(string.Concat(rec._Project, dBudgetGroup), out projBudget);
                        if (!hasValue)
                        {
                            dictProjBudget.Add(string.Concat(rec._Project, dBudgetGroup), rec);
                        }
                    }

                    List <PropValuePair> filterTrans = new List <PropValuePair>();
                    filterTrans.Add(PropValuePair.GenereteWhereElements(nameof(ProjectTrans._Date), typeof(DateTime), String.Format("{0:d}..{1:d}", dFromDate.AddYears(-1), dToDate.AddYears(-1))));

                    var transTask    = api.Query(new ProjectTransPivotClient(), master, filterTrans);
                    var projTransLst = await transTask;

                    var projTransLstEntity = new List <ProjectTransPivotClient>();
                    //string lastProj = null;
                    string lastPrCat      = null;
                    string lastPayrollCat = null;

                    //Uniconta.DataModel.ProjectGroup projGrp = null;
                    Uniconta.DataModel.PrCategory         prCat      = null;
                    Uniconta.DataModel.EmpPayrollCategory payrollCat = null;

                    foreach (var x in projTransLst)
                    {
                        //if (lastProj != x._Project)
                        //{
                        //    lastProj = x._Project;
                        //    var proj = x.ProjectRef;
                        //    projGrp = projGroupCache.Get(proj._Group);
                        //}
                        if (lastPrCat != x._PrCategory)
                        {
                            lastPrCat = x._PrCategory;
                            prCat     = x.CategoryRef;
                        }
                        if (lastPayrollCat != x._PayrollCategory)
                        {
                            lastPayrollCat = x._PayrollCategory;
                            payrollCat     = x.PayrollCategoryRef;
                        }

                        if (prCat != null && payrollCat != null && prCat._CatType == CategoryType.Labour && payrollCat._Unit == ItemUnit.Hours && payrollCat._InternalType == InternalType.None)
                        {
                            projTransLstEntity.Add(x);
                        }
                    }

                    if (projTransLstEntity == null)
                    {
                        busyIndicator.IsBusy = false;
                        UnicontaMessageBox.Show(string.Format(Uniconta.ClientTools.Localization.lookup("RecordsUpdated"), 0, string.Empty), Uniconta.ClientTools.Localization.lookup("Information"), MessageBoxButton.OK);
                        return;
                    }

                    //Only create budget project with transactions
                    var insertLst  = new List <UnicontaBaseEntity>();
                    var grpProject = projTransLstEntity.GroupBy(x => x._Project);
                    foreach (var rec in grpProject)
                    {
                        ProjectBudget projBudget;
                        bool          hasValue = dictProjBudget.TryGetValue(string.Concat(rec.Key, dBudgetGroup), out projBudget);
                        if (!hasValue)
                        {
                            insertLst.Add(new ProjectBudget()
                            {
                                _Project = rec.Key,
                                _Group   = dBudgetGroup,
                                _Name    = dBudgetComment,
                                _Current = true
                            });
                        }
                    }
                    if (insertLst.Count > 0)
                    {
                        res = await api.Insert(insertLst); //Create new Budget-Header
                    }
                    //Insert new header in dictionary for fast lookup
                    foreach (ProjectBudget rec in insertLst)
                    {
                        ProjectBudget projBudget;
                        bool          hasValue = dictProjBudget.TryGetValue(string.Concat(rec._Project, dBudgetGroup), out projBudget);
                        if (!hasValue)
                        {
                            dictProjBudget.Add(string.Concat(rec._Project, dBudgetGroup), rec);
                        }
                    }

                    ProjectBudgetLineLocal projBudgetLine;
                    var dictProjBudgetLine = new Dictionary <int, ProjectBudgetLineLocal>();
                    foreach (var trans in projTransLstEntity)
                    {
                        if (dictProjBudgetLine.TryGetValue(GetHashCode(trans, budgetMethod), out projBudgetLine))
                        {
                            projBudgetLine._Qty        += trans._Qty;
                            projBudgetLine._CostTotal  += trans.Cost;
                            projBudgetLine._CostPrice   = projBudgetLine._Qty != 0 ? Math.Round(projBudgetLine._CostTotal / projBudgetLine._Qty, 2) : 0;
                            projBudgetLine._SalesTotal += trans.Sales;
                            projBudgetLine._SalesPrice  = projBudgetLine._Qty != 0 ? Math.Round(projBudgetLine._SalesTotal / projBudgetLine._Qty, 2) : 0;
                        }
                        else
                        {
                            ProjectBudget projBudget;
                            bool          hasValue = dictProjBudget.TryGetValue(string.Concat(trans._Project, dBudgetGroup), out projBudget);
                            if (hasValue)
                            {
                                projBudgetLine = new ProjectBudgetLineLocal();
                                projBudgetLine.SetMaster(projBudget);
                                projBudgetLine._Project         = trans._Project;
                                projBudgetLine._Qty             = trans._Qty;
                                projBudgetLine._CostTotal      += trans.Cost;
                                projBudgetLine._CostPrice       = projBudgetLine._Qty != 0 ? Math.Round(projBudgetLine._CostTotal / projBudgetLine._Qty, 2) : 0;
                                projBudgetLine._SalesTotal     += trans.Sales;
                                projBudgetLine._SalesPrice      = projBudgetLine._Qty != 0 ? Math.Round(projBudgetLine._SalesTotal / projBudgetLine._Qty, 2) : 0;
                                projBudgetLine._Date            = GetDate(trans._Date, budgetMethod);
                                projBudgetLine._Employee        = trans._Employee;
                                projBudgetLine._PayrollCategory = budgetMethod == 0 || budgetMethod == 1 ? trans._PayrollCategory : null;
                                projBudgetLine._PrCategory      = trans._PrCategory;
                                projBudgetLine._Text            = string.Concat("(", TMJournalLineHelper.GetTimeStamp(), ") ", Uniconta.ClientTools.Localization.lookup("Created"));
                                dictProjBudgetLine.Add(GetHashCode(trans, budgetMethod), projBudgetLine);
                            }
                        }
                    }

                    if (dictProjBudgetLine.Count > 0)
                    {
                        res = await api.Insert(dictProjBudgetLine.Values);

                        localMenu_OnItemClicked("RefreshGrid");
                    }

                    busyIndicator.IsBusy = false;

                    UnicontaMessageBox.Show(string.Format(Uniconta.ClientTools.Localization.lookup("RecordsUpdated"), dictProjBudgetLine.Count, string.Empty), Uniconta.ClientTools.Localization.lookup("Information"), MessageBoxButton.OK);
                }
            };
            cwCreateBjt.Show();
        }