Merge pull request #1985 from ankitjavalkarwork/payrec
Remove Payment To Invoice Matching Tool
This commit is contained in:
commit
329a8ef9a1
@ -1 +0,0 @@
|
||||
Tool for mapping (cancelling) unpaid invoices and payments.
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,51 +0,0 @@
|
||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
|
||||
cur_frm.cscript.onload_post_render = function(doc) {
|
||||
$(cur_frm.get_field("reconcile").input).addClass("btn-info");
|
||||
}
|
||||
|
||||
cur_frm.fields_dict.voucher_no.get_query = function(doc) {
|
||||
// TO-do: check for pos, it should not come
|
||||
if (!doc.account) msgprint(__("Please select Account first"));
|
||||
else {
|
||||
return {
|
||||
doctype: doc.voucher_type,
|
||||
query: "erpnext.accounts.doctype.payment_to_invoice_matching_tool.payment_to_invoice_matching_tool.get_voucher_nos",
|
||||
filters: {
|
||||
"voucher_type": doc.voucher_type,
|
||||
"account": doc.account
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.voucher_no = function() {
|
||||
return cur_frm.call({
|
||||
doc: cur_frm.doc,
|
||||
method: "get_voucher_details"
|
||||
});
|
||||
}
|
||||
|
||||
cur_frm.cscript.get_against_entries = function() {
|
||||
return cur_frm.call({
|
||||
doc: cur_frm.doc,
|
||||
method: "get_against_entries"
|
||||
});
|
||||
}
|
||||
|
||||
cur_frm.cscript.reconcile = function() {
|
||||
return cur_frm.call({
|
||||
doc: cur_frm.doc,
|
||||
method: "reconcile"
|
||||
});
|
||||
}
|
||||
|
||||
cur_frm.cscript.allocated_amount = function(doc, cdt, cdn) {
|
||||
var total_allocated_amount = 0
|
||||
$.each(cur_frm.doc.against_entries, function(i, d) {
|
||||
if(d.allocated_amount > 0) total_allocated_amount += flt(d.allocated_amount);
|
||||
else if (d.allocated_amount < 0) frappe.throw(__("Allocated amount can not be negative"));
|
||||
})
|
||||
cur_frm.set_value("total_allocated_amount", total_allocated_amount);
|
||||
}
|
@ -1,187 +0,0 @@
|
||||
{
|
||||
"creation": "2013-01-30 12:49:46",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"document_type": "Other",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "account",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 0,
|
||||
"label": "Account",
|
||||
"options": "Account",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"default": "Journal Voucher",
|
||||
"fieldname": "voucher_type",
|
||||
"fieldtype": "Select",
|
||||
"in_list_view": 0,
|
||||
"label": "Voucher Type",
|
||||
"options": "Sales Invoice\nPurchase Invoice\nJournal Voucher",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "voucher_no",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Voucher No",
|
||||
"options": "[Select]",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break1",
|
||||
"fieldtype": "Column Break",
|
||||
"in_list_view": 0,
|
||||
"permlevel": 0,
|
||||
"print_width": "50%",
|
||||
"width": "50%"
|
||||
},
|
||||
{
|
||||
"fieldname": "total_amount",
|
||||
"fieldtype": "Currency",
|
||||
"in_list_view": 1,
|
||||
"label": "Total Amount",
|
||||
"options": "",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "unmatched_amount",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Unmatched Amount",
|
||||
"options": "",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "against_entries_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Against Entries",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "from_date",
|
||||
"fieldtype": "Date",
|
||||
"label": "From Date",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "to_date",
|
||||
"fieldtype": "Date",
|
||||
"label": "To Date",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "column_break3",
|
||||
"fieldtype": "Column Break",
|
||||
"label": "",
|
||||
"permlevel": 0,
|
||||
"print_width": "50%",
|
||||
"width": "50%"
|
||||
},
|
||||
{
|
||||
"fieldname": "amt_greater_than",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Amount >=",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "amt_less_than",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Amount <=",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "section_break0",
|
||||
"fieldtype": "Section Break",
|
||||
"options": "Simple",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "get_against_entries",
|
||||
"fieldtype": "Button",
|
||||
"label": "Get Against Entries",
|
||||
"options": "",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"description": "Update allocated amount in the above table and then click \"Allocate\" button",
|
||||
"fieldname": "against_entries",
|
||||
"fieldtype": "Table",
|
||||
"label": "Against Entries",
|
||||
"options": "Payment to Invoice Matching Tool Detail",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "sec_break1",
|
||||
"fieldtype": "Section Break",
|
||||
"options": "Simple",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "total_allocated_amount",
|
||||
"fieldtype": "Currency",
|
||||
"label": "Total Allocated Amount",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "col_breal4",
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"default": "",
|
||||
"fieldname": "allocate_amount_automatically",
|
||||
"fieldtype": "Button",
|
||||
"hidden": 1,
|
||||
"label": "Allocate Amount Automatically",
|
||||
"permlevel": 0,
|
||||
"reqd": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "reconcile",
|
||||
"fieldtype": "Button",
|
||||
"label": "Reconcile",
|
||||
"options": "",
|
||||
"permlevel": 0
|
||||
}
|
||||
],
|
||||
"hide_toolbar": 0,
|
||||
"icon": "icon-magic",
|
||||
"idx": 1,
|
||||
"issingle": 1,
|
||||
"modified": "2014-04-30 17:11:05.908619",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Payment to Invoice Matching Tool",
|
||||
"owner": "Administrator",
|
||||
"permissions": [
|
||||
{
|
||||
"create": 1,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 0,
|
||||
"role": "Accounts Manager",
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
},
|
||||
{
|
||||
"create": 1,
|
||||
"email": 1,
|
||||
"permlevel": 0,
|
||||
"print": 1,
|
||||
"read": 1,
|
||||
"report": 0,
|
||||
"role": "Accounts User",
|
||||
"submit": 0,
|
||||
"write": 1
|
||||
}
|
||||
]
|
||||
}
|
@ -1,173 +0,0 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
from frappe.utils import flt
|
||||
|
||||
from frappe import msgprint, _
|
||||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class PaymenttoInvoiceMatchingTool(Document):
|
||||
def get_voucher_details(self):
|
||||
total_amount = frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
|
||||
from `tabGL Entry`
|
||||
where voucher_type = %s and voucher_no = %s
|
||||
and account = %s and ifnull(against_voucher, '') != voucher_no""",
|
||||
(self.voucher_type, self.voucher_no, self.account))
|
||||
|
||||
self.total_amount = total_amount and flt(total_amount[0][0]) or 0
|
||||
|
||||
reconciled_payment = frappe.db.sql("""
|
||||
select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)))
|
||||
from `tabGL Entry`
|
||||
where against_voucher_type = %s and against_voucher = %s and account = %s
|
||||
""", (self.voucher_type, self.voucher_no, self.account))
|
||||
|
||||
reconciled_payment = reconciled_payment and flt(reconciled_payment[0][0]) or 0
|
||||
self.unmatched_amount = self.total_amount - reconciled_payment
|
||||
|
||||
def get_against_entries(self):
|
||||
self.set('against_entries', [])
|
||||
gle = self.get_gl_entries()
|
||||
self.create_against_entries_table(gle)
|
||||
|
||||
def get_gl_entries(self):
|
||||
self.validate_mandatory()
|
||||
|
||||
dr_or_cr = "credit" if self.total_amount > 0 else "debit"
|
||||
|
||||
cond = self.from_date and " and t1.posting_date >= '" + self.from_date + "'" or ""
|
||||
cond += self.to_date and " and t1.posting_date <= '" + self.to_date + "'" or ""
|
||||
|
||||
if self.amt_greater_than:
|
||||
cond += ' and abs(ifnull(t2.debit, 0) - ifnull(t2.credit, 0)) >= ' + self.amt_greater_than
|
||||
if self.amt_less_than:
|
||||
cond += ' and abs(ifnull(t2.debit, 0) - ifnull(t2.credit, 0)) >= ' + self.amt_less_than
|
||||
|
||||
gle = frappe.db.sql("""
|
||||
select
|
||||
t1.name as voucher_no, t1.posting_date, t1.total_debit as total_amt,
|
||||
abs(ifnull(t2.debit, 0) - ifnull(t2.credit, 0)) as unmatched_amount, t1.remark,
|
||||
t2.against_account, t2.name as voucher_detail_no, t2.is_advance
|
||||
from
|
||||
`tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
|
||||
where
|
||||
t1.name = t2.parent and t1.docstatus = 1 and t2.account = %s
|
||||
and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')=''
|
||||
and ifnull(t2.against_jv, '')='' and t2.%s > 0 and t1.name != %s
|
||||
and not exists (select * from `tabJournal Voucher Detail`
|
||||
where parent=%s and against_jv = t1.name) %s
|
||||
group by t1.name, t2.name """ % ('%s', dr_or_cr, '%s', '%s', cond),
|
||||
(self.account, self.voucher_no, self.voucher_no), as_dict=1)
|
||||
|
||||
return gle
|
||||
|
||||
def create_against_entries_table(self, gle):
|
||||
adjusted_jv = {}
|
||||
for d in gle:
|
||||
if not adjusted_jv.has_key(d.get("voucher_no")):
|
||||
matched_amount = frappe.db.sql("""
|
||||
select
|
||||
ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
|
||||
from
|
||||
`tabGL Entry`
|
||||
where
|
||||
account = %s and against_voucher_type = "Journal Voucher"
|
||||
and ifnull(against_voucher, '') = %s
|
||||
""", (self.account, d.get('voucher_no')))
|
||||
matched_amount = matched_amount[0][0] if matched_amount else 0
|
||||
else:
|
||||
matched_amount = adjusted_jv.get(d.get("voucher_no"))
|
||||
|
||||
if matched_amount < flt(d.get('unmatched_amount')):
|
||||
unmatched_amount = flt(d.get('unmatched_amount')) - matched_amount
|
||||
adjusted_jv.setdefault(d.get("voucher_no"), 0)
|
||||
else:
|
||||
unmatched_amount = 0
|
||||
adjusted_jv.setdefault(d.get("voucher_no"), matched_amount - flt(d.get('unmatched_amount')))
|
||||
|
||||
if unmatched_amount:
|
||||
ch = self.append('against_entries', {})
|
||||
ch.voucher_no = d.get('voucher_no')
|
||||
ch.posting_date = d.get('posting_date')
|
||||
ch.unmatched_amount = unmatched_amount
|
||||
ch.total_amt = flt(d.get('total_amt'))
|
||||
ch.against_account = d.get('against_account')
|
||||
ch.remarks = d.get('remark')
|
||||
ch.voucher_detail_no = d.get('voucher_detail_no')
|
||||
ch.is_advance = d.get("is_advance")
|
||||
ch.original_amount = flt(d.get('unmatched_amount'))
|
||||
|
||||
def validate_mandatory(self):
|
||||
for fieldname in ["account", "voucher_type", "voucher_no"]:
|
||||
if not self.get(fieldname):
|
||||
frappe.throw(_("Please select {0} first").format(self.meta.get_label("fieldname")))
|
||||
|
||||
if not frappe.db.exists(self.voucher_type, self.voucher_no):
|
||||
frappe.throw(_("Voucher No is not valid"))
|
||||
|
||||
def reconcile(self):
|
||||
self.validate_mandatory()
|
||||
self.validate_allocated_amount()
|
||||
|
||||
dr_or_cr = "credit" if self.total_amount > 0 else "debit"
|
||||
|
||||
lst = []
|
||||
for d in self.get('against_entries'):
|
||||
if flt(d.allocated_amount) > 0:
|
||||
lst.append({
|
||||
'voucher_no' : d.voucher_no,
|
||||
'voucher_detail_no' : d.voucher_detail_no,
|
||||
'against_voucher_type' : self.voucher_type,
|
||||
'against_voucher' : self.voucher_no,
|
||||
'account' : self.account,
|
||||
'is_advance' : d.is_advance,
|
||||
'dr_or_cr' : dr_or_cr,
|
||||
'unadjusted_amt' : flt(d.original_amount),
|
||||
'allocated_amt' : flt(d.allocated_amount)
|
||||
})
|
||||
|
||||
if lst:
|
||||
from erpnext.accounts.utils import reconcile_against_document
|
||||
reconcile_against_document(lst)
|
||||
self.get_voucher_details()
|
||||
self.get_against_entries()
|
||||
msgprint(_("Successfully allocated"))
|
||||
|
||||
def validate_allocated_amount(self):
|
||||
if not self.total_allocated_amount:
|
||||
frappe.throw(_("You must allocate amount before reconcile"))
|
||||
elif self.total_allocated_amount > self.unmatched_amount:
|
||||
frappe.throw(_("Total Allocated Amount can not be greater than unmatched amount"))
|
||||
|
||||
def get_voucher_nos(doctype, txt, searchfield, start, page_len, filters):
|
||||
non_reconclied_entries = []
|
||||
entries = frappe.db.sql("""
|
||||
select
|
||||
voucher_no, posting_date, ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0) as amount
|
||||
from
|
||||
`tabGL Entry`
|
||||
where
|
||||
account = %s and voucher_type = %s and voucher_no like %s
|
||||
and ifnull(against_voucher, '') = ''
|
||||
group by voucher_no
|
||||
""", (filters["account"], filters["voucher_type"], "%%%s%%" % txt), as_dict=True)
|
||||
|
||||
for d in entries:
|
||||
adjusted_amount = frappe.db.sql("""
|
||||
select
|
||||
ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
|
||||
from
|
||||
`tabGL Entry`
|
||||
where
|
||||
account = %s and against_voucher_type = %s and ifnull(against_voucher, '') = %s
|
||||
""", (filters["account"], filters["voucher_type"], d.voucher_no))
|
||||
adjusted_amount = adjusted_amount[0][0] if adjusted_amount else 0
|
||||
|
||||
if d.amount > adjusted_amount:
|
||||
non_reconclied_entries.append([d.voucher_no, d.posting_date, d.amount])
|
||||
|
||||
return non_reconclied_entries
|
@ -1,8 +0,0 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import unittest
|
||||
import frappe
|
||||
|
||||
test_records = frappe.get_test_records('Payment To Invoice Matching Tool')
|
@ -1 +0,0 @@
|
||||
[]
|
@ -1 +0,0 @@
|
||||
Journal Voucher (payment) detail for matching to invoice.
|
@ -1 +0,0 @@
|
||||
from __future__ import unicode_literals
|
@ -1,110 +0,0 @@
|
||||
{
|
||||
"creation": "2013-02-22 01:27:39",
|
||||
"docstatus": 0,
|
||||
"doctype": "DocType",
|
||||
"fields": [
|
||||
{
|
||||
"fieldname": "voucher_no",
|
||||
"fieldtype": "Link",
|
||||
"in_list_view": 1,
|
||||
"label": "Voucher No",
|
||||
"options": "Journal Voucher",
|
||||
"permlevel": 0,
|
||||
"print_width": "140px",
|
||||
"read_only": 1,
|
||||
"reqd": 0,
|
||||
"width": "140px"
|
||||
},
|
||||
{
|
||||
"fieldname": "unmatched_amount",
|
||||
"fieldtype": "Currency",
|
||||
"in_list_view": 1,
|
||||
"label": "Unmatched Amount",
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "allocated_amount",
|
||||
"fieldtype": "Currency",
|
||||
"in_list_view": 1,
|
||||
"label": "Allocated Amount",
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "col_break1",
|
||||
"fieldtype": "Column Break",
|
||||
"permlevel": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "posting_date",
|
||||
"fieldtype": "Date",
|
||||
"in_list_view": 1,
|
||||
"label": "Posting Date",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "total_amt",
|
||||
"fieldtype": "Currency",
|
||||
"in_list_view": 1,
|
||||
"label": "Total Amount",
|
||||
"options": "Company:company:default_currency",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "against_account",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Against Account",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "remarks",
|
||||
"fieldtype": "Small Text",
|
||||
"label": "Remarks",
|
||||
"permlevel": 0,
|
||||
"print_width": "200px",
|
||||
"read_only": 1,
|
||||
"width": "200px"
|
||||
},
|
||||
{
|
||||
"fieldname": "voucher_detail_no",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Voucher Detail No",
|
||||
"permlevel": 0,
|
||||
"print_hide": 1,
|
||||
"read_only": 1,
|
||||
"reqd": 0
|
||||
},
|
||||
{
|
||||
"fieldname": "is_advance",
|
||||
"fieldtype": "Data",
|
||||
"hidden": 1,
|
||||
"label": "Is Advance",
|
||||
"permlevel": 0,
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "original_amount",
|
||||
"fieldtype": "Currency",
|
||||
"hidden": 1,
|
||||
"label": "Original Amount",
|
||||
"permlevel": 0
|
||||
}
|
||||
],
|
||||
"hide_toolbar": 1,
|
||||
"idx": 1,
|
||||
"istable": 1,
|
||||
"modified": "2014-04-30 19:27:15.993641",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Accounts",
|
||||
"name": "Payment to Invoice Matching Tool Detail",
|
||||
"owner": "Administrator",
|
||||
"permissions": []
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
|
||||
from frappe.model.document import Document
|
||||
|
||||
class PaymentToInvoiceMatchingToolDetail(Document):
|
||||
pass
|
Loading…
x
Reference in New Issue
Block a user