mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-04 20:59:11 +00:00
Merge branch 'develop' into project-link-for-all-accounts
This commit is contained in:
@@ -6,6 +6,18 @@ frappe.ui.form.on('Item Tax Template', {
|
|||||||
frm.set_query("tax_type", "taxes", function(doc) {
|
frm.set_query("tax_type", "taxes", function(doc) {
|
||||||
return {
|
return {
|
||||||
filters: [
|
filters: [
|
||||||
|
['Account', 'company', '=', frm.doc.company],
|
||||||
|
['Account', 'is_group', '=', 0],
|
||||||
|
['Account', 'account_type', 'in', ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
company: function (frm) {
|
||||||
|
frm.set_query("tax_type", "taxes", function(doc) {
|
||||||
|
return {
|
||||||
|
filters: [
|
||||||
|
['Account', 'company', '=', frm.doc.company],
|
||||||
['Account', 'is_group', '=', 0],
|
['Account', 'is_group', '=', 0],
|
||||||
['Account', 'account_type', 'in', ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']]
|
['Account', 'account_type', 'in', ['Tax', 'Chargeable', 'Income Account', 'Expense Account', 'Expenses Included In Valuation']]
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,168 +1,85 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
|
||||||
"allow_events_in_timeline": 0,
|
|
||||||
"allow_guest_to_view": 0,
|
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"allow_rename": 1,
|
"allow_rename": 1,
|
||||||
"autoname": "field:title",
|
"autoname": "field:title",
|
||||||
"beta": 0,
|
|
||||||
"creation": "2018-11-22 22:45:00.370913",
|
"creation": "2018-11-22 22:45:00.370913",
|
||||||
"custom": 0,
|
|
||||||
"docstatus": 0,
|
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Setup",
|
"document_type": "Setup",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
"engine": "InnoDB",
|
"engine": "InnoDB",
|
||||||
|
"field_order": [
|
||||||
|
"title",
|
||||||
|
"company",
|
||||||
|
"taxes"
|
||||||
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "title",
|
"fieldname": "title",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 1,
|
"in_filter": 1,
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Title",
|
"label": "Title",
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 1
|
"unique": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Tax Rates",
|
"label": "Tax Rates",
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Item Tax Template Detail",
|
"options": "Item Tax Template Detail",
|
||||||
"permlevel": 0,
|
"reqd": 1
|
||||||
"precision": "",
|
},
|
||||||
"print_hide": 0,
|
{
|
||||||
"print_hide_if_no_value": 0,
|
"fieldname": "company",
|
||||||
"read_only": 0,
|
"fieldtype": "Link",
|
||||||
"remember_last_selected_value": 0,
|
"label": "Company",
|
||||||
"report_hide": 0,
|
"options": "Company",
|
||||||
"reqd": 1,
|
"reqd": 1
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"modified": "2020-06-18 20:27:42.615842",
|
||||||
"hide_heading": 0,
|
"modified_by": "ahmad@havenir.com",
|
||||||
"hide_toolbar": 0,
|
|
||||||
"idx": 0,
|
|
||||||
"image_view": 0,
|
|
||||||
"in_create": 0,
|
|
||||||
"is_submittable": 0,
|
|
||||||
"issingle": 0,
|
|
||||||
"istable": 0,
|
|
||||||
"max_attachments": 0,
|
|
||||||
"modified": "2018-12-21 23:51:16.328340",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Item Tax Template",
|
"name": "Item Tax Template",
|
||||||
"name_case": "",
|
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 0,
|
|
||||||
"cancel": 0,
|
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
|
||||||
"import": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "System Manager",
|
"role": "System Manager",
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"submit": 0,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
|
||||||
"cancel": 0,
|
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
|
||||||
"import": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Accounts Manager",
|
"role": "Accounts Manager",
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
"share": 1,
|
||||||
"submit": 0,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
|
||||||
"cancel": 0,
|
|
||||||
"create": 0,
|
|
||||||
"delete": 0,
|
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
|
||||||
"import": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"print": 1,
|
"print": 1,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 1,
|
||||||
"role": "Accounts User",
|
"role": "Accounts User",
|
||||||
"set_user_permissions": 0,
|
"share": 1
|
||||||
"share": 1,
|
|
||||||
"submit": 0,
|
|
||||||
"write": 0
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"read_only_onload": 0,
|
|
||||||
"search_fields": "",
|
|
||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"track_changes": 1,
|
"track_changes": 1
|
||||||
"track_seen": 0,
|
|
||||||
"track_views": 0
|
|
||||||
}
|
}
|
||||||
@@ -840,6 +840,7 @@ def get_opening_accounts(company):
|
|||||||
return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
|
return [{"account": a, "balance": get_balance_on(a)} for a in accounts]
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_against_jv(doctype, txt, searchfield, start, page_len, filters):
|
def get_against_jv(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql("""select jv.name, jv.posting_date, jv.user_remark
|
return frappe.db.sql("""select jv.name, jv.posting_date, jv.user_remark
|
||||||
from `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail
|
from `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class PaymentOrder(Document):
|
|||||||
for d in self.references:
|
for d in self.references:
|
||||||
frappe.db.set_value(self.payment_order_type, d.get(frappe.scrub(self.payment_order_type)), ref_field, status)
|
frappe.db.set_value(self.payment_order_type, d.get(frappe.scrub(self.payment_order_type)), ref_field, status)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_mop_query(doctype, txt, searchfield, start, page_len, filters):
|
def get_mop_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql(""" select mode_of_payment from `tabPayment Order Reference`
|
return frappe.db.sql(""" select mode_of_payment from `tabPayment Order Reference`
|
||||||
where parent = %(parent)s and mode_of_payment like %(txt)s
|
where parent = %(parent)s and mode_of_payment like %(txt)s
|
||||||
@@ -36,6 +37,7 @@ def get_mop_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
'txt': "%%%s%%" % txt
|
'txt': "%%%s%%" % txt
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
def get_supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql(""" select supplier from `tabPayment Order Reference`
|
return frappe.db.sql(""" select supplier from `tabPayment Order Reference`
|
||||||
where parent = %(parent)s and supplier like %(txt)s and
|
where parent = %(parent)s and supplier like %(txt)s and
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class PaymentReconciliation(Document):
|
|||||||
reconcile_against_document(lst)
|
reconcile_against_document(lst)
|
||||||
|
|
||||||
if dr_or_cr_notes:
|
if dr_or_cr_notes:
|
||||||
reconcile_dr_cr_note(dr_or_cr_notes)
|
reconcile_dr_cr_note(dr_or_cr_notes, self.company)
|
||||||
|
|
||||||
msgprint(_("Successfully Reconciled"))
|
msgprint(_("Successfully Reconciled"))
|
||||||
self.get_unreconciled_entries()
|
self.get_unreconciled_entries()
|
||||||
@@ -261,7 +261,7 @@ class PaymentReconciliation(Document):
|
|||||||
|
|
||||||
return cond
|
return cond
|
||||||
|
|
||||||
def reconcile_dr_cr_note(dr_cr_notes):
|
def reconcile_dr_cr_note(dr_cr_notes, company):
|
||||||
for d in dr_cr_notes:
|
for d in dr_cr_notes:
|
||||||
voucher_type = ('Credit Note'
|
voucher_type = ('Credit Note'
|
||||||
if d.voucher_type == 'Sales Invoice' else 'Debit Note')
|
if d.voucher_type == 'Sales Invoice' else 'Debit Note')
|
||||||
@@ -273,6 +273,7 @@ def reconcile_dr_cr_note(dr_cr_notes):
|
|||||||
"doctype": "Journal Entry",
|
"doctype": "Journal Entry",
|
||||||
"voucher_type": voucher_type,
|
"voucher_type": voucher_type,
|
||||||
"posting_date": today(),
|
"posting_date": today(),
|
||||||
|
"company": company,
|
||||||
"accounts": [
|
"accounts": [
|
||||||
{
|
{
|
||||||
'account': d.account,
|
'account': d.account,
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ def get_item_groups(pos_profile):
|
|||||||
def get_series():
|
def get_series():
|
||||||
return frappe.get_meta("Sales Invoice").get_field("naming_series").options or ""
|
return frappe.get_meta("Sales Invoice").get_field("naming_series").options or ""
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def pos_profile_query(doctype, txt, searchfield, start, page_len, filters):
|
def pos_profile_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
user = frappe.session['user']
|
user = frappe.session['user']
|
||||||
company = filters.get('company') or frappe.defaults.get_user_default('company')
|
company = filters.get('company') or frappe.defaults.get_user_default('company')
|
||||||
|
|||||||
@@ -432,6 +432,7 @@ def make_pricing_rule(doctype, docname):
|
|||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_item_uoms(doctype, txt, searchfield, start, page_len, filters):
|
def get_item_uoms(doctype, txt, searchfield, start, page_len, filters):
|
||||||
items = [filters.get('value')]
|
items = [filters.get('value')]
|
||||||
if filters.get('apply_on') != 'Item Code':
|
if filters.get('apply_on') != 'Item Code':
|
||||||
|
|||||||
@@ -140,10 +140,8 @@ def make_entry(args, adv_adj, update_outstanding):
|
|||||||
gle = frappe.new_doc("GL Entry")
|
gle = frappe.new_doc("GL Entry")
|
||||||
gle.update(args)
|
gle.update(args)
|
||||||
gle.flags.ignore_permissions = 1
|
gle.flags.ignore_permissions = 1
|
||||||
gle.validate()
|
gle.insert()
|
||||||
gle.db_insert()
|
|
||||||
gle.run_method("on_update_with_args", adv_adj, update_outstanding)
|
gle.run_method("on_update_with_args", adv_adj, update_outstanding)
|
||||||
gle.flags.ignore_validate = True
|
|
||||||
gle.submit()
|
gle.submit()
|
||||||
|
|
||||||
# check against budget
|
# check against budget
|
||||||
|
|||||||
@@ -289,6 +289,7 @@ def get_matching_transactions_payments(description_matching):
|
|||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def payment_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
def payment_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
|
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
|
||||||
if not account:
|
if not account:
|
||||||
@@ -317,6 +318,7 @@ def payment_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def journal_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
def journal_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
|
account = frappe.db.get_value("Bank Account", filters.get("bank_account"), "account")
|
||||||
|
|
||||||
@@ -352,6 +354,7 @@ def journal_entry_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def sales_invoices_query(doctype, txt, searchfield, start, page_len, filters):
|
def sales_invoices_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
|
|||||||
@@ -388,7 +388,7 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup
|
|||||||
from erpnext.accounts.doctype.tax_rule.tax_rule import get_tax_template, get_party_details
|
from erpnext.accounts.doctype.tax_rule.tax_rule import get_tax_template, get_party_details
|
||||||
args = {
|
args = {
|
||||||
party_type.lower(): party,
|
party_type.lower(): party,
|
||||||
"company": company
|
"company": company
|
||||||
}
|
}
|
||||||
|
|
||||||
if tax_category:
|
if tax_category:
|
||||||
|
|||||||
@@ -35,11 +35,9 @@ class Asset(AccountsController):
|
|||||||
if not self.booked_fixed_asset and self.validate_make_gl_entry():
|
if not self.booked_fixed_asset and self.validate_make_gl_entry():
|
||||||
self.make_gl_entries()
|
self.make_gl_entries()
|
||||||
|
|
||||||
def before_cancel(self):
|
|
||||||
self.cancel_auto_gen_movement()
|
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
self.validate_cancellation()
|
self.validate_cancellation()
|
||||||
|
self.cancel_movement_entries()
|
||||||
self.delete_depreciation_entries()
|
self.delete_depreciation_entries()
|
||||||
self.set_status()
|
self.set_status()
|
||||||
self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
|
self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
|
||||||
@@ -134,19 +132,6 @@ class Asset(AccountsController):
|
|||||||
Please do not book expense of multiple assets against one single Asset.")
|
Please do not book expense of multiple assets against one single Asset.")
|
||||||
.format(frappe.bold("equal"), "<br>"), title=_("Invalid Gross Purchase Amount"))
|
.format(frappe.bold("equal"), "<br>"), title=_("Invalid Gross Purchase Amount"))
|
||||||
|
|
||||||
def cancel_auto_gen_movement(self):
|
|
||||||
movements = frappe.db.sql(
|
|
||||||
"""SELECT asm.name, asm.docstatus
|
|
||||||
FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
|
|
||||||
WHERE asm_item.parent=asm.name and asm_item.asset=%s and asm.docstatus=1""", self.name, as_dict=1)
|
|
||||||
if len(movements) > 1:
|
|
||||||
frappe.throw(_('Asset has multiple Asset Movement Entries which has to be \
|
|
||||||
cancelled manually to cancel this asset.'))
|
|
||||||
if movements:
|
|
||||||
movement = frappe.get_doc('Asset Movement', movements[0].get('name'))
|
|
||||||
movement.flags.ignore_validate = True
|
|
||||||
movement.cancel()
|
|
||||||
|
|
||||||
def make_asset_movement(self):
|
def make_asset_movement(self):
|
||||||
reference_doctype = 'Purchase Receipt' if self.purchase_receipt else 'Purchase Invoice'
|
reference_doctype = 'Purchase Receipt' if self.purchase_receipt else 'Purchase Invoice'
|
||||||
reference_docname = self.purchase_receipt or self.purchase_invoice
|
reference_docname = self.purchase_receipt or self.purchase_invoice
|
||||||
@@ -413,6 +398,16 @@ class Asset(AccountsController):
|
|||||||
if self.status not in ("Submitted", "Partially Depreciated", "Fully Depreciated"):
|
if self.status not in ("Submitted", "Partially Depreciated", "Fully Depreciated"):
|
||||||
frappe.throw(_("Asset cannot be cancelled, as it is already {0}").format(self.status))
|
frappe.throw(_("Asset cannot be cancelled, as it is already {0}").format(self.status))
|
||||||
|
|
||||||
|
def cancel_movement_entries(self):
|
||||||
|
movements = frappe.db.sql(
|
||||||
|
"""SELECT asm.name, asm.docstatus
|
||||||
|
FROM `tabAsset Movement` asm, `tabAsset Movement Item` asm_item
|
||||||
|
WHERE asm_item.parent=asm.name and asm_item.asset=%s and asm.docstatus=1""", self.name, as_dict=1)
|
||||||
|
|
||||||
|
for movement in movements:
|
||||||
|
movement = frappe.get_doc('Asset Movement', movement.get('name'))
|
||||||
|
movement.cancel()
|
||||||
|
|
||||||
def delete_depreciation_entries(self):
|
def delete_depreciation_entries(self):
|
||||||
for d in self.get("schedules"):
|
for d in self.get("schedules"):
|
||||||
if d.journal_entry:
|
if d.journal_entry:
|
||||||
|
|||||||
@@ -88,33 +88,9 @@ class AssetMovement(Document):
|
|||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
self.set_latest_location_in_asset()
|
self.set_latest_location_in_asset()
|
||||||
|
|
||||||
def before_cancel(self):
|
|
||||||
self.validate_last_movement()
|
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
self.set_latest_location_in_asset()
|
self.set_latest_location_in_asset()
|
||||||
|
|
||||||
def validate_last_movement(self):
|
|
||||||
for d in self.assets:
|
|
||||||
auto_gen_movement_entry = frappe.db.sql(
|
|
||||||
"""
|
|
||||||
SELECT asm.name
|
|
||||||
FROM `tabAsset Movement Item` asm_item, `tabAsset Movement` asm
|
|
||||||
WHERE
|
|
||||||
asm.docstatus=1 and
|
|
||||||
asm_item.parent=asm.name and
|
|
||||||
asm_item.asset=%s and
|
|
||||||
asm.company=%s and
|
|
||||||
asm_item.source_location is NULL and
|
|
||||||
asm.purpose=%s
|
|
||||||
ORDER BY
|
|
||||||
asm.transaction_date asc
|
|
||||||
""", (d.asset, self.company, 'Receipt'), as_dict=1)
|
|
||||||
|
|
||||||
if auto_gen_movement_entry and auto_gen_movement_entry[0].get('name') == self.name:
|
|
||||||
frappe.throw(_('{0} will be cancelled automatically on asset cancellation as it was \
|
|
||||||
auto generated for Asset {1}').format(self.name, d.asset))
|
|
||||||
|
|
||||||
def set_latest_location_in_asset(self):
|
def set_latest_location_in_asset(self):
|
||||||
current_location, current_employee = '', ''
|
current_location, current_employee = '', ''
|
||||||
cond = "1=1"
|
cond = "1=1"
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ def get_list_context(context=None):
|
|||||||
})
|
})
|
||||||
return list_context
|
return list_context
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_supplier_contacts(doctype, txt, searchfield, start, page_len, filters):
|
def get_supplier_contacts(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql("""select `tabContact`.name from `tabContact`, `tabDynamic Link`
|
return frappe.db.sql("""select `tabContact`.name from `tabContact`, `tabDynamic Link`
|
||||||
where `tabDynamic Link`.link_doctype = 'Supplier' and (`tabDynamic Link`.link_name=%(name)s
|
where `tabDynamic Link`.link_doctype = 'Supplier' and (`tabDynamic Link`.link_name=%(name)s
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ from collections import defaultdict
|
|||||||
from erpnext.stock.get_item_details import _get_item_tax_template
|
from erpnext.stock.get_item_details import _get_item_tax_template
|
||||||
from frappe.utils import unique
|
from frappe.utils import unique
|
||||||
|
|
||||||
# searches for active employees
|
# searches for active employees
|
||||||
|
@frappe.whitelist()
|
||||||
def employee_query(doctype, txt, searchfield, start, page_len, filters):
|
def employee_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
conditions = []
|
conditions = []
|
||||||
fields = get_fields("Employee", ["name", "employee_name"])
|
fields = get_fields("Employee", ["name", "employee_name"])
|
||||||
@@ -40,6 +41,7 @@ def employee_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
|
|
||||||
|
|
||||||
# searches for leads which are not converted
|
# searches for leads which are not converted
|
||||||
|
@frappe.whitelist()
|
||||||
def lead_query(doctype, txt, searchfield, start, page_len, filters):
|
def lead_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
fields = get_fields("Lead", ["name", "lead_name", "company_name"])
|
fields = get_fields("Lead", ["name", "lead_name", "company_name"])
|
||||||
|
|
||||||
@@ -69,6 +71,7 @@ def lead_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
|
|
||||||
|
|
||||||
# searches for customer
|
# searches for customer
|
||||||
|
@frappe.whitelist()
|
||||||
def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
conditions = []
|
conditions = []
|
||||||
cust_master_name = frappe.defaults.get_user_default("cust_master_name")
|
cust_master_name = frappe.defaults.get_user_default("cust_master_name")
|
||||||
@@ -106,6 +109,7 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
|
|
||||||
|
|
||||||
# searches for supplier
|
# searches for supplier
|
||||||
|
@frappe.whitelist()
|
||||||
def supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
def supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
supp_master_name = frappe.defaults.get_user_default("supp_master_name")
|
supp_master_name = frappe.defaults.get_user_default("supp_master_name")
|
||||||
if supp_master_name == "Supplier Name":
|
if supp_master_name == "Supplier Name":
|
||||||
@@ -137,6 +141,7 @@ def supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
|
def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
company_currency = erpnext.get_company_currency(filters.get('company'))
|
company_currency = erpnext.get_company_currency(filters.get('company'))
|
||||||
|
|
||||||
@@ -162,6 +167,7 @@ def tax_account_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
return tax_accounts
|
return tax_accounts
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=False):
|
||||||
conditions = []
|
conditions = []
|
||||||
|
|
||||||
@@ -224,6 +230,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals
|
|||||||
}, as_dict=as_dict)
|
}, as_dict=as_dict)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def bom(doctype, txt, searchfield, start, page_len, filters):
|
def bom(doctype, txt, searchfield, start, page_len, filters):
|
||||||
conditions = []
|
conditions = []
|
||||||
fields = get_fields("BOM", ["name", "item"])
|
fields = get_fields("BOM", ["name", "item"])
|
||||||
@@ -250,6 +257,7 @@ def bom(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_project_name(doctype, txt, searchfield, start, page_len, filters):
|
def get_project_name(doctype, txt, searchfield, start, page_len, filters):
|
||||||
cond = ''
|
cond = ''
|
||||||
if filters.get('customer'):
|
if filters.get('customer'):
|
||||||
@@ -276,6 +284,7 @@ def get_project_name(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
|
def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, filters, as_dict):
|
||||||
fields = get_fields("Delivery Note", ["name", "customer", "posting_date"])
|
fields = get_fields("Delivery Note", ["name", "customer", "posting_date"])
|
||||||
|
|
||||||
@@ -305,6 +314,7 @@ def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len,
|
|||||||
}, {"txt": ("%%%s%%" % txt)}, as_dict=as_dict)
|
}, {"txt": ("%%%s%%" % txt)}, as_dict=as_dict)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
||||||
cond = ""
|
cond = ""
|
||||||
if filters.get("posting_date"):
|
if filters.get("posting_date"):
|
||||||
@@ -362,6 +372,7 @@ def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
limit %(start)s, %(page_len)s""".format(cond, match_conditions=get_match_cond(doctype)), args)
|
limit %(start)s, %(page_len)s""".format(cond, match_conditions=get_match_cond(doctype)), args)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_account_list(doctype, txt, searchfield, start, page_len, filters):
|
def get_account_list(doctype, txt, searchfield, start, page_len, filters):
|
||||||
filter_list = []
|
filter_list = []
|
||||||
|
|
||||||
@@ -385,6 +396,7 @@ def get_account_list(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
limit_start=start, limit_page_length=page_len, as_list=True)
|
limit_start=start, limit_page_length=page_len, as_list=True)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_blanket_orders(doctype, txt, searchfield, start, page_len, filters):
|
def get_blanket_orders(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql("""select distinct bo.name, bo.blanket_order_type, bo.to_date
|
return frappe.db.sql("""select distinct bo.name, bo.blanket_order_type, bo.to_date
|
||||||
from `tabBlanket Order` bo, `tabBlanket Order Item` boi
|
from `tabBlanket Order` bo, `tabBlanket Order Item` boi
|
||||||
@@ -570,7 +582,8 @@ def get_tax_template(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
args = {
|
args = {
|
||||||
'item_code': filters.get('item_code'),
|
'item_code': filters.get('item_code'),
|
||||||
'posting_date': filters.get('valid_from'),
|
'posting_date': filters.get('valid_from'),
|
||||||
'tax_category': filters.get('tax_category')
|
'tax_category': filters.get('tax_category'),
|
||||||
|
'company': filters.get('company')
|
||||||
}
|
}
|
||||||
|
|
||||||
taxes = _get_item_tax_template(args, taxes, for_validate=True)
|
taxes = _get_item_tax_template(args, taxes, for_validate=True)
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ class calculate_taxes_and_totals(object):
|
|||||||
'tax_category': self.doc.get('tax_category'),
|
'tax_category': self.doc.get('tax_category'),
|
||||||
'posting_date': self.doc.get('posting_date'),
|
'posting_date': self.doc.get('posting_date'),
|
||||||
'bill_date': self.doc.get('bill_date'),
|
'bill_date': self.doc.get('bill_date'),
|
||||||
'transaction_date': self.doc.get('transaction_date')
|
'transaction_date': self.doc.get('transaction_date'),
|
||||||
|
'company': self.doc.get('company')
|
||||||
}
|
}
|
||||||
|
|
||||||
item_group = item_doc.item_group
|
item_group = item_doc.item_group
|
||||||
|
|||||||
@@ -172,7 +172,9 @@ def get_number_cards():
|
|||||||
"doctype": "Number Card",
|
"doctype": "Number Card",
|
||||||
"document_type": "Lead",
|
"document_type": "Lead",
|
||||||
"name": "New Lead (Last 1 Month)",
|
"name": "New Lead (Last 1 Month)",
|
||||||
"filters_json": json.dumps([["Lead","creation","Previous","1 month",False]]),
|
"filters_json": json.dumps([
|
||||||
|
["Lead", "creation", "Timespan", "last month"]
|
||||||
|
]),
|
||||||
"function": "Count",
|
"function": "Count",
|
||||||
"is_public": 1,
|
"is_public": 1,
|
||||||
"label": _("New Lead (Last 1 Month)"),
|
"label": _("New Lead (Last 1 Month)"),
|
||||||
@@ -183,7 +185,9 @@ def get_number_cards():
|
|||||||
"doctype": "Number Card",
|
"doctype": "Number Card",
|
||||||
"document_type": "Opportunity",
|
"document_type": "Opportunity",
|
||||||
"name": "New Opportunity (Last 1 Month)",
|
"name": "New Opportunity (Last 1 Month)",
|
||||||
"filters_json": json.dumps([["Opportunity","creation","Previous","1 month",False]]),
|
"filters_json": json.dumps([
|
||||||
|
["Opportunity", "creation", "Timespan", "last month"]
|
||||||
|
]),
|
||||||
"function": "Count",
|
"function": "Count",
|
||||||
"is_public": 1,
|
"is_public": 1,
|
||||||
"label": _("New Opportunity (Last 1 Month)"),
|
"label": _("New Opportunity (Last 1 Month)"),
|
||||||
@@ -194,7 +198,10 @@ def get_number_cards():
|
|||||||
"doctype": "Number Card",
|
"doctype": "Number Card",
|
||||||
"document_type": "Opportunity",
|
"document_type": "Opportunity",
|
||||||
"name": "Won Opportunity (Last 1 Month)",
|
"name": "Won Opportunity (Last 1 Month)",
|
||||||
"filters_json": json.dumps([["Opportunity","creation","Previous","1 month",False]]),
|
"filters_json": json.dumps([
|
||||||
|
["Opportunity", "status", "=", "Converted",False],
|
||||||
|
["Opportunity", "creation", "Timespan", "last month"]
|
||||||
|
]),
|
||||||
"function": "Count",
|
"function": "Count",
|
||||||
"is_public": 1,
|
"is_public": 1,
|
||||||
"label": _("Won Opportunity (Last 1 Month)"),
|
"label": _("Won Opportunity (Last 1 Month)"),
|
||||||
|
|||||||
@@ -114,10 +114,12 @@ class Lead(SellingController):
|
|||||||
def set_lead_name(self):
|
def set_lead_name(self):
|
||||||
if not self.lead_name:
|
if not self.lead_name:
|
||||||
# Check for leads being created through data import
|
# Check for leads being created through data import
|
||||||
if not self.company_name and not self.flags.ignore_mandatory:
|
if not self.company_name and not self.email_id and not self.flags.ignore_mandatory:
|
||||||
frappe.throw(_("A Lead requires either a person's name or an organization's name"))
|
frappe.throw(_("A Lead requires either a person's name or an organization's name"))
|
||||||
|
elif self.company_name:
|
||||||
self.lead_name = self.company_name
|
self.lead_name = self.company_name
|
||||||
|
else:
|
||||||
|
self.lead_name = self.email_id.split("@")[0]
|
||||||
|
|
||||||
def set_title(self):
|
def set_title(self):
|
||||||
if self.organization_lead:
|
if self.organization_lead:
|
||||||
|
|||||||
@@ -113,6 +113,14 @@ cur_frm.cscript.calculate_total_amount = function(doc,cdt,cdn){
|
|||||||
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
cur_frm.cscript.calculate_total(doc,cdt,cdn);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cur_frm.fields_dict['cost_center'].get_query = function(doc) {
|
||||||
|
return {
|
||||||
|
filters: {
|
||||||
|
"company": doc.company
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
erpnext.expense_claim = {
|
erpnext.expense_claim = {
|
||||||
set_title: function(frm) {
|
set_title: function(frm) {
|
||||||
if (!frm.doc.task) {
|
if (!frm.doc.task) {
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ frappe.ui.form.on("Leave Application", {
|
|||||||
validate: function(frm) {
|
validate: function(frm) {
|
||||||
if (frm.doc.from_date == frm.doc.to_date && frm.doc.half_day == 1){
|
if (frm.doc.from_date == frm.doc.to_date && frm.doc.half_day == 1){
|
||||||
frm.doc.half_day_date = frm.doc.from_date;
|
frm.doc.half_day_date = frm.doc.from_date;
|
||||||
|
}else if (frm.doc.half_day == 0){
|
||||||
|
frm.doc.half_day_date = "";
|
||||||
}
|
}
|
||||||
frm.toggle_reqd("half_day_date", frm.doc.half_day == 1);
|
frm.toggle_reqd("half_day_date", frm.doc.half_day == 1);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -293,6 +293,8 @@ class LeaveApplication(Document):
|
|||||||
def set_half_day_date(self):
|
def set_half_day_date(self):
|
||||||
if self.from_date == self.to_date and self.half_day == 1:
|
if self.from_date == self.to_date and self.half_day == 1:
|
||||||
self.half_day_date = self.from_date
|
self.half_day_date = self.from_date
|
||||||
|
elif self.half_day == 0:
|
||||||
|
self.half_day_date = None
|
||||||
|
|
||||||
def notify_employee(self):
|
def notify_employee(self):
|
||||||
employee = frappe.get_doc("Employee", self.employee)
|
employee = frappe.get_doc("Employee", self.employee)
|
||||||
|
|||||||
@@ -910,6 +910,7 @@ def get_bom_diff(bom1, bom2):
|
|||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
meta = frappe.get_meta("Item", cached=True)
|
meta = frappe.get_meta("Item", cached=True)
|
||||||
searchfields = meta.get_search_fields()
|
searchfields = meta.get_search_fields()
|
||||||
|
|||||||
@@ -631,6 +631,7 @@ class WorkOrder(Document):
|
|||||||
bom.set_bom_material_details()
|
bom.set_bom_material_details()
|
||||||
return bom
|
return bom
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_bom_operations(doctype, txt, searchfield, start, page_len, filters):
|
def get_bom_operations(doctype, txt, searchfield, start, page_len, filters):
|
||||||
if txt:
|
if txt:
|
||||||
filters['operation'] = ('like', '%%%s%%' % txt)
|
filters['operation'] = ('like', '%%%s%%' % txt)
|
||||||
|
|||||||
@@ -708,3 +708,4 @@ erpnext.patches.v13_0.move_doctype_reports_and_notification_from_hr_to_payroll #
|
|||||||
erpnext.patches.v13_0.move_payroll_setting_separately_from_hr_settings #22-06-2020
|
erpnext.patches.v13_0.move_payroll_setting_separately_from_hr_settings #22-06-2020
|
||||||
erpnext.patches.v13_0.check_is_income_tax_component #22-06-2020
|
erpnext.patches.v13_0.check_is_income_tax_component #22-06-2020
|
||||||
erpnext.patches.v12_0.add_taxjar_integration_field
|
erpnext.patches.v12_0.add_taxjar_integration_field
|
||||||
|
erpnext.patches.v12_0.update_item_tax_template_company
|
||||||
|
|||||||
13
erpnext/patches/v12_0/update_item_tax_template_company.py
Normal file
13
erpnext/patches/v12_0/update_item_tax_template_company.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.reload_doc('accounts', 'doctype', 'item_tax_template')
|
||||||
|
|
||||||
|
item_tax_template_list = frappe.get_list('Item Tax Template')
|
||||||
|
for template in item_tax_template_list:
|
||||||
|
doc = frappe.get_doc('Item Tax Template', template.name)
|
||||||
|
for tax in doc.taxes:
|
||||||
|
doc.company = frappe.get_value('Account', tax.tax_type, 'company')
|
||||||
|
break
|
||||||
|
doc.save()
|
||||||
@@ -222,7 +222,7 @@ def get_benefit_amount_based_on_pro_rata(sal_struct, component_max_benefit):
|
|||||||
|
|
||||||
return benefit_amount
|
return benefit_amount
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_earning_components(doctype, txt, searchfield, start, page_len, filters):
|
def get_earning_components(doctype, txt, searchfield, start, page_len, filters):
|
||||||
if len(filters) < 2:
|
if len(filters) < 2:
|
||||||
return {}
|
return {}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ frappe.ui.form.on('Payroll Entry', {
|
|||||||
).toggleClass('btn-primary', !(frm.doc.employees || []).length);
|
).toggleClass('btn-primary', !(frm.doc.employees || []).length);
|
||||||
}
|
}
|
||||||
if ((frm.doc.employees || []).length) {
|
if ((frm.doc.employees || []).length) {
|
||||||
|
frm.page.clear_primary_action();
|
||||||
frm.page.set_primary_action(__('Create Salary Slips'), () => {
|
frm.page.set_primary_action(__('Create Salary Slips'), () => {
|
||||||
frm.save('Submit').then(()=>{
|
frm.save('Submit').then(()=>{
|
||||||
frm.page.clear_primary_action();
|
frm.page.clear_primary_action();
|
||||||
@@ -49,13 +50,14 @@ frappe.ui.form.on('Payroll Entry', {
|
|||||||
return frappe.call({
|
return frappe.call({
|
||||||
doc: frm.doc,
|
doc: frm.doc,
|
||||||
method: 'fill_employee_details',
|
method: 'fill_employee_details',
|
||||||
callback: function(r) {
|
}).then(r => {
|
||||||
if (r.docs[0].employees){
|
if (r.docs && r.docs[0].employees){
|
||||||
frm.save();
|
frm.employees = r.docs[0].employees;
|
||||||
frm.refresh();
|
frm.dirty();
|
||||||
if(r.docs[0].validate_attendance){
|
frm.save();
|
||||||
render_employee_attendance(frm, r.message);
|
frm.refresh();
|
||||||
}
|
if(r.docs[0].validate_attendance){
|
||||||
|
render_employee_attendance(frm, r.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -539,6 +539,7 @@ def submit_salary_slips_for_employees(payroll_entry, salary_slips, publish_progr
|
|||||||
if not_submitted_ss:
|
if not_submitted_ss:
|
||||||
frappe.msgprint(_("Could not submit some Salary Slips"))
|
frappe.msgprint(_("Could not submit some Salary Slips"))
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_payroll_entries_for_jv(doctype, txt, searchfield, start, page_len, filters):
|
def get_payroll_entries_for_jv(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
select name from `tabPayroll Entry`
|
select name from `tabPayroll Entry`
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ def get_list_context(context=None):
|
|||||||
"row_template": "templates/includes/projects/project_row.html"
|
"row_template": "templates/includes/projects/project_row.html"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_users_for_project(doctype, txt, searchfield, start, page_len, filters):
|
def get_users_for_project(doctype, txt, searchfield, start, page_len, filters):
|
||||||
conditions = []
|
conditions = []
|
||||||
return frappe.db.sql("""select name, concat_ws(' ', first_name, middle_name, last_name)
|
return frappe.db.sql("""select name, concat_ws(' ', first_name, middle_name, last_name)
|
||||||
|
|||||||
@@ -183,7 +183,8 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "progress",
|
"fieldname": "progress",
|
||||||
"fieldtype": "Percent",
|
"fieldtype": "Percent",
|
||||||
"label": "% Progress"
|
"label": "% Progress",
|
||||||
|
"no_copy": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
@@ -356,6 +357,7 @@
|
|||||||
"fieldname": "completed_by",
|
"fieldname": "completed_by",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Completed By",
|
"label": "Completed By",
|
||||||
|
"no_copy": 1,
|
||||||
"options": "User"
|
"options": "User"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -364,7 +366,7 @@
|
|||||||
"is_tree": 1,
|
"is_tree": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"max_attachments": 5,
|
"max_attachments": 5,
|
||||||
"modified": "2020-03-18 18:08:44.153211",
|
"modified": "2020-07-03 12:36:04.960457",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Task",
|
"name": "Task",
|
||||||
|
|||||||
@@ -188,6 +188,7 @@ def check_if_child_exists(name):
|
|||||||
return child_tasks
|
return child_tasks
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_project(doctype, txt, searchfield, start, page_len, filters):
|
def get_project(doctype, txt, searchfield, start, page_len, filters):
|
||||||
from erpnext.controllers.queries import get_match_cond
|
from erpnext.controllers.queries import get_match_cond
|
||||||
return frappe.db.sql(""" select name from `tabProject`
|
return frappe.db.sql(""" select name from `tabProject`
|
||||||
|
|||||||
@@ -1835,7 +1835,8 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
|||||||
|
|
||||||
if (doc.tax_category)
|
if (doc.tax_category)
|
||||||
filters['tax_category'] = doc.tax_category;
|
filters['tax_category'] = doc.tax_category;
|
||||||
|
if (doc.company)
|
||||||
|
filters['company'] = doc.company;
|
||||||
return {
|
return {
|
||||||
query: "erpnext.controllers.queries.get_tax_template",
|
query: "erpnext.controllers.queries.get_tax_template",
|
||||||
filters: filters
|
filters: filters
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
frappe.provide("erpnext.utils");
|
frappe.provide("erpnext.utils");
|
||||||
|
|
||||||
erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
||||||
if(!method) {
|
if (!method) {
|
||||||
method = "erpnext.accounts.party.get_party_details";
|
method = "erpnext.accounts.party.get_party_details";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,12 +22,12 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!args) {
|
if (!args) {
|
||||||
if((frm.doctype != "Purchase Order" && frm.doc.customer)
|
if ((frm.doctype != "Purchase Order" && frm.doc.customer)
|
||||||
|| (frm.doc.party_name && in_list(['Quotation', 'Opportunity'], frm.doc.doctype))) {
|
|| (frm.doc.party_name && in_list(['Quotation', 'Opportunity'], frm.doc.doctype))) {
|
||||||
|
|
||||||
let party_type = "Customer";
|
let party_type = "Customer";
|
||||||
if(frm.doc.quotation_to && frm.doc.quotation_to === "Lead") {
|
if (frm.doc.quotation_to && frm.doc.quotation_to === "Lead") {
|
||||||
party_type = "Lead";
|
party_type = "Lead";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
|||||||
party_type: party_type,
|
party_type: party_type,
|
||||||
price_list: frm.doc.selling_price_list
|
price_list: frm.doc.selling_price_list
|
||||||
};
|
};
|
||||||
} else if(frm.doc.supplier) {
|
} else if (frm.doc.supplier) {
|
||||||
args = {
|
args = {
|
||||||
party: frm.doc.supplier,
|
party: frm.doc.supplier,
|
||||||
party_type: "Supplier",
|
party_type: "Supplier",
|
||||||
@@ -78,13 +78,17 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
|||||||
args.posting_date = frm.doc.posting_date || frm.doc.transaction_date;
|
args.posting_date = frm.doc.posting_date || frm.doc.transaction_date;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!args || !args.party) return;
|
if (!args || !args.party) return;
|
||||||
|
|
||||||
if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
if (frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
||||||
if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
|
if (!erpnext.utils.validate_mandatory(frm, "Posting / Transaction Date",
|
||||||
args.posting_date, args.party_type=="Customer" ? "customer": "supplier")) return;
|
args.posting_date, args.party_type=="Customer" ? "customer": "supplier")) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!erpnext.utils.validate_mandatory(frm, "Company", frm.doc.company, args.party_type=="Customer" ? "customer": "supplier")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
args.currency = frm.doc.currency;
|
args.currency = frm.doc.currency;
|
||||||
args.company = frm.doc.company;
|
args.company = frm.doc.company;
|
||||||
args.doctype = frm.doc.doctype;
|
args.doctype = frm.doc.doctype;
|
||||||
@@ -92,14 +96,14 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
|||||||
method: method,
|
method: method,
|
||||||
args: args,
|
args: args,
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(r.message) {
|
if (r.message) {
|
||||||
frm.supplier_tds = r.message.supplier_tds;
|
frm.supplier_tds = r.message.supplier_tds;
|
||||||
frm.updating_party_details = true;
|
frm.updating_party_details = true;
|
||||||
frappe.run_serially([
|
frappe.run_serially([
|
||||||
() => frm.set_value(r.message),
|
() => frm.set_value(r.message),
|
||||||
() => {
|
() => {
|
||||||
frm.updating_party_details = false;
|
frm.updating_party_details = false;
|
||||||
if(callback) callback();
|
if (callback) callback();
|
||||||
frm.refresh();
|
frm.refresh();
|
||||||
erpnext.utils.add_item(frm);
|
erpnext.utils.add_item(frm);
|
||||||
}
|
}
|
||||||
@@ -110,9 +114,9 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
erpnext.utils.add_item = function(frm) {
|
erpnext.utils.add_item = function(frm) {
|
||||||
if(frm.is_new()) {
|
if (frm.is_new()) {
|
||||||
var prev_route = frappe.get_prev_route();
|
var prev_route = frappe.get_prev_route();
|
||||||
if(prev_route[1]==='Item' && !(frm.doc.items && frm.doc.items.length)) {
|
if (prev_route[1]==='Item' && !(frm.doc.items && frm.doc.items.length)) {
|
||||||
// add row
|
// add row
|
||||||
var item = frm.add_child('items');
|
var item = frm.add_child('items');
|
||||||
frm.refresh_field('items');
|
frm.refresh_field('items');
|
||||||
@@ -124,23 +128,23 @@ erpnext.utils.add_item = function(frm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
erpnext.utils.get_address_display = function(frm, address_field, display_field, is_your_company_address) {
|
erpnext.utils.get_address_display = function(frm, address_field, display_field, is_your_company_address) {
|
||||||
if(frm.updating_party_details) return;
|
if (frm.updating_party_details) return;
|
||||||
|
|
||||||
if(!address_field) {
|
if (!address_field) {
|
||||||
if(frm.doctype != "Purchase Order" && frm.doc.customer) {
|
if (frm.doctype != "Purchase Order" && frm.doc.customer) {
|
||||||
address_field = "customer_address";
|
address_field = "customer_address";
|
||||||
} else if(frm.doc.supplier) {
|
} else if (frm.doc.supplier) {
|
||||||
address_field = "supplier_address";
|
address_field = "supplier_address";
|
||||||
} else return;
|
} else return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!display_field) display_field = "address_display";
|
if (!display_field) display_field = "address_display";
|
||||||
if(frm.doc[address_field]) {
|
if (frm.doc[address_field]) {
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: "frappe.contacts.doctype.address.address.get_address_display",
|
method: "frappe.contacts.doctype.address.address.get_address_display",
|
||||||
args: {"address_dict": frm.doc[address_field] },
|
args: {"address_dict": frm.doc[address_field] },
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(r.message) {
|
if (r.message) {
|
||||||
frm.set_value(display_field, r.message)
|
frm.set_value(display_field, r.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,15 +155,15 @@ erpnext.utils.get_address_display = function(frm, address_field, display_field,
|
|||||||
};
|
};
|
||||||
|
|
||||||
erpnext.utils.set_taxes_from_address = function(frm, triggered_from_field, billing_address_field, shipping_address_field) {
|
erpnext.utils.set_taxes_from_address = function(frm, triggered_from_field, billing_address_field, shipping_address_field) {
|
||||||
if(frm.updating_party_details) return;
|
if (frm.updating_party_details) return;
|
||||||
|
|
||||||
if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
if (frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
||||||
if(!erpnext.utils.validate_mandatory(frm, "Lead/Customer/Supplier",
|
if (!erpnext.utils.validate_mandatory(frm, "Lead / Customer / Supplier",
|
||||||
frm.doc.customer || frm.doc.supplier || frm.doc.lead || frm.doc.party_name, triggered_from_field)) {
|
frm.doc.customer || frm.doc.supplier || frm.doc.lead || frm.doc.party_name, triggered_from_field)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
|
if (!erpnext.utils.validate_mandatory(frm, "Posting / Transaction Date",
|
||||||
frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
|
frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -175,8 +179,8 @@ erpnext.utils.set_taxes_from_address = function(frm, triggered_from_field, billi
|
|||||||
"shipping_address": frm.doc[shipping_address_field]
|
"shipping_address": frm.doc[shipping_address_field]
|
||||||
},
|
},
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(!r.exc){
|
if (!r.exc){
|
||||||
if(frm.doc.tax_category != r.message) {
|
if (frm.doc.tax_category != r.message) {
|
||||||
frm.set_value("tax_category", r.message);
|
frm.set_value("tax_category", r.message);
|
||||||
} else {
|
} else {
|
||||||
erpnext.utils.set_taxes(frm, triggered_from_field);
|
erpnext.utils.set_taxes(frm, triggered_from_field);
|
||||||
@@ -187,13 +191,17 @@ erpnext.utils.set_taxes_from_address = function(frm, triggered_from_field, billi
|
|||||||
};
|
};
|
||||||
|
|
||||||
erpnext.utils.set_taxes = function(frm, triggered_from_field) {
|
erpnext.utils.set_taxes = function(frm, triggered_from_field) {
|
||||||
if(frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
if (frappe.meta.get_docfield(frm.doc.doctype, "taxes")) {
|
||||||
if(!erpnext.utils.validate_mandatory(frm, "Lead/Customer/Supplier",
|
if (!erpnext.utils.validate_mandatory(frm, "Company", frm.doc.company, triggered_from_field)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!erpnext.utils.validate_mandatory(frm, "Lead / Customer / Supplier",
|
||||||
frm.doc.customer || frm.doc.supplier || frm.doc.lead || frm.doc.party_name, triggered_from_field)) {
|
frm.doc.customer || frm.doc.supplier || frm.doc.lead || frm.doc.party_name, triggered_from_field)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!erpnext.utils.validate_mandatory(frm, "Posting/Transaction Date",
|
if (!erpnext.utils.validate_mandatory(frm, "Posting / Transaction Date",
|
||||||
frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
|
frm.doc.posting_date || frm.doc.transaction_date, triggered_from_field)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -230,7 +238,7 @@ erpnext.utils.set_taxes = function(frm, triggered_from_field) {
|
|||||||
"shipping_address": frm.doc.shipping_address_name
|
"shipping_address": frm.doc.shipping_address_name
|
||||||
},
|
},
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(r.message){
|
if (r.message){
|
||||||
frm.set_value("taxes_and_charges", r.message)
|
frm.set_value("taxes_and_charges", r.message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,14 +246,14 @@ erpnext.utils.set_taxes = function(frm, triggered_from_field) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
erpnext.utils.get_contact_details = function(frm) {
|
erpnext.utils.get_contact_details = function(frm) {
|
||||||
if(frm.updating_party_details) return;
|
if (frm.updating_party_details) return;
|
||||||
|
|
||||||
if(frm.doc["contact_person"]) {
|
if (frm.doc["contact_person"]) {
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method: "frappe.contacts.doctype.contact.contact.get_contact_details",
|
method: "frappe.contacts.doctype.contact.contact.get_contact_details",
|
||||||
args: {contact: frm.doc.contact_person },
|
args: {contact: frm.doc.contact_person },
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(r.message)
|
if (r.message)
|
||||||
frm.set_value(r.message);
|
frm.set_value(r.message);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -253,10 +261,10 @@ erpnext.utils.get_contact_details = function(frm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
erpnext.utils.validate_mandatory = function(frm, label, value, trigger_on) {
|
erpnext.utils.validate_mandatory = function(frm, label, value, trigger_on) {
|
||||||
if(!value) {
|
if (!value) {
|
||||||
frm.doc[trigger_on] = "";
|
frm.doc[trigger_on] = "";
|
||||||
refresh_field(trigger_on);
|
refresh_field(trigger_on);
|
||||||
frappe.msgprint(__("Please enter {0} first", [label]));
|
frappe.throw({message:__("Please enter {0} first", [label]), title:__("Mandatory")});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -271,12 +279,12 @@ erpnext.utils.get_shipping_address = function(frm, callback){
|
|||||||
address: frm.doc.shipping_address
|
address: frm.doc.shipping_address
|
||||||
},
|
},
|
||||||
callback: function(r){
|
callback: function(r){
|
||||||
if(r.message){
|
if (r.message){
|
||||||
frm.set_value("shipping_address", r.message[0]) //Address title or name
|
frm.set_value("shipping_address", r.message[0]) //Address title or name
|
||||||
frm.set_value("shipping_address_display", r.message[1]) //Address to be displayed on the page
|
frm.set_value("shipping_address_display", r.message[1]) //Address to be displayed on the page
|
||||||
}
|
}
|
||||||
|
|
||||||
if(callback){
|
if (callback){
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,21 +5,28 @@ frappe.ui.form.on('Quality Feedback', {
|
|||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
frm.set_value("date", frappe.datetime.get_today());
|
frm.set_value("date", frappe.datetime.get_today());
|
||||||
},
|
},
|
||||||
template: function(frm){
|
|
||||||
frappe.call({
|
template: function(frm) {
|
||||||
"method": "frappe.client.get",
|
if (frm.doc.template) {
|
||||||
args: {
|
frappe.call({
|
||||||
doctype: "Quality Feedback Template",
|
"method": "frappe.client.get",
|
||||||
name: frm.doc.template
|
args: {
|
||||||
},
|
doctype: "Quality Feedback Template",
|
||||||
callback: function(data){
|
name: frm.doc.template
|
||||||
frm.fields_dict.parameters.grid.remove_all();
|
},
|
||||||
for (var i in data.message.parameters){
|
callback: function(data) {
|
||||||
frm.add_child("parameters");
|
if (data && data.message) {
|
||||||
frm.fields_dict.parameters.get_value()[i].parameter = data.message.parameters[i].parameter;
|
frm.fields_dict.parameters.grid.remove_all();
|
||||||
|
|
||||||
|
// fetch parameters from template and autofill
|
||||||
|
for (let template_parameter of data.message.parameters) {
|
||||||
|
let row = frm.add_child("parameters");
|
||||||
|
row.parameter = template_parameter.parameter;
|
||||||
|
}
|
||||||
|
frm.refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
frm.refresh();
|
});
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"actions": [],
|
||||||
"autoname": "format:FDBK-{#####}",
|
"autoname": "format:FDBK-{#####}",
|
||||||
"creation": "2019-05-26 21:23:05.308379",
|
"creation": "2019-05-26 21:23:05.308379",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
@@ -53,12 +54,13 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "document_name",
|
"fieldname": "document_name",
|
||||||
"fieldtype": "Dynamic Link",
|
"fieldtype": "Dynamic Link",
|
||||||
"label": "Name",
|
"label": "Feedback By",
|
||||||
"options": "document_type",
|
"options": "document_type",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2019-05-28 15:16:01.161662",
|
"links": [],
|
||||||
|
"modified": "2020-07-03 15:50:58.589302",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Quality Management",
|
"module": "Quality Management",
|
||||||
"name": "Quality Feedback",
|
"name": "Quality Feedback",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"actions": [],
|
||||||
"autoname": "format:TMPL-{template}",
|
"autoname": "format:TMPL-{template}",
|
||||||
"creation": "2019-05-26 21:17:24.283061",
|
"creation": "2019-05-26 21:17:24.283061",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
@@ -30,10 +31,12 @@
|
|||||||
"fieldname": "parameters",
|
"fieldname": "parameters",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Parameters",
|
"label": "Parameters",
|
||||||
"options": "Quality Feedback Template Parameter"
|
"options": "Quality Feedback Template Parameter",
|
||||||
|
"reqd": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"modified": "2019-05-26 21:48:47.770610",
|
"links": [],
|
||||||
|
"modified": "2020-07-03 16:06:03.749415",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Quality Management",
|
"module": "Quality Management",
|
||||||
"name": "Quality Feedback Template",
|
"name": "Quality Feedback Template",
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ def make_invoice(table, customer, mode_of_payment):
|
|||||||
|
|
||||||
return invoice.name
|
return invoice.name
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_query_restaurant(doctype='Item', txt='', searchfield='name', start=0, page_len=20, filters=None, as_dict=False):
|
def item_query_restaurant(doctype='Item', txt='', searchfield='name', start=0, page_len=20, filters=None, as_dict=False):
|
||||||
'''Return items that are selected in active menu of the restaurant'''
|
'''Return items that are selected in active menu of the restaurant'''
|
||||||
restaurant, menu = get_restaurant_and_menu_name(filters['table'])
|
restaurant, menu = get_restaurant_and_menu_name(filters['table'])
|
||||||
|
|||||||
@@ -541,6 +541,7 @@ def make_address(args, is_primary_address=1):
|
|||||||
|
|
||||||
return address
|
return address
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_customer_primary_contact(doctype, txt, searchfield, start, page_len, filters):
|
def get_customer_primary_contact(doctype, txt, searchfield, start, page_len, filters):
|
||||||
customer = filters.get('customer')
|
customer = filters.get('customer')
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
|
|||||||
@@ -26,8 +26,9 @@ class ProductBundle(Document):
|
|||||||
def validate_child_items(self):
|
def validate_child_items(self):
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
if frappe.db.exists("Product Bundle", item.item_code):
|
if frappe.db.exists("Product Bundle", item.item_code):
|
||||||
frappe.throw(_("Child Item should not be a Product Bundle. Please remove item `{0}` and save").format(item.item_code))
|
frappe.throw(_("Row #{0}: Child Item should not be a Product Bundle. Please remove Item {1} and Save").format(item.idx, frappe.bold(item.item_code)))
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_new_item_code(doctype, txt, searchfield, start, page_len, filters):
|
def get_new_item_code(doctype, txt, searchfield, start, page_len, filters):
|
||||||
from erpnext.controllers.queries import get_match_cond
|
from erpnext.controllers.queries import get_match_cond
|
||||||
|
|
||||||
|
|||||||
@@ -167,6 +167,7 @@ def get_item_group_condition(pos_profile):
|
|||||||
|
|
||||||
return cond % tuple(item_groups)
|
return cond % tuple(item_groups)
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_group_query(doctype, txt, searchfield, start, page_len, filters):
|
def item_group_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
item_groups = []
|
item_groups = []
|
||||||
cond = "1=1"
|
cond = "1=1"
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class ItemAlternative(Document):
|
|||||||
'alternative_item_code': self.alternative_item_code, 'name': ('!=', self.name)}):
|
'alternative_item_code': self.alternative_item_code, 'name': ('!=', self.name)}):
|
||||||
frappe.throw(_("Already record exists for the item {0}").format(self.item_code))
|
frappe.throw(_("Already record exists for the item {0}").format(self.item_code))
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_alternative_items(doctype, txt, searchfield, start, page_len, filters):
|
def get_alternative_items(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.db.sql(""" (select alternative_item_code from `tabItem Alternative`
|
return frappe.db.sql(""" (select alternative_item_code from `tabItem Alternative`
|
||||||
where item_code = %(item_code)s and alternative_item_code like %(txt)s)
|
where item_code = %(item_code)s and alternative_item_code like %(txt)s)
|
||||||
|
|||||||
@@ -172,7 +172,7 @@
|
|||||||
"default": "Today",
|
"default": "Today",
|
||||||
"fieldname": "valid_from",
|
"fieldname": "valid_from",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "Valid From "
|
"label": "Valid From"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "valid_upto",
|
"fieldname": "valid_upto",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "Valid Upto "
|
"label": "Valid Upto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "section_break_24",
|
"fieldname": "section_break_24",
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
"icon": "fa fa-flag",
|
"icon": "fa fa-flag",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-02-28 14:21:25.580331",
|
"modified": "2020-07-06 22:31:32.943475",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Item Price",
|
"name": "Item Price",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
"actions": [],
|
|
||||||
"creation": "2013-02-22 01:28:01",
|
"creation": "2013-02-22 01:28:01",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"editable_grid": 1,
|
"editable_grid": 1,
|
||||||
@@ -38,8 +37,7 @@
|
|||||||
],
|
],
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"modified": "2020-06-25 01:40:28.859752",
|
||||||
"modified": "2019-12-28 21:54:40.807849",
|
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Item Tax",
|
"name": "Item Tax",
|
||||||
|
|||||||
@@ -402,6 +402,7 @@ def get_material_requests_based_on_supplier(doctype, txt, searchfield, start, pa
|
|||||||
|
|
||||||
return material_requests
|
return material_requests
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def get_default_supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
def get_default_supplier_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
doc = frappe.get_doc("Material Request", filters.get("doc"))
|
doc = frappe.get_doc("Material Request", filters.get("doc"))
|
||||||
item_list = []
|
item_list = []
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ class PackingSlip(Document):
|
|||||||
|
|
||||||
self.update_item_details()
|
self.update_item_details()
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_details(doctype, txt, searchfield, start, page_len, filters):
|
def item_details(doctype, txt, searchfield, start, page_len, filters):
|
||||||
from erpnext.controllers.queries import get_match_cond
|
from erpnext.controllers.queries import get_match_cond
|
||||||
return frappe.db.sql("""select name, item_name, description from `tabItem`
|
return frappe.db.sql("""select name, item_name, description from `tabItem`
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ class QualityInspection(Document):
|
|||||||
.format(parent_doc=self.reference_type, child_doc=doctype),
|
.format(parent_doc=self.reference_type, child_doc=doctype),
|
||||||
(quality_inspection, self.modified, self.reference_name, self.item_code))
|
(quality_inspection, self.modified, self.reference_name, self.item_code))
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
def item_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
if filters.get("from"):
|
if filters.get("from"):
|
||||||
from frappe.desk.reportview import get_match_cond
|
from frappe.desk.reportview import get_match_cond
|
||||||
@@ -86,6 +87,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
page_len = page_len, qi_condition = qi_condition),
|
page_len = page_len, qi_condition = qi_condition),
|
||||||
{'parent': filters.get('parent'), 'txt': "%%%s%%" % txt})
|
{'parent': filters.get('parent'), 'txt': "%%%s%%" % txt})
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters):
|
def quality_inspection_query(doctype, txt, searchfield, start, page_len, filters):
|
||||||
return frappe.get_all('Quality Inspection',
|
return frappe.get_all('Quality Inspection',
|
||||||
limit_start=start,
|
limit_start=start,
|
||||||
|
|||||||
@@ -413,7 +413,7 @@ def get_item_tax_info(company, tax_category, item_codes):
|
|||||||
continue
|
continue
|
||||||
out[item_code] = {}
|
out[item_code] = {}
|
||||||
item = frappe.get_cached_doc("Item", item_code)
|
item = frappe.get_cached_doc("Item", item_code)
|
||||||
get_item_tax_template({"tax_category": tax_category}, item, out[item_code])
|
get_item_tax_template({"company": company, "tax_category": tax_category}, item, out[item_code])
|
||||||
out[item_code]["item_tax_rate"] = get_item_tax_map(company, out[item_code].get("item_tax_template"), as_json=True)
|
out[item_code]["item_tax_rate"] = get_item_tax_map(company, out[item_code].get("item_tax_template"), as_json=True)
|
||||||
|
|
||||||
return out
|
return out
|
||||||
@@ -442,7 +442,8 @@ def _get_item_tax_template(args, taxes, out={}, for_validate=False):
|
|||||||
taxes_with_no_validity = []
|
taxes_with_no_validity = []
|
||||||
|
|
||||||
for tax in taxes:
|
for tax in taxes:
|
||||||
if tax.valid_from:
|
tax_company = frappe.get_value("Item Tax Template", tax.item_tax_template, 'company')
|
||||||
|
if tax.valid_from and tax_company == args['company']:
|
||||||
# In purchase Invoice first preference will be given to supplier invoice date
|
# In purchase Invoice first preference will be given to supplier invoice date
|
||||||
# if supplier date is not present then posting date
|
# if supplier date is not present then posting date
|
||||||
validation_date = args.get('transaction_date') or args.get('bill_date') or args.get('posting_date')
|
validation_date = args.get('transaction_date') or args.get('bill_date') or args.get('posting_date')
|
||||||
@@ -450,7 +451,8 @@ def _get_item_tax_template(args, taxes, out={}, for_validate=False):
|
|||||||
if getdate(tax.valid_from) <= getdate(validation_date):
|
if getdate(tax.valid_from) <= getdate(validation_date):
|
||||||
taxes_with_validity.append(tax)
|
taxes_with_validity.append(tax)
|
||||||
else:
|
else:
|
||||||
taxes_with_no_validity.append(tax)
|
if tax_company == args['company']:
|
||||||
|
taxes_with_no_validity.append(tax)
|
||||||
|
|
||||||
if taxes_with_validity:
|
if taxes_with_validity:
|
||||||
taxes = sorted(taxes_with_validity, key = lambda i: i.valid_from, reverse=True)
|
taxes = sorted(taxes_with_validity, key = lambda i: i.valid_from, reverse=True)
|
||||||
@@ -637,6 +639,10 @@ def get_item_price(args, item_code, ignore_party=False):
|
|||||||
conditions += """ and %(transaction_date)s between
|
conditions += """ and %(transaction_date)s between
|
||||||
ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')"""
|
ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')"""
|
||||||
|
|
||||||
|
if args.get('posting_date'):
|
||||||
|
conditions += """ and %(posting_date)s between
|
||||||
|
ifnull(valid_from, '2000-01-01') and ifnull(valid_upto, '2500-12-31')"""
|
||||||
|
|
||||||
return frappe.db.sql(""" select name, price_list_rate, uom
|
return frappe.db.sql(""" select name, price_list_rate, uom
|
||||||
from `tabItem Price` {conditions}
|
from `tabItem Price` {conditions}
|
||||||
order by valid_from desc, uom desc """.format(conditions=conditions), args)
|
order by valid_from desc, uom desc """.format(conditions=conditions), args)
|
||||||
@@ -657,6 +663,7 @@ def get_price_list_rate_for(args, item_code):
|
|||||||
"supplier": args.get('supplier'),
|
"supplier": args.get('supplier'),
|
||||||
"uom": args.get('uom'),
|
"uom": args.get('uom'),
|
||||||
"transaction_date": args.get('transaction_date'),
|
"transaction_date": args.get('transaction_date'),
|
||||||
|
"posting_date": args.get('posting_date'),
|
||||||
}
|
}
|
||||||
|
|
||||||
item_price_data = 0
|
item_price_data = 0
|
||||||
|
|||||||
@@ -120,6 +120,16 @@ class TransactionBase(StatusUpdater):
|
|||||||
|
|
||||||
|
|
||||||
def validate_rate_with_reference_doc(self, ref_details):
|
def validate_rate_with_reference_doc(self, ref_details):
|
||||||
|
buying_doctypes = ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]
|
||||||
|
selling_doctypes = ["Sales Invoice", "Delivery Note"]
|
||||||
|
|
||||||
|
if self.doctype in buying_doctypes:
|
||||||
|
to_disable = "Maintain same rate throughout Purchase cycle"
|
||||||
|
settings_page = "Buying Settings"
|
||||||
|
else:
|
||||||
|
to_disable = "Maintain same rate throughout Sales cycle"
|
||||||
|
settings_page = "Selling Settings"
|
||||||
|
|
||||||
for ref_dt, ref_dn_field, ref_link_field in ref_details:
|
for ref_dt, ref_dn_field, ref_link_field in ref_details:
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
if d.get(ref_link_field):
|
if d.get(ref_link_field):
|
||||||
@@ -129,8 +139,8 @@ class TransactionBase(StatusUpdater):
|
|||||||
frappe.msgprint(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4}) ")
|
frappe.msgprint(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4}) ")
|
||||||
.format(d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate))
|
.format(d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate))
|
||||||
frappe.throw(_("To allow different rates, disable the {0} checkbox in {1}.")
|
frappe.throw(_("To allow different rates, disable the {0} checkbox in {1}.")
|
||||||
.format(frappe.bold(_("Maintain Same Rate Throughout Sales Cycle")),
|
.format(frappe.bold(_(to_disable)),
|
||||||
get_link_to_form("Selling Settings", "Selling Settings", frappe.bold("Selling Settings"))))
|
get_link_to_form(settings_page, settings_page, frappe.bold(settings_page))))
|
||||||
|
|
||||||
def get_link_filters(self, for_doctype):
|
def get_link_filters(self, for_doctype):
|
||||||
if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype):
|
if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype):
|
||||||
|
|||||||
Reference in New Issue
Block a user