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..503ec8a1dd 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 + where supplier=%s""", (self.doc.supplier_name, self.doc.name)) + + def update_contact(self): + webnotes.conn.sql("""update `tabContact` set supplier_name=%s + 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): + condition = value = '' if webnotes.defaults.get_global_default('supp_master_name') == 'Supplier Name': webnotes.conn.set(self.doc, "supplier_name", newdn) + self.update_contact() + condition = ", supplier_name=%s" + value = newdn + self.update_supplier_address(newdn, condition, value) + + def update_supplier_address(self, newdn, condition, value): + webnotes.conn.sql("""update `tabAddress` set address_title=%s %s + where supplier=%s""" % ('%s', condition, '%s'), (newdn, value, newdn)) @webnotes.whitelist() def get_dashboard_info(supplier): diff --git a/config.json b/config.json index 05918ef7eb..bc72fa9bc9 100644 --- a/config.json +++ b/config.json @@ -1,78 +1,78 @@ { - "app_name": "ERPNext", - "app_version": "3.0.0", - "requires_framework_version": "==3.0.0", - "base_template": "app/portal/templates/base.html", - "modules": { - "Selling": { - "link": "selling-home", - "color": "#1abc9c", - "icon": "icon-tag", - "type": "module" - }, - "Accounts": { - "link": "accounts-home", - "color": "#3498db", - "icon": "icon-money", - "type": "module" - }, - "Stock": { - "type": "module", - "link": "stock-home", - "color": "#f39c12", - "icon": "icon-truck" - }, - "Buying": { - "type": "module", - "link": "buying-home", - "color": "#c0392b", - "icon": "icon-shopping-cart" - }, - "Support": { - "type": "module", - "link": "support-home", - "color": "#2c3e50", - "icon": "icon-phone" - }, - "Projects": { - "type": "module", - "link": "projects-home", - "color": "#8e44ad", - "icon": "icon-puzzle-piece" - }, - "Manufacturing": { - "type": "module", - "link": "manufacturing-home", - "color": "#7f8c8d", - "icon": "icon-cogs" - }, - "HR": { - "type": "module", - "link": "hr-home", - "color": "#2ecc71", - "label": "Human Resources", - "icon": "icon-group" - }, - "Setup": { - "type": "setup", - "link": "Setup", - "color": "#bdc3c7", - "icon": "icon-wrench" - }, - "Activity": { - "type": "page", - "link": "activity", - "color": "#e67e22", - "icon": "icon-play", - "label": "Activity" - }, - "Notes": { - "type": "list", - "doctype": "Note", - "link": "List/Note", - "color": "#95a5a6", - "label": "Notes", - "icon": "icon-file-alt" - } - } -} + "app_name": "ERPNext", + "app_version": "3.1.2", + "base_template": "app/portal/templates/base.html", + "modules": { + "Accounts": { + "color": "#3498db", + "icon": "icon-money", + "link": "accounts-home", + "type": "module" + }, + "Activity": { + "color": "#e67e22", + "icon": "icon-play", + "label": "Activity", + "link": "activity", + "type": "page" + }, + "Buying": { + "color": "#c0392b", + "icon": "icon-shopping-cart", + "link": "buying-home", + "type": "module" + }, + "HR": { + "color": "#2ecc71", + "icon": "icon-group", + "label": "Human Resources", + "link": "hr-home", + "type": "module" + }, + "Manufacturing": { + "color": "#7f8c8d", + "icon": "icon-cogs", + "link": "manufacturing-home", + "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", + "link": "projects-home", + "type": "module" + }, + "Selling": { + "color": "#1abc9c", + "icon": "icon-tag", + "link": "selling-home", + "type": "module" + }, + "Setup": { + "color": "#bdc3c7", + "icon": "icon-wrench", + "link": "Setup", + "type": "setup" + }, + "Stock": { + "color": "#f39c12", + "icon": "icon-truck", + "link": "stock-home", + "type": "module" + }, + "Support": { + "color": "#2c3e50", + "icon": "icon-phone", + "link": "support-home", + "type": "module" + } + }, + "requires_framework_version": "==3.1.1" +} \ 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 905bbd89b9..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-12-06 15:16:11", + "modified": "2013-12-09 16:24:07", "modified_by": "Administrator", "owner": "Administrator" }, diff --git a/manufacturing/doctype/bom/bom.txt b/manufacturing/doctype/bom/bom.txt index 1878f25e1f..57076654df 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-06 18:48:23", + "modified": "2013-12-09 16:25:50", "modified_by": "Administrator", "owner": "Administrator" }, @@ -120,6 +120,10 @@ "options": "Price List" }, { +<<<<<<< HEAD +======= + "depends_on": "with_operations", +>>>>>>> 4e677a3f5235c96e86c5fe5acd8d2f59dff895dc "description": "Specify the operations, operating cost and give a unique Operation no to your operations.", "doctype": "DocField", "fieldname": "operations", 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/portal/utils.py b/portal/utils.py index 16fc0723d7..89800f3e1d 100644 --- a/portal/utils.py +++ b/portal/utils.py @@ -64,9 +64,14 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): if not website_send_message(subject, message, sender): return - - # make lead / communication - from selling.doctype.lead.get_leads import add_sales_communication - add_sales_communication(subject or "Website Query", message, sender, sender, - mail=None, status=status) + + if subject=="Support": + # create support ticket + from support.doctype.support_ticket.get_support_mails import add_support_communication + add_support_communication(subject, message, sender, mail=None) + else: + # make lead / communication + from selling.doctype.lead.get_leads import add_sales_communication + add_sales_communication(subject or "Website Query", message, sender, sender, + mail=None, status=status) \ No newline at end of file diff --git a/selling/doctype/customer/customer.py b/selling/doctype/customer/customer.py index d00926f43c..71116b33b1 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 where customer=%s""", + (self.doc.customer_name, self.doc.name)) + + def update_contact(self): + webnotes.conn.sql("""update `tabContact` set customer_name=%s 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): + condition = value = '' if webnotes.defaults.get_global_default('cust_master_name') == 'Customer Name': webnotes.conn.set(self.doc, "customer_name", newdn) + self.update_contact() + condition = ", customer_name=%s" + value = newdn + self.update_customer_address(newdn, condition, value) + + def update_customer_address(self, newdn, condition, value): + webnotes.conn.sql("""update `tabAddress` set address_title=%s %s + where customer=%s""" % ('%s', condition, '%s'), (newdn, value, newdn)) @webnotes.whitelist() def get_dashboard_info(customer): diff --git a/stock/doctype/delivery_note/delivery_note.txt b/stock/doctype/delivery_note/delivery_note.txt index b94310e8ac..1dc3cd3011 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-12-06 15:15:49", + "modified": "2013-12-09 16:24:08", "modified_by": "Administrator", "owner": "Administrator" }, diff --git a/stock/doctype/stock_entry/stock_entry.txt b/stock/doctype/stock_entry/stock_entry.txt index a63f8a4492..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-12-06 15:15:25", + "modified": "2013-12-09 16:24:10", "modified_by": "Administrator", "owner": "Administrator" }, diff --git a/stock/report/stock_ledger/stock_ledger.js b/stock/report/stock_ledger/stock_ledger.js index 0e323ebb61..752d6d2813 100644 --- a/stock/report/stock_ledger/stock_ledger.js +++ b/stock/report/stock_ledger/stock_ledger.js @@ -15,14 +15,14 @@ wn.query_reports["Stock Ledger"] = { "fieldname":"from_date", "label": wn._("From Date"), "fieldtype": "Date", - "default": wn.defaults.get_user_default("year_start_date"), + "default": wn.datetime.add_months(wn.datetime.get_today(), -1), "reqd": 1 }, { "fieldname":"to_date", "label": wn._("To Date"), "fieldtype": "Date", - "default": wn.defaults.get_user_default("year_end_date"), + "default": wn.datetime.get_today(), "reqd": 1 }, { diff --git a/stock/report/stock_ledger/stock_ledger.py b/stock/report/stock_ledger/stock_ledger.py index 3ae9135dca..ea1a60fac2 100644 --- a/stock/report/stock_ledger/stock_ledger.py +++ b/stock/report/stock_ledger/stock_ledger.py @@ -3,37 +3,62 @@ from __future__ import unicode_literals import webnotes +from webnotes import _ def execute(filters=None): - columns = ["Date:Datetime:95", "Item:Link/Item:100", "Item Name::100", + columns = get_columns() + sl_entries = get_stock_ledger_entries(filters) + item_details = get_item_details(filters) + + data = [] + for sle in sl_entries: + item_detail = item_details[sle.item_code] + data.append([sle.date, sle.item_code, item_detail.item_name, item_detail.item_group, + item_detail.brand, item_detail.description, sle.warehouse, item_detail.stock_uom, + sle.actual_qty, sle.qty_after_transaction, sle.stock_value, sle.voucher_type, + sle.voucher_no, sle.batch_no, sle.serial_no, sle.company]) + + return columns, data + +def get_columns(): + return ["Date:Datetime:95", "Item:Link/Item:100", "Item Name::100", "Item Group:Link/Item Group:100", "Brand:Link/Brand:100", "Description::200", "Warehouse:Link/Warehouse:100", "Stock UOM:Link/UOM:100", "Qty:Float:50", "Balance Qty:Float:80", "Balance Value:Currency:100", "Voucher Type::100", "Voucher #::100", "Batch:Link/Batch:100", "Serial #:Link/Serial No:100", "Company:Link/Company:100"] - - data = webnotes.conn.sql("""select concat_ws(" ", posting_date, posting_time), - item.name, item.item_name, item.item_group, brand, description, warehouse, sle.stock_uom, - actual_qty, qty_after_transaction, stock_value, voucher_type, voucher_no, - batch_no, serial_no, company - from `tabStock Ledger Entry` sle, - (select name, item_name, description, stock_uom, brand, item_group - from `tabItem` {item_conditions}) item - where item_code = item.name and - company = %(company)s and + +def get_stock_ledger_entries(filters): + if not filters.get("company"): + webnotes.throw(_("Company is mandatory")) + if not filters.get("from_date"): + webnotes.throw(_("From Date is mandatory")) + if not filters.get("to_date"): + webnotes.throw(_("To Date is mandatory")) + + return webnotes.conn.sql("""select concat_ws(" ", posting_date, posting_time) as date, + item_code, warehouse, actual_qty, qty_after_transaction, + stock_value, voucher_type, voucher_no, batch_no, serial_no, company + from `tabStock Ledger Entry` + where company = %(company)s and posting_date between %(from_date)s and %(to_date)s {sle_conditions} - order by posting_date desc, posting_time desc, sle.name desc"""\ - .format(item_conditions=get_item_conditions(filters), - sle_conditions=get_sle_conditions(filters)), - filters) + order by posting_date desc, posting_time desc, name desc"""\ + .format(sle_conditions=get_sle_conditions(filters)), filters, as_dict=1) - return columns, data +def get_item_details(filters): + item_details = {} + for item in webnotes.conn.sql("""select name, item_name, description, item_group, + brand, stock_uom from `tabItem` {item_conditions}"""\ + .format(item_conditions=get_item_conditions(filters)), filters, as_dict=1): + item_details.setdefault(item.name, item) + + return item_details def get_item_conditions(filters): conditions = [] if filters.get("item_code"): - conditions.append("item_code=%(item_code)s") + conditions.append("name=%(item_code)s") if filters.get("brand"): conditions.append("brand=%(brand)s") 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",