breaked up code into multiple functions
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 8b16ae3..1fd82d9 100755
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -189,32 +189,21 @@
outstanding_amount, credit_note_amount, payment_amount = self.get_outstanding_amount(
gle,self.filters.report_date, self.dr_or_cr, return_entries)
if abs(outstanding_amount) > 0.1/10**self.currency_precision:
- pdc_list = self.pdc_details.get((gle.voucher_no, gle.party), [])
if self.filters.based_on_payment_terms and self.payment_term_map.get(gle.voucher_no):
for d in self.payment_term_map.get(gle.voucher_no):
+ # Allocate payment amount based on payment terms(FIFO order)
payment_amount, d.payment_amount = self.allocate_based_on_fifo(payment_amount, d.payment_term_amount)
term_outstanding_amount = d.payment_term_amount - d.payment_amount
+
+ # Allocate credit note based on payment terms(FIFO order)
credit_note_amount, d.credit_note_amount = self.allocate_based_on_fifo(credit_note_amount, term_outstanding_amount)
term_outstanding_amount -= d.credit_note_amount
row_outstanding = term_outstanding_amount
- d.pdc_details = []
- for pdc in pdc_list:
- if row_outstanding <= pdc.pdc_amount:
- d.pdc_amount += row_outstanding
- pdc.pdc_amount -= row_outstanding
- if row_outstanding and d.pdc_ref and d.pdc_date:
- d.pdc_details.append(cstr(d.pdc_ref) + "/" + formatdate(d.pdc_date))
- row_outstanding = 0
-
- else:
- d.pdc_amount = pdc.pdc_amount
- if pdc.pdc_amount and d.pdc_ref and d.pdc_date:
- d.pdc_details.append(cstr(d.pdc_ref) + "/" + formatdate(d.pdc_date))
- pdc.pdc_amount = 0
- row_outstanding -= d.pdc_amount
+ # Allocate PDC based on payment terms(FIFO order)
+ d.pdc_details, d.pdc_amount = self.allocate_pdc_amount_in_fifo(gle, row_outstanding)
if term_outstanding_amount > 0:
row = self.prepare_row(party_naming_by, args, gle, term_outstanding_amount,
@@ -226,30 +215,53 @@
outstanding_amount, credit_note_amount, payment_amount = self.get_outstanding_amount(
gle,self.filters.report_date, self.dr_or_cr, return_entries)
- pdc_amount = 0
- pdc_details = []
- for d in pdc_list:
- pdc_amount += flt(d.pdc_amount)
- if pdc_amount and d.pdc_ref and d.pdc_date:
- pdc_details.append(cstr(d.pdc_ref) + "/" + formatdate(d.pdc_date))
-
- row = self.prepare_row(party_naming_by, args, gle, outstanding_amount,
- credit_note_amount, pdc_amount=pdc_amount, pdc_details=pdc_details)
+ row = self.prepare_row_without_payment_terms(party_naming_by, args, gle, outstanding_amount,
+ credit_note_amount)
data.append(row)
else:
- pdc_amount = 0
- pdc_details = []
- for d in pdc_list:
- pdc_amount += flt(d.pdc_amount)
- if pdc_amount and d.pdc_ref and d.pdc_date:
- pdc_details.append(cstr(d.pdc_ref) + "/" + formatdate(d.pdc_date))
-
- row = self.prepare_row(party_naming_by, args, gle, outstanding_amount,
- credit_note_amount, pdc_amount=pdc_amount, pdc_details=pdc_details)
+ row = self.prepare_row_without_payment_terms(party_naming_by, args, gle, outstanding_amount,
+ credit_note_amount)
data.append(row)
return data
+ def allocate_pdc_amount_in_fifo(self, gle, row_outstanding):
+ pdc_list = self.pdc_details.get((gle.voucher_no, gle.party), [])
+
+ pdc_details = []
+ pdc_amount = 0
+ for pdc in pdc_list:
+ if row_outstanding <= pdc.pdc_amount:
+ pdc_amount += row_outstanding
+ pdc.pdc_amount -= row_outstanding
+ if row_outstanding and pdc.pdc_ref and pdc.pdc_date:
+ pdc_details.append(cstr(pdc.pdc_ref) + "/" + formatdate(pdc.pdc_date))
+ row_outstanding = 0
+
+ else:
+ pdc_amount = pdc.pdc_amount
+ if pdc.pdc_amount and pdc.pdc_ref and pdc.pdc_date:
+ pdc_details.append(cstr(pdc.pdc_ref) + "/" + formatdate(pdc.pdc_date))
+ pdc.pdc_amount = 0
+ row_outstanding -= pdc_amount
+
+ return pdc_details, pdc_amount
+
+ def prepare_row_without_payment_terms(self, party_naming_by, args, gle, outstanding_amount, credit_note_amount):
+ pdc_list = self.pdc_details.get((gle.voucher_no, gle.party), [])
+ pdc_amount = 0
+ pdc_details = []
+ for d in pdc_list:
+ pdc_amount += flt(d.pdc_amount)
+ if pdc_amount and d.pdc_ref and d.pdc_date:
+ pdc_details.append(cstr(d.pdc_ref) + "/" + formatdate(d.pdc_date))
+
+ row = self.prepare_row(party_naming_by, args, gle, outstanding_amount,
+ credit_note_amount, pdc_amount=pdc_amount, pdc_details=pdc_details)
+
+ return row
+
+
def allocate_based_on_fifo(self, total_amount, row_amount):
allocated_amount = 0
if row_amount <= total_amount: