Tuesday, October 10, 2023

Code to terminate with refund the billing schedule line in D365 X++

 

public static void main(Args _args)

   {

       boolean                             isScheduleHeader;

       SubBillScheduleTable                scheduleTable = SubBillScheduleTable::find("USMF-000000001");

       SubBillScheduleLine                 lineTable,billingScheduleLine;

       SubBillMassTerminationParmLine      parmLine,subBillMassTerminationParmLine;

       RecordInsertList                    parmLineList;

       SubBillMassTerminationParmUpdate    parmUpdate,massTerminationParmUpdate;

       parmId                              parmId,curParmId;

       SubBillCreditOption                 enumtype;

       SubBillTerminationType              termEnumType;

       SubBillScheduleLineTmp              subBillScheduleLineTmp;

 

 

       select firstonly lineTable where lineTable.SubBillScheduleStatus == SubBillScheduleStatus::Active

       && lineTable.SubBillBillingScheduleNumber == scheduleTable.SubBillBillingScheduleNumber;

 

       parmId = NumberSeq::newGetNum(CompanyInfo::numRefParmId()).num();

       SubBillMassTerminationParmUpdate::createFromParmId(parmId);

 

       ttsbegin;

       select forupdate parmUpdate where parmUpdate.ParmId == parmId;

       parmUpdate.SubBillOpenedFromHeader  = isScheduleHeader;

       parmUpdate.SubBillInvTransType      = scheduleTable.SubBillInvTransType;

       parmUpdate.SubBillTerminationType   = isScheduleHeader ? scheduleTable.SubBillTerminationType : lineTable.SubBillTerminationType;

       parmUpdate.SubBillIssueCredit       = (parmUpdate.SubBillTerminationType != SubBillTerminationType::NoAdjustment);

       parmUpdate.SubBillTerminationDate   = DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());

       parmUpdate.SubBillTermReasonCode    = 'PRICE';

       parmUpdate.SubBillTermNotes         = '';

       parmUpdate.SubBillCreditOption      = str2Enum(enumtype,'Issue credit');

       parmUpdate.TransDate = DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());

       parmUpdate.update();

 

       parmLineList = new RecordInsertList(tableNum(SubBillMassTerminationParmLine));

      

 

       if (isScheduleHeader)

       {

           while select billingScheduleLine where billingScheduleLine.SubBillScheduleStatus == SubBillScheduleStatus::Active

           && billingScheduleLine.SubBillBillingScheduleNumber == scheduleTable.SubBillBillingScheduleNumber

           {

                parmLine.initializeParmLine(scheduleTable, billingScheduleLine, parmUpdate);

                parmLineList.add(parmLine);

           }

       }

       else

       {

           Container lineNumbers;

 

           parmLine.initializeParmLine(scheduleTable, lineTable, parmUpdate);

           parmLineList.add(parmLine);

           lineNumbers += lineTable.LineNum;

       }

 

       parmLineList.insertDatabase();

       ttscommit;

 

       massTerminationParmUpdate = SubBillMassTerminationParmUpdate::find(parmId);

       curParmId = parmId;

       ttsbegin;

       delete_from subBillScheduleLineTmp

       where subBillScheduleLineTmp.ParmId == curParmId;

 

       parmLineList = new RecordInsertList(tableNum(SubBillScheduleLineTmp), true, true, true, false, true, subBillScheduleLineTmp);

 

       while select * from subBillMassTerminationParmLine

       where subBillMassTerminationParmLine.ParmId == curParmId

       {

           subBillScheduleLineTmp.clear();

           subBillScheduleLineTmp.ParmId = curParmId;

           subBillScheduleLineTmp.ScheduleLnRecId = subBillMassTerminationParmLine.ScheduleLnRecId;

           //Only set refund amount if IssueCredit is true, otherwise, leave it 0

           if (massTerminationParmUpdate.SubBillIssueCredit)

           {

               subBillScheduleLineTmp.RefundAmount = subBillMassTerminationParmLine.RefundAmount;

           }

           subBillScheduleLineTmp.TotalLineAmount = subBillMassTerminationParmLine.TotalLineAmount;

           parmLineList.add(subBillScheduleLineTmp);

       }

       parmLineList.insertDatabase();

       ttscommit;

 

       // Using common code to get the count of the termination lines.

       int countLines = SubBillMassTermination::massTerminationProcess(massTerminationParmUpdate, subBillScheduleLineTmp);

       if (countLines == 1)

       {

           info("@SubBill:OneScheduleLineTerminated");

       }

       // Clear temp tables.

       ttsbegin;

       SubBillScheduleLineTmp subBillScheduleLineTmp1;

       delete_from subBillScheduleLineTmp1

       where subBillScheduleLineTmp1.ParmId == curParmId;

 

       SubBillMassTerminationParmLine subBillMassTerminationParmLine1;

       delete_from subBillMassTerminationParmLine1

       where subBillMassTerminationParmLine1.ParmId == curParmId;

 

       SubBillMassTerminationParmUpdate subBillMassTerminationParmUpdate;

       delete_from subBillMassTerminationParmUpdate

       where subBillMassTerminationParmUpdate.ParmId == curParmId;

       ttscommit;

   }

}


Output :







1 comment: