Merge branch 'develop' of https://github.com/frappe/erpnext into move_taxjar_integration_new
This commit is contained in:
commit
0e3438db10
@ -253,9 +253,6 @@ erpnext.accounts.JournalEntry = class JournalEntry extends frappe.ui.form.Contro
|
|||||||
var party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to";
|
var party_account_field = jvd.reference_type==="Sales Invoice" ? "debit_to": "credit_to";
|
||||||
out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]);
|
out.filters.push([jvd.reference_type, party_account_field, "=", jvd.account]);
|
||||||
|
|
||||||
if (in_list(['Debit Note', 'Credit Note'], doc.voucher_type)) {
|
|
||||||
out.filters.push([jvd.reference_type, "is_return", "=", 1]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(in_list(["Sales Order", "Purchase Order"], jvd.reference_type)) {
|
if(in_list(["Sales Order", "Purchase Order"], jvd.reference_type)) {
|
||||||
|
|||||||
@ -81,7 +81,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(doc.docstatus == 1 && doc.outstanding_amount != 0
|
if(doc.docstatus == 1 && doc.outstanding_amount != 0
|
||||||
&& !(doc.is_return && doc.return_against)) {
|
&& !(doc.is_return && doc.return_against) && !doc.on_hold) {
|
||||||
this.frm.add_custom_button(__('Payment'), this.make_payment_entry, __('Create'));
|
this.frm.add_custom_button(__('Payment'), this.make_payment_entry, __('Create'));
|
||||||
cur_frm.page.set_inner_btn_group_as_primary(__('Create'));
|
cur_frm.page.set_inner_btn_group_as_primary(__('Create'));
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc.outstanding_amount > 0 && !cint(doc.is_return)) {
|
if (doc.outstanding_amount > 0 && !cint(doc.is_return) && !doc.on_hold) {
|
||||||
cur_frm.add_custom_button(__('Payment Request'), function() {
|
cur_frm.add_custom_button(__('Payment Request'), function() {
|
||||||
me.make_payment_request()
|
me.make_payment_request()
|
||||||
}, __('Create'));
|
}, __('Create'));
|
||||||
|
|||||||
@ -25,6 +25,10 @@
|
|||||||
"apply_tds",
|
"apply_tds",
|
||||||
"tax_withholding_category",
|
"tax_withholding_category",
|
||||||
"amended_from",
|
"amended_from",
|
||||||
|
"supplier_invoice_details",
|
||||||
|
"bill_no",
|
||||||
|
"column_break_15",
|
||||||
|
"bill_date",
|
||||||
"accounting_dimensions_section",
|
"accounting_dimensions_section",
|
||||||
"cost_center",
|
"cost_center",
|
||||||
"dimension_col_break",
|
"dimension_col_break",
|
||||||
@ -151,10 +155,6 @@
|
|||||||
"status",
|
"status",
|
||||||
"column_break_177",
|
"column_break_177",
|
||||||
"per_received",
|
"per_received",
|
||||||
"supplier_invoice_details",
|
|
||||||
"bill_no",
|
|
||||||
"column_break_15",
|
|
||||||
"bill_date",
|
|
||||||
"accounting_details_section",
|
"accounting_details_section",
|
||||||
"credit_to",
|
"credit_to",
|
||||||
"party_account_currency",
|
"party_account_currency",
|
||||||
@ -1540,7 +1540,7 @@
|
|||||||
"idx": 204,
|
"idx": 204,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-04 01:02:44.544878",
|
"modified": "2022-11-22 12:44:29.935567",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Purchase Invoice",
|
"name": "Purchase Invoice",
|
||||||
|
|||||||
@ -226,6 +226,42 @@ class TestTaxWithholdingCategory(unittest.TestCase):
|
|||||||
for d in reversed(invoices):
|
for d in reversed(invoices):
|
||||||
d.cancel()
|
d.cancel()
|
||||||
|
|
||||||
|
orders = []
|
||||||
|
|
||||||
|
po = create_purchase_order(supplier="Test TDS Supplier4", rate=20000, do_not_save=True)
|
||||||
|
po.extend(
|
||||||
|
"items",
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"doctype": "Purchase Order Item",
|
||||||
|
"item_code": frappe.db.get_value("Item", {"item_name": "TDS Item"}, "name"),
|
||||||
|
"qty": 1,
|
||||||
|
"rate": 20000,
|
||||||
|
"cost_center": "Main - _TC",
|
||||||
|
"expense_account": "Stock Received But Not Billed - _TC",
|
||||||
|
"apply_tds": 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"doctype": "Purchase Order Item",
|
||||||
|
"item_code": frappe.db.get_value("Item", {"item_name": "TDS Item"}, "name"),
|
||||||
|
"qty": 1,
|
||||||
|
"rate": 35000,
|
||||||
|
"cost_center": "Main - _TC",
|
||||||
|
"expense_account": "Stock Received But Not Billed - _TC",
|
||||||
|
"apply_tds": 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
po.save()
|
||||||
|
po.submit()
|
||||||
|
orders.append(po)
|
||||||
|
|
||||||
|
self.assertEqual(po.taxes[0].tax_amount, 5500)
|
||||||
|
|
||||||
|
# cancel orders to avoid clashing
|
||||||
|
for d in reversed(orders):
|
||||||
|
d.cancel()
|
||||||
|
|
||||||
def test_multi_category_single_supplier(self):
|
def test_multi_category_single_supplier(self):
|
||||||
frappe.db.set_value(
|
frappe.db.set_value(
|
||||||
"Supplier", "Test TDS Supplier5", "tax_withholding_category", "Test Service Category"
|
"Supplier", "Test TDS Supplier5", "tax_withholding_category", "Test Service Category"
|
||||||
@ -348,6 +384,39 @@ def create_purchase_invoice(**args):
|
|||||||
return pi
|
return pi
|
||||||
|
|
||||||
|
|
||||||
|
def create_purchase_order(**args):
|
||||||
|
# return purchase order doc object
|
||||||
|
item = frappe.db.get_value("Item", {"item_name": "TDS Item"}, "name")
|
||||||
|
|
||||||
|
args = frappe._dict(args)
|
||||||
|
po = frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "Purchase Order",
|
||||||
|
"transaction_date": today(),
|
||||||
|
"schedule_date": today(),
|
||||||
|
"apply_tds": 0 if args.do_not_apply_tds else 1,
|
||||||
|
"supplier": args.supplier,
|
||||||
|
"company": "_Test Company",
|
||||||
|
"taxes_and_charges": "",
|
||||||
|
"currency": "INR",
|
||||||
|
"taxes": [],
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"doctype": "Purchase Order Item",
|
||||||
|
"item_code": item,
|
||||||
|
"qty": args.qty or 1,
|
||||||
|
"rate": args.rate or 10000,
|
||||||
|
"cost_center": "Main - _TC",
|
||||||
|
"expense_account": "Stock Received But Not Billed - _TC",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
po.save()
|
||||||
|
return po
|
||||||
|
|
||||||
|
|
||||||
def create_sales_invoice(**args):
|
def create_sales_invoice(**args):
|
||||||
# return sales invoice doc object
|
# return sales invoice doc object
|
||||||
item = frappe.db.get_value("Item", {"item_name": "TCS Item"}, "name")
|
item = frappe.db.get_value("Item", {"item_name": "TCS Item"}, "name")
|
||||||
|
|||||||
@ -394,20 +394,22 @@ def make_round_off_gle(gl_map, debit_credit_diff, precision):
|
|||||||
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
|
round_off_account, round_off_cost_center = get_round_off_account_and_cost_center(
|
||||||
gl_map[0].company, gl_map[0].voucher_type, gl_map[0].voucher_no
|
gl_map[0].company, gl_map[0].voucher_type, gl_map[0].voucher_no
|
||||||
)
|
)
|
||||||
round_off_account_exists = False
|
|
||||||
round_off_gle = frappe._dict()
|
round_off_gle = frappe._dict()
|
||||||
for d in gl_map:
|
round_off_account_exists = False
|
||||||
if d.account == round_off_account:
|
|
||||||
round_off_gle = d
|
|
||||||
if d.debit:
|
|
||||||
debit_credit_diff -= flt(d.debit)
|
|
||||||
else:
|
|
||||||
debit_credit_diff += flt(d.credit)
|
|
||||||
round_off_account_exists = True
|
|
||||||
|
|
||||||
if round_off_account_exists and abs(debit_credit_diff) < (1.0 / (10**precision)):
|
if gl_map[0].voucher_type != "Period Closing Voucher":
|
||||||
gl_map.remove(round_off_gle)
|
for d in gl_map:
|
||||||
return
|
if d.account == round_off_account:
|
||||||
|
round_off_gle = d
|
||||||
|
if d.debit:
|
||||||
|
debit_credit_diff -= flt(d.debit) - flt(d.credit)
|
||||||
|
else:
|
||||||
|
debit_credit_diff += flt(d.credit)
|
||||||
|
round_off_account_exists = True
|
||||||
|
|
||||||
|
if round_off_account_exists and abs(debit_credit_diff) < (1.0 / (10**precision)):
|
||||||
|
gl_map.remove(round_off_gle)
|
||||||
|
return
|
||||||
|
|
||||||
if not round_off_gle:
|
if not round_off_gle:
|
||||||
for k in ["voucher_type", "voucher_no", "company", "posting_date", "remarks"]:
|
for k in ["voucher_type", "voucher_no", "company", "posting_date", "remarks"]:
|
||||||
@ -430,7 +432,6 @@ def make_round_off_gle(gl_map, debit_credit_diff, precision):
|
|||||||
)
|
)
|
||||||
|
|
||||||
update_accounting_dimensions(round_off_gle)
|
update_accounting_dimensions(round_off_gle)
|
||||||
|
|
||||||
if not round_off_account_exists:
|
if not round_off_account_exists:
|
||||||
gl_map.append(round_off_gle)
|
gl_map.append(round_off_gle)
|
||||||
|
|
||||||
|
|||||||
@ -54,6 +54,8 @@
|
|||||||
"column_break_26",
|
"column_break_26",
|
||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
|
"tax_withholding_net_total",
|
||||||
|
"base_tax_withholding_net_total",
|
||||||
"section_break_48",
|
"section_break_48",
|
||||||
"pricing_rules",
|
"pricing_rules",
|
||||||
"raw_material_details",
|
"raw_material_details",
|
||||||
@ -1220,6 +1222,26 @@
|
|||||||
"label": "Additional Info",
|
"label": "Additional Info",
|
||||||
"oldfieldtype": "Section Break"
|
"oldfieldtype": "Section Break"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "tax_withholding_net_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Tax Withholding Net Total",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "currency",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "base_tax_withholding_net_total",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"hidden": 1,
|
||||||
|
"label": "Base Tax Withholding Net Total",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "currency",
|
||||||
|
"print_hide": 1,
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break_99",
|
"fieldname": "column_break_99",
|
||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
|
|||||||
@ -736,27 +736,29 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
def test_advance_paid_upon_payment_entry_cancellation(self):
|
def test_advance_paid_upon_payment_entry_cancellation(self):
|
||||||
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
|
from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry
|
||||||
|
|
||||||
po_doc = create_purchase_order()
|
po_doc = create_purchase_order(supplier="_Test Supplier USD", currency="USD", do_not_submit=1)
|
||||||
|
po_doc.conversion_rate = 80
|
||||||
|
po_doc.submit()
|
||||||
|
|
||||||
pe = get_payment_entry("Purchase Order", po_doc.name, bank_account="_Test Bank - _TC")
|
pe = get_payment_entry("Purchase Order", po_doc.name)
|
||||||
pe.reference_no = "1"
|
pe.mode_of_payment = "Cash"
|
||||||
pe.reference_date = nowdate()
|
pe.paid_from = "Cash - _TC"
|
||||||
pe.paid_from_account_currency = po_doc.currency
|
pe.source_exchange_rate = 80
|
||||||
pe.paid_to_account_currency = po_doc.currency
|
|
||||||
pe.source_exchange_rate = 1
|
|
||||||
pe.target_exchange_rate = 1
|
pe.target_exchange_rate = 1
|
||||||
pe.paid_amount = po_doc.grand_total
|
pe.paid_amount = po_doc.grand_total
|
||||||
pe.save(ignore_permissions=True)
|
pe.save(ignore_permissions=True)
|
||||||
pe.submit()
|
pe.submit()
|
||||||
|
|
||||||
po_doc.reload()
|
po_doc.reload()
|
||||||
self.assertEqual(po_doc.advance_paid, po_doc.base_grand_total)
|
self.assertEqual(po_doc.advance_paid, po_doc.grand_total)
|
||||||
|
self.assertEqual(po_doc.party_account_currency, "USD")
|
||||||
|
|
||||||
pe_doc = frappe.get_doc("Payment Entry", pe.name)
|
pe_doc = frappe.get_doc("Payment Entry", pe.name)
|
||||||
pe_doc.cancel()
|
pe_doc.cancel()
|
||||||
|
|
||||||
po_doc.reload()
|
po_doc.reload()
|
||||||
self.assertEqual(po_doc.advance_paid, 0)
|
self.assertEqual(po_doc.advance_paid, 0)
|
||||||
|
self.assertEqual(po_doc.party_account_currency, "USD")
|
||||||
|
|
||||||
def test_schedule_date(self):
|
def test_schedule_date(self):
|
||||||
po = create_purchase_order(do_not_submit=True)
|
po = create_purchase_order(do_not_submit=True)
|
||||||
|
|||||||
@ -44,6 +44,7 @@
|
|||||||
"discount_amount",
|
"discount_amount",
|
||||||
"base_rate_with_margin",
|
"base_rate_with_margin",
|
||||||
"sec_break2",
|
"sec_break2",
|
||||||
|
"apply_tds",
|
||||||
"rate",
|
"rate",
|
||||||
"amount",
|
"amount",
|
||||||
"item_tax_template",
|
"item_tax_template",
|
||||||
@ -889,6 +890,12 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "column_break_54",
|
"fieldname": "column_break_54",
|
||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "1",
|
||||||
|
"fieldname": "apply_tds",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Apply TDS"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
|
|||||||
@ -1352,12 +1352,12 @@ class AccountsController(TransactionBase):
|
|||||||
party = self.customer if self.doctype == "Sales Order" else self.supplier
|
party = self.customer if self.doctype == "Sales Order" else self.supplier
|
||||||
advance = (
|
advance = (
|
||||||
frappe.qb.from_(ple)
|
frappe.qb.from_(ple)
|
||||||
.select(ple.account_currency, Abs(Sum(ple.amount)).as_("amount"))
|
.select(ple.account_currency, Abs(Sum(ple.amount_in_account_currency)).as_("amount"))
|
||||||
.where(
|
.where(
|
||||||
(ple.against_voucher_type == self.doctype)
|
(ple.against_voucher_type == self.doctype)
|
||||||
& (ple.against_voucher_no == self.name)
|
& (ple.against_voucher_no == self.name)
|
||||||
& (ple.party == party)
|
& (ple.party == party)
|
||||||
& (ple.delinked == 0)
|
& (ple.docstatus == 1)
|
||||||
& (ple.company == self.company)
|
& (ple.company == self.company)
|
||||||
)
|
)
|
||||||
.run(as_dict=True)
|
.run(as_dict=True)
|
||||||
|
|||||||
@ -316,4 +316,4 @@ erpnext.patches.v14_0.fix_subcontracting_receipt_gl_entries
|
|||||||
erpnext.patches.v14_0.migrate_remarks_from_gl_to_payment_ledger
|
erpnext.patches.v14_0.migrate_remarks_from_gl_to_payment_ledger
|
||||||
erpnext.patches.v13_0.update_schedule_type_in_loans
|
erpnext.patches.v13_0.update_schedule_type_in_loans
|
||||||
erpnext.patches.v14_0.create_accounting_dimensions_for_asset_capitalization
|
erpnext.patches.v14_0.create_accounting_dimensions_for_asset_capitalization
|
||||||
erpnext.patches.v14_0.update_tds_fields
|
erpnext.patches.v14_0.update_partial_tds_fields
|
||||||
|
|||||||
@ -25,5 +25,21 @@ def execute():
|
|||||||
).where(
|
).where(
|
||||||
purchase_invoice.docstatus == 1
|
purchase_invoice.docstatus == 1
|
||||||
).run()
|
).run()
|
||||||
|
|
||||||
|
purchase_order = frappe.qb.DocType("Purchase Order")
|
||||||
|
|
||||||
|
frappe.qb.update(purchase_order).set(
|
||||||
|
purchase_order.tax_withholding_net_total, purchase_order.net_total
|
||||||
|
).set(
|
||||||
|
purchase_order.base_tax_withholding_net_total, purchase_order.base_net_total
|
||||||
|
).where(
|
||||||
|
purchase_order.company == company.name
|
||||||
|
).where(
|
||||||
|
purchase_order.apply_tds == 1
|
||||||
|
).where(
|
||||||
|
purchase_order.transaction_date >= fiscal_year_details.year_start_date
|
||||||
|
).where(
|
||||||
|
purchase_order.docstatus == 1
|
||||||
|
).run()
|
||||||
except FiscalYearError:
|
except FiscalYearError:
|
||||||
pass
|
pass
|
||||||
@ -71,6 +71,8 @@ frappe.ui.form.on('Inventory Dimension', {
|
|||||||
if (r.message && r.message.length) {
|
if (r.message && r.message.length) {
|
||||||
frm.set_df_property("fetch_from_parent", "options",
|
frm.set_df_property("fetch_from_parent", "options",
|
||||||
[""].concat(r.message));
|
[""].concat(r.message));
|
||||||
|
} else {
|
||||||
|
frm.set_df_property("fetch_from_parent", "hidden", 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -11,20 +11,20 @@
|
|||||||
"reference_document",
|
"reference_document",
|
||||||
"column_break_4",
|
"column_break_4",
|
||||||
"disabled",
|
"disabled",
|
||||||
"section_break_7",
|
|
||||||
"field_mapping_section",
|
"field_mapping_section",
|
||||||
"source_fieldname",
|
"source_fieldname",
|
||||||
"column_break_9",
|
"column_break_9",
|
||||||
"target_fieldname",
|
"target_fieldname",
|
||||||
"applicable_for_documents_tab",
|
"applicable_for_documents_tab",
|
||||||
"apply_to_all_doctypes",
|
"apply_to_all_doctypes",
|
||||||
|
"column_break_13",
|
||||||
"document_type",
|
"document_type",
|
||||||
"istable",
|
|
||||||
"type_of_transaction",
|
"type_of_transaction",
|
||||||
"fetch_from_parent",
|
"fetch_from_parent",
|
||||||
"column_break_16",
|
"istable",
|
||||||
"condition",
|
|
||||||
"applicable_condition_example_section",
|
"applicable_condition_example_section",
|
||||||
|
"condition",
|
||||||
|
"conditional_rule_examples_section",
|
||||||
"html_19"
|
"html_19"
|
||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
@ -52,13 +52,13 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "applicable_for_documents_tab",
|
"fieldname": "applicable_for_documents_tab",
|
||||||
"fieldtype": "Tab Break",
|
"fieldtype": "Tab Break",
|
||||||
"label": "Applicable For Documents"
|
"label": "Applicable For"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
"fieldname": "document_type",
|
"fieldname": "document_type",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Applicable to Document",
|
"label": "Apply to Document",
|
||||||
"mandatory_depends_on": "eval:!doc.apply_to_all_doctypes",
|
"mandatory_depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
"options": "DocType"
|
"options": "DocType"
|
||||||
},
|
},
|
||||||
@ -72,6 +72,7 @@
|
|||||||
"fetch_from": "document_type.istable",
|
"fetch_from": "document_type.istable",
|
||||||
"fieldname": "istable",
|
"fieldname": "istable",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
|
"hidden": 1,
|
||||||
"label": " Is Child Table",
|
"label": " Is Child Table",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
@ -79,13 +80,13 @@
|
|||||||
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
"fieldname": "condition",
|
"fieldname": "condition",
|
||||||
"fieldtype": "Code",
|
"fieldtype": "Code",
|
||||||
"label": "Applicable Condition"
|
"label": "Conditional Rule"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "1",
|
||||||
"fieldname": "apply_to_all_doctypes",
|
"fieldname": "apply_to_all_doctypes",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Apply to All Inventory Document Types"
|
"label": "Apply to All Inventory Documents"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
@ -93,10 +94,6 @@
|
|||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Disabled"
|
"label": "Disabled"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"fieldname": "section_break_7",
|
|
||||||
"fieldtype": "Section Break"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"fieldname": "target_fieldname",
|
"fieldname": "target_fieldname",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
@ -115,13 +112,11 @@
|
|||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"fieldname": "field_mapping_section",
|
"fieldname": "field_mapping_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
|
"hidden": 1,
|
||||||
"label": "Field Mapping"
|
"label": "Field Mapping"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break_16",
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
"fieldtype": "Column Break"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "type_of_transaction",
|
"fieldname": "type_of_transaction",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"label": "Type of Transaction",
|
"label": "Type of Transaction",
|
||||||
@ -136,23 +131,33 @@
|
|||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
"fieldname": "applicable_condition_example_section",
|
"fieldname": "applicable_condition_example_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Column Break"
|
||||||
"label": "Applicable Condition Examples"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break_4",
|
"fieldname": "column_break_4",
|
||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Set fieldname or DocType name like Supplier, Customer etc.",
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
|
"description": "Set fieldname from which you want to fetch the data from the parent form.",
|
||||||
"fieldname": "fetch_from_parent",
|
"fieldname": "fetch_from_parent",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"label": "Fetch Value From Parent Form"
|
"label": "Fetch Value From"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fieldname": "column_break_13",
|
||||||
|
"fieldtype": "Section Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "eval:!doc.apply_to_all_doctypes",
|
||||||
|
"fieldname": "conditional_rule_examples_section",
|
||||||
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Conditional Rule Examples"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-09-02 13:29:04.098469",
|
"modified": "2022-11-15 15:50:16.767105",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Inventory Dimension",
|
"name": "Inventory Dimension",
|
||||||
|
|||||||
@ -33,10 +33,22 @@ class InventoryDimension(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
self.validate_reference_document()
|
||||||
|
|
||||||
|
def before_save(self):
|
||||||
self.do_not_update_document()
|
self.do_not_update_document()
|
||||||
self.reset_value()
|
self.reset_value()
|
||||||
self.validate_reference_document()
|
|
||||||
self.set_source_and_target_fieldname()
|
self.set_source_and_target_fieldname()
|
||||||
|
self.set_type_of_transaction()
|
||||||
|
self.set_fetch_value_from()
|
||||||
|
|
||||||
|
def set_type_of_transaction(self):
|
||||||
|
if self.apply_to_all_doctypes:
|
||||||
|
self.type_of_transaction = "Both"
|
||||||
|
|
||||||
|
def set_fetch_value_from(self):
|
||||||
|
if self.apply_to_all_doctypes:
|
||||||
|
self.fetch_from_parent = self.reference_document
|
||||||
|
|
||||||
def do_not_update_document(self):
|
def do_not_update_document(self):
|
||||||
if self.is_new() or not self.has_stock_ledger():
|
if self.is_new() or not self.has_stock_ledger():
|
||||||
|
|||||||
@ -140,14 +140,13 @@ class TestInventoryDimension(FrappeTestCase):
|
|||||||
self.assertRaises(DoNotChangeError, inv_dim1.save)
|
self.assertRaises(DoNotChangeError, inv_dim1.save)
|
||||||
|
|
||||||
def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self):
|
def test_inventory_dimension_for_purchase_receipt_and_delivery_note(self):
|
||||||
create_inventory_dimension(
|
inv_dimension = create_inventory_dimension(
|
||||||
reference_document="Rack",
|
reference_document="Rack", dimension_name="Rack", apply_to_all_doctypes=1
|
||||||
type_of_transaction="Both",
|
|
||||||
dimension_name="Rack",
|
|
||||||
apply_to_all_doctypes=1,
|
|
||||||
fetch_from_parent="Rack",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.assertEqual(inv_dimension.type_of_transaction, "Both")
|
||||||
|
self.assertEqual(inv_dimension.fetch_from_parent, "Rack")
|
||||||
|
|
||||||
create_custom_field(
|
create_custom_field(
|
||||||
"Purchase Receipt", dict(fieldname="rack", label="Rack", fieldtype="Link", options="Rack")
|
"Purchase Receipt", dict(fieldname="rack", label="Rack", fieldtype="Link", options="Rack")
|
||||||
)
|
)
|
||||||
|
|||||||
@ -58,6 +58,12 @@ def execute(filters=None):
|
|||||||
if sle.serial_no:
|
if sle.serial_no:
|
||||||
update_available_serial_nos(available_serial_nos, sle)
|
update_available_serial_nos(available_serial_nos, sle)
|
||||||
|
|
||||||
|
if sle.actual_qty:
|
||||||
|
sle["in_out_rate"] = flt(sle.stock_value_difference / sle.actual_qty, precision)
|
||||||
|
|
||||||
|
elif sle.voucher_type == "Stock Reconciliation":
|
||||||
|
sle["in_out_rate"] = sle.valuation_rate
|
||||||
|
|
||||||
data.append(sle)
|
data.append(sle)
|
||||||
|
|
||||||
if include_uom:
|
if include_uom:
|
||||||
@ -185,10 +191,18 @@ def get_columns(filters):
|
|||||||
"convertible": "rate",
|
"convertible": "rate",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Valuation Rate"),
|
"label": _("Avg Rate (Balance Stock)"),
|
||||||
"fieldname": "valuation_rate",
|
"fieldname": "valuation_rate",
|
||||||
"fieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"width": 110,
|
"width": 180,
|
||||||
|
"options": "Company:company:default_currency",
|
||||||
|
"convertible": "rate",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Valuation Rate"),
|
||||||
|
"fieldname": "in_out_rate",
|
||||||
|
"fieldtype": "Currency",
|
||||||
|
"width": 140,
|
||||||
"options": "Company:company:default_currency",
|
"options": "Company:company:default_currency",
|
||||||
"convertible": "rate",
|
"convertible": "rate",
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user