Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod CanDragAndDropStockingPointNodes ( 
 | 
  Unit dpfocusedunit, 
 | 
  output String feedback_o, 
 | 
  StockingPoint_MPs stockingpoints 
 | 
) as Boolean 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    If current supply chain view is displaying all root unit, dragging and dropping of resource nodes should not be allowed (Resource nodes are unit nodes that has parent) 
 | 
    control / shift key is to prevent collision with other drag and drop. 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    feedback_o := ''; 
 | 
     
 | 
    /* 
 | 
    Count how many number of selected stocking points which do not belong to any unit 
 | 
    If there are none, (e.g. all stocking points belong to a unit), proceed with the next check 
 | 
    If there are some. (e.g. still have some stocking points belong to a unit), drag and drop should not be allowed. 
 | 
    If all of them do not belong to any unit, drag and drop is only allowed in root level. 
 | 
    */ 
 | 
     
 | 
    nullsp := counter( stockingpoints, Elements, sp, isnull( sp.Unit() ) ); 
 | 
     
 | 
    if( nullsp = 0 ) 
 | 
    { 
 | 
      // Check whether the selected stocking points belong to the units of same level 
 | 
      if( stockingpoints.Size() > 0 and exists( stockingpoints, Elements, sp, 
 | 
                                                sp.Unit() <> stockingpoints.Element( 0 ).Unit() ) ) 
 | 
      { 
 | 
        feedback_o := Translations::MP_SupplyChainView_CanDragAndDropStockingPointNodes_DifferentLevel(); 
 | 
      } 
 | 
     
 | 
      else 
 | 
      { 
 | 
        level := stockingpoints.Element( 0 ).Unit().Level() + 1; //+ 1 because stocking point belongs to that unit. 
 | 
        parentname := guard( stockingpoints.Element( 0 ).Unit().Name(), '' ); 
 | 
     
 | 
        if( not isnull( dpfocusedunit )  ) 
 | 
        { 
 | 
          //e.g. Units dragged is level 3, current focusedunit is level 1 
 | 
          if( dpfocusedunit.Level() + 1 <> level or parentname <> dpfocusedunit.Name() ) 
 | 
          { 
 | 
            feedback_o := Translations::MP_SupplyChainView_CanDragAndDropStockingPointNodes_DrillTowards( parentname ); 
 | 
          } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            feedback_o := Translations::MP_SupplyChainView_CanDragAndDropStockingPointNodes_DrillTowards( parentname ); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
     
 | 
    else if( nullsp < stockingpoints.Size() ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_SupplyChainView_CanDragAndDropStockingPointNodes_DifferentLevel(); 
 | 
    } 
 | 
     
 | 
    else if( nullsp = stockingpoints.Size() and not isnull( dpfocusedunit ) ) 
 | 
    { 
 | 
      feedback_o := Translations::MP_SupplyChainView_CanDragAndDropStockingPointNodes_DrillTowardsRootLevel(); 
 | 
    } 
 | 
     
 | 
    return feedback_o = ''; 
 | 
  *] 
 | 
} 
 |