| Quintiq file version 2.0 | 
| #parent: #root | 
| Method GenerateMoves | 
| { | 
|   Description: 'Creates the moves that will be used in the inventory optimization algorithm. Each move adjust the target inventory of one or more inventory specificaitons.' | 
|   TextBody: | 
|   [* | 
|     // edz1 Aug-31-2016 (created) | 
|      | 
|     // Create the missing inventory specifications  | 
|     // Any PISP with IsSafetyStockKept to true, should have an inventory specification | 
|     traverse( this, MacroPlan.Product_MP.ProductInStockingPoint_MP, pisp,  | 
|               pisp.IsSafetyStockKept() | 
|               and pisp.InventorySpecification( relsize ) = 0 ) | 
|     { | 
|       invspec := InventorySpecification::Create( pisp.Product_MP(), | 
|                                                  pisp.StockingPoint_MP(), | 
|                                                  this.MacroPlan().StartOfPlanning().Date(), | 
|                                                  false, 0.0, 0.0,            // Does not have a target in days, the initial targets are 0 | 
|                                                  false, 0.0, 0.0,            // Does not have a minimum in days, the initial minimums are 0 | 
|                                                  false, false, 0.0, 0.0,     // Does not have a maximum, does not have a maximum in days, the initial maximums are 0 | 
|                                                  true, false );            // Is calculated and is not from database  | 
|                                                   | 
|       // We need to make sure HasKeepSafetyStockPISP value is set properly, otherwise we will not create the moves | 
|       invspec.CalcHasKeepSafetyStockPISP();                              | 
|     } | 
|      | 
|     // The relation between PISPIP and InventorySpecification must be updated, otherwise the inventory specifications in service level cannot be created | 
|     Transaction::Transaction().Propagate( relation( ProductInStockingPointInPeriod, InventorySpecification ) ); | 
|      | 
|     // Synchronize the InventorySpecificationInServiceLevel instances based on the latest data | 
|     traverse( this, MacroPlan.AllServiceLevelBase, servicelevel ) | 
|     { | 
|       servicelevel.SynchronizeInventorySpecInServiceLevel(); | 
|     } | 
|      | 
|     // Delete all existing moves before creating new moves | 
|     traverse( this, Move, move ) | 
|     { | 
|       Move::Delete( move ); | 
|     } | 
|      | 
|     // Update the relation from  | 
|      | 
|     // Create an increase/decrease move for all inventory specifications that can impact at least one service level | 
|     traverse( this, MacroPlan.Product_MP.InventorySpecification, inventoryspecification,  | 
|               inventoryspecification.InventorySpecificationInServiceLevel( relsize ) > 0 | 
|               and inventoryspecification.HasKeepSafetyStockPISP() )  | 
|     { | 
|       MoveStep::Create( inventoryspecification, this, true );  // increase  | 
|       MoveStep::Create( inventoryspecification, this, false ); // decrease | 
|     } | 
|      | 
|     // Create a swap move between each pair of inventory specifications that are linked by at least one inventoryspecification in servicelevel | 
|     traverse( this, MacroPlan.Product_MP.InventorySpecification, invspec1, | 
|               invspec1.HasKeepSafetyStockPISP() ) | 
|     { | 
|       relatedinvspecs := selectset( invspec1, InventorySpecificationInServiceLevel.ServiceLevelBase.InventorySpecificationInServiceLevel.InventorySpecification, invspec2, | 
|                                     invspec2.HasKeepSafetyStockPISP() | 
|                                     and invspec1 <> invspec2 ).Unique(); | 
|      | 
|       traverse( relatedinvspecs, Elements, invspec2 ) | 
|       { | 
|         MoveSwap::Create( invspec1, invspec2, this ) | 
|       } | 
|     } | 
|   *] | 
| } |