Payroll fixes and more (#15475)

* fix(payroll): multiple minor fixes related to salary structure

* Added GSTR-1 and GSTR-2 report in Accounts module page

* delete asset movement records on cancellation of Purchase Receipt

* Update consolidated_financial_statement.py

* minor fix

* minor fix

* add filters on item prices report (#15495)
This commit is contained in:
Nabin Hait 2018-09-26 18:01:00 +05:30 committed by GitHub
parent c3772f1ac4
commit 1e7c32b909
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 113 additions and 33 deletions

View File

@ -268,8 +268,7 @@ def get_companies(filters):
return all_companies, companies
def get_subsidiary_companies(company):
lft, rgt = frappe.get_cached_value('Company',
company, ["lft", "rgt"])
lft, rgt = frappe.db.get_value('Company', company, ["lft", "rgt"])
return frappe.db.sql_list("""select name from `tabCompany`
where lft >= {0} and rgt <= {1} order by lft, rgt""".format(lft, rgt))

View File

@ -235,6 +235,16 @@ def get_data():
"type": "doctype",
"name": "GST HSN Code",
},
{
"type": "report",
"name": "GSTR-1",
"is_query_report": True
},
{
"type": "report",
"name": "GSTR-2",
"is_query_report": True
},
{
"type": "report",
"name": "GST Sales Register",

View File

@ -661,7 +661,7 @@ class BuyingController(StockController):
if self.doctype == 'Purchase Invoice' and not self.get('update_stock'):
return
frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s and docstatus = 0", self.name)
frappe.db.sql("delete from `tabAsset Movement` where reference_name=%s", self.name)
frappe.db.sql("delete from `tabSerial No` where purchase_document_no=%s", self.name)
def validate_schedule_date(self):

View File

@ -651,6 +651,39 @@
"translatable": 0,
"unique": 0
},
{
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "salary_slip",
"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": "Salary Slip",
"length": 0,
"no_copy": 0,
"options": "Salary Slip",
"permlevel": 0,
"precision": "",
"print_hide": 1,
"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,
@ -916,7 +949,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 3,
"modified": "2018-08-21 14:44:42.766422",
"modified": "2018-09-21 15:53:11.935416",
"modified_by": "Administrator",
"module": "HR",
"name": "Leave Application",

View File

@ -770,7 +770,7 @@
"collapsible": 1,
"collapsible_depends_on": "",
"columns": 0,
"depends_on": "eval:doc.is_flexible_benefit != 1 && doc.variable_based_on_taxable_salary != 1 && doc.is_additional_component != 1",
"depends_on": "eval:doc.is_flexible_benefit != 1 && doc.variable_based_on_taxable_salary != 1",
"fieldname": "condition_and_formula",
"fieldtype": "Section Break",
"hidden": 0,
@ -835,7 +835,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "1",
"default": "",
"fieldname": "amount_based_on_formula",
"fieldtype": "Check",
"hidden": 0,
@ -1003,7 +1003,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2018-07-02 16:55:44.467519",
"modified": "2018-09-20 16:44:58.876044",
"modified_by": "Administrator",
"module": "HR",
"name": "Salary Component",
@ -1056,5 +1056,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@ -385,7 +385,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "1",
"default": "0",
"depends_on": "eval:doc.parenttype=='Salary Structure'",
"fetch_from": "",
"fieldname": "amount_based_on_formula",
@ -692,7 +692,7 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
"modified": "2018-07-04 16:28:32.314907",
"modified": "2018-09-20 16:59:33.622652",
"modified_by": "Administrator",
"module": "HR",
"name": "Salary Detail",
@ -706,5 +706,6 @@
"sort_field": "modified",
"sort_order": "DESC",
"track_changes": 0,
"track_seen": 0
"track_seen": 0,
"track_views": 0
}

View File

@ -384,8 +384,8 @@ class SalarySlip(TransactionBase):
and t2.is_lwp = 1
and t1.docstatus = 1
and t1.employee = %(employee)s
and CASE WHEN t2.include_holiday != 1 THEN %(dt)s not in ('{0}') and %(dt)s between from_date and to_date
WHEN t2.include_holiday THEN %(dt)s between from_date and to_date
and CASE WHEN t2.include_holiday != 1 THEN %(dt)s not in ('{0}') and %(dt)s between from_date and to_date and ifnull(t1.salary_slip, '') = ''
WHEN t2.include_holiday THEN %(dt)s between from_date and to_date and ifnull(t1.salary_slip, '') = ''
END
""".format(holidays), {"employee": self.employee, "dt": dt})
if leave:

View File

@ -323,11 +323,12 @@ def make_salary_component(salary_components, test_tax):
def get_salary_component_account(sal_comp):
company = erpnext.get_default_company()
sal_comp = frappe.get_doc("Salary Component", sal_comp)
sal_comp.append("accounts", {
"company": company,
"default_account": create_account(company)
})
sal_comp.save()
if not sal_comp.get("accounts"):
sal_comp.append("accounts", {
"company": company,
"default_account": create_account(company)
})
sal_comp.save()
def create_account(company):
salary_account = frappe.db.get_value("Account", "Salary - " + frappe.get_cached_value('Company', company, 'abbr'))
@ -347,7 +348,8 @@ def make_earning_salary_component(setup=False, test_tax=False):
"abbr":'BS',
"condition": 'base > 10000',
"formula": 'base*.5',
"type": "Earning"
"type": "Earning",
"amount_based_on_formula": 1
},
{
"salary_component": 'HRA',
@ -360,7 +362,8 @@ def make_earning_salary_component(setup=False, test_tax=False):
"abbr":'SA',
"condition": 'H < 10000',
"formula": 'BS*.5',
"type": "Earning"
"type": "Earning",
"amount_based_on_formula": 1
},
{
"salary_component": "Leave Encashment",
@ -401,7 +404,8 @@ def make_earning_salary_component(setup=False, test_tax=False):
"abbr":'BS',
"condition": 'base < 10000',
"formula": 'base*.2',
"type": "Earning"
"type": "Earning",
"amount_based_on_formula": 1
})
return data
@ -412,13 +416,15 @@ def make_deduction_salary_component(setup=False, test_tax=False):
"abbr":'PT',
"condition": 'base > 10000',
"formula": 'base*.1',
"type": "Deduction"
"type": "Deduction",
"amount_based_on_formula": 1
},
{
"salary_component": 'TDS',
"abbr":'T',
"formula": 'base*.1',
"type": "Deduction"
"type": "Deduction",
"amount_based_on_formula": 1
}
]
if not test_tax:
@ -427,7 +433,8 @@ def make_deduction_salary_component(setup=False, test_tax=False):
"abbr":'T',
"condition": 'employment_type=="Intern"',
"formula": 'base*.1',
"type": "Deduction"
"type": "Deduction",
"amount_based_on_formula": 1
})
if setup or test_tax:
make_salary_component(data, test_tax)

View File

@ -18,14 +18,21 @@ class SalaryStructure(Document):
self.validate_max_benefits_with_flexi()
def set_missing_values(self):
fields = ["depends_on_lwp", "variable_based_on_taxable_salary", "is_tax_applicable", "is_flexible_benefit"]
overwritten_fields = ["depends_on_lwp", "variable_based_on_taxable_salary", "is_tax_applicable", "is_flexible_benefit"]
overwritten_fields_if_missing = ["amount_based_on_formula", "formula", "amount"]
for table in ["earnings", "deductions"]:
for d in self.get(table):
component_default_value = frappe.db.get_value("Salary Component", str(d.salary_component), fields, as_dict=1)
component_default_value = frappe.db.get_value("Salary Component", str(d.salary_component),
overwritten_fields + overwritten_fields_if_missing, as_dict=1)
if component_default_value:
for fieldname, value in iteritems(component_default_value):
for fieldname in overwritten_fields:
value = component_default_value.get(fieldname)
if d.get(fieldname) != value:
d[fieldname] = value
d.set(fieldname, value)
if not (d.get("amount") or d.get("formula")):
for fieldname in overwritten_fields_if_missing:
d.set(fieldname, component_default_value.get(fieldname))
def validate_amount(self):
if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet:

View File

@ -3,6 +3,15 @@
frappe.query_reports["Item Prices"] = {
"filters": [
{
"fieldname": "items",
"label": __("Items Filter"),
"fieldtype": "Select",
"options": "Enabled Items only\nDisabled Items only\nAll Items",
"default": "Enabled Items only",
"on_change": function(query_report) {
query_report.trigger_refresh();
}
}
]
}

View File

@ -10,7 +10,8 @@ def execute(filters=None):
if not filters: filters = {}
columns = get_columns(filters)
item_map = get_item_details()
conditions = get_condition(filters)
item_map = get_item_details(conditions)
pl = get_price_list()
last_purchase_rate = get_last_purchase_rate()
bom_rate = get_item_bom_rate()
@ -41,14 +42,14 @@ def get_columns(filters):
return columns
def get_item_details():
def get_item_details(conditions):
"""returns all items details"""
item_map = {}
for i in frappe.db.sql("""select name, item_group, item_name, description,
brand, stock_uom from tabItem
order by item_code, item_group""", as_dict=1):
brand, stock_uom from tabItem %s
order by item_code, item_group""" % (conditions), as_dict=1):
item_map.setdefault(i.name, i)
return item_map
@ -133,3 +134,15 @@ def get_valuation_rate():
item_val_rate_map.setdefault(d.item_code, d.val_rate)
return item_val_rate_map
def get_condition(filters):
"""Get Filter Items"""
if filters.get("items") == "Enabled Items only":
conditions = " where disabled=0 "
elif filters.get("items") == "Disabled Items only":
conditions = " where disabled=1 "
else:
conditions = ""
return conditions