Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method GetLastAllowedPostponementPeriodEnd () declarative as DateTime 
 | 
{ 
 | 
  Description: 'Calculate period end of last allowed period where planning SDiPs are allowed to postpone to' 
 | 
  TextBody: 
 | 
  [* 
 | 
    value := DateTime::MinDateTime(); 
 | 
    macroplanEnd := this.MasterSalesDemand().MacroPlan().End(); 
 | 
    haseffectivepostponementspecification := guard( this.MasterSalesDemand().SalesSegment_MP().HasEffectivePostponementSpecification(), false );  
 | 
     
 | 
    if( haseffectivepostponementspecification ) 
 | 
    { 
 | 
      ps := this.PostponementSpecification(); 
 | 
       
 | 
      // Use SDiP EndDate to find as Period_MP end date might not be the same with SDiP End 
 | 
      if( not isnull( ps ) ) 
 | 
      { 
 | 
        effectiveEnd := this.EndDate().DateTime(); 
 | 
        // If start = end (e.g CustomerOrder which only has start date), have the End based on PISPIP End else logic has less period to postpone to 
 | 
        if( this.StartDate() = this.EndDate() and not isnull( this.AsSalesDemandInPeriodBase() ) ) 
 | 
        { 
 | 
          effectiveEnd := this.AsSalesDemandInPeriodBase().End();  
 | 
        } 
 | 
        value := PeriodSpecification_MP::GetStartOfNextPeriod( effectiveEnd,  
 | 
                                                               ps.MaxTimeUnit(),  
 | 
                                                               ps.MaxNrOfTimeUnit() ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    // Postponement period horizon end must not exceed planning horizon end 
 | 
    value := minvalue( value, macroplanEnd );   
 | 
     
 | 
    return value; 
 | 
  *] 
 | 
} 
 |