Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

chore: release v13 #33702

Merged
merged 25 commits into from
Jan 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
66bf107
fix: don't check other warehouse ledgers to calculate valuation rate
rohitwaghchaure Jan 10, 2023
2874116
Merge pull request #33602 from frappe/mergify/bp/version-13-hotfix/pr…
s-aga-r Jan 10, 2023
a450c8d
fix: better comparision of difference value between stock and account
vorasmit Jan 11, 2023
29dcce5
Merge pull request #33615 from frappe/mergify/bp/version-13-hotfix/pr…
s-aga-r Jan 11, 2023
7dcf0f0
fix: only group similar items in print format if group_same_items is …
mergify[bot] Jan 12, 2023
f3b6b46
chore: reuse doc object in test_pick_list_grouping_before_print (back…
mergify[bot] Jan 12, 2023
a46aa80
fix: Updating SO throws ordered_qty not allowed to change after submi…
ruthra-kumar Jan 12, 2023
e23d7aa
Merge pull request #33629 from frappe/mergify/bp/version-13-hotfix/pr…
ruthra-kumar Jan 13, 2023
42fe63d
fix: asset value in fixed asset register (#33608)
mergify[bot] Jan 15, 2023
e4af69b
chore: `Sales Order` link in `Pick List`
s-aga-r Jan 15, 2023
eef0f45
fix: Return against internal purchase invoice (#33635)
mergify[bot] Jan 16, 2023
0f0a2b1
revert: Reverting changes done on 33495 (#33662)
ruthra-kumar Jan 16, 2023
f1bb893
Revert "fix: Updating SO throws ordered_qty not allowed to change aft…
ruthra-kumar Jan 16, 2023
2f81f15
fix: allow to create sales order from expired quotation (#33582)
mergify[bot] Jan 16, 2023
ff48c44
Merge branch 'version-13-hotfix' into mergify/bp/version-13-hotfix/pr…
s-aga-r Jan 16, 2023
5a4d92b
Merge pull request #33666 from frappe/mergify/bp/version-13-hotfix/pr…
s-aga-r Jan 16, 2023
6ebc9c5
Merge pull request #33669 from frappe/mergify/bp/version-13-hotfix/pr…
ruthra-kumar Jan 16, 2023
edc20ae
Merge pull request #33672 from frappe/mergify/bp/version-13-hotfix/pr…
ruthra-kumar Jan 16, 2023
5f7dc8a
fix: handle post depr entries fail and fix asset repair link
anandbaburajan Jan 16, 2023
2b3a0ba
Merge branch 'version-13-hotfix' into misc_asset_fixes_v13
anandbaburajan Jan 16, 2023
97488ae
fix: Sales ORder Connections on Material Request
FHenry Jan 16, 2023
847171b
Merge pull request #33693 from frappe/mergify/bp/version-13-hotfix/pr…
s-aga-r Jan 17, 2023
ec780ac
chore: ignore b028
ankush Jan 17, 2023
f1670e9
Merge branch 'version-13-hotfix' into misc_asset_fixes_v13
anandbaburajan Jan 17, 2023
f2d83b1
Merge pull request #33689 from AnandBaburajan/misc_asset_fixes_v13
anandbaburajan Jan 17, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/helper/.flake8_strict
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ ignore =
F841,
E713,
E712,
B023
B023,
B028


max-line-length = 200
Expand Down
17 changes: 17 additions & 0 deletions erpnext/assets/doctype/asset/asset.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ frappe.ui.form.on('Asset', {
}, __("Manage"));
}

if (frm.doc.depr_entry_posting_status === "Failed") {
frm.trigger("set_depr_posting_failure_alert");
}

frm.trigger("setup_chart");
}

Expand All @@ -142,6 +146,19 @@ frappe.ui.form.on('Asset', {
}
},

set_depr_posting_failure_alert: function (frm) {
const alert = `
<div class="row">
<div class="col-xs-12 col-sm-6">
<span class="indicator whitespace-nowrap red">
<span>Failed to post depreciation entries</span>
</span>
</div>
</div>`;

frm.dashboard.set_headline_alert(alert);
},

toggle_reference_doc: function(frm) {
if (frm.doc.purchase_receipt && frm.doc.purchase_invoice && frm.doc.docstatus === 1) {
frm.set_df_property('purchase_invoice', 'read_only', 1);
Expand Down
15 changes: 13 additions & 2 deletions erpnext/assets/doctype/asset/asset.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
"column_break_51",
"purchase_receipt_amount",
"default_finance_book",
"depr_entry_posting_status",
"amended_from"
],
"fields": [
Expand Down Expand Up @@ -473,6 +474,16 @@
"fieldname": "section_break_36",
"fieldtype": "Section Break",
"label": "Finance Books"
},
{
"fieldname": "depr_entry_posting_status",
"fieldtype": "Select",
"hidden": 1,
"label": "Depreciation Entry Posting Status",
"no_copy": 1,
"options": "\nSuccessful\nFailed",
"print_hide": 1,
"read_only": 1
}
],
"idx": 72,
Expand All @@ -487,15 +498,15 @@
{
"group": "Repair",
"link_doctype": "Asset Repair",
"link_fieldname": "asset_name"
"link_fieldname": "asset"
},
{
"group": "Value",
"link_doctype": "Asset Value Adjustment",
"link_fieldname": "asset"
}
],
"modified": "2022-07-20 16:22:44.437579",
"modified": "2023-01-17 00:28:37.789345",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
Expand Down
60 changes: 56 additions & 4 deletions erpnext/assets/doctype/asset/depreciation.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

import frappe
from frappe import _
from frappe.utils import cint, flt, getdate, today
from frappe.utils import cint, flt, get_link_to_form, getdate, today
from frappe.utils.user import get_users_with_role

from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
get_checks_for_pl_and_bs_accounts,
Expand All @@ -20,9 +21,22 @@ def post_depreciation_entries(date=None):

if not date:
date = today()
for asset in get_depreciable_assets(date):
make_depreciation_entry(asset, date)
frappe.db.commit()

failed_asset_names = []

for asset_name in get_depreciable_assets(date):
try:
make_depreciation_entry(asset_name, date)
frappe.db.commit()
except Exception as e:
frappe.db.rollback()
failed_asset_names.append(asset_name)

if failed_asset_names:
set_depr_entry_posting_status_for_failed_assets(failed_asset_names)
notify_depr_entry_posting_error(failed_asset_names)

frappe.db.commit()


def get_depreciable_assets(date):
Expand Down Expand Up @@ -121,6 +135,8 @@ def make_depreciation_entry(asset_name, date=None):
finance_books.value_after_depreciation -= d.depreciation_amount
finance_books.db_update()

frappe.db.set_value("Asset", asset_name, "depr_entry_posting_status", "Successful")

asset.set_status()

return asset
Expand Down Expand Up @@ -184,6 +200,42 @@ def get_credit_and_debit_accounts(accumulated_depreciation_account, depreciation
return credit_account, debit_account


def set_depr_entry_posting_status_for_failed_assets(failed_asset_names):
for asset_name in failed_asset_names:
frappe.db.set_value("Asset", asset_name, "depr_entry_posting_status", "Failed")


def notify_depr_entry_posting_error(failed_asset_names):
recipients = get_users_with_role("Accounts Manager")

if not recipients:
recipients = get_users_with_role("System Manager")

subject = _("Error while posting depreciation entries")

asset_links = get_comma_separated_asset_links(failed_asset_names)

message = (
_("Hi,")
+ "<br>"
+ _("The following assets have failed to post depreciation entries: {0}").format(asset_links)
+ "."
)

frappe.sendmail(recipients=recipients, subject=subject, message=message)


def get_comma_separated_asset_links(asset_names):
asset_links = []

for asset_name in asset_names:
asset_links.append(get_link_to_form("Asset", asset_name))

asset_links = ", ".join(asset_links)

return asset_links


@frappe.whitelist()
def scrap_asset(asset_name):
asset = frappe.get_doc("Asset", asset_name)
Expand Down
1 change: 1 addition & 0 deletions erpnext/assets/doctype/asset/test_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -1387,6 +1387,7 @@ def create_asset(**args):
"location": args.location or "Test Location",
"asset_owner": args.asset_owner or "Company",
"is_existing_asset": args.is_existing_asset or 1,
"depr_entry_posting_status": args.depr_entry_posting_status or "",
}
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ def get_data(filters):
"status",
"department",
"cost_center",
"calculate_depreciation",
"purchase_receipt",
"asset_category",
"purchase_date",
Expand All @@ -98,11 +99,7 @@ def get_data(filters):
assets_record = frappe.db.get_all("Asset", filters=conditions, fields=fields)

for asset in assets_record:
asset_value = (
asset.gross_purchase_amount
- flt(asset.opening_accumulated_depreciation)
- flt(depreciation_amount_map.get(asset.name))
)
asset_value = get_asset_value(asset, filters.finance_book)
row = {
"asset_id": asset.asset_id,
"asset_name": asset.asset_name,
Expand All @@ -125,6 +122,21 @@ def get_data(filters):
return data


def get_asset_value(asset, finance_book=None):
if not asset.calculate_depreciation:
return flt(asset.gross_purchase_amount) - flt(asset.opening_accumulated_depreciation)

finance_book_filter = ["finance_book", "is", "not set"]
if finance_book:
finance_book_filter = ["finance_book", "=", finance_book]

return frappe.db.get_value(
doctype="Asset Finance Book",
filters=[["parent", "=", asset.asset_id], finance_book_filter],
fieldname="value_after_depreciation",
)


def prepare_chart_data(data, filters):
labels_values_map = {}
date_field = frappe.scrub(filters.date_based_on)
Expand Down
2 changes: 1 addition & 1 deletion erpnext/controllers/accounts_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ def validate_inter_company_reference(self):
self.get("inter_company_reference")
or self.get("inter_company_invoice_reference")
or self.get("inter_company_order_reference")
):
) and not self.get("is_return"):
msg = _("Internal Sale or Delivery Reference missing.")
msg += _("Please create purchase from internal sale or delivery document itself")
frappe.throw(msg, title=_("Internal Sales Reference Missing"))
Expand Down
9 changes: 1 addition & 8 deletions erpnext/selling/doctype/quotation/quotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,14 +191,7 @@ def get_list_context(context=None):


@frappe.whitelist()
def make_sales_order(source_name, target_doc=None):
quotation = frappe.db.get_value(
"Quotation", source_name, ["transaction_date", "valid_till"], as_dict=1
)
if quotation.valid_till and (
quotation.valid_till < quotation.transaction_date or quotation.valid_till < getdate(nowdate())
):
frappe.throw(_("Validity period of this quotation has ended."))
def make_sales_order(source_name: str, target_doc=None):
return _make_sales_order(source_name, target_doc)


Expand Down
11 changes: 7 additions & 4 deletions erpnext/selling/doctype/quotation/test_quotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,17 +118,20 @@ def test_make_sales_order_with_terms(self):
sales_order.payment_schedule[1].due_date, getdate(add_days(quotation.transaction_date, 30))
)

def test_valid_till(self):
from erpnext.selling.doctype.quotation.quotation import make_sales_order

def test_valid_till_before_transaction_date(self):
quotation = frappe.copy_doc(test_records[0])
quotation.valid_till = add_days(quotation.transaction_date, -1)
self.assertRaises(frappe.ValidationError, quotation.validate)

def test_so_from_expired_quotation(self):
from erpnext.selling.doctype.quotation.quotation import make_sales_order

quotation = frappe.copy_doc(test_records[0])
quotation.valid_till = add_days(nowdate(), -1)
quotation.insert()
quotation.submit()
self.assertRaises(frappe.ValidationError, make_sales_order, quotation.name)

make_sales_order(quotation.name)

def test_shopping_cart_without_website_item(self):
if frappe.db.exists("Website Item", {"item_code": "_Test Item Home Desktop 100"}):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ def get_data():
},
"internal_links": {
"Quotation": ["items", "prevdoc_docname"],
"Material Request": ["items", "material_request"],
},
"transactions": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -809,7 +809,7 @@
"idx": 1,
"istable": 1,
"links": [],
"modified": "2022-04-27 03:15:34.366563",
"modified": "2022-12-25 02:51:10.247569",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order Item",
Expand All @@ -820,4 +820,4 @@
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
}
1 change: 0 additions & 1 deletion erpnext/stock/doctype/item/test_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ def test_get_item_details(self):
"conversion_factor": 1.0,
"reserved_qty": 1,
"actual_qty": 5,
"ordered_qty": 10,
"projected_qty": 14,
}

Expand Down
3 changes: 2 additions & 1 deletion erpnext/stock/doctype/pick_list/pick_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,8 @@ def validate_for_qty(self):
frappe.throw(_("Qty of Finished Goods Item should be greater than 0."))

def before_print(self, settings=None):
self.group_similar_items()
if self.group_same_items:
self.group_similar_items()

def group_similar_items(self):
group_item_qty = defaultdict(float)
Expand Down
5 changes: 4 additions & 1 deletion erpnext/stock/doctype/pick_list/pick_list_dashboard.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
def get_data():
return {
"fieldname": "pick_list",
"internal_links": {
"Sales Order": ["locations", "sales_order"],
},
"transactions": [
{"items": ["Stock Entry", "Delivery Note"]},
{"items": ["Stock Entry", "Sales Order", "Delivery Note"]},
],
}
9 changes: 7 additions & 2 deletions erpnext/stock/doctype/pick_list/test_pick_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,10 +432,10 @@ def _compare_dicts(a, b):
pl.before_print()
self.assertEqual(len(pl.locations), 4)

# grouping should halve the number of items
# grouping should not happen if group_same_items is False
pl = frappe.get_doc(
doctype="Pick List",
group_same_items=True,
group_same_items=False,
locations=[
_dict(item_code="A", warehouse="X", qty=5, picked_qty=1),
_dict(item_code="B", warehouse="Y", qty=4, picked_qty=2),
Expand All @@ -444,6 +444,11 @@ def _compare_dicts(a, b):
],
)
pl.before_print()
self.assertEqual(len(pl.locations), 4)

# grouping should halve the number of items
pl.group_same_items = True
pl.before_print()
self.assertEqual(len(pl.locations), 2)

expected_items = [
Expand Down
3 changes: 1 addition & 2 deletions erpnext/stock/get_item_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -1161,7 +1161,7 @@ def get_projected_qty(item_code, warehouse):

@frappe.whitelist()
def get_bin_details(item_code, warehouse, company=None, include_child_warehouses=False):
bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0, "ordered_qty": 0}
bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0}

if warehouse:
from frappe.query_builder.functions import Coalesce, Sum
Expand All @@ -1177,7 +1177,6 @@ def get_bin_details(item_code, warehouse, company=None, include_child_warehouses
Coalesce(Sum(bin.projected_qty), 0).as_("projected_qty"),
Coalesce(Sum(bin.actual_qty), 0).as_("actual_qty"),
Coalesce(Sum(bin.reserved_qty), 0).as_("reserved_qty"),
Coalesce(Sum(bin.ordered_qty), 0).as_("ordered_qty"),
)
.where((bin.item_code == item_code) & (bin.warehouse.isin(warehouses)))
).run(as_dict=True)[0]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def get_data(report_filters):
key = (d.voucher_type, d.voucher_no)
gl_data = voucher_wise_gl_data.get(key) or {}
d.account_value = gl_data.get("account_value", 0)
d.difference_value = abs(d.stock_value - d.account_value)
d.difference_value = d.stock_value - d.account_value
if abs(d.difference_value) > 0.1:
data.append(d)

Expand Down
14 changes: 0 additions & 14 deletions erpnext/stock/stock_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -1184,20 +1184,6 @@ def get_valuation_rate(
(item_code, warehouse, voucher_no, voucher_type),
)

if not last_valuation_rate:
# Get valuation rate from last sle for the item against any warehouse
last_valuation_rate = frappe.db.sql(
"""select valuation_rate
from `tabStock Ledger Entry` force index (item_code)
where
item_code = %s
AND valuation_rate > 0
AND is_cancelled = 0
AND NOT(voucher_no = %s AND voucher_type = %s)
order by posting_date desc, posting_time desc, name desc limit 1""",
(item_code, voucher_no, voucher_type),
)

if last_valuation_rate:
return flt(last_valuation_rate[0][0])

Expand Down