protected virtual PMBudgetAccum GetTargetBudget(int?accountGroupID, ARTran line) { PMAccountGroup ag = PXSelect <PMAccountGroup, Where <PMAccountGroup.groupID, Equal <Required <PMAccountGroup.groupID> > > > .Select(Base, accountGroupID); PMProject project = PXSelect <PMProject, Where <PMProject.contractID, Equal <Required <PMProject.contractID> > > > .Select(Base, line.ProjectID); bool isExisting; BudgetService budgetService = new BudgetService(Base); PX.Objects.PM.Lite.PMBudget budget = budgetService.SelectProjectBalance(ag, project, line.TaskID, line.InventoryID, line.CostCodeID, out isExisting); PMBudgetAccum target = new PMBudgetAccum(); target.Type = budget.Type; target.ProjectID = budget.ProjectID; target.ProjectTaskID = budget.TaskID; target.AccountGroupID = budget.AccountGroupID; target.InventoryID = budget.InventoryID; target.CostCodeID = budget.CostCodeID; target.UOM = budget.UOM; target.Description = budget.Description; target.CuryInfoID = project.CuryInfoID; return(target); }
public virtual void RecalculateChangeOrders(PMProject project, ProjectBalance projectBalance, Dictionary <BudgetKeyTuple, PMBudgetEx> existingBudgetRecords) { var select = new PXSelect <PMChangeOrderBudget, Where <PMChangeOrderBudget.projectID, Equal <Required <PMChangeOrderBudget.projectID> >, And <PMChangeOrderBudget.released, Equal <True> > > >(this); foreach (PMChangeOrderBudget change in select.Select(project.ContractID)) { BudgetKeyTuple key = GetKey(change); PMBudgetEx existing = null; if (existingBudgetRecords.TryGetValue(key, out existing)) { PMBudgetAccum budget = new PMBudgetAccum(); budget.ProjectID = key.ProjectID; budget.ProjectTaskID = key.ProjectTaskID; budget.AccountGroupID = key.AccountGroupID; budget.InventoryID = key.InventoryID; budget.CostCodeID = key.CostCodeID; budget = Budget.Insert(budget); budget.ChangeOrderAmount += change.Amount.GetValueOrDefault(); budget.RevisedAmount += change.Amount.GetValueOrDefault(); var rollup = projectBalance.CalculateRollupQty <PMChangeOrderBudget>(change, existing); if (rollup.Qty.GetValueOrDefault() != 0) { budget.ChangeOrderQty += change.Qty.GetValueOrDefault(); budget.RevisedQty += change.Qty.GetValueOrDefault(); } } else { PMAccountGroup accountGroup = null; if (AccountGroups.TryGetValue(key.AccountGroupID, out accountGroup)) { PMBudgetAccum budget = new PMBudgetAccum(); budget.ProjectID = key.ProjectID; budget.ProjectTaskID = key.ProjectTaskID; budget.AccountGroupID = key.AccountGroupID; budget.InventoryID = key.InventoryID; budget.CostCodeID = key.CostCodeID; budget.Type = accountGroup.IsExpense == true ? GL.AccountType.Expense : accountGroup.Type; budget = Budget.Insert(budget); budget.ChangeOrderAmount += change.Amount.GetValueOrDefault(); budget.RevisedAmount += change.Amount.GetValueOrDefault(); } } } }
public virtual void AddToInvoiced(ARTran line, int?revenueAccountGroup, int mult = 1) { if (line.TaskID == null) { return; } if (revenueAccountGroup == null) { return; } if (CostCodeAttribute.UseCostCode() && line.CostCodeID == null) { return; } PMProject project = PXSelect <PMProject, Where <PMProject.contractID, Equal <Required <PMProject.contractID> > > > .Select(Base, line.ProjectID); if (project != null && project.NonProject != true) { PMBudgetAccum invoiced = GetTargetBudget(revenueAccountGroup, line); invoiced = Base.Budget.Insert(invoiced); if (project.CuryID == project.BillingCuryID) { invoiced.CuryInvoicedAmount += mult * (line.CuryTranAmt.GetValueOrDefault() + line.CuryRetainageAmt.GetValueOrDefault()); invoiced.InvoicedAmount += mult * (line.TranAmt.GetValueOrDefault() + line.RetainageAmt.GetValueOrDefault()); } else { invoiced.CuryInvoicedAmount += mult * (line.TranAmt.GetValueOrDefault() + line.RetainageAmt.GetValueOrDefault()); invoiced.InvoicedAmount += mult * (line.TranAmt.GetValueOrDefault() + line.RetainageAmt.GetValueOrDefault()); } } }
public List <Batch> Release(JournalEntry je, PMRegister doc, out List <PMTask> allocTasks) { doc = OnBeforeRelease(doc); allocTasks = new List <PMTask>(); List <Batch> batches = new List <Batch>(); Dictionary <string, PMTask> tasksToAutoAllocate = new Dictionary <string, PMTask>(); List <PMTran> sourceForAllocation = new List <PMTran>(); Dictionary <string, List <TranInfo> > transByFinPeriod = GetTransByBranchAndFinPeriod(doc); Debug.Assert(transByFinPeriod.Count > 0, "Failed to select transactions by finperiod in PMRegister Release."); ProjectBalance pb = CreateProjectBalance(); using (var ts = new PXTransactionScope()) { foreach (KeyValuePair <string, List <TranInfo> > kv in transByFinPeriod) { string[] parts = kv.Key.Split('.'); int? branchID = parts[0] == "0" ? null : (int?)int.Parse(parts[0]); je.Clear(PXClearOption.ClearAll); CurrencyInfo info = new CurrencyInfo(); info.CuryID = parts[2]; info.CuryEffDate = Accessinfo.BusinessDate; info = je.currencyinfo.Insert(info); Batch newbatch = new Batch(); newbatch.Module = doc.Module; newbatch.Status = BatchStatus.Unposted; newbatch.Released = true; newbatch.Hold = false; newbatch.BranchID = branchID; newbatch.FinPeriodID = parts[1]; newbatch.CuryID = parts[2]; newbatch.CuryInfoID = info.CuryInfoID; newbatch.Description = doc.Description; je.BatchModule.Insert(newbatch); bool tranAdded = false; foreach (TranInfo t in kv.Value) { bool isGL = false; if (t.Tran.Released != true && t.Tran.IsNonGL != true && t.Project.BaseType == CT.CTPRType.Project && !string.IsNullOrEmpty(t.AccountGroup.Type) && t.AccountGroup.Type != PMAccountType.OffBalance && !ProjectDefaultAttribute.IsNonProject(t.Tran.ProjectID) && t.Tran.AccountID != null && t.Tran.SubID != null && t.Tran.OffsetAccountID != null && t.Tran.OffsetSubID != null) { GLTran tran1 = new GLTran(); tran1.TranDate = t.Tran.Date; tran1.TranPeriodID = t.Tran.TranPeriodID; tran1.SummPost = false; tran1.BranchID = t.Tran.BranchID; tran1.PMTranID = t.Tran.TranID; tran1.ProjectID = t.Tran.ProjectID; tran1.TaskID = t.Tran.TaskID; tran1.CostCodeID = t.Tran.CostCodeID; tran1.TranDesc = t.Tran.Description; tran1.ReferenceID = t.Tran.BAccountID; tran1.InventoryID = t.Tran.InventoryID == PMInventorySelectorAttribute.EmptyInventoryID ? null : t.Tran.InventoryID; tran1.Qty = t.Tran.Qty; tran1.UOM = t.Tran.UOM; tran1.TranType = t.Tran.TranType; tran1.CuryInfoID = t.Tran.BaseCuryInfoID; tran1.CuryCreditAmt = 0; tran1.CreditAmt = 0; tran1.CuryDebitAmt = t.Tran.TranCuryAmount; tran1.DebitAmt = t.Tran.Amount; tran1.AccountID = t.Tran.AccountID; tran1.SubID = t.Tran.SubID; tran1.Released = true; je.GLTranModuleBatNbr.Insert(tran1); GLTran tran2 = new GLTran(); tran2.TranDate = t.Tran.Date; tran2.TranPeriodID = t.Tran.TranPeriodID; tran2.SummPost = false; tran2.BranchID = t.Tran.BranchID; tran2.PMTranID = t.Tran.TranID; tran2.ProjectID = t.OffsetAccountGroup.GroupID != null ? t.Tran.ProjectID : ProjectDefaultAttribute.NonProject(); tran2.TaskID = t.OffsetAccountGroup.GroupID != null ? t.Tran.TaskID : null; tran2.CostCodeID = tran2.TaskID != null ? t.Tran.CostCodeID : null; tran2.TranDesc = t.Tran.Description; tran2.ReferenceID = t.Tran.BAccountID; tran2.InventoryID = t.Tran.InventoryID == PMInventorySelectorAttribute.EmptyInventoryID ? null : t.Tran.InventoryID; tran2.Qty = t.Tran.Qty; tran2.UOM = t.Tran.UOM; tran2.TranType = t.Tran.TranType; tran2.CuryInfoID = t.Tran.BaseCuryInfoID; tran2.CuryCreditAmt = t.Tran.TranCuryAmount; tran2.CreditAmt = t.Tran.Amount; tran2.CuryDebitAmt = 0; tran2.DebitAmt = 0; tran2.AccountID = t.Tran.OffsetAccountID; tran2.SubID = t.Tran.OffsetSubID; tran2.Released = true; je.GLTranModuleBatNbr.Insert(tran2); tranAdded = true; isGL = true; t.Tran.BatchNbr = je.BatchModule.Current.BatchNbr; } if (!isGL) { if (t.Tran.AccountGroupID == null && t.Project.BaseType == CT.CTPRType.Project && t.Project.NonProject != true) { throw new PXException(Messages.AccountGroupIsRequired, doc.RefNbr); } } if (t.Tran.ExcludedFromBalance != true) { JournalEntryProjectExt xje = je.GetExtension <JournalEntryProjectExt>(); IList <ProjectBalance.Result> balances = pb.Calculate(t.Project, t.Tran, t.Account, t.AccountGroup, t.OffsetAccount, t.OffsetAccountGroup); foreach (ProjectBalance.Result balance in balances) { if (balance.Status != null) { PMBudgetAccum ps = new PMBudgetAccum(); ps.ProjectID = balance.Status.ProjectID; ps.ProjectTaskID = balance.Status.ProjectTaskID; ps.AccountGroupID = balance.Status.AccountGroupID; ps.InventoryID = balance.Status.InventoryID; ps.CostCodeID = balance.Status.CostCodeID; ps.UOM = balance.Status.UOM; ps.IsProduction = balance.Status.IsProduction; ps.Type = balance.Status.Type; ps.Description = balance.Status.Description; ps.CuryInfoID = balance.Status.CuryInfoID; ps = xje.ProjectBudget.Insert(ps); ps.ActualQty += balance.Status.ActualQty.GetValueOrDefault(); ps.CuryActualAmount += balance.Status.CuryActualAmount.GetValueOrDefault(); ps.ActualAmount += balance.Status.ActualAmount.GetValueOrDefault(); } if (balance.ForecastHistory != null) { PMForecastHistoryAccum forecast = new PMForecastHistoryAccum(); forecast.ProjectID = balance.ForecastHistory.ProjectID; forecast.ProjectTaskID = balance.ForecastHistory.ProjectTaskID; forecast.AccountGroupID = balance.ForecastHistory.AccountGroupID; forecast.InventoryID = balance.ForecastHistory.InventoryID; forecast.CostCodeID = balance.ForecastHistory.CostCodeID; forecast.PeriodID = balance.ForecastHistory.PeriodID; forecast = xje.ForecastHistory.Insert(forecast); forecast.ActualQty += balance.ForecastHistory.ActualQty.GetValueOrDefault(); forecast.CuryActualAmount += balance.ForecastHistory.CuryActualAmount.GetValueOrDefault(); forecast.ActualAmount += balance.ForecastHistory.ActualAmount.GetValueOrDefault(); } if (balance.TaskTotal != null) { PMTaskTotal ta = new PMTaskTotal(); ta.ProjectID = balance.TaskTotal.ProjectID; ta.TaskID = balance.TaskTotal.TaskID; ta = xje.ProjectTaskTotals.Insert(ta); ta.CuryAsset += balance.TaskTotal.CuryAsset.GetValueOrDefault(); ta.Asset += balance.TaskTotal.Asset.GetValueOrDefault(); ta.CuryLiability += balance.TaskTotal.CuryLiability.GetValueOrDefault(); ta.Liability += balance.TaskTotal.Liability.GetValueOrDefault(); ta.CuryIncome += balance.TaskTotal.CuryIncome.GetValueOrDefault(); ta.Income += balance.TaskTotal.Income.GetValueOrDefault(); ta.CuryExpense += balance.TaskTotal.CuryExpense.GetValueOrDefault(); ta.Expense += balance.TaskTotal.Expense.GetValueOrDefault(); } if (!isGL) { foreach (PMHistory item in balance.History) { PMHistoryAccum hist = new PMHistoryAccum(); hist.ProjectID = item.ProjectID; hist.ProjectTaskID = item.ProjectTaskID; hist.AccountGroupID = item.AccountGroupID; hist.InventoryID = item.InventoryID; hist.CostCodeID = item.CostCodeID; hist.PeriodID = item.PeriodID; hist.BranchID = item.BranchID; hist = (PMHistoryAccum)je.Caches[typeof(PMHistoryAccum)].Insert(hist); hist.FinPTDCuryAmount += item.FinPTDCuryAmount.GetValueOrDefault(); hist.FinPTDAmount += item.FinPTDAmount.GetValueOrDefault(); hist.FinYTDCuryAmount += item.FinYTDCuryAmount.GetValueOrDefault(); hist.FinYTDAmount += item.FinYTDAmount.GetValueOrDefault(); hist.FinPTDQty += item.FinPTDQty.GetValueOrDefault(); hist.FinYTDQty += item.FinYTDQty.GetValueOrDefault(); hist.TranPTDCuryAmount += item.TranPTDCuryAmount.GetValueOrDefault(); hist.TranPTDAmount += item.TranPTDAmount.GetValueOrDefault(); hist.TranYTDCuryAmount += item.TranYTDCuryAmount.GetValueOrDefault(); hist.TranYTDAmount += item.TranYTDAmount.GetValueOrDefault(); hist.TranPTDQty += item.TranPTDQty.GetValueOrDefault(); hist.TranYTDQty += item.TranYTDQty.GetValueOrDefault(); } } } } AddToUnbilledSummary(je, t.Tran); t.Tran.Released = true; je.Caches[typeof(PMTran)].Update(t.Tran); sourceForAllocation.Add(t.Tran); if (t.Tran.Allocated != true && t.Tran.ExcludedFromAllocation != true && t.Project.AutoAllocate == true) { if (!tasksToAutoAllocate.ContainsKey(string.Format("{0}.{1}", t.Task.ProjectID, t.Task.TaskID))) { tasksToAutoAllocate.Add(string.Format("{0}.{1}", t.Task.ProjectID, t.Task.TaskID), t.Task); } } } if (tranAdded) { je.Save.Press(); batches.Add(je.BatchModule.Current); } else { je.Persist(typeof(PMTran), PXDBOperation.Update); je.Persist(typeof(PMBudgetAccum), PXDBOperation.Insert); je.Persist(typeof(PMForecastHistoryAccum), PXDBOperation.Insert); je.Persist(typeof(PMTaskTotal), PXDBOperation.Insert); je.Persist(typeof(PMTaskAllocTotalAccum), PXDBOperation.Insert); je.Persist(typeof(PMHistoryAccum), PXDBOperation.Insert); //only non-gl balance is updated je.Persist(typeof(PMUnbilledDailySummaryAccum), PXDBOperation.Insert); je.SelectTimeStamp(); } } allocTasks.AddRange(tasksToAutoAllocate.Values); doc.Released = true; doc.Status = PMRegister.status.Released; je.Caches[typeof(PMRegister)].Update(doc); je.Persist(typeof(PMTran), PXDBOperation.Update); je.Persist(typeof(PMRegister), PXDBOperation.Update); je.Persist(typeof(PMBudgetAccum), PXDBOperation.Insert); je.Persist(typeof(PMForecastHistoryAccum), PXDBOperation.Insert); je.Persist(typeof(PMTaskAllocTotalAccum), PXDBOperation.Insert); je.Persist(typeof(PMTaskTotal), PXDBOperation.Insert); ts.Complete(); } return(batches); }
public virtual void RecalculateDraftInvoicesAmount(PMProject project, ProjectBalance pb) { var selectProforma = new PXSelectJoinGroupBy <PMProformaLine, InnerJoin <Account, On <PMProformaLine.accountID, Equal <Account.accountID> > >, Where <PMProformaLine.projectID, Equal <Required <PMProformaLine.projectID> >, And <PMProformaLine.released, Equal <False> > >, Aggregate <GroupBy <PMProformaLine.projectID, GroupBy <PMProformaLine.taskID, GroupBy <PMProformaLine.accountID, GroupBy <PMProformaLine.inventoryID, GroupBy <PMProformaLine.costCodeID, Sum <PMProformaLine.lineTotal> > > > > > > >(this); var selectInvoice = new PXSelectJoinGroupBy <ARTran, InnerJoin <Account, On <ARTran.accountID, Equal <Account.accountID> > >, Where <ARTran.projectID, Equal <Required <ARTran.projectID> >, And <ARTran.released, Equal <False> > >, Aggregate <GroupBy <ARTran.tranType, GroupBy <ARTran.projectID, GroupBy <ARTran.taskID, GroupBy <ARTran.accountID, GroupBy <ARTran.inventoryID, GroupBy <ARTran.costCodeID, Sum <ARTran.tranAmt> > > > > > > > >(this); var selectRevenueBudget = new PXSelect <PMRevenueBudget, Where <PMRevenueBudget.projectID, Equal <Required <PMRevenueBudget.projectID> >, And <PMRevenueBudget.type, Equal <GL.AccountType.income> > > >(this); var revenueBudget = selectRevenueBudget.Select(project.ContractID); foreach (PXResult <PMProformaLine, Account> res in selectProforma.Select(project.ContractID)) { PMProformaLine line = (PMProformaLine)res; Account account = (Account)res; int?inventoryID = PMInventorySelectorAttribute.EmptyInventoryID; foreach (PMRevenueBudget rev in revenueBudget) { foreach (PMRevenueBudget budget in revenueBudget) { if (budget.TaskID == line.TaskID && line.InventoryID == budget.InventoryID) { inventoryID = line.InventoryID; } } } PMBudgetAccum invoiced = new PMBudgetAccum(); invoiced.Type = GL.AccountType.Income; invoiced.ProjectID = line.ProjectID; invoiced.ProjectTaskID = line.TaskID; invoiced.AccountGroupID = account.AccountGroupID; invoiced.InventoryID = inventoryID; invoiced.CostCodeID = line.CostCodeID.GetValueOrDefault(CostCodeAttribute.GetDefaultCostCode()); invoiced = Budget.Insert(invoiced); invoiced.InvoicedAmount += line.LineTotal.GetValueOrDefault(); if (line.IsPrepayment == true) { invoiced.PrepaymentInvoiced += line.LineTotal.GetValueOrDefault(); } } foreach (PXResult <ARTran, Account> res in selectInvoice.Select(project.ContractID)) { ARTran line = (ARTran)res; Account account = (Account)res; int?inventoryID = PMInventorySelectorAttribute.EmptyInventoryID; foreach (PMRevenueBudget rev in revenueBudget) { foreach (PMRevenueBudget budget in revenueBudget) { if (budget.TaskID == line.TaskID && line.InventoryID == budget.InventoryID) { inventoryID = line.InventoryID; } } } PMBudgetAccum invoiced = new PMBudgetAccum(); invoiced.Type = GL.AccountType.Income; invoiced.ProjectID = line.ProjectID; invoiced.ProjectTaskID = line.TaskID; invoiced.AccountGroupID = account.AccountGroupID; invoiced.InventoryID = inventoryID; invoiced.CostCodeID = line.CostCodeID.GetValueOrDefault(CostCodeAttribute.GetDefaultCostCode()); invoiced = Budget.Insert(invoiced); invoiced.InvoicedAmount += line.TranAmt.GetValueOrDefault() * ARDocType.SignAmount(line.TranType); } }
public virtual void ProcessTransaction(PMProject project, PXResult <PMTran, Account, OffsetAccount, PMAccountGroup, OffsetPMAccountGroup> res, ProjectBalance pb) { PMTran tran = (PMTran)res; Account acc = (Account)res; PMAccountGroup ag = (PMAccountGroup)res; OffsetAccount offsetAcc = (OffsetAccount)res; OffsetPMAccountGroup offsetAg = (OffsetPMAccountGroup)res; IList <ProjectBalance.Result> balances = pb.Calculate(project, tran, acc, ag, offsetAcc, offsetAg); foreach (ProjectBalance.Result balance in balances) { if (balance.Status != null) { PMBudgetAccum ps = new PMBudgetAccum(); ps.ProjectID = balance.Status.ProjectID; ps.ProjectTaskID = balance.Status.ProjectTaskID; ps.AccountGroupID = balance.Status.AccountGroupID; ps.InventoryID = balance.Status.InventoryID; ps.CostCodeID = balance.Status.CostCodeID; ps.UOM = balance.Status.UOM; ps.IsProduction = balance.Status.IsProduction; ps.Type = balance.Status.Type; ps.Description = balance.Status.Description; ps = Budget.Insert(ps); ps.ActualQty += balance.Status.ActualQty.GetValueOrDefault(); ps.ActualAmount += balance.Status.ActualAmount.GetValueOrDefault(); } if (balance.TaskTotal != null) { PMTaskTotal ta = new PMTaskTotal(); ta.ProjectID = balance.TaskTotal.ProjectID; ta.TaskID = balance.TaskTotal.TaskID; ta = TaskTotals.Insert(ta); ta.Asset += balance.TaskTotal.Asset.GetValueOrDefault(); ta.Liability += balance.TaskTotal.Liability.GetValueOrDefault(); ta.Income += balance.TaskTotal.Income.GetValueOrDefault(); ta.Expense += balance.TaskTotal.Expense.GetValueOrDefault(); } foreach (PMHistory item in balance.History) { PMHistoryAccum hist = new PMHistoryAccum(); hist.ProjectID = item.ProjectID; hist.ProjectTaskID = item.ProjectTaskID; hist.AccountGroupID = item.AccountGroupID; hist.InventoryID = item.InventoryID; hist.CostCodeID = item.CostCodeID; hist.PeriodID = item.PeriodID; hist = History.Insert(hist); hist.FinPTDAmount += item.FinPTDAmount.GetValueOrDefault(); hist.FinYTDAmount += item.FinYTDAmount.GetValueOrDefault(); hist.FinPTDQty += item.FinPTDQty.GetValueOrDefault(); hist.FinYTDQty += item.FinYTDQty.GetValueOrDefault(); hist.TranPTDAmount += item.TranPTDAmount.GetValueOrDefault(); hist.TranYTDAmount += item.TranYTDAmount.GetValueOrDefault(); hist.TranPTDQty += item.TranPTDQty.GetValueOrDefault(); hist.TranYTDQty += item.TranYTDQty.GetValueOrDefault(); } } }
public virtual List <PMTask> CreateProjectTrans() { var autoAllocateTasks = new List <PMTask>(); if (Base.BatchModule.Current != null && Base.BatchModule.Current.Module != BatchModule.GL) { PXResultset <GLTran> trans = new PXSelect <GLTran, Where <GLTran.module, Equal <Current <Batch.module> >, And <GLTran.batchNbr, Equal <Current <Batch.batchNbr> >, And <GLTran.pMTranID, IsNull, And <GLTran.isNonPM, NotEqual <True> > > > > >(Base).Select(); if (trans.Count > 0) { ProjectBalance pb = CreateProjectBalance(); var tasksToAutoAllocate = new Dictionary <string, PMTask>(); var sourceForAllocation = new List <PMTran>(); var doc = new PMRegister(); doc.Module = Base.BatchModule.Current.Module; doc.Date = Base.BatchModule.Current.DateEntered; doc.Description = Base.BatchModule.Current.Description; doc.Released = true; doc.Status = PMRegister.status.Released; bool docInserted = false; //to prevent creating empty batch JournalEntryTranRef entryRefGraph = PXGraph.CreateInstance <JournalEntryTranRef>(); foreach (GLTran tran in trans) { var acc = (Account)PXSelect <Account, Where <Account.accountID, Equal <Required <GLTran.accountID> >, And <Account.accountGroupID, IsNotNull> > > .Select(Base, tran.AccountID); if (acc == null) { continue; } var ag = (PMAccountGroup)PXSelect <PMAccountGroup, Where <PMAccountGroup.groupID, Equal <Required <Account.accountGroupID> >, And <PMAccountGroup.type, NotEqual <PMAccountType.offBalance> > > > .Select(Base, acc.AccountGroupID); if (ag == null) { continue; } var project = (PMProject)PXSelect <PMProject, Where <PMProject.contractID, Equal <Required <GLTran.projectID> >, And <PMProject.nonProject, Equal <False> > > > .Select(Base, tran.ProjectID); if (project == null) { continue; } var task = (PMTask)PXSelect <PMTask, Where <PMTask.projectID, Equal <Required <GLTran.projectID> >, And <PMTask.taskID, Equal <Required <GLTran.taskID> > > > > .Select(Base, tran.ProjectID, tran.TaskID); if (task == null) { continue; } APTran apTran = null; if (Base.BatchModule.Current.Module == BatchModule.AP) { apTran = (APTran)PXSelect <APTran, Where <APTran.refNbr, Equal <Required <GLTran.refNbr> >, And <APTran.lineNbr, Equal <Required <GLTran.tranLineNbr> >, And <APTran.tranType, Equal <Required <GLTran.tranType> > > > > > .Select(Base, tran.RefNbr, tran.TranLineNbr, tran.TranType); } ARTran arTran = null; if (Base.BatchModule.Current.Module == BatchModule.AR) { arTran = (ARTran)PXSelect <ARTran, Where <ARTran.refNbr, Equal <Required <GLTran.refNbr> >, And <ARTran.lineNbr, Equal <Required <GLTran.tranLineNbr> >, And <ARTran.tranType, Equal <Required <GLTran.tranType> > > > > > .Select(Base, tran.RefNbr, tran.TranLineNbr, tran.TranType); } if (!docInserted) { doc = ProjectDocs.Insert(doc); docInserted = true; } doc.OrigDocType = entryRefGraph.GetDocType(apTran, arTran, tran); doc.OrigNoteID = entryRefGraph.GetNoteID(apTran, arTran, tran); PMTran pmt = (PMTran)ProjectTrans.Cache.Insert(); pmt.BranchID = tran.BranchID; pmt.AccountGroupID = acc.AccountGroupID; pmt.AccountID = tran.AccountID; pmt.SubID = tran.SubID; entryRefGraph.AssignCustomerVendorEmployee(tran, pmt); //CustomerLocation is lost. //pmt.BatchNbr = tran.BatchNbr; pmt.Date = tran.TranDate; pmt.TranDate = tran.TranDate; pmt.Description = tran.TranDesc; pmt.FinPeriodID = tran.FinPeriodID; pmt.TranPeriodID = tran.TranPeriodID; pmt.InventoryID = tran.InventoryID ?? PMInventorySelectorAttribute.EmptyInventoryID; pmt.OrigLineNbr = tran.LineNbr; pmt.OrigModule = tran.Module; pmt.OrigRefNbr = tran.RefNbr; pmt.OrigTranType = tran.TranType; pmt.ProjectID = tran.ProjectID; pmt.TaskID = tran.TaskID; pmt.CostCodeID = tran.CostCodeID; if (arTran != null) { pmt.Billable = false; pmt.ExcludedFromBilling = true; pmt.ExcludedFromBillingReason = arTran.TranType == ARDocType.CreditMemo ? PXMessages.LocalizeFormatNoPrefix(Messages.ExcludedFromBillingAsCreditMemoResult, arTran.RefNbr) : PXMessages.LocalizeFormatNoPrefix(Messages.ExcludedFromBillingAsARInvoiceResult, arTran.RefNbr); } else { pmt.Billable = tran.NonBillable != true; } pmt.Released = true; if (apTran != null && apTran.Date != null) { pmt.Date = apTran.Date; } pmt.UseBillableQty = true; pmt.UOM = tran.UOM; pmt.Amount = tran.DebitAmt - tran.CreditAmt; CurrencyInfo projectCuryInfo = null; if (PXAccess.FeatureInstalled <FeaturesSet.projectMultiCurrency>()) { pmt.TranCuryID = Base.BatchModule.Current.CuryID; pmt.ProjectCuryID = project.CuryID; pmt.BaseCuryInfoID = tran.CuryInfoID; pmt.TranCuryAmount = tran.CuryDebitAmt - tran.CuryCreditAmt; if (project.CuryID == Base.ledger.Current.BaseCuryID) { pmt.ProjectCuryInfoID = tran.CuryInfoID; pmt.ProjectCuryAmount = pmt.Amount; } else if (project.CuryID == Base.BatchModule.Current.CuryID) { projectCuryInfo = new CurrencyInfo(); projectCuryInfo.ModuleCode = GL.BatchModule.PM; projectCuryInfo.BaseCuryID = project.CuryID; projectCuryInfo.CuryID = project.CuryID; projectCuryInfo.CuryRateTypeID = project.RateTypeID ?? Base.CMSetup.Current.PMRateTypeDflt; projectCuryInfo.CuryEffDate = tran.TranDate; projectCuryInfo.CuryRate = 1; projectCuryInfo.RecipRate = 1; projectCuryInfo = Base.currencyinfo.Insert(projectCuryInfo); pmt.ProjectCuryInfoID = projectCuryInfo.CuryInfoID; pmt.ProjectCuryAmount = pmt.TranCuryAmount; } else { CM.Extensions.IPXCurrencyService currencyService = ServiceLocator.Current.GetInstance <Func <PXGraph, CM.Extensions.IPXCurrencyService> >()(Base); projectCuryInfo = new CurrencyInfo(); projectCuryInfo.ModuleCode = GL.BatchModule.PM; projectCuryInfo.BaseCuryID = project.CuryID; projectCuryInfo.CuryID = Base.BatchModule.Current.CuryID; projectCuryInfo.CuryRateTypeID = project.RateTypeID ?? currencyService.DefaultRateTypeID(BatchModule.PM); projectCuryInfo.CuryEffDate = tran.TranDate; var rate = currencyService.GetRate(projectCuryInfo.CuryID, projectCuryInfo.BaseCuryID, projectCuryInfo.CuryRateTypeID, projectCuryInfo.CuryEffDate); if (rate == null) { throw new PXException(PM.Messages.FxTranToProjectNotFound, projectCuryInfo.CuryID, projectCuryInfo.BaseCuryID, projectCuryInfo.CuryRateTypeID, tran.TranDate); } projectCuryInfo = Base.currencyinfo.Insert(projectCuryInfo); pmt.ProjectCuryInfoID = projectCuryInfo.CuryInfoID; decimal val; PXCurrencyAttribute.CuryConvBase(Base.BatchModule.Cache, projectCuryInfo, pmt.TranCuryAmount.GetValueOrDefault(), out val); pmt.ProjectCuryAmount = val; } } else { pmt.TranCuryAmount = pmt.Amount; pmt.ProjectCuryAmount = pmt.Amount; pmt.TranCuryID = Base.ledger.Current.BaseCuryID; pmt.ProjectCuryID = Base.ledger.Current.BaseCuryID; if (Base.BatchModule.Current.CuryID != Base.ledger.Current.BaseCuryID) { CurrencyInfo baseCuryInfo = new CurrencyInfo(); baseCuryInfo.ModuleCode = GL.BatchModule.PM; baseCuryInfo.BaseCuryID = Base.ledger.Current.BaseCuryID; baseCuryInfo.CuryID = Base.ledger.Current.BaseCuryID; baseCuryInfo.CuryRateTypeID = null; baseCuryInfo.CuryEffDate = tran.TranDate; baseCuryInfo.CuryRate = 1; baseCuryInfo.RecipRate = 1; baseCuryInfo = Base.currencyinfo.Insert(baseCuryInfo); pmt.ProjectCuryInfoID = baseCuryInfo.CuryInfoID; pmt.BaseCuryInfoID = baseCuryInfo.CuryInfoID; } else { pmt.ProjectCuryInfoID = tran.CuryInfoID; pmt.BaseCuryInfoID = tran.CuryInfoID; } } pmt.Qty = tran.Qty; //pmt.Amount >= 0 ? tran.Qty : (tran.Qty * -1); int sign = 1; if (acc.Type == AccountType.Income || acc.Type == AccountType.Liability) { sign = -1; } if (ProjectBalance.IsFlipRequired(acc.Type, ag.Type)) { pmt.ProjectCuryAmount = -pmt.ProjectCuryAmount; pmt.TranCuryAmount = -pmt.TranCuryAmount; pmt.Amount = -pmt.Amount; pmt.Qty = -pmt.Qty; } pmt.BillableQty = pmt.Qty; Base.GLTranModuleBatNbr.SetValueExt <GLTran.pMTranID>(tran, pmt.TranID); if (apTran != null && apTran.NoteID != null) { PXNoteAttribute.CopyNoteAndFiles(Base.Caches[typeof(AP.APTran)], apTran, ProjectTrans.Cache, pmt); } else if (arTran != null && arTran.NoteID != null) { PXNoteAttribute.CopyNoteAndFiles(Base.Caches[typeof(AR.ARTran)], arTran, ProjectTrans.Cache, pmt); } ProjectBalance.Result balance = pb.Calculate(project, pmt, ag, acc.Type, sign, 1); if (balance.Status != null) { PMBudgetAccum ps = new PMBudgetAccum(); ps.ProjectID = balance.Status.ProjectID; ps.ProjectTaskID = balance.Status.ProjectTaskID; ps.AccountGroupID = balance.Status.AccountGroupID; ps.InventoryID = balance.Status.InventoryID; ps.CostCodeID = balance.Status.CostCodeID; ps.UOM = balance.Status.UOM; ps.IsProduction = balance.Status.IsProduction; ps.Type = balance.Status.Type; ps.Description = balance.Status.Description; ps.CuryInfoID = balance.Status.CuryInfoID; ps = ProjectBudget.Insert(ps); ps.ActualQty += balance.Status.ActualQty.GetValueOrDefault(); ps.CuryActualAmount += balance.Status.CuryActualAmount.GetValueOrDefault(); ps.ActualAmount += balance.Status.ActualAmount.GetValueOrDefault(); if (arTran != null && arTran.LineNbr != null && ag.Type == GL.AccountType.Income) { ps.CuryInvoicedAmount -= balance.Status.CuryActualAmount.GetValueOrDefault(); ps.InvoicedAmount -= balance.Status.ActualAmount.GetValueOrDefault(); } } if (balance.ForecastHistory != null) { PMForecastHistoryAccum forecast = new PMForecastHistoryAccum(); forecast.ProjectID = balance.ForecastHistory.ProjectID; forecast.ProjectTaskID = balance.ForecastHistory.ProjectTaskID; forecast.AccountGroupID = balance.ForecastHistory.AccountGroupID; forecast.InventoryID = balance.ForecastHistory.InventoryID; forecast.CostCodeID = balance.ForecastHistory.CostCodeID; forecast.PeriodID = balance.ForecastHistory.PeriodID; forecast = ForecastHistory.Insert(forecast); forecast.ActualQty += balance.ForecastHistory.ActualQty.GetValueOrDefault(); forecast.CuryActualAmount += balance.ForecastHistory.CuryActualAmount.GetValueOrDefault(); forecast.ActualAmount += balance.ForecastHistory.ActualAmount.GetValueOrDefault(); } if (balance.TaskTotal != null) { PMTaskTotal ta = new PMTaskTotal(); ta.ProjectID = balance.TaskTotal.ProjectID; ta.TaskID = balance.TaskTotal.TaskID; ta = ProjectTaskTotals.Insert(ta); ta.CuryAsset += balance.TaskTotal.CuryAsset.GetValueOrDefault(); ta.Asset += balance.TaskTotal.Asset.GetValueOrDefault(); ta.CuryLiability += balance.TaskTotal.CuryLiability.GetValueOrDefault(); ta.Liability += balance.TaskTotal.Liability.GetValueOrDefault(); ta.CuryIncome += balance.TaskTotal.CuryIncome.GetValueOrDefault(); ta.Income += balance.TaskTotal.Income.GetValueOrDefault(); ta.CuryExpense += balance.TaskTotal.CuryExpense.GetValueOrDefault(); ta.Expense += balance.TaskTotal.Expense.GetValueOrDefault(); } RegisterReleaseProcess.AddToUnbilledSummary(Base, pmt); sourceForAllocation.Add(pmt); if (pmt.Allocated != true && pmt.ExcludedFromAllocation != true && project.AutoAllocate == true) { if (!tasksToAutoAllocate.ContainsKey(string.Format("{0}.{1}", task.ProjectID, task.TaskID))) { tasksToAutoAllocate.Add(string.Format("{0}.{1}", task.ProjectID, task.TaskID), task); } } entryRefGraph.AssignAdditionalFields(tran, pmt); } autoAllocateTasks.AddRange(tasksToAutoAllocate.Values); } } return(autoAllocateTasks); }