diff --git a/erpnext/__init__.py b/erpnext/__init__.py index cd1d288345d..ca6ffba6634 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.2.23' +__version__ = '7.2.24' def get_default_company(user=None): '''Get default company for user''' diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json index e6a3131449c..3fcf5351310 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 26663fd5704..99deb3fd96f 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 b6378f1eb56..5f4e8c05d91 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 6268fe3af3f..1564b48c68e 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 15356fd471b..66b3e31031e 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 6847a98aa19..d10c17816e6 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 0323c2faf00..eaec8f838bc 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/config/desktop.py b/erpnext/config/desktop.py index 9397ffc726f..75b76606d27 100644 --- a/erpnext/config/desktop.py +++ b/erpnext/config/desktop.py @@ -231,7 +231,7 @@ def get_data(): { "module_name": "Assessment", "color": "#8a70be", - "icon": "fa fa-file-text-alt", + "icon": "fa fa-file-text", "label": _("Assessment"), "link": "List/Assessment", "_doctype": "Assessment", diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js index b86a5a52874..45596b15d32 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 40ff6d0c1a4..1939c2e741d 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/hooks.py b/erpnext/hooks.py index 95f6c0b5c43..af364e857f5 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -28,6 +28,7 @@ after_install = "erpnext.setup.install.after_install" boot_session = "erpnext.startup.boot.boot_session" notification_config = "erpnext.startup.notifications.get_notification_config" +get_help_messages = "erpnext.utilities.activation.get_help_messages" on_session_creation = "erpnext.shopping_cart.utils.set_cart_count" on_logout = "erpnext.shopping_cart.utils.clear_cart_count" diff --git a/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js b/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js index 507d070444b..3cc8dd5036f 100644 --- a/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js +++ b/erpnext/hr/doctype/holiday_list/holiday_list_calendar.js @@ -3,8 +3,8 @@ frappe.views.calendar["Holiday List"] = { field_map: { - "start": "from_date", - "end": "to_date", + "start": "holiday_date", + "end": "holiday_date", "id": "name", "title": "description", "allDay": "allDay" diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 799730edd57..4e082870042 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -781,7 +781,9 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ if(k=="price_list_rate") { if(flt(v) != flt(d.price_list_rate)) price_list_rate_changed = true; } - frappe.model.set_value(d.doctype, d.name, k, v); + if(v) { + frappe.model.set_value(d.doctype, d.name, k, v); + } } } diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 74e9fb655c3..bf6941b3475 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -47,6 +47,7 @@ $.extend(erpnext, { fields: [ { "fieldtype": "Link", + "fieldname": "serial_no", "options": "Serial No", "label": __("Serial No"), "get_query": function () { @@ -60,6 +61,7 @@ $.extend(erpnext, { }, { "fieldtype": "Button", + "fieldname": "add", "label": __("Add") } ] diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index a3f3550714c..880a46c12e8 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 d111c147342..81f4236496f 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 f1eeccc7508..96a94f10d59 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/selling/page/sales_analytics/sales_analytics.js b/erpnext/selling/page/sales_analytics/sales_analytics.js index 2f9b02ca6fc..73793d43390 100644 --- a/erpnext/selling/page/sales_analytics/sales_analytics.js +++ b/erpnext/selling/page/sales_analytics/sales_analytics.js @@ -202,7 +202,9 @@ erpnext.SalesAnalytics = frappe.views.TreeGridReport.extend({ if (posting_date >= from_date && posting_date <= to_date) { var item = me.item_by_name[tl[me.tree_grid.item_key]] || me.item_by_name['Not Set']; - item[me.column_map[tl.posting_date].field] += (is_val ? tl.base_net_amount : tl.qty); + if(item){ + item[me.column_map[tl.posting_date].field] += (is_val ? tl.base_net_amount : tl.qty); + } } } }); diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 204e98a0125..2d659a32260 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 2b1fb7f8fe0..3a5a35131d4 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 457a7c2245b..0fd931a9308 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 a5a6cedb40a..df237a468f7 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) { diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py index 563f71ea2b4..eec3973ddbc 100644 --- a/erpnext/utilities/activation.py +++ b/erpnext/utilities/activation.py @@ -1,4 +1,6 @@ -import frappe +import frappe, erpnext + +from frappe import _ def get_level(): activation_level = 0 @@ -20,6 +22,9 @@ def get_level(): if frappe.db.count('Employee') > 3: activation_level += 1 + if frappe.db.count('Lead') > 3: + activation_level += 1 + if frappe.db.count('Payment Entry') > 2: activation_level += 1 @@ -29,8 +34,104 @@ def get_level(): if frappe.db.count('User') > 5: activation_level += 1 + if frappe.db.count('Student') > 5: + activation_level += 1 + + if frappe.db.count('Student Batch') > 5: + activation_level += 1 + + if frappe.db.count('Instructor') > 5: + activation_level += 1 + # recent login if frappe.db.sql('select name from tabUser where last_login > date_sub(now(), interval 2 day) limit 1'): activation_level += 1 - return activation_level \ No newline at end of file + return activation_level + +def get_help_messages(): + '''Returns help messages to be shown on Desktop''' + # if get_level() > 6: + # return [] + + messages = [] + + domain = frappe.db.get_value('Company', erpnext.get_default_company(), 'domain') + + if domain in ('Manufacturing', 'Retail', 'Services', 'Distribution'): + count = frappe.db.count('Lead') + if count < 3: + messages.append(dict( + title=_('Create Leads'), + description=_('Create Leads'), + action=_('Leads help you get business, add all your contacts and more as your leads'), + route='List/Lead', + count=count + )) + + count = frappe.db.count('Quotation') + if count < 3: + messages.append(dict( + title=_('Create customer quotes'), + description=_('Quotations are proposals, bids you have sent to your customers'), + action=_('Make Quotation'), + route='List/Quotation' + )) + + count = frappe.db.count('Sales Order') + if count < 3: + messages.append(dict( + title=_('Manage your orders'), + description=_('Make Sales Orders to help you plan your work and deliver on-time'), + action=_('Make Sales Order'), + route='List/Sales Order' + )) + + count = frappe.db.count('Purchase Order') + if count < 3: + messages.append(dict( + title=_('Create Purchase Orders'), + description=_('Purchase orders help you plan and follow up on your purchases'), + action=_('Make Purchase Order'), + route='List/Purchase Order' + )) + + count = frappe.db.count('User') + if count < 3: + messages.append(dict( + title=_('Create Users'), + description=_('Add the rest of your organization as your users. You can also add invite Customers to your portal by adding them from Contacts'), + action=_('Make User'), + route='List/User' + )) + + elif domain == 'Education': + count = frappe.db.count('Student') + if count < 5: + messages.append(dict( + title=_('Add Students'), + description=_('Students are at the heart of the system, add all your students'), + action=_('Make Student'), + route='List/Student' + )) + + count = frappe.db.count('Student Batch') + if count < 3: + messages.append(dict( + title=_('Group your students in batches'), + description=_('Student Batches help you track attendance, assessments and fees for students'), + action=_('Make Student Batch'), + route='List/Student Batch' + )) + + # anyways + count = frappe.db.count('Employee') + if count < 3: + messages.append(dict( + title=_('Create Employee Records'), + description=_('Create Employee records to manage leaves, expense claims and payroll'), + action=_('Make Employee'), + route='List/Employee' + )) + + return messages \ No newline at end of file