diff --git a/accounts/doctype/gl_entry/gl_entry.py b/accounts/doctype/gl_entry/gl_entry.py index 3a0b28c78f..d3c6317787 100644 --- a/accounts/doctype/gl_entry/gl_entry.py +++ b/accounts/doctype/gl_entry/gl_entry.py @@ -5,8 +5,7 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import flt, fmt_money, getdate -from webnotes.model.code import get_obj -from webnotes import msgprint, _ +from webnotes import _ class DocType: def __init__(self,d,dl): @@ -130,11 +129,12 @@ def update_outstanding_amt(account, against_voucher_type, against_voucher, on_ca against_voucher_amount = flt(webnotes.conn.sql(""" select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0)) from `tabGL Entry` where voucher_type = 'Journal Voucher' and voucher_no = %s - and account = %s""", (against_voucher, account))[0][0]) + and account = %s and ifnull(against_voucher, '') = ''""", + (against_voucher, account))[0][0]) bal = against_voucher_amount + bal if against_voucher_amount < 0: bal = -bal - + # Validation : Outstanding can not be negative if bal < 0 and not on_cancel: webnotes.throw(_("Outstanding for Voucher ") + against_voucher + _(" will become ") + @@ -158,4 +158,4 @@ def validate_frozen_account(account, adv_adj): elif frozen_accounts_modifier not in webnotes.user.get_roles(): webnotes.throw(account + _(" is a frozen account. ") + _("To create / edit transactions against this account, you need role") + ": " + - frozen_accounts_modifier) + frozen_accounts_modifier) \ No newline at end of file diff --git a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py index 6a31191969..dea5fb59c9 100644 --- a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py +++ b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py @@ -145,6 +145,8 @@ def gl_entry_details(doctype, txt, searchfield, start, page_len, filters): and voucher_no != gle.voucher_no) != abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0) ) + and if(gle.voucher_type='Sales Invoice', (select is_pos from `tabSales Invoice` + where name=gle.voucher_no), 0)=0 %(mcond)s ORDER BY gle.posting_date desc, gle.voucher_no desc limit %(start)s, %(page_len)s""" % { diff --git a/accounts/report/accounts_receivable/accounts_receivable.py b/accounts/report/accounts_receivable/accounts_receivable.py index ad0d92523b..945bae434a 100644 --- a/accounts/report/accounts_receivable/accounts_receivable.py +++ b/accounts/report/accounts_receivable/accounts_receivable.py @@ -85,7 +85,7 @@ class AccountsReceivableReport(object): def get_account_map(self): if not hasattr(self, "account_map"): self.account_map = dict(((r.name, r) for r in webnotes.conn.sql("""select - account.name, customer.customer_name, customer.territory + account.name, customer.name as customer_name, customer.territory from `tabAccount` account, `tabCustomer` customer where account.master_type="Customer" and customer.name=account.master_name""", as_dict=True))) diff --git a/accounts/report/budget_variance_report/budget_variance_report.py b/accounts/report/budget_variance_report/budget_variance_report.py index 2cbbd622e6..a5860c83bd 100644 --- a/accounts/report/budget_variance_report/budget_variance_report.py +++ b/accounts/report/budget_variance_report/budget_variance_report.py @@ -121,6 +121,6 @@ def get_costcenter_account_month_map(filters): for ad in actual_details.get(ccd.name, {}).get(ccd.account, []): if ad.month_name == month: - tav_dict.actual += ad.debit - ad.credit + tav_dict.actual += flt(ad.debit) - flt(ad.credit) - return cam_map \ No newline at end of file + return cam_map diff --git a/buying/doctype/supplier/supplier.py b/buying/doctype/supplier/supplier.py index b2873c5661..2435d0cc31 100644 --- a/buying/doctype/supplier/supplier.py +++ b/buying/doctype/supplier/supplier.py @@ -27,6 +27,14 @@ class DocType(TransactionBase): else: self.doc.name = make_autoname(self.doc.naming_series + '.#####') + def update_address(self): + webnotes.conn.sql("""update `tabAddress` set supplier_name=%s, modified=NOW() + where supplier=%s""", (self.doc.supplier_name, self.doc.name)) + + def update_contact(self): + webnotes.conn.sql("""update `tabContact` set supplier_name=%s, modified=NOW() + where supplier=%s""", (self.doc.supplier_name, self.doc.name)) + def update_credit_days_limit(self): webnotes.conn.sql("""update tabAccount set credit_days = %s where name = %s""", (cint(self.doc.credit_days), self.doc.name + " - " + self.get_company_abbr())) @@ -35,6 +43,9 @@ class DocType(TransactionBase): if not self.doc.naming_series: self.doc.naming_series = '' + self.update_address() + self.update_contact() + # create account head self.create_account_head() @@ -151,10 +162,19 @@ class DocType(TransactionBase): def before_rename(self, olddn, newdn, merge=False): from accounts.utils import rename_account_for rename_account_for("Supplier", olddn, newdn, merge) - + def after_rename(self, olddn, newdn, merge=False): + set_field = '' if webnotes.defaults.get_global_default('supp_master_name') == 'Supplier Name': webnotes.conn.set(self.doc, "supplier_name", newdn) + self.update_contact() + set_field = ", supplier_name=%(newdn)s" + self.update_supplier_address(newdn, set_field) + + def update_supplier_address(self, newdn, set_field): + webnotes.conn.sql("""update `tabAddress` set address_title=%(newdn)s + {set_field} where supplier=%(newdn)s"""\ + .format(set_field=set_field), ({"newdn": newdn})) @webnotes.whitelist() def get_dashboard_info(supplier): diff --git a/buying/doctype/supplier_quotation/supplier_quotation.txt b/buying/doctype/supplier_quotation/supplier_quotation.txt index cf62a9f9fb..e532aa6dd1 100644 --- a/buying/doctype/supplier_quotation/supplier_quotation.txt +++ b/buying/doctype/supplier_quotation/supplier_quotation.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-21 16:16:45", "docstatus": 0, - "modified": "2013-11-22 17:16:16", + "modified": "2013-12-14 17:27:47", "modified_by": "Administrator", "owner": "Administrator" }, @@ -632,6 +632,7 @@ "cancel": 0, "create": 0, "doctype": "DocPerm", + "match": "supplier", "role": "Supplier", "submit": 0, "write": 0 diff --git a/config.json b/config.json index 7bdd1ad5ca..bb88d76293 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,6 @@ { "app_name": "ERPNext", - "app_version": "3.1.0", + "app_version": "3.2.3", "base_template": "app/portal/templates/base.html", "modules": { "Accounts": { @@ -74,5 +74,5 @@ "type": "module" } }, - "requires_framework_version": "==3.1.0" + "requires_framework_version": "==3.2.0" } \ No newline at end of file diff --git a/hr/doctype/earning_type/earning_type.txt b/hr/doctype/earning_type/earning_type.txt index 0c84cf1d4e..902a4ed85b 100644 --- a/hr/doctype/earning_type/earning_type.txt +++ b/hr/doctype/earning_type/earning_type.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-24 11:03:32", "docstatus": 0, - "modified": "2013-07-22 15:25:26", + "modified": "2013-12-09 16:24:07", "modified_by": "Administrator", "owner": "Administrator" }, @@ -85,7 +85,7 @@ "doctype": "DocField", "fieldname": "exemption_limit", "fieldtype": "Float", - "hidden": 1, + "hidden": 0, "label": "Exemption Limit", "oldfieldname": "exemption_limit", "oldfieldtype": "Currency" diff --git a/hr/doctype/leave_allocation/leave_allocation.txt b/hr/doctype/leave_allocation/leave_allocation.txt index a24823a454..38e3eb57c9 100644 --- a/hr/doctype/leave_allocation/leave_allocation.txt +++ b/hr/doctype/leave_allocation/leave_allocation.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-20 19:10:38", "docstatus": 0, - "modified": "2013-07-05 14:44:19", + "modified": "2013-12-12 17:41:52", "modified_by": "Administrator", "owner": "Administrator" }, @@ -131,10 +131,12 @@ "label": "Carry Forward" }, { + "depends_on": "carry_forward", "doctype": "DocField", "fieldname": "carry_forwarded_leaves", "fieldtype": "Float", - "label": "Carry Forwarded Leaves" + "label": "Carry Forwarded Leaves", + "read_only": 1 }, { "allow_on_submit": 1, diff --git a/hr/doctype/salary_manager/salary_manager.py b/hr/doctype/salary_manager/salary_manager.py index 29b13aed98..37a8c5d5e9 100644 --- a/hr/doctype/salary_manager/salary_manager.py +++ b/hr/doctype/salary_manager/salary_manager.py @@ -12,7 +12,6 @@ class DocType: self.doc = doc self.doclist = doclist - def get_emp_list(self): """ Returns list of active employees based on selected criteria diff --git a/hr/doctype/salary_slip/salary_slip.py b/hr/doctype/salary_slip/salary_slip.py index f5eeea164d..94660d0fd8 100644 --- a/hr/doctype/salary_slip/salary_slip.py +++ b/hr/doctype/salary_slip/salary_slip.py @@ -29,18 +29,17 @@ class DocType(TransactionBase): if struct: self.pull_sal_struct(struct) - def check_sal_struct(self): - struct = webnotes.conn.sql("select name from `tabSalary Structure` where employee ='%s' and is_active = 'Yes' "%self.doc.employee) + struct = webnotes.conn.sql("""select name from `tabSalary Structure` + where employee=%s and is_active = 'Yes'""", self.doc.employee) if not struct: - msgprint("Please create Salary Structure for employee '%s'"%self.doc.employee) - self.doc.employee = '' + msgprint("Please create Salary Structure for employee '%s'" % self.doc.employee) + self.doc.employee = None return struct and struct[0][0] or '' - def pull_sal_struct(self, struct): - from hr.doctype.salary_structure.salary_structure import make_salary_slip - self.doclist = make_salary_slip(struct, self.doclist) + from hr.doctype.salary_structure.salary_structure import get_mapped_doclist + self.doclist = get_mapped_doclist(struct, self.doclist) def pull_emp_details(self): emp = webnotes.conn.get_value("Employee", self.doc.employee, diff --git a/hr/doctype/salary_structure/salary_structure.py b/hr/doctype/salary_structure/salary_structure.py index 2dc056dd16..a034b90284 100644 --- a/hr/doctype/salary_structure/salary_structure.py +++ b/hr/doctype/salary_structure/salary_structure.py @@ -74,6 +74,9 @@ class DocType: @webnotes.whitelist() def make_salary_slip(source_name, target_doclist=None): + return [d.fields for d in get_mapped_doclist(source_name, target_doclist)] + +def get_mapped_doclist(source_name, target_doclist=None): from webnotes.model.mapper import get_mapped_doclist def postprocess(source, target): @@ -109,4 +112,4 @@ def make_salary_slip(source_name, target_doclist=None): } }, target_doclist, postprocess) - return [d.fields for d in doclist] \ No newline at end of file + return doclist \ No newline at end of file diff --git a/manufacturing/doctype/bom/bom.txt b/manufacturing/doctype/bom/bom.txt index 68553fb9e3..a5ff125293 100644 --- a/manufacturing/doctype/bom/bom.txt +++ b/manufacturing/doctype/bom/bom.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-22 15:11:38", "docstatus": 0, - "modified": "2013-12-04 11:51:36", + "modified": "2013-12-09 16:25:50", "modified_by": "Administrator", "owner": "Administrator" }, @@ -121,12 +121,12 @@ }, { "depends_on": "with_operations", + "description": "Specify the operations, operating cost and give a unique Operation no to your operations.", "doctype": "DocField", "fieldname": "operations", "fieldtype": "Section Break", "label": "Operations", - "oldfieldtype": "Section Break", - "options": "Specify the operations, operating cost and give a unique Operation no to your operations." + "oldfieldtype": "Section Break" }, { "doctype": "DocField", diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py index f3626a3da3..ce93d80c6b 100644 --- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -72,9 +72,9 @@ class DocType: and (exists (select name from `tabItem` item where item.name=so_item.item_code and (ifnull(item.is_pro_applicable, 'No') = 'Yes' or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s) - or exists (select name from `tabPacked Item` dnpi - where dnpi.parent = so.name and dnpi.parent_item = so_item.item_code - and exists (select name from `tabItem` item where item.name=dnpi.item_code + or exists (select name from `tabPacked Item` pi + where pi.parent = so.name and pi.parent_item = so_item.item_code + and exists (select name from `tabItem` item where item.name=pi.item_code and (ifnull(item.is_pro_applicable, 'No') = 'Yes' or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s))) """ % ('%s', so_filter, item_filter, item_filter), self.doc.company, as_dict=1) @@ -83,6 +83,8 @@ class DocType: def add_so_in_table(self, open_so): """ Add sales orders in the table""" + self.clear_so_table() + so_list = [d.sales_order for d in getlist(self.doclist, 'pp_so_details')] for r in open_so: if cstr(r['name']) not in so_list: @@ -116,19 +118,19 @@ class DocType: or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \ (", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1) - dnpi_items = webnotes.conn.sql("""select distinct dnpi.parent, dnpi.item_code, dnpi.warehouse as reserved_warhouse, - (((so_item.qty - ifnull(so_item.delivered_qty, 0)) * dnpi.qty) / so_item.qty) + packed_items = webnotes.conn.sql("""select distinct pi.parent, pi.item_code, pi.warehouse as reserved_warhouse, + (((so_item.qty - ifnull(so_item.delivered_qty, 0)) * pi.qty) / so_item.qty) as pending_qty - from `tabSales Order Item` so_item, `tabPacked Item` dnpi - where so_item.parent = dnpi.parent and so_item.docstatus = 1 - and dnpi.parent_item = so_item.item_code + from `tabSales Order Item` so_item, `tabPacked Item` pi + where so_item.parent = pi.parent and so_item.docstatus = 1 + and pi.parent_item = so_item.item_code and so_item.parent in (%s) and ifnull(so_item.qty, 0) > ifnull(so_item.delivered_qty, 0) - and exists (select * from `tabItem` item where item.name=dnpi.item_code + and exists (select * from `tabItem` item where item.name=pi.item_code and (ifnull(item.is_pro_applicable, 'No') = 'Yes' or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \ (", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1) - return items + dnpi_items + return items + packed_items def add_items(self, items): diff --git a/patches/may_2013/p06_make_notes.py b/patches/may_2013/p06_make_notes.py index adb3dfdf72..149547fb9f 100644 --- a/patches/may_2013/p06_make_notes.py +++ b/patches/may_2013/p06_make_notes.py @@ -37,7 +37,6 @@ def execute(): webnotes.delete_doc("DocType", "Question") webnotes.delete_doc("DocType", "Answer") - webnotes.bean("Style Settings").save() # update comment delete webnotes.conn.sql("""update tabDocPerm \ diff --git a/patches/october_2013/p09_update_naming_series_settings.py b/patches/october_2013/p09_update_naming_series_settings.py index 36632b44c0..7771b7333f 100644 --- a/patches/october_2013/p09_update_naming_series_settings.py +++ b/patches/october_2013/p09_update_naming_series_settings.py @@ -15,4 +15,5 @@ def execute(): # reset property setters for series for name in ("Stock Settings", "Selling Settings", "Buying Settings", "HR Settings"): - webnotes.bean(name, name).save() \ No newline at end of file + webnotes.reload_doc(name.split()[0], 'DocType', name) + webnotes.bean(name, name).save() diff --git a/selling/doctype/customer/customer.py b/selling/doctype/customer/customer.py index d00926f43c..49296b0b1c 100644 --- a/selling/doctype/customer/customer.py +++ b/selling/doctype/customer/customer.py @@ -47,6 +47,14 @@ class DocType(TransactionBase): if self.doc.lead_name: webnotes.conn.sql("update `tabLead` set status='Converted' where name = %s", self.doc.lead_name) + def update_address(self): + webnotes.conn.sql("""update `tabAddress` set customer_name=%s, modified=NOW() + where customer=%s""", (self.doc.customer_name, self.doc.name)) + + def update_contact(self): + webnotes.conn.sql("""update `tabContact` set customer_name=%s, modified=NOW() + where customer=%s""", (self.doc.customer_name, self.doc.name)) + def create_account_head(self): if self.doc.company : abbr = self.get_company_abbr() @@ -99,6 +107,9 @@ class DocType(TransactionBase): self.validate_name_with_customer_group() self.update_lead_status() + self.update_address() + self.update_contact() + # create account head self.create_account_head() # update credit days and limit in account @@ -146,10 +157,19 @@ class DocType(TransactionBase): def before_rename(self, olddn, newdn, merge=False): from accounts.utils import rename_account_for rename_account_for("Customer", olddn, newdn, merge) - + def after_rename(self, olddn, newdn, merge=False): + set_field = '' if webnotes.defaults.get_global_default('cust_master_name') == 'Customer Name': webnotes.conn.set(self.doc, "customer_name", newdn) + self.update_contact() + set_field = ", customer_name=%(newdn)s" + self.update_customer_address(newdn, set_field) + + def update_customer_address(self, newdn, set_field): + webnotes.conn.sql("""update `tabAddress` set address_title=%(newdn)s + {set_field} where customer=%(newdn)s"""\ + .format(set_field=set_field), ({"newdn": newdn})) @webnotes.whitelist() def get_dashboard_info(customer): diff --git a/selling/doctype/quotation/quotation.txt b/selling/doctype/quotation/quotation.txt index dc342726e4..93346d3029 100644 --- a/selling/doctype/quotation/quotation.txt +++ b/selling/doctype/quotation/quotation.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-24 19:29:08", "docstatus": 0, - "modified": "2013-11-27 17:57:19", + "modified": "2013-12-14 17:25:46", "modified_by": "Administrator", "owner": "Administrator" }, @@ -863,6 +863,7 @@ "cancel": 0, "create": 0, "doctype": "DocPerm", + "match": "customer", "role": "Customer", "submit": 0, "write": 0 diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index 771aafa6c3..a66c4460a0 100644 --- a/selling/doctype/sales_order/sales_order.py +++ b/selling/doctype/sales_order/sales_order.py @@ -110,12 +110,12 @@ class DocType(SellingController): self.validate_uom_is_integer("stock_uom", "qty") self.validate_for_items() self.validate_warehouse() - + from stock.doctype.packed_item.packed_item import make_packing_list self.doclist = make_packing_list(self,'sales_order_details') - + self.validate_with_previous_doc() - + if not self.doc.status: self.doc.status = "Draft" @@ -124,8 +124,7 @@ class DocType(SellingController): "Cancelled"]) if not self.doc.billing_status: self.doc.billing_status = 'Not Billed' - if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered' - + if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered' def validate_warehouse(self): from stock.utils import validate_warehouse_user, validate_warehouse_company diff --git a/selling/sales_common.js b/selling/sales_common.js index ee55dfab7a..d6c8fdd0e4 100644 --- a/selling/sales_common.js +++ b/selling/sales_common.js @@ -95,7 +95,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ refresh: function() { this._super(); this.frm.toggle_display("customer_name", - (this.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer)); + (this.frm.doc.customer_name && this.frm.doc.customer_name!==this.frm.doc.customer)); if(this.frm.fields_dict.packing_details) { var packing_list_exists = this.frm.get_doclist({parentfield: "packing_details"}).length; this.frm.toggle_display("packing_list", packing_list_exists ? true : false); diff --git a/setup/doctype/email_digest/email_digest.py b/setup/doctype/email_digest/email_digest.py index 1078d03268..a9720ae005 100644 --- a/setup/doctype/email_digest/email_digest.py +++ b/setup/doctype/email_digest/email_digest.py @@ -241,7 +241,7 @@ class DocType(DocListController): return self.get_new_count("Lead", self.meta.get_label("new_leads")) def get_new_enquiries(self): - return self.get_new_count("Opportunity", self.meta.get_label("new_enquiries")) + return self.get_new_count("Opportunity", self.meta.get_label("new_enquiries"), docstatus=1) def get_new_quotations(self): return self.get_new_sum("Quotation", self.meta.get_label("new_quotations"), "grand_total") @@ -253,7 +253,8 @@ class DocType(DocListController): return self.get_new_sum("Delivery Note", self.meta.get_label("new_delivery_notes"), "grand_total") def get_new_purchase_requests(self): - return self.get_new_count("Material Request", self.meta.get_label("new_purchase_requests")) + return self.get_new_count("Material Request", + self.meta.get_label("new_purchase_requests"), docstatus=1) def get_new_supplier_quotations(self): return self.get_new_sum("Supplier Quotation", self.meta.get_label("new_supplier_quotations"), @@ -271,13 +272,16 @@ class DocType(DocListController): return self.get_new_sum("Stock Entry", self.meta.get_label("new_stock_entries"), "total_amount") def get_new_support_tickets(self): - return self.get_new_count("Support Ticket", self.meta.get_label("new_support_tickets"), False) + return self.get_new_count("Support Ticket", self.meta.get_label("new_support_tickets"), + filter_by_company=False) def get_new_communications(self): - return self.get_new_count("Communication", self.meta.get_label("new_communications"), False) + return self.get_new_count("Communication", self.meta.get_label("new_communications"), + filter_by_company=False) def get_new_projects(self): - return self.get_new_count("Project", self.meta.get_label("new_projects"), False) + return self.get_new_count("Project", self.meta.get_label("new_projects"), + filter_by_company=False) def get_calendar_events(self, user_id): from core.doctype.event.event import get_events @@ -321,22 +325,22 @@ class DocType(DocListController): else: return 0, "

To Do

" - def get_new_count(self, doctype, label, filter_by_company=True): + def get_new_count(self, doctype, label, docstatus=0, filter_by_company=True): if filter_by_company: company = """and company="%s" """ % self.doc.company else: company = "" count = webnotes.conn.sql("""select count(*) from `tab%s` - where docstatus < 2 %s and - date(creation)>=%s and date(creation)<=%s""" % (doctype, company, "%s", "%s"), - (self.from_date, self.to_date)) + where docstatus=%s %s and + date(creation)>=%s and date(creation)<=%s""" % + (doctype, docstatus, company, "%s", "%s"), (self.from_date, self.to_date)) count = count and count[0][0] or 0 return count, self.get_html(label, None, count) def get_new_sum(self, doctype, label, sum_field): count_sum = webnotes.conn.sql("""select count(*), sum(ifnull(`%s`, 0)) - from `tab%s` where docstatus < 2 and company = %s and + from `tab%s` where docstatus=1 and company = %s and date(creation)>=%s and date(creation)<=%s""" % (sum_field, doctype, "%s", "%s", "%s"), (self.doc.company, self.from_date, self.to_date)) count, total = count_sum and count_sum[0] or (0, 0) diff --git a/setup/doctype/email_settings/email_settings.txt b/setup/doctype/email_settings/email_settings.txt index 3689718ff5..6b28f10f35 100644 --- a/setup/doctype/email_settings/email_settings.txt +++ b/setup/doctype/email_settings/email_settings.txt @@ -2,7 +2,7 @@ { "creation": "2013-03-25 17:53:21", "docstatus": 0, - "modified": "2013-11-28 11:54:42", + "modified": "2013-12-06 13:12:25", "modified_by": "Administrator", "owner": "Administrator" }, @@ -103,6 +103,7 @@ "label": "Auto Email Id" }, { + "default": "1", "description": "If checked, an email with an attached HTML format will be added to part of the EMail body as well as attachment. To only send as attachment, uncheck this.", "doctype": "DocField", "fieldname": "send_print_in_body_and_attachment", diff --git a/setup/doctype/naming_series/naming_series.py b/setup/doctype/naming_series/naming_series.py index 234a689a7b..3a14d4182d 100644 --- a/setup/doctype/naming_series/naming_series.py +++ b/setup/doctype/naming_series/naming_series.py @@ -22,7 +22,7 @@ class DocType: where fieldname='naming_series'""") )))), "prefixes": "\n".join([''] + [i[0] for i in - webnotes.conn.sql("""select name from tabSeries""")]) + webnotes.conn.sql("""select name from tabSeries order by name""")]) } def scrub_options_list(self, ol): @@ -38,7 +38,7 @@ class DocType: self.set_series_for(self.doc.select_doc_for_series, series_list) # create series - map(self.insert_series, series_list) + map(self.insert_series, [d.split('.')[0] for d in series_list]) msgprint('Series Updated') @@ -103,7 +103,8 @@ class DocType: dt.validate_series(series, self.doc.select_doc_for_series) for i in sr: if i[0]: - if series in i[0].split("\n"): + existing_series = [d.split('.')[0] for d in i[0].split("\n")] + if series.split(".")[0] in existing_series: msgprint("Oops! Series name %s is already in use in %s. \ Please select a new one" % (series, i[1]), raise_exception=1) @@ -120,17 +121,21 @@ class DocType: def get_current(self, arg=None): """get series current""" - self.doc.current_value = webnotes.conn.get_value("Series", self.doc.prefix, "current") + self.doc.current_value = webnotes.conn.get_value("Series", + self.doc.prefix.split('.')[0], "current") def insert_series(self, series): """insert series if missing""" if not webnotes.conn.exists('Series', series): - webnotes.conn.sql("insert into tabSeries (name, current) values (%s,0)", (series)) + webnotes.conn.sql("insert into tabSeries (name, current) values (%s, 0)", + (series)) def update_series_start(self): if self.doc.prefix: - self.insert_series(self.doc.prefix) - webnotes.conn.sql("update `tabSeries` set current = '%s' where name = '%s'" % (self.doc.current_value,self.doc.prefix)) + prefix = self.doc.prefix.split('.')[0] + self.insert_series(prefix) + webnotes.conn.sql("update `tabSeries` set current = %s where name = %s", + (self.doc.current_value, prefix)) msgprint("Series Updated Successfully") else: msgprint("Please select prefix first") diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py index 1089a5697c..b2149b1be8 100644 --- a/stock/doctype/delivery_note/delivery_note.py +++ b/stock/doctype/delivery_note/delivery_note.py @@ -73,6 +73,9 @@ class DocType(SellingController): self.update_current_stock() self.validate_with_previous_doc() + from stock.doctype.packed_item.packed_item import make_packing_list + self.doclist = make_packing_list(self, 'delivery_note_details') + self.doc.status = 'Draft' if not self.doc.installation_status: self.doc.installation_status = 'Not Installed' @@ -142,10 +145,6 @@ class DocType(SellingController): bin = webnotes.conn.sql("select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1) d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0 d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0 - - def on_update(self): - from stock.doctype.packed_item.packed_item import make_packing_list - self.doclist = make_packing_list(self, 'delivery_note_details') def on_submit(self): self.validate_packed_qty() diff --git a/stock/doctype/delivery_note/delivery_note.txt b/stock/doctype/delivery_note/delivery_note.txt index 7fb166e686..480d45d014 100644 --- a/stock/doctype/delivery_note/delivery_note.txt +++ b/stock/doctype/delivery_note/delivery_note.txt @@ -2,7 +2,7 @@ { "creation": "2013-05-24 19:29:09", "docstatus": 0, - "modified": "2013-11-03 14:20:19", + "modified": "2013-12-14 17:26:12", "modified_by": "Administrator", "owner": "Administrator" }, @@ -229,7 +229,7 @@ "doctype": "DocField", "fieldname": "po_date", "fieldtype": "Date", - "hidden": 1, + "hidden": 0, "label": "Customer's Purchase Order Date", "no_copy": 0, "oldfieldname": "po_date", @@ -1058,7 +1058,7 @@ }, { "doctype": "DocPerm", - "match": "customer_name", + "match": "customer", "role": "Customer" } ] \ No newline at end of file diff --git a/stock/doctype/packed_item/packed_item.py b/stock/doctype/packed_item/packed_item.py index a58444d554..ba3cb30ff3 100644 --- a/stock/doctype/packed_item/packed_item.py +++ b/stock/doctype/packed_item/packed_item.py @@ -56,9 +56,6 @@ def update_packing_list_item(obj, packing_item_code, qty, warehouse, line, packi pi.batch_no = cstr(line.batch_no) pi.idx = packing_list_idx - # saved, since this function is called on_update of delivery note - pi.save() - packing_list_idx += 1 @@ -87,19 +84,13 @@ def cleanup_packing_list(obj, parent_items): for d in obj.doclist.get({"parentfield": "packing_details"}): if [d.parent_item, d.parent_detail_docname] not in parent_items: # mark for deletion from doclist - delete_list.append(d.name) + delete_list.append([d.parent_item, d.parent_detail_docname]) if not delete_list: return obj.doclist # delete from doclist - obj.doclist = webnotes.doclist(filter(lambda d: d.name not in delete_list, obj.doclist)) - - # delete from db - webnotes.conn.sql("""\ - delete from `tabPacked Item` - where name in (%s)""" - % (", ".join(["%s"] * len(delete_list))), - tuple(delete_list)) + obj.doclist = webnotes.doclist(filter(lambda d: [d.parent_item, d.parent_detail_docname] + not in delete_list, obj.doclist)) return obj.doclist \ No newline at end of file diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py index dc067ec6d1..bd2704d8ac 100644 --- a/stock/doctype/serial_no/serial_no.py +++ b/stock/doctype/serial_no/serial_no.py @@ -150,7 +150,7 @@ class DocType(StockController): where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No' order by posting_date desc, posting_time desc, name desc""", ("%%%s%%" % self.doc.name, self.doc.item_code), as_dict=1): - if self.doc.name in get_serial_nos(sle.serial_no): + if self.doc.name.upper() in get_serial_nos(sle.serial_no): if sle.actual_qty > 0: sle_dict.setdefault("incoming", []).append(sle) else: @@ -268,7 +268,8 @@ def get_item_details(item_code): from tabItem where name=%s""", item_code, as_dict=True)[0] def get_serial_nos(serial_no): - return [s.strip() for s in cstr(serial_no).strip().replace(',', '\n').split('\n') if s.strip()] + return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n') + if s.strip()] def make_serial_no(serial_no, sle): sr = webnotes.new_bean("Serial No") diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js index ed41d7d879..73fd441f76 100644 --- a/stock/doctype/stock_entry/stock_entry.js +++ b/stock/doctype/stock_entry/stock_entry.js @@ -106,7 +106,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ }, callback: function(r) { if (!r.exc) { - for(d in getchildren('Stock Entry Detail',doc.name,'mtn_details')) { + for(d in getchildren('Stock Entry Detail', me.frm.doc.name, 'mtn_details')) { if(!d.expense_account) d.expense_account = r.message; } } @@ -244,7 +244,7 @@ cur_frm.script_manager.make(erpnext.stock.StockEntry); cur_frm.cscript.toggle_related_fields = function(doc) { disable_from_warehouse = inList(["Material Receipt", "Sales Return"], doc.purpose); - disable_to_warehouse = inList(["Material Issue", "Purchase Return"], doc.purpose) + disable_to_warehouse = inList(["Material Issue", "Purchase Return"], doc.purpose); cur_frm.toggle_enable("from_warehouse", !disable_from_warehouse); cur_frm.toggle_enable("to_warehouse", !disable_to_warehouse); @@ -302,7 +302,7 @@ cur_frm.fields_dict['production_order'].get_query = function(doc) { } cur_frm.cscript.purpose = function(doc, cdt, cdn) { - cur_frm.cscript.toggle_related_fields(doc, cdt, cdn); + cur_frm.cscript.toggle_related_fields(doc); } // Overloaded query for link batch_no diff --git a/stock/doctype/stock_entry/stock_entry.txt b/stock/doctype/stock_entry/stock_entry.txt index ca9b5f29a2..18a07a3550 100644 --- a/stock/doctype/stock_entry/stock_entry.txt +++ b/stock/doctype/stock_entry/stock_entry.txt @@ -2,7 +2,7 @@ { "creation": "2013-04-09 11:43:55", "docstatus": 0, - "modified": "2013-11-03 14:11:42", + "modified": "2013-12-09 16:24:10", "modified_by": "Administrator", "owner": "Administrator" }, @@ -108,7 +108,7 @@ "doctype": "DocField", "fieldname": "delivery_note_no", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "in_filter": 0, "label": "Delivery Note No", "no_copy": 1, @@ -126,7 +126,7 @@ "doctype": "DocField", "fieldname": "sales_invoice_no", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "label": "Sales Invoice No", "no_copy": 1, "options": "Sales Invoice", @@ -139,7 +139,7 @@ "doctype": "DocField", "fieldname": "purchase_receipt_no", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "in_filter": 0, "label": "Purchase Receipt No", "no_copy": 1, @@ -299,7 +299,7 @@ "doctype": "DocField", "fieldname": "production_order", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "in_filter": 1, "label": "Production Order", "no_copy": 0, diff --git a/support/doctype/support_ticket/support_ticket.txt b/support/doctype/support_ticket/support_ticket.txt index 684c809a90..4fa4874a9c 100644 --- a/support/doctype/support_ticket/support_ticket.txt +++ b/support/doctype/support_ticket/support_ticket.txt @@ -2,7 +2,7 @@ { "creation": "2013-02-01 10:36:25", "docstatus": 0, - "modified": "2013-11-02 14:06:26", + "modified": "2013-12-14 17:27:02", "modified_by": "Administrator", "owner": "Administrator" }, @@ -278,6 +278,7 @@ { "cancel": 0, "doctype": "DocPerm", + "match": "customer", "role": "Customer" }, { diff --git a/translations/languages.json b/translations/languages.json index fe6bf2dfa9..9bffb5c9ff 100644 --- a/translations/languages.json +++ b/translations/languages.json @@ -1,4 +1,6 @@ { + "中国(简体)": "zh-cn", + "中國(繁體)": "zh-tw", "deutsch": "de", "ελληνικά": "el", "english": "en", diff --git a/utilities/doctype/address/address.txt b/utilities/doctype/address/address.txt index 09be67eb10..5b4ada995e 100644 --- a/utilities/doctype/address/address.txt +++ b/utilities/doctype/address/address.txt @@ -2,11 +2,12 @@ { "creation": "2013-01-10 16:34:32", "docstatus": 0, - "modified": "2013-07-11 17:02:12", + "modified": "2013-12-12 12:17:46", "modified_by": "Administrator", "owner": "Administrator" }, { + "allow_rename": 1, "doctype": "DocType", "document_type": "Master", "icon": "icon-map-marker", diff --git a/utilities/doctype/contact/contact.txt b/utilities/doctype/contact/contact.txt index 199aaea82e..1c8a5cf94a 100644 --- a/utilities/doctype/contact/contact.txt +++ b/utilities/doctype/contact/contact.txt @@ -2,11 +2,12 @@ { "creation": "2013-01-10 16:34:32", "docstatus": 0, - "modified": "2013-10-08 16:48:50", + "modified": "2013-12-12 12:18:19", "modified_by": "Administrator", "owner": "Administrator" }, { + "allow_rename": 1, "doctype": "DocType", "document_type": "Master", "icon": "icon-user",