Payment to invoice matching tool
diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json
index ec9f7ae..c32497f 100644
--- a/erpnext/accounts/doctype/account/account.json
+++ b/erpnext/accounts/doctype/account/account.json
@@ -10,7 +10,7 @@
   {
    "fieldname": "properties", 
    "fieldtype": "Section Break", 
-   "in_list_view": 1, 
+   "in_list_view": 0, 
    "label": "Account Details", 
    "oldfieldtype": "Section Break", 
    "permlevel": 0
@@ -18,7 +18,7 @@
   {
    "fieldname": "column_break0", 
    "fieldtype": "Column Break", 
-   "in_list_view": 1, 
+   "in_list_view": 0, 
    "permlevel": 0, 
    "width": "50%"
   }, 
@@ -37,18 +37,6 @@
    "search_index": 1
   }, 
   {
-   "fieldname": "level", 
-   "fieldtype": "Int", 
-   "hidden": 1, 
-   "in_list_view": 1, 
-   "label": "Level", 
-   "oldfieldname": "level", 
-   "oldfieldtype": "Int", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 1
-  }, 
-  {
    "default": "Ledger", 
    "fieldname": "group_or_ledger", 
    "fieldtype": "Select", 
@@ -211,7 +199,7 @@
  "icon": "icon-money", 
  "idx": 1, 
  "in_create": 1, 
- "modified": "2014-04-28 16:52:32.059072", 
+ "modified": "2014-04-30 11:28:52.916199", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Account", 
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.json b/erpnext/accounts/doctype/journal_voucher/journal_voucher.json
index 872fffa..44d6971 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.json
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.json
@@ -1,7 +1,7 @@
 {
  "allow_import": 1, 
  "autoname": "naming_series:", 
- "creation": "2013-03-25 10:53:52.000000", 
+ "creation": "2013-03-25 10:53:52", 
  "docstatus": 0, 
  "doctype": "DocType", 
  "fields": [
@@ -34,6 +34,7 @@
    "reqd": 1
   }, 
   {
+   "default": "Journal Entry", 
    "fieldname": "voucher_type", 
    "fieldtype": "Select", 
    "in_filter": 1, 
@@ -41,10 +42,11 @@
    "label": "Voucher Type", 
    "oldfieldname": "voucher_type", 
    "oldfieldtype": "Select", 
-   "options": "\nJournal Entry\nBank Voucher\nCash Voucher\nCredit Card Voucher\nDebit Note\nCredit Note\nContra Voucher\nExcise Voucher\nWrite Off Voucher\nOpening Entry", 
+   "options": "Journal Entry\nBank Voucher\nCash Voucher\nCredit Card Voucher\nDebit Note\nCredit Note\nContra Voucher\nExcise Voucher\nWrite Off Voucher\nOpening Entry", 
    "permlevel": 0, 
    "print_hide": 0, 
    "read_only": 0, 
+   "reqd": 1, 
    "search_index": 1
   }, 
   {
@@ -438,7 +440,7 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2014-01-20 17:48:51.000000", 
+ "modified": "2014-04-29 14:55:19.872882", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Journal Voucher", 
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
index 79da744..fae4646 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.js
@@ -1,36 +1,51 @@
 // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-cur_frm.add_fetch("account", "company", "company")
-
 cur_frm.cscript.onload_post_render = function(doc) {
 	$(cur_frm.get_field("reconcile").input).addClass("btn-info");
 }
 
-cur_frm.cscript.refresh = function(doc) {
-	cur_frm.set_intro("");
-	if(!doc.voucher_no) {
-		cur_frm.set_intro(__("Select the Invoice against which you want to allocate payments."));
-	} else {
-		cur_frm.set_intro(__("Set allocated amount against each Payment Entry and click 'Allocate'."));
-	}
-}
-
 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.gl_entry_details",
+			query: "erpnext.accounts.doctype.payment_to_invoice_matching_tool.payment_to_invoice_matching_tool.get_voucher_nos",
 			filters: {
-				"dt": doc.voucher_type,
-				"acc": doc.account
+				"voucher_type": doc.voucher_type,
+				"account": doc.account
 			}
-		}		
+		}
 	}
 }
 
-cur_frm.cscript.voucher_no  = function(doc, cdt, cdn) {
-	return get_server_fields('get_voucher_details', '', '', doc, cdt, cdn, 1)
-}
\ No newline at end of file
+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.amt_to_be_reconciled = function(doc, cdt, cdn) {
+	var total_allocated_amount = 0
+	$.each(cur_frm.doc.against_entries, function(i, d) {
+		if(d.amt_to_be_reconciled > 0) total_allocated_amount += flt(d.amt_to_be_reconciled);
+		else if (d.amt_to_be_reconciled < 0) frappe.throw(__("Allocated amount can not be negative"));
+	})
+	cur_frm.set_value("total_allocated_amount", total_allocated_amount);
+}
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.json b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.json
index ce1a06b..8d12f08 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.json
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.json
@@ -1,5 +1,5 @@
 {
- "creation": "2013-01-30 12:49:46.000000", 
+ "creation": "2013-01-30 12:49:46", 
  "docstatus": 0, 
  "doctype": "DocType", 
  "document_type": "Other", 
@@ -7,31 +7,17 @@
   {
    "fieldname": "account", 
    "fieldtype": "Link", 
+   "in_list_view": 0, 
    "label": "Account", 
    "options": "Account", 
    "permlevel": 0, 
    "reqd": 1
   }, 
   {
-   "fieldname": "account_type", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "label": "Account Type", 
-   "permlevel": 0, 
-   "read_only": 1
-  }, 
-  {
-   "fieldname": "company", 
-   "fieldtype": "Link", 
-   "hidden": 1, 
-   "label": "Company", 
-   "options": "Company", 
-   "permlevel": 0, 
-   "print_hide": 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, 
@@ -40,21 +26,16 @@
   {
    "fieldname": "voucher_no", 
    "fieldtype": "Link", 
+   "in_list_view": 1, 
    "label": "Voucher No", 
    "options": "[Select]", 
    "permlevel": 0, 
    "reqd": 1
   }, 
   {
-   "fieldname": "pull_payment_entries", 
-   "fieldtype": "Button", 
-   "label": "Pull Payment Entries", 
-   "options": "get_payment_entries", 
-   "permlevel": 0
-  }, 
-  {
    "fieldname": "column_break1", 
    "fieldtype": "Column Break", 
+   "in_list_view": 0, 
    "permlevel": 0, 
    "print_width": "50%", 
    "width": "50%"
@@ -62,55 +43,27 @@
   {
    "fieldname": "total_amount", 
    "fieldtype": "Currency", 
+   "in_list_view": 1, 
    "label": "Total Amount", 
-   "options": "Company:company:default_currency", 
+   "options": "", 
    "permlevel": 0, 
    "read_only": 1
   }, 
   {
-   "fieldname": "pending_amt_to_reconcile", 
+   "fieldname": "unmatched_amount", 
    "fieldtype": "Currency", 
-   "label": "Outstanding Amount", 
-   "options": "Company:company:default_currency", 
+   "label": "Unmatched Amount", 
+   "options": "", 
    "permlevel": 0, 
    "read_only": 1
   }, 
   {
-   "fieldname": "payment_entries", 
+   "fieldname": "against_entries_section", 
    "fieldtype": "Section Break", 
-   "label": "Payment Entries", 
+   "label": "Against Entries", 
    "permlevel": 0
   }, 
   {
-   "description": "Update allocated amount in the above table and then click \"Allocate\" button", 
-   "fieldname": "ir_payment_details", 
-   "fieldtype": "Table", 
-   "label": "Payment Entries", 
-   "options": "Payment to Invoice Matching Tool Detail", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "reconcile", 
-   "fieldtype": "Button", 
-   "label": "Allocate", 
-   "options": "reconcile", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "section_break0", 
-   "fieldtype": "Section Break", 
-   "options": "Simple", 
-   "permlevel": 0
-  }, 
-  {
-   "fieldname": "column_break2", 
-   "fieldtype": "Column Break", 
-   "label": "Filter By Date", 
-   "permlevel": 0, 
-   "print_width": "50%", 
-   "width": "50%"
-  }, 
-  {
    "fieldname": "from_date", 
    "fieldtype": "Date", 
    "label": "From Date", 
@@ -123,38 +76,86 @@
    "permlevel": 0
   }, 
   {
-   "fieldname": "help_html", 
-   "fieldtype": "HTML", 
-   "label": "Help HTML", 
-   "options": "Click \"Pull Payment Entries\" to refresh the table with filters.", 
-   "permlevel": 0
-  }, 
-  {
    "fieldname": "column_break3", 
    "fieldtype": "Column Break", 
-   "label": "Filter By Amount", 
+   "label": "", 
    "permlevel": 0, 
    "print_width": "50%", 
    "width": "50%"
   }, 
   {
    "fieldname": "amt_greater_than", 
-   "fieldtype": "Data", 
+   "fieldtype": "Currency", 
    "label": "Amount >=", 
    "permlevel": 0
   }, 
   {
    "fieldname": "amt_less_than", 
-   "fieldtype": "Data", 
+   "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": 1, 
+ "hide_toolbar": 0, 
  "icon": "icon-magic", 
  "idx": 1, 
  "issingle": 1, 
- "modified": "2013-12-20 19:23:24.000000", 
+ "modified": "2014-04-30 17:11:05.908619", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment to Invoice Matching Tool", 
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
index f845138..6ec28d9 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
@@ -17,69 +17,99 @@
 			where voucher_type = %s and voucher_no = %s
 			and account = %s""", (self.voucher_type, self.voucher_no, self.account))
 
-		total_amount = total_amount and flt(total_amount[0][0]) or 0
+		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 = %s and voucher_no != %s
-			and account = %s""", (self.voucher_no, self.voucher_no, self.account))
+			select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)))
+			from `tabGL Entry`
+			where against_voucher = %s and account = %s
+		""", (self.voucher_no, self.account))
 
 		reconciled_payment = reconciled_payment and flt(reconciled_payment[0][0]) or 0
-		ret = {
-			'total_amount': total_amount,
-			'pending_amt_to_reconcile': total_amount - reconciled_payment
-		}
+		self.unmatched_amount = self.total_amount - reconciled_payment
 
-		return ret
-
-	def get_payment_entries(self):
+	def get_against_entries(self):
 		"""
 			Get payment entries for the account and period
 			Payment entry will be decided based on account type (Dr/Cr)
 		"""
 
-		self.set('ir_payment_details', [])
+		self.set('against_entries', [])
 		gle = self.get_gl_entries()
-		self.create_payment_table(gle)
+		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 ""
+		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
+			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
+			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(sum(ifnull(t2.credit, 0)) - sum(ifnull(t2.debit, 0))) as amt_due, t1.remark,
-			 	t2.against_account, t2.name as voucher_detail_no
+			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 t1.name != %s %s group by t1.name, t2.name """ %
-			('%s', '%s', cond), (self.account, self.voucher_no), as_dict=1)
+			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_payment_table(self, gle):
+	def create_against_entries_table(self, gle):
+		adjusted_jv = {}
 		for d in gle:
-			ch = self.append('ir_payment_details', {})
-			ch.voucher_no = d.get('voucher_no')
-			ch.posting_date = d.get('posting_date')
-			ch.amt_due =  flt(d.get('amt_due'))
-			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')
+			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):
-		if not self.account:
-			msgprint(_("Please select Account first"), raise_exception=1)
+		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):
 		"""
@@ -88,23 +118,26 @@
 			2. split into multiple rows if partially adjusted, assign against voucher
 			3. submit payment voucher
 		"""
-		if not self.voucher_no or not frappe.db.sql("""select name from `tab%s`
-				where name = %s""" % (self.voucher_type, '%s'), self.voucher_no):
-			frappe.throw(_("Please select valid Voucher No to proceed"))
+		self.validate_mandatory()
+
+		if not self.total_allocated_amount:
+			frappe.throw(_("You must allocate amount before reconcile"))
+
+		dr_or_cr = "credit" if self.total_amount > 0 else "debit"
 
 		lst = []
-		for d in self.get('ir_payment_details'):
-			if flt(d.amt_to_be_reconciled) > 0:
+		for d in self.get('against_entries'):
+			if flt(d.allocated_amount) > 0:
 				args = {
 					'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' : 'No',
-					# 'dr_or_cr' :  self.account_type=='debit' and 'credit' or 'debit',
-					'unadjusted_amt' : flt(d.amt_due),
-					'allocated_amt' : flt(d.amt_to_be_reconciled)
+					'is_advance' : d.is_advance,
+					'dr_or_cr' : dr_or_cr,
+					'unadjusted_amt' : flt(d.original_amount),
+					'allocated_amt' : flt(d.allocated_amount)
 				}
 
 				lst.append(args)
@@ -112,35 +145,34 @@
 		if lst:
 			from erpnext.accounts.utils import reconcile_against_document
 			reconcile_against_document(lst)
+			self.get_against_entries()
 			msgprint(_("Successfully allocated"))
-		else:
-			msgprint(_("No amount allocated"), raise_exception=1)
 
-def gl_entry_details(doctype, txt, searchfield, start, page_len, filters):
-	from erpnext.controllers.queries import get_match_cond
-	return frappe.db.sql("""select gle.voucher_no, gle.posting_date,
-		gle.debit, gle.credit from `tabGL Entry` gle
-	    where gle.account = '%(acc)s'
-	    	and gle.voucher_type = '%(dt)s'
-			and gle.voucher_no like '%(txt)s'
-	    	and (ifnull(gle.against_voucher, '') = ''
-	    		or ifnull(gle.against_voucher, '') = gle.voucher_no )
-	   		and (select ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
-				from `tabGL Entry`
-	        	where account = '%(acc)s'
-				and against_voucher_type = '%(dt)s'
-	        	and against_voucher = gle.voucher_no
-	        	and voucher_no != gle.voucher_no)
-					!= abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0))
-			and if(gle.voucher_type='Sales Invoice', ifnull((select is_pos from `tabSales Invoice`
-				where name=gle.voucher_no), 0), 0)=0
-			%(mcond)s
-	    ORDER BY gle.posting_date desc, gle.voucher_no desc
-	    limit %(start)s, %(page_len)s""" % {
-			"dt":filters["dt"],
-			"acc":filters["acc"],
-			'mcond':get_match_cond(doctype),
-			'txt': "%%%s%%" % txt,
-			"start": start,
-			"page_len": page_len
-		})
+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 adjusted_amount != d.amount:
+			non_reconclied_entries.append([d.voucher_no, d.posting_date, d.amount])
+
+	return non_reconclied_entries
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool_detail/payment_to_invoice_matching_tool_detail.json b/erpnext/accounts/doctype/payment_to_invoice_matching_tool_detail/payment_to_invoice_matching_tool_detail.json
index eecbb11..247f023 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool_detail/payment_to_invoice_matching_tool_detail.json
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool_detail/payment_to_invoice_matching_tool_detail.json
@@ -1,5 +1,5 @@
 {
- "creation": "2013-02-22 01:27:39.000000", 
+ "creation": "2013-02-22 01:27:39", 
  "docstatus": 0, 
  "doctype": "DocType", 
  "fields": [
@@ -16,7 +16,7 @@
    "width": "140px"
   }, 
   {
-   "fieldname": "amt_due", 
+   "fieldname": "unmatched_amount", 
    "fieldtype": "Currency", 
    "in_list_view": 1, 
    "label": "Unmatched Amount", 
@@ -25,7 +25,7 @@
    "read_only": 1
   }, 
   {
-   "fieldname": "amt_to_be_reconciled", 
+   "fieldname": "allocated_amount", 
    "fieldtype": "Currency", 
    "in_list_view": 1, 
    "label": "Allocated Amount", 
@@ -34,6 +34,11 @@
    "reqd": 1
   }, 
   {
+   "fieldname": "col_break1", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0
+  }, 
+  {
    "fieldname": "posting_date", 
    "fieldtype": "Date", 
    "in_list_view": 1, 
@@ -76,13 +81,30 @@
    "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": "2013-12-20 19:23:24.000000", 
+ "modified": "2014-04-30 19:27:15.993641", 
  "modified_by": "Administrator", 
  "module": "Accounts", 
  "name": "Payment to Invoice Matching Tool Detail", 
- "owner": "Administrator"
+ "owner": "Administrator", 
+ "permissions": []
 }
\ No newline at end of file
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index e215ae6..1a09d38 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -125,7 +125,7 @@
 	"""
 	for d in args:
 		check_if_jv_modified(d)
-
+		validate_allocated_amount(d)
 		against_fld = {
 			'Journal Voucher' : 'against_jv',
 			'Sales Invoice' : 'against_invoice',
@@ -159,11 +159,17 @@
 		and ifnull(t2.against_voucher, '')=''
 		and ifnull(t2.against_invoice, '')='' and ifnull(t2.against_jv, '')=''
 		and t1.name = '%(voucher_no)s' and t2.name = '%(voucher_detail_no)s'
-		and t1.docstatus=1 and t2.%(dr_or_cr)s = %(unadjusted_amt)s""" % args)
+		and t1.docstatus=1 """ % args)
 
 	if not ret:
 		throw(_("""Payment Entry has been modified after you pulled it. Please pull it again."""))
 
+def validate_allocated_amount(args):
+	if args.get("allocated_amt") < 0:
+		throw(_("Allocated amount can not be negative"))
+	elif args.get("allocated_amt") > args.get("unadjusted_amt"):
+		throw(_("Allocated amount can not greater than unadusted amount"))
+
 def update_against_doc(d, jv_obj):
 	"""
 		Updates against document, if partial amount splits into rows
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 7518c2a..54f9b63 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -35,3 +35,4 @@
 execute:frappe.delete_doc("DocType", "MIS Control")
 execute:frappe.delete_doc("Page", "Financial Statements")
 execute:frappe.delete_doc("DocType", "Stock Ledger")
+execute:frappe.db.sql("update `tabJournal Voucher` set voucher_type='Journal Entry' where ifnull(voucher_type, '')=''")