Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method ResetPeriodTasksAndResetKPI ( 
 | 
  Boolean resetmanual, 
 | 
  Boolean resetoptimizer, 
 | 
  OptimizerPuzzle optimizerpuzzle, 
 | 
  Date unplanafterstart 
 | 
) 
 | 
{ 
 | 
  Description: 'Reset period tasks and update KPI' 
 | 
  TextBody: 
 | 
  [* 
 | 
    // FrozenPeriod moves to Unit level 
 | 
    // During reset, to traverse all active LeadingPeriod, then only filter out frozen PT 
 | 
     
 | 
    // Handleing case null( OptimizerPuzzle ) 
 | 
    if( isnull( optimizerpuzzle ) ) 
 | 
    { 
 | 
      optimizerpuzzle := this.OptimizerPuzzleWorld();   
 | 
    } 
 | 
     
 | 
    // Use the logic used by the dialog to create all subsets 
 | 
    // Populate the IsInclduedFinal 
 | 
    // We get the 100% correct result for unit, product, stocking point 
 | 
     
 | 
    // Getting list of included units / included products / included stockingpoint  
 | 
    // Prevent from calling GetIncludedUnits multiple times 
 | 
    includedUnits := optimizerpuzzle.GetIncludedUnits(); 
 | 
    includedProducts := optimizerpuzzle.GetIncludedProducts(); 
 | 
    includedStockingPoint := optimizerpuzzle.GetIncludedStockingPoints( includedUnits ); 
 | 
    includedPISP := optimizerpuzzle.GetIncludedPISP( includedProducts, includedStockingPoint ); 
 | 
     
 | 
    // Reset PeriodTasks 
 | 
    // Get routings with Operations and pisps included in the optimizer puzzle scope 
 | 
    routings := optimizerpuzzle.GetIncludedRoutings( includedUnits, includedPISP );  
 | 
     
 | 
    // Traverse in scope routings in order to reset PeriodTask operation not frozen 
 | 
    traverse( routings, Elements, routing ) 
 | 
    { 
 | 
       routing.ResetRouting( resetmanual, resetoptimizer, unplanafterstart ); 
 | 
    } 
 | 
     
 | 
    // Reset Trips 
 | 
    // Get process Laneleg in optimizer puzzle scope ( Unit, destination StockingPoint_MP in scope ) 
 | 
    processesLaneleg := optimizerpuzzle.GetIncludedLaneLegs( includedUnits, includedPISP ); 
 | 
     
 | 
    // Reset products in trips only if the product in trip is in scope ( Product_MP in scope ) 
 | 
    traverse( processesLaneleg, Elements.Trip.ProductInTrip, pit, optimizerpuzzle.IsProductIncluded( pit.Product_MP(), includedProducts ) and pit.Trip().Departure().Date() >= unplanafterstart ) 
 | 
    { 
 | 
      pit.ResetProductInTrip( resetmanual, resetoptimizer ); 
 | 
    } 
 | 
     
 | 
     
 | 
    // Some pispips do not have new supply and period task due to pre & post-processing time. 
 | 
    traverse( this, Unit.Process_MP.ProcessOutput.ProductInStockingPoint_MP, pisp, pisp.IsLeaf() ) 
 | 
    { 
 | 
      traverse( pisp, ProductInStockingPointInPeriodPlanning.astype( ProductInStockingPointInPeriodPlanningLeaf ), p, not p.IsPeriodFrozen() and p.Start().Date() >= unplanafterstart ) 
 | 
      {   
 | 
        if(  p.NewSupply( relsize ) = 0 ) 
 | 
        { 
 | 
          p.ResetQuantitySetByOptimizer();  
 | 
        } 
 | 
         
 | 
        p.MergeSalesDemand( resetmanual ) 
 | 
      } 
 | 
    } 
 | 
     
 | 
    if( resetmanual ) 
 | 
    { 
 | 
      traverse( this, Period_MP.ProductInStockingPointInPeriod, pispip, pispip.Start().Date() >= unplanafterstart ) 
 | 
      { 
 | 
        pispip.UpdateTotalSupplyUser( false, 0.0 ); 
 | 
        pispip.UpdateTotalAvailableSupplyUser( false, 0.0 ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    // Remove pegging 
 | 
    this.RemovePegging( resetmanual, resetoptimizer ); 
 | 
     
 | 
    // Calculate KPI Score 
 | 
    this.CalculateKPIScore( false ); 
 | 
     
 | 
    this.UpdateLastPlanningAction( true, false, false, false ); // isReset, isPlan, isRoll, isLockUnlock 
 | 
     
 | 
    // Change lastUsedReset OptimizerPuzzle 
 | 
    if( not isnull( optimizerpuzzle ) ) 
 | 
    {  
 | 
      optimizerpuzzle.ChangeLastUsedResetPuzzle(); 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Extensible' } 
 | 
} 
 |