mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-27 08:54:45 +00:00
Merge pull request #37788 from frappe/version-14-hotfix
chore: release v14
This commit is contained in:
@@ -17,6 +17,7 @@ from erpnext.accounts.report.bank_reconciliation_statement.bank_reconciliation_s
|
|||||||
get_entries,
|
get_entries,
|
||||||
)
|
)
|
||||||
from erpnext.accounts.utils import get_balance_on
|
from erpnext.accounts.utils import get_balance_on
|
||||||
|
from erpnext.setup.utils import get_exchange_rate
|
||||||
|
|
||||||
|
|
||||||
class BankReconciliationTool(Document):
|
class BankReconciliationTool(Document):
|
||||||
@@ -129,7 +130,7 @@ def create_journal_entry_bts(
|
|||||||
bank_transaction = frappe.db.get_values(
|
bank_transaction = frappe.db.get_values(
|
||||||
"Bank Transaction",
|
"Bank Transaction",
|
||||||
bank_transaction_name,
|
bank_transaction_name,
|
||||||
fieldname=["name", "deposit", "withdrawal", "bank_account"],
|
fieldname=["name", "deposit", "withdrawal", "bank_account", "currency"],
|
||||||
as_dict=True,
|
as_dict=True,
|
||||||
)[0]
|
)[0]
|
||||||
company_account = frappe.get_value("Bank Account", bank_transaction.bank_account, "account")
|
company_account = frappe.get_value("Bank Account", bank_transaction.bank_account, "account")
|
||||||
@@ -143,29 +144,94 @@ def create_journal_entry_bts(
|
|||||||
)
|
)
|
||||||
|
|
||||||
company = frappe.get_value("Account", company_account, "company")
|
company = frappe.get_value("Account", company_account, "company")
|
||||||
|
company_default_currency = frappe.get_cached_value("Company", company, "default_currency")
|
||||||
|
company_account_currency = frappe.get_cached_value("Account", company_account, "account_currency")
|
||||||
|
second_account_currency = frappe.get_cached_value("Account", second_account, "account_currency")
|
||||||
|
|
||||||
|
# determine if multi-currency Journal or not
|
||||||
|
is_multi_currency = (
|
||||||
|
True
|
||||||
|
if company_default_currency != company_account_currency
|
||||||
|
or company_default_currency != second_account_currency
|
||||||
|
or company_default_currency != bank_transaction.currency
|
||||||
|
else False
|
||||||
|
)
|
||||||
|
|
||||||
accounts = []
|
accounts = []
|
||||||
# Multi Currency?
|
second_account_dict = {
|
||||||
accounts.append(
|
"account": second_account,
|
||||||
{
|
"account_currency": second_account_currency,
|
||||||
"account": second_account,
|
"credit_in_account_currency": bank_transaction.deposit,
|
||||||
"credit_in_account_currency": bank_transaction.deposit,
|
"debit_in_account_currency": bank_transaction.withdrawal,
|
||||||
"debit_in_account_currency": bank_transaction.withdrawal,
|
"party_type": party_type,
|
||||||
"party_type": party_type,
|
"party": party,
|
||||||
"party": party,
|
"cost_center": get_default_cost_center(company),
|
||||||
"cost_center": get_default_cost_center(company),
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
accounts.append(
|
company_account_dict = {
|
||||||
{
|
"account": company_account,
|
||||||
"account": company_account,
|
"account_currency": company_account_currency,
|
||||||
"bank_account": bank_transaction.bank_account,
|
"bank_account": bank_transaction.bank_account,
|
||||||
"credit_in_account_currency": bank_transaction.withdrawal,
|
"credit_in_account_currency": bank_transaction.withdrawal,
|
||||||
"debit_in_account_currency": bank_transaction.deposit,
|
"debit_in_account_currency": bank_transaction.deposit,
|
||||||
"cost_center": get_default_cost_center(company),
|
"cost_center": get_default_cost_center(company),
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
# convert transaction amount to company currency
|
||||||
|
if is_multi_currency:
|
||||||
|
exc_rate = get_exchange_rate(bank_transaction.currency, company_default_currency, posting_date)
|
||||||
|
withdrawal_in_company_currency = flt(exc_rate * abs(bank_transaction.withdrawal))
|
||||||
|
deposit_in_company_currency = flt(exc_rate * abs(bank_transaction.deposit))
|
||||||
|
else:
|
||||||
|
withdrawal_in_company_currency = bank_transaction.withdrawal
|
||||||
|
deposit_in_company_currency = bank_transaction.deposit
|
||||||
|
|
||||||
|
# if second account is of foreign currency, convert and set debit and credit fields.
|
||||||
|
if second_account_currency != company_default_currency:
|
||||||
|
exc_rate = get_exchange_rate(second_account_currency, company_default_currency, posting_date)
|
||||||
|
second_account_dict.update(
|
||||||
|
{
|
||||||
|
"exchange_rate": exc_rate,
|
||||||
|
"credit": deposit_in_company_currency,
|
||||||
|
"debit": withdrawal_in_company_currency,
|
||||||
|
"credit_in_account_currency": flt(deposit_in_company_currency / exc_rate) or 0,
|
||||||
|
"debit_in_account_currency": flt(withdrawal_in_company_currency / exc_rate) or 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
second_account_dict.update(
|
||||||
|
{
|
||||||
|
"exchange_rate": 1,
|
||||||
|
"credit": deposit_in_company_currency,
|
||||||
|
"debit": withdrawal_in_company_currency,
|
||||||
|
"credit_in_account_currency": deposit_in_company_currency,
|
||||||
|
"debit_in_account_currency": withdrawal_in_company_currency,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
# if company account is of foreign currency, convert and set debit and credit fields.
|
||||||
|
if company_account_currency != company_default_currency:
|
||||||
|
exc_rate = get_exchange_rate(company_account_currency, company_default_currency, posting_date)
|
||||||
|
company_account_dict.update(
|
||||||
|
{
|
||||||
|
"exchange_rate": exc_rate,
|
||||||
|
"credit": withdrawal_in_company_currency,
|
||||||
|
"debit": deposit_in_company_currency,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
company_account_dict.update(
|
||||||
|
{
|
||||||
|
"exchange_rate": 1,
|
||||||
|
"credit": withdrawal_in_company_currency,
|
||||||
|
"debit": deposit_in_company_currency,
|
||||||
|
"credit_in_account_currency": withdrawal_in_company_currency,
|
||||||
|
"debit_in_account_currency": deposit_in_company_currency,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
accounts.append(second_account_dict)
|
||||||
|
accounts.append(company_account_dict)
|
||||||
|
|
||||||
journal_entry_dict = {
|
journal_entry_dict = {
|
||||||
"voucher_type": entry_type,
|
"voucher_type": entry_type,
|
||||||
@@ -175,6 +241,9 @@ def create_journal_entry_bts(
|
|||||||
"cheque_no": reference_number,
|
"cheque_no": reference_number,
|
||||||
"mode_of_payment": mode_of_payment,
|
"mode_of_payment": mode_of_payment,
|
||||||
}
|
}
|
||||||
|
if is_multi_currency:
|
||||||
|
journal_entry_dict.update({"multi_currency": True})
|
||||||
|
|
||||||
journal_entry = frappe.new_doc("Journal Entry")
|
journal_entry = frappe.new_doc("Journal Entry")
|
||||||
journal_entry.update(journal_entry_dict)
|
journal_entry.update(journal_entry_dict)
|
||||||
journal_entry.set("accounts", accounts)
|
journal_entry.set("accounts", accounts)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, msgprint, scrub
|
from frappe import _, msgprint, qb, scrub
|
||||||
from frappe.contacts.doctype.address.address import get_company_address, get_default_address
|
from frappe.contacts.doctype.address.address import get_company_address, get_default_address
|
||||||
from frappe.core.doctype.user_permission.user_permission import get_permitted_documents
|
from frappe.core.doctype.user_permission.user_permission import get_permitted_documents
|
||||||
from frappe.model.utils import get_fetch_values
|
from frappe.model.utils import get_fetch_values
|
||||||
@@ -459,11 +459,19 @@ def get_party_account_currency(party_type, party, company):
|
|||||||
|
|
||||||
def get_party_gle_currency(party_type, party, company):
|
def get_party_gle_currency(party_type, party, company):
|
||||||
def generator():
|
def generator():
|
||||||
existing_gle_currency = frappe.db.sql(
|
gl = qb.DocType("GL Entry")
|
||||||
"""select account_currency from `tabGL Entry`
|
existing_gle_currency = (
|
||||||
where docstatus=1 and company=%(company)s and party_type=%(party_type)s and party=%(party)s
|
qb.from_(gl)
|
||||||
limit 1""",
|
.select(gl.account_currency)
|
||||||
{"company": company, "party_type": party_type, "party": party},
|
.where(
|
||||||
|
(gl.docstatus == 1)
|
||||||
|
& (gl.company == company)
|
||||||
|
& (gl.party_type == party_type)
|
||||||
|
& (gl.party == party)
|
||||||
|
& (gl.is_cancelled == 0)
|
||||||
|
)
|
||||||
|
.limit(1)
|
||||||
|
.run()
|
||||||
)
|
)
|
||||||
|
|
||||||
return existing_gle_currency[0][0] if existing_gle_currency else None
|
return existing_gle_currency[0][0] if existing_gle_currency else None
|
||||||
|
|||||||
@@ -33,13 +33,6 @@ frappe.require("assets/erpnext/js/financial_statements.js", function() {
|
|||||||
"label": __("Accounting Dimension"),
|
"label": __("Accounting Dimension"),
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"options": "Accounting Dimension",
|
"options": "Accounting Dimension",
|
||||||
"get_query": () =>{
|
|
||||||
return {
|
|
||||||
filters: {
|
|
||||||
"disabled": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "fiscal_year",
|
"fieldname": "fiscal_year",
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ frappe.ui.form.on('Asset', {
|
|||||||
frm.set_query("item_code", function() {
|
frm.set_query("item_code", function() {
|
||||||
return {
|
return {
|
||||||
"filters": {
|
"filters": {
|
||||||
"disabled": 0,
|
|
||||||
"is_fixed_asset": 1,
|
"is_fixed_asset": 1,
|
||||||
"is_stock_item": 0
|
"is_stock_item": 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"transaction_settings_section",
|
"transaction_settings_section",
|
||||||
"po_required",
|
"po_required",
|
||||||
"pr_required",
|
"pr_required",
|
||||||
"over_order_allowance",
|
"blanket_order_allowance",
|
||||||
"column_break_12",
|
"column_break_12",
|
||||||
"maintain_same_rate",
|
"maintain_same_rate",
|
||||||
"set_landed_cost_based_on_purchase_invoice_rate",
|
"set_landed_cost_based_on_purchase_invoice_rate",
|
||||||
@@ -159,19 +159,19 @@
|
|||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Set Landed Cost Based on Purchase Invoice Rate"
|
"label": "Set Landed Cost Based on Purchase Invoice Rate"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"description": "Percentage you are allowed to order more against the Blanket Order Quantity. For example: If you have a Blanket Order of Quantity 100 units. and your Allowance is 10% then you are allowed to order 110 units.",
|
|
||||||
"fieldname": "over_order_allowance",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"label": "Over Order Allowance (%)"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
"description": "While making Purchase Invoice from Purchase Order, use Exchange Rate on Invoice's transaction date rather than inheriting it from Purchase Order. Only applies for Purchase Invoice.",
|
"description": "While making Purchase Invoice from Purchase Order, use Exchange Rate on Invoice's transaction date rather than inheriting it from Purchase Order. Only applies for Purchase Invoice.",
|
||||||
"fieldname": "use_transaction_date_exchange_rate",
|
"fieldname": "use_transaction_date_exchange_rate",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Use Transaction Date Exchange Rate"
|
"label": "Use Transaction Date Exchange Rate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"description": "Percentage you are allowed to order beyond the Blanket Order quantity.",
|
||||||
|
"fieldname": "blanket_order_allowance",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Blanket Order Allowance (%)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-cog",
|
"icon": "fa fa-cog",
|
||||||
@@ -179,7 +179,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2023-10-16 16:22:03.201078",
|
"modified": "2023-10-25 14:03:32.520418",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Buying Settings",
|
"name": "Buying Settings",
|
||||||
|
|||||||
@@ -44,11 +44,6 @@ frappe.query_reports["Supplier Quotation Comparison"] = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
return {
|
|
||||||
filters: { "disabled": 0 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ def validate_against_blanket_order(order_doc):
|
|||||||
allowance = flt(
|
allowance = flt(
|
||||||
frappe.db.get_single_value(
|
frappe.db.get_single_value(
|
||||||
"Selling Settings" if order_doc.doctype == "Sales Order" else "Buying Settings",
|
"Selling Settings" if order_doc.doctype == "Sales Order" else "Buying Settings",
|
||||||
"over_order_allowance",
|
"blanket_order_allowance",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
for bo_name, item_data in order_data.items():
|
for bo_name, item_data in order_data.items():
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class TestBlanketOrder(FrappeTestCase):
|
|||||||
po1.currency = get_company_currency(po1.company)
|
po1.currency = get_company_currency(po1.company)
|
||||||
self.assertEqual(po1.items[0].qty, (bo.items[0].qty - bo.items[0].ordered_qty))
|
self.assertEqual(po1.items[0].qty, (bo.items[0].qty - bo.items[0].ordered_qty))
|
||||||
|
|
||||||
def test_over_order_allowance(self):
|
def test_blanket_order_allowance(self):
|
||||||
# Sales Order
|
# Sales Order
|
||||||
bo = make_blanket_order(blanket_order_type="Selling", quantity=100)
|
bo = make_blanket_order(blanket_order_type="Selling", quantity=100)
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ class TestBlanketOrder(FrappeTestCase):
|
|||||||
so.items[0].qty = 110
|
so.items[0].qty = 110
|
||||||
self.assertRaises(frappe.ValidationError, so.submit)
|
self.assertRaises(frappe.ValidationError, so.submit)
|
||||||
|
|
||||||
frappe.db.set_single_value("Selling Settings", "over_order_allowance", 10)
|
frappe.db.set_single_value("Selling Settings", "blanket_order_allowance", 10)
|
||||||
so.submit()
|
so.submit()
|
||||||
|
|
||||||
# Purchase Order
|
# Purchase Order
|
||||||
@@ -87,7 +87,7 @@ class TestBlanketOrder(FrappeTestCase):
|
|||||||
po.items[0].qty = 110
|
po.items[0].qty = 110
|
||||||
self.assertRaises(frappe.ValidationError, po.submit)
|
self.assertRaises(frappe.ValidationError, po.submit)
|
||||||
|
|
||||||
frappe.db.set_single_value("Buying Settings", "over_order_allowance", 10)
|
frappe.db.set_single_value("Buying Settings", "blanket_order_allowance", 10)
|
||||||
po.submit()
|
po.submit()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ frappe.views.calendar["Job Card"] = {
|
|||||||
},
|
},
|
||||||
gantt: {
|
gantt: {
|
||||||
field_map: {
|
field_map: {
|
||||||
"start": "started_time",
|
"start": "expected_start_date",
|
||||||
"end": "started_time",
|
"end": "expected_end_date",
|
||||||
"id": "name",
|
"id": "name",
|
||||||
"title": "subject",
|
"title": "subject",
|
||||||
"color": "color",
|
"color": "color",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
frappe.listview_settings['Job Card'] = {
|
frappe.listview_settings['Job Card'] = {
|
||||||
has_indicator_for_draft: true,
|
has_indicator_for_draft: true,
|
||||||
|
add_fields: ["expected_start_date", "expected_end_date"],
|
||||||
get_indicator: function(doc) {
|
get_indicator: function(doc) {
|
||||||
const status_colors = {
|
const status_colors = {
|
||||||
"Work In Progress": "orange",
|
"Work In Progress": "orange",
|
||||||
|
|||||||
@@ -1734,7 +1734,10 @@ def get_raw_materials_of_sub_assembly_items(
|
|||||||
if not item.conversion_factor and item.purchase_uom:
|
if not item.conversion_factor and item.purchase_uom:
|
||||||
item.conversion_factor = get_uom_conversion_factor(item.item_code, item.purchase_uom)
|
item.conversion_factor = get_uom_conversion_factor(item.item_code, item.purchase_uom)
|
||||||
|
|
||||||
item_details.setdefault(item.get("item_code"), item)
|
if details := item_details.get(item.get("item_code")):
|
||||||
|
details.qty += item.get("qty")
|
||||||
|
else:
|
||||||
|
item_details.setdefault(item.get("item_code"), item)
|
||||||
|
|
||||||
return item_details
|
return item_details
|
||||||
|
|
||||||
|
|||||||
@@ -1321,6 +1321,33 @@ class TestProductionPlan(FrappeTestCase):
|
|||||||
self.assertTrue(row.warehouse == mrp_warhouse)
|
self.assertTrue(row.warehouse == mrp_warhouse)
|
||||||
self.assertEqual(row.quantity, 12)
|
self.assertEqual(row.quantity, 12)
|
||||||
|
|
||||||
|
def test_mr_qty_for_same_rm_with_different_sub_assemblies(self):
|
||||||
|
from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
|
||||||
|
|
||||||
|
bom_tree = {
|
||||||
|
"Fininshed Goods2 For SUB Test": {
|
||||||
|
"SubAssembly2 For SUB Test": {"ChildPart2 For SUB Test": {}},
|
||||||
|
"SubAssembly3 For SUB Test": {"ChildPart2 For SUB Test": {}},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parent_bom = create_nested_bom(bom_tree, prefix="")
|
||||||
|
plan = create_production_plan(
|
||||||
|
item_code=parent_bom.item,
|
||||||
|
planned_qty=1,
|
||||||
|
ignore_existing_ordered_qty=1,
|
||||||
|
do_not_submit=1,
|
||||||
|
skip_available_sub_assembly_item=1,
|
||||||
|
warehouse="_Test Warehouse - _TC",
|
||||||
|
)
|
||||||
|
|
||||||
|
plan.get_sub_assembly_items()
|
||||||
|
plan.make_material_request()
|
||||||
|
|
||||||
|
for row in plan.mr_items:
|
||||||
|
if row.item_code == "ChildPart2 For SUB Test":
|
||||||
|
self.assertEqual(row.quantity, 2)
|
||||||
|
|
||||||
|
|
||||||
def create_production_plan(**args):
|
def create_production_plan(**args):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ frappe.query_reports["BOM Operations Time"] = {
|
|||||||
"options": "Item",
|
"options": "Item",
|
||||||
"get_query": () =>{
|
"get_query": () =>{
|
||||||
return {
|
return {
|
||||||
filters: { "disabled": 0, "is_stock_item": 1 }
|
filters: { "is_stock_item": 1 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -342,5 +342,7 @@ execute:frappe.db.set_single_value('Selling Settings', 'allow_negative_rates_for
|
|||||||
erpnext.patches.v14_0.correct_asset_value_if_je_with_workflow
|
erpnext.patches.v14_0.correct_asset_value_if_je_with_workflow
|
||||||
erpnext.patches.v14_0.migrate_deferred_accounts_to_item_defaults
|
erpnext.patches.v14_0.migrate_deferred_accounts_to_item_defaults
|
||||||
erpnext.patches.v14_0.create_accounting_dimensions_in_sales_order_item
|
erpnext.patches.v14_0.create_accounting_dimensions_in_sales_order_item
|
||||||
|
erpnext.patches.v14_0.rename_over_order_allowance_field
|
||||||
|
erpnext.patches.v14_0.migrate_delivery_stop_lock_field
|
||||||
# below migration patch should always run last
|
# below migration patch should always run last
|
||||||
erpnext.patches.v14_0.migrate_gl_to_payment_ledger
|
erpnext.patches.v14_0.migrate_gl_to_payment_ledger
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import frappe
|
||||||
|
from frappe.model.utils.rename_field import rename_field
|
||||||
|
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
if frappe.db.has_column("Delivery Stop", "lock"):
|
||||||
|
rename_field("Delivery Stop", "lock", "locked")
|
||||||
15
erpnext/patches/v14_0/rename_over_order_allowance_field.py
Normal file
15
erpnext/patches/v14_0/rename_over_order_allowance_field.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from frappe.model.utils.rename_field import rename_field
|
||||||
|
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
rename_field(
|
||||||
|
"Buying Settings",
|
||||||
|
"over_order_allowance",
|
||||||
|
"blanket_order_allowance",
|
||||||
|
)
|
||||||
|
|
||||||
|
rename_field(
|
||||||
|
"Selling Settings",
|
||||||
|
"over_order_allowance",
|
||||||
|
"blanket_order_allowance",
|
||||||
|
)
|
||||||
@@ -28,7 +28,6 @@ frappe.ui.form.on(cur_frm.doctype, {
|
|||||||
filters: {
|
filters: {
|
||||||
"account_type": account_type,
|
"account_type": account_type,
|
||||||
"company": doc.company,
|
"company": doc.company,
|
||||||
"disabled": 0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"so_required",
|
"so_required",
|
||||||
"dn_required",
|
"dn_required",
|
||||||
"sales_update_frequency",
|
"sales_update_frequency",
|
||||||
"over_order_allowance",
|
"blanket_order_allowance",
|
||||||
"column_break_5",
|
"column_break_5",
|
||||||
"allow_multiple_items",
|
"allow_multiple_items",
|
||||||
"allow_against_multiple_purchase_orders",
|
"allow_against_multiple_purchase_orders",
|
||||||
@@ -182,17 +182,17 @@
|
|||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Allow Sales Order Creation For Expired Quotation"
|
"label": "Allow Sales Order Creation For Expired Quotation"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"description": "Percentage you are allowed to order more against the Blanket Order Quantity. For example: If you have a Blanket Order of Quantity 100 units. and your Allowance is 10% then you are allowed to order 110 units.",
|
|
||||||
"fieldname": "over_order_allowance",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"label": "Over Order Allowance (%)"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
"fieldname": "allow_negative_rates_for_items",
|
"fieldname": "allow_negative_rates_for_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Allow Negative rates for Items"
|
"label": "Allow Negative rates for Items"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Percentage you are allowed to sell beyond the Blanket Order quantity.",
|
||||||
|
"fieldname": "blanket_order_allowance",
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"label": "Blanket Order Allowance (%)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-cog",
|
"icon": "fa fa-cog",
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2023-08-14 20:33:05.693667",
|
"modified": "2023-10-25 14:03:03.966701",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Selling Settings",
|
"name": "Selling Settings",
|
||||||
|
|||||||
@@ -1315,16 +1315,16 @@ class TestDeliveryNote(FrappeTestCase):
|
|||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
frappe.db.set_single_value("Selling Settings", "dont_reserve_sales_order_qty_on_sales_return", 0)
|
frappe.db.set_single_value("Selling Settings", "dont_reserve_sales_order_qty_on_sales_return", 0)
|
||||||
|
|
||||||
def non_internal_transfer_delivery_note(self):
|
def test_non_internal_transfer_delivery_note(self):
|
||||||
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
|
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
|
||||||
|
|
||||||
dn = create_delivery_note(do_not_submit=True)
|
dn = create_delivery_note(do_not_submit=True)
|
||||||
warehouse = create_warehouse("Internal Transfer Warehouse", dn.company)
|
warehouse = create_warehouse("Internal Transfer Warehouse", company=dn.company)
|
||||||
dn.items[0].db_set("target_warehouse", "warehouse")
|
dn.items[0].db_set("target_warehouse", warehouse)
|
||||||
|
|
||||||
dn.reload()
|
dn.reload()
|
||||||
|
|
||||||
self.assertEqual(dn.items[0].target_warehouse, warehouse.name)
|
self.assertEqual(dn.items[0].target_warehouse, warehouse)
|
||||||
|
|
||||||
dn.save()
|
dn.save()
|
||||||
dn.reload()
|
dn.reload()
|
||||||
|
|||||||
@@ -1,815 +1,197 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"actions": [],
|
||||||
"allow_events_in_timeline": 0,
|
"creation": "2017-10-16 16:46:28.166950",
|
||||||
"allow_guest_to_view": 0,
|
"doctype": "DocType",
|
||||||
"allow_import": 0,
|
"editable_grid": 1,
|
||||||
"allow_rename": 0,
|
"engine": "InnoDB",
|
||||||
"beta": 0,
|
"field_order": [
|
||||||
"creation": "2017-10-16 16:46:28.166950",
|
"customer",
|
||||||
"custom": 0,
|
"address",
|
||||||
"docstatus": 0,
|
"locked",
|
||||||
"doctype": "DocType",
|
"column_break_6",
|
||||||
"document_type": "",
|
"customer_address",
|
||||||
"editable_grid": 1,
|
"visited",
|
||||||
"engine": "InnoDB",
|
"order_information_section",
|
||||||
|
"delivery_note",
|
||||||
|
"cb_order",
|
||||||
|
"grand_total",
|
||||||
|
"section_break_7",
|
||||||
|
"contact",
|
||||||
|
"email_sent_to",
|
||||||
|
"column_break_7",
|
||||||
|
"customer_contact",
|
||||||
|
"section_break_9",
|
||||||
|
"distance",
|
||||||
|
"estimated_arrival",
|
||||||
|
"lat",
|
||||||
|
"column_break_19",
|
||||||
|
"uom",
|
||||||
|
"lng",
|
||||||
|
"more_information_section",
|
||||||
|
"details"
|
||||||
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"columns": 2,
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "customer",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Link",
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"label": "Customer",
|
||||||
"columns": 2,
|
"options": "Customer"
|
||||||
"fieldname": "customer",
|
},
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Customer",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Customer",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "address",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"in_list_view": 1,
|
||||||
"bold": 0,
|
"label": "Address Name",
|
||||||
"collapsible": 0,
|
"options": "Address",
|
||||||
"columns": 0,
|
"print_hide": 1,
|
||||||
"fieldname": "address",
|
"reqd": 1
|
||||||
"fieldtype": "Link",
|
},
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Address Name",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Address",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 1,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"default": "0",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "locked",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Check",
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"label": "Locked"
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "lock",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Lock",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "column_break_6",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_6",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "customer_address",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Small Text",
|
||||||
"allow_on_submit": 0,
|
"label": "Customer Address",
|
||||||
"bold": 0,
|
"read_only": 1
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "customer_address",
|
|
||||||
"fieldtype": "Small Text",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Customer Address",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_on_submit": 1,
|
||||||
"allow_in_quick_entry": 0,
|
"default": "0",
|
||||||
"allow_on_submit": 1,
|
"depends_on": "eval:doc.docstatus==1",
|
||||||
"bold": 0,
|
"fieldname": "visited",
|
||||||
"collapsible": 0,
|
"fieldtype": "Check",
|
||||||
"columns": 0,
|
"label": "Visited",
|
||||||
"depends_on": "eval:doc.docstatus==1",
|
"no_copy": 1,
|
||||||
"fieldname": "visited",
|
"print_hide": 1
|
||||||
"fieldtype": "Check",
|
},
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Visited",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 1,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "order_information_section",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break",
|
||||||
"allow_on_submit": 0,
|
"label": "Order Information"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "order_information_section",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Order Information",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "delivery_note",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"in_list_view": 1,
|
||||||
"bold": 0,
|
"label": "Delivery Note",
|
||||||
"collapsible": 0,
|
"no_copy": 1,
|
||||||
"columns": 0,
|
"options": "Delivery Note",
|
||||||
"fieldname": "delivery_note",
|
"print_hide": 1,
|
||||||
"fieldtype": "Link",
|
"read_only": 1
|
||||||
"hidden": 0,
|
},
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Delivery Note",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"options": "Delivery Note",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 1,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "cb_order",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "cb_order",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "grand_total",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Currency",
|
||||||
"allow_on_submit": 0,
|
"label": "Grand Total",
|
||||||
"bold": 0,
|
"read_only": 1
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "grand_total",
|
|
||||||
"fieldtype": "Currency",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Grand Total",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "section_break_7",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break",
|
||||||
"allow_on_submit": 0,
|
"label": "Contact Information"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "section_break_7",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Contact Information",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "contact",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Contact Name",
|
||||||
"bold": 0,
|
"options": "Contact",
|
||||||
"collapsible": 0,
|
"print_hide": 1
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "contact",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Contact Name",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Contact",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 1,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "email_sent_to",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Data",
|
||||||
"allow_on_submit": 0,
|
"label": "Email sent to",
|
||||||
"bold": 0,
|
"read_only": 1
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "email_sent_to",
|
|
||||||
"fieldtype": "Data",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Email sent to",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "column_break_7",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_7",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "customer_contact",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Small Text",
|
||||||
"allow_on_submit": 0,
|
"label": "Customer Contact",
|
||||||
"bold": 0,
|
"read_only": 1
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "customer_contact",
|
|
||||||
"fieldtype": "Small Text",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Customer Contact",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "section_break_9",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break",
|
||||||
"allow_on_submit": 0,
|
"label": "Dispatch Information"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "section_break_9",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Dispatch Information",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "distance",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Float",
|
||||||
"allow_on_submit": 0,
|
"label": "Distance",
|
||||||
"bold": 0,
|
"precision": "2",
|
||||||
"collapsible": 0,
|
"read_only": 1
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "distance",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Distance",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "2",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "estimated_arrival",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Datetime",
|
||||||
"allow_on_submit": 0,
|
"in_list_view": 1,
|
||||||
"bold": 0,
|
"label": "Estimated Arrival"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "estimated_arrival",
|
|
||||||
"fieldtype": "Datetime",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Estimated Arrival",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "lat",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Float",
|
||||||
"allow_on_submit": 0,
|
"hidden": 1,
|
||||||
"bold": 0,
|
"label": "Latitude"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "lat",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"hidden": 1,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Latitude",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "column_break_19",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_19",
|
|
||||||
"fieldtype": "Column Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"depends_on": "eval:doc.distance",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "uom",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Link",
|
||||||
"bold": 0,
|
"label": "UOM",
|
||||||
"collapsible": 0,
|
"options": "UOM",
|
||||||
"columns": 0,
|
"read_only": 1
|
||||||
"default": "",
|
},
|
||||||
"depends_on": "eval:doc.distance",
|
|
||||||
"fieldname": "uom",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "UOM",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "UOM",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 1,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "lng",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Float",
|
||||||
"allow_on_submit": 0,
|
"hidden": 1,
|
||||||
"bold": 0,
|
"label": "Longitude"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "lng",
|
|
||||||
"fieldtype": "Float",
|
|
||||||
"hidden": 1,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Longitude",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "more_information_section",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break",
|
||||||
"allow_on_submit": 0,
|
"label": "More Information"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "more_information_section",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "More Information",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "details",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Text Editor",
|
||||||
"allow_on_submit": 0,
|
"label": "Details"
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "details",
|
|
||||||
"fieldtype": "Text Editor",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Details",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"istable": 1,
|
||||||
"hide_heading": 0,
|
"links": [],
|
||||||
"hide_toolbar": 0,
|
"modified": "2023-09-29 09:22:53.435161",
|
||||||
"idx": 0,
|
"modified_by": "Administrator",
|
||||||
"image_view": 0,
|
"module": "Stock",
|
||||||
"in_create": 0,
|
"name": "Delivery Stop",
|
||||||
"is_submittable": 0,
|
"owner": "Administrator",
|
||||||
"issingle": 0,
|
"permissions": [],
|
||||||
"istable": 1,
|
"quick_entry": 1,
|
||||||
"max_attachments": 0,
|
"sort_field": "modified",
|
||||||
"modified": "2018-10-16 05:23:25.661542",
|
"sort_order": "DESC",
|
||||||
"modified_by": "Administrator",
|
"states": [],
|
||||||
"module": "Stock",
|
"track_changes": 1
|
||||||
"name": "Delivery Stop",
|
|
||||||
"name_case": "",
|
|
||||||
"owner": "Administrator",
|
|
||||||
"permissions": [],
|
|
||||||
"quick_entry": 1,
|
|
||||||
"read_only": 0,
|
|
||||||
"read_only_onload": 0,
|
|
||||||
"show_name_in_global_search": 0,
|
|
||||||
"sort_field": "modified",
|
|
||||||
"sort_order": "DESC",
|
|
||||||
"track_changes": 1,
|
|
||||||
"track_seen": 0,
|
|
||||||
"track_views": 0
|
|
||||||
}
|
}
|
||||||
@@ -64,6 +64,11 @@ frappe.ui.form.on('Delivery Trip', {
|
|||||||
})
|
})
|
||||||
}, __("Get stops from"));
|
}, __("Get stops from"));
|
||||||
}
|
}
|
||||||
|
frm.add_custom_button(__("Delivery Notes"), function () {
|
||||||
|
frappe.set_route("List", "Delivery Note",
|
||||||
|
{'name': ["in", frm.doc.delivery_stops.map((stop) => {return stop.delivery_note;})]}
|
||||||
|
);
|
||||||
|
}, __("View"));
|
||||||
},
|
},
|
||||||
|
|
||||||
calculate_arrival_time: function (frm) {
|
calculate_arrival_time: function (frm) {
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class DeliveryTrip(Document):
|
|||||||
for stop in self.delivery_stops:
|
for stop in self.delivery_stops:
|
||||||
leg.append(stop.customer_address)
|
leg.append(stop.customer_address)
|
||||||
|
|
||||||
if optimize and stop.lock:
|
if optimize and stop.locked:
|
||||||
route_list.append(leg)
|
route_list.append(leg)
|
||||||
leg = [stop.customer_address]
|
leg = [stop.customer_address]
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class TestDeliveryTrip(FrappeTestCase):
|
|||||||
self.assertEqual(len(route_list[0]), 4)
|
self.assertEqual(len(route_list[0]), 4)
|
||||||
|
|
||||||
def test_unoptimized_route_list_with_locks(self):
|
def test_unoptimized_route_list_with_locks(self):
|
||||||
self.delivery_trip.delivery_stops[0].lock = 1
|
self.delivery_trip.delivery_stops[0].locked = 1
|
||||||
self.delivery_trip.save()
|
self.delivery_trip.save()
|
||||||
route_list = self.delivery_trip.form_route_list(optimize=False)
|
route_list = self.delivery_trip.form_route_list(optimize=False)
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ class TestDeliveryTrip(FrappeTestCase):
|
|||||||
self.assertEqual(len(route_list[0]), 4)
|
self.assertEqual(len(route_list[0]), 4)
|
||||||
|
|
||||||
def test_optimized_route_list_with_locks(self):
|
def test_optimized_route_list_with_locks(self):
|
||||||
self.delivery_trip.delivery_stops[0].lock = 1
|
self.delivery_trip.delivery_stops[0].locked = 1
|
||||||
self.delivery_trip.save()
|
self.delivery_trip.save()
|
||||||
route_list = self.delivery_trip.form_route_list(optimize=True)
|
route_list = self.delivery_trip.form_route_list(optimize=True)
|
||||||
|
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ class Item(Document):
|
|||||||
|
|
||||||
# add item taxes from template
|
# add item taxes from template
|
||||||
for d in template.get("taxes"):
|
for d in template.get("taxes"):
|
||||||
self.append("taxes", {"item_tax_template": d.item_tax_template})
|
self.append("taxes", d)
|
||||||
|
|
||||||
# copy re-order table if empty
|
# copy re-order table if empty
|
||||||
if not self.get("reorder_levels"):
|
if not self.get("reorder_levels"):
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ frappe.ui.form.on("Item Price", {
|
|||||||
frm.set_query("item_code", function() {
|
frm.set_query("item_code", function() {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
"disabled": 0,
|
|
||||||
"has_variants": 0
|
"has_variants": 0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -923,7 +923,8 @@
|
|||||||
"label": "Delivery Note Item",
|
"label": "Delivery Note Item",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 1
|
"read_only": 1,
|
||||||
|
"search_index": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
@@ -1052,7 +1053,7 @@
|
|||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2023-10-19 10:50:58.071735",
|
"modified": "2023-10-30 17:32:24.560337",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Purchase Receipt Item",
|
"name": "Purchase Receipt Item",
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ class SerialNo(StockController):
|
|||||||
sle_dict = self.get_stock_ledger_entries(serial_no)
|
sle_dict = self.get_stock_ledger_entries(serial_no)
|
||||||
if sle_dict:
|
if sle_dict:
|
||||||
if sle_dict.get("incoming", []):
|
if sle_dict.get("incoming", []):
|
||||||
entries["purchase_sle"] = sle_dict["incoming"][0]
|
entries["purchase_sle"] = sle_dict["incoming"][-1]
|
||||||
|
|
||||||
if len(sle_dict.get("incoming", [])) - len(sle_dict.get("outgoing", [])) > 0:
|
if len(sle_dict.get("incoming", [])) - len(sle_dict.get("outgoing", [])) > 0:
|
||||||
entries["last_sle"] = sle_dict["incoming"][0]
|
entries["last_sle"] = sle_dict["incoming"][0]
|
||||||
|
|||||||
@@ -988,14 +988,34 @@ class StockEntry(StockController):
|
|||||||
& (se.docstatus == 1)
|
& (se.docstatus == 1)
|
||||||
& (se_detail.item_code == se_item.item_code)
|
& (se_detail.item_code == se_item.item_code)
|
||||||
& (
|
& (
|
||||||
(se.purchase_order == self.purchase_order)
|
((se.purchase_order == self.purchase_order) & (se_detail.po_detail == se_item.po_detail))
|
||||||
if self.subcontract_data.order_doctype == "Purchase Order"
|
if self.subcontract_data.order_doctype == "Purchase Order"
|
||||||
else (se.subcontracting_order == self.subcontracting_order)
|
else (
|
||||||
|
(se.subcontracting_order == self.subcontracting_order)
|
||||||
|
& (se_detail.sco_rm_detail == se_item.sco_rm_detail)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
).run()[0][0]
|
).run()[0][0] or 0
|
||||||
|
|
||||||
if flt(total_supplied, precision) > flt(total_allowed, precision):
|
total_returned = 0
|
||||||
|
if self.subcontract_data.order_doctype == "Subcontracting Order":
|
||||||
|
total_returned = (
|
||||||
|
frappe.qb.from_(se)
|
||||||
|
.inner_join(se_detail)
|
||||||
|
.on(se.name == se_detail.parent)
|
||||||
|
.select(Sum(se_detail.transfer_qty))
|
||||||
|
.where(
|
||||||
|
(se.purpose == "Material Transfer")
|
||||||
|
& (se.docstatus == 1)
|
||||||
|
& (se.is_return == 1)
|
||||||
|
& (se_detail.item_code == se_item.item_code)
|
||||||
|
& (se_detail.sco_rm_detail == se_item.sco_rm_detail)
|
||||||
|
& (se.subcontracting_order == self.subcontracting_order)
|
||||||
|
)
|
||||||
|
).run()[0][0] or 0
|
||||||
|
|
||||||
|
if flt(total_supplied - total_returned, precision) > flt(total_allowed, precision):
|
||||||
frappe.throw(
|
frappe.throw(
|
||||||
_("Row {0}# Item {1} cannot be transferred more than {2} against {3} {4}").format(
|
_("Row {0}# Item {1} cannot be transferred more than {2} against {3} {4}").format(
|
||||||
se_item.idx,
|
se_item.idx,
|
||||||
|
|||||||
@@ -95,13 +95,6 @@ frappe.ui.form.on("Stock Reconciliation", {
|
|||||||
fieldname: "item_code",
|
fieldname: "item_code",
|
||||||
fieldtype: "Link",
|
fieldtype: "Link",
|
||||||
options: "Item",
|
options: "Item",
|
||||||
"get_query": function() {
|
|
||||||
return {
|
|
||||||
"filters": {
|
|
||||||
"disabled": 0,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: __("Ignore Empty Stock"),
|
label: __("Ignore Empty Stock"),
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ def get_basic_details(args, item, overwrite_warehouse=True):
|
|||||||
if not item:
|
if not item:
|
||||||
item = frappe.get_doc("Item", args.get("item_code"))
|
item = frappe.get_doc("Item", args.get("item_code"))
|
||||||
|
|
||||||
if item.variant_of:
|
if item.variant_of and not item.taxes:
|
||||||
item.update_template_tables()
|
item.update_template_tables()
|
||||||
|
|
||||||
item_defaults = get_item_defaults(item.name, args.company)
|
item_defaults = get_item_defaults(item.name, args.company)
|
||||||
@@ -364,8 +364,12 @@ def get_basic_details(args, item, overwrite_warehouse=True):
|
|||||||
),
|
),
|
||||||
"expense_account": expense_account
|
"expense_account": expense_account
|
||||||
or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults),
|
or get_default_expense_account(args, item_defaults, item_group_defaults, brand_defaults),
|
||||||
"discount_account": get_default_discount_account(args, item_defaults),
|
"discount_account": get_default_discount_account(
|
||||||
"provisional_expense_account": get_provisional_account(args, item_defaults),
|
args, item_defaults, item_group_defaults, brand_defaults
|
||||||
|
),
|
||||||
|
"provisional_expense_account": get_provisional_account(
|
||||||
|
args, item_defaults, item_group_defaults, brand_defaults
|
||||||
|
),
|
||||||
"cost_center": get_default_cost_center(
|
"cost_center": get_default_cost_center(
|
||||||
args, item_defaults, item_group_defaults, brand_defaults
|
args, item_defaults, item_group_defaults, brand_defaults
|
||||||
),
|
),
|
||||||
@@ -719,12 +723,22 @@ def get_default_expense_account(args, item, item_group, brand):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_provisional_account(args, item):
|
def get_provisional_account(args, item, item_group, brand):
|
||||||
return item.get("default_provisional_account") or args.default_provisional_account
|
return (
|
||||||
|
item.get("default_provisional_account")
|
||||||
|
or item_group.get("default_provisional_account")
|
||||||
|
or brand.get("default_provisional_account")
|
||||||
|
or args.default_provisional_account
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_default_discount_account(args, item):
|
def get_default_discount_account(args, item, item_group, brand):
|
||||||
return item.get("default_discount_account") or args.discount_account
|
return (
|
||||||
|
item.get("default_discount_account")
|
||||||
|
or item_group.get("default_discount_account")
|
||||||
|
or brand.get("default_discount_account")
|
||||||
|
or args.discount_account
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_default_deferred_account(args, item, fieldname=None):
|
def get_default_deferred_account(args, item, fieldname=None):
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ frappe.ui.form.on('Subcontracting Order', {
|
|||||||
get_materials_from_supplier: function (frm) {
|
get_materials_from_supplier: function (frm) {
|
||||||
let sco_rm_details = [];
|
let sco_rm_details = [];
|
||||||
|
|
||||||
if (frm.doc.status != "Closed" && frm.doc.supplied_items && frm.doc.per_received > 0) {
|
if (frm.doc.status != "Closed" && frm.doc.supplied_items) {
|
||||||
frm.doc.supplied_items.forEach(d => {
|
frm.doc.supplied_items.forEach(d => {
|
||||||
if (d.total_supplied_qty > 0 && d.total_supplied_qty != d.consumed_qty) {
|
if (d.total_supplied_qty > 0 && d.total_supplied_qty != d.consumed_qty) {
|
||||||
sco_rm_details.push(d.name);
|
sco_rm_details.push(d.name);
|
||||||
@@ -193,7 +193,7 @@ erpnext.buying.SubcontractingOrderController = class SubcontractingOrderControll
|
|||||||
}
|
}
|
||||||
|
|
||||||
has_unsupplied_items() {
|
has_unsupplied_items() {
|
||||||
return this.frm.doc['supplied_items'].some(item => item.required_qty > item.supplied_qty);
|
return this.frm.doc['supplied_items'].some(item => item.required_qty > (item.supplied_qty - item.returned_qty));
|
||||||
}
|
}
|
||||||
|
|
||||||
make_subcontracting_receipt() {
|
make_subcontracting_receipt() {
|
||||||
|
|||||||
@@ -1,13 +1,6 @@
|
|||||||
frappe.ui.form.on("Issue", {
|
frappe.ui.form.on("Issue", {
|
||||||
onload: function(frm) {
|
onload: function(frm) {
|
||||||
frm.email_field = "raised_by";
|
frm.email_field = "raised_by";
|
||||||
frm.set_query("customer", function () {
|
|
||||||
return {
|
|
||||||
filters: {
|
|
||||||
"disabled": 0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
frappe.db.get_value("Support Settings", {name: "Support Settings"},
|
frappe.db.get_value("Support Settings", {name: "Support Settings"},
|
||||||
["allow_resetting_service_level_agreement", "track_service_level_agreement"], (r) => {
|
["allow_resetting_service_level_agreement", "track_service_level_agreement"], (r) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user