Merge branch 'develop' of https://github.com/frappe/erpnext into develop

This commit is contained in:
Khushal Trivedi 2019-12-24 12:28:55 +05:30
commit a65a3d063c
26 changed files with 430 additions and 789 deletions

View File

@ -13,9 +13,26 @@
</div> </div>
Includes: Accounting, Inventory, Manufacturing, CRM, Sales, Purchase, Project Management, HRMS. Requires MariaDB. ERPNext as a monolith includes the following areas for managing businesses:
ERPNext is built on the [Frappe](https://github.com/frappe/frappe) Framework, a full-stack web app framework in Python & JavaScript. 1. [Accounting](https://erpnext.com/docs/user/manual/en/accounts)
1. [Inventory](https://erpnext.com/docs/user/manual/en/stock)
1. [CRM](https://erpnext.com/docs/user/manual/en/CRM)
1. [Sales](https://erpnext.com/docs/user/manual/en/selling)
1. [Purchase](https://erpnext.com/docs/user/manual/en/buying)
1. [HRMS](https://erpnext.com/docs/user/manual/en/human-resources)
1. [Project Management](https://erpnext.com/docs/user/manual/en/projects)
1. [Support](https://erpnext.com/docs/user/manual/en/support)
1. [Asset Management](https://erpnext.com/docs/user/manual/en/asset)
1. [Quality Management](https://erpnext.com/docs/user/manual/en/quality-management)
1. [Manufacturing](https://erpnext.com/docs/user/manual/en/manufacturing)
1. [Website Management](https://erpnext.com/docs/user/manual/en/website)
1. [Customize ERPNext](https://erpnext.com/docs/user/manual/en/customize-erpnext)
1. [And More](https://erpnext.com/docs/user/manual/en/)
ERPNext requires MariaDB.
ERPNext is built on the [Frappe Framework](https://github.com/frappe/frappe), a full-stack web app framework built with Python & JavaScript.
- [User Guide](https://erpnext.com/docs/user) - [User Guide](https://erpnext.com/docs/user)
- [Discussion Forum](https://discuss.erpnext.com/) - [Discussion Forum](https://discuss.erpnext.com/)

View File

@ -29,7 +29,6 @@ class GLEntry(Document):
self.validate_and_set_fiscal_year() self.validate_and_set_fiscal_year()
self.pl_must_have_cost_center() self.pl_must_have_cost_center()
self.validate_cost_center() self.validate_cost_center()
self.validate_dimensions_for_pl_and_bs()
if not self.flags.from_repost: if not self.flags.from_repost:
self.check_pl_account() self.check_pl_account()
@ -39,6 +38,7 @@ class GLEntry(Document):
def on_update_with_args(self, adv_adj, update_outstanding = 'Yes', from_repost=False): def on_update_with_args(self, adv_adj, update_outstanding = 'Yes', from_repost=False):
if not from_repost: if not from_repost:
self.validate_account_details(adv_adj) self.validate_account_details(adv_adj)
self.validate_dimensions_for_pl_and_bs()
check_freezing_date(self.posting_date, adv_adj) check_freezing_date(self.posting_date, adv_adj)
validate_frozen_account(self.account, adv_adj) validate_frozen_account(self.account, adv_adj)

View File

@ -190,7 +190,6 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
if(jvd.reference_type==="Employee Advance") { if(jvd.reference_type==="Employee Advance") {
return { return {
filters: { filters: {
'status': ['=', 'Unpaid'],
'docstatus': 1 'docstatus': 1
} }
}; };

View File

@ -968,7 +968,7 @@ def get_exchange_rate(posting_date, account=None, account_currency=None, company
# The date used to retreive the exchange rate here is the date passed # The date used to retreive the exchange rate here is the date passed
# in as an argument to this function. # in as an argument to this function.
elif (not exchange_rate or exchange_rate==1) and account_currency and posting_date: elif (not exchange_rate or flt(exchange_rate)==1) and account_currency and posting_date:
exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date) exchange_rate = get_exchange_rate(account_currency, company_currency, posting_date)
else: else:
exchange_rate = 1 exchange_rate = 1

View File

@ -652,12 +652,14 @@ frappe.ui.form.on('Payment Entry', {
(frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student") (frm.doc.payment_type=="Receive" && frm.doc.party_type=="Student")
) { ) {
if(total_positive_outstanding > total_negative_outstanding) if(total_positive_outstanding > total_negative_outstanding)
if (!frm.doc.paid_amount)
frm.set_value("paid_amount", frm.set_value("paid_amount",
total_positive_outstanding - total_negative_outstanding); total_positive_outstanding - total_negative_outstanding);
} else if ( } else if (
total_negative_outstanding && total_negative_outstanding &&
total_positive_outstanding < total_negative_outstanding total_positive_outstanding < total_negative_outstanding
) { ) {
if (!frm.doc.received_amount)
frm.set_value("received_amount", frm.set_value("received_amount",
total_negative_outstanding - total_positive_outstanding); total_negative_outstanding - total_positive_outstanding);
} }

View File

@ -285,7 +285,7 @@ class ReceivablePayableReport(object):
def set_party_details(self, row): def set_party_details(self, row):
# customer / supplier name # customer / supplier name
party_details = self.get_party_details(row.party) party_details = self.get_party_details(row.party) or {}
row.update(party_details) row.update(party_details)
if self.filters.get(scrub(self.filters.party_type)): if self.filters.get(scrub(self.filters.party_type)):
row.currency = row.account_currency row.currency = row.account_currency

View File

@ -110,7 +110,7 @@ class AssetMovement(Document):
ORDER BY ORDER BY
asm.transaction_date asc asm.transaction_date asc
""", (d.asset, self.company, 'Receipt'), as_dict=1) """, (d.asset, self.company, 'Receipt'), as_dict=1)
if auto_gen_movement_entry[0].get('name') == self.name: 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 \ frappe.throw(_('{0} will be cancelled automatically on asset cancellation as it was \
auto generated for Asset {1}').format(self.name, d.asset)) auto generated for Asset {1}').format(self.name, d.asset))

View File

@ -1,4 +1,5 @@
{ {
"actions": [],
"allow_import": 1, "allow_import": 1,
"autoname": "naming_series:", "autoname": "naming_series:",
"creation": "2013-05-21 16:16:39", "creation": "2013-05-21 16:16:39",
@ -47,6 +48,7 @@
"ignore_pricing_rule", "ignore_pricing_rule",
"sec_warehouse", "sec_warehouse",
"set_warehouse", "set_warehouse",
"set_reserve_warehouse",
"col_break_warehouse", "col_break_warehouse",
"is_subcontracted", "is_subcontracted",
"supplier_warehouse", "supplier_warehouse",
@ -1039,12 +1041,20 @@
"fieldtype": "Link", "fieldtype": "Link",
"label": "Tax Category", "label": "Tax Category",
"options": "Tax Category" "options": "Tax Category"
},
{
"depends_on": "supplied_items",
"fieldname": "set_reserve_warehouse",
"fieldtype": "Link",
"label": "Set Reserve Warehouse",
"options": "Warehouse"
} }
], ],
"icon": "fa fa-file-text", "icon": "fa fa-file-text",
"idx": 105, "idx": 105,
"is_submittable": 1, "is_submittable": 1,
"modified": "2019-07-11 18:25:49.509343", "links": [],
"modified": "2019-12-18 13:13:22.852412",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Buying", "module": "Buying",
"name": "Purchase Order", "name": "Purchase Order",

View File

@ -138,7 +138,7 @@ def refresh_scorecards():
# Check to see if any new scorecard periods are created # Check to see if any new scorecard periods are created
if make_all_scorecards(sc.name) > 0: if make_all_scorecards(sc.name) > 0:
# Save the scorecard to update the score and standings # Save the scorecard to update the score and standings
sc.save() frappe.get_doc('Supplier Scorecard', sc.name).save()
@frappe.whitelist() @frappe.whitelist()

View File

@ -11,7 +11,7 @@ from datetime import timedelta
import frappe import frappe
from frappe import _ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils import get_url from frappe.utils import get_url, getdate
from frappe.utils.verified_command import verify_request, get_signed_params from frappe.utils.verified_command import verify_request, get_signed_params
@ -117,7 +117,7 @@ class Appointment(Document):
if self._assign: if self._assign:
return return
available_agents = _get_agents_sorted_by_asc_workload( available_agents = _get_agents_sorted_by_asc_workload(
self.scheduled_time.date()) getdate(self.scheduled_time))
for agent in available_agents: for agent in available_agents:
if(_check_agent_availability(agent, self.scheduled_time)): if(_check_agent_availability(agent, self.scheduled_time)):
agent = agent[0] agent = agent[0]
@ -189,7 +189,7 @@ def _get_agents_sorted_by_asc_workload(date):
assigned_to = frappe.parse_json(appointment._assign) assigned_to = frappe.parse_json(appointment._assign)
if not assigned_to: if not assigned_to:
continue continue
if (assigned_to[0] in agent_list) and appointment.scheduled_time.date() == date: if (assigned_to[0] in agent_list) and getdate(appointment.scheduled_time) == date:
appointment_counter[assigned_to[0]] += 1 appointment_counter[assigned_to[0]] += 1
sorted_agent_list = appointment_counter.most_common() sorted_agent_list = appointment_counter.most_common()
sorted_agent_list.reverse() sorted_agent_list.reverse()

View File

@ -232,7 +232,6 @@
"reqd": 1 "reqd": 1
}, },
{ {
"description": "You can enter any date manually",
"fieldname": "date_of_birth", "fieldname": "date_of_birth",
"fieldtype": "Date", "fieldtype": "Date",
"label": "Date of Birth", "label": "Date of Birth",

View File

@ -34,7 +34,7 @@ frappe.ui.form.on('Employee Advance', {
} }
else if ( else if (
frm.doc.docstatus === 1 frm.doc.docstatus === 1
&& flt(frm.doc.claimed_amount) < flt(frm.doc.paid_amount) && flt(frm.doc.claimed_amount) < flt(frm.doc.paid_amount) - flt(frm.doc.return_amount)
&& frappe.model.can_create("Expense Claim") && frappe.model.can_create("Expense Claim")
) { ) {
frm.add_custom_button( frm.add_custom_button(
@ -45,6 +45,15 @@ frappe.ui.form.on('Employee Advance', {
__('Create') __('Create')
); );
} }
if (frm.doc.docstatus === 1
&& (flt(frm.doc.claimed_amount) < flt(frm.doc.paid_amount))
&& frappe.model.can_create("Journal Entry")) {
frm.add_custom_button(__("Return"), function() {
frm.trigger('make_return_entry');
}, __('Create'));
}
}, },
make_payment_entry: function(frm) { make_payment_entry: function(frm) {
@ -83,6 +92,24 @@ frappe.ui.form.on('Employee Advance', {
}); });
}, },
make_return_entry: function(frm) {
frappe.call({
method: 'erpnext.hr.doctype.employee_advance.employee_advance.make_return_entry',
args: {
'employee_name': frm.doc.employee,
'company': frm.doc.company,
'employee_advance_name': frm.doc.name,
'return_amount': flt(frm.doc.paid_amount - frm.doc.claimed_amount),
'mode_of_payment': frm.doc.mode_of_payment,
'advance_account': frm.doc.advance_account
},
callback: function(r) {
const doclist = frappe.model.sync(r.message);
frappe.set_route('Form', doclist[0].doctype, doclist[0].name);
}
});
},
employee: function (frm) { employee: function (frm) {
if (frm.doc.employee) { if (frm.doc.employee) {
return frappe.call({ return frappe.call({

View File

@ -1,707 +1,193 @@
{ {
"allow_copy": 0, "actions": [],
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1, "allow_import": 1,
"allow_rename": 0,
"autoname": "naming_series:", "autoname": "naming_series:",
"beta": 0,
"creation": "2017-10-09 14:26:29.612365", "creation": "2017-10-09 14:26:29.612365",
"custom": 0,
"docstatus": 0,
"doctype": "DocType", "doctype": "DocType",
"document_type": "",
"editable_grid": 1, "editable_grid": 1,
"engine": "InnoDB", "engine": "InnoDB",
"field_order": [
"naming_series",
"employee",
"employee_name",
"column_break_4",
"posting_date",
"department",
"section_break_8",
"purpose",
"column_break_11",
"advance_amount",
"paid_amount",
"due_advance_amount",
"claimed_amount",
"return_amount",
"section_break_7",
"status",
"company",
"amended_from",
"column_break_18",
"advance_account",
"mode_of_payment"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "",
"fieldname": "naming_series", "fieldname": "naming_series",
"fieldtype": "Select", "fieldtype": "Select",
"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": "Series", "label": "Series",
"length": 0, "options": "HR-EAD-.YYYY.-"
"no_copy": 0,
"options": "HR-EAD-.YYYY.-",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "employee", "fieldname": "employee",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Employee", "label": "Employee",
"length": 0,
"no_copy": 0,
"options": "Employee", "options": "Employee",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_from": "employee.employee_name", "fetch_from": "employee.employee_name",
"fieldname": "employee_name", "fieldname": "employee_name",
"fieldtype": "Read Only", "fieldtype": "Read Only",
"hidden": 0, "label": "Employee Name"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Employee Name",
"length": 0,
"no_copy": 0,
"options": "",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_4", "fieldname": "column_break_4",
"fieldtype": "Column Break", "fieldtype": "Column Break"
"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,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Today", "default": "Today",
"fieldname": "posting_date", "fieldname": "posting_date",
"fieldtype": "Date", "fieldtype": "Date",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Posting Date", "label": "Posting Date",
"length": 0, "reqd": 1
"no_copy": 0,
"options": "",
"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,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_from": "employee.department", "fetch_from": "employee.department",
"fieldname": "department", "fieldname": "department",
"fieldtype": "Link", "fieldtype": "Link",
"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": "Department", "label": "Department",
"length": 0,
"no_copy": 0,
"options": "Department", "options": "Department",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_8", "fieldname": "section_break_8",
"fieldtype": "Section Break", "fieldtype": "Section Break"
"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,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "purpose", "fieldname": "purpose",
"fieldtype": "Small Text", "fieldtype": "Small Text",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Purpose", "label": "Purpose",
"length": 0, "reqd": 1
"no_copy": 0,
"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,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_11", "fieldname": "column_break_11",
"fieldtype": "Column Break", "fieldtype": "Column Break"
"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,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "advance_amount", "fieldname": "advance_amount",
"fieldtype": "Currency", "fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Advance Amount", "label": "Advance Amount",
"length": 0,
"no_copy": 0,
"options": "Company:company:default_currency", "options": "Company:company:default_currency",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "paid_amount", "fieldname": "paid_amount",
"fieldtype": "Currency", "fieldtype": "Currency",
"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": "Paid Amount", "label": "Paid Amount",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Company:company:default_currency", "options": "Company:company:default_currency",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:cur_frm.doc.employee", "depends_on": "eval:cur_frm.doc.employee",
"fieldname": "due_advance_amount", "fieldname": "due_advance_amount",
"fieldtype": "Currency", "fieldtype": "Currency",
"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": "Due Advance Amount", "label": "Due Advance Amount",
"length": 0,
"no_copy": 0,
"options": "Company:company:default_currency", "options": "Company:company:default_currency",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "claimed_amount", "fieldname": "claimed_amount",
"fieldtype": "Currency", "fieldtype": "Currency",
"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": "Claimed Amount", "label": "Claimed Amount",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Company:company:default_currency", "options": "Company:company:default_currency",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_7", "fieldname": "section_break_7",
"fieldtype": "Section Break", "fieldtype": "Section Break"
"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,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "status", "fieldname": "status",
"fieldtype": "Select", "fieldtype": "Select",
"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": "Status", "label": "Status",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Draft\nPaid\nUnpaid\nClaimed\nCancelled", "options": "Draft\nPaid\nUnpaid\nClaimed\nCancelled",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company", "fieldname": "company",
"fieldtype": "Link", "fieldtype": "Link",
"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": "Company", "label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company", "options": "Company",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from", "fieldname": "amended_from",
"fieldtype": "Link", "fieldtype": "Link",
"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": "Amended From", "label": "Amended From",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Employee Advance", "options": "Employee Advance",
"permlevel": 0,
"print_hide": 1, "print_hide": 1,
"print_hide_if_no_value": 0, "read_only": 1
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_18", "fieldname": "column_break_18",
"fieldtype": "Column Break", "fieldtype": "Column Break"
"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,
"length": 0,
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "advance_account", "fieldname": "advance_account",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Advance Account", "label": "Advance Account",
"length": 0,
"no_copy": 0,
"options": "Account", "options": "Account",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "mode_of_payment", "fieldname": "mode_of_payment",
"fieldtype": "Link", "fieldtype": "Link",
"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": "Mode of Payment", "label": "Mode of Payment",
"length": 0, "options": "Mode of Payment"
"no_copy": 0, },
"options": "Mode of Payment", {
"permlevel": 0, "fieldname": "return_amount",
"precision": "", "fieldtype": "Currency",
"print_hide": 0, "label": "Returned Amount",
"print_hide_if_no_value": 0, "options": "Company:company:default_currency",
"read_only": 0, "read_only": 1
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
} }
], ],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1, "is_submittable": 1,
"issingle": 0, "links": [],
"istable": 0, "modified": "2019-12-15 19:04:07.044505",
"max_attachments": 0,
"modified": "2019-01-30 11:28:15.529649",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee Advance", "name": "Employee Advance",
"name_case": "",
"owner": "Administrator", "owner": "Administrator",
"permissions": [ "permissions": [
{ {
"amend": 0,
"cancel": 0,
"create": 1, "create": 1,
"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": "Employee", "role": "Employee",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 0,
"write": 1 "write": 1
}, },
{ {
@ -711,27 +197,17 @@
"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": "Expense Approver", "role": "Expense Approver",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 1, "submit": 1,
"write": 1 "write": 1
} }
], ],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"search_fields": "employee,employee_name", "search_fields": "employee,employee_name",
"show_name_in_global_search": 0,
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"track_changes": 1, "track_changes": 1
"track_seen": 0,
"track_views": 0
} }

View File

@ -7,6 +7,7 @@ import frappe, erpnext
from frappe import _ from frappe import _
from frappe.model.document import Document from frappe.model.document import Document
from frappe.utils import flt, nowdate from frappe.utils import flt, nowdate
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
class EmployeeAdvanceOverPayment(frappe.ValidationError): class EmployeeAdvanceOverPayment(frappe.ValidationError):
pass pass
@ -53,11 +54,25 @@ class EmployeeAdvance(Document):
and party = %s and party = %s
""", (self.name, self.employee), as_dict=1)[0].paid_amount """, (self.name, self.employee), as_dict=1)[0].paid_amount
return_amount = frappe.db.sql("""
select name, ifnull(sum(credit_in_account_currency), 0) as return_amount
from `tabGL Entry`
where against_voucher_type = 'Employee Advance'
and voucher_type != 'Expense Claim'
and against_voucher = %s
and party_type = 'Employee'
and party = %s
""", (self.name, self.employee), as_dict=1)[0].return_amount
if flt(paid_amount) > self.advance_amount: if flt(paid_amount) > self.advance_amount:
frappe.throw(_("Row {0}# Paid Amount cannot be greater than requested advance amount"), frappe.throw(_("Row {0}# Paid Amount cannot be greater than requested advance amount"),
EmployeeAdvanceOverPayment) EmployeeAdvanceOverPayment)
if flt(return_amount) > self.paid_amount - self.claimed_amount:
frappe.throw(_("Return amount cannot be greater unclaimed amount"))
self.db_set("paid_amount", paid_amount) self.db_set("paid_amount", paid_amount)
self.db_set("return_amount", return_amount)
self.set_status() self.set_status()
frappe.db.set_value("Employee Advance", self.name , "status", self.status) frappe.db.set_value("Employee Advance", self.name , "status", self.status)
@ -88,8 +103,6 @@ def get_due_advance_amount(employee, posting_date):
@frappe.whitelist() @frappe.whitelist()
def make_bank_entry(dt, dn): def make_bank_entry(dt, dn):
from erpnext.accounts.doctype.journal_entry.journal_entry import get_default_bank_cash_account
doc = frappe.get_doc(dt, dn) doc = frappe.get_doc(dt, dn)
payment_account = get_default_bank_cash_account(doc.company, account_type="Cash", payment_account = get_default_bank_cash_account(doc.company, account_type="Cash",
mode_of_payment=doc.mode_of_payment) mode_of_payment=doc.mode_of_payment)
@ -118,3 +131,33 @@ def make_bank_entry(dt, dn):
}) })
return je.as_dict() return je.as_dict()
@frappe.whitelist()
def make_return_entry(employee_name, company, employee_advance_name, return_amount, mode_of_payment, advance_account):
return_account = get_default_bank_cash_account(company, account_type='Cash', mode_of_payment = mode_of_payment)
je = frappe.new_doc('Journal Entry')
je.posting_date = nowdate()
je.voucher_type = 'Bank Entry'
je.company = company
je.remark = 'Return against Employee Advance: ' + employee_advance_name
je.append('accounts', {
'account': advance_account,
'credit_in_account_currency': return_amount,
'reference_type': 'Employee Advance',
'reference_name': employee_advance_name,
'party_type': 'Employee',
'party': employee_name,
'is_advance': 'Yes'
})
je.append("accounts", {
"account": return_account.account,
"debit_in_account_currency": return_amount,
"account_currency": return_account.account_currency,
"account_type": return_account.account_type
})
return je.as_dict()

View File

@ -0,0 +1,19 @@
from __future__ import unicode_literals
from frappe import _
def get_data():
return {
'fieldname': 'employee_advance',
'non_standard_fieldnames': {
'Payment Entry': 'reference_name',
'Journal Entry': 'reference_name'
},
'transactions': [
{
'items': ['Expense Claim']
},
{
'items': ['Payment Entry', 'Journal Entry']
}
]
}

View File

@ -7,6 +7,14 @@ frappe.ui.form.on('Employee Onboarding', {
frm.add_fetch("employee_onboarding_template", "department", "department"); frm.add_fetch("employee_onboarding_template", "department", "department");
frm.add_fetch("employee_onboarding_template", "designation", "designation"); frm.add_fetch("employee_onboarding_template", "designation", "designation");
frm.add_fetch("employee_onboarding_template", "employee_grade", "employee_grade"); frm.add_fetch("employee_onboarding_template", "employee_grade", "employee_grade");
frm.set_query('job_offer', function () {
return {
filters: {
'job_applicant': frm.doc.job_applicant
}
};
});
}, },
refresh: function(frm) { refresh: function(frm) {

View File

@ -1,4 +1,5 @@
{ {
"actions": [],
"allow_import": 1, "allow_import": 1,
"autoname": "naming_series:", "autoname": "naming_series:",
"creation": "2013-01-10 16:34:14", "creation": "2013-01-10 16:34:14",
@ -43,6 +44,7 @@
"accounting_dimensions_section", "accounting_dimensions_section",
"project", "project",
"dimension_col_break", "dimension_col_break",
"cost_center",
"more_details", "more_details",
"status", "status",
"amended_from", "amended_from",
@ -365,7 +367,8 @@
"icon": "fa fa-money", "icon": "fa fa-money",
"idx": 1, "idx": 1,
"is_submittable": 1, "is_submittable": 1,
"modified": "2019-11-09 14:13:08.964547", "links": [],
"modified": "2019-12-14 23:52:05.388458",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Expense Claim", "name": "Expense Claim",

View File

@ -43,9 +43,9 @@ class ExpenseClaim(AccountsController):
}[cstr(self.docstatus or 0)] }[cstr(self.docstatus or 0)]
paid_amount = flt(self.total_amount_reimbursed) + flt(self.total_advance_amount) paid_amount = flt(self.total_amount_reimbursed) + flt(self.total_advance_amount)
precision = self.precision("total_sanctioned_amount") precision = self.precision("grand_total")
if (self.is_paid or (flt(self.total_sanctioned_amount) > 0 if (self.is_paid or (flt(self.total_sanctioned_amount) > 0
and flt(self.total_sanctioned_amount, precision) == flt(paid_amount, precision))) \ and flt(self.grand_total, precision) == flt(paid_amount, precision))) \
and self.docstatus == 1 and self.approval_status == 'Approved': and self.docstatus == 1 and self.approval_status == 'Approved':
self.status = "Paid" self.status = "Paid"
elif flt(self.total_sanctioned_amount) > 0 and self.docstatus == 1 and self.approval_status == 'Approved': elif flt(self.total_sanctioned_amount) > 0 and self.docstatus == 1 and self.approval_status == 'Approved':
@ -322,7 +322,7 @@ def get_expense_claim_account(expense_claim_type, company):
@frappe.whitelist() @frappe.whitelist()
def get_advances(employee, advance_id=None): def get_advances(employee, advance_id=None):
if not advance_id: if not advance_id:
condition = 'docstatus=1 and employee={0} and paid_amount > 0 and paid_amount > claimed_amount'.format(frappe.db.escape(employee)) condition = 'docstatus=1 and employee={0} and paid_amount > 0 and paid_amount > claimed_amount + return_amount'.format(frappe.db.escape(employee))
else: else:
condition = 'name={0}'.format(frappe.db.escape(advance_id)) condition = 'name={0}'.format(frappe.db.escape(advance_id))

View File

@ -3,7 +3,7 @@
frappe.ui.form.on("Expense Claim Type", { frappe.ui.form.on("Expense Claim Type", {
refresh: function(frm) { refresh: function(frm) {
frm.fields_dict["accounts"].grid.get_field("default_account").get_query = function(frm, cdt, cdn){ frm.fields_dict["accounts"].grid.get_field("default_account").get_query = function(doc, cdt, cdn) {
var d = locals[cdt][cdn]; var d = locals[cdt][cdn];
return { return {
filters: { filters: {

View File

@ -54,9 +54,11 @@ class LeaveApplication(Document):
self.create_leave_ledger_entry() self.create_leave_ledger_entry()
self.reload() self.reload()
def before_cancel(self):
self.status = "Cancelled"
def on_cancel(self): def on_cancel(self):
self.create_leave_ledger_entry(submit=False) self.create_leave_ledger_entry(submit=False)
self.status = "Cancelled"
# notify leave applier about cancellation # notify leave applier about cancellation
self.notify_employee() self.notify_employee()
self.cancel_attendance() self.cancel_attendance()

View File

@ -163,7 +163,7 @@ class PayrollEntry(Document):
""" """
cond = self.get_filter_condition() cond = self.get_filter_condition()
return frappe.db.sql(""" select eld.loan_account, eld.loan, return frappe.db.sql(""" select eld.loan_account, eld.loan,
eld.interest_income_account, eld.principal_amount, eld.interest_amount, eld.total_payment eld.interest_income_account, eld.principal_amount, eld.interest_amount, eld.total_payment,t1.employee
from from
`tabSalary Slip` t1, `tabSalary Slip Loan` eld `tabSalary Slip` t1, `tabSalary Slip Loan` eld
where where
@ -246,6 +246,7 @@ class PayrollEntry(Document):
accounts.append({ accounts.append({
"account": acc, "account": acc,
"debit_in_account_currency": flt(amount, precision), "debit_in_account_currency": flt(amount, precision),
"party_type": '',
"cost_center": self.cost_center, "cost_center": self.cost_center,
"project": self.project "project": self.project
}) })
@ -257,6 +258,7 @@ class PayrollEntry(Document):
"account": acc, "account": acc,
"credit_in_account_currency": flt(amount, precision), "credit_in_account_currency": flt(amount, precision),
"cost_center": self.cost_center, "cost_center": self.cost_center,
"party_type": '',
"project": self.project "project": self.project
}) })
@ -264,7 +266,9 @@ class PayrollEntry(Document):
for data in loan_details: for data in loan_details:
accounts.append({ accounts.append({
"account": data.loan_account, "account": data.loan_account,
"credit_in_account_currency": data.principal_amount "credit_in_account_currency": data.principal_amount,
"party_type": "Employee",
"party": data.employee
}) })
if data.interest_amount and not data.interest_income_account: if data.interest_amount and not data.interest_income_account:
@ -275,14 +279,17 @@ class PayrollEntry(Document):
"account": data.interest_income_account, "account": data.interest_income_account,
"credit_in_account_currency": data.interest_amount, "credit_in_account_currency": data.interest_amount,
"cost_center": self.cost_center, "cost_center": self.cost_center,
"project": self.project "project": self.project,
"party_type": "Employee",
"party": data.employee
}) })
payable_amount -= flt(data.total_payment, precision) payable_amount -= flt(data.total_payment, precision)
# Payable amount # Payable amount
accounts.append({ accounts.append({
"account": default_payroll_payable_account, "account": default_payroll_payable_account,
"credit_in_account_currency": flt(payable_amount, precision) "credit_in_account_currency": flt(payable_amount, precision),
"party_type": '',
}) })
journal_entry.set("accounts", accounts) journal_entry.set("accounts", accounts)
@ -546,7 +553,6 @@ def submit_salary_slips_for_employees(payroll_entry, salary_slips, publish_progr
count += 1 count += 1
if publish_progress: if publish_progress:
frappe.publish_progress(count*100/len(salary_slips), title = _("Submitting Salary Slips...")) frappe.publish_progress(count*100/len(salary_slips), title = _("Submitting Salary Slips..."))
if submitted_ss: if submitted_ss:
payroll_entry.make_accrual_jv_entry() payroll_entry.make_accrual_jv_entry()
frappe.msgprint(_("Salary Slip submitted for period from {0} to {1}") frappe.msgprint(_("Salary Slip submitted for period from {0} to {1}")

View File

@ -119,6 +119,10 @@ frappe.ui.form.on('Salary Structure', {
}, },
callback: function(r) { callback: function(r) {
var employees = r.message; var employees = r.message;
if(!employees) return;
if (employees.length == 1){
frm.events.open_salary_slip(frm, employees[0]);
} else {
var d = new frappe.ui.Dialog({ var d = new frappe.ui.Dialog({
title: __("Preview Salary Slip"), title: __("Preview Salary Slip"),
fields: [ fields: [
@ -138,16 +142,22 @@ frappe.ui.form.on('Salary Structure', {
d.get_input("fetch").on("click", function() { d.get_input("fetch").on("click", function() {
var values = d.get_values(); var values = d.get_values();
if(!values) return; if(!values) return;
var print_format; frm.events.open_salary_slip(frm, values.employee)
frm.doc.salary_slip_based_on_timesheet ?
print_format="Salary Slip based on Timesheet" :
print_format="Salary Slip Standard";
});
d.show();
}
}
});
},
open_salary_slip: function(frm, employee){
var print_format = frm.doc.salary_slip_based_on_timesheet ? "Salary Slip based on Timesheet" : "Salary Slip Standard";
frappe.call({ frappe.call({
method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip", method: "erpnext.hr.doctype.salary_structure.salary_structure.make_salary_slip",
args: { args: {
source_name: frm.doc.name, source_name: frm.doc.name,
employee: values.employee, employee: employee,
as_print: 1, as_print: 1,
print_format: print_format, print_format: print_format,
for_preview: 1 for_preview: 1
@ -155,11 +165,6 @@ frappe.ui.form.on('Salary Structure', {
callback: function(r) { callback: function(r) {
var new_window = window.open(); var new_window = window.open();
new_window.document.write(r.message); new_window.document.write(r.message);
// frappe.msgprint(r.message);
}
});
});
d.show();
} }
}); });
}, },

View File

@ -1775,14 +1775,28 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
} }
}, },
set_reserve_warehouse: function() {
this.autofill_warehouse("reserve_warehouse");
},
set_warehouse: function() { set_warehouse: function() {
this.autofill_warehouse("warehouse");
},
autofill_warehouse : function (warehouse_field) {
// set warehouse in all child table rows
var me = this; var me = this;
if(this.frm.doc.set_warehouse) { let warehouse = (warehouse_field === "warehouse") ? me.frm.doc.set_warehouse : me.frm.doc.set_reserve_warehouse;
$.each(this.frm.doc.items || [], function(i, item) { let child_table = (warehouse_field === "warehouse") ? me.frm.doc.items : me.frm.doc.supplied_items;
frappe.model.set_value(me.frm.doctype + " Item", item.name, "warehouse", me.frm.doc.set_warehouse); let doctype = (warehouse_field === "warehouse") ? (me.frm.doctype + " Item") : (me.frm.doctype + " Item Supplied");
if(warehouse) {
$.each(child_table || [], function(i, item) {
frappe.model.set_value(doctype, item.name, warehouse_field, warehouse);
}); });
} }
}, },
coupon_code: function() { coupon_code: function() {
var me = this; var me = this;
frappe.run_serially([ frappe.run_serially([

View File

@ -501,6 +501,7 @@ erpnext.utils.update_child_items = function(opts) {
frm.doc[opts.child_docname].forEach(d => { frm.doc[opts.child_docname].forEach(d => {
dialog.fields_dict.trans_items.df.data.push({ dialog.fields_dict.trans_items.df.data.push({
"docname": d.name, "docname": d.name,
"name": d.name,
"item_code": d.item_code, "item_code": d.item_code,
"qty": d.qty, "qty": d.qty,
"rate": d.rate, "rate": d.rate,

View File

@ -0,0 +1,10 @@
frappe.listview_settings['Company'] = {
onload: () => {
frappe.breadcrumbs.add({
type: 'Custom',
module: __('Accounts'),
label: __('Accounts'),
route: '#modules/Accounts'
});
}
}