Merge branch 'develop'
This commit is contained in:
commit
ce81a61fe7
@ -1,2 +1,2 @@
|
||||
from __future__ import unicode_literals
|
||||
__version__ = '5.0.18'
|
||||
__version__ = '5.0.19'
|
||||
|
@ -102,7 +102,7 @@ def round_off_debit_credit(gl_map):
|
||||
debit_credit_diff += entry.debit - entry.credit
|
||||
|
||||
debit_credit_diff = flt(debit_credit_diff, precision)
|
||||
if abs(debit_credit_diff) >= (2.0 / (10**precision)):
|
||||
if abs(debit_credit_diff) >= (5.0 / (10**precision)):
|
||||
frappe.throw(_("Debit and Credit not equal for {0} #{1}. Difference is {2}.")
|
||||
.format(gl_map[0].voucher_type, gl_map[0].voucher_no, debit_credit_diff))
|
||||
|
||||
|
@ -16,12 +16,16 @@ def get_party_details(party=None, account=None, party_type="Customer", company=N
|
||||
|
||||
if not party:
|
||||
return {}
|
||||
|
||||
if not frappe.db.exists(party_type, party):
|
||||
frappe.throw(_("{0}: {1} does not exists").format(party_type, party))
|
||||
|
||||
return _get_party_details(party, account, party_type,
|
||||
company, posting_date, price_list, currency, doctype)
|
||||
|
||||
def _get_party_details(party=None, account=None, party_type="Customer", company=None,
|
||||
posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False):
|
||||
|
||||
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype))
|
||||
|
||||
party = out[party_type.lower()]
|
||||
|
@ -57,3 +57,7 @@ cur_frm.fields_dict['item_serial_no'].get_query = function(doc, cdt, cdn) {
|
||||
|
||||
return { filters: filter }
|
||||
}
|
||||
|
||||
cur_frm.add_fetch('item_code', 'item_name', 'item_name');
|
||||
cur_frm.add_fetch('item_code', 'description', 'description');
|
||||
|
||||
|
@ -127,6 +127,14 @@
|
||||
"permlevel": 0,
|
||||
"width": "50%"
|
||||
},
|
||||
{
|
||||
"fieldname": "item_name",
|
||||
"fieldtype": "Data",
|
||||
"label": "Item Name",
|
||||
"permlevel": 0,
|
||||
"precision": "",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"fieldname": "description",
|
||||
"fieldtype": "Small Text",
|
||||
@ -219,7 +227,7 @@
|
||||
"icon": "icon-search",
|
||||
"idx": 1,
|
||||
"is_submittable": 1,
|
||||
"modified": "2015-04-14 07:37:07.331291",
|
||||
"modified": "2015-06-08 02:40:25.121948",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Buying",
|
||||
"name": "Quality Inspection",
|
||||
|
@ -31,7 +31,6 @@ class QualityInspection(Document):
|
||||
(self.name, self.modified, self.purchase_receipt_no,
|
||||
self.item_code))
|
||||
|
||||
|
||||
def on_cancel(self):
|
||||
if self.purchase_receipt_no:
|
||||
frappe.db.sql("""update `tabPurchase Receipt Item` t1, `tabPurchase Receipt` t2
|
||||
@ -39,7 +38,6 @@ class QualityInspection(Document):
|
||||
where t1.parent = %s and t1.item_code = %s and t1.parent = t2.name""",
|
||||
(self.modified, self.purchase_receipt_no, self.item_code))
|
||||
|
||||
|
||||
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
||||
if filters.get("from"):
|
||||
from frappe.desk.reportview import get_match_cond
|
||||
|
@ -38,7 +38,8 @@ class AccountsController(TransactionBase):
|
||||
convert_to_recurring(self, self.get("posting_date") or self.get("transaction_date"))
|
||||
|
||||
def before_recurring(self):
|
||||
self.fiscal_year = None
|
||||
if self.meta.get_field("fiscal_year"):
|
||||
self.fiscal_year = None
|
||||
if self.meta.get_field("due_date"):
|
||||
self.due_date = None
|
||||
|
||||
@ -46,7 +47,7 @@ class AccountsController(TransactionBase):
|
||||
for fieldname in ["posting_date", "transaction_date"]:
|
||||
if not self.get(fieldname) and self.meta.get_field(fieldname):
|
||||
self.set(fieldname, today())
|
||||
if not self.fiscal_year:
|
||||
if self.meta.get_field("fiscal_year") and not self.fiscal_year:
|
||||
self.fiscal_year = get_fiscal_year(self.get(fieldname))[0]
|
||||
break
|
||||
|
||||
|
@ -5,7 +5,7 @@ app_publisher = "Frappe Technologies Pvt. Ltd. and Contributors"
|
||||
app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
|
||||
app_icon = "icon-th"
|
||||
app_color = "#e74c3c"
|
||||
app_version = "5.0.18"
|
||||
app_version = "5.0.19"
|
||||
|
||||
error_report_email = "support@erpnext.com"
|
||||
|
||||
|
@ -164,4 +164,5 @@ erpnext.patches.v5_0.update_item_and_description_again
|
||||
erpnext.patches.v5_0.repost_gle_for_jv_with_multiple_party
|
||||
erpnext.patches.v5_0.portal_fixes
|
||||
erpnext.patches.v5_0.reset_values_in_tools
|
||||
execute:frappe.delete_doc("Page", "users")
|
||||
execute:frappe.delete_doc("Page", "users")
|
||||
erpnext.patches.v5_0.update_material_transferred_for_manufacturing_again
|
@ -0,0 +1,18 @@
|
||||
import frappe
|
||||
|
||||
def execute():
|
||||
pro_order_qty_transferred = frappe._dict()
|
||||
for se in frappe.db.sql("""select production_order, sum(fg_completed_qty) as transferred_qty
|
||||
from `tabStock Entry`
|
||||
where docstatus=1 and ifnull(production_order, '') != ''
|
||||
and purpose = 'Material Transfer for Manufacture'
|
||||
group by production_order""", as_dict=1):
|
||||
pro_order_qty_transferred.setdefault(se.production_order, se.transferred_qty)
|
||||
|
||||
for d in frappe.get_all("Production Order", filters={"docstatus": 1}, fields=["name", "qty"]):
|
||||
if d.name in pro_order_qty_transferred:
|
||||
material_transferred_for_manufacturing = pro_order_qty_transferred.get(d.name) \
|
||||
if pro_order_qty_transferred.get(d.name) <= d.qty else d.qty
|
||||
|
||||
frappe.db.sql("""update `tabProduction Order` set material_transferred_for_manufacturing=%s
|
||||
where name=%s""", (material_transferred_for_manufacturing, d.name))
|
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
||||
import frappe
|
||||
import frappe.defaults
|
||||
|
||||
from frappe.utils import cstr, cint, flt, comma_or, nowdate, get_datetime
|
||||
from frappe.utils import cstr, cint, flt, comma_or, get_datetime
|
||||
|
||||
from frappe import _
|
||||
from erpnext.stock.utils import get_incoming_rate
|
||||
@ -185,11 +185,16 @@ class StockEntry(StockController):
|
||||
|
||||
def validate_production_order(self):
|
||||
if self.purpose in ("Manufacture", "Material Transfer for Manufacture"):
|
||||
if not self.bom_no:
|
||||
frappe.throw(_("BOM No is mandatory"))
|
||||
|
||||
# check if production order is entered
|
||||
if not self.production_order:
|
||||
frappe.throw(_("Production order number is mandatory for stock entry purpose manufacture"))
|
||||
# check for double entry
|
||||
if self.purpose=="Manufacture":
|
||||
if not self.fg_completed_qty:
|
||||
frappe.throw(_("For Quantity (Manufactured Qty) is mandatory"))
|
||||
self.check_if_operations_completed()
|
||||
self.check_duplicate_entry_for_production_order()
|
||||
elif self.purpose != "Material Transfer":
|
||||
@ -378,10 +383,21 @@ class StockEntry(StockController):
|
||||
|
||||
def validate_finished_goods(self):
|
||||
"""validation: finished good quantity should be same as manufacturing quantity"""
|
||||
items_with_target_warehouse = []
|
||||
for d in self.get('items'):
|
||||
if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty):
|
||||
frappe.throw(_("Quantity in row {0} ({1}) must be same as manufactured quantity {2}"). \
|
||||
format(d.idx, d.transfer_qty, self.fg_completed_qty))
|
||||
|
||||
if self.production_order and self.purpose == "Manufacture" and d.t_warehouse:
|
||||
items_with_target_warehouse.append(d.item_code)
|
||||
|
||||
if self.production_order and self.purpose == "Manufacture":
|
||||
production_item = frappe.db.get_value("Production Order",
|
||||
self.production_order, "production_item")
|
||||
if production_item not in items_with_target_warehouse:
|
||||
frappe.throw(_("Finished Item {0} must be entered for Manufacture type entry")
|
||||
.format(production_item))
|
||||
|
||||
def validate_return_reference_doc(self):
|
||||
"""validate item with reference doc"""
|
||||
@ -399,7 +415,6 @@ class StockEntry(StockController):
|
||||
|
||||
# posting date check
|
||||
ref_posting_datetime = "%s %s" % (ref.doc.posting_date, ref.doc.posting_time or "00:00:00")
|
||||
this_posting_datetime = "%s %s" % (self.posting_date, self.posting_time)
|
||||
|
||||
if get_datetime(ref_posting_datetime) < get_datetime(ref_posting_datetime):
|
||||
from frappe.utils.dateutils import datetime_in_user_format
|
||||
@ -474,9 +489,10 @@ class StockEntry(StockController):
|
||||
pro_doc = frappe.get_doc("Production Order", self.production_order)
|
||||
_validate_production_order(pro_doc)
|
||||
pro_doc.run_method("update_status")
|
||||
pro_doc.run_method("update_production_order_qty")
|
||||
if self.purpose == "Manufacture":
|
||||
self.update_planned_qty(pro_doc)
|
||||
if self.fg_completed_qty:
|
||||
pro_doc.run_method("update_production_order_qty")
|
||||
if self.purpose == "Manufacture":
|
||||
self.update_planned_qty(pro_doc)
|
||||
|
||||
def update_planned_qty(self, pro_doc):
|
||||
from erpnext.stock.utils import update_bin
|
||||
@ -546,9 +562,6 @@ class StockEntry(StockController):
|
||||
return ret
|
||||
|
||||
def get_items(self):
|
||||
if not self.fg_completed_qty or not self.bom_no:
|
||||
frappe.throw(_("BOM and Manufacturing Quantity are required"))
|
||||
|
||||
self.set('items', [])
|
||||
self.validate_production_order()
|
||||
|
||||
@ -638,17 +651,16 @@ class StockEntry(StockController):
|
||||
issued_item_qty = self.get_issued_qty()
|
||||
|
||||
max_qty = flt(self.pro_doc.qty)
|
||||
only_pending_fetched = []
|
||||
|
||||
for item in item_dict:
|
||||
pending_to_issue = (max_qty * item_dict[item]["qty"]) - issued_item_qty.get(item, 0)
|
||||
desire_to_transfer = flt(self.fg_completed_qty) * item_dict[item]["qty"]
|
||||
|
||||
if desire_to_transfer <= pending_to_issue:
|
||||
item_dict[item]["qty"] = desire_to_transfer
|
||||
else:
|
||||
elif pending_to_issue > 0:
|
||||
item_dict[item]["qty"] = pending_to_issue
|
||||
if pending_to_issue:
|
||||
only_pending_fetched.append(item)
|
||||
else:
|
||||
item_dict[item]["qty"] = 0
|
||||
|
||||
# delete items with 0 qty
|
||||
for item in item_dict.keys():
|
||||
@ -659,9 +671,6 @@ class StockEntry(StockController):
|
||||
if not len(item_dict):
|
||||
frappe.msgprint(_("""All items have already been transferred for this Production Order."""))
|
||||
|
||||
elif only_pending_fetched:
|
||||
frappe.msgprint(_("Pending Items {0} updated").format(only_pending_fetched))
|
||||
|
||||
return item_dict
|
||||
|
||||
def get_issued_qty(self):
|
||||
|
@ -1,6 +1,6 @@
|
||||
{% $.each(visible_columns || [], function(i, df) { %}
|
||||
{% var val = doc.get_formatted(df.fieldname);
|
||||
if((df.fieldname !== "description") && val) { %}
|
||||
if((df.fieldname !== "description" && df.fieldname !== "item_name") && val) { %}
|
||||
<div class="row">
|
||||
<div class="col-xs-4 text-ellipsis">
|
||||
<strong title="{%= __(df.label) %}">{%= __(df.label) %}:</strong>
|
||||
|
@ -1,4 +1,4 @@
|
||||
{% var visible_columns = row.get_visible_columns(["item_code", "item_name", "qty", "rate", "amount", "stock_uom", "uom", "discount_percentage", "schedule_date", "warehouse", "against_sales_order", "sales_order"]); %}
|
||||
{% var visible_columns = row.get_visible_columns(["item_code", "qty", "rate", "amount", "stock_uom", "uom", "discount_percentage", "schedule_date", "warehouse", "against_sales_order", "sales_order"]); %}
|
||||
|
||||
{% if(!doc) { %}
|
||||
<div class="row">
|
||||
@ -8,6 +8,7 @@
|
||||
<div class="col-sm-2 col-xs-4 text-right">{%= __("Amount") %}</div>
|
||||
</div>
|
||||
{% } else { %}
|
||||
{% var visible_column_fieldnames = $.map(visible_columns, function(x, i) {return x.fieldname}); %}
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-xs-8">
|
||||
{% if(doc.warehouse) {
|
||||
@ -45,11 +46,11 @@
|
||||
<strong>{%= doc.item_code %}</strong>
|
||||
{% } %}
|
||||
|
||||
{% if(doc.item_name != doc.item_code) { %}
|
||||
{% if(doc.item_name != doc.item_code && in_list(visible_column_fieldnames, "item_name")) { %}
|
||||
<br>{%= doc.item_name %}{% } %}
|
||||
|
||||
{% if((doc.description != doc.item_code != doc.item_name) &&
|
||||
in_list($.map(visible_columns, function(x, i) {return x.fieldname}), "description")) { %}
|
||||
in_list(visible_column_fieldnames, "description")) { %}
|
||||
<br>
|
||||
<strong>Description: </strong>
|
||||
{%= doc.get_formatted("description") %}{% } %}
|
||||
|
Loading…
x
Reference in New Issue
Block a user