예제 #1
0
 public static void DunningLetterProc(DunningLetterMassProcess aGraph, ARDunningLetterList aCard)
 {
     aGraph.DunningLetterProc(aCard);
 }
예제 #2
0
        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);
            }
        }