From ad68d64d939d77749ba7f2ee129886be7c1c0803 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 15 May 2014 19:33:27 +0530 Subject: [PATCH 1/3] Leave approver select options in leave application and employee --- .../employee_leave_approver.json | 10 +++++++--- .../hr/doctype/leave_application/leave_application.js | 2 ++ .../doctype/leave_application/leave_application.json | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json index c0cb78d894..0302bc95fa 100644 --- a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json +++ b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json @@ -1,7 +1,7 @@ { "allow_import": 0, "autoname": "LAPPR-/.#####", - "creation": "2013-04-12 06:56:15.000000", + "creation": "2013-04-12 06:56:15", "description": "Users who can approve a specific employee's leave applications", "docstatus": 0, "doctype": "DocType", @@ -11,6 +11,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Leave Approver", + "options": "[Select]", "permlevel": 0, "print_hide": 1, "reqd": 1, @@ -19,9 +20,12 @@ ], "idx": 1, "istable": 1, - "modified": "2013-12-20 19:23:12.000000", + "modified": "2014-05-15 19:32:14.134420", "modified_by": "Administrator", "module": "HR", "name": "Employee Leave Approver", - "owner": "Administrator" + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js index 3ce7a5bc47..acb91c6bbf 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.js +++ b/erpnext/hr/doctype/leave_application/leave_application.js @@ -19,7 +19,9 @@ cur_frm.cscript.onload = function(doc, dt, dn) { function(user) { return {value: user, label: frappe.user_info(user).fullname}; })); + if(leave_approver) cur_frm.set_value("leave_approver", leave_approver); + cur_frm.cscript.get_leave_balance(cur_frm.doc); } }); diff --git a/erpnext/hr/doctype/leave_application/leave_application.json b/erpnext/hr/doctype/leave_application/leave_application.json index 581ee2a6b4..eb9b23921a 100644 --- a/erpnext/hr/doctype/leave_application/leave_application.json +++ b/erpnext/hr/doctype/leave_application/leave_application.json @@ -20,9 +20,9 @@ { "description": "Leave can be approved by users with Role, \"Leave Approver\"", "fieldname": "leave_approver", - "fieldtype": "Link", + "fieldtype": "Select", "label": "Leave Approver", - "options": "User", + "options": "[Select]", "permlevel": 0 }, { @@ -182,7 +182,7 @@ "idx": 1, "is_submittable": 1, "max_attachments": 3, - "modified": "2014-05-09 02:17:13.936705", + "modified": "2014-05-15 19:30:47.331357", "modified_by": "Administrator", "module": "HR", "name": "Leave Application", From 091b48168e228bbea378eb3b2ed5348e2601ac33 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 May 2014 17:36:42 +0530 Subject: [PATCH 2/3] Journal voucher debit != credit #fraction issue --- .../journal_voucher/journal_voucher.js | 6 +- .../journal_voucher/journal_voucher.py | 66 ++++++++++--------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js index 25a65572ac..bc0108eba0 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.js +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.js @@ -140,13 +140,13 @@ cur_frm.cscript.update_totals = function(doc) { var td=0.0; var tc =0.0; var el = doc.entries || []; for(var i in el) { - td += flt(el[i].debit, 2); - tc += flt(el[i].credit, 2); + td += flt(el[i].debit, precision("debit", el[i])); + tc += flt(el[i].credit, precision("credit", el[i])); } var doc = locals[doc.doctype][doc.name]; doc.total_debit = td; doc.total_credit = tc; - doc.difference = flt((td - tc), 2); + doc.difference = flt((td - tc), precision("difference")); refresh_many(['total_debit','total_credit','difference']); } diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py index 62758c6172..70bee90016 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py @@ -120,18 +120,21 @@ class JournalVoucher(AccountsController): if flt(d.credit > 0): d.against_account = ", ".join(list(set(accounts_debited))) def validate_debit_and_credit(self): - self.total_debit, self.total_credit = 0, 0 + self.total_debit, self.total_credit, self.difference = 0, 0, 0 for d in self.get("entries"): if d.debit and d.credit: frappe.throw(_("You cannot credit and debit same account at the same time")) - self.total_debit = flt(self.total_debit) + flt(d.debit) - self.total_credit = flt(self.total_credit) + flt(d.credit) + self.total_debit = flt(self.total_debit) + flt(d.debit, self.precision("debit", "entries")) + self.total_credit = flt(self.total_credit) + flt(d.credit, self.precision("credit", "entries")) - if abs(self.total_debit-self.total_credit) > 0.001: + self.difference = flt(self.total_debit, self.precision("total_debit")) - \ + flt(self.total_credit, self.precision("total_credit")) + + if self.difference: frappe.throw(_("Total Debit must be equal to Total Credit. The difference is {0}") - .format(self.total_debit - self.total_credit)) + .format(self.difference)) def create_remarks(self): r = [] @@ -254,8 +257,8 @@ class JournalVoucher(AccountsController): self.get_gl_dict({ "account": d.account, "against": d.against_account, - "debit": d.debit, - "credit": d.credit, + "debit": flt(d.debit, self.precision("debit", "entries")), + "credit": flt(d.credit, self.precision("credit", "entries")), "against_voucher_type": ((d.against_voucher and "Purchase Invoice") or (d.against_invoice and "Sales Invoice") or (d.against_jv and "Journal Voucher")), @@ -279,7 +282,7 @@ class JournalVoucher(AccountsController): msgprint(_("'Entries' cannot be empty"), raise_exception=True) else: flag, self.total_debit, self.total_credit = 0, 0, 0 - diff = flt(self.difference, 2) + diff = flt(self.difference, self.precision("difference")) # If any row without amount, set the diff on that row for d in self.get('entries'): @@ -298,45 +301,44 @@ class JournalVoucher(AccountsController): elif diff<0: jd.debit = abs(diff) - # Set the total debit, total credit and difference - for d in self.get('entries'): - self.total_debit += flt(d.debit, 2) - self.total_credit += flt(d.credit, 2) - - self.difference = flt(self.total_debit, 2) - flt(self.total_credit, 2) + self.validate_debit_and_credit() def get_outstanding_invoices(self): self.set('entries', []) total = 0 for d in self.get_values(): - total += flt(d[2]) - jd = self.append('entries', {}) - jd.account = cstr(d[1]) + total += flt(d.outstanding_amount, self.precision("credit", "entries")) + jd1 = self.append('entries', {}) + jd1.account = d.account + if self.write_off_based_on == 'Accounts Receivable': - jd.credit = flt(d[2]) - jd.against_invoice = cstr(d[0]) + jd1.credit = flt(d.outstanding_amount, self.precision("credit", "entries")) + jd1.against_invoice = cstr(d.name) elif self.write_off_based_on == 'Accounts Payable': - jd.debit = flt(d[2]) - jd.against_voucher = cstr(d[0]) - jd.save(1) - jd = self.append('entries', {}) + jd1.debit = flt(d.outstanding_amount, self.precision("debit", "entries")) + jd1.against_voucher = cstr(d.name) + + jd2 = self.append('entries', {}) if self.write_off_based_on == 'Accounts Receivable': - jd.debit = total + jd2.debit = total elif self.write_off_based_on == 'Accounts Payable': - jd.credit = total - jd.save(1) + jd2.credit = total + + self.validate_debit_and_credit() + def get_values(self): - cond = (flt(self.write_off_amount) > 0) and \ - ' and outstanding_amount <= '+ self.write_off_amount or '' + cond = " and outstanding_amount <= {0}".format(self.write_off_amount) \ + if flt(self.write_off_amount) > 0 else "" + if self.write_off_based_on == 'Accounts Receivable': - return frappe.db.sql("""select name, debit_to, outstanding_amount + return frappe.db.sql("""select name, debit_to as account, outstanding_amount from `tabSales Invoice` where docstatus = 1 and company = %s - and outstanding_amount > 0 %s""" % ('%s', cond), self.company) + and outstanding_amount > 0 %s""" % ('%s', cond), self.company, as_dict=True) elif self.write_off_based_on == 'Accounts Payable': - return frappe.db.sql("""select name, credit_to, outstanding_amount + return frappe.db.sql("""select name, credit_to as account, outstanding_amount from `tabPurchase Invoice` where docstatus = 1 and company = %s - and outstanding_amount > 0 %s""" % ('%s', cond), self.company) + and outstanding_amount > 0 %s""" % ('%s', cond), self.company, as_dict=True) @frappe.whitelist() def get_default_bank_cash_account(company, voucher_type): From e60853930bb25bbbe10823c0351e8de793e1fec4 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 16 May 2014 19:56:06 +0530 Subject: [PATCH 3/3] traslation issue fixed in setup wizard and desktop --- erpnext/config/desktop.py | 115 +++++++++--------- .../setup/doctype/item_group/item_group.json | 4 +- .../setup/page/setup_wizard/setup_wizard.js | 9 +- 3 files changed, 67 insertions(+), 61 deletions(-) diff --git a/erpnext/config/desktop.py b/erpnext/config/desktop.py index 700013fcd9..4b9f8f8a66 100644 --- a/erpnext/config/desktop.py +++ b/erpnext/config/desktop.py @@ -1,60 +1,61 @@ from frappe import _ -data = { - "Accounts": { - "color": "#3498db", - "icon": "icon-money", - "type": "module" - }, - "Activity": { - "color": "#e67e22", - "icon": "icon-play", - "label": _("Activity"), - "link": "activity", - "type": "page" - }, - "Buying": { - "color": "#c0392b", - "icon": "icon-shopping-cart", - "type": "module" - }, - "HR": { - "color": "#2ecc71", - "icon": "icon-group", - "label": _("Human Resources"), - "type": "module" - }, - "Manufacturing": { - "color": "#7f8c8d", - "icon": "icon-cogs", - "type": "module" - }, - "Notes": { - "color": "#95a5a6", - "doctype": "Note", - "icon": "icon-file-alt", - "label": _("Notes"), - "link": "List/Note", - "type": "list" - }, - "Projects": { - "color": "#8e44ad", - "icon": "icon-puzzle-piece", - "type": "module" - }, - "Selling": { - "color": "#1abc9c", - "icon": "icon-tag", - "type": "module" - }, - "Stock": { - "color": "#f39c12", - "icon": "icon-truck", - "type": "module" - }, - "Support": { - "color": "#2c3e50", - "icon": "icon-phone", - "type": "module" +def get_data(): + return { + "Accounts": { + "color": "#3498db", + "icon": "icon-money", + "type": "module" + }, + "Activity": { + "color": "#e67e22", + "icon": "icon-play", + "label": _("Activity"), + "link": "activity", + "type": "page" + }, + "Buying": { + "color": "#c0392b", + "icon": "icon-shopping-cart", + "type": "module" + }, + "HR": { + "color": "#2ecc71", + "icon": "icon-group", + "label": _("Human Resources"), + "type": "module" + }, + "Manufacturing": { + "color": "#7f8c8d", + "icon": "icon-cogs", + "type": "module" + }, + "Notes": { + "color": "#95a5a6", + "doctype": "Note", + "icon": "icon-file-alt", + "label": _("Notes"), + "link": "List/Note", + "type": "list" + }, + "Projects": { + "color": "#8e44ad", + "icon": "icon-puzzle-piece", + "type": "module" + }, + "Selling": { + "color": "#1abc9c", + "icon": "icon-tag", + "type": "module" + }, + "Stock": { + "color": "#f39c12", + "icon": "icon-truck", + "type": "module" + }, + "Support": { + "color": "#2c3e50", + "icon": "icon-phone", + "type": "module" + } } -} \ No newline at end of file diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json index 8ab7262de1..a77978ee8b 100644 --- a/erpnext/setup/doctype/item_group/item_group.json +++ b/erpnext/setup/doctype/item_group/item_group.json @@ -32,7 +32,7 @@ { "fieldname": "cb0", "fieldtype": "Column Break", - "in_list_view": 1, + "in_list_view": 0, "permlevel": 0 }, { @@ -162,7 +162,7 @@ "in_create": 1, "issingle": 0, "max_attachments": 3, - "modified": "2014-05-04 00:06:26.075492", + "modified": "2014-05-16 15:26:47.322787", "modified_by": "Administrator", "module": "Setup", "name": "Item Group", diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.js b/erpnext/setup/page/setup_wizard/setup_wizard.js index ee1daa19d7..cf16656869 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.js +++ b/erpnext/setup/page/setup_wizard/setup_wizard.js @@ -68,6 +68,7 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { onload: function(slide) { slide.get_input("language").on("change", function() { var lang = $(this).val(); + frappe._messages = {}; frappe.call({ method: "erpnext.setup.page.setup_wizard.setup_wizard.load_messages", args: { @@ -240,6 +241,7 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { "help": __("List your tax heads (e.g. VAT, Excise; they should have unique names) and their standard rates. This will create a standard template, which you can edit and add more later."), "fields": [], before_load: function(slide) { + slide.fields = []; for(var i=1; i<4; i++) { slide.fields = slide.fields.concat([ {fieldtype:"Data", fieldname:"tax_"+ i, label:__("Tax") + " " + i, @@ -259,6 +261,7 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { "help": __("List a few of your customers. They could be organizations or individuals."), "fields": [], before_load: function(slide) { + slide.fields = []; for(var i=1; i<6; i++) { slide.fields = slide.fields.concat([ {fieldtype:"Data", fieldname:"customer_" + i, label:__("Customer") + " " + i, @@ -279,6 +282,7 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { "help": __("List a few of your suppliers. They could be organizations or individuals."), "fields": [], before_load: function(slide) { + slide.fields = []; for(var i=1; i<6; i++) { slide.fields = slide.fields.concat([ {fieldtype:"Data", fieldname:"supplier_" + i, label:__("Supplier")+" " + i, @@ -299,6 +303,7 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { "help": __("List your products or services that you buy or sell. Make sure to check the Item Group, Unit of Measure and other properties when you start."), "fields": [], before_load: function(slide) { + slide.fields = []; for(var i=1; i<6; i++) { slide.fields = slide.fields.concat([ {fieldtype:"Section Break", show_section_border: true}, @@ -307,10 +312,10 @@ frappe.pages['setup-wizard'].onload = function(wrapper) { {fieldtype: "Check", fieldname: "is_sales_item_" + i, label:__("We sell this Item")}, {fieldtype: "Check", fieldname: "is_purchase_item_" + i, label:__("We buy this Item")}, {fieldtype:"Column Break"}, - {fieldtype:"Select", label:"Group", fieldname:"item_group_" + i, + {fieldtype:"Select", label:__("Group"), fieldname:"item_group_" + i, options:[__("Products"), __("Services"), __("Raw Material"), __("Consumable"), __("Sub Assemblies")]}, - {fieldtype:"Select", fieldname:"item_uom_" + i, label:"UOM", + {fieldtype:"Select", fieldname:"item_uom_" + i, label:__("UOM"), options:[__("Unit"), __("Nos"), __("Box"), __("Pair"), __("Kg"), __("Set"), __("Hour"), __("Minute")]}, {fieldtype:"Attach", fieldname:"item_img_" + i, label:__("Attach Image")},