Merge branch 'hotfix'

This commit is contained in:
Nabin Hait 2017-12-12 19:17:51 +05:30
commit 96d6498226
8 changed files with 49 additions and 23 deletions

View File

@ -4,7 +4,7 @@ import inspect
import frappe import frappe
from erpnext.hooks import regional_overrides from erpnext.hooks import regional_overrides
__version__ = '9.2.21' __version__ = '9.2.22'
def get_default_company(user=None): def get_default_company(user=None):
'''Get default company for user''' '''Get default company for user'''

View File

@ -1,5 +1,5 @@
{ {
"add_total_row": 0, "add_total_row": 1,
"apply_user_permissions": 1, "apply_user_permissions": 1,
"creation": "2017-11-03 16:31:45.757516", "creation": "2017-11-03 16:31:45.757516",
"disabled": 0, "disabled": 0,
@ -7,7 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"modified": "2017-11-03 17:00:37.871577", "modified": "2017-11-04 05:15:35.892659",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Sales Payment Summary", "name": "Sales Payment Summary",

View File

@ -399,7 +399,8 @@ class calculate_taxes_and_totals(object):
for tax in self.doc.get("taxes"): for tax in self.doc.get("taxes"):
if tax.charge_type == "Actual": if tax.charge_type == "Actual":
actual_taxes_dict.setdefault(tax.idx, tax.tax_amount) tax_amount = self.get_tax_amount_if_for_valuation_or_deduction(tax.tax_amount, tax)
actual_taxes_dict.setdefault(tax.idx, tax_amount)
elif tax.row_id in actual_taxes_dict: elif tax.row_id in actual_taxes_dict:
actual_tax_amount = flt(actual_taxes_dict.get(tax.row_id, 0)) * flt(tax.rate) / 100 actual_tax_amount = flt(actual_taxes_dict.get(tax.row_id, 0)) * flt(tax.rate) / 100
actual_taxes_dict.setdefault(tax.idx, actual_tax_amount) actual_taxes_dict.setdefault(tax.idx, actual_tax_amount)

View File

@ -157,6 +157,7 @@ frappe.ui.form.on("Production Order", {
item: frm.doc.production_item, item: frm.doc.production_item,
project: frm.doc.project project: frm.doc.project
}, },
freeze: true,
callback: function(r) { callback: function(r) {
if(r.message) { if(r.message) {
erpnext.in_production_item_onchange = true; erpnext.in_production_item_onchange = true;
@ -184,6 +185,7 @@ frappe.ui.form.on("Production Order", {
return frm.call({ return frm.call({
doc: frm.doc, doc: frm.doc,
method: "get_items_and_operations_from_bom", method: "get_items_and_operations_from_bom",
freeze: true,
callback: function(r) { callback: function(r) {
if(r.message["set_scrap_wh_mandatory"]){ if(r.message["set_scrap_wh_mandatory"]){
frm.toggle_reqd("scrap_warehouse", true); frm.toggle_reqd("scrap_warehouse", true);

View File

@ -43,10 +43,7 @@ class ProductionOrder(Document):
validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"]) validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"])
if not self.get("required_items"): self.set_required_items(reset_only_qty = len(self.get("required_items")))
self.set_required_items()
else:
self.set_available_qty()
def validate_sales_order(self): def validate_sales_order(self):
if self.sales_order: if self.sales_order:
@ -57,6 +54,19 @@ class ProductionOrder(Document):
and so.docstatus = 1 and so_item.item_code=%s and so.docstatus = 1 and so_item.item_code=%s
""", (self.sales_order, self.production_item), as_dict=1) """, (self.sales_order, self.production_item), as_dict=1)
if not so:
so = frappe.db.sql("""
select
so.name, so_item.delivery_date, so.project
from
`tabSales Order` so, `tabSales Order Item` so_item, `tabPacked Item` packed_item
where so.name=%s
and so.name=so_item.parent
and so.name=packed_item.parent
and so_item.item_code = packed_item.parent_item
and so.docstatus = 1 and packed_item.item_code=%s
""", (self.sales_order, self.production_item), as_dict=1)
if len(so): if len(so):
if not self.expected_delivery_date: if not self.expected_delivery_date:
self.expected_delivery_date = so[0].delivery_date self.expected_delivery_date = so[0].delivery_date
@ -431,13 +441,19 @@ class ProductionOrder(Document):
if self.wip_warehouse: if self.wip_warehouse:
d.available_qty_at_wip_warehouse = get_latest_stock_qty(d.item_code, self.wip_warehouse) d.available_qty_at_wip_warehouse = get_latest_stock_qty(d.item_code, self.wip_warehouse)
def set_required_items(self): def set_required_items(self, reset_only_qty=False):
'''set required_items for production to keep track of reserved qty''' '''set required_items for production to keep track of reserved qty'''
if not reset_only_qty:
self.required_items = [] self.required_items = []
if self.bom_no and self.qty: if self.bom_no and self.qty:
item_dict = get_bom_items_as_dict(self.bom_no, self.company, qty=self.qty, item_dict = get_bom_items_as_dict(self.bom_no, self.company, qty=self.qty,
fetch_exploded = self.use_multi_level_bom) fetch_exploded = self.use_multi_level_bom)
if reset_only_qty:
for d in self.get("required_items"):
d.required_qty = item_dict.get(d.item_code).get("qty")
else:
for item in sorted(item_dict.values(), key=lambda d: d['idx']): for item in sorted(item_dict.values(), key=lambda d: d['idx']):
self.append('required_items', { self.append('required_items', {
'item_code': item.item_code, 'item_code': item.item_code,

View File

@ -521,9 +521,11 @@ erpnext.taxes_and_totals = erpnext.payments.extend({
var actual_taxes_dict = {}; var actual_taxes_dict = {};
$.each(this.frm.doc["taxes"] || [], function(i, tax) { $.each(this.frm.doc["taxes"] || [], function(i, tax) {
if (tax.charge_type == "Actual") if (tax.charge_type == "Actual") {
actual_taxes_dict[tax.idx] = tax.tax_amount; var tax_amount = (tax.category == "Valuation") ? 0.0 : tax.tax_amount;
else if (actual_taxes_dict[tax.row_id] !== null) { tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0;
actual_taxes_dict[tax.idx] = tax_amount;
} else if (actual_taxes_dict[tax.row_id] !== null) {
var actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100; var actual_tax_amount = flt(actual_taxes_dict[tax.row_id]) * flt(tax.rate) / 100;
actual_taxes_dict[tax.idx] = actual_tax_amount; actual_taxes_dict[tax.idx] = actual_tax_amount;
} }

View File

@ -762,10 +762,15 @@ def make_production_orders(items, sales_order, company, project=None):
out = [] out = []
for i in items: for i in items:
if not i.get("bom"):
frappe.throw(_("Please select BOM against item {0}").format(i.get("item_code")))
if not i.get("pending_qty"):
frappe.throw(_("Please select Qty against item {0}").format(i.get("item_code")))
production_order = frappe.get_doc(dict( production_order = frappe.get_doc(dict(
doctype='Production Order', doctype='Production Order',
production_item=i['item_code'], production_item=i['item_code'],
bom_no=i['bom'], bom_no=i.get('bom'),
qty=i['pending_qty'], qty=i['pending_qty'],
company=company, company=company,
sales_order=sales_order, sales_order=sales_order,