Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: allow selection of stock entry from multiple subcontracting orders #2671

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion india_compliance/gst_india/client_scripts/stock_entry.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@ frappe.ui.form.on(DOCTYPE, {

frm.set_query("link_name", "doc_references", function (doc) {
return {
filters: get_filters_for_relevant_stock_entries(doc),
query: "india_compliance.gst_india.overrides.subcontracting_transaction.get_relevant_references",
params: {
supplier: doc.supplier,
supplied_items: get_supplied_items(doc),
received_items: [],
subcontracting_orders: get_subcontracting_orders(doc),
filters_for: "Stock Entry",
},
};
});
},
Expand Down
54 changes: 25 additions & 29 deletions india_compliance/gst_india/client_scripts/subcontracting_receipt.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,38 +31,32 @@ frappe.ui.form.on(DOCTYPE, {
const row = locals[cdt][cdn];
const subcontracting_orders = get_subcontracting_orders(doc);

// same as backend query in get_relevant_references
const query =
"india_compliance.gst_india.overrides.subcontracting_transaction.get_relevant_references";
const filters = {
supplier: doc.supplier,
supplied_items: [],
received_items: [],
subcontracting_orders: subcontracting_orders,
};

if (row.link_doctype == "Stock Entry") {
const supplied_items = get_supplied_items(doc);
filters["supplied_items"] = supplied_items;
filters["filters_for"] = "Stock Entry";

return {
filters: [
["docstatus", "=", 1],
["purpose", "=", "Send to Subcontractor"],
["subcontracting_order", "in", subcontracting_orders],
["supplier", "=", doc.supplier],
["Stock Entry Detail", "item_code", "in", supplied_items],
],
query,
filters,
};
} else if (row.link_doctype == "Subcontracting Receipt") {
const received_items = get_received_items(doc);
filters["received_items"] = received_items;
filters["filters_for"] = "Subcontracting Receipt";

return {
filters: [
["docstatus", "=", 1],
["is_return", "=", 1],
["supplier", "=", doc.supplier],
[
"Subcontracting Receipt Item",
"item_code",
"in",
received_items,
],
[
"Subcontracting Receipt Item",
"subcontracting_order",
"in",
subcontracting_orders,
],
],
query,
filters,
};
}
});
Expand Down Expand Up @@ -102,10 +96,12 @@ frappe.ui.form.on(DOCTYPE, {
frappe.call({
method: "india_compliance.gst_india.overrides.subcontracting_transaction.get_relevant_references",
args: {
supplier: frm.doc.supplier,
supplied_items: get_supplied_items(frm.doc),
received_items: get_received_items(frm.doc),
subcontracting_orders: get_subcontracting_orders(frm.doc),
filters: {
supplier: frm.doc.supplier,
supplied_items: get_supplied_items(frm.doc),
received_items: get_received_items(frm.doc),
subcontracting_orders: get_subcontracting_orders(frm.doc),
},
},
callback: function (r) {
if (!r.message) return;
Expand Down
38 changes: 23 additions & 15 deletions india_compliance/gst_india/overrides/subcontracting_transaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,27 +349,25 @@ def set_address_display(doc):

@frappe.whitelist()
def get_relevant_references(
supplier, supplied_items, received_items, subcontracting_orders
doctype=None, txt=None, searchfield=None, start=None, page_len=None, filters=None
):
if isinstance(supplied_items, str):
supplied_items = frappe.parse_json(supplied_items)
received_items = frappe.parse_json(received_items)
subcontracting_orders = frappe.parse_json(subcontracting_orders)
if isinstance(filters, str):
filters = frappe.parse_json(filters)

# same filters used for set_query in JS
filters = frappe._dict(filters)

receipt_returns = frappe.db.get_all(
"Subcontracting Receipt",
filters=[
["docstatus", "=", 1],
["is_return", "=", 1],
["supplier", "=", supplier],
["Subcontracting Receipt Item", "item_code", "in", received_items],
["supplier", "=", filters.supplier],
["Subcontracting Receipt Item", "item_code", "in", filters.received_items],
[
"Subcontracting Receipt Item",
"subcontracting_order",
"in",
subcontracting_orders,
filters.subcontracting_orders,
],
],
pluck="name",
Expand All @@ -381,17 +379,27 @@ def get_relevant_references(
filters=[
["docstatus", "=", 1],
["purpose", "=", "Send to Subcontractor"],
["subcontracting_order", "in", subcontracting_orders],
["supplier", "=", supplier],
["Stock Entry Detail", "item_code", "in", supplied_items],
["supplier", "=", filters.supplier],
["Stock Entry Detail", "item_code", "in", filters.supplied_items],
],
pluck="name",
or_filters=[
["subcontracting_order", "is", "not set"],
["subcontracting_order", "in", filters.subcontracting_orders],
],
fields=["name", "subcontracting_order"],
group_by="name",
)

data = {"Subcontracting Receipt": receipt_returns, "Stock Entry": stock_entries}
if filters.filters_for == "Subcontracting Receipt":
return [(name,) for name in receipt_returns]

return data
elif filters.filters_for == "Stock Entry":
return [(row.name,) for row in stock_entries]

return {
"Subcontracting Receipt": receipt_returns,
"Stock Entry": [row.name for row in stock_entries if row.subcontracting_order],
}


def remove_duplicates(doc):
Expand Down