Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method AddMaximumInventoryValue ( 
 | 
  LibSCIScenario scenario, 
 | 
  MacroPlan macroplan, 
 | 
  InventorySpecifications inventoryspec, 
 | 
  Boolean isactual 
 | 
) 
 | 
{ 
 | 
  Description: 'Create separated method to ease the calculation of start and end. Nothing will be exported if InventoryValueCost is not defined.' 
 | 
  TextBody: 
 | 
  [* 
 | 
    /* 
 | 
    if IsActual 
 | 
      StartTime = maxvalue( InventoryTarget.Start, InventoryValueAndCost.Start, CurrencyRate.Start )  
 | 
      EndTime = minvalue( ( InventoryTarget.End, InventoryValueAndCost.End, CurrencyRate.End, startofplanning ) 
 | 
    else 
 | 
      StartTime = maxvalue ( InventoryTarget.Start, InventoryValueAndCost.Start, CurrencyRate.Start, startofplanning )  
 | 
      EndTime = minvalue( InventoryTarget.End, InventoryValueAndCost.End, CurrencyRate.End, endofplanninghorizon ) 
 | 
    */ 
 | 
    startofplanning:= macroplan.StartOfPlanning();  
 | 
    scenarioname := ifexpr( isactual, LibSCIIntegration_Utility::SCI_CurrentSOPPlan(), scenario.Name() ); 
 | 
    appliedtometric := ifexpr( isactual, LibSCIIntegration_Utility::SCI_Metric_ActualInventoryValue(), LibSCIIntegration_Utility::SCI_Metric_PlannedInventoryValue() ); 
 | 
    traverse( inventoryspec, Elements, spec ) 
 | 
    { 
 | 
       
 | 
      endofspec := guard( spec.NextInventorySpecification().Start().DateTime(), macroplan.End() ); 
 | 
      /* select InventoryValueCosts that are overlapped with the InventorySpecification, if isactual only select InventoryValueCost that valid before startofplanning, 
 | 
      if not isactual, the InventoryValueCost need End after startofplanning 
 | 
      */ 
 | 
      inventoryvalues := selectsortedset( spec, ProductInStockingPoint_MP.InventoryValueAndCost, cost, 
 | 
                                          Period_MP::IsInPeriod( cost.Start().DateTime(), cost.End().DateTime(),  
 | 
                                                                 spec.Start().DateTime(),  
 | 
                                                                 ifexpr( isactual, startofplanning, endofspec ) )  
 | 
                                          and ifexpr( not isactual, cost.End().DateTime()> startofplanning, true ),  
 | 
                                          spec.Start() ); 
 | 
                                            
 | 
       
 | 
      traverse( inventoryvalues, Elements, inv ) 
 | 
      { 
 | 
        
 | 
       start := maxvalue( inv.Start().DateTime(), spec.Start().DateTime() ); 
 | 
       end := minvalue( inv.End().DateTime(), endofspec ); 
 | 
       currency := inv.AccountAssignment().Currency_MP(); 
 | 
       product := inv.Product_MP().Name(); 
 | 
       stockingpoint := inv.StockingPoint_MP().Name(); 
 | 
       cost := inv.Cost() * spec.MaxLevelInQuantity(); 
 | 
       
 | 
       if ( currency.IsBase() ) 
 | 
       { 
 | 
          if ( not isactual ) 
 | 
          { 
 | 
            start := maxvalue( startofplanning, start ) 
 | 
          } 
 | 
          else 
 | 
          { 
 | 
            end := minvalue( end, startofplanning ); 
 | 
          } 
 | 
           
 | 
          this.AddMaximumInventoryValueForExport( scenarioname, appliedtometric, product, stockingpoint, start, end, cost )   
 | 
       }     
 | 
        
 | 
       else 
 | 
       { 
 | 
         currencyrates := currency.GetCurrencyRates( inv.Start(), inv.End() ); 
 | 
         i := 0; 
 | 
         traverse( currencyrates, Elements, rate ) 
 | 
         { 
 | 
           start := maxvalue( inv.Start().DateTime(), rate.Start().DateTime() ); 
 | 
           end := guard( currencyrates.Element(i+1).Start().DateTime(), inv.End().DateTime() ); 
 | 
           end := minvalue( inv.End().DateTime(), end ); 
 | 
           cost := inv.Cost() * rate.Rate() * spec.MaxLevelInQuantity(); 
 | 
           // if inventoryvaluecost cost with end > start of planning 
 | 
           if ( not isactual and end > startofplanning ) 
 | 
           { 
 | 
             start := maxvalue( start, startofplanning ); 
 | 
             this.AddMaximumInventoryValueForExport( scenarioname, appliedtometric, product, stockingpoint, start, end, cost ) 
 | 
           } 
 | 
           else if ( isactual and scenario.IsCurrent() )// only export actual for current scenario 
 | 
           { 
 | 
             end := minvalue( end, startofplanning ); 
 | 
             this.AddMaximumInventoryValueForExport( scenarioname, appliedtometric, product, stockingpoint, start, end, cost ) 
 | 
           } 
 | 
           
 | 
           i := i +1; 
 | 
         } 
 | 
       } 
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |