Quintiq file version 2.0 
 | 
#parent: #root 
 | 
StaticMethod GetConversionFactor ( 
 | 
  const UnitOfMeasure_MP sourceuom, 
 | 
  const UnitOfMeasure_MP targetuom, 
 | 
  const Product_MP product 
 | 
) const declarative remote as Real 
 | 
{ 
 | 
  Description: 'Return the conversion factor object from source to target' 
 | 
  TextBody: 
 | 
  [* 
 | 
    //This method returns NAN if conversion factor is not found.  
 | 
    //Therefore, it should only be used to check whether the conversion factor exists or not. 
 | 
    //Should not be used for retrieving the factor value. For that we should always use uom.GetConversionFactor() 
 | 
     
 | 
    factor := log( -1.0 ); 
 | 
     
 | 
    if( not isnull( sourceuom ) ) 
 | 
    { 
 | 
      // If the product has conversion factor, traverse from product 
 | 
      conversionfactor := constnull( ConversionFactor ); 
 | 
       
 | 
      if( not isnull( product ) 
 | 
          and product.HasConversionFactor() ) 
 | 
      { 
 | 
        conversionfactor := select( product, ConversionFactor, cf, 
 | 
                                    cf.SourceUnitOfMeasure() = sourceuom, 
 | 
                                    cf.TargetUnitOfMeasure() = targetuom ); 
 | 
      } 
 | 
      // Else go for source -> target without product specified 
 | 
      // Do not use else because some product may have HasConversionFactor = true but the specific conversion factor is not specified. 
 | 
      // In that case, we will use the conversion factor without product 
 | 
       
 | 
      if( isnull( conversionfactor ) ) 
 | 
      { 
 | 
        conversionfactor := select( sourceuom, AsSourceUnitOfMeasureWithNullProduct, cf, true, cf.TargetUnitOfMeasure() = targetuom ); 
 | 
      } 
 | 
      factor := guard( conversionfactor.Factor(), log( -1.0 ) ) 
 | 
       
 | 
      // Chain conversion factor because in web, we may only have conversion factors between default uom and each uom 
 | 
      if( isnull( conversionfactor ) ) 
 | 
      { 
 | 
        defaultUOM := sourceuom.MacroPlan().DefaultUnitOfMeasure(); 
 | 
        converttodefaultfactor := select( sourceuom, AsSourceUnitOfMeasureWithNullProduct, cf, true, cf.TargetUnitOfMeasure() = defaultUOM ); 
 | 
        defaulttotargetfactor := select( defaultUOM, AsSourceUnitOfMeasureWithNullProduct, cf, true, cf.TargetUnitOfMeasure() = targetuom ); 
 | 
        factor := guard( converttodefaultfactor.Factor() * defaulttotargetfactor.Factor(), log( -1.0 ) ); 
 | 
      } 
 | 
    } 
 | 
     
 | 
    return factor; 
 | 
  *] 
 | 
} 
 |