/public/javascripts/paydown.js

https://bitbucket.org/keithelliott/simplecalc_web · JavaScript · 166 lines · 142 code · 24 blank · 0 comment · 2 complexity · a93bc610b28855e2e501f42079ea76f1 MD5 · raw file

  1. define([
  2. 'jquery',
  3. 'underscore',
  4. 'backbone',
  5. 'backbone.marionette',
  6. 'accounting',
  7. 'constantpayment',
  8. 'text!templates/paydown_inputs.html',
  9. 'text!templates/paydown_outputs.html'
  10. ], function($,_,Backbone,Marionette, accounting, constantpayment, paydown_inputs, paydown_outputs){
  11. var PaydownLayout = {};
  12. var Paydown = Backbone.Marionette.Layout.extend({
  13. template: '#paydown_template',
  14. regions: {
  15. 'sidebar' : '#demo_sidebar',
  16. 'inputs' : '#paydown_inputs',
  17. 'outputs': '#paydown_outputs',
  18. 'amortization': '#amortization_table'
  19. },
  20. display: function(){
  21. var sidebar = new PaydownLayout.Sidebar();
  22. var input_model = new PaydownLayout.inputModel();
  23. var inputs = new PaydownLayout.Inputs({model:input_model});
  24. var output_model = new PaydownLayout.outputModel();
  25. var outputs = new PaydownLayout.Outputs({model: output_model});
  26. var amortlist = new PaydownLayout.AmortList();
  27. var amortization = new PaydownLayout.AmortizationCollectionView({collection: amortlist});
  28. this.sidebar.show(sidebar);
  29. this.inputs.show(inputs);
  30. this.outputs.show(outputs);
  31. this.amortization.show(amortization);
  32. input_model.on('all', function(){
  33. console.log('inputs changed');
  34. var ConstantPayment = new constantpayment();
  35. ConstantPayment.init({loanAmount: input_model.get('loan_amount'),
  36. interestRate: input_model.get('interest_rate') / 100,
  37. term: input_model.get('term'),
  38. extraPrincPaymentPerMonth: input_model.get('paydown_amount')});
  39. var payoffyr = ConstantPayment.determinePayOffYear();
  40. if(!isNaN(payoffyr)){
  41. output_model.set('current_interest' , ConstantPayment.determineBaseTotalInterestPaid());
  42. output_model.set('proj_interest' , ConstantPayment.determineTotalInterestPaid());
  43. output_model.set('interest_saved' , output_model.get('current_interest') - output_model.get('proj_interest'));
  44. output_model.set('proj_payoff_yr' , payoffyr);
  45. output_model.set('current_payoff_yr' , input_model.get('term'));
  46. var amort = ConstantPayment.getAmortizationSchedule();
  47. var cnt = 1;
  48. amort.forEach(function(a){
  49. if(a.begBal !== 0){
  50. amortlist.push(new PaydownLayout.AmortModel({
  51. num: cnt,
  52. beginning_bal: accounting.formatMoney(a.begBal),
  53. total_payment: accounting.formatMoney(a.totalPayment),
  54. interest_payment: accounting.formatMoney(a.interestPayment),
  55. principal_payment: accounting.formatMoney(a.principalPayment),
  56. additional_principal: accounting.formatMoney(a.extraPrincPayment),
  57. ending_bal: accounting.formatMoney(a.endBal)
  58. }));
  59. cnt = cnt + 1;
  60. }
  61. });
  62. }
  63. });
  64. }
  65. });
  66. var sidebar = Backbone.Marionette.ItemView.extend({
  67. template: '#paydownMenu'
  68. });
  69. var inputModel = Backbone.Model.extend();
  70. var inputs = Backbone.Marionette.ItemView.extend({
  71. template: paydown_inputs,
  72. events: {
  73. 'change #loan_amount': 'inputsChanged',
  74. 'change #interest_rate': 'inputsChanged',
  75. 'change #loan_term': 'inputsChanged',
  76. 'change #paydown_amount': 'inputsChanged'
  77. },
  78. ui:{
  79. loan_amount: '#loan_amount',
  80. interest_rate: '#interest_rate',
  81. loan_term: '#loan_term',
  82. paydown_amount: '#paydown_amount'
  83. },
  84. inputsChanged: function(){
  85. console.log('changes made to inputs');
  86. this.model.set('loan_amount' , this.ui.loan_amount.val());
  87. this.model.set('interest_rate' , this.ui.interest_rate.val());
  88. this.model.set('term' , this.ui.loan_term.val());
  89. this.model.set('paydown_amount' , this.ui.paydown_amount.val());
  90. }
  91. });
  92. var outputModel = Backbone.Model.extend();
  93. var outputs = Backbone.Marionette.ItemView.extend({
  94. template: paydown_outputs,
  95. initialize: function(){
  96. this.bindTo(this.model,'change', this.outputsChanged);
  97. },
  98. ui:{
  99. current_interest: '#current_interest',
  100. proj_interest: '#proj_interest',
  101. interest_saved: '#interest_saved',
  102. current_payoff_yr: '#current_payoff_yr',
  103. proj_payoff_yr: '#proj_payoff_yr'
  104. },
  105. outputsChanged: function(e){
  106. this.ui.current_interest.html(accounting.formatMoney(this.model.get('current_interest')));
  107. this.ui.proj_interest.html(accounting.formatMoney(this.model.get('proj_interest')));
  108. this.ui.interest_saved.html(accounting.formatMoney(this.model.get('interest_saved')));
  109. this.ui.current_payoff_yr.html(Math.round(this.model.get('current_payoff_yr') * 100)/100);
  110. this.ui.proj_payoff_yr.html(Math.round(this.model.get('proj_payoff_yr') * 100)/100);
  111. }
  112. });
  113. var AmortModel = Backbone.Model.extend();
  114. var AmortList = Backbone.Collection.extend({
  115. model: AmortModel
  116. });
  117. var AmortizationRow = Backbone.Marionette.ItemView.extend({
  118. template: '#amort_row',
  119. tagName: 'tr'
  120. });
  121. var AmortizationCollectionView = Backbone.Marionette.CompositeView.extend({
  122. template: '#amort_schedule_view',
  123. id:'amort_sched',
  124. tagName: 'table',
  125. className: 'table table-striped table-condensed table-hover table-bordered',
  126. itemView: AmortizationRow,
  127. appendHtml: function(collectionView, itemView){
  128. collectionView.$("tbody").append(itemView.el);
  129. }
  130. });
  131. PaydownLayout.Paydown = Paydown;
  132. PaydownLayout.Sidebar = sidebar;
  133. PaydownLayout.inputModel = inputModel;
  134. PaydownLayout.Inputs = inputs;
  135. PaydownLayout.outputModel = outputModel;
  136. PaydownLayout.Outputs = outputs;
  137. PaydownLayout.AmortModel = AmortModel;
  138. PaydownLayout.AmortList = AmortList;
  139. PaydownLayout.AmortizationRow = AmortizationRow;
  140. PaydownLayout.AmortizationCollectionView = AmortizationCollectionView;
  141. return PaydownLayout;
  142. });