| Quintiq file version 2.0 | 
| #parent: #root | 
| Method ReturnEdgeLabel ( | 
|   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 := ''; | 
|     tooltip := ''; | 
|     scvConfig := DataHolderSCVConfiguration.Data(); | 
|     period := scvConfig.Period_MP(); | 
|     pisps := construct( ProductInStockingPoint_MPs ); | 
|     operations := construct( Operations ); | 
|     lane := null( Lane ); | 
|     targetPISPIP := null( ProductInStockingPoint_MP ); | 
|      | 
|     // 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 := quantity_o.Format( 'N(Dec(2))' )  | 
|              + ' '  | 
|              + uom.Name(); | 
|               | 
|     if( not sourcenode.istype( shadow[SCVPISPIPNode] ) ) | 
|     { | 
|       sourcenode.Tooltip( tooltip ); | 
|     } | 
|     else | 
|     { | 
|       targetnode.Tooltip( tooltip ); | 
|     } | 
|                        | 
|     return label; | 
|   *] | 
|   Declarative: true | 
| } |