diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index e6a3131449..3fcf535131 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.json +++ b/erpnext/accounts/doctype/payment_request/payment_request.json @@ -362,7 +362,7 @@ "collapsible": 0, "columns": 0, "fieldname": "message", - "fieldtype": "Small Text", + "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -400,7 +400,7 @@ "label": "Message Examples", "length": 0, "no_copy": 0, - "options": "
Message Example
\n\n<p> Thank You for being a part of {{ doc.company }}! We hope you are enjoying the service.</p>\n\n<p> Please find enclosed the E Bill statement. The outstanding amount is {{ doc.grand_total }}.</p>\n\n<p> We don't want you to be spending time running around in order to pay for your Bill.
After all, life is beautiful and the time you have in hand should be spent to enjoy it!
So here are our little ways to help you get more time for life! </p>\n\n<a href=\"{{ payment_url }}\"> click here to pay </a>\n\n
\n", + "options": "
Message Example
\n\n<p>Dear {{ doc.contact_person }},</p>\n\n<p>Requesting payment for {{ doc.doctype }}, {{ doc.name }} for {{ doc.grand_total }}.</p>\n\n<a href=\"{{ payment_url }}\"> click here to pay </a>\n\n
\n", "permlevel": 0, "precision": "", "print_hide": 0, @@ -675,13 +675,13 @@ "hide_toolbar": 0, "idx": 0, "image_view": 0, - "in_create": 1, + "in_create": 0, "in_dialog": 0, "is_submittable": 1, "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-12-15 14:46:19.662816", + "modified": "2017-02-23 05:03:37.464863", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Request", diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 26663fd570..99deb3fd96 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -26,7 +26,7 @@ class PaymentRequest(Document): ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) if self.payment_account and ref_doc.currency != frappe.db.get_value("Account", self.payment_account, "account_currency"): frappe.throw(_("Transaction currency must be same as Payment Gateway currency")) - + def on_submit(self): send_mail = True self.make_communication_entry() @@ -54,20 +54,20 @@ class PaymentRequest(Document): def set_payment_request_url(self): if self.payment_account: self.payment_url = self.get_payment_url() - + if self.payment_url: self.db_set('payment_url', self.payment_url) - + if self.payment_url or not self.payment_gateway_account: 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) - + controller = get_integration_controller(self.payment_gateway) controller.validate_transaction_currency(self.currency) - + return controller.get_payment_url(**{ "amount": self.grand_total, "title": data.company, @@ -83,7 +83,7 @@ class PaymentRequest(Document): def set_as_paid(self): if frappe.session.user == "Guest": frappe.set_user("Administrator") - + payment_entry = self.create_payment_entry() self.make_invoice() @@ -157,7 +157,7 @@ class PaymentRequest(Document): def set_as_cancelled(self): self.db_set("status", "Cancelled") - + def check_if_payment_entry_exists(self): if self.status == "Paid": payment_entry = frappe.db.sql_list("""select parent from `tabPayment Entry Reference` @@ -179,11 +179,11 @@ class PaymentRequest(Document): def get_payment_success_url(self): return self.payment_success_url - + def on_payment_authorized(self, status=None): if not status: return - + shopping_cart_settings = frappe.get_doc("Shopping Cart Settings") if status in ["Authorized", "Completed"]: @@ -203,9 +203,9 @@ class PaymentRequest(Document): }).get(success_url, "me") else: redirect_to = get_url("/orders/{0}".format(self.reference_name)) - + return redirect_to - + @frappe.whitelist(allow_guest=True) def make_payment_request(**args): """Make payment request""" @@ -234,7 +234,7 @@ def make_payment_request(**args): "grand_total": grand_total, "email_to": args.recipient_id or "", "subject": "Payment Request for %s"%args.dn, - "message": gateway_account.get("message") or get_dummy_message(args.use_dummy_message), + "message": gateway_account.get("message") or get_dummy_message(ref_doc), "reference_doctype": args.dt, "reference_name": args.dn }) @@ -319,19 +319,24 @@ def make_status_as_paid(doc, method): payment_request_name = frappe.db.get_value("Payment Request", {"reference_doctype": ref.reference_doctype, "reference_name": ref.reference_name, "docstatus": 1}) - + if payment_request_name: doc = frappe.get_doc("Payment Request", payment_request_name) if doc.status != "Paid": doc.db_set('status', 'Paid') frappe.db.commit() -def get_dummy_message(use_dummy_message=True): - return """ -

Hope you are enjoying a service. Please consider bank details for payment

-

Bank Details


-

Bank Name : National Bank

-

Account Number : 123456789000872

-

IFSC code : NB000001

-

Account Name : Wind Power LLC

- """ +def get_dummy_message(doc): + return frappe.render_template("""{% if doc.contact_person -%} +

Dear {{ doc.contact_person }},

+{%- else %}

Hello,

{% endif %} + +

{{ _("Requesting payment against {0} {1} for amount {2}").format(doc.doctype, + doc.name, doc.get_formatted("grand_total")) }}

+ +{{ _("Make Payment") }} + +

{{ _("If you have any questions, please get back to us.") }}

+ +

{{ _("Thank you for your business!") }}

+""", dict(doc=doc, payment_url = '{{ payment_url }}')) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index b6378f1eb5..5f4e8c05d9 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -8,7 +8,7 @@ frappe.provide("erpnext.accounts"); erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ onload: function() { this._super(); - + if(!this.frm.doc.__islocal) { // show credit_to in print format if(!this.frm.doc.supplier && this.frm.doc.credit_to) { @@ -32,7 +32,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ if(doc.update_stock==1 && doc.docstatus==1) { this.show_stock_ledger(); } - + if(!doc.is_return && doc.docstatus==1) { if(doc.outstanding_amount != 0) { this.frm.add_custom_button(__('Payment'), this.make_payment_entry, __("Make")); @@ -336,6 +336,12 @@ cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){ } frappe.ui.form.on("Purchase Invoice", { + setup: function(frm) { + frm.custom_make_buttons = { + 'Purchase Invoice': 'Debit Note', + 'Payment Entry': 'Payment' + } + }, onload: function(frm) { $.each(["warehouse", "rejected_warehouse"], function(i, field) { frm.set_query(field, "items", function() { diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 6268fe3af3..1564b48c68 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -469,6 +469,12 @@ cur_frm.set_query("asset", "items", function(doc, cdt, cdn) { frappe.ui.form.on('Sales Invoice', { setup: function(frm){ + frm.custom_make_buttons = { + 'Delivery Note': 'Delivery', + 'Sales Invoice': 'Sales Return', + 'Payment Request': 'Payment Request', + 'Payment': 'Payment Entry' + }, frm.fields_dict["timesheets"].grid.get_field("time_sheet").get_query = function(doc, cdt, cdn){ return{ query: "erpnext.projects.doctype.timesheet.timesheet.get_timesheet", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js index 15356fd471..66b3e31031 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.js +++ b/erpnext/buying/doctype/purchase_order/purchase_order.js @@ -6,6 +6,13 @@ frappe.provide("erpnext.buying"); {% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; frappe.ui.form.on("Purchase Order", { + setup: function(frm) { + frm.custom_make_buttons = { + 'Purchase Receipt': 'Receive', + 'Purchase Invoice': 'Invoice', + 'Stock Entry': 'Material to Supplier' + } + }, onload: function(frm) { erpnext.queries.setup_queries(frm, "Warehouse", function() { return erpnext.queries.warehouse(frm.doc); @@ -28,10 +35,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend( var item = cur_frm.doc.items[i]; if(item.delivered_by_supplier !== 1) { allow_receipt = true; - } - - else { - is_drop_ship = true + } else { + is_drop_ship = true; } if(is_drop_ship && allow_receipt) { diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js index 6847a98aa1..d10c17816e 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js @@ -8,6 +8,10 @@ cur_frm.add_fetch('contact', 'email_id', 'email_id') frappe.ui.form.on("Request for Quotation",{ setup: function(frm) { + frm.custom_make_buttons = { + 'Supplier Quotation': 'Supplier Quotation' + } + frm.fields_dict["suppliers"].grid.get_field("contact").get_query = function(doc, cdt, cdn){ var d =locals[cdt][cdn]; return { diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js index 0323c2faf0..eaec8f838b 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js @@ -4,6 +4,14 @@ // attach required files {% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; +frappe.ui.form.on('Suppier Quotation', { + setup: function() { + frm.custom_make_buttons = { + 'Purchase Order': 'Purchase Order' + } + } +}); + erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.extend({ refresh: function() { this._super(); diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js index b86a5a5287..45596b15d3 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.js +++ b/erpnext/crm/doctype/opportunity/opportunity.js @@ -5,6 +5,12 @@ frappe.provide("erpnext.crm"); cur_frm.email_field = "contact_email"; frappe.ui.form.on("Opportunity", { + setup: function(frm) { + frm.custom_make_buttons = { + 'Quotation': 'Quotation', + 'Supplier Quotation': 'Supplier Quotation' + } + }, customer: function(frm) { erpnext.utils.get_party_details(frm); }, @@ -35,7 +41,7 @@ frappe.ui.form.on("Opportunity", { cur_frm.cscript.create_quotation, __("Make")); frm.page.set_inner_btn_group_as_primary(__("Make")); - + if(doc.status!=="Quotation") { frm.add_custom_button(__('Lost'), cur_frm.cscript['Declare Opportunity Lost']); @@ -62,7 +68,7 @@ erpnext.crm.Opportunity = frappe.ui.form.Controller.extend({ if(!this.frm.doc.status) set_multiple(this.frm.doc.doctype, this.frm.doc.name, { status:'Open' }); if(!this.frm.doc.company && frappe.defaults.get_user_default("Company")) - set_multiple(this.frm.doc.doctype, this.frm.doc.name, + set_multiple(this.frm.doc.doctype, this.frm.doc.name, { company:frappe.defaults.get_user_default("Company") }); this.setup_queries(); diff --git a/erpnext/crm/doctype/opportunity/opportunity_dashboard.py b/erpnext/crm/doctype/opportunity/opportunity_dashboard.py index 40ff6d0c1a..1939c2e741 100644 --- a/erpnext/crm/doctype/opportunity/opportunity_dashboard.py +++ b/erpnext/crm/doctype/opportunity/opportunity_dashboard.py @@ -8,7 +8,6 @@ def get_data(): }, 'transactions': [ { - 'label': _('Related'), 'items': ['Quotation', 'Supplier Quotation'] }, ] diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index a3f3550714..880a46c12e 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -46,11 +46,26 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) { frm.updating_party_details = false; if(callback) callback(); frm.refresh(); + erpnext.utils.add_item(frm); } } }); } +erpnext.utils.add_item = function(frm) { + if(frm.is_new()) { + var prev_route = frappe.get_prev_route(); + if(prev_route[1]==='Item' && !(frm.doc.items && frm.doc.items.length)) { + // add row + item = frm.add_child('items'); + frm.refresh_field('items'); + + // set item + frappe.model.set_value(item.doctype, item.name, 'item_code', prev_route[2]); + } + } +} + erpnext.utils.get_address_display = function(frm, address_field, display_field, is_your_company_address) { if(frm.updating_party_details) return; diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js index d111c14734..81f4236496 100644 --- a/erpnext/selling/doctype/quotation/quotation.js +++ b/erpnext/selling/doctype/quotation/quotation.js @@ -4,6 +4,14 @@ {% include 'erpnext/selling/sales_common.js' %} +frappe.ui.form.on('Quotation', { + setup: function(frm) { + frm.custom_make_buttons = { + 'Sales Order': 'Make Sales Order' + } + } +}); + erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({ onload: function(doc, dt, dn) { var me = this; diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index f1eeccc750..96a94f10d5 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -4,6 +4,14 @@ {% include 'erpnext/selling/sales_common.js' %} frappe.ui.form.on("Sales Order", { + setup: function(frm) { + frm.custom_make_buttons = { + 'Delivery Note': 'Delivery', + 'Sales Invoice': 'Invoice', + 'Material Request': 'Material Request', + 'Purchase Order': 'Purchase Order' + } + }, onload: function(frm) { erpnext.queries.setup_queries(frm, "Warehouse", function() { return erpnext.queries.warehouse(frm.doc); diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 204e98a012..2d659a3226 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -8,6 +8,12 @@ frappe.provide("erpnext.stock.delivery_note"); frappe.ui.form.on("Delivery Note", { setup: function(frm) { + frm.custom_make_buttons = { + 'Packing Slip': 'Packing Slip', + 'Installation Note': 'Installation Note', + 'Sales Invoice': 'Invoice', + 'Stock Entry': 'Return', + }, frm.set_indicator_formatter('item_code', function(doc) { return (doc.docstatus==1 || doc.qty<=doc.actual_qty) ? "green" : "orange" diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index 2b1fb7f8fe..3a5a35131d 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -4,7 +4,19 @@ {% include 'erpnext/buying/doctype/purchase_common/purchase_common.js' %}; frappe.ui.form.on('Material Request', { + setup: function(frm) { + frm.custom_make_buttons = { + 'Stock Entry': 'Issue Material', + 'Purchase Order': 'Purchase Order', + 'Request for Quotation': 'Request for Quotation', + 'Supplier Quotation': 'Supplier Quotation', + 'Production Order': 'Production Order' + } + }, onload: function(frm) { + // add item, if previous view was item + erpnext.utils.add_item(frm); + // formatter for material request item frm.set_indicator_formatter('item_code', function(doc) { return (doc.qty<=doc.ordered_qty) ? "green" : "orange" }), @@ -71,7 +83,7 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten if(doc.material_request_type === "Manufacture" && doc.status === "Submitted") cur_frm.add_custom_button(__("Production Order"), - this.raise_production_orders, __("Make")); + function() { me.raise_production_orders() }, __("Make")); cur_frm.page.set_inner_btn_group_as_primary(__("Make")); @@ -202,10 +214,16 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten }, raise_production_orders: function() { + var me = this; frappe.call({ method:"erpnext.stock.doctype.material_request.material_request.raise_production_orders", args: { - "material_request": cur_frm.doc.name + "material_request": me.frm.doc.name + }, + callback: function(r) { + if(r.message.length) { + me.frm.reload_doc(); + } } }); } diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js index 457a7c2245..0fd931a930 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js @@ -6,6 +6,12 @@ frappe.provide("erpnext.stock"); frappe.ui.form.on("Purchase Receipt", { + setup: function(frm) { + frm.custom_make_buttons = { + 'Stock Entry': 'Return', + 'Purchase Invoice': 'Invoice' + } + }, onload: function(frm) { $.each(["warehouse", "rejected_warehouse"], function(i, field) { frm.set_query(field, "items", function() { @@ -26,7 +32,7 @@ frappe.ui.form.on("Purchase Receipt", { ] } }); - + } }); diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index a5a6cedb40..df237a468f 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -66,6 +66,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ this.show_general_ledger(); } erpnext.hide_company(); + erpnext.utils.add_item(this.frm); }, on_submit: function() { @@ -176,7 +177,6 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ excise.voucher_type = 'Excise Entry'; frappe.set_route('Form', 'Journal Entry', excise.name); }, __("Make")); - cur_frm.page.set_inner_btn_group_as_primary(__("Make")); }, items_add: function(doc, cdt, cdn) {