Merge pull request #37015 from s-aga-r/REMOVE-WOOCOMMERCE
refactor!: remove `woocommerce` integration
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index 2c2efc0..8a894e2 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -98,7 +98,6 @@
if self.difference_amount:
frappe.throw(_("Difference Amount must be zero"))
self.make_gl_entries()
- self.make_advance_gl_entries()
self.update_outstanding_amounts()
self.update_advance_paid()
self.update_payment_schedule()
@@ -152,7 +151,6 @@
)
super(PaymentEntry, self).on_cancel()
self.make_gl_entries(cancel=1)
- self.make_advance_gl_entries(cancel=1)
self.update_outstanding_amounts()
self.update_advance_paid()
self.delink_advance_entry_references()
@@ -1060,6 +1058,8 @@
else:
self.make_exchange_gain_loss_journal()
+ self.make_advance_gl_entries(cancel=cancel)
+
def add_party_gl_entries(self, gl_entries):
if self.party_account:
if self.payment_type == "Receive":
@@ -1128,7 +1128,7 @@
if self.book_advance_payments_in_separate_party_account:
gl_entries = []
for d in self.get("references"):
- if d.reference_doctype in ("Sales Invoice", "Purchase Invoice"):
+ if d.reference_doctype in ("Sales Invoice", "Purchase Invoice", "Journal Entry"):
if not (against_voucher_type and against_voucher) or (
d.reference_doctype == against_voucher_type and d.reference_name == against_voucher
):
@@ -1164,6 +1164,13 @@
"voucher_detail_no": invoice.name,
}
+ posting_date = frappe.db.get_value(
+ invoice.reference_doctype, invoice.reference_name, "posting_date"
+ )
+
+ if getdate(posting_date) < getdate(self.posting_date):
+ posting_date = self.posting_date
+
dr_or_cr = "credit" if invoice.reference_doctype == "Sales Invoice" else "debit"
args_dict["account"] = invoice.account
args_dict[dr_or_cr] = invoice.allocated_amount
@@ -1172,6 +1179,7 @@
{
"against_voucher_type": invoice.reference_doctype,
"against_voucher": invoice.reference_name,
+ "posting_date": posting_date,
}
)
gle = self.get_gl_dict(
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index 7b7ce7a..d9f00be 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -24,7 +24,8 @@
filters: {
"company": this.frm.doc.company,
"is_group": 0,
- "account_type": frappe.boot.party_account_types[this.frm.doc.party_type]
+ "account_type": frappe.boot.party_account_types[this.frm.doc.party_type],
+ "root_type": this.frm.doc.party_type == 'Customer' ? "Asset" : "Liability"
}
};
});
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
index 6fdcf26..fd95c1f 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice_dashboard.py
@@ -15,9 +15,11 @@
},
"internal_links": {
"Sales Order": ["items", "sales_order"],
- "Delivery Note": ["items", "delivery_note"],
"Timesheet": ["timesheets", "time_sheet"],
},
+ "internal_and_external_links": {
+ "Delivery Note": ["items", "delivery_note"],
+ },
"transactions": [
{
"label": _("Payment"),
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index ae24675..79bfd78 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -434,6 +434,7 @@
for gle in gl_entries:
group_by_value = gle.get(group_by)
+ gle.voucher_type = _(gle.voucher_type)
if gle.posting_date < from_date or (cstr(gle.is_opening) == "Yes" and not show_opening_entries):
if not group_by_voucher_consolidated:
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index eed74a5..6a80f20 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -491,14 +491,13 @@
gl_map = doc.build_gl_map()
create_payment_ledger_entry(gl_map, update_outstanding="No", cancel=0, adv_adj=1)
- if voucher_type == "Payment Entry":
- doc.make_advance_gl_entries()
-
# Only update outstanding for newly linked vouchers
for entry in entries:
update_voucher_outstanding(
entry.against_voucher_type, entry.against_voucher, entry.account, entry.party_type, entry.party
)
+ if voucher_type == "Payment Entry":
+ doc.make_advance_gl_entries(entry.against_voucher_type, entry.against_voucher)
frappe.flags.ignore_party_validation = False
@@ -1163,8 +1162,13 @@
def parse_naming_series_variable(doc, variable):
if variable == "FY":
- date = doc.get("posting_date") or doc.get("transaction_date") or getdate()
- return get_fiscal_year(date=date, company=doc.get("company"))[0]
+ if doc:
+ date = doc.get("posting_date") or doc.get("transaction_date")
+ company = doc.get("company")
+ else:
+ date = getdate()
+ company = None
+ return get_fiscal_year(date=date, company=company)[0]
@frappe.whitelist()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index b242108..5b5cc2b 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -1173,6 +1173,7 @@
"depends_on": "is_internal_supplier",
"fieldname": "set_from_warehouse",
"fieldtype": "Link",
+ "ignore_user_permissions": 1,
"label": "Set From Warehouse",
"options": "Warehouse"
},
@@ -1273,7 +1274,7 @@
"idx": 105,
"is_submittable": 1,
"links": [],
- "modified": "2023-06-03 16:19:45.710444",
+ "modified": "2023-09-13 16:21:07.361700",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order",
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
index 414f086..f79b622 100644
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
@@ -878,6 +878,7 @@
"depends_on": "eval:parent.is_internal_supplier",
"fieldname": "from_warehouse",
"fieldtype": "Link",
+ "ignore_user_permissions": 1,
"label": "From Warehouse",
"options": "Warehouse"
},
@@ -902,7 +903,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2023-08-17 10:17:40.893393",
+ "modified": "2023-09-13 16:22:40.825092",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Order Item",
diff --git a/erpnext/buying/doctype/supplier/supplier.js b/erpnext/buying/doctype/supplier/supplier.js
index 372ca56..08dc44c 100644
--- a/erpnext/buying/doctype/supplier/supplier.js
+++ b/erpnext/buying/doctype/supplier/supplier.js
@@ -12,6 +12,7 @@
return {
filters: {
'account_type': 'Payable',
+ 'root_type': 'Liability',
'company': d.company,
"is_group": 0
}
diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py
index 7be1d83..ee2ada3 100644
--- a/erpnext/buying/doctype/supplier/test_supplier.py
+++ b/erpnext/buying/doctype/supplier/test_supplier.py
@@ -206,6 +206,7 @@
{
"doctype": "Supplier",
"supplier_name": args.supplier_name,
+ "default_currency": args.default_currency,
"supplier_group": args.supplier_group or "Services",
"supplier_type": args.supplier_type or "Company",
"tax_withholding_category": args.tax_withholding_category,
diff --git a/erpnext/e_commerce/shopping_cart/cart.py b/erpnext/e_commerce/shopping_cart/cart.py
index 85d9a65..c66ae1d 100644
--- a/erpnext/e_commerce/shopping_cart/cart.py
+++ b/erpnext/e_commerce/shopping_cart/cart.py
@@ -631,7 +631,6 @@
shipping_rules = get_shipping_rules(quotation)
if shipping_rules:
- rule_label_map = frappe.db.get_values("Shipping Rule", shipping_rules, "label")
# we need this in sorted order as per the position of the rule in the settings page
return [[rule, rule] for rule in shipping_rules]
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index 60f0941..e274a52 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -23,6 +23,7 @@
let d = locals[cdt][cdn];
let filters = {
'account_type': 'Receivable',
+ 'root_type': 'Asset',
'company': d.company,
"is_group": 0
};
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 5e77c6f..fd5a201 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -10,7 +10,7 @@
class AuthorizationControl(TransactionBase):
- def get_appr_user_role(self, det, doctype_name, total, based_on, condition, item, company):
+ def get_appr_user_role(self, det, doctype_name, total, based_on, condition, master_name, company):
amt_list, appr_users, appr_roles = [], [], []
users, roles = "", ""
if det:
@@ -47,11 +47,11 @@
frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
- def validate_auth_rule(self, doctype_name, total, based_on, cond, company, item=""):
+ def validate_auth_rule(self, doctype_name, total, based_on, cond, company, master_name=""):
chk = 1
add_cond1, add_cond2 = "", ""
- if based_on == "Itemwise Discount":
- add_cond1 += " and master_name = " + frappe.db.escape(cstr(item))
+ if based_on in ["Itemwise Discount", "Item Group wise Discount"]:
+ add_cond1 += " and master_name = " + frappe.db.escape(cstr(master_name))
itemwise_exists = frappe.db.sql(
"""select value from `tabAuthorization Rule`
where transaction = %s and value <= %s
@@ -71,11 +71,11 @@
if itemwise_exists:
self.get_appr_user_role(
- itemwise_exists, doctype_name, total, based_on, cond + add_cond1, item, company
+ itemwise_exists, doctype_name, total, based_on, cond + add_cond1, master_name, company
)
chk = 0
if chk == 1:
- if based_on == "Itemwise Discount":
+ if based_on in ["Itemwise Discount", "Item Group wise Discount"]:
add_cond2 += " and ifnull(master_name,'') = ''"
appr = frappe.db.sql(
@@ -95,7 +95,9 @@
(doctype_name, total, based_on),
)
- self.get_appr_user_role(appr, doctype_name, total, based_on, cond + add_cond2, item, company)
+ self.get_appr_user_role(
+ appr, doctype_name, total, based_on, cond + add_cond2, master_name, company
+ )
def bifurcate_based_on_type(self, doctype_name, total, av_dis, based_on, doc_obj, val, company):
add_cond = ""
@@ -123,6 +125,12 @@
self.validate_auth_rule(
doctype_name, t.discount_percentage, based_on, add_cond, company, t.item_code
)
+ elif based_on == "Item Group wise Discount":
+ if doc_obj:
+ for t in doc_obj.get("items"):
+ self.validate_auth_rule(
+ doctype_name, t.discount_percentage, based_on, add_cond, company, t.item_group
+ )
else:
self.validate_auth_rule(doctype_name, auth_value, based_on, add_cond, company)
@@ -148,6 +156,7 @@
"Average Discount",
"Customerwise Discount",
"Itemwise Discount",
+ "Item Group wise Discount",
]
# Check for authorization set for individual user
@@ -166,7 +175,7 @@
# Remove user specific rules from global authorization rules
for r in based_on:
- if r in final_based_on and r != "Itemwise Discount":
+ if r in final_based_on and not r in ["Itemwise Discount", "Item Group wise Discount"]:
final_based_on.remove(r)
# Check for authorization set on particular roles
@@ -194,7 +203,7 @@
# Remove role specific rules from global authorization rules
for r in based_on:
- if r in final_based_on and r != "Itemwise Discount":
+ if r in final_based_on and not r in ["Itemwise Discount", "Item Group wise Discount"]:
final_based_on.remove(r)
# Check for global authorization
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.js b/erpnext/setup/doctype/authorization_rule/authorization_rule.js
index 3f6afca..f00ed3e 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.js
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.js
@@ -12,6 +12,9 @@
} else if(frm.doc.based_on==="Itemwise Discount") {
unhide_field("master_name");
frm.set_value("customer_or_item", "Item");
+ } else if(frm.doc.based_on==="Item Group wise Discount") {
+ unhide_field("master_name");
+ frm.set_value("customer_or_item", "Item Group");
} else {
frm.set_value("customer_or_item", "");
frm.set_value("master_name", "");
@@ -81,6 +84,13 @@
doctype: "Item",
query: "erpnext.controllers.queries.item_query"
}
+ else if (doc.based_on==="Item Group wise Discount")
+ return {
+ doctype: "Item Group",
+ filters: {
+ "is_group": 0
+ }
+ }
else
return {
filters: [
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.json b/erpnext/setup/doctype/authorization_rule/authorization_rule.json
index d3b8887..d750c7b 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.json
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.json
@@ -46,7 +46,7 @@
"label": "Based On",
"oldfieldname": "based_on",
"oldfieldtype": "Select",
- "options": "\nGrand Total\nAverage Discount\nCustomerwise Discount\nItemwise Discount\nNot Applicable",
+ "options": "\nGrand Total\nAverage Discount\nCustomerwise Discount\nItemwise Discount\nItem Group wise Discount\nNot Applicable",
"reqd": 1
},
{
@@ -54,14 +54,14 @@
"fieldtype": "Select",
"hidden": 1,
"label": "Customer or Item",
- "options": "Customer\nItem",
+ "options": "Customer\nItem\nItem Group",
"read_only": 1
},
{
"fieldname": "master_name",
"fieldtype": "Dynamic Link",
"in_list_view": 1,
- "label": "Customer / Item Name",
+ "label": "Customer / Item / Item Group",
"oldfieldname": "master_name",
"oldfieldtype": "Link",
"options": "customer_or_item"
@@ -162,7 +162,7 @@
"icon": "fa fa-shield",
"idx": 1,
"links": [],
- "modified": "2022-07-01 11:19:45.643991",
+ "modified": "2023-09-11 10:29:02.863193",
"modified_by": "Administrator",
"module": "Setup",
"name": "Authorization Rule",
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.py b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
index 44bd826..9e64e55 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.py
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
@@ -47,6 +47,7 @@
"Average Discount",
"Customerwise Discount",
"Itemwise Discount",
+ "Item Group wise Discount",
]:
frappe.throw(
_("Cannot set authorization on basis of Discount for {0}").format(self.transaction)
@@ -55,8 +56,6 @@
frappe.throw(_("Discount must be less than 100"))
elif self.based_on == "Customerwise Discount" and not self.master_name:
frappe.throw(_("Customer required for 'Customerwise Discount'"))
- else:
- self.based_on = "Not Applicable"
def validate(self):
self.check_duplicate_entry()
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index fa207ec..4973dab 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -200,8 +200,8 @@
$.each([
["default_bank_account", {"account_type": "Bank"}],
["default_cash_account", {"account_type": "Cash"}],
- ["default_receivable_account", {"account_type": "Receivable"}],
- ["default_payable_account", {"account_type": "Payable"}],
+ ["default_receivable_account", { "root_type": "Asset", "account_type": "Receivable" }],
+ ["default_payable_account", { "root_type": "Liability", "account_type": "Payable" }],
["default_expense_account", {"root_type": "Expense"}],
["default_income_account", {"root_type": "Income"}],
["round_off_account", {"root_type": "Expense"}],
diff --git a/erpnext/setup/doctype/customer_group/customer_group.js b/erpnext/setup/doctype/customer_group/customer_group.js
index 49a90f9..3c81b02 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.js
+++ b/erpnext/setup/doctype/customer_group/customer_group.js
@@ -30,6 +30,7 @@
frm.set_query('account', 'accounts', function (doc, cdt, cdn) {
return {
filters: {
+ 'root_type': 'Asset',
"account_type": 'Receivable',
"company": locals[cdt][cdn].company,
"is_group": 0
diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.js b/erpnext/setup/doctype/supplier_group/supplier_group.js
index b2acfd7..3362929 100644
--- a/erpnext/setup/doctype/supplier_group/supplier_group.js
+++ b/erpnext/setup/doctype/supplier_group/supplier_group.js
@@ -30,6 +30,7 @@
frm.set_query('account', 'accounts', function (doc, cdt, cdn) {
return {
filters: {
+ 'root_type': 'Liability',
'account_type': 'Payable',
'company': locals[cdt][cdn].company,
"is_group": 0
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index 6a9e241..e0d4919 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -1253,6 +1253,7 @@
"depends_on": "eval: doc.is_internal_customer",
"fieldname": "set_target_warehouse",
"fieldtype": "Link",
+ "ignore_user_permissions": 1,
"in_standard_filter": 1,
"label": "Set Target Warehouse",
"no_copy": 1,
@@ -1400,7 +1401,7 @@
"idx": 146,
"is_submittable": 1,
"links": [],
- "modified": "2023-06-16 14:58:55.066602",
+ "modified": "2023-09-04 14:15:28.363184",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
index e66c233..d4a574d 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note_dashboard.py
@@ -11,10 +11,12 @@
},
"internal_links": {
"Sales Order": ["items", "against_sales_order"],
- "Sales Invoice": ["items", "against_sales_invoice"],
"Material Request": ["items", "material_request"],
"Purchase Order": ["items", "purchase_order"],
},
+ "internal_and_external_links": {
+ "Sales Invoice": ["items", "against_sales_invoice"],
+ },
"transactions": [
{"label": _("Related"), "items": ["Sales Invoice", "Packing Slip", "Delivery Trip"]},
{"label": _("Reference"), "items": ["Sales Order", "Shipment", "Quality Inspection"]},
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 60aefdd..04eff54 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -603,7 +603,7 @@
account=provisional_account,
cost_center=item.cost_center,
debit=0.0,
- credit=multiplication_factor * item.amount,
+ credit=multiplication_factor * item.base_amount,
remarks=remarks,
against_account=expense_account,
account_currency=credit_currency,
@@ -617,7 +617,7 @@
gl_entries=gl_entries,
account=expense_account,
cost_center=item.cost_center,
- debit=multiplication_factor * item.amount,
+ debit=multiplication_factor * item.base_amount,
credit=0.0,
remarks=remarks,
against_account=provisional_account,
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 6134bfa..b7712ee 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -2017,6 +2017,49 @@
ste7.reload()
self.assertEqual(ste7.items[0].valuation_rate, valuation_rate)
+ def test_purchase_receipt_provisional_accounting(self):
+ # Step - 1: Create Supplier with Default Currency as USD
+ from erpnext.buying.doctype.supplier.test_supplier import create_supplier
+
+ supplier = create_supplier(default_currency="USD")
+
+ # Step - 2: Setup Company for Provisional Accounting
+ from erpnext.accounts.doctype.account.test_account import create_account
+
+ provisional_account = create_account(
+ account_name="Provision Account",
+ parent_account="Current Liabilities - _TC",
+ company="_Test Company",
+ )
+ company = frappe.get_doc("Company", "_Test Company")
+ company.enable_provisional_accounting_for_non_stock_items = 1
+ company.default_provisional_account = provisional_account
+ company.save()
+
+ # Step - 3: Create Non-Stock Item
+ item = make_item(properties={"is_stock_item": 0})
+
+ # Step - 4: Create Purchase Receipt
+ pr = make_purchase_receipt(
+ qty=2,
+ item_code=item.name,
+ company=company.name,
+ supplier=supplier.name,
+ currency=supplier.default_currency,
+ )
+
+ # Test - 1: Total and Base Total should not be the same as the currency is different
+ self.assertNotEqual(flt(pr.total, 2), flt(pr.base_total, 2))
+ self.assertEqual(flt(pr.total * pr.conversion_rate, 2), flt(pr.base_total, 2))
+
+ # Test - 2: Sum of Debit or Credit should be equal to Purchase Receipt Base Total
+ amount = frappe.db.get_value("GL Entry", {"docstatus": 1, "voucher_no": pr.name}, ["sum(debit)"])
+ expected_amount = pr.base_total
+ self.assertEqual(amount, expected_amount)
+
+ company.enable_provisional_accounting_for_non_stock_items = 0
+ company.save()
+
def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier