From e4acf763a510e49b3171dbca4d79d4c8fb6af284 Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Mon, 17 Jul 2017 11:26:42 +0530 Subject: [PATCH] make payment request for the fee --- .../payment_request/payment_request.py | 13 +- .../doctype/sales_invoice/sales_invoice.py | 8 + .../doctype/fee_component/fee_component.json | 32 +- .../doctype/fee_request/fee_request.js | 9 +- .../doctype/fee_request/fee_request.json | 49 +- .../doctype/fee_request/fee_request.py | 4 - .../doctype/fee_structure/fee_structure.json | 126 +++- erpnext/schools/doctype/fees/fees.js | 115 +++- erpnext/schools/doctype/fees/fees.json | 650 +++++++++++++++--- erpnext/schools/doctype/fees/fees.py | 52 +- erpnext/schools/doctype/fees/fees_list.js | 6 +- 11 files changed, 863 insertions(+), 201 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index f3594b205b..3796877293 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -61,6 +61,7 @@ class PaymentRequest(Document): def set_payment_request_url(self): if self.payment_account: self.payment_url = self.get_payment_url() + print (self.payment_url) if self.payment_url: self.db_set('payment_url', self.payment_url) @@ -69,8 +70,11 @@ class PaymentRequest(Document): self.db_set('status', 'Initiated') def get_payment_url(self): - data = frappe.db.get_value(self.reference_doctype, self.reference_name, - ["company", "customer_name"], as_dict=1) + if self.reference_doctype != "Fees": + data = frappe.db.get_value(self.reference_doctype, self.reference_name, ["company", "customer_name"], as_dict=1) + else: + data = frappe.db.get_value(self.reference_doctype, self.reference_name, ["student_name"], as_dict=1) + data.update({"company": frappe.defaults.get_defaults().company}) controller = get_payment_gateway_controller(self.payment_gateway) controller.validate_transaction_currency(self.currency) @@ -98,6 +102,7 @@ class PaymentRequest(Document): def create_payment_entry(self, submit=True): """create entry""" + print ("creating the payment entry") frappe.flags.ignore_account_permission = True ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) @@ -252,6 +257,7 @@ def make_payment_request(**args): if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True + print ("comign in creatinf the new dottype") if args.submit_doc: pr.insert(ignore_permissions=True) pr.submit() @@ -277,6 +283,9 @@ def get_amount(ref_doc, dt): else: grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate + if dt == "Fees": + grand_total = ref_doc.outstanding_amount + if grand_total > 0 : return grand_total diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 7a787c4cba..800ec1460d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -583,8 +583,11 @@ class SalesInvoice(SellingController): return if not gl_entries: + print ("if not gl_entries") gl_entries = self.get_gl_entries() + print (gl_entries) + if gl_entries: from erpnext.accounts.general_ledger import make_gl_entries @@ -593,6 +596,7 @@ class SalesInvoice(SellingController): make_gl_entries(gl_entries, cancel=(self.docstatus == 2), update_outstanding=update_outstanding, merge_entries=False) + # frappe.throw("go ahead bro") if update_outstanding == "No": from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt @@ -609,18 +613,22 @@ class SalesInvoice(SellingController): delete_gl_entries(voucher_type=self.doctype, voucher_no=self.name) def get_gl_entries(self, warehouse_account=None): + print ("inside the get_gl_entries") from erpnext.accounts.general_ledger import merge_similar_entries gl_entries = [] self.make_customer_gl_entry(gl_entries) + print ("make cuustomer gl entry", gl_entries) self.make_tax_gl_entries(gl_entries) self.make_item_gl_entries(gl_entries) + print ("make item gl entry", gl_entries) # merge gl entries before adding pos entries gl_entries = merge_similar_entries(gl_entries) + print ("after merged gl entry", gl_entries) self.make_pos_gl_entries(gl_entries) self.make_gle_for_change_amount(gl_entries) diff --git a/erpnext/schools/doctype/fee_component/fee_component.json b/erpnext/schools/doctype/fee_component/fee_component.json index 2b4e00220f..da659fa511 100644 --- a/erpnext/schools/doctype/fee_component/fee_component.json +++ b/erpnext/schools/doctype/fee_component/fee_component.json @@ -107,6 +107,36 @@ "set_only_once": 0, "unique": 0, "width": "300px" + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Description", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -120,7 +150,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-06-30 08:21:47.947269", + "modified": "2017-07-18 15:03:18.945746", "modified_by": "Administrator", "module": "Schools", "name": "Fee Component", diff --git a/erpnext/schools/doctype/fee_request/fee_request.js b/erpnext/schools/doctype/fee_request/fee_request.js index 577b7ef6a3..30f8e5bfaa 100644 --- a/erpnext/schools/doctype/fee_request/fee_request.js +++ b/erpnext/schools/doctype/fee_request/fee_request.js @@ -3,14 +3,7 @@ frappe.ui.form.on('Fee Request', { refresh: function(frm) { - - }, - fee_request_against: function(frm) { - if (frm.doc.fee_request_against == "Program") { - frm.set_value('student_groups', null) - } else if (frm.doc.fee_request_against == "Student Group") { - frm.set_value('programs', null) - } + frm.disable_save(); }, fee_structure: function(frm) { if (frm.doc.fee_structure) { diff --git a/erpnext/schools/doctype/fee_request/fee_request.json b/erpnext/schools/doctype/fee_request/fee_request.json index cea38ddd3a..3d7fa8f515 100644 --- a/erpnext/schools/doctype/fee_request/fee_request.json +++ b/erpnext/schools/doctype/fee_request/fee_request.json @@ -5,7 +5,7 @@ "allow_rename": 0, "autoname": "naming_series:", "beta": 0, - "creation": "2015-09-22 16:57:22.143710", + "creation": "2017-07-18 15:21:21.527136", "custom": 0, "docstatus": 0, "doctype": "DocType", @@ -411,36 +411,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "amended_from", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Amended From", - "length": 0, - "no_copy": 1, - "options": "Fee Request", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -564,16 +534,15 @@ ], "has_web_view": 0, "hide_heading": 0, - "hide_toolbar": 0, + "hide_toolbar": 1, "idx": 0, "image_view": 0, "in_create": 0, - "is_submittable": 1, - "issingle": 0, + "is_submittable": 0, + "issingle": 1, "istable": 0, "max_attachments": 0, - "menu_index": 0, - "modified": "2017-07-13 18:19:26.612801", + "modified": "2017-07-18 15:28:11.201755", "modified_by": "Administrator", "module": "Schools", "name": "Fee Request", @@ -583,21 +552,21 @@ { "amend": 0, "apply_user_permissions": 0, - "cancel": 1, + "cancel": 0, "create": 1, "delete": 1, "email": 1, - "export": 1, + "export": 0, "if_owner": 0, "import": 0, "permlevel": 0, "print": 1, "read": 1, - "report": 1, + "report": 0, "role": "Academics User", "set_user_permissions": 0, "share": 1, - "submit": 1, + "submit": 0, "write": 1 } ], diff --git a/erpnext/schools/doctype/fee_request/fee_request.py b/erpnext/schools/doctype/fee_request/fee_request.py index 3877414d23..a3552b9b7d 100644 --- a/erpnext/schools/doctype/fee_request/fee_request.py +++ b/erpnext/schools/doctype/fee_request/fee_request.py @@ -49,10 +49,6 @@ class FeeRequest(Document): self.grand_total = total_fee_count*self.total_amount self.grand_total_in_words = money_in_words(self.grand_total) - if self.fee_request_against == "Student Group": - for student_group in self.student_groups: - students += get_student_group_students(student_group, self.academic_year) - @frappe.whitelist() def get_fee_structure(source_name,target_doc=None): diff --git a/erpnext/schools/doctype/fee_structure/fee_structure.json b/erpnext/schools/doctype/fee_structure/fee_structure.json index ecbf62009e..f5b48dcbd7 100644 --- a/erpnext/schools/doctype/fee_structure/fee_structure.json +++ b/erpnext/schools/doctype/fee_structure/fee_structure.json @@ -13,6 +13,37 @@ "editable_grid": 0, "engine": "InnoDB", "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Naming Series", + "length": 0, + "no_copy": 0, + "options": "FS.", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 1, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -41,7 +72,7 @@ "read_only": 0, "remember_last_selected_value": 0, "report_hide": 0, - "reqd": 1, + "reqd": 0, "search_index": 1, "set_only_once": 0, "unique": 0 @@ -77,37 +108,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Naming Series", - "length": 0, - "no_copy": 0, - "options": "FS.", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 1, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -202,6 +202,37 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "", + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -291,6 +322,35 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_11", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -334,7 +394,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2017-07-13 15:20:45.727524", + "modified": "2017-07-18 15:02:29.909472", "modified_by": "Administrator", "module": "Schools", "name": "Fee Structure", diff --git a/erpnext/schools/doctype/fees/fees.js b/erpnext/schools/doctype/fees/fees.js index e5a840a3b2..d5e71fe9ec 100644 --- a/erpnext/schools/doctype/fees/fees.js +++ b/erpnext/schools/doctype/fees/fees.js @@ -2,9 +2,8 @@ cur_frm.add_fetch("student", "title", "student_name"); frappe.ui.form.on("Fees", { - onload: function(frm){ - cur_frm.set_query("academic_term",function(){ + frm.set_query("academic_term",function(){ return{ "filters":{ "academic_year": (frm.doc.academic_year) @@ -12,35 +11,102 @@ frappe.ui.form.on("Fees", { }; }); - cur_frm.set_query("fee_structure",function(){ + frm.set_query("fee_structure",function(){ return{ "filters":{ "academic_term": (frm.doc.academic_term) } }; }); + + // debit account for booking the fee + frm.set_query("debit_to", function(doc) { + return { + filters: { + 'account_type': 'Receivable', + 'is_group': 0, + 'company': doc.company + } + } + }); + + if (!frm.doc.posting_date) { + frm.doc.posting_date = frappe.datetime.get_today() + } }, refresh: function(frm) { - if (frm.doc.docstatus === 1 && (frm.doc.total_amount > frm.doc.paid_amount)) { - frm.add_custom_button(__("Collect Fees"), function() { - frappe.prompt({fieldtype:"Float", label: __("Amount Paid"), fieldname:"amt"}, - function(data) { - frappe.call({ - method:"erpnext.schools.api.collect_fees", - args: { - "fees": frm.doc.name, - "amt": data.amt - }, - callback: function(r) { - frm.doc.paid_amount = r.message - frm.doc.outstanding_amount = frm.doc.total_amount - r.message - frm.refresh() - } - }); - }, __("Enter Paid Amount"), __("Collect")); - }); + if(frm.doc.docstatus == 0 && frm.doc.set_posting_time) { + frm.set_df_property('posting_date', 'read_only', 0); + frm.set_df_property('posting_time', 'read_only', 0); + } else { + frm.set_df_property('posting_date', 'read_only', 1); + frm.set_df_property('posting_time', 'read_only', 1); } + if(frm.doc.docstatus===1) { + frm.add_custom_button(__('Accounting Ledger'), function() { + frappe.route_options = { + voucher_no: frm.doc.name, + from_date: frm.doc.posting_date, + to_date: frm.doc.posting_date, + company: frm.doc.company, + group_by_voucher: false + }; + frappe.set_route("query-report", "General Ledger"); + }, __("View")); + } + if(frm.doc.docstatus===1 && frm.doc.outstanding_amount>0) { + frm.add_custom_button(__("Payment Request"), function() { + frm.events.make_payment_request(frm) + }, __("Make")); + frm.page.set_inner_btn_group_as_primary(__("Make")); + } + if(frm.doc.docstatus===1 && frm.doc.outstanding_amount!=0) { + frm.add_custom_button(__("Payment"), function() { + frm.events.make_payment_entry(frm) + }, __("Make")); + frm.page.set_inner_btn_group_as_primary(__("Make")); + } + }, + // if (frm.doc.docstatus === 1 && (frm.doc.total_amount > frm.doc.paid_amount)) { + // frm.add_custom_button(__("Collect Fees"), function() { + // frappe.prompt({fieldtype:"Float", label: __("Amount Paid"), fieldname:"amt"}, + // function(data) { + // frappe.call({ + // method:"erpnext.schools.api.collect_fees", + // args: { + // "fees": frm.doc.name, + // "amt": data.amt + // }, + // callback: function(r) { + // frm.doc.paid_amount = r.message + // frm.doc.outstanding_amount = frm.doc.total_amount - r.message + // frm.refresh() + // } + // }); + // }, __("Enter Paid Amount"), __("Collect")); + // }); + // } + + make_payment_request: function(frm) { + frappe.call({ + method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request", + args: { + "dt": cur_frm.doc.doctype, + "dn": cur_frm.doc.name, + "recipient_id": cur_frm.doc.contact_email + }, + callback: function(r) { + if(!r.exc){ + var doc = frappe.model.sync(r.message); + frappe.set_route("Form", r.message.doctype, r.message.name); + } + } + }) + }, + + set_posting_time: function(frm) { + frm.refresh() }, program: function(frm) { @@ -88,14 +154,15 @@ frappe.ui.form.on("Fees", { }, calculate_total_amount: function(frm) { - var total_amount = 0; + var grand_total = 0; for(var i=0;i doc.paid_amount) && doc.due_date < get_today()) { + if ((doc.grand_total > doc.paid_amount) && doc.due_date < get_today()) { return [__("Overdue"), "red", ["due_date,<," + get_today()], ["due_date,<," + get_today()]]; } - else if (doc.total_amount > doc.paid_amount) { + else if (doc.grand_total > doc.paid_amount) { return [__("Pending"), "orange"]; } else {