public static void DunningLetterProc(DunningLetterMassProcess aGraph, ARDunningLetterList aCard) { aGraph.DunningLetterProc(aCard); }
protected virtual IEnumerable dunningLetterList() { this.DunningLetterList.Cache.Clear(); ARDunningLetterRecordsParameters header = Filter.Current; if (header == null || header.DocDate == null) { yield break; } bool Cons = false; int? DBranch = null; bool canAccessToBranch = false; try { ARSetup SetupV = PXSelect <ARSetup, Where <MatchWithBranch <ARSetup.dunningLetterBranchID> > > .Select(this); if (SetupV != null) { Cons = SetupV.ConsolidatedDunningLetter ?? false; DBranch = SetupV.DunningLetterBranchID; canAccessToBranch = true; } } catch {} if (!canAccessToBranch) { yield break; } //Select due customers. (ARInvoice.dueDate < "current date") int?OldBAccount = null; int?OldBranch = null; foreach (PXResult <Customer, ARInvoice> item in PXSelectJoinGroupBy <Customer, InnerJoin <ARInvoice, On <ARInvoice.customerID, Equal <Customer.bAccountID> > >, Where <ARInvoice.released, Equal <boolTrue>, And <ARInvoice.openDoc, Equal <boolTrue>, And <ARInvoice.voided, Equal <boolFalse>, And <Where <ARInvoice.docType, Equal <ARDocType.invoice>, Or <ARInvoice.docType, Equal <ARDocType.finCharge>, And <ARInvoice.dueDate, Less <Required <ARDunningLetterRecordsParameters.docDate> > > > > > > > >, Aggregate <GroupBy <Customer.bAccountID, GroupBy <ARInvoice.branchID> > > > .Select(this, header.DocDate)) { Customer cust = item; ARInvoice br = item; if (header.CustomerClassID != null) { if (cust.CustomerClassID != header.CustomerClassID) { continue; // CustomerClassID filter } } int?BranchID = (Cons ? DBranch : br.BranchID); if ((BranchID == OldBranch) && (OldBAccount == cust.BAccountID)) { continue; // Group by BranchID } if (OldBAccount != cust.BAccountID) { OldBranch = null; OldBAccount = cust.BAccountID; } OldBranch = BranchID; ARDunningLetterList rec = new ARDunningLetterList(); rec.CustomerClassID = cust.CustomerClassID; rec.BAccountID = cust.BAccountID; rec.BranchID = BranchID; rec.DocDate = header.DocDate; bool Show = true; DateTime maxRD = DateTime.MinValue; int rlevel = 0; //Find last active (not closed) Dunning Letter for each Customer foreach (PXResult <ARDunningLetter> ii in PXSelectJoinGroupBy <ARDunningLetter, InnerJoin <ARDunningLetterDetail, On <ARDunningLetterDetail.dunningLetterID, Equal <ARDunningLetter.dunningLetterID>, And <ARDunningLetterDetail.overdue, Equal <boolTrue> > >, InnerJoin <ARInvoice, On <ARInvoice.docType, Equal <ARDunningLetterDetail.docType>, And <ARInvoice.refNbr, Equal <ARDunningLetterDetail.refNbr>, And <ARInvoice.released, Equal <boolTrue>, And <ARInvoice.openDoc, Equal <boolTrue>, And <ARInvoice.voided, Equal <boolFalse> > > > > > > >, Where <ARDunningLetter.bAccountID, Equal <Required <ARDunningLetter.bAccountID> >, And <ARDunningLetter.branchID, Equal <Required <ARDunningLetter.branchID> > > >, Aggregate <GroupBy <ARDunningLetter.dunningLetterLevel, GroupBy <ARDunningLetter.dunningLetterDate> > > > .Select(this, cust.BAccountID, BranchID)) { ARDunningLetter RR = ii; if (maxRD < RR.DunningLetterDate.Value) { maxRD = RR.DunningLetterDate.Value; rlevel = RR.DunningLetterLevel.Value; } } if (rlevel >= D_MaxLevel) { Show = false; // Dunning Letter max level is exceeded } else if (rlevel > 0) // has active Dunning Letter { if (maxRD.AddDays(D_DueDays[rlevel]) > header.DocDate.Value) { Show = false; //Letter is not overdue, not process } } if (Show) // need to process { rec.NumberOfDocuments = 0; rec.NumberOfOverdueDocuments = 0; rec.OrigDocAmt = 0; rec.DocBal = 0; DateTime minD = DateTime.Today; // Selecl all invoices foreach (PXResult <ARInvoice> ix in PXSelect <ARInvoice, Where <ARInvoice.customerID, Equal <Required <ARInvoice.customerID> >, And <ARInvoice.released, Equal <boolTrue>, And <ARInvoice.openDoc, Equal <boolTrue>, And <ARInvoice.voided, Equal <boolFalse>, And <Where <ARInvoice.docType, Equal <ARDocType.invoice>, Or <ARInvoice.docType, Equal <ARDocType.finCharge>, And <ARInvoice.docDate, Less <Required <ARInvoice.docDate> > > > > > > > > > > .Select(this, cust.BAccountID, header.DocDate)) { ARInvoice dl = ix; if (!Cons && dl.BranchID != BranchID) { continue; // alien branch } minD = minD < dl.DueDate.Value ? minD : dl.DueDate.Value; rec.NumberOfDocuments++; rec.NumberOfOverdueDocuments += (dl.DueDate > header.DocDate ? 0 : 1); rec.OrigDocAmt += dl.DocBal; rec.DocBal += (dl.DueDate > header.DocDate ? 0 : dl.DocBal); } rec.DunningLetterLevel = rlevel + 1; rec.DueDate = minD; ARDunningSetup settings = this.DunningSetupList[rlevel]; rec.DueDays = (settings.DaysToSettle ?? 0); //rec.DueDays = D_DueDays[rlevel]; if (rlevel > 0) { rec.LastDunningLetterDate = maxRD; } else { rec.LastDunningLetterDate = null; } if (minD.AddDays(D_DueDays[rlevel]) < header.DocDate) //Has at least one overdue invoice { try { this.DunningLetterList.Insert(rec); } catch {} } } } this.DunningLetterList.Cache.IsDirty = false; foreach (ARDunningLetterList ret in this.DunningLetterList.Cache.Inserted) { yield return(ret); } }