| Quintiq file version 2.0 | 
| #parent: #root | 
| Method SetAsBase | 
| { | 
|   Description: 'Set as base currency' | 
|   TextBody: | 
|   [* | 
|     // Logic here to auto convert other currency rates to the new base. | 
|     // Step 1: Compute rates of old base to new base | 
|     // Step 2: Chain compute other currencies with the old base to new base rate | 
|     // Note, 'this' denotes the new base | 
|     oldBaseCurrency := this.MacroPlan().BaseCurrency(); | 
|      | 
|     // Step 1, update old base rate to new base rate | 
|     traverse( this, CurrencyRate_MP, cr ) | 
|     { | 
|       CurrencyRate_MP::Create( oldBaseCurrency, | 
|                                cr.Start(), | 
|                                ConversionFactor::GetReverseFactor( cr.Rate() ), | 
|                                false /*isfromdb*/ ); | 
|     } | 
|      | 
|     // Step 2, update other currencies to convert to new base | 
|     traverse( this, MacroPlan.Currency_MP, c, c <> this and c <> oldBaseCurrency ) | 
|     { | 
|       traverse( c, CurrencyRate_MP, cr ) | 
|       { | 
|         // Terminology -> cr:                : This currency to old base rate | 
|         //             -> latestOldBaseToNewBase: Old base to new base rate, for chain conversion, we gonna select the nearest time | 
|         // Rate will then be cr x latestOldBaseToNewBase, logic, this_to_new_base_rate := this_to_old_base_rate x old_base_to_new_base_rate | 
|         latestOldBaseToNewBase := maxselect( oldBaseCurrency, CurrencyRate_MP, oldCr, oldCr.Start() <= cr.Start(), oldCr.Start() ) | 
|         // If this is null, just get the earliest define | 
|         if( isnull( latestOldBaseToNewBase ) ) | 
|         { | 
|           latestOldBaseToNewBase := minselect( oldBaseCurrency, CurrencyRate_MP, oldCr, true, oldCr.Start() ) | 
|         } | 
|         rate := guard( cr.Rate() * latestOldBaseToNewBase.Rate(), 1.0 ) | 
|         start := cr.Start(); | 
|         cr.Delete(); | 
|         CurrencyRate_MP::Create( c, | 
|                                  start, | 
|                                  rate, | 
|                                  false /*isfromdb*/ );     | 
|          | 
|       } | 
|     } | 
|      | 
|      | 
|      | 
|     traverse( this, MacroPlan.Currency_MP, currency, currency <> this and currency.IsBase() ) | 
|     { | 
|       currency.IsBase( false );   | 
|     } | 
|     this.IsBase( true ); | 
|      | 
|     // Flush this (new base currency) currency rate | 
|     this.CurrencyRate_MP( relflush ); | 
|   *] | 
| } |