[cleanup] drop ship testing & cleanup

This commit is contained in:
Rushabh Mehta 2015-11-04 15:20:50 +05:30
parent 58101e9e6c
commit d48c2394e8
14 changed files with 2676 additions and 2550 deletions

View File

@ -19,15 +19,16 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
this._super(); this._super();
// this.frm.dashboard.reset(); // this.frm.dashboard.reset();
if(doc.docstatus == 1 && doc.status != 'Stopped' && doc.status != 'Closed') { if(doc.docstatus == 1 && !in_list(["Stopped", "Closed", "Delivered"], doc.status)) {
if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) if(flt(doc.per_billed, 2) < 100 || doc.per_received < 100) {
cur_frm.add_custom_button(__('Stop'), this.stop_purchase_order); cur_frm.add_custom_button(__('Stop'), this.stop_purchase_order);
}
cur_frm.add_custom_button(__('Close'), this.close_purchase_order); cur_frm.add_custom_button(__('Close'), this.close_purchase_order);
if(doc.delivered_by_supplier && doc.status!="Delivered"){ if(doc.delivered_by_supplier && doc.status!="Delivered"){
cur_frm.add_custom_button(__('Delivered By Supplier'), this.delivered_by_supplier); cur_frm.add_custom_button(__('Mark as Delivered'), this.delivered_by_supplier);
} }
if(flt(doc.per_billed)==0) { if(flt(doc.per_billed)==0) {
@ -51,8 +52,9 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
cur_frm.cscript.add_from_mappers(); cur_frm.cscript.add_from_mappers();
} }
if(doc.docstatus == 1 && (doc.status === 'Stopped' || doc.status === "Closed")) if(doc.docstatus == 1 && in_list(["Stopped", "Closed", "Delivered"], doc.status)) {
cur_frm.add_custom_button(__('Re-open'), this.unstop_purchase_order); cur_frm.add_custom_button(__('Re-open'), this.unstop_purchase_order);
}
}, },
make_stock_entry: function() { make_stock_entry: function() {
@ -173,18 +175,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
cur_frm.cscript.update_status('Close', 'Closed') cur_frm.cscript.update_status('Close', 'Closed')
}, },
delivered_by_supplier: function(){ delivered_by_supplier: function(){
return frappe.call({ cur_frm.cscript.update_status('Deliver', 'Delivered')
method: "erpnext.buying.doctype.purchase_order.purchase_order.delivered_by_supplier",
freeze: true,
args:{
purchase_order: cur_frm.doc.name
},
callback:function(r){
if(!r.exc) {
cur_frm.reload_doc();
}
}
})
} }
}); });
@ -193,16 +184,12 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
$.extend(cur_frm.cscript, new erpnext.buying.PurchaseOrderController({frm: cur_frm})); $.extend(cur_frm.cscript, new erpnext.buying.PurchaseOrderController({frm: cur_frm}));
cur_frm.cscript.update_status= function(label, status){ cur_frm.cscript.update_status= function(label, status){
frappe.ui.form.is_saving = true;
frappe.call({ frappe.call({
method: "erpnext.buying.doctype.purchase_order.purchase_order.update_status", method: "erpnext.buying.doctype.purchase_order.purchase_order.update_status",
args: {status: status, name: cur_frm.doc.name}, args: {status: status, name: cur_frm.doc.name},
callback: function(r) { callback: function(r) {
cur_frm.set_value("status", status); cur_frm.set_value("status", status);
cur_frm.reload_doc(); cur_frm.reload_doc();
},
always: function() {
frappe.ui.form.is_saving = false;
} }
}) })
} }

View File

@ -151,53 +151,7 @@
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
"depends_on": "eval:doc.delivered_by_supplier==1", "depends_on": "",
"fieldname": "customer",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer",
"no_copy": 0,
"options": "Customer",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "eval:doc.delivered_by_supplier==1",
"fieldname": "customer_name",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Name",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "address_display", "fieldname": "address_display",
"fieldtype": "Small Text", "fieldtype": "Small Text",
"hidden": 1, "hidden": 1,
@ -215,28 +169,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_address_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Address",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -258,28 +190,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Contact",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -301,28 +211,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_mobile",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Mobile No",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -344,28 +232,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_email",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Contact Email",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -461,6 +327,76 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 1,
"collapsible_depends_on": "delivered_by_supplier",
"fieldname": "drop_ship",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Drop Ship",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "delivered_by_supplier",
"fieldname": "customer",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer",
"no_copy": 0,
"options": "Customer",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "delivered_by_supplier",
"fieldname": "customer_name",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Name",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -471,7 +407,7 @@
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 0, "in_filter": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "Delivered By Supplier", "label": "To be delivered to customer",
"no_copy": 0, "no_copy": 0,
"permlevel": 0, "permlevel": 0,
"precision": "", "precision": "",
@ -483,6 +419,163 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "column_break_19",
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "delivered_by_supplier",
"fieldname": "customer_address",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Address",
"no_copy": 0,
"options": "Address",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "delivered_by_supplier",
"fieldname": "customer_contact_person",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Contact",
"no_copy": 0,
"options": "Contact",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_address_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Address Display",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_display",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Contact",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_mobile",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Mobile No",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "customer_contact_email",
"fieldtype": "Small Text",
"hidden": 1,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Customer Contact Email",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -2190,7 +2283,7 @@
"is_submittable": 1, "is_submittable": 1,
"issingle": 0, "issingle": 0,
"istable": 0, "istable": 0,
"modified": "2015-10-29 16:41:30.749753", "modified": "2015-11-04 04:44:22.025827",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Buying", "module": "Buying",
"name": "Purchase Order", "name": "Purchase Order",

View File

@ -154,8 +154,7 @@ class PurchaseOrder(BuyingController):
def update_status(self, status): def update_status(self, status):
self.check_modified_date() self.check_modified_date()
self.db_set('status', status) self.set_status(update=True, status=status)
self.set_status(update=True)
self.update_requested_qty() self.update_requested_qty()
self.update_ordered_qty() self.update_ordered_qty()
self.notify_update() self.notify_update()
@ -228,6 +227,20 @@ class PurchaseOrder(BuyingController):
"target_parent_field": '' "target_parent_field": ''
}) })
def update_delivered_qty_in_sales_order(self):
"""Update delivered qty in Sales Order for drop ship"""
sales_orders_to_update = []
for item in self.items:
if item.prevdoc_doctype == "Sales Order":
if item.prevdoc_docname not in sales_orders_to_update:
sales_orders_to_update.append(item.prevdoc_docname)
for so_name in sales_orders_to_update:
so = frappe.get_doc("Sales Order", so_name)
so.update_delivery_status(self.name)
so.set_status(update=True)
so.notify_update()
@frappe.whitelist() @frappe.whitelist()
def stop_or_unstop_purchase_orders(names, status): def stop_or_unstop_purchase_orders(names, status):
if not frappe.has_permission("Purchase Order", "write"): if not frappe.has_permission("Purchase Order", "write"):
@ -344,20 +357,5 @@ def make_stock_entry(purchase_order, item_code):
def update_status(status, name): def update_status(status, name):
po = frappe.get_doc("Purchase Order", name) po = frappe.get_doc("Purchase Order", name)
po.update_status(status) po.update_status(status)
po.update_delivered_qty_in_sales_order()
@frappe.whitelist()
def delivered_by_supplier(purchase_order):
po = frappe.get_doc("Purchase Order", purchase_order)
update_delivered_qty(po)
po.update_status("Delivered")
def update_delivered_qty(purchase_order):
so_name = ''
for item in purchase_order.items:
if item.prevdoc_doctype == "Sales Order":
so_name = item.prevdoc_docname
so = frappe.get_doc("Sales Order", so_name)
so.update_delivery_status(purchase_order.name)
so.set_status(update=True)
so.notify_update()

View File

@ -853,7 +853,7 @@
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 0, "in_filter": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "Prevdoc DocType", "label": "Reference Document Type",
"no_copy": 1, "no_copy": 1,
"oldfieldname": "prevdoc_doctype", "oldfieldname": "prevdoc_doctype",
"oldfieldtype": "Data", "oldfieldtype": "Data",
@ -1201,7 +1201,7 @@
"is_submittable": 0, "is_submittable": 0,
"issingle": 0, "issingle": 0,
"istable": 1, "istable": 1,
"modified": "2015-10-19 03:04:51.773011", "modified": "2015-10-19 03:04:51.773012",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Buying", "module": "Buying",
"name": "Purchase Order Item", "name": "Purchase Order Item",

View File

@ -76,12 +76,16 @@ class StatusUpdater(Document):
self.update_qty() self.update_qty()
self.validate_qty() self.validate_qty()
def set_status(self, update=False): def set_status(self, update=False, status=None):
if self.is_new(): if self.is_new():
return return
if self.doctype in status_map: if self.doctype in status_map:
_status = self.status _status = self.status
if status and update:
self.db_set("status", status)
sl = status_map[self.doctype][:] sl = status_map[self.doctype][:]
sl.reverse() sl.reverse()
for s in sl: for s in sl:
@ -256,9 +260,9 @@ class StatusUpdater(Document):
zero_amount_refdoc.append(item.get(ref_fieldname)) zero_amount_refdoc.append(item.get(ref_fieldname))
if zero_amount_refdoc: if zero_amount_refdoc:
self.update_biling_status(zero_amount_refdoc, ref_dt, ref_fieldname) self.update_billing_status(zero_amount_refdoc, ref_dt, ref_fieldname)
def update_biling_status(self, zero_amount_refdoc, ref_dt, ref_fieldname): def update_billing_status(self, zero_amount_refdoc, ref_dt, ref_fieldname):
for ref_dn in zero_amount_refdoc: for ref_dn in zero_amount_refdoc:
ref_doc_qty = flt(frappe.db.sql("""select sum(ifnull(qty, 0)) from `tab%s Item` ref_doc_qty = flt(frappe.db.sql("""select sum(ifnull(qty, 0)) from `tab%s Item`
where parent=%s""" % (ref_dt, '%s'), (ref_dn))[0][0]) where parent=%s""" % (ref_dt, '%s'), (ref_dn))[0][0])

View File

@ -78,25 +78,22 @@
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
"fieldname": "leave_type", "fieldname": "column_break1",
"fieldtype": "Link", "fieldtype": "Column Break",
"hidden": 0, "hidden": 0,
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 1, "in_filter": 0,
"in_list_view": 1, "in_list_view": 0,
"label": "Leave Type",
"no_copy": 0, "no_copy": 0,
"oldfieldname": "leave_type",
"oldfieldtype": "Link",
"options": "Leave Type",
"permlevel": 0, "permlevel": 0,
"print_hide": 0, "print_hide": 0,
"read_only": 0, "read_only": 0,
"report_hide": 0, "report_hide": 0,
"reqd": 1, "reqd": 0,
"search_index": 1, "search_index": 0,
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0,
"width": "50%"
}, },
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
@ -126,22 +123,46 @@
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
"fieldname": "column_break1", "fieldname": "section_break_6",
"fieldtype": "Column Break", "fieldtype": "Section Break",
"hidden": 0, "hidden": 0,
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 0, "in_filter": 0,
"in_list_view": 0, "in_list_view": 0,
"no_copy": 0, "no_copy": 0,
"permlevel": 0, "permlevel": 0,
"precision": "",
"print_hide": 0, "print_hide": 0,
"read_only": 0, "read_only": 0,
"report_hide": 0, "report_hide": 0,
"reqd": 0, "reqd": 0,
"search_index": 0, "search_index": 0,
"set_only_once": 0, "set_only_once": 0,
"unique": 0, "unique": 0
"width": "50%" },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "leave_type",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 1,
"in_list_view": 1,
"label": "Leave Type",
"no_copy": 0,
"oldfieldname": "leave_type",
"oldfieldtype": "Link",
"options": "Leave Type",
"permlevel": 0,
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 1,
"set_only_once": 0,
"unique": 0
}, },
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
@ -191,15 +212,15 @@
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
"collapsible": 0, "collapsible": 0,
"fieldname": "carry_forward", "fieldname": "column_break_10",
"fieldtype": "Check", "fieldtype": "Column Break",
"hidden": 0, "hidden": 0,
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 0, "in_filter": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "Carry Forward",
"no_copy": 0, "no_copy": 0,
"permlevel": 0, "permlevel": 0,
"precision": "",
"print_hide": 0, "print_hide": 0,
"read_only": 0, "read_only": 0,
"report_hide": 0, "report_hide": 0,
@ -208,28 +229,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "carry_forward",
"fieldname": "carry_forwarded_leaves",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Carry Forwarded Leaves",
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0, "bold": 0,
@ -251,6 +250,50 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"description": "",
"fieldname": "carry_forward",
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Add unused leaves from previous allocations",
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"depends_on": "carry_forward",
"fieldname": "carry_forwarded_leaves",
"fieldtype": "Float",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Unused leaves",
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
"read_only": 1,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 1, "allow_on_submit": 1,
"bold": 0, "bold": 0,
@ -306,7 +349,7 @@
"is_submittable": 1, "is_submittable": 1,
"issingle": 0, "issingle": 0,
"istable": 0, "istable": 0,
"modified": "2015-10-28 18:18:29.137427", "modified": "2015-11-04 03:13:11.121463",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Leave Allocation", "name": "Leave Allocation",

View File

@ -42,7 +42,7 @@ class LeaveAllocation(Document):
if leave_allocation: if leave_allocation:
frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for period {2} - {3}").format(self.leave_type, frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for period {2} - {3}").format(self.leave_type,
self.employee, self.from_date, self.to_date)) self.employee, self.from_date, self.to_date))
frappe.throw('<a href="#Form/Leave Allocation/{0}">{0}</a>'.format(leave_allocation[0][0])) frappe.throw(_('Reference') + ': <a href="#Form/Leave Allocation/{0}">{0}</a>'.format(leave_allocation[0][0]))
def get_leave_bal(self): def get_leave_bal(self):
return self.get_leaves_allocated() - self.get_leaves_applied() return self.get_leaves_allocated() - self.get_leaves_applied()
@ -93,4 +93,3 @@ class LeaveAllocation(Document):
def validate_total_leaves_allocated(self, leave_det): def validate_total_leaves_allocated(self, leave_det):
if date_diff(self.to_date, self.from_date) <= leave_det['total_leaves_allocated']: if date_diff(self.to_date, self.from_date) <= leave_det['total_leaves_allocated']:
frappe.throw(_("Total allocated leaves are more than period")) frappe.throw(_("Total allocated leaves are more than period"))

View File

@ -23,23 +23,25 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
$.each(cur_frm.doc.items, function(i, item){ $.each(cur_frm.doc.items, function(i, item){
if(item.delivered_by_supplier == 1 || item.supplier){ if(item.delivered_by_supplier == 1 || item.supplier){
if(item.qty > item.ordered_qty) if(item.qty > flt(item.ordered_qty))
is_delivered_by_supplier = true; is_delivered_by_supplier = true;
} }
else{ else{
if(item.qty > item.delivered_qty) if(item.qty > flt(item.delivered_qty))
is_delivery_note = true; is_delivery_note = true;
} }
}) })
// cur_frm.dashboard.add_progress(cint(doc.per_delivered) + __("% Delivered"), // material request
// doc.per_delivered); if(!doc.order_type || ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1
// cur_frm.dashboard.add_progress(cint(doc.per_billed) + __("% Billed"), && flt(doc.per_delivered, 2) < 100) {
// doc.per_billed); cur_frm.add_custom_button(__('Material Request'), this.make_material_request);
}
// indent // make purchase order
if(!doc.order_type || ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && flt(doc.per_delivered, 2) < 100 && !is_delivered_by_supplier) if(flt(doc.per_delivered, 2) < 100 && is_delivered_by_supplier) {
cur_frm.add_custom_button(__('Material Request'), this.make_material_request); cur_frm.add_custom_button(__('Purchase Order'), cur_frm.cscript.make_purchase_order);
}
if(flt(doc.per_billed)==0) { if(flt(doc.per_billed)==0) {
cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_bank_entry); cur_frm.add_custom_button(__('Payment'), cur_frm.cscript.make_bank_entry);
@ -60,16 +62,15 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
} }
// delivery note // delivery note
if(flt(doc.per_delivered, 2) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && is_delivery_note) if(flt(doc.per_delivered, 2) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && is_delivery_note) {
cur_frm.add_custom_button(__('Delivery'), this.make_delivery_note).addClass("btn-primary"); cur_frm.add_custom_button(__('Delivery'), this.make_delivery_note).addClass("btn-primary");
}
// sales invoice // sales invoice
if(flt(doc.per_billed, 2) < 100) { if(flt(doc.per_billed, 2) < 100) {
cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice).addClass("btn-primary"); cur_frm.add_custom_button(__('Invoice'), this.make_sales_invoice).addClass("btn-primary");
} }
if(flt(doc.per_delivered, 2) < 100 && is_delivered_by_supplier)
cur_frm.add_custom_button(__('Make Purchase Order'), cur_frm.cscript.make_purchase_order).addClass("btn-primary");
} else { } else {
// un-stop // un-stop
@ -178,7 +179,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend(
filters: {'parent': cur_frm.doc.name} filters: {'parent': cur_frm.doc.name}
} }
}, "reqd": 1 }, }, "reqd": 1 },
{"fieldtype": "Button", "label": __("Make Purchase Order"), "fieldname": "make_purchase_order"}, {"fieldtype": "Button", "label": __("Make Purchase Order"), "fieldname": "make_purchase_order", "cssClass": "btn-primary"},
] ]
}); });

View File

@ -220,20 +220,13 @@ class SalesOrder(SellingController):
if date_diff and date_diff[0][0]: if date_diff and date_diff[0][0]:
frappe.throw(_("{0} {1} has been modified. Please refresh.").format(self.doctype, self.name)) frappe.throw(_("{0} {1} has been modified. Please refresh.").format(self.doctype, self.name))
def stop_sales_order(self, status): def update_status(self, status):
self.check_modified_date() self.check_modified_date()
self.db_set('status', status) self.set_status(update=True, status=status)
self.update_reserved_qty() self.update_reserved_qty()
self.notify_update() self.notify_update()
clear_doctype_notifications(self) clear_doctype_notifications(self)
def unstop_sales_order(self):
self.check_modified_date()
self.db_set('status', 'Draft')
self.set_status(update=True)
self.update_reserved_qty()
clear_doctype_notifications(self)
def update_reserved_qty(self, so_item_rows=None): def update_reserved_qty(self, so_item_rows=None):
"""update requested qty (before ordered_qty is updated)""" """update requested qty (before ordered_qty is updated)"""
item_wh_list = [] item_wh_list = []
@ -261,27 +254,38 @@ class SalesOrder(SellingController):
def before_update_after_submit(self): def before_update_after_submit(self):
self.validate_drop_ship() self.validate_drop_ship()
self.validate_po() self.validate_supplier_after_submit()
def validate_po(self): def validate_supplier_after_submit(self):
"""Check that supplier is the same after submit if PO is already made"""
exc_list = [] exc_list = []
for item in self.items: for item in self.items:
supplier = frappe.db.get_value("Sales Order Item", {"parent": self.name, "item_code": item.item_code}, if item.supplier:
"supplier") supplier = frappe.db.get_value("Sales Order Item", {"parent": self.name, "item_code": item.item_code},
if item.ordered_qty > 0.0 and item.supplier != supplier: "supplier")
exc_list.append("Row #{0}: Not allowed to change supplier as Purchase Order already exists".format(item.idx)) if item.ordered_qty > 0.0 and item.supplier != supplier:
exc_list.append(_("Row #{0}: Not allowed to change Supplier as Purchase Order already exists").format(item.idx))
if exc_list: if exc_list:
frappe.throw('\n'.join(exc_list)) frappe.throw('\n'.join(exc_list))
def update_delivery_status(self, po_name): def update_delivery_status(self, po_name):
"""Update delivery status from Purchase Order for drop shipping"""
tot_qty, delivered_qty = 0.0, 0.0 tot_qty, delivered_qty = 0.0, 0.0
for item in self.items: for item in self.items:
if item.delivered_by_supplier: if item.delivered_by_supplier:
delivered_qty = frappe.db.get_value("Purchase Order Item", {"parent": po_name, "item_code": item.item_code}, "qty") delivered_qty = frappe.db.sql("""select qty
frappe.db.set_value("Sales Order Item", item.name, "delivered_qty", delivered_qty) from `tabPurchase Order Item` poi, `tabPurchase Order` po
where poi.prevdoc_docname = %s
and poi.prevdoc_doctype = 'Sales Order'
and poi.item_code = %s
and poi.parent = po.name
and po.status = 'Delivered'""", (self.name, item.item_code))
delivered_qty = delivered_qty[0][0] if delivered_qty else 0
item.db_set("delivered_qty", delivered_qty)
delivered_qty += item.delivered_qty delivered_qty += item.delivered_qty
tot_qty += item.qty tot_qty += item.qty
@ -305,10 +309,10 @@ def stop_or_unstop_sales_orders(names, status):
if so.docstatus == 1: if so.docstatus == 1:
if status in ("Stopped", "Closed"): if status in ("Stopped", "Closed"):
if so.status not in ("Stopped", "Cancelled", "Closed") and (so.per_delivered < 100 or so.per_billed < 100): if so.status not in ("Stopped", "Cancelled", "Closed") and (so.per_delivered < 100 or so.per_billed < 100):
so.stop_sales_order(status) so.update_status(status)
else: else:
if so.status in ("Stopped", "Closed"): if so.status in ("Stopped", "Closed"):
so.unstop_sales_order() so.update_status('Draft')
frappe.local.message_log = [] frappe.local.message_log = []
@ -545,11 +549,12 @@ def make_purchase_order_for_drop_shipment(source_name, for_supplier, target_doc=
"Sales Order": { "Sales Order": {
"doctype": "Purchase Order", "doctype": "Purchase Order",
"field_map": { "field_map": {
"customer_address": "customer_address",
"contact_person": "customer_contact_person",
"address_display": "customer_address_display", "address_display": "customer_address_display",
"contact_display": "customer_contact_display", "contact_display": "customer_contact_display",
"contact_mobile": "customer_contact_mobile", "contact_mobile": "customer_contact_mobile",
"contact_email": "customer_contact_email", "contact_email": "customer_contact_email",
"contact_person": "customer_contact_person"
}, },
"field_no_map": [ "field_no_map": [
"address_display", "address_display",
@ -614,4 +619,4 @@ def get_supplier(doctype, txt, searchfield, start, page_len, filters):
@frappe.whitelist() @frappe.whitelist()
def update_status(status, name): def update_status(status, name):
so = frappe.get_doc("Sales Order", name) so = frappe.get_doc("Sales Order", name)
so.stop_sales_order(status) so.update_status(status)

View File

@ -7,8 +7,6 @@ import frappe.permissions
import unittest import unittest
from erpnext.selling.doctype.sales_order.sales_order \ from erpnext.selling.doctype.sales_order.sales_order \
import make_material_request, make_delivery_note, make_sales_invoice, WarehouseRequired import make_material_request, make_delivery_note, make_sales_invoice, WarehouseRequired
from erpnext.accounts.doctype.journal_entry.test_journal_entry \
import make_journal_entry
from frappe.tests.test_permissions import set_user_permission_doctypes from frappe.tests.test_permissions import set_user_permission_doctypes
@ -97,12 +95,12 @@ class TestSalesOrder(unittest.TestCase):
# stop so # stop so
so.load_from_db() so.load_from_db()
so.stop_sales_order("Stopped") so.update_status("Stopped")
self.assertEqual(get_reserved_qty(), existing_reserved_qty) self.assertEqual(get_reserved_qty(), existing_reserved_qty)
# unstop so # unstop so
so.load_from_db() so.load_from_db()
so.unstop_sales_order() so.update_status('Draft')
self.assertEqual(get_reserved_qty(), existing_reserved_qty + 5) self.assertEqual(get_reserved_qty(), existing_reserved_qty + 5)
dn.cancel() dn.cancel()
@ -147,14 +145,14 @@ class TestSalesOrder(unittest.TestCase):
# stop so # stop so
so.load_from_db() so.load_from_db()
so.stop_sales_order("Stopped") so.update_status("Stopped")
self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1) self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1)
self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2) self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"), existing_reserved_qty_item2)
# unstop so # unstop so
so.load_from_db() so.load_from_db()
so.unstop_sales_order() so.update_status('Draft')
self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 25) self.assertEqual(get_reserved_qty("_Test Item"), existing_reserved_qty_item1 + 25)
self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"), self.assertEqual(get_reserved_qty("_Test Item Home Desktop 100"),
@ -297,7 +295,7 @@ class TestSalesOrder(unittest.TestCase):
frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1) frappe.db.set_value("Stock Settings", None, "auto_insert_price_list_rate_if_missing", 1)
def test_drop_shipping(self): def test_drop_shipping(self):
from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order_for_drop_shipment, make_delivery_note from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order_for_drop_shipment
from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.item.test_item import make_item
from erpnext.buying.doctype.purchase_order.purchase_order import delivered_by_supplier from erpnext.buying.doctype.purchase_order.purchase_order import delivered_by_supplier
@ -407,7 +405,7 @@ class TestSalesOrder(unittest.TestCase):
self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty+1) self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty+1)
so.stop_sales_order("Closed") so.update_status("Closed")
self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty) self.assertEquals(get_reserved_qty(item_code="_Test Item", warehouse="_Test Warehouse - _TC"), existing_reserved_qty)

View File

@ -688,7 +688,7 @@
"bold": 0, "bold": 0,
"collapsible": 1, "collapsible": 1,
"collapsible_depends_on": "eval:doc.delivered_by_supplier==1||doc.supplier", "collapsible_depends_on": "eval:doc.delivered_by_supplier==1||doc.supplier",
"fieldname": "drop_ship", "fieldname": "drop_ship_section",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"hidden": 0, "hidden": 0,
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
@ -716,7 +716,7 @@
"ignore_user_permissions": 0, "ignore_user_permissions": 0,
"in_filter": 0, "in_filter": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "Delivered By Supplier", "label": "Supplier delivers to Customer",
"no_copy": 0, "no_copy": 0,
"permlevel": 0, "permlevel": 0,
"precision": "", "precision": "",
@ -1187,7 +1187,7 @@
"is_submittable": 0, "is_submittable": 0,
"issingle": 0, "issingle": 0,
"istable": 1, "istable": 1,
"modified": "2015-11-04 11:29:57.645382", "modified": "2015-11-04 11:29:57.645383",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Sales Order Item", "name": "Sales Order Item",

View File

@ -271,8 +271,7 @@ class DeliveryNote(SellingController):
frappe.msgprint(_("Packing Slip(s) cancelled")) frappe.msgprint(_("Packing Slip(s) cancelled"))
def update_status(self, status): def update_status(self, status):
self.db_set('status', status) self.set_status(update=True, status=status)
self.set_status(update=True)
self.notify_update() self.notify_update()
clear_doctype_notifications(self) clear_doctype_notifications(self)

View File

@ -1165,28 +1165,6 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "delivered_by_supplier",
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Delivered By Supplier (Drop Ship)",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -1210,6 +1188,28 @@
"set_only_once": 0, "set_only_once": 0,
"unique": 0 "unique": 0
}, },
{
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"fieldname": "delivered_by_supplier",
"fieldtype": "Check",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Delivered by Supplier (Drop Ship)",
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 1,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
},
{ {
"allow_on_submit": 0, "allow_on_submit": 0,
"bold": 0, "bold": 0,
@ -2157,7 +2157,7 @@
"issingle": 0, "issingle": 0,
"istable": 0, "istable": 0,
"max_attachments": 1, "max_attachments": 1,
"modified": "2015-11-03 07:52:41.416937", "modified": "2015-11-04 04:50:02.051468",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Item", "name": "Item",

View File

@ -429,8 +429,7 @@ class PurchaseReceipt(BuyingController):
return process_gl_map(gl_entries) return process_gl_map(gl_entries)
def update_status(self, status): def update_status(self, status):
self.db_set('status', status) self.set_status(update=True, status = status)
self.set_status(update=True)
self.notify_update() self.notify_update()
clear_doctype_notifications(self) clear_doctype_notifications(self)