Merge branch 'develop' into print-rfq
This commit is contained in:
commit
0e86cde64b
@ -305,6 +305,7 @@
|
|||||||
"fieldname": "source_exchange_rate",
|
"fieldname": "source_exchange_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "Exchange Rate",
|
"label": "Exchange Rate",
|
||||||
|
"precision": "9",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
@ -334,6 +335,7 @@
|
|||||||
"fieldname": "target_exchange_rate",
|
"fieldname": "target_exchange_rate",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"label": "Exchange Rate",
|
"label": "Exchange Rate",
|
||||||
|
"precision": "9",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
@ -731,7 +733,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-02-23 20:08:39.559814",
|
"modified": "2022-12-08 16:25:43.824051",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Entry",
|
"name": "Payment Entry",
|
||||||
|
@ -684,35 +684,34 @@ class PaymentEntry(AccountsController):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def validate_payment_against_negative_invoice(self):
|
def validate_payment_against_negative_invoice(self):
|
||||||
if (self.payment_type == "Pay" and self.party_type == "Customer") or (
|
if (self.payment_type != "Pay" or self.party_type != "Customer") and (
|
||||||
self.payment_type == "Receive" and self.party_type == "Supplier"
|
self.payment_type != "Receive" or self.party_type != "Supplier"
|
||||||
):
|
):
|
||||||
|
return
|
||||||
|
|
||||||
total_negative_outstanding = sum(
|
total_negative_outstanding = sum(
|
||||||
abs(flt(d.outstanding_amount)) for d in self.get("references") if flt(d.outstanding_amount) < 0
|
abs(flt(d.outstanding_amount)) for d in self.get("references") if flt(d.outstanding_amount) < 0
|
||||||
|
)
|
||||||
|
|
||||||
|
paid_amount = self.paid_amount if self.payment_type == "Receive" else self.received_amount
|
||||||
|
additional_charges = sum(flt(d.amount) for d in self.deductions)
|
||||||
|
|
||||||
|
if not total_negative_outstanding:
|
||||||
|
if self.party_type == "Customer":
|
||||||
|
msg = _("Cannot pay to Customer without any negative outstanding invoice")
|
||||||
|
else:
|
||||||
|
msg = _("Cannot receive from Supplier without any negative outstanding invoice")
|
||||||
|
|
||||||
|
frappe.throw(msg, InvalidPaymentEntry)
|
||||||
|
|
||||||
|
elif paid_amount - additional_charges > total_negative_outstanding:
|
||||||
|
frappe.throw(
|
||||||
|
_("Paid Amount cannot be greater than total negative outstanding amount {0}").format(
|
||||||
|
total_negative_outstanding
|
||||||
|
),
|
||||||
|
InvalidPaymentEntry,
|
||||||
)
|
)
|
||||||
|
|
||||||
paid_amount = self.paid_amount if self.payment_type == "Receive" else self.received_amount
|
|
||||||
additional_charges = sum([flt(d.amount) for d in self.deductions])
|
|
||||||
|
|
||||||
if not total_negative_outstanding:
|
|
||||||
frappe.throw(
|
|
||||||
_("Cannot {0} {1} {2} without any negative outstanding invoice").format(
|
|
||||||
_(self.payment_type),
|
|
||||||
(_("to") if self.party_type == "Customer" else _("from")),
|
|
||||||
self.party_type,
|
|
||||||
),
|
|
||||||
InvalidPaymentEntry,
|
|
||||||
)
|
|
||||||
|
|
||||||
elif paid_amount - additional_charges > total_negative_outstanding:
|
|
||||||
frappe.throw(
|
|
||||||
_("Paid Amount cannot be greater than total negative outstanding amount {0}").format(
|
|
||||||
total_negative_outstanding
|
|
||||||
),
|
|
||||||
InvalidPaymentEntry,
|
|
||||||
)
|
|
||||||
|
|
||||||
def set_title(self):
|
def set_title(self):
|
||||||
if frappe.flags.in_import and self.title:
|
if frappe.flags.in_import and self.title:
|
||||||
# do not set title dynamically if title exists during data import.
|
# do not set title dynamically if title exists during data import.
|
||||||
@ -1188,6 +1187,7 @@ def get_outstanding_reference_documents(args):
|
|||||||
|
|
||||||
ple = qb.DocType("Payment Ledger Entry")
|
ple = qb.DocType("Payment Ledger Entry")
|
||||||
common_filter = []
|
common_filter = []
|
||||||
|
accounting_dimensions_filter = []
|
||||||
posting_and_due_date = []
|
posting_and_due_date = []
|
||||||
|
|
||||||
# confirm that Supplier is not blocked
|
# confirm that Supplier is not blocked
|
||||||
@ -1217,7 +1217,7 @@ def get_outstanding_reference_documents(args):
|
|||||||
# Add cost center condition
|
# Add cost center condition
|
||||||
if args.get("cost_center"):
|
if args.get("cost_center"):
|
||||||
condition += " and cost_center='%s'" % args.get("cost_center")
|
condition += " and cost_center='%s'" % args.get("cost_center")
|
||||||
common_filter.append(ple.cost_center == args.get("cost_center"))
|
accounting_dimensions_filter.append(ple.cost_center == args.get("cost_center"))
|
||||||
|
|
||||||
date_fields_dict = {
|
date_fields_dict = {
|
||||||
"posting_date": ["from_posting_date", "to_posting_date"],
|
"posting_date": ["from_posting_date", "to_posting_date"],
|
||||||
@ -1243,6 +1243,7 @@ def get_outstanding_reference_documents(args):
|
|||||||
posting_date=posting_and_due_date,
|
posting_date=posting_and_due_date,
|
||||||
min_outstanding=args.get("outstanding_amt_greater_than"),
|
min_outstanding=args.get("outstanding_amt_greater_than"),
|
||||||
max_outstanding=args.get("outstanding_amt_less_than"),
|
max_outstanding=args.get("outstanding_amt_less_than"),
|
||||||
|
accounting_dimensions=accounting_dimensions_filter,
|
||||||
)
|
)
|
||||||
|
|
||||||
outstanding_invoices = split_invoices_based_on_payment_terms(outstanding_invoices)
|
outstanding_invoices = split_invoices_based_on_payment_terms(outstanding_invoices)
|
||||||
|
@ -23,6 +23,7 @@ class PaymentReconciliation(Document):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(PaymentReconciliation, self).__init__(*args, **kwargs)
|
super(PaymentReconciliation, self).__init__(*args, **kwargs)
|
||||||
self.common_filter_conditions = []
|
self.common_filter_conditions = []
|
||||||
|
self.accounting_dimension_filter_conditions = []
|
||||||
self.ple_posting_date_filter = []
|
self.ple_posting_date_filter = []
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
@ -193,6 +194,7 @@ class PaymentReconciliation(Document):
|
|||||||
posting_date=self.ple_posting_date_filter,
|
posting_date=self.ple_posting_date_filter,
|
||||||
min_outstanding=self.minimum_invoice_amount if self.minimum_invoice_amount else None,
|
min_outstanding=self.minimum_invoice_amount if self.minimum_invoice_amount else None,
|
||||||
max_outstanding=self.maximum_invoice_amount if self.maximum_invoice_amount else None,
|
max_outstanding=self.maximum_invoice_amount if self.maximum_invoice_amount else None,
|
||||||
|
accounting_dimensions=self.accounting_dimension_filter_conditions,
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.invoice_limit:
|
if self.invoice_limit:
|
||||||
@ -381,7 +383,7 @@ class PaymentReconciliation(Document):
|
|||||||
self.common_filter_conditions.append(ple.company == self.company)
|
self.common_filter_conditions.append(ple.company == self.company)
|
||||||
|
|
||||||
if self.get("cost_center") and (get_invoices or get_return_invoices):
|
if self.get("cost_center") and (get_invoices or get_return_invoices):
|
||||||
self.common_filter_conditions.append(ple.cost_center == self.cost_center)
|
self.accounting_dimension_filter_conditions.append(ple.cost_center == self.cost_center)
|
||||||
|
|
||||||
if get_invoices:
|
if get_invoices:
|
||||||
if self.from_invoice_date:
|
if self.from_invoice_date:
|
||||||
|
@ -8,6 +8,8 @@ from frappe import qb
|
|||||||
from frappe.tests.utils import FrappeTestCase
|
from frappe.tests.utils import FrappeTestCase
|
||||||
from frappe.utils import add_days, nowdate
|
from frappe.utils import add_days, nowdate
|
||||||
|
|
||||||
|
from erpnext import get_default_cost_center
|
||||||
|
from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry
|
||||||
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
|
from erpnext.accounts.doctype.payment_entry.test_payment_entry import create_payment_entry
|
||||||
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
|
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
|
||||||
from erpnext.accounts.party import get_party_account
|
from erpnext.accounts.party import get_party_account
|
||||||
@ -20,6 +22,7 @@ class TestPaymentReconciliation(FrappeTestCase):
|
|||||||
self.create_item()
|
self.create_item()
|
||||||
self.create_customer()
|
self.create_customer()
|
||||||
self.create_account()
|
self.create_account()
|
||||||
|
self.create_cost_center()
|
||||||
self.clear_old_entries()
|
self.clear_old_entries()
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
@ -216,6 +219,22 @@ class TestPaymentReconciliation(FrappeTestCase):
|
|||||||
)
|
)
|
||||||
return je
|
return je
|
||||||
|
|
||||||
|
def create_cost_center(self):
|
||||||
|
# Setup cost center
|
||||||
|
cc_name = "Sub"
|
||||||
|
|
||||||
|
self.main_cc = frappe.get_doc("Cost Center", get_default_cost_center(self.company))
|
||||||
|
|
||||||
|
cc_exists = frappe.db.get_list("Cost Center", filters={"cost_center_name": cc_name})
|
||||||
|
if cc_exists:
|
||||||
|
self.sub_cc = frappe.get_doc("Cost Center", cc_exists[0].name)
|
||||||
|
else:
|
||||||
|
sub_cc = frappe.new_doc("Cost Center")
|
||||||
|
sub_cc.cost_center_name = "Sub"
|
||||||
|
sub_cc.parent_cost_center = self.main_cc.parent_cost_center
|
||||||
|
sub_cc.company = self.main_cc.company
|
||||||
|
self.sub_cc = sub_cc.save()
|
||||||
|
|
||||||
def test_filter_min_max(self):
|
def test_filter_min_max(self):
|
||||||
# check filter condition minimum and maximum amount
|
# check filter condition minimum and maximum amount
|
||||||
self.create_sales_invoice(qty=1, rate=300)
|
self.create_sales_invoice(qty=1, rate=300)
|
||||||
@ -578,3 +597,24 @@ class TestPaymentReconciliation(FrappeTestCase):
|
|||||||
self.assertEqual(len(pr.payments), 1)
|
self.assertEqual(len(pr.payments), 1)
|
||||||
self.assertEqual(pr.payments[0].amount, amount)
|
self.assertEqual(pr.payments[0].amount, amount)
|
||||||
self.assertEqual(pr.payments[0].currency, "EUR")
|
self.assertEqual(pr.payments[0].currency, "EUR")
|
||||||
|
|
||||||
|
def test_differing_cost_center_on_invoice_and_payment(self):
|
||||||
|
"""
|
||||||
|
Cost Center filter should not affect outstanding amount calculation
|
||||||
|
"""
|
||||||
|
|
||||||
|
si = self.create_sales_invoice(qty=1, rate=100, do_not_submit=True)
|
||||||
|
si.cost_center = self.main_cc.name
|
||||||
|
si.submit()
|
||||||
|
pr = get_payment_entry(si.doctype, si.name)
|
||||||
|
pr.cost_center = self.sub_cc.name
|
||||||
|
pr = pr.save().submit()
|
||||||
|
|
||||||
|
pr = self.create_payment_reconciliation()
|
||||||
|
pr.cost_center = self.main_cc.name
|
||||||
|
|
||||||
|
pr.get_unreconciled_entries()
|
||||||
|
|
||||||
|
# check PR tool output
|
||||||
|
self.assertEqual(len(pr.get("invoices")), 0)
|
||||||
|
self.assertEqual(len(pr.get("payments")), 0)
|
||||||
|
@ -64,12 +64,13 @@
|
|||||||
"tax_withholding_net_total",
|
"tax_withholding_net_total",
|
||||||
"base_tax_withholding_net_total",
|
"base_tax_withholding_net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_58",
|
"column_break_58",
|
||||||
"tax_category",
|
|
||||||
"column_break_49",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_49",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_51",
|
"section_break_51",
|
||||||
"taxes",
|
"taxes",
|
||||||
"totals",
|
"totals",
|
||||||
@ -1541,13 +1542,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 204,
|
"idx": 204,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-25 12:44:29.935567",
|
"modified": "2022-12-12 18:37:38.142688",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Purchase Invoice",
|
"name": "Purchase Invoice",
|
||||||
|
@ -61,12 +61,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_38",
|
"column_break_38",
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
"incoterm",
|
|
||||||
"column_break_55",
|
"column_break_55",
|
||||||
"tax_category",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_40",
|
"section_break_40",
|
||||||
"taxes",
|
"taxes",
|
||||||
"section_break_43",
|
"section_break_43",
|
||||||
@ -2122,6 +2123,12 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
@ -2134,7 +2141,7 @@
|
|||||||
"link_fieldname": "consolidated_invoice"
|
"link_fieldname": "consolidated_invoice"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2022-12-05 16:18:14.532114",
|
"modified": "2022-12-12 18:34:33.409895",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Sales Invoice",
|
"name": "Sales Invoice",
|
||||||
|
@ -280,7 +280,8 @@ class Subscription(Document):
|
|||||||
self.validate_plans_billing_cycle(self.get_billing_cycle_and_interval())
|
self.validate_plans_billing_cycle(self.get_billing_cycle_and_interval())
|
||||||
self.validate_end_date()
|
self.validate_end_date()
|
||||||
self.validate_to_follow_calendar_months()
|
self.validate_to_follow_calendar_months()
|
||||||
self.cost_center = erpnext.get_default_cost_center(self.get("company"))
|
if not self.cost_center:
|
||||||
|
self.cost_center = erpnext.get_default_cost_center(self.get("company"))
|
||||||
|
|
||||||
def validate_trial_period(self):
|
def validate_trial_period(self):
|
||||||
"""
|
"""
|
||||||
|
@ -503,7 +503,7 @@ class GrossProfitGenerator(object):
|
|||||||
invoice_portion = 100
|
invoice_portion = 100
|
||||||
elif row.invoice_portion:
|
elif row.invoice_portion:
|
||||||
invoice_portion = row.invoice_portion
|
invoice_portion = row.invoice_portion
|
||||||
else:
|
elif row.payment_amount:
|
||||||
invoice_portion = row.payment_amount * 100 / row.base_net_amount
|
invoice_portion = row.payment_amount * 100 / row.base_net_amount
|
||||||
|
|
||||||
if i == 0:
|
if i == 0:
|
||||||
|
@ -836,6 +836,7 @@ def get_outstanding_invoices(
|
|||||||
posting_date=None,
|
posting_date=None,
|
||||||
min_outstanding=None,
|
min_outstanding=None,
|
||||||
max_outstanding=None,
|
max_outstanding=None,
|
||||||
|
accounting_dimensions=None,
|
||||||
):
|
):
|
||||||
|
|
||||||
ple = qb.DocType("Payment Ledger Entry")
|
ple = qb.DocType("Payment Ledger Entry")
|
||||||
@ -866,6 +867,7 @@ def get_outstanding_invoices(
|
|||||||
min_outstanding=min_outstanding,
|
min_outstanding=min_outstanding,
|
||||||
max_outstanding=max_outstanding,
|
max_outstanding=max_outstanding,
|
||||||
get_invoices=True,
|
get_invoices=True,
|
||||||
|
accounting_dimensions=accounting_dimensions or [],
|
||||||
)
|
)
|
||||||
|
|
||||||
for d in invoice_list:
|
for d in invoice_list:
|
||||||
@ -1615,6 +1617,7 @@ class QueryPaymentLedger(object):
|
|||||||
.where(ple.delinked == 0)
|
.where(ple.delinked == 0)
|
||||||
.where(Criterion.all(filter_on_voucher_no))
|
.where(Criterion.all(filter_on_voucher_no))
|
||||||
.where(Criterion.all(self.common_filter))
|
.where(Criterion.all(self.common_filter))
|
||||||
|
.where(Criterion.all(self.dimensions_filter))
|
||||||
.where(Criterion.all(self.voucher_posting_date))
|
.where(Criterion.all(self.voucher_posting_date))
|
||||||
.groupby(ple.voucher_type, ple.voucher_no, ple.party_type, ple.party)
|
.groupby(ple.voucher_type, ple.voucher_no, ple.party_type, ple.party)
|
||||||
)
|
)
|
||||||
@ -1702,6 +1705,7 @@ class QueryPaymentLedger(object):
|
|||||||
max_outstanding=None,
|
max_outstanding=None,
|
||||||
get_payments=False,
|
get_payments=False,
|
||||||
get_invoices=False,
|
get_invoices=False,
|
||||||
|
accounting_dimensions=None,
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Fetch voucher amount and outstanding amount from Payment Ledger using Database CTE
|
Fetch voucher amount and outstanding amount from Payment Ledger using Database CTE
|
||||||
@ -1717,6 +1721,7 @@ class QueryPaymentLedger(object):
|
|||||||
self.reset()
|
self.reset()
|
||||||
self.vouchers = vouchers
|
self.vouchers = vouchers
|
||||||
self.common_filter = common_filter or []
|
self.common_filter = common_filter or []
|
||||||
|
self.dimensions_filter = accounting_dimensions or []
|
||||||
self.voucher_posting_date = posting_date or []
|
self.voucher_posting_date = posting_date or []
|
||||||
self.min_outstanding = min_outstanding
|
self.min_outstanding = min_outstanding
|
||||||
self.max_outstanding = max_outstanding
|
self.max_outstanding = max_outstanding
|
||||||
|
@ -62,12 +62,13 @@
|
|||||||
"set_reserve_warehouse",
|
"set_reserve_warehouse",
|
||||||
"supplied_items",
|
"supplied_items",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_53",
|
"column_break_53",
|
||||||
"tax_category",
|
|
||||||
"column_break_50",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_50",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_52",
|
"section_break_52",
|
||||||
"taxes",
|
"taxes",
|
||||||
"totals",
|
"totals",
|
||||||
@ -1256,13 +1257,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 105,
|
"idx": 105,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:28:07.729943",
|
"modified": "2022-12-12 18:36:37.455134",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order",
|
"name": "Purchase Order",
|
||||||
|
@ -40,12 +40,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_34",
|
"column_break_34",
|
||||||
"tax_category",
|
|
||||||
"column_break_36",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_36",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_38",
|
"section_break_38",
|
||||||
"taxes",
|
"taxes",
|
||||||
"totals",
|
"totals",
|
||||||
@ -830,6 +831,12 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-shopping-cart",
|
"icon": "fa fa-shopping-cart",
|
||||||
@ -837,7 +844,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:27:32.179686",
|
"modified": "2022-12-12 18:35:39.740974",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Supplier Quotation",
|
"name": "Supplier Quotation",
|
||||||
|
@ -347,16 +347,21 @@ class StatusUpdater(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def warn_about_bypassing_with_role(self, item, qty_or_amount, role):
|
def warn_about_bypassing_with_role(self, item, qty_or_amount, role):
|
||||||
action = _("Over Receipt/Delivery") if qty_or_amount == "qty" else _("Overbilling")
|
if qty_or_amount == "qty":
|
||||||
|
msg = _("Over Receipt/Delivery of {0} {1} ignored for item {2} because you have {3} role.")
|
||||||
|
else:
|
||||||
|
msg = _("Overbilling of {0} {1} ignored for item {2} because you have {3} role.")
|
||||||
|
|
||||||
msg = _("{0} of {1} {2} ignored for item {3} because you have {4} role.").format(
|
frappe.msgprint(
|
||||||
action,
|
msg.format(
|
||||||
_(item["target_ref_field"].title()),
|
_(item["target_ref_field"].title()),
|
||||||
frappe.bold(item["reduce_by"]),
|
frappe.bold(item["reduce_by"]),
|
||||||
frappe.bold(item.get("item_code")),
|
frappe.bold(item.get("item_code")),
|
||||||
role,
|
role,
|
||||||
|
),
|
||||||
|
indicator="orange",
|
||||||
|
alert=True,
|
||||||
)
|
)
|
||||||
frappe.msgprint(msg, indicator="orange", alert=True)
|
|
||||||
|
|
||||||
def update_qty(self, update_modified=True):
|
def update_qty(self, update_modified=True):
|
||||||
"""Updates qty or amount at row level
|
"""Updates qty or amount at row level
|
||||||
|
@ -102,7 +102,7 @@ def create_party_contact(doctype, fullname, user, party_name):
|
|||||||
contact = frappe.new_doc("Contact")
|
contact = frappe.new_doc("Contact")
|
||||||
contact.update({"first_name": fullname, "email_id": user})
|
contact.update({"first_name": fullname, "email_id": user})
|
||||||
contact.append("links", dict(link_doctype=doctype, link_name=party_name))
|
contact.append("links", dict(link_doctype=doctype, link_name=party_name))
|
||||||
contact.append("email_ids", dict(email_id=user))
|
contact.append("email_ids", dict(email_id=user, is_primary=True))
|
||||||
contact.flags.ignore_mandatory = True
|
contact.flags.ignore_mandatory = True
|
||||||
contact.insert(ignore_permissions=True)
|
contact.insert(ignore_permissions=True)
|
||||||
|
|
||||||
|
@ -43,12 +43,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_36",
|
"column_break_36",
|
||||||
"tax_category",
|
|
||||||
"column_break_34",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_34",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_36",
|
"section_break_36",
|
||||||
"taxes",
|
"taxes",
|
||||||
"section_break_39",
|
"section_break_39",
|
||||||
@ -1059,13 +1060,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-shopping-cart",
|
"icon": "fa fa-shopping-cart",
|
||||||
"idx": 82,
|
"idx": 82,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:20:54.984348",
|
"modified": "2022-12-12 18:32:28.671332",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Quotation",
|
"name": "Quotation",
|
||||||
|
@ -58,12 +58,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_38",
|
"column_break_38",
|
||||||
"tax_category",
|
|
||||||
"column_break_49",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_49",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_40",
|
"section_break_40",
|
||||||
"taxes",
|
"taxes",
|
||||||
"section_break_43",
|
"section_break_43",
|
||||||
@ -1630,13 +1631,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-file-text",
|
"icon": "fa fa-file-text",
|
||||||
"idx": 105,
|
"idx": 105,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:22:00.413878",
|
"modified": "2022-12-12 18:34:00.681780",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Sales Order",
|
"name": "Sales Order",
|
||||||
|
@ -204,7 +204,7 @@ class TransactionDeletionRecord(Document):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_doctypes_to_be_ignored():
|
def get_doctypes_to_be_ignored():
|
||||||
doctypes_to_be_ignored_list = [
|
doctypes_to_be_ignored = [
|
||||||
"Account",
|
"Account",
|
||||||
"Cost Center",
|
"Cost Center",
|
||||||
"Warehouse",
|
"Warehouse",
|
||||||
@ -223,4 +223,7 @@ def get_doctypes_to_be_ignored():
|
|||||||
"Customer",
|
"Customer",
|
||||||
"Supplier",
|
"Supplier",
|
||||||
]
|
]
|
||||||
return doctypes_to_be_ignored_list
|
|
||||||
|
doctypes_to_be_ignored.extend(frappe.get_hooks("company_data_to_be_ignored") or [])
|
||||||
|
|
||||||
|
return doctypes_to_be_ignored
|
||||||
|
@ -57,12 +57,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"column_break_43",
|
"column_break_43",
|
||||||
"tax_category",
|
|
||||||
"column_break_39",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_39",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"section_break_41",
|
"section_break_41",
|
||||||
"taxes",
|
"taxes",
|
||||||
"section_break_44",
|
"section_break_44",
|
||||||
@ -1388,13 +1389,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-truck",
|
"icon": "fa fa-truck",
|
||||||
"idx": 146,
|
"idx": 146,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:22:42.860790",
|
"modified": "2022-12-12 18:38:53.067799",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Delivery Note",
|
"name": "Delivery Note",
|
||||||
|
@ -58,12 +58,13 @@
|
|||||||
"total",
|
"total",
|
||||||
"net_total",
|
"net_total",
|
||||||
"taxes_charges_section",
|
"taxes_charges_section",
|
||||||
|
"tax_category",
|
||||||
"taxes_and_charges",
|
"taxes_and_charges",
|
||||||
"shipping_col",
|
"shipping_col",
|
||||||
"tax_category",
|
|
||||||
"column_break_53",
|
|
||||||
"shipping_rule",
|
"shipping_rule",
|
||||||
|
"column_break_53",
|
||||||
"incoterm",
|
"incoterm",
|
||||||
|
"named_place",
|
||||||
"taxes_section",
|
"taxes_section",
|
||||||
"taxes",
|
"taxes",
|
||||||
"totals",
|
"totals",
|
||||||
@ -1225,13 +1226,19 @@
|
|||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Incoterm",
|
"label": "Incoterm",
|
||||||
"options": "Incoterm"
|
"options": "Incoterm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"depends_on": "incoterm",
|
||||||
|
"fieldname": "named_place",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Named Place"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-truck",
|
"icon": "fa fa-truck",
|
||||||
"idx": 261,
|
"idx": 261,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-11-17 17:29:30.067536",
|
"modified": "2022-12-12 18:40:32.447752",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Purchase Receipt",
|
"name": "Purchase Receipt",
|
||||||
|
@ -828,9 +828,9 @@ def insert_item_price(args):
|
|||||||
):
|
):
|
||||||
if frappe.has_permission("Item Price", "write"):
|
if frappe.has_permission("Item Price", "write"):
|
||||||
price_list_rate = (
|
price_list_rate = (
|
||||||
(args.rate + args.discount_amount) / args.get("conversion_factor")
|
(flt(args.rate) + flt(args.discount_amount)) / args.get("conversion_factor")
|
||||||
if args.get("conversion_factor")
|
if args.get("conversion_factor")
|
||||||
else (args.rate + args.discount_amount)
|
else (flt(args.rate) + flt(args.discount_amount))
|
||||||
)
|
)
|
||||||
|
|
||||||
item_price = frappe.db.get_value(
|
item_price = frappe.db.get_value(
|
||||||
|
@ -82,7 +82,7 @@ def get_item_info(filters):
|
|||||||
item.safety_stock,
|
item.safety_stock,
|
||||||
item.lead_time_days,
|
item.lead_time_days,
|
||||||
)
|
)
|
||||||
.where(item.is_stock_item == 1)
|
.where((item.is_stock_item == 1) & (item.disabled == 0))
|
||||||
)
|
)
|
||||||
|
|
||||||
if brand := filters.get("brand"):
|
if brand := filters.get("brand"):
|
||||||
|
@ -1849,6 +1849,8 @@ Outstanding Amt,Offener Betrag,
|
|||||||
Outstanding Cheques and Deposits to clear,Ausstehende Schecks und Anzahlungen zum verbuchen,
|
Outstanding Cheques and Deposits to clear,Ausstehende Schecks und Anzahlungen zum verbuchen,
|
||||||
Outstanding for {0} cannot be less than zero ({1}),Ausstände für {0} können nicht kleiner als Null sein ({1}),
|
Outstanding for {0} cannot be less than zero ({1}),Ausstände für {0} können nicht kleiner als Null sein ({1}),
|
||||||
Outward taxable supplies(zero rated),Steuerpflichtige Lieferungen aus dem Ausland (null bewertet),
|
Outward taxable supplies(zero rated),Steuerpflichtige Lieferungen aus dem Ausland (null bewertet),
|
||||||
|
Over Receipt/Delivery of {0} {1} ignored for item {2} because you have {3} role.,"Überhöhte Annahme bzw. Lieferung von Artikel {2} mit {0} {1} wurde ignoriert, weil Sie die Rolle {3} haben."
|
||||||
|
Overbilling of {0} {1} ignored for item {2} because you have {3} role.,"Überhöhte Abrechnung von Artikel {2} mit {0} {1} wurde ignoriert, weil Sie die Rolle {3} haben."
|
||||||
Overdue,Überfällig,
|
Overdue,Überfällig,
|
||||||
Overlap in scoring between {0} and {1},Überlappung beim Scoring zwischen {0} und {1},
|
Overlap in scoring between {0} and {1},Überlappung beim Scoring zwischen {0} und {1},
|
||||||
Overlapping conditions found between:,Überlagernde Bedingungen gefunden zwischen:,
|
Overlapping conditions found between:,Überlagernde Bedingungen gefunden zwischen:,
|
||||||
@ -9914,4 +9916,3 @@ Cost and Freight,Kosten und Fracht,
|
|||||||
Delivered at Place,Geliefert benannter Ort,
|
Delivered at Place,Geliefert benannter Ort,
|
||||||
Delivered at Place Unloaded,Geliefert benannter Ort entladen,
|
Delivered at Place Unloaded,Geliefert benannter Ort entladen,
|
||||||
Delivered Duty Paid,Geliefert verzollt,
|
Delivered Duty Paid,Geliefert verzollt,
|
||||||
{0} of {1} {2} ignored for item {3} because you have {4} role,"{0} von Artikel {3} mit {1} {2} wurde ignoriert, weil Sie die Rolle {4} haben."
|
|
||||||
|
Can't render this file because it is too large.
|
Loading…
x
Reference in New Issue
Block a user