Merge pull request #38742 from ljain112/fix-pur-reg
diff --git a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
index ba946c3..d045d91 100644
--- a/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
+++ b/erpnext/accounts/report/tax_withholding_details/tax_withholding_details.py
@@ -345,21 +345,16 @@
if filters.get("party"):
party = [filters.get("party")]
- query = query.where(
- ((gle.account.isin(tds_accounts) & gle.against.isin(party)))
- | ((gle.voucher_type == "Journal Entry") & (gle.party == filters.get("party")))
- | gle.party.isin(party)
+ jv_condition = gle.against.isin(party) | (
+ (gle.voucher_type == "Journal Entry") & (gle.party == filters.get("party"))
)
else:
party = frappe.get_all(filters.get("party_type"), pluck="name")
- query = query.where(
- ((gle.account.isin(tds_accounts) & gle.against.isin(party)))
- | (
- (gle.voucher_type == "Journal Entry")
- & ((gle.party_type == filters.get("party_type")) | (gle.party_type == ""))
- )
- | gle.party.isin(party)
+ jv_condition = gle.against.isin(party) | (
+ (gle.voucher_type == "Journal Entry")
+ & ((gle.party_type == filters.get("party_type")) | (gle.party_type == ""))
)
+ query = query.where((gle.account.isin(tds_accounts) & jv_condition) | gle.party.isin(party))
return query
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 6b59827..0f21c86 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -662,8 +662,10 @@
"total_amount": d.grand_total,
"outstanding_amount": d.outstanding_amount,
"allocated_amount": d.allocated_amount,
- "exchange_rate": d.exchange_rate if d.exchange_gain_loss else payment_entry.get_exchange_rate(),
- "exchange_gain_loss": d.exchange_gain_loss,
+ "exchange_rate": d.exchange_rate
+ if d.difference_amount is not None
+ else payment_entry.get_exchange_rate(),
+ "exchange_gain_loss": d.difference_amount,
"account": d.account,
}
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index abcea44..05c6a35 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -166,6 +166,7 @@
self.disable_pricing_rule_on_internal_transfer()
self.disable_tax_included_prices_for_internal_transfer()
self.set_incoming_rate()
+ self.init_internal_values()
if self.meta.get_field("currency"):
self.calculate_taxes_and_totals()
@@ -225,6 +226,16 @@
self.set_total_in_words()
+ def init_internal_values(self):
+ # init all the internal values as 0 on sa
+ if self.docstatus.is_draft():
+ # TODO: Add all such pending values here
+ fields = ["billed_amt", "delivered_qty"]
+ for item in self.get("items"):
+ for field in fields:
+ if hasattr(item, field):
+ item.set(field, 0)
+
def before_cancel(self):
validate_einvoice_fields(self)
diff --git a/erpnext/crm/doctype/lead/lead.json b/erpnext/crm/doctype/lead/lead.json
index dafbd9f..92f446d 100644
--- a/erpnext/crm/doctype/lead/lead.json
+++ b/erpnext/crm/doctype/lead/lead.json
@@ -516,7 +516,7 @@
"idx": 5,
"image_field": "image",
"links": [],
- "modified": "2023-08-28 22:28:00.104413",
+ "modified": "2023-12-01 18:46:49.468526",
"modified_by": "Administrator",
"module": "CRM",
"name": "Lead",
@@ -577,6 +577,7 @@
],
"search_fields": "lead_name,lead_owner,status",
"sender_field": "email_id",
+ "sender_name_field": "lead_name",
"show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "DESC",
diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py
index ef6cfb0..f3c7e57 100644
--- a/erpnext/crm/doctype/lead/lead.py
+++ b/erpnext/crm/doctype/lead/lead.py
@@ -16,6 +16,7 @@
from erpnext.accounts.party import set_taxes
from erpnext.controllers.selling_controller import SellingController
from erpnext.crm.utils import CRMNote, copy_comments, link_communications, link_open_events
+from erpnext.selling.doctype.customer.customer import parse_full_name
class Lead(SellingController, CRMNote):
@@ -113,6 +114,10 @@
return
self.contact_doc = self.create_contact()
+ # leads created by email inbox only have the full name set
+ if self.lead_name and not any([self.first_name, self.middle_name, self.last_name]):
+ self.first_name, self.middle_name, self.last_name = parse_full_name(self.lead_name)
+
def after_insert(self):
self.link_to_contact()
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 0de100a..9b070bd 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -351,5 +351,6 @@
erpnext.patches.v14_0.create_accounting_dimensions_in_supplier_quotation
erpnext.patches.v14_0.update_zero_asset_quantity_field
execute:frappe.db.set_single_value("Buying Settings", "project_update_frequency", "Each Transaction")
+execute:frappe.db.set_default("date_format", frappe.db.get_single_value("System Settings", "date_format"))
# below migration patch should always run last
erpnext.patches.v14_0.migrate_gl_to_payment_ledger
diff --git a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
index 793497b..ddce997 100644
--- a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
+++ b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
@@ -3,6 +3,7 @@
def execute():
frappe.reload_doc("assets", "doctype", "Asset Depreciation Schedule")
+ frappe.reload_doc("assets", "doctype", "Asset Finance Book")
assets = get_details_of_draft_or_submitted_depreciable_assets()
@@ -86,6 +87,7 @@
afb.frequency_of_depreciation,
afb.rate_of_depreciation,
afb.expected_value_after_useful_life,
+ afb.daily_prorata_based,
afb.shift_based,
)
.where(asset.docstatus < 2)
diff --git a/erpnext/portal/doctype/homepage/homepage.js b/erpnext/portal/doctype/homepage/homepage.js
index 6797904..6739979 100644
--- a/erpnext/portal/doctype/homepage/homepage.js
+++ b/erpnext/portal/doctype/homepage/homepage.js
@@ -2,14 +2,6 @@
// For license information, please see license.txt
frappe.ui.form.on('Homepage', {
- setup: function(frm) {
- frm.fields_dict["products"].grid.get_field("item").get_query = function() {
- return {
- filters: {'published': 1}
- }
- }
- },
-
refresh: function(frm) {
frm.add_custom_button(__('Set Meta Tags'), () => {
frappe.utils.set_meta_tag('home');
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index e9d06df..b0ea568 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -1077,7 +1077,7 @@
}
function get_time_left(timestamp, agreement_status) {
- const diff = moment(timestamp).diff(moment());
+ const diff = moment(timestamp).diff(frappe.datetime.system_datetime(true));
const diff_display = diff >= 44500 ? moment.duration(diff).humanize() : 'Failed';
let indicator = (diff_display == 'Failed' && agreement_status != 'Fulfilled') ? 'red' : 'green';
return {'diff_display': diff_display, 'indicator': indicator};
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index d1214fd..7a1d5e2 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -85,8 +85,6 @@
except frappe.ValidationError:
pass
- frappe.db.set_default("date_format", "dd-mm-yyyy")
-
setup_currency_exchange()
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 9673a70..d90b71a 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -199,9 +199,8 @@
get_item_data: function(frm, item, overwrite_warehouse=false) {
if (item && !item.item_code) { return; }
- frm.call({
+ frappe.call({
method: "erpnext.stock.get_item_details.get_item_details",
- child: item,
args: {
args: {
item_code: item.item_code,
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index a59f9de..ed84a5c 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -413,7 +413,7 @@
"fieldname": "bal_val",
"fieldtype": "Currency",
"width": 100,
- "options": "currency",
+ "options": "Company:company:default_currency",
},
{
"label": _("Opening Qty"),
@@ -427,7 +427,7 @@
"fieldname": "opening_val",
"fieldtype": "Currency",
"width": 110,
- "options": "currency",
+ "options": "Company:company:default_currency",
},
{
"label": _("In Qty"),
diff --git a/erpnext/templates/pages/home.html b/erpnext/templates/pages/home.html
index 08e0432..b9b435c 100644
--- a/erpnext/templates/pages/home.html
+++ b/erpnext/templates/pages/home.html
@@ -26,6 +26,26 @@
{{ render_homepage_section(homepage.hero_section_doc) }}
{% endif %}
+ {% if homepage.products %}
+ <section class="container section-products my-5">
+ <h3>{{ _('Products') }}</h3>
+
+ <div class="row">
+ {% for item in homepage.products %}
+ <div class="col-md-4 mb-4">
+ <div class="card h-100 justify-content-between">
+ <img class="card-img-top website-image-extra-large" src="{{ item.image }}" loading="lazy" alt="{{ item.item_name }}"></img>
+ <div class="card-body flex-grow-0">
+ <h5 class="card-title">{{ item.item_name }}</h5>
+ <a href="{{ item.route }}" class="card-link">{{ _('More details') }}</a>
+ </div>
+ </div>
+ </div>
+ {% endfor %}
+ </div>
+ </section>
+ {% endif %}
+
{% if blogs %}
<section class="container my-5">
<h3>{{ _('Publications') }}</h3>