Merge branch 'master' into develop
This commit is contained in:
commit
bd4b80e3d8
@ -4,7 +4,7 @@ import inspect
|
|||||||
import frappe
|
import frappe
|
||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
|
|
||||||
__version__ = '8.11.3'
|
__version__ = '8.11.4'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
@ -91,10 +91,10 @@ def get_conditions(filters):
|
|||||||
conditions = ""
|
conditions = ""
|
||||||
|
|
||||||
for opts in (("company", " and company=%(company)s"),
|
for opts in (("company", " and company=%(company)s"),
|
||||||
("supplier", " and pi.supplier = %(supplier)s"),
|
("supplier", " and `tabPurchase Invoice`.supplier = %(supplier)s"),
|
||||||
("item_code", " and pi_item.item_code = %(item_code)s"),
|
("item_code", " and `tabPurchase Invoice Item`.item_code = %(item_code)s"),
|
||||||
("from_date", " and pi.posting_date>=%(from_date)s"),
|
("from_date", " and `tabPurchase Invoice`.posting_date>=%(from_date)s"),
|
||||||
("to_date", " and pi.posting_date<=%(to_date)s"),
|
("to_date", " and `tabPurchase Invoice`.posting_date<=%(to_date)s"),
|
||||||
("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
|
("mode_of_payment", " and ifnull(mode_of_payment, '') = %(mode_of_payment)s")):
|
||||||
if filters.get(opts[0]):
|
if filters.get(opts[0]):
|
||||||
conditions += opts[1]
|
conditions += opts[1]
|
||||||
@ -104,20 +104,29 @@ def get_conditions(filters):
|
|||||||
def get_items(filters, additional_query_columns):
|
def get_items(filters, additional_query_columns):
|
||||||
conditions = get_conditions(filters)
|
conditions = get_conditions(filters)
|
||||||
match_conditions = frappe.build_match_conditions("Purchase Invoice")
|
match_conditions = frappe.build_match_conditions("Purchase Invoice")
|
||||||
|
|
||||||
|
if match_conditions:
|
||||||
|
match_conditions = " and {0} ".format(match_conditions)
|
||||||
|
|
||||||
if additional_query_columns:
|
if additional_query_columns:
|
||||||
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
||||||
|
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
select
|
select
|
||||||
pi_item.name, pi_item.parent, pi.posting_date, pi.credit_to, pi.company,
|
`tabPurchase Invoice Item`.`name`, `tabPurchase Invoice Item`.`parent`,
|
||||||
pi.supplier, pi.remarks, pi.base_net_total, pi_item.item_code, pi_item.item_name,
|
`tabPurchase Invoice`.posting_date, `tabPurchase Invoice`.credit_to, `tabPurchase Invoice`.company,
|
||||||
pi_item.item_group, pi_item.project, pi_item.purchase_order, pi_item.purchase_receipt,
|
`tabPurchase Invoice`.supplier, `tabPurchase Invoice`.remarks, `tabPurchase Invoice`.base_net_total, `tabPurchase Invoice Item`.`item_code`,
|
||||||
pi_item.po_detail, pi_item.expense_account, pi_item.stock_qty, pi_item.stock_uom,
|
`tabPurchase Invoice Item`.`item_name`, `tabPurchase Invoice Item`.`item_group`,
|
||||||
pi_item.base_net_rate, pi_item.base_net_amount,
|
`tabPurchase Invoice Item`.`project`, `tabPurchase Invoice Item`.`purchase_order`,
|
||||||
pi.supplier_name, pi.mode_of_payment {0}
|
`tabPurchase Invoice Item`.`purchase_receipt`, `tabPurchase Invoice Item`.`po_detail`,
|
||||||
from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item
|
`tabPurchase Invoice Item`.`expense_account`, `tabPurchase Invoice Item`.`stock_qty`,
|
||||||
where pi.name = pi_item.parent and pi.docstatus = 1 %s %s
|
`tabPurchase Invoice Item`.`stock_uom`, `tabPurchase Invoice Item`.`base_net_rate`,
|
||||||
order by pi.posting_date desc, pi_item.item_code desc
|
`tabPurchase Invoice Item`.`base_net_amount`,
|
||||||
|
`tabPurchase Invoice`.supplier_name, `tabPurchase Invoice`.mode_of_payment {0}
|
||||||
|
from `tabPurchase Invoice`, `tabPurchase Invoice Item`
|
||||||
|
where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and
|
||||||
|
`tabPurchase Invoice`.docstatus = 1 %s %s
|
||||||
|
order by `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc
|
||||||
""".format(additional_query_columns) % (conditions, match_conditions), filters, as_dict=1)
|
""".format(additional_query_columns) % (conditions, match_conditions), filters, as_dict=1)
|
||||||
|
|
||||||
def get_aii_accounts():
|
def get_aii_accounts():
|
||||||
|
@ -93,37 +93,49 @@ def get_conditions(filters):
|
|||||||
conditions = ""
|
conditions = ""
|
||||||
|
|
||||||
for opts in (("company", " and company=%(company)s"),
|
for opts in (("company", " and company=%(company)s"),
|
||||||
("customer", " and si.customer = %(customer)s"),
|
("customer", " and `tabSales Invoice`.customer = %(customer)s"),
|
||||||
("item_code", " and si_item.item_code = %(item_code)s"),
|
("item_code", " and `tabSales Invoice Item`.item_code = %(item_code)s"),
|
||||||
("from_date", " and si.posting_date>=%(from_date)s"),
|
("from_date", " and `tabSales Invoice`.posting_date>=%(from_date)s"),
|
||||||
("to_date", " and si.posting_date<=%(to_date)s")):
|
("to_date", " and `tabSales Invoice`.posting_date<=%(to_date)s")):
|
||||||
if filters.get(opts[0]):
|
if filters.get(opts[0]):
|
||||||
conditions += opts[1]
|
conditions += opts[1]
|
||||||
|
|
||||||
if filters.get("mode_of_payment"):
|
if filters.get("mode_of_payment"):
|
||||||
conditions += """ and exists(select name from `tabSales Invoice Payment`
|
conditions += """ and exists(select name from `tabSales Invoice Payment`
|
||||||
where parent=si.name
|
where parent=si.name
|
||||||
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
|
and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
|
||||||
|
|
||||||
return conditions
|
return conditions
|
||||||
|
|
||||||
def get_items(filters, additional_query_columns):
|
def get_items(filters, additional_query_columns):
|
||||||
|
conditions = get_conditions(filters)
|
||||||
|
match_conditions = frappe.build_match_conditions("Sales Invoice")
|
||||||
|
|
||||||
|
if match_conditions:
|
||||||
|
match_conditions = " and {0} ".format(match_conditions)
|
||||||
|
|
||||||
if additional_query_columns:
|
if additional_query_columns:
|
||||||
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
additional_query_columns = ', ' + ', '.join(additional_query_columns)
|
||||||
|
|
||||||
conditions = get_conditions(filters)
|
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
select
|
select
|
||||||
si_item.name, si_item.parent, si.posting_date, si.debit_to, si.project,
|
`tabSales Invoice Item`.name, `tabSales Invoice Item`.parent,
|
||||||
si.customer, si.remarks, si.territory, si.company, si.base_net_total,
|
`tabSales Invoice`.posting_date, `tabSales Invoice`.debit_to,
|
||||||
si_item.item_code, si_item.item_name, si_item.item_group, si_item.sales_order,
|
`tabSales Invoice`.project, `tabSales Invoice`.customer, `tabSales Invoice`.remarks,
|
||||||
si_item.delivery_note, si_item.income_account, si_item.cost_center,
|
`tabSales Invoice`.territory, `tabSales Invoice`.company, `tabSales Invoice`.base_net_total,
|
||||||
si_item.stock_qty, si_item.stock_uom, si_item.base_net_rate, si_item.base_net_amount,
|
`tabSales Invoice Item`.item_code, `tabSales Invoice Item`.item_name,
|
||||||
si.customer_name, si.customer_group, si_item.so_detail, si.update_stock {0}
|
`tabSales Invoice Item`.item_group, `tabSales Invoice Item`.sales_order,
|
||||||
from `tabSales Invoice` si, `tabSales Invoice Item` si_item
|
`tabSales Invoice Item`.delivery_note, `tabSales Invoice Item`.income_account,
|
||||||
where si.name = si_item.parent and si.docstatus = 1 %s
|
`tabSales Invoice Item`.cost_center, `tabSales Invoice Item`.stock_qty,
|
||||||
order by si.posting_date desc, si_item.item_code desc
|
`tabSales Invoice Item`.stock_uom, `tabSales Invoice Item`.base_net_rate,
|
||||||
""".format(additional_query_columns or '') % conditions, filters, as_dict=1)
|
`tabSales Invoice Item`.base_net_amount, `tabSales Invoice`.customer_name,
|
||||||
|
`tabSales Invoice`.customer_group, `tabSales Invoice Item`.so_detail,
|
||||||
|
`tabSales Invoice`.update_stock {0}
|
||||||
|
from `tabSales Invoice`, `tabSales Invoice Item`
|
||||||
|
where `tabSales Invoice`.name = `tabSales Invoice Item`.parent
|
||||||
|
and `tabSales Invoice`.docstatus = 1 %s %s
|
||||||
|
order by `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_code desc
|
||||||
|
""".format(additional_query_columns or '') % (conditions, match_conditions), filters, as_dict=1)
|
||||||
|
|
||||||
def get_delivery_notes_against_sales_order(item_list):
|
def get_delivery_notes_against_sales_order(item_list):
|
||||||
so_dn_map = frappe._dict()
|
so_dn_map = frappe._dict()
|
||||||
|
@ -295,6 +295,7 @@ def make_purchase_receipt(source_name, target_doc=None):
|
|||||||
"field_map": {
|
"field_map": {
|
||||||
"name": "purchase_order_item",
|
"name": "purchase_order_item",
|
||||||
"parent": "purchase_order",
|
"parent": "purchase_order",
|
||||||
|
"bom": "bom"
|
||||||
},
|
},
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
"condition": lambda doc: abs(doc.received_qty) < abs(doc.qty) and doc.delivered_by_supplier!=1
|
||||||
|
@ -227,21 +227,30 @@ def get_project_name(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
"_txt": txt.replace('%', '')
|
"_txt": txt.replace('%', '')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
|
def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
select `tabDelivery Note`.name, `tabDelivery Note`.customer, `tabDelivery Note`.posting_date
|
select `tabDelivery Note`.name, `tabDelivery Note`.customer, `tabDelivery Note`.posting_date
|
||||||
from `tabDelivery Note`
|
from `tabDelivery Note`
|
||||||
where `tabDelivery Note`.`%(key)s` like %(txt)s and
|
where `tabDelivery Note`.`%(key)s` like %(txt)s and
|
||||||
`tabDelivery Note`.docstatus = 1 and `tabDelivery Note`.is_return = 0
|
`tabDelivery Note`.docstatus = 1
|
||||||
and status not in ("Stopped", "Closed") %(fcond)s
|
and status not in ("Stopped", "Closed") %(fcond)s
|
||||||
and (`tabDelivery Note`.per_billed < 100 or `tabDelivery Note`.grand_total = 0)
|
and (
|
||||||
|
(`tabDelivery Note`.is_return = 0 and `tabDelivery Note`.per_billed < 100)
|
||||||
|
or `tabDelivery Note`.grand_total = 0
|
||||||
|
or (
|
||||||
|
`tabDelivery Note`.is_return = 1
|
||||||
|
and return_against in (select name from `tabDelivery Note` where per_billed < 100)
|
||||||
|
)
|
||||||
|
)
|
||||||
%(mcond)s order by `tabDelivery Note`.`%(key)s` asc
|
%(mcond)s order by `tabDelivery Note`.`%(key)s` asc
|
||||||
""" % {
|
""" % {
|
||||||
"key": searchfield,
|
"key": searchfield,
|
||||||
"fcond": get_filters_cond(doctype, filters, []),
|
"fcond": get_filters_cond(doctype, filters, []),
|
||||||
"mcond": get_match_cond(doctype),
|
"mcond": get_match_cond(doctype),
|
||||||
"txt": "%(txt)s"
|
"txt": "%(txt)s"
|
||||||
}, { "txt": ("%%%s%%" % txt) }, as_dict=as_dict)
|
}, {"txt": ("%%%s%%" % txt)}, as_dict=as_dict)
|
||||||
|
|
||||||
|
|
||||||
def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
||||||
cond = ""
|
cond = ""
|
||||||
|
@ -179,6 +179,9 @@ class SellingController(StockController):
|
|||||||
return
|
return
|
||||||
|
|
||||||
for it in self.get("items"):
|
for it in self.get("items"):
|
||||||
|
if not it.item_code:
|
||||||
|
continue
|
||||||
|
|
||||||
last_purchase_rate, is_stock_item = frappe.db.get_value("Item", it.item_code, ["last_purchase_rate", "is_stock_item"])
|
last_purchase_rate, is_stock_item = frappe.db.get_value("Item", it.item_code, ["last_purchase_rate", "is_stock_item"])
|
||||||
last_purchase_rate_in_sales_uom = last_purchase_rate / (it.conversion_factor or 1)
|
last_purchase_rate_in_sales_uom = last_purchase_rate / (it.conversion_factor or 1)
|
||||||
if flt(it.base_rate) < flt(last_purchase_rate_in_sales_uom):
|
if flt(it.base_rate) < flt(last_purchase_rate_in_sales_uom):
|
||||||
|
@ -22,7 +22,7 @@ frappe.ui.form.on("BOM", {
|
|||||||
frm.set_query("source_warehouse", "items", function() {
|
frm.set_query("source_warehouse", "items", function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
'company': frm.doc.company,
|
'company': frm.doc.company
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -443,3 +443,5 @@ erpnext.patches.v9_0.remove_subscription_module
|
|||||||
erpnext.patches.v8_7.make_subscription_from_recurring_data
|
erpnext.patches.v8_7.make_subscription_from_recurring_data
|
||||||
erpnext.patches.v8_9.set_print_zero_amount_taxes
|
erpnext.patches.v8_9.set_print_zero_amount_taxes
|
||||||
erpnext.patches.v8_9.set_default_customer_group
|
erpnext.patches.v8_9.set_default_customer_group
|
||||||
|
erpnext.patches.v8_9.remove_employee_from_salary_structure_parent
|
||||||
|
erpnext.patches.v8_9.delete_gst_doctypes_for_outside_india_accounts
|
||||||
|
@ -2,21 +2,25 @@ import frappe
|
|||||||
from frappe.email import sendmail_to_system_managers
|
from frappe.email import sendmail_to_system_managers
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
frappe.reload_doc('regional', 'doctype', 'gst_settings')
|
|
||||||
frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
|
|
||||||
frappe.reload_doc('stock', 'doctype', 'item')
|
frappe.reload_doc('stock', 'doctype', 'item')
|
||||||
frappe.reload_doc("stock", "doctype", "customs_tariff_number")
|
frappe.reload_doc("stock", "doctype", "customs_tariff_number")
|
||||||
|
|
||||||
|
company = frappe.get_all('Company', filters = {'country': 'India'})
|
||||||
|
if not company:
|
||||||
|
return
|
||||||
|
|
||||||
|
frappe.reload_doc('regional', 'doctype', 'gst_settings')
|
||||||
|
frappe.reload_doc('regional', 'doctype', 'gst_hsn_code')
|
||||||
|
|
||||||
for report_name in ('GST Sales Register', 'GST Purchase Register',
|
for report_name in ('GST Sales Register', 'GST Purchase Register',
|
||||||
'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
|
'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
|
||||||
|
|
||||||
frappe.reload_doc('regional', 'report', frappe.scrub(report_name))
|
frappe.reload_doc('regional', 'report', frappe.scrub(report_name))
|
||||||
|
|
||||||
if frappe.db.get_single_value('System Settings', 'country')=='India':
|
from erpnext.regional.india.setup import setup
|
||||||
from erpnext.regional.india.setup import setup
|
delete_custom_field_tax_id_if_exists()
|
||||||
delete_custom_field_tax_id_if_exists()
|
setup(patch=True)
|
||||||
setup(patch=True)
|
send_gst_update_email()
|
||||||
send_gst_update_email()
|
|
||||||
|
|
||||||
def delete_custom_field_tax_id_if_exists():
|
def delete_custom_field_tax_id_if_exists():
|
||||||
for field in frappe.db.sql_list("""select name from `tabCustom Field` where fieldname='tax_id'
|
for field in frappe.db.sql_list("""select name from `tabCustom Field` where fieldname='tax_id'
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
company = frappe.get_all('Company', filters = {'country': 'India'})
|
||||||
|
if not company:
|
||||||
|
if frappe.db.exists("DocType", "GST Settings"):
|
||||||
|
frappe.delete_doc("DocType", "GST Settings")
|
||||||
|
frappe.delete_doc("DocType", "GST HSN Code")
|
||||||
|
|
||||||
|
for report_name in ('GST Sales Register', 'GST Purchase Register',
|
||||||
|
'GST Itemised Sales Register', 'GST Itemised Purchase Register'):
|
||||||
|
|
||||||
|
frappe.delete_doc('Report', report_name)
|
@ -0,0 +1,5 @@
|
|||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
if 'employee' in frappe.db.get_table_columns("Salary Structure"):
|
||||||
|
frappe.db.sql("alter table `tabSalary Structure` drop column employee")
|
@ -631,7 +631,8 @@ class StockEntry(StockController):
|
|||||||
fetch_exploded = self.use_multi_level_bom)
|
fetch_exploded = self.use_multi_level_bom)
|
||||||
|
|
||||||
for item in item_dict.values():
|
for item in item_dict.values():
|
||||||
item.from_warehouse = self.from_warehouse or item.default_warehouse
|
# if source warehouse presents in BOM set from_warehouse as bom source_warehouse
|
||||||
|
item.from_warehouse = self.from_warehouse or item.source_warehouse or item.default_warehouse
|
||||||
return item_dict
|
return item_dict
|
||||||
|
|
||||||
def get_bom_scrap_material(self, qty):
|
def get_bom_scrap_material(self, qty):
|
||||||
|
@ -90,7 +90,7 @@ def get_item_details(args):
|
|||||||
item.lead_time_days)
|
item.lead_time_days)
|
||||||
|
|
||||||
if args.get("is_subcontracted") == "Yes":
|
if args.get("is_subcontracted") == "Yes":
|
||||||
out.bom = get_default_bom(args.item_code)
|
out.bom = args.get('bom') or get_default_bom(args.item_code)
|
||||||
|
|
||||||
get_gross_profit(out)
|
get_gross_profit(out)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user