package postingrules.agreement;
/*Generated by MPS */
import postingrules.AgreementRegistry;
import postingrules.ServiceAgreement;
import mf.MfDate;
import postingrules.EventType;
import formulaAdapter.PostingRule_Formula;
import postingrules.AccountType;
import formulaAdapter.MoneyAdapter;
import jetbrains.mps.samples.formulaLanguage.api.MultiplyOperation;
import formulaAdapter.ValueDouble;
import formulaAdapter.UsageDouble;
import mf.Currency;
import formulaAdapter.MoneyAddOperation;
import formulaAdapter.MoneyMultiplyOperation;
import formulaAdapter.FeeMoney;
import jetbrains.mps.samples.formulaLanguage.api.DoubleConstant;
import formulaAdapter.MoneyConstant;
import mf.Quantity;
import mf.Unit;
import jetbrains.mps.samples.formulaLanguage.api.IfFunction;
import mf.Money;
import formulaAdapter.QuantityGreaterThanOperation;
import formulaAdapter.UsageQuantity;
import formulaAdapter.ValueQuantity;
public class AgreementRegistryBuilder {
public AgreementRegistryBuilder() {
}
public void setUp(AgreementRegistry registry) {
registry.register("regular", this.setUpRegular());
registry.register("lowPay", this.setUpLowPay());
}
public ServiceAgreement setUpRegular() {
ServiceAgreement result = new ServiceAgreement();
result.registerValue("BASE_RATE");
result.setValue("BASE_RATE", 10.0, MfDate.PAST);
result.setValue("BASE_RATE", 12.0, new MfDate(1999, 12, 1));
result.addPostingRule(EventType.USAGE, new PostingRule_Formula(AccountType.BASE_USAGE, true, new MoneyAdapter(new MultiplyOperation(new ValueDouble("BASE_RATE"), new UsageDouble()), Currency.USD)), new MfDate(1999, 10, 1));
result.addPostingRule(EventType.SERVICE_CALL, new PostingRule_Formula(AccountType.SERVICE, true, new MoneyAddOperation(new MoneyMultiplyOperation(new FeeMoney(), new DoubleConstant(0.5)), new MoneyConstant(10.0, Currency.USD))), new MfDate(1999, 10, 1));
result.addPostingRule(EventType.SERVICE_CALL, new PostingRule_Formula(AccountType.SERVICE, true, new MoneyAddOperation(new MoneyMultiplyOperation(new FeeMoney(), new DoubleConstant(0.5)), new MoneyConstant(15.0, Currency.USD))), new MfDate(1999, 12, 1));
result.addPostingRule(EventType.TAX, new PostingRule_Formula(AccountType.TAX, false, new MoneyMultiplyOperation(new FeeMoney(), new DoubleConstant(0.055))), new MfDate(1999, 10, 1));
return result;
}
public ServiceAgreement setUpLowPay() {
ServiceAgreement result = new ServiceAgreement();
result.registerValue("BASE_RATE");
result.registerValue("REDUCED_RATE");
result.registerValue("CAP");
result.setValue("BASE_RATE", 10.0, MfDate.PAST);
result.setValue("REDUCED_RATE", 5.0, MfDate.PAST);
result.setValue("CAP", new Quantity(50.0, Unit.KWH), MfDate.PAST);
result.setValue("CAP", new Quantity(60.0, Unit.KWH), new MfDate(1999, 12, 1));
result.addPostingRule(EventType.USAGE, new PostingRule_Formula(AccountType.BASE_USAGE, true, new IfFunction<Money>(new QuantityGreaterThanOperation(new UsageQuantity(), new ValueQuantity("CAP")), new MoneyAdapter(new MultiplyOperation(new ValueDouble("BASE_RATE"), new UsageDouble()), Currency.USD), new MoneyAdapter(new MultiplyOperation(new ValueDouble("REDUCED_RATE"), new UsageDouble()), Currency.USD))), new MfDate(1999, 10, 1));
result.addPostingRule(EventType.SERVICE_CALL, new PostingRule_Formula(AccountType.SERVICE, true, new MoneyConstant(10.0, Currency.USD)), new MfDate(1999, 10, 1));
result.addPostingRule(EventType.TAX, new PostingRule_Formula(AccountType.TAX, false, new MoneyMultiplyOperation(new FeeMoney(), new DoubleConstant(0.055))), new MfDate(1999, 10, 1));
return result;
}
}