Example #1
0
def test_bill_payment_2():
  monthrefdate = date(2017, 11, 1)
  # duedate          = date(2018, 1, 10)
  duedate = None
  alug = 3000;
  cond = 1300;
  iptu = 300
  inmonth_due = alug + cond + iptu
  billingitems = []
  billingitem = {Bill.REFTYPE_KEY: 'ALUG', 'value': alug}
  billingitems.append(billingitem)
  billingitem = {Bill.REFTYPE_KEY: 'COND', 'value': cond}
  billingitems.append(billingitem)
  billingitem = {Bill.REFTYPE_KEY: 'IPTU', 'value': iptu}
  billingitems.append(billingitem)

  bill_obj = Bill(monthrefdate=monthrefdate, duedate=duedate, billingitems=billingitems)
  previousmonthsdebts = 1255.00
  bill_obj.set_previousmonthsdebts(previousmonthsdebts=previousmonthsdebts)
  payments = []
  paydate = date(2017, 12, 10)
  # paydate_frozen = copy(paydate)
  firstpayondateamount = inmonth_due + previousmonthsdebts
  payment_obj = Payment(paid_amount=firstpayondateamount, paydate=paydate)
  payments.append(payment_obj)
  paydatelate = date(2017, 12, 11)
  secondpaylateamount = 100
  payment_obj = Payment(paid_amount=secondpaylateamount, paydate=paydatelate)
  payments.append(payment_obj)
  bill_obj.setPayments(payments)
  bill_obj.process_payment()

  print(bill_obj)
Example #2
0
def test_bill_payment_5():
  '''
  Here TWO payments are done on the same late date
  :return:
  '''
  monthrefdate = date(2017, 1, 1)
  # duedate          = date(2018, 1, 10)
  duedate = None
  alug = 2500;
  cond = 950;
  iptu = 250
  inmonth_due = alug + cond + iptu
  billingitems = []
  billingitem = {Bill.REFTYPE_KEY: 'ALUG', 'value': alug}
  billingitems.append(billingitem)
  billingitem = {Bill.REFTYPE_KEY: 'COND', 'value': cond}
  billingitems.append(billingitem)
  billingitem = {Bill.REFTYPE_KEY: 'IPTU', 'value': iptu}
  billingitems.append(billingitem)

  bill_obj = Bill(monthrefdate=monthrefdate, duedate=duedate, billingitems=billingitems)
  previousmonthsdebts = 3000.00
  bill_obj.set_previousmonthsdebts(previousmonthsdebts=previousmonthsdebts)
  payments = []
  paid_amount = 0
  paydate1 = date(2017, 4, 10)
  payamount1 = 3000
  paid_amount += payamount1
  payment_obj = Payment(paid_amount=payamount1, paydate=paydate1)
  payments.append(payment_obj)
  paydate2 = date(2017, 5, 10)
  payamount2 = 1000
  paid_amount += payamount2
  payment_obj = Payment(paid_amount=payamount2, paydate=paydate2)
  payments.append(payment_obj)
  paydate3 = date(2017, 6, 3)
  payamount3 = 500
  paid_amount += payamount3
  payment_obj = Payment(paid_amount=payamount3, paydate=paydate3)
  payments.append(payment_obj)
  bill_obj.setPayments(payments)
  bill_obj.process_payment()

  print(bill_obj)
Example #3
0
  def test_bill_payment_5(self):
    '''
    Here TWO payments are done on the same late date
    :return:
    '''
    monthrefdate = date(2017, 1, 1)
    #duedate          = date(2018, 1, 10)
    duedate = None
    alug = 2500; cond = 950; iptu = 250
    inmonth_due = alug + cond + iptu
    billingitems = []
    billingitem  = {Bill.REFTYPE_KEY:'ALUG','value':alug}
    billingitems.append(billingitem)
    billingitem  = {Bill.REFTYPE_KEY:'COND','value':cond}
    billingitems.append(billingitem)
    billingitem  = {Bill.REFTYPE_KEY:'IPTU','value':iptu}
    billingitems.append(billingitem)

    bill_obj = Bill(monthrefdate=monthrefdate, duedate=duedate, billingitems=billingitems)
    previousmonthsdebts = 3000.00
    bill_obj.set_previousmonthsdebts(previousmonthsdebts = previousmonthsdebts)
    payments = []
    paid_amount  = 0
    paydate1 = date(2017, 4, 10)
    payamount1 = 3000
    paid_amount += payamount1
    payment_obj = Payment(paid_amount=payamount1, paydate=paydate1)
    payments.append(payment_obj)
    paydate2 = date(2017, 5, 10)
    payamount2 = 1000
    paid_amount += payamount2
    payment_obj = Payment(paid_amount=payamount2, paydate=paydate2)
    payments.append(payment_obj)
    paydate3 = date(2017, 6, 3)
    payamount3 = 500
    paid_amount += payamount3
    payment_obj = Payment(paid_amount=payamount3, paydate=paydate3)
    payments.append(payment_obj)

    bill_obj.set_payments(payments)
    bill_obj.process_payment()

    # inmonth_due_amount
    self.assertEqual(bill_obj.inmonth_due_amount, inmonth_due)
    # previousmonthsdebts
    self.assertEqual(bill_obj.previousmonthsdebts, previousmonthsdebts)
    # inmonthpluspreviousdebts
    inmonth_due_plus_previousmonthsdebts = inmonth_due + previousmonthsdebts
    self.assertEqual(bill_obj.inmonthpluspreviousdebts, inmonth_due_plus_previousmonthsdebts)
    # payment_account
    self.assertEqual(bill_obj.payment_account, paid_amount)
    # inmonthpluspreviousdebts_minus_payments
    expected_inmonthplusdebts_minus_payments = inmonth_due_plus_previousmonthsdebts - paid_amount
    self.assertEqual(bill_obj.inmonthpluspreviousdebts_minus_payments, expected_inmonthplusdebts_minus_payments)

    # inmonthpluspreviousdebts_minus_payments
    amount_in_mora = inmonth_due
    fine_value = amount_in_mora * 0.1
    # print('=>', inmonth_due_plus_previousmonthsdebts, bill_obj.multa_account, fine_value)
    self.assertEqual(bill_obj.multa_account, fine_value)

    # debt_account, after processing, is payment_missing
    cm_jan_for_feb = Juros.fetch_corrmonet_for_month(monthrefdate)
    date2018_02 = monthrefdate + relativedelta(months=+1)
    cm_feb_for_mar = Juros.fetch_corrmonet_for_month(date2018_02)
    date2018_03 = date2018_02 + relativedelta(months=+1)
    cm_mar_for_apr = Juros.fetch_corrmonet_for_month(date2018_03)
    date2018_04 = date2018_03 + relativedelta(months=+1)
    cm_apr_for_may = Juros.fetch_corrmonet_for_month(date2018_04)
    date2018_05 = date2018_04 + relativedelta(months=+1)
    cm_may_for_jun = Juros.fetch_corrmonet_for_month(date2018_05)
    multa_unica = inmonth_due * 0.1 # fine applied
    ongoingvalue = inmonth_due_plus_previousmonthsdebts
    # correction in Feb
    ongoingvalue += ongoingvalue * (0.01 + cm_jan_for_feb) + multa_unica
    print (' correction in Feb =>', ongoingvalue)
    # correction in Mar
    ongoingvalue += ongoingvalue * (0.01 + cm_feb_for_mar)
    print (' correction in Mar =>', ongoingvalue)
    # correction in Aprr
    # paydate1 = date(2017, 4, 10)
    ongoingvalue += ongoingvalue * ((0.01+cm_mar_for_apr)*(10/30))
    ongoingvalue -= payamount1
    print (' correction in Apr with pay =>', ongoingvalue)
    # paydate2 = date(2017, 5, 10)
    ongoingvalue += ongoingvalue * ((0.01+cm_mar_for_apr)*(20/30)) # part in April (20 days of Apr)
    print (' correction in Apr month\'s end =>', ongoingvalue)
    ongoingvalue += ongoingvalue * ((0.01+cm_apr_for_may)*(10/31)) # part in May (10 days of May)
    ongoingvalue -= payamount2
    print (' correction in May with pay =>', ongoingvalue)
    # paydate3 = date(2017, 6, 3)
    ongoingvalue += ongoingvalue * ((0.01+cm_apr_for_may)*(21/31)) # part in May (21 days of May)
    print (' correction in May month\'s end =>', ongoingvalue)
    ongoingvalue += ongoingvalue * ((0.01+cm_may_for_jun)*(3/30)) # part in June (3 days of Jun)
    ongoingvalue -= payamount3
    print (' correction in June with pay =>', ongoingvalue)
    payment_missing = ongoingvalue
    overpaid = 0
    if payment_missing < 0:
      overpaid -= payment_missing
      payment_missing = 0
    self.assertEqual(bill_obj.payment_missing, payment_missing)

    # cred_account (overpaid is simmetric of payment_missing if latter is negative, otherwise, it's zero)
    self.assertEqual(bill_obj.cred_account, overpaid)
Example #4
0
  def test_bill_payment_4(self):
    '''
    Here TWO payments are done on the same late date
    :return:
    '''
    monthrefdate = date(2017, 11, 1)
    #duedate          = date(2018, 1, 10)
    duedate = None
    alug = 3000; cond = 1300; iptu = 300
    inmonth_due = alug + cond + iptu
    billingitems = []
    billingitem  = {Bill.REFTYPE_KEY:'ALUG','value':alug}
    billingitems.append(billingitem)
    billingitem  = {Bill.REFTYPE_KEY:'COND','value':cond}
    billingitems.append(billingitem)
    billingitem  = {Bill.REFTYPE_KEY:'IPTU','value':iptu}
    billingitems.append(billingitem)

    bill_obj = Bill(monthrefdate=monthrefdate, duedate=duedate, billingitems=billingitems)
    previousmonthsdebts = 1255.00
    bill_obj.set_previousmonthsdebts(previousmonthsdebts = previousmonthsdebts)
    payments = []
    paydate = date(2017, 12, 10)
    #paydate_frozen = copy(paydate)
    firstpayondateamount = inmonth_due + previousmonthsdebts
    payment_obj = Payment(paid_amount=firstpayondateamount, paydate=paydate)
    payments.append(payment_obj)
    paydatelate = date(2017, 12, 11)
    secondpaylateamount = 100
    payment_obj = Payment(paid_amount=secondpaylateamount, paydate=paydatelate)
    payments.append(payment_obj)
    bill_obj.set_payments(payments)
    bill_obj.process_payment()

    # inmonth_due_amount
    self.assertEqual(bill_obj.inmonth_due_amount, inmonth_due)
    # previousmonthsdebts
    self.assertEqual(bill_obj.previousmonthsdebts, previousmonthsdebts)
    # inmonthpluspreviousdebts
    inmonth_due_plus_previousmonthsdebts = inmonth_due + previousmonthsdebts
    self.assertEqual(bill_obj.inmonthpluspreviousdebts, inmonth_due_plus_previousmonthsdebts)
    # payment_account
    paid_amount = firstpayondateamount + secondpaylateamount
    self.assertEqual(bill_obj.payment_account, paid_amount)
    # inmonthpluspreviousdebts_minus_payments
    expected_inmonthplusdebts_minus_payments = inmonth_due_plus_previousmonthsdebts - paid_amount
    self.assertEqual(bill_obj.inmonthpluspreviousdebts_minus_payments, expected_inmonthplusdebts_minus_payments)

    # inmonthpluspreviousdebts_minus_payments
    amount_in_mora = inmonth_due - firstpayondateamount
    if amount_in_mora < 0:
      amount_in_mora = 0
    fine_value = amount_in_mora * 0.1
    self.assertEqual(bill_obj.multa_account, fine_value) # 80 ie 10% of 800

    # debt_account, after processing, is payment_missing
    corrmonet = Juros.fetch_corrmonet_for_month(monthrefdate)
    monthdaysfraction = 1/31
    interest_n_cm_on_payday = amount_in_mora * ((0.01 + corrmonet) * monthdaysfraction) # 0.005 must be fetched (TO-DO): for the time being, it's hardcoded
    payment_missing = inmonth_due_plus_previousmonthsdebts + fine_value + interest_n_cm_on_payday - paid_amount
    overpaid = 0
    if payment_missing < 0:
      overpaid -= payment_missing
      payment_missing = 0
    self.assertEqual(bill_obj.payment_missing, payment_missing)

    # cred_account (overpaid is simmetric of payment_missing if latter is negative, otherwise, it's zero)
    self.assertEqual(bill_obj.cred_account, overpaid)