Merge branch 'develop' into maintainance-ux-fix
This commit is contained in:
commit
66e5e16a2e
@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '12.1.6'
|
__version__ = '12.1.8'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, json
|
import frappe, json
|
||||||
|
from frappe import _
|
||||||
from frappe.utils import add_to_date, date_diff, getdate, nowdate, get_last_day, formatdate
|
from frappe.utils import add_to_date, date_diff, getdate, nowdate, get_last_day, formatdate
|
||||||
from erpnext.accounts.report.general_ledger.general_ledger import execute
|
from erpnext.accounts.report.general_ledger.general_ledger import execute
|
||||||
from frappe.core.page.dashboard.dashboard import cache_source, get_from_date_from_timespan
|
from frappe.core.page.dashboard.dashboard import cache_source, get_from_date_from_timespan
|
||||||
@ -24,6 +25,9 @@ def get(chart_name = None, chart = None, no_cache = None, from_date = None, to_d
|
|||||||
account = filters.get("account")
|
account = filters.get("account")
|
||||||
company = filters.get("company")
|
company = filters.get("company")
|
||||||
|
|
||||||
|
if not account and chart:
|
||||||
|
frappe.throw(_("Account is not set for the dashboard chart {0}").format(chart))
|
||||||
|
|
||||||
if not to_date:
|
if not to_date:
|
||||||
to_date = nowdate()
|
to_date = nowdate()
|
||||||
if not from_date:
|
if not from_date:
|
||||||
|
|||||||
@ -308,7 +308,7 @@ frappe.ui.form.on('Payment Entry', {
|
|||||||
() => {
|
() => {
|
||||||
frm.set_party_account_based_on_party = false;
|
frm.set_party_account_based_on_party = false;
|
||||||
if (r.message.bank_account) {
|
if (r.message.bank_account) {
|
||||||
frm.set_value("bank_account", r.message.bank_account);
|
frm.set_value("party_bank_account", r.message.bank_account);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|||||||
@ -69,7 +69,7 @@ def get_columns(filters):
|
|||||||
for year in fiscal_year:
|
for year in fiscal_year:
|
||||||
for from_date, to_date in get_period_date_ranges(filters["period"], year[0]):
|
for from_date, to_date in get_period_date_ranges(filters["period"], year[0]):
|
||||||
if filters["period"] == "Yearly":
|
if filters["period"] == "Yearly":
|
||||||
labels = [_("Budget") + " " + str(year[0]), _("Actual ") + " " + str(year[0]), _("Varaiance ") + " " + str(year[0])]
|
labels = [_("Budget") + " " + str(year[0]), _("Actual ") + " " + str(year[0]), _("Variance ") + " " + str(year[0])]
|
||||||
for label in labels:
|
for label in labels:
|
||||||
columns.append(label+":Float:150")
|
columns.append(label+":Float:150")
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -39,7 +39,7 @@ def get_message(exception):
|
|||||||
if hasattr(exception, 'message'):
|
if hasattr(exception, 'message'):
|
||||||
message = exception.message
|
message = exception.message
|
||||||
elif hasattr(exception, '__str__'):
|
elif hasattr(exception, '__str__'):
|
||||||
message = e.__str__()
|
message = exception.__str__()
|
||||||
else:
|
else:
|
||||||
message = "Something went wrong while syncing"
|
message = "Something went wrong while syncing"
|
||||||
return message
|
return message
|
||||||
|
|||||||
@ -43,7 +43,7 @@ class ShopifySettings(Document):
|
|||||||
d.raise_for_status()
|
d.raise_for_status()
|
||||||
self.update_webhook_table(method, d.json())
|
self.update_webhook_table(method, d.json())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
make_shopify_log(status="Warning", message=e, exception=False)
|
make_shopify_log(status="Warning", exception=e, rollback=True)
|
||||||
|
|
||||||
def unregister_webhooks(self):
|
def unregister_webhooks(self):
|
||||||
session = get_request_session()
|
session = get_request_session()
|
||||||
|
|||||||
@ -2,11 +2,11 @@ frappe.listview_settings['Expense Claim'] = {
|
|||||||
add_fields: ["total_claimed_amount", "docstatus"],
|
add_fields: ["total_claimed_amount", "docstatus"],
|
||||||
get_indicator: function(doc) {
|
get_indicator: function(doc) {
|
||||||
if(doc.status == "Paid") {
|
if(doc.status == "Paid") {
|
||||||
return [__("Paid"), "green", "status,=,'Paid'"];
|
return [__("Paid"), "green", "status,=,Paid"];
|
||||||
}else if(doc.status == "Unpaid") {
|
}else if(doc.status == "Unpaid") {
|
||||||
return [__("Unpaid"), "orange"];
|
return [__("Unpaid"), "orange", "status,=,Unpaid"];
|
||||||
} else if(doc.status == "Rejected") {
|
} else if(doc.status == "Rejected") {
|
||||||
return [__("Rejected"), "grey"];
|
return [__("Rejected"), "grey", "status,=,Rejected"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -503,14 +503,17 @@ def get_leave_allocation_records(employee, date, leave_type=None):
|
|||||||
|
|
||||||
def get_pending_leaves_for_period(employee, leave_type, from_date, to_date):
|
def get_pending_leaves_for_period(employee, leave_type, from_date, to_date):
|
||||||
''' Returns leaves that are pending approval '''
|
''' Returns leaves that are pending approval '''
|
||||||
return frappe.db.get_value("Leave Application",
|
leaves = frappe.get_all("Leave Application",
|
||||||
filters={
|
filters={
|
||||||
"employee": employee,
|
"employee": employee,
|
||||||
"leave_type": leave_type,
|
"leave_type": leave_type,
|
||||||
"from_date": ("<=", from_date),
|
|
||||||
"to_date": (">=", to_date),
|
|
||||||
"status": "Open"
|
"status": "Open"
|
||||||
}, fieldname=['SUM(total_leave_days)']) or flt(0)
|
},
|
||||||
|
or_filters={
|
||||||
|
"from_date": ["between", (from_date, to_date)],
|
||||||
|
"to_date": ["between", (from_date, to_date)]
|
||||||
|
}, fields=['SUM(total_leave_days) as leaves'])[0]
|
||||||
|
return leaves['leaves'] if leaves['leaves'] else 0.0
|
||||||
|
|
||||||
def get_remaining_leaves(allocation, leaves_taken, date, expiry):
|
def get_remaining_leaves(allocation, leaves_taken, date, expiry):
|
||||||
''' Returns minimum leaves remaining after comparing with remaining days for allocation expiry '''
|
''' Returns minimum leaves remaining after comparing with remaining days for allocation expiry '''
|
||||||
|
|||||||
@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import frappe, erpnext
|
import frappe, erpnext
|
||||||
import datetime, math
|
import datetime, math
|
||||||
|
|
||||||
from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words, getdate
|
from frappe.utils import add_days, cint, cstr, flt, getdate, rounded, date_diff, money_in_words
|
||||||
from frappe.model.naming import make_autoname
|
from frappe.model.naming import make_autoname
|
||||||
|
|
||||||
from frappe import msgprint, _
|
from frappe import msgprint, _
|
||||||
|
|||||||
@ -39,9 +39,11 @@ class BOM(WebsiteGenerator):
|
|||||||
names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)]
|
names = [d[-1][1:] for d in filter(lambda x: len(x) > 1 and x[-1], names)]
|
||||||
|
|
||||||
# split by (-) if cancelled
|
# split by (-) if cancelled
|
||||||
names = [cint(name.split('-')[-1]) for name in names]
|
if names:
|
||||||
|
names = [cint(name.split('-')[-1]) for name in names]
|
||||||
idx = max(names) + 1
|
idx = max(names) + 1
|
||||||
|
else:
|
||||||
|
idx = 1
|
||||||
else:
|
else:
|
||||||
idx = 1
|
idx = 1
|
||||||
|
|
||||||
@ -290,7 +292,8 @@ class BOM(WebsiteGenerator):
|
|||||||
return valuation_rate
|
return valuation_rate
|
||||||
|
|
||||||
def manage_default_bom(self):
|
def manage_default_bom(self):
|
||||||
""" Uncheck others if current one is selected as default,
|
""" Uncheck others if current one is selected as default or
|
||||||
|
check the current one as default if it the only bom for the selected item,
|
||||||
update default bom in item master
|
update default bom in item master
|
||||||
"""
|
"""
|
||||||
if self.is_default and self.is_active:
|
if self.is_default and self.is_active:
|
||||||
@ -299,6 +302,9 @@ class BOM(WebsiteGenerator):
|
|||||||
item = frappe.get_doc("Item", self.item)
|
item = frappe.get_doc("Item", self.item)
|
||||||
if item.default_bom != self.name:
|
if item.default_bom != self.name:
|
||||||
frappe.db.set_value('Item', self.item, 'default_bom', self.name)
|
frappe.db.set_value('Item', self.item, 'default_bom', self.name)
|
||||||
|
elif not frappe.db.exists(dict(doctype='BOM', docstatus=1, item=self.item, is_default=1)) \
|
||||||
|
and self.is_active:
|
||||||
|
frappe.db.set(self, "is_default", 1)
|
||||||
else:
|
else:
|
||||||
frappe.db.set(self, "is_default", 0)
|
frappe.db.set(self, "is_default", 0)
|
||||||
item = frappe.get_doc("Item", self.item)
|
item = frappe.get_doc("Item", self.item)
|
||||||
|
|||||||
@ -640,3 +640,4 @@ erpnext.patches.v12_0.create_default_energy_point_rules
|
|||||||
erpnext.patches.v12_0.set_produced_qty_field_in_sales_order_for_work_order
|
erpnext.patches.v12_0.set_produced_qty_field_in_sales_order_for_work_order
|
||||||
erpnext.patches.v12_0.generate_leave_ledger_entries
|
erpnext.patches.v12_0.generate_leave_ledger_entries
|
||||||
erpnext.patches.v12_0.set_default_shopify_app_type
|
erpnext.patches.v12_0.set_default_shopify_app_type
|
||||||
|
erpnext.patches.v12_0.replace_accounting_with_accounts_in_home_settings
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
import frappe
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
frappe.db.sql("""UPDATE `tabUser` SET `home_settings` = REPLACE(`home_settings`, 'Accounting', 'Accounts')""")
|
||||||
|
frappe.cache().delete_key('home_settings')
|
||||||
@ -661,12 +661,15 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False):
|
|||||||
|
|
||||||
if source_parent.project:
|
if source_parent.project:
|
||||||
target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
|
target.cost_center = frappe.db.get_value("Project", source_parent.project, "cost_center")
|
||||||
if not target.cost_center and target.item_code:
|
if target.item_code:
|
||||||
item = get_item_defaults(target.item_code, source_parent.company)
|
item = get_item_defaults(target.item_code, source_parent.company)
|
||||||
item_group = get_item_group_defaults(target.item_code, source_parent.company)
|
item_group = get_item_group_defaults(target.item_code, source_parent.company)
|
||||||
target.cost_center = item.get("selling_cost_center") \
|
cost_center = item.get("selling_cost_center") \
|
||||||
or item_group.get("selling_cost_center")
|
or item_group.get("selling_cost_center")
|
||||||
|
|
||||||
|
if cost_center:
|
||||||
|
target.cost_center = cost_center
|
||||||
|
|
||||||
doclist = get_mapped_doc("Sales Order", source_name, {
|
doclist = get_mapped_doc("Sales Order", source_name, {
|
||||||
"Sales Order": {
|
"Sales Order": {
|
||||||
"doctype": "Sales Invoice",
|
"doctype": "Sales Invoice",
|
||||||
|
|||||||
@ -33,6 +33,10 @@ class Company(NestedSet):
|
|||||||
return exists
|
return exists
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
self.update_default_account = False
|
||||||
|
if self.is_new():
|
||||||
|
self.update_default_account = True
|
||||||
|
|
||||||
self.validate_abbr()
|
self.validate_abbr()
|
||||||
self.validate_default_accounts()
|
self.validate_default_accounts()
|
||||||
self.validate_currency()
|
self.validate_currency()
|
||||||
@ -203,8 +207,8 @@ class Company(NestedSet):
|
|||||||
"default_expense_account": "Cost of Goods Sold"
|
"default_expense_account": "Cost of Goods Sold"
|
||||||
})
|
})
|
||||||
|
|
||||||
for default_account in default_accounts:
|
if self.update_default_account or frappe.flags.in_test:
|
||||||
if self.is_new() or frappe.flags.in_test or frappe.flags.in_demo:
|
for default_account in default_accounts:
|
||||||
self._set_default_account(default_account, default_accounts.get(default_account))
|
self._set_default_account(default_account, default_accounts.get(default_account))
|
||||||
|
|
||||||
if not self.default_income_account:
|
if not self.default_income_account:
|
||||||
|
|||||||
@ -66,7 +66,7 @@ def place_order():
|
|||||||
from erpnext.selling.doctype.quotation.quotation import _make_sales_order
|
from erpnext.selling.doctype.quotation.quotation import _make_sales_order
|
||||||
sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
|
sales_order = frappe.get_doc(_make_sales_order(quotation.name, ignore_permissions=True))
|
||||||
|
|
||||||
if not cart_settings.allow_items_not_in_stock:
|
if not cint(cart_settings.allow_items_not_in_stock):
|
||||||
for item in sales_order.get("items"):
|
for item in sales_order.get("items"):
|
||||||
item.reserved_warehouse, is_stock_item = frappe.db.get_value("Item",
|
item.reserved_warehouse, is_stock_item = frappe.db.get_value("Item",
|
||||||
item.item_code, ["website_warehouse", "is_stock_item"])
|
item.item_code, ["website_warehouse", "is_stock_item"])
|
||||||
|
|||||||
@ -6,9 +6,9 @@ frappe.listview_settings['Delivery Note'] = {
|
|||||||
return [__("Return"), "darkgrey", "is_return,=,Yes"];
|
return [__("Return"), "darkgrey", "is_return,=,Yes"];
|
||||||
} else if (doc.status === "Closed") {
|
} else if (doc.status === "Closed") {
|
||||||
return [__("Closed"), "green", "status,=,Closed"];
|
return [__("Closed"), "green", "status,=,Closed"];
|
||||||
} else if (doc.grand_total !== 0 && flt(doc.per_billed, 2) < 100) {
|
} else if (flt(doc.per_billed, 2) < 100) {
|
||||||
return [__("To Bill"), "orange", "per_billed,<,100"];
|
return [__("To Bill"), "orange", "per_billed,<,100"];
|
||||||
} else if (doc.grand_total === 0 || flt(doc.per_billed, 2) == 100) {
|
} else if (flt(doc.per_billed, 2) == 100) {
|
||||||
return [__("Completed"), "green", "per_billed,=,100"];
|
return [__("Completed"), "green", "per_billed,=,100"];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@ -241,7 +241,9 @@ class StockEntry(StockController):
|
|||||||
|
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
if not d.expense_account:
|
if not d.expense_account:
|
||||||
frappe.throw(_("Please enter Difference Account"))
|
frappe.throw(_("Please enter <b>Difference Account</b> or set default <b>Stock Adjustment Account</b> for company {0}")
|
||||||
|
.format(frappe.bold(self.company)))
|
||||||
|
|
||||||
elif self.is_opening == "Yes" and frappe.db.get_value("Account", d.expense_account, "report_type") == "Profit and Loss":
|
elif self.is_opening == "Yes" and frappe.db.get_value("Account", d.expense_account, "report_type") == "Profit and Loss":
|
||||||
frappe.throw(_("Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry"), OpeningEntryAccountError)
|
frappe.throw(_("Difference Account must be a Asset/Liability type account, since this Stock Entry is an Opening Entry"), OpeningEntryAccountError)
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,6 @@ class Issue(Document):
|
|||||||
return "{0}: {1}".format(_(self.status), self.subject)
|
return "{0}: {1}".format(_(self.status), self.subject)
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.flags.ignore_disabled = 1
|
|
||||||
if self.is_new() and self.via_customer_portal:
|
if self.is_new() and self.via_customer_portal:
|
||||||
self.flags.create_communication = True
|
self.flags.create_communication = True
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user