[usability] [fixes] stock entry and production order

This commit is contained in:
Rushabh Mehta 2015-02-19 16:28:35 +05:30
parent d60acb9f26
commit c7a11cc451
14 changed files with 157 additions and 87 deletions

View File

@ -11,5 +11,6 @@ frappe.listview_settings['Purchase Order'] = {
} else if(flt(doc.per_received) == 100 && flt(doc.per_billed) == 100 && doc.status!=="Stopped") { } else if(flt(doc.per_received) == 100 && flt(doc.per_billed) == 100 && doc.status!=="Stopped") {
return [__("Completed"), "green", "per_received,=,100|per_billed,=,100|status,!=,Stopped"]; return [__("Completed"), "green", "per_received,=,100|per_billed,=,100|status,!=,Stopped"];
} }
} },
order_by: "per_received asc, modified desc"
}; };

View File

@ -151,18 +151,30 @@ $.extend(cur_frm.cscript, {
make_se: function(purpose) { make_se: function(purpose) {
var me = this; var me = this;
var max = (purpose === "Manufacture") ?
flt(this.frm.doc.material_transferred_for_qty) - flt(this.frm.doc.produced_qty) :
flt(this.frm.doc.qty) - flt(this.frm.doc.material_transferred_for_qty);
frappe.call({ frappe.prompt({fieldtype:"Int", label: __("Qty for {0}", [purpose]), fieldname:"qty",
method:"erpnext.manufacturing.doctype.production_order.production_order.make_stock_entry", description: __("Max: {0}", [max]) },
args: { function(data) {
"production_order_id": me.frm.doc.name, if(data.qty > max) {
"purpose": purpose frappe.msgprint(__("Quantity must not be more than {0}", [max]));
}, return;
callback: function(r) { }
var doclist = frappe.model.sync(r.message); frappe.call({
frappe.set_route("Form", doclist[0].doctype, doclist[0].name); method:"erpnext.manufacturing.doctype.production_order.production_order.make_stock_entry",
} args: {
}); "production_order_id": me.frm.doc.name,
"purpose": purpose,
"qty": data.qty
},
callback: function(r) {
var doclist = frappe.model.sync(r.message);
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
}
});
}, __("Select Quantity"), __("Make"));
}, },
bom_no: function() { bom_no: function() {

View File

@ -123,17 +123,17 @@ class ProductionOrder(Document):
def update_production_order_qty(self): def update_production_order_qty(self):
"""Update **Manufactured Qty** and **Material Transferred for Qty** in Production Order """Update **Manufactured Qty** and **Material Transferred for Qty** in Production Order
based on Stock Entry""" based on Stock Entry"""
for status, fieldname in (("Manufacture", "produced_qty"), for purpose, fieldname in (("Manufacture", "produced_qty"),
("Material Transfer for Manufacture", "material_transferred_for_qty")): ("Material Transfer for Manufacture", "material_transferred_for_qty")):
qty = flt(frappe.db.sql("""select sum(fg_completed_qty) qty = flt(frappe.db.sql("""select sum(fg_completed_qty)
from `tabStock Entry` where production_order=%s and docstatus=1 from `tabStock Entry` where production_order=%s and docstatus=1
and purpose=%s""", (self.name, status))[0][0]) and purpose=%s""", (self.name, purpose))[0][0])
if qty > self.qty: if qty > self.qty:
frappe.throw(_("{0} ({1}) cannot be greater than planned quanitity ({2}) in Production Order {3}").format(\ frappe.throw(_("{0} ({1}) cannot be greater than planned quanitity ({2}) in Production Order {3}").format(\
self.meta.get_label(fieldname), qty, self.qty, self.name), StockOverProductionError) self.meta.get_label(fieldname), qty, self.qty, self.name), StockOverProductionError)
self.db_set(fieldname, qty) self.db_set(fieldname, qty)
def on_submit(self): def on_submit(self):
if not self.wip_warehouse: if not self.wip_warehouse:

View File

@ -119,3 +119,4 @@ erpnext.patches.v5_0.update_material_transfer_for_manufacture
erpnext.patches.v5_0.manufacturing_activity_type erpnext.patches.v5_0.manufacturing_activity_type
erpnext.patches.v5_0.update_item_description_and_image erpnext.patches.v5_0.update_item_description_and_image
erpnext.patches.v5_0.update_material_transferred_for_qty erpnext.patches.v5_0.update_material_transferred_for_qty
erpnext.patches.v5_0.stock_entry_update_value

View File

@ -0,0 +1,7 @@
import frappe
def execute():
for d in frappe.db.get_all("Stock Entry"):
se = frappe.get_doc("Stock Entry", d.name)
se.set_total_incoming_outgoing_value()
se.db_update()

View File

@ -13,5 +13,6 @@ frappe.listview_settings['Sales Order'] = {
} else if(flt(doc.per_delivered) == 100 && flt(doc.per_billed) == 100 && doc.status!=="Stopped") { } else if(flt(doc.per_delivered) == 100 && flt(doc.per_billed) == 100 && doc.status!=="Stopped") {
return [__("Completed"), "green", "per_delivered,=,100|per_billed,=,100|status,!=,Stopped"]; return [__("Completed"), "green", "per_delivered,=,100|per_billed,=,100|status,!=,Stopped"];
} }
} },
order_by: "per_delivered asc, modified desc"
}; };

View File

@ -147,7 +147,7 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
refresh_field('items'); refresh_field('items');
calculate_total(doc, cdt, cdn); calculate_total(doc, cdt, cdn);
}, },
incoming_rate: function(doc, cdt, cdn) { incoming_rate: function(doc, cdt, cdn) {
calculate_total(doc, cdt, cdn); calculate_total(doc, cdt, cdn);
}, },

View File

@ -265,6 +265,42 @@
"print_hide": 1, "print_hide": 1,
"read_only": 0 "read_only": 0
}, },
{
"fieldname": "section_break_19",
"fieldtype": "Section Break",
"permlevel": 0,
"precision": ""
},
{
"fieldname": "total_incoming_value",
"fieldtype": "Currency",
"label": "Total Incoming Value",
"permlevel": 0,
"precision": "",
"read_only": 1
},
{
"fieldname": "column_break_22",
"fieldtype": "Column Break",
"permlevel": 0,
"precision": ""
},
{
"fieldname": "total_outgoing_value",
"fieldtype": "Currency",
"label": "Total Outgoing Value",
"permlevel": 0,
"precision": "",
"read_only": 1
},
{
"fieldname": "value_difference",
"fieldtype": "Currency",
"label": "Total Value Difference (Out - In)",
"permlevel": 0,
"precision": "",
"read_only": 1
},
{ {
"depends_on": "eval:(doc.purpose!==\"Sales Return\" && doc.purpose!==\"Purchase Return\")", "depends_on": "eval:(doc.purpose!==\"Sales Return\" && doc.purpose!==\"Purchase Return\")",
"fieldname": "sb1", "fieldname": "sb1",
@ -596,7 +632,7 @@
"is_submittable": 1, "is_submittable": 1,
"issingle": 0, "issingle": 0,
"max_attachments": 0, "max_attachments": 0,
"modified": "2015-02-17 00:49:04.294855", "modified": "2015-02-19 04:53:05.361046",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Entry", "name": "Stock Entry",

View File

@ -221,6 +221,16 @@ class StockEntry(StockController):
frappe.throw(_("Total valuation ({0}) for manufactured or repacked item(s) can not be less than total valuation of raw materials ({1})").format(valuation_at_target, frappe.throw(_("Total valuation ({0}) for manufactured or repacked item(s) can not be less than total valuation of raw materials ({1})").format(valuation_at_target,
valuation_at_source)) valuation_at_source))
def set_total_incoming_outgoing_value(self):
self.total_incoming_value = self.total_outgoing_value = 0.0
for d in self.get("items"):
if d.s_warehouse:
self.total_incoming_value += flt(d.amount)
if d.t_warehouse:
self.total_outgoing_value += flt(d.amount)
self.value_difference = self.total_outgoing_value - self.total_incoming_value
def set_total_amount(self): def set_total_amount(self):
self.total_amount = sum([flt(item.amount) for item in self.get("items")]) self.total_amount = sum([flt(item.amount) for item in self.get("items")])

View File

@ -60,12 +60,15 @@
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "item_name", "fieldname": "qty",
"fieldtype": "Data", "fieldtype": "Float",
"label": "Item Name", "in_list_view": 1,
"label": "Qty",
"oldfieldname": "qty",
"oldfieldtype": "Currency",
"permlevel": 0, "permlevel": 0,
"print_hide": 1, "read_only": 0,
"read_only": 1 "reqd": 1
}, },
{ {
"fieldname": "section_break_8", "fieldname": "section_break_8",
@ -73,6 +76,14 @@
"permlevel": 0, "permlevel": 0,
"precision": "" "precision": ""
}, },
{
"fieldname": "item_name",
"fieldtype": "Data",
"label": "Item Name",
"permlevel": 0,
"print_hide": 1,
"read_only": 1
},
{ {
"fieldname": "description", "fieldname": "description",
"fieldtype": "Text", "fieldtype": "Text",
@ -115,15 +126,31 @@
"permlevel": 0 "permlevel": 0
}, },
{ {
"fieldname": "qty", "fieldname": "incoming_rate",
"fieldtype": "Float", "fieldtype": "Currency",
"in_list_view": 1, "in_list_view": 1,
"label": "Qty", "label": "Valuation Rate",
"oldfieldname": "qty", "oldfieldname": "incoming_rate",
"oldfieldtype": "Currency", "oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"permlevel": 0, "permlevel": 0,
"read_only": 0, "read_only": 0,
"reqd": 1 "reqd": 0
},
{
"fieldname": "amount",
"fieldtype": "Currency",
"label": "Amount",
"oldfieldname": "amount",
"oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"permlevel": 0,
"read_only": 1
},
{
"fieldname": "col_break3",
"fieldtype": "Column Break",
"permlevel": 0
}, },
{ {
"fieldname": "uom", "fieldname": "uom",
@ -138,21 +165,15 @@
"reqd": 1 "reqd": 1
}, },
{ {
"fieldname": "incoming_rate", "fieldname": "conversion_factor",
"fieldtype": "Currency", "fieldtype": "Float",
"in_list_view": 1, "label": "Conversion Factor",
"label": "Valuation Rate", "oldfieldname": "conversion_factor",
"oldfieldname": "incoming_rate",
"oldfieldtype": "Currency", "oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"permlevel": 0, "permlevel": 0,
"read_only": 0, "print_hide": 1,
"reqd": 0 "read_only": 1,
}, "reqd": 1
{
"fieldname": "col_break3",
"fieldtype": "Column Break",
"permlevel": 0
}, },
{ {
"fieldname": "stock_uom", "fieldname": "stock_uom",
@ -168,27 +189,6 @@
"reqd": 1, "reqd": 1,
"search_index": 0 "search_index": 0
}, },
{
"fieldname": "conversion_factor",
"fieldtype": "Float",
"label": "Conversion Factor",
"oldfieldname": "conversion_factor",
"oldfieldtype": "Currency",
"permlevel": 0,
"print_hide": 1,
"read_only": 1,
"reqd": 1
},
{
"fieldname": "amount",
"fieldtype": "Currency",
"label": "Amount",
"oldfieldname": "amount",
"oldfieldtype": "Currency",
"options": "Company:company:default_currency",
"permlevel": 0,
"read_only": 1
},
{ {
"fieldname": "serial_no_batch", "fieldname": "serial_no_batch",
"fieldtype": "Section Break", "fieldtype": "Section Break",
@ -331,7 +331,7 @@
], ],
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"modified": "2015-02-19 01:07:02.254835", "modified": "2015-02-19 05:33:06.289852",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Entry Detail", "name": "Stock Entry Detail",

View File

@ -99,7 +99,7 @@ class update_entries_after(object):
self.precision = get_field_precision(frappe.get_meta("Stock Ledger Entry").get_field("stock_value"), self.precision = get_field_precision(frappe.get_meta("Stock Ledger Entry").get_field("stock_value"),
currency=frappe.db.get_value("Company", self.company, "default_currency")) currency=frappe.db.get_value("Company", self.company, "default_currency"))
self.prev_stock_value = self.stock_value self.prev_stock_value = self.previous_sle.stock_value or 0.0
self.stock_queue = json.loads(self.previous_sle.stock_queue or "[]") self.stock_queue = json.loads(self.previous_sle.stock_queue or "[]")
self.valuation_method = get_valuation_method(self.item_code) self.valuation_method = get_valuation_method(self.item_code)
self.stock_value_difference = 0.0 self.stock_value_difference = 0.0

View File

@ -30,7 +30,7 @@ erpnext.support.MaintenanceVisit = frappe.ui.form.Controller.extend({
cur_frm.add_custom_button(__('From Warranty Claim'), cur_frm.add_custom_button(__('From Warranty Claim'),
function() { function() {
frappe.model.map_current_doc({ frappe.model.map_current_doc({
method: "erpnext.support.doctype.customer_issue.customer_issue.make_maintenance_visit", method: "erpnext.support.doctype.warranty_claim.warranty_claim.make_maintenance_visit",
source_doctype: "Warranty Claim", source_doctype: "Warranty Claim",
get_query_filters: { get_query_filters: {
status: ["in", "Open, Work in Progress"], status: ["in", "Open, Work in Progress"],

View File

@ -21,7 +21,7 @@ erpnext.support.WarrantyClaim = frappe.ui.form.Controller.extend({
make_maintenance_visit: function() { make_maintenance_visit: function() {
frappe.model.open_mapped_doc({ frappe.model.open_mapped_doc({
method: "erpnext.support.doctype.customer_issue.customer_issue.make_maintenance_visit", method: "erpnext.support.doctype.warranty_claim.warranty_claim.make_maintenance_visit",
frm: cur_frm frm: cur_frm
}) })
} }

View File

@ -5,32 +5,34 @@
{% if(!doc) { %} {% if(!doc) { %}
<div class="row"> <div class="row">
<div class="col-sm-8 col-xs-6">{%= __("Item") %}</div> <div class="col-sm-5 col-xs-4">{%= __("Item") %}</div>
<div class="col-sm-3 col-xs-4">{%= __("Warehouse") %}</div>
<div class="col-sm-2 col-xs-2 text-right">{%= __("Qty") %}</div> <div class="col-sm-2 col-xs-2 text-right">{%= __("Qty") %}</div>
<div class="col-sm-2 col-xs-4 text-right">{%= __("Amount") %}</div> <div class="col-sm-2 col-xs-2 text-right">{%= __("Amount") %}</div>
</div> </div>
{% } else { %} {% } else { %}
<div class="row"> <div class="row">
<div class="col-sm-8 col-xs-6"><strong>{%= doc.item_code %}</strong> <div class="col-sm-5 col-xs-4"><strong>{%= doc.item_code %}</strong>
{% if(doc.item_name != doc.item_code) { %} {% if(doc.item_name != doc.item_code) { %}
<br>{%= doc.item_name %}{% } %} <br>{%= doc.item_name %}{% } %}
{% if(doc.item_name != doc.description) { %} {% if(doc.item_name != doc.description) { %}
<p>{%= doc.description %}</p>{% } %} <p>{%= doc.description %}</p>{% } %}
{% include "templates/form_grid/includes/visible_cols.html" %} {% include "templates/form_grid/includes/visible_cols.html" %}
<div> {% if(frm.doc.docstatus==0 && doc.s_warehouse && doc.actual_qty < doc.qty) { %}
{% if(doc.s_warehouse) { %} <span class="text-danger small" style="margin-left: 15px;">
<span class="label label-primary"> <span class="octicon octicon-stop" style="font-size: 12px;"></span> Not in Stock
{%= doc.s_warehouse || "" %}</span> </span>
{% } %} {% } %}
<i class="octicon octicon-arrow-small-right"></i> </div>
{% if(doc.t_warehouse) { %}<span class="label label-primary">
{%= doc.t_warehouse || "" %}</span>{% } %} <!-- warehouse -->
{% if(doc.s_warehouse && doc.actual_qty < doc.qty) { %} <div class="col-sm-3 col-xs-4">
<span class="text-danger small" style="margin-left: 15px;"> {% if(doc.s_warehouse) { %}
<span class="octicon octicon-stop" style="font-size: 12px;"></span> Not in Stock <span class="label label-default" title="{% __("Source" )%}">
</span> {%= doc.s_warehouse || "" %}</span>
{% } %} {% } %}
</div> {% if(doc.t_warehouse) { %}<span class="label label-primary" title="{% __("Target" )%}">
{%= doc.t_warehouse || "" %}</span>{% } %}
</div> </div>
<!-- qty --> <!-- qty -->
@ -40,7 +42,7 @@
</div> </div>
<!-- amount --> <!-- amount -->
<div class="col-sm-2 col-xs-4 text-right"> <div class="col-sm-2 col-xs-2 text-right">
{%= doc.get_formatted("amount") %} {%= doc.get_formatted("amount") %}
<div class="small text-muted"> <div class="small text-muted">
{%= doc.get_formatted("incoming_rate") %} {%= doc.get_formatted("incoming_rate") %}