mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-27 00:44:45 +00:00
chore: resolve conflicts
This commit is contained in:
@@ -3,35 +3,6 @@
|
|||||||
|
|
||||||
frappe.ui.form.on("Accounts Settings", {
|
frappe.ui.form.on("Accounts Settings", {
|
||||||
refresh: function (frm) {},
|
refresh: function (frm) {},
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
enable_immutable_ledger: function (frm) {
|
|
||||||
if (!frm.doc.enable_immutable_ledger) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let msg = __("Enabling this will change the way how cancelled transactions are handled.");
|
|
||||||
msg += " ";
|
|
||||||
msg += __("Please enable only if the understand the effects of enabling this.");
|
|
||||||
msg += "<br>";
|
|
||||||
msg += __("Do you still want to enable immutable ledger?");
|
|
||||||
|
|
||||||
frappe.confirm(
|
|
||||||
msg,
|
|
||||||
() => {},
|
|
||||||
() => {
|
|
||||||
frm.set_value("enable_immutable_ledger", 0);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},
|
|
||||||
|
|
||||||
add_taxes_from_taxes_and_charges_template(frm) {
|
|
||||||
toggle_tax_settings(frm, "add_taxes_from_taxes_and_charges_template");
|
|
||||||
},
|
|
||||||
|
|
||||||
add_taxes_from_item_tax_template(frm) {
|
|
||||||
toggle_tax_settings(frm, "add_taxes_from_item_tax_template");
|
|
||||||
},
|
|
||||||
|
|
||||||
drop_ar_procedures: function (frm) {
|
drop_ar_procedures: function (frm) {
|
||||||
frm.call({
|
frm.call({
|
||||||
@@ -42,5 +13,4 @@ frappe.ui.form.on("Accounts Settings", {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
>>>>>>> da32bb5f51 (refactor: utility to drop existing procedures and include cost center)
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -501,72 +501,6 @@
|
|||||||
"fieldname": "legacy_section",
|
"fieldname": "legacy_section",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Legacy Fields"
|
"label": "Legacy Fields"
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"fieldname": "maintain_same_internal_transaction_rate",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Maintain Same Rate Throughout Internal Transaction"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "Stop",
|
|
||||||
"depends_on": "maintain_same_internal_transaction_rate",
|
|
||||||
"fieldname": "maintain_same_rate_action",
|
|
||||||
"fieldtype": "Select",
|
|
||||||
"label": "Action if Same Rate is Not Maintained Throughout Internal Transaction",
|
|
||||||
"mandatory_depends_on": "maintain_same_internal_transaction_rate",
|
|
||||||
"options": "Stop\nWarn"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"depends_on": "eval: doc.maintain_same_internal_transaction_rate && doc.maintain_same_rate_action == 'Stop'",
|
|
||||||
"fieldname": "role_to_override_stop_action",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"label": "Role Allowed to Override Stop Action",
|
|
||||||
"options": "Role"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "budget_settings",
|
|
||||||
"fieldtype": "Tab Break",
|
|
||||||
"label": "Budget"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "1",
|
|
||||||
"fieldname": "use_new_budget_controller",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Use New Budget Controller"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "1",
|
|
||||||
"description": "If enabled, user will be alerted before resetting posting date to current date in relevant transactions",
|
|
||||||
"fieldname": "confirm_before_resetting_posting_date",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Confirm before resetting posting date"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "item_price_settings_section",
|
|
||||||
"fieldtype": "Section Break",
|
|
||||||
"label": "Item Price Settings"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"fieldname": "column_break_feyo",
|
|
||||||
"fieldtype": "Column Break"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"description": "System will do an implicit conversion using the pegged currency. <br>\nEx: Instead of AED -> INR, system will do AED -> USD -> INR using the pegged exchange rate of AED against USD.",
|
|
||||||
"documentation_url": "/app/pegged-currencies/Pegged Currencies",
|
|
||||||
"fieldname": "allow_pegged_currencies_exchange_rates",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Allow Implicit Pegged Currency Conversion"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"default": "0",
|
|
||||||
"description": "If no taxes are set, and Taxes and Charges Template is selected, the system will automatically apply the taxes from the chosen template.",
|
|
||||||
"fieldname": "add_taxes_from_taxes_and_charges_template",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"label": "Automatically Add Taxes from Taxes and Charges Template"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "column_break_ntmi",
|
"fieldname": "column_break_ntmi",
|
||||||
@@ -578,7 +512,6 @@
|
|||||||
"fieldname": "drop_ar_procedures",
|
"fieldname": "drop_ar_procedures",
|
||||||
"fieldtype": "Button",
|
"fieldtype": "Button",
|
||||||
"label": "Drop Procedures"
|
"label": "Drop Procedures"
|
||||||
>>>>>>> da32bb5f51 (refactor: utility to drop existing procedures and include cost center)
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "icon-cog",
|
"icon": "icon-cog",
|
||||||
|
|||||||
@@ -14,70 +14,6 @@ from erpnext.stock.utils import check_pending_reposting
|
|||||||
|
|
||||||
|
|
||||||
class AccountsSettings(Document):
|
class AccountsSettings(Document):
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
# begin: auto-generated types
|
|
||||||
# This code is auto-generated. Do not modify anything in this block.
|
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from frappe.types import DF
|
|
||||||
|
|
||||||
acc_frozen_upto: DF.Date | None
|
|
||||||
add_taxes_from_item_tax_template: DF.Check
|
|
||||||
add_taxes_from_taxes_and_charges_template: DF.Check
|
|
||||||
allow_multi_currency_invoices_against_single_party_account: DF.Check
|
|
||||||
allow_pegged_currencies_exchange_rates: DF.Check
|
|
||||||
allow_stale: DF.Check
|
|
||||||
auto_reconcile_payments: DF.Check
|
|
||||||
auto_reconciliation_job_trigger: DF.Int
|
|
||||||
automatically_fetch_payment_terms: DF.Check
|
|
||||||
automatically_process_deferred_accounting_entry: DF.Check
|
|
||||||
book_asset_depreciation_entry_automatically: DF.Check
|
|
||||||
book_deferred_entries_based_on: DF.Literal["Days", "Months"]
|
|
||||||
book_deferred_entries_via_journal_entry: DF.Check
|
|
||||||
book_tax_discount_loss: DF.Check
|
|
||||||
calculate_depr_using_total_days: DF.Check
|
|
||||||
check_supplier_invoice_uniqueness: DF.Check
|
|
||||||
confirm_before_resetting_posting_date: DF.Check
|
|
||||||
create_pr_in_draft_status: DF.Check
|
|
||||||
credit_controller: DF.Link | None
|
|
||||||
delete_linked_ledger_entries: DF.Check
|
|
||||||
determine_address_tax_category_from: DF.Literal["Billing Address", "Shipping Address"]
|
|
||||||
enable_common_party_accounting: DF.Check
|
|
||||||
enable_fuzzy_matching: DF.Check
|
|
||||||
enable_immutable_ledger: DF.Check
|
|
||||||
enable_party_matching: DF.Check
|
|
||||||
exchange_gain_loss_posting_date: DF.Literal["Invoice", "Payment", "Reconciliation Date"]
|
|
||||||
frozen_accounts_modifier: DF.Link | None
|
|
||||||
general_ledger_remarks_length: DF.Int
|
|
||||||
ignore_account_closing_balance: DF.Check
|
|
||||||
ignore_is_opening_check_for_reporting: DF.Check
|
|
||||||
maintain_same_internal_transaction_rate: DF.Check
|
|
||||||
maintain_same_rate_action: DF.Literal["Stop", "Warn"]
|
|
||||||
make_payment_via_journal_entry: DF.Check
|
|
||||||
merge_similar_account_heads: DF.Check
|
|
||||||
over_billing_allowance: DF.Currency
|
|
||||||
post_change_gl_entries: DF.Check
|
|
||||||
receivable_payable_fetch_method: DF.Literal["Buffered Cursor", "UnBuffered Cursor", "Raw SQL"]
|
|
||||||
receivable_payable_remarks_length: DF.Int
|
|
||||||
reconciliation_queue_size: DF.Int
|
|
||||||
role_allowed_to_over_bill: DF.Link | None
|
|
||||||
role_to_override_stop_action: DF.Link | None
|
|
||||||
round_row_wise_tax: DF.Check
|
|
||||||
show_balance_in_coa: DF.Check
|
|
||||||
show_inclusive_tax_in_print: DF.Check
|
|
||||||
show_payment_schedule_in_print: DF.Check
|
|
||||||
show_taxes_as_table_in_print: DF.Check
|
|
||||||
stale_days: DF.Int
|
|
||||||
submit_journal_entries: DF.Check
|
|
||||||
unlink_advance_payment_on_cancelation_of_order: DF.Check
|
|
||||||
unlink_payment_on_cancellation_of_invoice: DF.Check
|
|
||||||
use_new_budget_controller: DF.Check
|
|
||||||
# end: auto-generated types
|
|
||||||
|
|
||||||
>>>>>>> 8cf8f6abad (refactor: introduce sql option for data fetch)
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
old_doc = self.get_doc_before_save()
|
old_doc = self.get_doc_before_save()
|
||||||
clear_cache = False
|
clear_cache = False
|
||||||
@@ -129,32 +65,6 @@ class AccountsSettings(Document):
|
|||||||
def validate_pending_reposts(self):
|
def validate_pending_reposts(self):
|
||||||
if self.acc_frozen_upto:
|
if self.acc_frozen_upto:
|
||||||
check_pending_reposting(self.acc_frozen_upto)
|
check_pending_reposting(self.acc_frozen_upto)
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
|
|
||||||
def validate_and_sync_auto_reconcile_config(self):
|
|
||||||
if self.has_value_changed("auto_reconciliation_job_trigger"):
|
|
||||||
if (
|
|
||||||
cint(self.auto_reconciliation_job_trigger) > 0
|
|
||||||
and cint(self.auto_reconciliation_job_trigger) < 60
|
|
||||||
):
|
|
||||||
sync_auto_reconcile_config(self.auto_reconciliation_job_trigger)
|
|
||||||
else:
|
|
||||||
frappe.throw(_("Cron Interval should be between 1 and 59 Min"))
|
|
||||||
|
|
||||||
if self.has_value_changed("reconciliation_queue_size"):
|
|
||||||
if cint(self.reconciliation_queue_size) < 5 or cint(self.reconciliation_queue_size) > 100:
|
|
||||||
frappe.throw(_("Queue Size should be between 5 and 100"))
|
|
||||||
|
|
||||||
def validate_auto_tax_settings(self):
|
|
||||||
if self.add_taxes_from_item_tax_template and self.add_taxes_from_taxes_and_charges_template:
|
|
||||||
frappe.throw(
|
|
||||||
_("You cannot enable both the settings '{0}' and '{1}'.").format(
|
|
||||||
frappe.bold(_(self.meta.get_label("add_taxes_from_item_tax_template"))),
|
|
||||||
frappe.bold(_(self.meta.get_label("add_taxes_from_taxes_and_charges_template"))),
|
|
||||||
),
|
|
||||||
title=_("Auto Tax Settings Error"),
|
|
||||||
)
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def drop_ar_sql_procedures(self):
|
def drop_ar_sql_procedures(self):
|
||||||
@@ -163,4 +73,3 @@ class AccountsSettings(Document):
|
|||||||
frappe.db.sql(f"drop function if exists {InitSQLProceduresForAR.genkey_function_name}")
|
frappe.db.sql(f"drop function if exists {InitSQLProceduresForAR.genkey_function_name}")
|
||||||
frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.init_procedure_name}")
|
frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.init_procedure_name}")
|
||||||
frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.allocate_procedure_name}")
|
frappe.db.sql(f"drop procedure if exists {InitSQLProceduresForAR.allocate_procedure_name}")
|
||||||
>>>>>>> da32bb5f51 (refactor: utility to drop existing procedures and include cost center)
|
|
||||||
|
|||||||
@@ -6,14 +6,7 @@ from collections import OrderedDict
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, qb, query_builder, scrub
|
from frappe import _, qb, query_builder, scrub
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
from frappe.database.schema import get_definition
|
from frappe.database.schema import get_definition
|
||||||
<<<<<<< HEAD
|
|
||||||
from frappe.desk.reportview import build_match_conditions
|
|
||||||
>>>>>>> 9d0ebe3427 (refactor: dynamic DB field types)
|
|
||||||
=======
|
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
from frappe.query_builder import Criterion
|
from frappe.query_builder import Criterion
|
||||||
from frappe.query_builder.functions import Date, Substring, Sum
|
from frappe.query_builder.functions import Date, Substring, Sum
|
||||||
from frappe.utils import cint, cstr, flt, getdate, nowdate
|
from frappe.utils import cint, cstr, flt, getdate, nowdate
|
||||||
@@ -22,16 +15,10 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
|
|||||||
get_accounting_dimensions,
|
get_accounting_dimensions,
|
||||||
get_dimension_with_children,
|
get_dimension_with_children,
|
||||||
)
|
)
|
||||||
<<<<<<< HEAD
|
|
||||||
from erpnext.accounts.utils import get_currency_precision
|
|
||||||
=======
|
|
||||||
from erpnext.accounts.utils import (
|
from erpnext.accounts.utils import (
|
||||||
build_qb_match_conditions,
|
build_qb_match_conditions,
|
||||||
get_advance_payment_doctypes,
|
|
||||||
get_currency_precision,
|
get_currency_precision,
|
||||||
get_party_types_from_account_type,
|
|
||||||
)
|
)
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
|
|
||||||
# This report gives a summary of all Outstanding Invoices considering the following
|
# This report gives a summary of all Outstanding Invoices considering the following
|
||||||
|
|
||||||
@@ -108,9 +95,6 @@ class ReceivablePayableReport:
|
|||||||
def get_data(self):
|
def get_data(self):
|
||||||
self.get_sales_invoices_or_customers_based_on_sales_person()
|
self.get_sales_invoices_or_customers_based_on_sales_person()
|
||||||
|
|
||||||
# Build delivery note map against all sales invoices
|
|
||||||
self.build_delivery_note_map()
|
|
||||||
|
|
||||||
# Get invoice details like bill_no, due_date etc for all invoices
|
# Get invoice details like bill_no, due_date etc for all invoices
|
||||||
self.get_invoice_details()
|
self.get_invoice_details()
|
||||||
|
|
||||||
@@ -131,33 +115,16 @@ class ReceivablePayableReport:
|
|||||||
self.fetch_ple_in_buffered_cursor()
|
self.fetch_ple_in_buffered_cursor()
|
||||||
elif self.ple_fetch_method == "UnBuffered Cursor":
|
elif self.ple_fetch_method == "UnBuffered Cursor":
|
||||||
self.fetch_ple_in_unbuffered_cursor()
|
self.fetch_ple_in_unbuffered_cursor()
|
||||||
<<<<<<< HEAD
|
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
self.init_and_run_sql_procedures()
|
|
||||||
=======
|
|
||||||
elif self.ple_fetch_method == "Raw SQL":
|
elif self.ple_fetch_method == "Raw SQL":
|
||||||
<<<<<<< HEAD
|
|
||||||
self.init_and_run_sql_procedures()
|
|
||||||
>>>>>>> e90c6a33bd (refactor: call procedures based on config)
|
|
||||||
=======
|
|
||||||
self.fetch_ple_in_sql_procedures()
|
self.fetch_ple_in_sql_procedures()
|
||||||
>>>>>>> fc8ca7d82c (chore: rename method)
|
|
||||||
|
|
||||||
# Build delivery note map against all sales invoices
|
# Build delivery note map against all sales invoices
|
||||||
self.build_delivery_note_map()
|
self.build_delivery_note_map()
|
||||||
|
|
||||||
>>>>>>> e5920c57aa (refactor: using sql procedures for AR report)
|
|
||||||
self.build_data()
|
self.build_data()
|
||||||
|
|
||||||
def fetch_ple_in_buffered_cursor(self):
|
def fetch_ple_in_buffered_cursor(self):
|
||||||
<<<<<<< HEAD
|
|
||||||
query, param = self.ple_query.walk()
|
|
||||||
self.ple_entries = frappe.db.sql(query, param, as_dict=True)
|
|
||||||
=======
|
|
||||||
self.ple_entries = self.ple_query.run(as_dict=True)
|
self.ple_entries = self.ple_query.run(as_dict=True)
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
|
|
||||||
for ple in self.ple_entries:
|
for ple in self.ple_entries:
|
||||||
self.init_voucher_balance(ple) # invoiced, paid, credit_note, outstanding
|
self.init_voucher_balance(ple) # invoiced, paid, credit_note, outstanding
|
||||||
@@ -170,10 +137,6 @@ class ReceivablePayableReport:
|
|||||||
|
|
||||||
def fetch_ple_in_unbuffered_cursor(self):
|
def fetch_ple_in_unbuffered_cursor(self):
|
||||||
self.ple_entries = []
|
self.ple_entries = []
|
||||||
<<<<<<< HEAD
|
|
||||||
query, param = self.ple_query.walk()
|
|
||||||
=======
|
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
with frappe.db.unbuffered_cursor():
|
with frappe.db.unbuffered_cursor():
|
||||||
for ple in self.ple_query.run(as_dict=True, as_iterator=True):
|
for ple in self.ple_query.run(as_dict=True, as_iterator=True):
|
||||||
self.init_voucher_balance(ple) # invoiced, paid, credit_note, outstanding
|
self.init_voucher_balance(ple) # invoiced, paid, credit_note, outstanding
|
||||||
@@ -953,12 +916,9 @@ class ReceivablePayableReport:
|
|||||||
else:
|
else:
|
||||||
query = query.select(ple.remarks)
|
query = query.select(ple.remarks)
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
if match_conditions := build_qb_match_conditions("Payment Ledger Entry"):
|
if match_conditions := build_qb_match_conditions("Payment Ledger Entry"):
|
||||||
query = query.where(Criterion.all(match_conditions))
|
query = query.where(Criterion.all(match_conditions))
|
||||||
|
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
if self.filters.get("group_by_party"):
|
if self.filters.get("group_by_party"):
|
||||||
query = query.orderby(self.ple.party, self.ple.posting_date)
|
query = query.orderby(self.ple.party, self.ple.posting_date)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -2192,43 +2192,6 @@ def run_ledger_health_checks():
|
|||||||
doc.general_and_payment_ledger_mismatch = True
|
doc.general_and_payment_ledger_mismatch = True
|
||||||
doc.checked_on = run_date
|
doc.checked_on = run_date
|
||||||
doc.save()
|
doc.save()
|
||||||
<<<<<<< HEAD
|
|
||||||
=======
|
|
||||||
|
|
||||||
|
|
||||||
def sync_auto_reconcile_config(auto_reconciliation_job_trigger: int = 15):
|
|
||||||
auto_reconciliation_job_trigger = auto_reconciliation_job_trigger or frappe.get_single_value(
|
|
||||||
"Accounts Settings", "auto_reconciliation_job_trigger"
|
|
||||||
)
|
|
||||||
method = "erpnext.accounts.doctype.process_payment_reconciliation.process_payment_reconciliation.trigger_reconciliation_for_queued_docs"
|
|
||||||
|
|
||||||
sch_event = frappe.get_doc(
|
|
||||||
"Scheduler Event", {"scheduled_against": "Process Payment Reconciliation", "method": method}
|
|
||||||
)
|
|
||||||
if frappe.db.get_value("Scheduled Job Type", {"method": method}):
|
|
||||||
frappe.get_doc(
|
|
||||||
"Scheduled Job Type",
|
|
||||||
{
|
|
||||||
"method": method,
|
|
||||||
},
|
|
||||||
).update(
|
|
||||||
{
|
|
||||||
"cron_format": f"0/{auto_reconciliation_job_trigger} * * * *",
|
|
||||||
"scheduler_event": sch_event.name,
|
|
||||||
}
|
|
||||||
).save()
|
|
||||||
else:
|
|
||||||
frappe.get_doc(
|
|
||||||
{
|
|
||||||
"doctype": "Scheduled Job Type",
|
|
||||||
"method": method,
|
|
||||||
"scheduler_event": sch_event.name,
|
|
||||||
"cron_format": f"0/{auto_reconciliation_job_trigger} * * * *",
|
|
||||||
"create_log": True,
|
|
||||||
"stopped": False,
|
|
||||||
"frequency": "Cron",
|
|
||||||
}
|
|
||||||
).save()
|
|
||||||
|
|
||||||
|
|
||||||
def build_qb_match_conditions(doctype, user=None) -> list:
|
def build_qb_match_conditions(doctype, user=None) -> list:
|
||||||
@@ -2245,4 +2208,3 @@ def build_qb_match_conditions(doctype, user=None) -> list:
|
|||||||
criterion.append(_dt[fieldname].isin(names))
|
criterion.append(_dt[fieldname].isin(names))
|
||||||
|
|
||||||
return criterion
|
return criterion
|
||||||
>>>>>>> 7efeed54de (refactor: build and pass match conditions as qb criterion)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user