Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method AddStockingPoints ( 
 | 
  StockingPoint_MPs stockingpoints, 
 | 
  Boolean asorigin, 
 | 
  Boolean isfromdb 
 | 
) 
 | 
{ 
 | 
  Description: 'Create stocking point in lane instances and create lane leg if necessary' 
 | 
  TextBody: 
 | 
  [* 
 | 
    spiltocreatelegs := construct( StockingPointInLanes ); 
 | 
     
 | 
    traverse( stockingpoints, Elements, stockingpoint ) 
 | 
    { 
 | 
      /* 
 | 
        In most cases, a StockingPointInLane will have either its OriginLaneID or DestinationLane ID left blank. 
 | 
        This usually occurs when the origin and destination are in different lanes. 
 | 
     
 | 
        However, there is also a case when a stocking point is assigned to both origin and destination in lane. 
 | 
        In such case, there should be only one StockingPointInLane created, with its origin and destination 
 | 
        set to the same LaneID. 
 | 
     
 | 
        Using the FindStockingPointInLaneTypeIndex method will create another StockingPointInLane, instead 
 | 
        of detecing existing one ( and update its OriginLaneID/DestinationLaneID attribute ) 
 | 
     
 | 
        Hence, we will use select instead. 
 | 
      */ 
 | 
      originlaneid := ifexpr( asorigin, this.ID(), '' ); 
 | 
      destinationlaneid := ifexpr( asorigin, '', this.ID() ); 
 | 
       
 | 
      createlaneleg := false; 
 | 
         
 | 
     
 | 
      spil := ifexpr( asorigin, 
 | 
                      select( this, Destination, spil, // Check whether existing SPIL exists in destination 
 | 
                              spil.StockingPointID() = stockingpoint.ID() 
 | 
                              and spil.DestinationLaneID() = this.ID() ), 
 | 
                      select( this, Origin, spil, // Check whether existing SPIL exists in origin 
 | 
                              spil.StockingPointID() = stockingpoint.ID() 
 | 
                              and spil.OriginLaneID() = this.ID() ) ); 
 | 
       
 | 
      isopposite := true;  
 | 
      if( isnull( spil ) ) 
 | 
      { 
 | 
        isopposite := false; 
 | 
        spil := ifexpr( asorigin, 
 | 
                      select( this, Origin, e, // Check whether existing SPIL exists in origin 
 | 
                              e.StockingPointID() = stockingpoint.ID() 
 | 
                              and e.OriginLaneID() = this.ID() ), 
 | 
                      select( this, Destination, e, // Check whether existing SPIL exists in destination 
 | 
                              e.StockingPointID() = stockingpoint.ID() 
 | 
                              and e.DestinationLaneID() = this.ID() ) ); 
 | 
      } 
 | 
       
 | 
      if( isnull( spil ) ) 
 | 
      { 
 | 
         
 | 
        spil := StockingPointInLane::Create( stockingpoint, originlaneid, destinationlaneid ); 
 | 
        createlaneleg := true; 
 | 
      } 
 | 
      else if( isopposite )// to determine the origin and destination are from the same stockingpoint 
 | 
      { 
 | 
        if( asorigin ) 
 | 
        { 
 | 
          originlaneid := spil.DestinationLaneID(); 
 | 
          destinationlaneid := spil.DestinationLaneID(); 
 | 
          createlaneleg := createlaneleg or not ( spil.AsOrigin() = this );     // lane leg has to be created if the stocking point is assigned as new origin 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
          originlaneid := spil.OriginLaneID() 
 | 
          destinationlaneid := spil.OriginLaneID(); 
 | 
          createlaneleg := createlaneleg or not ( spil.AsDestination() = this );  // lane leg has to be created if the stocking point is assigned as new destination 
 | 
        } 
 | 
     
 | 
        spil.UpdateTypeIndex( stockingpoint.ID(), originlaneid, destinationlaneid, false ); 
 | 
      } 
 | 
     
 | 
      if( createlaneleg and ( not isfromdb ) ) 
 | 
      { 
 | 
        spiltocreatelegs.Add( spil ); 
 | 
      } 
 | 
     
 | 
      // Create product in stocking point based on product in lanes 
 | 
      traverse( this, ProductInLane, pil ) 
 | 
      { 
 | 
        pil.Product_MP().AddToStockingPoint( spil.StockingPoint_MP() ); 
 | 
      }  
 | 
    } 
 | 
    // Propagate the origin relation, when there is existing spil and sp had been added as origin/destination 
 | 
    Transaction::Transaction().Propagate( ifexpr( asorigin, relation( Lane, Origin ), 
 | 
                                                            relation( Lane, Destination ) ) ); 
 | 
     
 | 
    // Create lane legs 
 | 
    traverse( spiltocreatelegs, Elements, e ) 
 | 
    { 
 | 
      this.CreateLaneLegs( e, asorigin ); 
 | 
    } 
 | 
  *] 
 | 
} 
 |