Showing posts with label Subscription billing. Show all posts
Showing posts with label Subscription billing. Show all posts

Thursday, December 7, 2023

Code to update data for custom fields in SubBillScheduleLine lines which are created from milestone allocation in D365 f&o X++

[Extensionof(tableStr(SubBillScheduleLine))]

internal final class DaxSubBillScheduleLine_Extension

{

   public void recreateMilestoneSubItems(SubBillMilestoneAllocationHeader _milestoneAllocationHeader)

   {

       SubBillScheduleLine milestoneSubLine;

       SubBillMilestoneAllocationLine  allocationLine;

       while select allocationLine

           where allocationLine.SubBillSchedLineRecId == _milestoneAllocationHeader.SubBillSchedLineRecId

       {

           select forupdate milestoneSubLine

               where milestoneSubLine.RecId == allocationLine.SubBillSchedLineRecId;

           ttsbegin;

           milestoneSubLine.DaxEnum = DaxEnum::Advanced; //custom field

           milestoneSubLine.update();

           ttscommit;

       }

       next recreateMilestoneSubItems(_milestoneAllocationHeader);

   }

   public void insert()

   {

       SubBillScheduleLine milestoneSubLine;

       select milestoneSubLine

           where milestoneSubLine.SubBillMilestoneHeaderRecId == this.SubBillMilestoneHeaderRecId;

       this.DaxStatus = milestoneSubLine.DaxStatus; //custom field

       next insert();

   }

}

..............

Subsription billing > All Billing Schedules

Create a header and line and click on Milestone Allocation.




Lines from milestone will be created in SubBillScheduleLines. And custom fields will be updated.







Tuesday, October 31, 2023

Code to populate data from BillingSchedule to SalesOrder for custom fields in D365 X++

 [Extensionof(classStr(SubBillCreateSalesOrder))]

internal final class DaxSubBillCreateSalesOrder_Extension

{

   public static SalesTable initSalesTable(

       SalesTable _salesTable,

       boolean _isInvoiceCreator,

       NumberSeq _numberSeq,

       SubBillSalesLineConsolidated _salesLineConsolidated,

       ParmId _curParmId)

   {

      

       SubBillScheduleTable    subBillScheduleTable;

 

       next initSalesTable(_salesTable,_isInvoiceCreator,_numberSeq,_salesLineConsolidated,_curParmId);

    

       select subBillScheduleTable

           where subBillScheduleTable.SubBillBillingScheduleNumber == _salesLineConsolidated.SubBillBillingScheduleNumber;

       _salesTable.DaxName = subBillScheduleTable.DaxName;

 

       return _salesTable;

   }

}

.........................

Output :

SB>All Billing Schedules


AR>All sales Orders






Tuesday, October 10, 2023

Code to terminate the schedule line in D365F&O X++

 

public static void main(Args _args)

   {

       SubBillScheduleTable    SubBillScheduleTable;

       SubBillScheduleLine     SubBillScheduleLine;

       SubBillTerminationType  enumtype = SubBillTerminationType::AdjustSchedule;

       int numLinesProcessed = 0;

 

       select SubBillScheduleTable

           where SubBillScheduleTable.SubBillBillingScheduleNumber == "USMF-000000001";

      while select SubBillScheduleLine

           where SubBillScheduleLine.SubBillBillingScheduleNumber ==  SubBillScheduleTable.SubBillBillingScheduleNumber

           && SubBillScheduleLine.SubBillScheduleStatus == SubBillScheduleStatus::Active

       {

           SubBillScheduleLine.terminate(mkDate(04,10,2023),enumtype,"PRICE","price","");

           //SubBillScheduleTable.checkScheduleTermination();

           ++numLinesProcessed;

       }

       if (numLinesProcessed == 1)

       {

           info("@SubBill:OneScheduleLineTerminated");

       }

       else

       {

           info(strFmt("@SubBill:ScheduleLinesTerminated", numLinesProcessed));

       }

   }

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 :