mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-03 12:19:12 +00:00
Merge pull request #50736 from mihir-kandoi/refactor-so-to-po
This commit is contained in:
@@ -1589,15 +1589,33 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
size: "large",
|
size: "large",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
fieldtype: "Check",
|
fieldname: "set_supplier",
|
||||||
label: __("Against Default Supplier"),
|
fieldtype: "Link",
|
||||||
fieldname: "against_default_supplier",
|
label: __("Set Supplier"),
|
||||||
default: 0,
|
options: "Supplier",
|
||||||
|
onchange: function () {
|
||||||
|
let supplier = dialog.get_value("set_supplier");
|
||||||
|
let items_table = dialog.fields_dict.items_for_po.grid;
|
||||||
|
let selected_items = items_table.get_selected_children();
|
||||||
|
|
||||||
|
selected_items.forEach((item) => {
|
||||||
|
item.supplier = supplier;
|
||||||
|
items_table.refresh();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldtype: "Column Break",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldtype: "Section Break",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
fieldname: "items_for_po",
|
fieldname: "items_for_po",
|
||||||
fieldtype: "Table",
|
fieldtype: "Table",
|
||||||
label: __("Select Items"),
|
label: __("Select Items"),
|
||||||
|
cannot_add_rows: true,
|
||||||
|
cannot_delete_rows: true,
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
fieldtype: "Data",
|
fieldtype: "Data",
|
||||||
@@ -1629,10 +1647,11 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
in_list_view: 1,
|
in_list_view: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
fieldtype: "Data",
|
fieldtype: "Link",
|
||||||
fieldname: "supplier",
|
fieldname: "supplier",
|
||||||
label: __("Supplier"),
|
label: __("Supplier"),
|
||||||
read_only: 1,
|
reqd: 1,
|
||||||
|
options: "Supplier",
|
||||||
in_list_view: 1,
|
in_list_view: 1,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -1651,13 +1670,17 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
dialog.hide();
|
if (selected_items.some((item) => !item.supplier)) {
|
||||||
|
frappe.throw({
|
||||||
|
message: __("Supplier is required for all selected Items"),
|
||||||
|
title: __("Supplier Required"),
|
||||||
|
indicator: "blue",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var method = args.against_default_supplier
|
dialog.hide();
|
||||||
? "make_purchase_order_for_default_supplier"
|
|
||||||
: "make_purchase_order";
|
|
||||||
return frappe.call({
|
return frappe.call({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order." + method,
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_purchase_order",
|
||||||
freeze_message: __("Creating Purchase Order ..."),
|
freeze_message: __("Creating Purchase Order ..."),
|
||||||
args: {
|
args: {
|
||||||
source_name: me.frm.doc.name,
|
source_name: me.frm.doc.name,
|
||||||
@@ -1666,9 +1689,9 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
freeze: true,
|
freeze: true,
|
||||||
callback: function (r) {
|
callback: function (r) {
|
||||||
if (!r.exc) {
|
if (!r.exc) {
|
||||||
if (!args.against_default_supplier) {
|
if (r.message.length == 1) {
|
||||||
frappe.model.sync(r.message);
|
frappe.model.sync(r.message[0]);
|
||||||
frappe.set_route("Form", r.message.doctype, r.message.name);
|
frappe.set_route("Form", r.message[0].doctype, r.message[0].name);
|
||||||
} else {
|
} else {
|
||||||
frappe.route_options = {
|
frappe.route_options = {
|
||||||
sales_order: me.frm.doc.name,
|
sales_order: me.frm.doc.name,
|
||||||
@@ -1681,41 +1704,28 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
dialog.fields_dict["against_default_supplier"].df.onchange = () => set_po_items_data(dialog);
|
|
||||||
|
|
||||||
function set_po_items_data(dialog) {
|
function set_po_items_data(dialog) {
|
||||||
var against_default_supplier = dialog.get_value("against_default_supplier");
|
let po_items = [];
|
||||||
var items_for_po = dialog.get_value("items_for_po");
|
me.frm.doc.items.forEach((d) => {
|
||||||
|
let ordered_qty = me.get_ordered_qty(d, me.frm.doc);
|
||||||
|
let pending_qty = (flt(d.stock_qty) - ordered_qty) / flt(d.conversion_factor);
|
||||||
|
if (pending_qty > 0) {
|
||||||
|
po_items.push({
|
||||||
|
name: d.name,
|
||||||
|
item_name: d.item_name,
|
||||||
|
item_code: d.item_code,
|
||||||
|
pending_qty: pending_qty,
|
||||||
|
uom: d.uom,
|
||||||
|
supplier: d.supplier,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (against_default_supplier) {
|
dialog.fields_dict["items_for_po"].df.data = po_items;
|
||||||
let items_with_supplier = items_for_po.filter((item) => item.supplier);
|
dialog.get_field("items_for_po").refresh();
|
||||||
|
|
||||||
dialog.fields_dict["items_for_po"].df.data = items_with_supplier;
|
|
||||||
dialog.get_field("items_for_po").refresh();
|
|
||||||
} else {
|
|
||||||
let po_items = [];
|
|
||||||
me.frm.doc.items.forEach((d) => {
|
|
||||||
let ordered_qty = me.get_ordered_qty(d, me.frm.doc);
|
|
||||||
let pending_qty = (flt(d.stock_qty) - ordered_qty) / flt(d.conversion_factor);
|
|
||||||
if (pending_qty > 0) {
|
|
||||||
po_items.push({
|
|
||||||
name: d.name,
|
|
||||||
item_name: d.item_name,
|
|
||||||
item_code: d.item_code,
|
|
||||||
pending_qty: pending_qty,
|
|
||||||
uom: d.uom,
|
|
||||||
supplier: d.supplier,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog.fields_dict["items_for_po"].df.data = po_items;
|
|
||||||
dialog.get_field("items_for_po").refresh();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_po_items_data(dialog);
|
set_po_items_data(dialog);
|
||||||
dialog.get_field("items_for_po").grid.only_sortable();
|
|
||||||
dialog.get_field("items_for_po").refresh();
|
dialog.get_field("items_for_po").refresh();
|
||||||
dialog.wrapper.find(".grid-heading-row .grid-row-check").click();
|
dialog.wrapper.find(".grid-heading-row .grid-row-check").click();
|
||||||
dialog.show();
|
dialog.show();
|
||||||
|
|||||||
@@ -1546,7 +1546,7 @@ def get_events(start, end, filters=None):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_purchase_order_for_default_supplier(source_name, selected_items=None, target_doc=None):
|
def make_purchase_order(source_name, selected_items=None, target_doc=None):
|
||||||
"""Creates Purchase Order for each Supplier. Returns a list of doc objects."""
|
"""Creates Purchase Order for each Supplier. Returns a list of doc objects."""
|
||||||
|
|
||||||
from erpnext.setup.utils import get_exchange_rate
|
from erpnext.setup.utils import get_exchange_rate
|
||||||
@@ -1612,17 +1612,27 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t
|
|||||||
target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty)
|
target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty)
|
||||||
target.project = source_parent.project
|
target.project = source_parent.project
|
||||||
|
|
||||||
def update_item_for_packed_item(source, target, source_parent):
|
def update_item_for_packed_item(source, target, _):
|
||||||
target.qty = flt(source.qty) - flt(source.ordered_qty)
|
target.qty = flt(source.qty) - flt(source.ordered_qty)
|
||||||
|
|
||||||
suppliers = [item.get("supplier") for item in selected_items if item.get("supplier")]
|
def filter_items(item, supplier):
|
||||||
suppliers = list(dict.fromkeys(suppliers)) # remove duplicates while preserving order
|
if (
|
||||||
|
item.ordered_qty < item.stock_qty
|
||||||
|
and not is_product_bundle(item.item_code)
|
||||||
|
and items_to_map.get(item.item_code) == supplier
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
|
||||||
items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")]
|
return False
|
||||||
items_to_map = list(set(items_to_map))
|
|
||||||
|
items_to_map = {
|
||||||
|
item.get("item_code"): item.get("supplier") for item in selected_items if item.get("item_code")
|
||||||
|
}
|
||||||
|
item_codes = list(set(items_to_map.keys()))
|
||||||
|
suppliers = list(set(items_to_map.values()))
|
||||||
|
|
||||||
if not suppliers:
|
if not suppliers:
|
||||||
frappe.throw(_("Please set a Supplier against the Items to be considered in the Purchase Order."))
|
suppliers = [None]
|
||||||
|
|
||||||
purchase_orders = []
|
purchase_orders = []
|
||||||
for supplier in suppliers:
|
for supplier in suppliers:
|
||||||
@@ -1665,10 +1675,7 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t
|
|||||||
"margin_rate_or_amount",
|
"margin_rate_or_amount",
|
||||||
],
|
],
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
"condition": lambda doc: doc.ordered_qty < doc.stock_qty
|
"condition": lambda doc, s=supplier: filter_items(doc, s),
|
||||||
and doc.supplier == supplier
|
|
||||||
and doc.item_code in items_to_map
|
|
||||||
and not is_product_bundle(doc.item_code),
|
|
||||||
},
|
},
|
||||||
"Packed Item": {
|
"Packed Item": {
|
||||||
"doctype": "Purchase Order Item",
|
"doctype": "Purchase Order Item",
|
||||||
@@ -1689,7 +1696,7 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t
|
|||||||
"pricing_rules",
|
"pricing_rules",
|
||||||
],
|
],
|
||||||
"postprocess": update_item_for_packed_item,
|
"postprocess": update_item_for_packed_item,
|
||||||
"condition": lambda doc: doc.parent_item in items_to_map
|
"condition": lambda doc: doc.parent_item in item_codes
|
||||||
and flt(doc.ordered_qty) < flt(doc.qty),
|
and flt(doc.ordered_qty) < flt(doc.qty),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -1698,150 +1705,13 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t
|
|||||||
)
|
)
|
||||||
|
|
||||||
set_delivery_date(doc.items, source_name)
|
set_delivery_date(doc.items, source_name)
|
||||||
doc.insert()
|
if doc.supplier:
|
||||||
frappe.db.commit()
|
doc.insert()
|
||||||
purchase_orders.append(doc)
|
purchase_orders.append(doc)
|
||||||
|
|
||||||
return purchase_orders
|
return purchase_orders
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
|
||||||
def make_purchase_order(source_name, selected_items=None, target_doc=None):
|
|
||||||
if not selected_items:
|
|
||||||
return
|
|
||||||
|
|
||||||
if isinstance(selected_items, str):
|
|
||||||
selected_items = json.loads(selected_items)
|
|
||||||
|
|
||||||
items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")]
|
|
||||||
items_to_map = list(set(items_to_map))
|
|
||||||
|
|
||||||
def is_drop_ship_order(target):
|
|
||||||
drop_ship = True
|
|
||||||
for item in target.items:
|
|
||||||
if not item.delivered_by_supplier:
|
|
||||||
drop_ship = False
|
|
||||||
break
|
|
||||||
|
|
||||||
return drop_ship
|
|
||||||
|
|
||||||
def set_missing_values(source, target):
|
|
||||||
target.supplier = ""
|
|
||||||
target.apply_discount_on = ""
|
|
||||||
target.additional_discount_percentage = 0.0
|
|
||||||
target.discount_amount = 0.0
|
|
||||||
target.inter_company_order_reference = ""
|
|
||||||
target.shipping_rule = ""
|
|
||||||
target.tc_name = ""
|
|
||||||
target.terms = ""
|
|
||||||
target.payment_terms_template = ""
|
|
||||||
target.payment_schedule = []
|
|
||||||
|
|
||||||
if is_drop_ship_order(target):
|
|
||||||
if source.shipping_address_name:
|
|
||||||
target.shipping_address = source.shipping_address_name
|
|
||||||
target.shipping_address_display = source.shipping_address
|
|
||||||
else:
|
|
||||||
target.shipping_address = source.customer_address
|
|
||||||
target.shipping_address_display = source.address_display
|
|
||||||
|
|
||||||
target.customer_contact_person = source.contact_person
|
|
||||||
target.customer_contact_display = source.contact_display
|
|
||||||
target.customer_contact_mobile = source.contact_mobile
|
|
||||||
target.customer_contact_email = source.contact_email
|
|
||||||
else:
|
|
||||||
target.customer = target.customer_name = target.shipping_address = None
|
|
||||||
|
|
||||||
target.run_method("set_missing_values")
|
|
||||||
if not target.taxes:
|
|
||||||
target.append_taxes_from_item_tax_template()
|
|
||||||
target.run_method("calculate_taxes_and_totals")
|
|
||||||
|
|
||||||
def update_item(source, target, source_parent):
|
|
||||||
target.schedule_date = source.delivery_date
|
|
||||||
target.qty = flt(source.qty) - (flt(source.ordered_qty) / flt(source.conversion_factor))
|
|
||||||
target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty)
|
|
||||||
target.project = source_parent.project
|
|
||||||
|
|
||||||
def update_item_for_packed_item(source, target, source_parent):
|
|
||||||
target.qty = flt(source.qty) - flt(source.ordered_qty)
|
|
||||||
|
|
||||||
# po = frappe.get_list("Purchase Order", filters={"sales_order":source_name, "supplier":supplier, "docstatus": ("<", "2")})
|
|
||||||
doc = get_mapped_doc(
|
|
||||||
"Sales Order",
|
|
||||||
source_name,
|
|
||||||
{
|
|
||||||
"Sales Order": {
|
|
||||||
"doctype": "Purchase Order",
|
|
||||||
"field_map": {"dispatch_address_name": "dispatch_address"},
|
|
||||||
"field_no_map": [
|
|
||||||
"address_display",
|
|
||||||
"contact_display",
|
|
||||||
"contact_mobile",
|
|
||||||
"contact_email",
|
|
||||||
"contact_person",
|
|
||||||
"taxes_and_charges",
|
|
||||||
"shipping_address",
|
|
||||||
],
|
|
||||||
"validation": {"docstatus": ["=", 1]},
|
|
||||||
},
|
|
||||||
"Sales Order Item": {
|
|
||||||
"doctype": "Purchase Order Item",
|
|
||||||
"field_map": [
|
|
||||||
["name", "sales_order_item"],
|
|
||||||
["parent", "sales_order"],
|
|
||||||
["stock_uom", "stock_uom"],
|
|
||||||
["uom", "uom"],
|
|
||||||
["conversion_factor", "conversion_factor"],
|
|
||||||
["delivery_date", "schedule_date"],
|
|
||||||
],
|
|
||||||
"field_no_map": [
|
|
||||||
"rate",
|
|
||||||
"price_list_rate",
|
|
||||||
"item_tax_template",
|
|
||||||
"discount_percentage",
|
|
||||||
"discount_amount",
|
|
||||||
"supplier",
|
|
||||||
"pricing_rules",
|
|
||||||
],
|
|
||||||
"postprocess": update_item,
|
|
||||||
"condition": lambda doc: doc.ordered_qty < doc.stock_qty
|
|
||||||
and doc.item_code in items_to_map
|
|
||||||
and not is_product_bundle(doc.item_code),
|
|
||||||
},
|
|
||||||
"Packed Item": {
|
|
||||||
"doctype": "Purchase Order Item",
|
|
||||||
"field_map": [
|
|
||||||
["name", "sales_order_packed_item"],
|
|
||||||
["parent", "sales_order"],
|
|
||||||
["uom", "uom"],
|
|
||||||
["conversion_factor", "conversion_factor"],
|
|
||||||
["parent_item", "product_bundle"],
|
|
||||||
["rate", "rate"],
|
|
||||||
],
|
|
||||||
"field_no_map": [
|
|
||||||
"price_list_rate",
|
|
||||||
"item_tax_template",
|
|
||||||
"discount_percentage",
|
|
||||||
"discount_amount",
|
|
||||||
"supplier",
|
|
||||||
"pricing_rules",
|
|
||||||
],
|
|
||||||
"postprocess": update_item_for_packed_item,
|
|
||||||
"condition": lambda doc: doc.parent_item in items_to_map
|
|
||||||
and flt(doc.ordered_qty) < flt(doc.qty),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
target_doc,
|
|
||||||
set_missing_values,
|
|
||||||
)
|
|
||||||
|
|
||||||
set_delivery_date(doc.items, source_name)
|
|
||||||
doc.set_onload("load_after_mapping", False)
|
|
||||||
|
|
||||||
return doc
|
|
||||||
|
|
||||||
|
|
||||||
def set_delivery_date(items, sales_order):
|
def set_delivery_date(items, sales_order):
|
||||||
delivery_dates = frappe.get_all(
|
delivery_dates = frappe.get_all(
|
||||||
"Sales Order Item", filters={"parent": sales_order}, fields=["delivery_date", "item_code"]
|
"Sales Order Item", filters={"parent": sales_order}, fields=["delivery_date", "item_code"]
|
||||||
|
|||||||
@@ -1038,7 +1038,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
def test_drop_shipping(self):
|
def test_drop_shipping(self):
|
||||||
from erpnext.buying.doctype.purchase_order.purchase_order import update_status
|
from erpnext.buying.doctype.purchase_order.purchase_order import update_status
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import (
|
from erpnext.selling.doctype.sales_order.sales_order import (
|
||||||
make_purchase_order_for_default_supplier,
|
make_purchase_order,
|
||||||
)
|
)
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
|
from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
|
||||||
|
|
||||||
@@ -1071,7 +1071,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
po = make_purchase_order_for_default_supplier(so.name, selected_items=[so_items[0]])[0]
|
po = make_purchase_order(so.name, selected_items=[so_items[0]])[0]
|
||||||
po.submit()
|
po.submit()
|
||||||
|
|
||||||
dn = create_dn_against_so(so.name, delivered_qty=2)
|
dn = create_dn_against_so(so.name, delivered_qty=2)
|
||||||
@@ -1129,7 +1129,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
|
|
||||||
def test_drop_shipping_partial_order(self):
|
def test_drop_shipping_partial_order(self):
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import (
|
from erpnext.selling.doctype.sales_order.sales_order import (
|
||||||
make_purchase_order_for_default_supplier,
|
make_purchase_order,
|
||||||
)
|
)
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
|
from erpnext.selling.doctype.sales_order.sales_order import update_status as so_update_status
|
||||||
|
|
||||||
@@ -1165,7 +1165,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
# create po for only one item
|
# create po for only one item
|
||||||
po1 = make_purchase_order_for_default_supplier(so.name, selected_items=[so_items[0]])[0]
|
po1 = make_purchase_order(so.name, selected_items=[so_items[0]])[0]
|
||||||
po1.submit()
|
po1.submit()
|
||||||
|
|
||||||
self.assertEqual(so.customer, po1.customer)
|
self.assertEqual(so.customer, po1.customer)
|
||||||
@@ -1175,7 +1175,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
self.assertEqual(len(po1.items), 1)
|
self.assertEqual(len(po1.items), 1)
|
||||||
|
|
||||||
# create po for remaining item
|
# create po for remaining item
|
||||||
po2 = make_purchase_order_for_default_supplier(so.name, selected_items=[so_items[1]])[0]
|
po2 = make_purchase_order(so.name, selected_items=[so_items[1]])[0]
|
||||||
po2.submit()
|
po2.submit()
|
||||||
|
|
||||||
# teardown
|
# teardown
|
||||||
@@ -1189,7 +1189,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
def test_drop_shipping_full_for_default_suppliers(self):
|
def test_drop_shipping_full_for_default_suppliers(self):
|
||||||
"""Test if multiple POs are generated in one go against different default suppliers."""
|
"""Test if multiple POs are generated in one go against different default suppliers."""
|
||||||
from erpnext.selling.doctype.sales_order.sales_order import (
|
from erpnext.selling.doctype.sales_order.sales_order import (
|
||||||
make_purchase_order_for_default_supplier,
|
make_purchase_order,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not frappe.db.exists("Item", "_Test Item for Drop Shipping 1"):
|
if not frappe.db.exists("Item", "_Test Item for Drop Shipping 1"):
|
||||||
@@ -1221,7 +1221,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
so = make_sales_order(item_list=so_items, do_not_submit=True)
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
purchase_orders = make_purchase_order_for_default_supplier(so.name, selected_items=so_items)
|
purchase_orders = make_purchase_order(so.name, selected_items=so_items)
|
||||||
|
|
||||||
self.assertEqual(len(purchase_orders), 2)
|
self.assertEqual(len(purchase_orders), 2)
|
||||||
self.assertEqual(purchase_orders[0].supplier, "_Test Supplier")
|
self.assertEqual(purchase_orders[0].supplier, "_Test Supplier")
|
||||||
@@ -1253,7 +1253,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
|
|
||||||
so = make_sales_order(item_list=so_items)
|
so = make_sales_order(item_list=so_items)
|
||||||
|
|
||||||
purchase_order = make_purchase_order(so.name, selected_items=so_items)
|
purchase_order = make_purchase_order(so.name, selected_items=so_items)[0]
|
||||||
|
|
||||||
self.assertEqual(purchase_order.items[0].item_code, "_Test Bundle Item 1")
|
self.assertEqual(purchase_order.items[0].item_code, "_Test Bundle Item 1")
|
||||||
self.assertEqual(purchase_order.items[1].item_code, "_Test Bundle Item 2")
|
self.assertEqual(purchase_order.items[1].item_code, "_Test Bundle Item 2")
|
||||||
@@ -1283,7 +1283,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
|
|
||||||
so = make_sales_order(item_list=so_items)
|
so = make_sales_order(item_list=so_items)
|
||||||
|
|
||||||
purchase_order = make_purchase_order(so.name, selected_items=so_items)
|
purchase_order = make_purchase_order(so.name, selected_items=so_items)[0]
|
||||||
purchase_order.supplier = "_Test Supplier"
|
purchase_order.supplier = "_Test Supplier"
|
||||||
purchase_order.set_warehouse = "_Test Warehouse - _TC"
|
purchase_order.set_warehouse = "_Test Warehouse - _TC"
|
||||||
purchase_order.save()
|
purchase_order.save()
|
||||||
@@ -2559,7 +2559,7 @@ class TestSalesOrder(AccountsTestMixin, IntegrationTestCase):
|
|||||||
)
|
)
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
po = make_purchase_order(so.name, selected_items=so.items)
|
po = make_purchase_order(so.name, selected_items=so.items)[0]
|
||||||
po.supplier = "_Test Supplier"
|
po.supplier = "_Test Supplier"
|
||||||
po.items[0].rate = 100
|
po.items[0].rate = 100
|
||||||
po.submit()
|
po.submit()
|
||||||
|
|||||||
Reference in New Issue
Block a user