Quintiq file version 2.0
#parent: #root
Method ReturnEdgeLabel (
  output owning shadow[SCVConfiguration] scvConfig,
  shadow[SCVNode] sourcenode,
  shadow[SCVNode] targetnode,
  output Real quantity_o
) as String id:Method_FormSupplyChainVisualization_ReturnEdgeLabel
{
  #keys: '[134266.1.1639225912]'
  Body:
  [*
    // Return edge label of this edge
    label := '';
    period := scvConfig.Period_MP();
    pisps := construct( ProductInStockingPoint_MPs );
    operations := construct( Operations );
    lane := null( Lane );
    targetPISPIP := null( ProductInStockingPoint_MP );
    tooltip := '';
    
    // RoutingStep node to other nodes
    if( sourcenode.istype( shadow[SCVRoutingStepNode] ) )
    {
      sourceNode := sourcenode.astype( shadow[SCVRoutingStepNode] );
      operations := selectset( sourceNode, OperationInNode.Operation, op, true );
      
      if( targetnode.istype( shadow[SCVPISPIPNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVPISPIPNode] );
        pisps := pisps.Merge( targetNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP() )
      }
      else if( targetnode.istype( shadow[SCVRoutingStepNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVRoutingStepNode] );
        pisps := selectset( targetNode, OperationInNode.Operation.OperationInput.ProductInStockingPoint_MP, pisp, true )
      }
      
      quantity_o := SCVEdge::GetProcessQuantity( period, operations, pisps, false /*isdependentdemand*/, tooltip );  
    }  
    
    // PISPIP node to other nodes
    else if( sourcenode.istype( shadow[SCVPISPIPNode] ) )
    {
      sourceNode := sourcenode.astype( shadow[SCVPISPIPNode] );
      pisps := pisps.Merge( sourceNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP() )
      
      if( targetnode.istype( shadow[SCVRoutingStepNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVRoutingStepNode] );
        operations := selectset( targetNode, OperationInNode.Operation, op, true );
        
        quantity_o := SCVEdge::GetProcessQuantity( period, operations, pisps, true /*isdependentdemand*/, tooltip ); 
      }
      else if( targetnode.istype( shadow[SCVLaneNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVLaneNode] );
        lane := targetNode.Lane();
        isupstream := targetNode.IsUpstream();
        
        if( isupstream )
        {
          targetPISPIPNode := select( scvConfig, SCVNode, node, node.Key().AsQUILL() = targetNode.OwnerNodeKey() ).astype( shadow[SCVPISPIPNode] );
          targetPISPIP := targetPISPIPNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP();
        }
        
        quantity_o := SCVEdge::GetProcessQuantity( period, lane, pisps, targetPISPIP, true /*isdependentdemand*/, isupstream, tooltip ); 
      }
      else if( targetnode.istype( shadow[SCVSDNode] ) )
      {
        quantity_o := SCVEdge::GetProcessQuantity( sourceNode.ProductInStockingPointInPeriod(), tooltip );
      }
    }
    
    // Lane node to PISPIP node
    else if( sourcenode.istype( shadow[SCVLaneNode] ) )
    {
      sourceNode := sourcenode.astype( shadow[SCVLaneNode] );
      lane := sourceNode.Lane();
      
      if( targetnode.istype( shadow[SCVPISPIPNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVPISPIPNode] );
        isupstream := sourceNode.IsUpstream(); 
        
        if( not isupstream )
        {
          targetPISPIPNode := select( scvConfig, SCVNode, node, node.Key().AsQUILL() = sourceNode.OwnerNodeKey() ).astype( shadow[SCVPISPIPNode] );
          targetPISPIP := targetPISPIPNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP();
        }    
        pisps := pisps.Merge( targetNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP() )
      } 
      
      quantity_o := SCVEdge::GetProcessQuantity( period, lane, pisps, targetPISPIP, false /*isdependentdemand*/, sourceNode.IsUpstream(), tooltip );  
    }
    
    // Inventory supply node to PISPIP node
    else if( sourcenode.istype( shadow[SCVISNode] ) )
    {
      if( targetnode.istype( shadow[SCVPISPIPNode] ) )
      {
        targetNode := targetnode.astype( shadow[SCVPISPIPNode] );
        pisps := pisps.Merge( targetNode.ProductInStockingPointInPeriod().ProductInStockingPoint_MP() )
        
        quantity_o := SCVEdge::GetInventorySupplyQuantity( targetNode.ProductInStockingPointInPeriod(), tooltip );
      }  
    }
    uom := select( pisps, Elements.UnitOfMeasure_MP, e, true );
    
    label := ApplicationMacroPlanner.FormatRealToString( quantity_o )
             + ' '
             + uom.Name();
    
    if( not sourcenode.istype( shadow[SCVPISPIPNode] ) )
    {
      sourcenode.Tooltip( tooltip );
    }
    else
    {
      targetnode.Tooltip( tooltip );
    }
    
    return label;
  *]
  Declarative: true
}
