mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-03 12:19:12 +00:00
Merge pull request #51713 from frappe/version-16-hotfix
This commit is contained in:
5
.github/workflows/patch.yml
vendored
5
.github/workflows/patch.yml
vendored
@@ -113,8 +113,8 @@ jobs:
|
|||||||
jq 'del(.install_apps)' ~/frappe-bench/sites/test_site/site_config.json > tmp.json
|
jq 'del(.install_apps)' ~/frappe-bench/sites/test_site/site_config.json > tmp.json
|
||||||
mv tmp.json ~/frappe-bench/sites/test_site/site_config.json
|
mv tmp.json ~/frappe-bench/sites/test_site/site_config.json
|
||||||
|
|
||||||
wget https://erpnext.com/files/v13-erpnext.sql.gz
|
wget https://frappe.io/files/erpnext-v14.sql.gz
|
||||||
bench --site test_site --force restore ~/frappe-bench/v13-erpnext.sql.gz
|
bench --site test_site --force restore ~/frappe-bench/erpnext-v14.sql.gz
|
||||||
|
|
||||||
git -C "apps/frappe" remote set-url upstream https://github.com/frappe/frappe.git
|
git -C "apps/frappe" remote set-url upstream https://github.com/frappe/frappe.git
|
||||||
git -C "apps/erpnext" remote set-url upstream https://github.com/frappe/erpnext.git
|
git -C "apps/erpnext" remote set-url upstream https://github.com/frappe/erpnext.git
|
||||||
@@ -142,7 +142,6 @@ jobs:
|
|||||||
bench --site test_site migrate
|
bench --site test_site migrate
|
||||||
}
|
}
|
||||||
|
|
||||||
update_to_version 14 3.11
|
|
||||||
update_to_version 15 3.13
|
update_to_version 15 3.13
|
||||||
|
|
||||||
echo "Updating to latest version"
|
echo "Updating to latest version"
|
||||||
|
|||||||
@@ -184,6 +184,9 @@ class JournalEntry(AccountsController):
|
|||||||
else:
|
else:
|
||||||
return self._submit()
|
return self._submit()
|
||||||
|
|
||||||
|
def before_cancel(self):
|
||||||
|
self.has_asset_adjustment_entry()
|
||||||
|
|
||||||
def cancel(self):
|
def cancel(self):
|
||||||
if len(self.accounts) > 100:
|
if len(self.accounts) > 100:
|
||||||
queue_submission(self, "_cancel")
|
queue_submission(self, "_cancel")
|
||||||
@@ -554,12 +557,27 @@ class JournalEntry(AccountsController):
|
|||||||
)
|
)
|
||||||
frappe.db.set_value("Journal Entry", self.name, "inter_company_journal_entry_reference", "")
|
frappe.db.set_value("Journal Entry", self.name, "inter_company_journal_entry_reference", "")
|
||||||
|
|
||||||
def unlink_asset_adjustment_entry(self):
|
def has_asset_adjustment_entry(self):
|
||||||
frappe.db.sql(
|
if self.flags.get("via_asset_value_adjustment"):
|
||||||
""" update `tabAsset Value Adjustment`
|
return
|
||||||
set journal_entry = null where journal_entry = %s""",
|
|
||||||
self.name,
|
asset_value_adjustment = frappe.db.get_value(
|
||||||
|
"Asset Value Adjustment", {"docstatus": 1, "journal_entry": self.name}, "name"
|
||||||
)
|
)
|
||||||
|
if asset_value_adjustment:
|
||||||
|
frappe.throw(
|
||||||
|
_(
|
||||||
|
"Cannot cancel this document as it is linked with the submitted Asset Value Adjustment <b>{0}</b>. Please cancel the Asset Value Adjustment to continue."
|
||||||
|
).format(frappe.utils.get_link_to_form("Asset Value Adjustment", asset_value_adjustment))
|
||||||
|
)
|
||||||
|
|
||||||
|
def unlink_asset_adjustment_entry(self):
|
||||||
|
AssetValueAdjustment = frappe.qb.DocType("Asset Value Adjustment")
|
||||||
|
(
|
||||||
|
frappe.qb.update(AssetValueAdjustment)
|
||||||
|
.set(AssetValueAdjustment.journal_entry, None)
|
||||||
|
.where(AssetValueAdjustment.journal_entry == self.name)
|
||||||
|
).run()
|
||||||
|
|
||||||
def validate_party(self):
|
def validate_party(self):
|
||||||
for d in self.get("accounts"):
|
for d in self.get("accounts"):
|
||||||
|
|||||||
@@ -415,7 +415,6 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 500,
|
"tax_amount": 500,
|
||||||
"description": "Test",
|
"description": "Test",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
pi.save()
|
pi.save()
|
||||||
@@ -506,7 +505,6 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 200,
|
"tax_amount": 200,
|
||||||
"description": "Test Gross Tax",
|
"description": "Test Gross Tax",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
si.save()
|
si.save()
|
||||||
@@ -541,10 +539,10 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 400,
|
"tax_amount": 400,
|
||||||
"description": "Test Gross Tax",
|
"description": "Test Gross Tax",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
si.save()
|
si.save()
|
||||||
|
si.reload()
|
||||||
si.submit()
|
si.submit()
|
||||||
invoices.append(si)
|
invoices.append(si)
|
||||||
# For amount before threshold (first 8000 + VAT): TCS entry with amount zero
|
# For amount before threshold (first 8000 + VAT): TCS entry with amount zero
|
||||||
@@ -594,7 +592,6 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 500,
|
"tax_amount": 500,
|
||||||
"description": "VAT added to test TDS calculation on gross amount",
|
"description": "VAT added to test TDS calculation on gross amount",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
si.save()
|
si.save()
|
||||||
@@ -1024,7 +1021,6 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 1000,
|
"tax_amount": 1000,
|
||||||
"description": "VAT added to test TDS calculation on gross amount",
|
"description": "VAT added to test TDS calculation on gross amount",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
pi.save()
|
pi.save()
|
||||||
@@ -1162,7 +1158,6 @@ class TestTaxWithholdingCategory(IntegrationTestCase):
|
|||||||
"cost_center": "Main - _TC",
|
"cost_center": "Main - _TC",
|
||||||
"tax_amount": 8000,
|
"tax_amount": 8000,
|
||||||
"description": "Test",
|
"description": "Test",
|
||||||
"add_deduct_tax": "Add",
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -708,6 +708,10 @@ class TaxWithholdingController:
|
|||||||
existing_taxes = {row.account_head: row for row in self.doc.taxes if row.is_tax_withholding_account}
|
existing_taxes = {row.account_head: row for row in self.doc.taxes if row.is_tax_withholding_account}
|
||||||
precision = self.doc.precision("tax_amount", "taxes")
|
precision = self.doc.precision("tax_amount", "taxes")
|
||||||
conversion_rate = self.get_conversion_rate()
|
conversion_rate = self.get_conversion_rate()
|
||||||
|
add_deduct_tax = "Deduct"
|
||||||
|
|
||||||
|
if self.party_type == "Customer":
|
||||||
|
add_deduct_tax = "Add"
|
||||||
|
|
||||||
for account_head, base_amount in account_amount_map.items():
|
for account_head, base_amount in account_amount_map.items():
|
||||||
tax_amount = flt(base_amount / conversion_rate, precision)
|
tax_amount = flt(base_amount / conversion_rate, precision)
|
||||||
@@ -724,6 +728,7 @@ class TaxWithholdingController:
|
|||||||
tax_row = self._create_tax_row(account_head, tax_amount)
|
tax_row = self._create_tax_row(account_head, tax_amount)
|
||||||
for_update = False
|
for_update = False
|
||||||
|
|
||||||
|
tax_row.add_deduct_tax = add_deduct_tax
|
||||||
# Set item-wise tax breakup for this tax row
|
# Set item-wise tax breakup for this tax row
|
||||||
self._set_item_wise_tax_for_tds(
|
self._set_item_wise_tax_for_tds(
|
||||||
tax_row, account_head, category_withholding_map, for_update=for_update
|
tax_row, account_head, category_withholding_map, for_update=for_update
|
||||||
@@ -743,7 +748,6 @@ class TaxWithholdingController:
|
|||||||
"account_head": account_head,
|
"account_head": account_head,
|
||||||
"description": account_head,
|
"description": account_head,
|
||||||
"cost_center": cost_center,
|
"cost_center": cost_center,
|
||||||
"add_deduct_tax": "Deduct",
|
|
||||||
"tax_amount": tax_amount,
|
"tax_amount": tax_amount,
|
||||||
"dont_recompute_tax": 1,
|
"dont_recompute_tax": 1,
|
||||||
},
|
},
|
||||||
@@ -807,12 +811,14 @@ class TaxWithholdingController:
|
|||||||
else:
|
else:
|
||||||
item_tax_amount = 0
|
item_tax_amount = 0
|
||||||
|
|
||||||
|
multiplier = -1 if tax_row.add_deduct_tax == "Deduct" else 1
|
||||||
|
|
||||||
self.doc._item_wise_tax_details.append(
|
self.doc._item_wise_tax_details.append(
|
||||||
frappe._dict(
|
frappe._dict(
|
||||||
item=item,
|
item=item,
|
||||||
tax=tax_row,
|
tax=tax_row,
|
||||||
rate=category.tax_rate,
|
rate=category.tax_rate,
|
||||||
amount=item_tax_amount * -1, # Negative because it's a deduction
|
amount=item_tax_amount * multiplier,
|
||||||
taxable_amount=item_base_taxable,
|
taxable_amount=item_base_taxable,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ class AssetValueAdjustment(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
frappe.get_doc("Journal Entry", self.journal_entry).cancel()
|
self.cancel_asset_revaluation_entry()
|
||||||
self.update_asset()
|
self.update_asset()
|
||||||
add_asset_activity(
|
add_asset_activity(
|
||||||
self.asset,
|
self.asset,
|
||||||
@@ -167,6 +167,17 @@ class AssetValueAdjustment(Document):
|
|||||||
if dimension.get("mandatory_for_pl"):
|
if dimension.get("mandatory_for_pl"):
|
||||||
debit_entry.update({dimension["fieldname"]: dimension_value})
|
debit_entry.update({dimension["fieldname"]: dimension_value})
|
||||||
|
|
||||||
|
def cancel_asset_revaluation_entry(self):
|
||||||
|
if not self.journal_entry:
|
||||||
|
return
|
||||||
|
|
||||||
|
revaluation_entry = frappe.get_doc("Journal Entry", self.journal_entry)
|
||||||
|
if revaluation_entry.docstatus == 1:
|
||||||
|
# Ignore permissions to match Journal Entry submission behavior
|
||||||
|
revaluation_entry.flags.ignore_permissions = True
|
||||||
|
revaluation_entry.flags.via_asset_value_adjustment = True
|
||||||
|
revaluation_entry.cancel()
|
||||||
|
|
||||||
def update_asset(self):
|
def update_asset(self):
|
||||||
asset = self.update_asset_value_after_depreciation()
|
asset = self.update_asset_value_after_depreciation()
|
||||||
note = self.get_adjustment_note()
|
note = self.get_adjustment_note()
|
||||||
|
|||||||
@@ -53,12 +53,14 @@ def get_stock_value_by_item_group(company):
|
|||||||
.inner_join(item_doctype)
|
.inner_join(item_doctype)
|
||||||
.on(doctype.item_code == item_doctype.name)
|
.on(doctype.item_code == item_doctype.name)
|
||||||
.select(item_doctype.item_group, stock_value.as_("stock_value"))
|
.select(item_doctype.item_group, stock_value.as_("stock_value"))
|
||||||
.where(doctype.warehouse.isin(warehouses))
|
|
||||||
.groupby(item_doctype.item_group)
|
.groupby(item_doctype.item_group)
|
||||||
.orderby(stock_value, order=frappe.qb.desc)
|
.orderby(stock_value, order=frappe.qb.desc)
|
||||||
.limit(10)
|
.limit(10)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if warehouses:
|
||||||
|
query = query.where(doctype.warehouse.isin(warehouses))
|
||||||
|
|
||||||
results = query.run(as_dict=True)
|
results = query.run(as_dict=True)
|
||||||
|
|
||||||
labels = []
|
labels = []
|
||||||
|
|||||||
Reference in New Issue
Block a user