@ -0,0 +1,57 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg |
||||
|
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html |
||||
|
:alt: License: LGPL-3 |
||||
|
|
||||
|
Payroll Advanced Features |
||||
|
========================= |
||||
|
* Payroll Advanced Features for Odoo 18 community edition |
||||
|
|
||||
|
Features |
||||
|
======== |
||||
|
* Payroll-Payslip Reporting. |
||||
|
* Automatic Mail During Confirmation of Payslip. |
||||
|
* Mass Confirm Payslip. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
Nothing to configure. |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
Affero General Public License, v3.0 (AGPL v3). |
||||
|
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developers: (V14) Jibin James |
||||
|
(V15) Aneesh, |
||||
|
(V16) Anusha, |
||||
|
(V17) Farhana Jahan PT, |
||||
|
(V18) Rosmy John, |
||||
|
Contact: odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit `Our Website <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import models |
||||
|
from . import report |
||||
|
from . import wizard |
@ -0,0 +1,49 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
{ |
||||
|
'name': 'Payroll Advanced Features', |
||||
|
'summary': 'Payroll Advanced Features For Odoo 18 Community.', |
||||
|
'description': 'Payroll Advanced Features For Odoo 18 Community,' |
||||
|
'Payroll-Payslip Reporting, Automatic Mail During ' |
||||
|
'Confirmation of Payslip, Mass Confirm Payslip ', |
||||
|
'category': 'Generic Modules/Human Resources', |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.cybrosys.com', |
||||
|
'depends': [ |
||||
|
'hr_payroll_community', 'mail', |
||||
|
], |
||||
|
'data': [ |
||||
|
'security/ir.model.access.csv', |
||||
|
'views/hr_payslip_views.xml', |
||||
|
'views/res_config_settings_views.xml', |
||||
|
'data/mail_template_data.xml', |
||||
|
'wizard/payslip_confirm_views.xml', |
||||
|
'report/hr_payslip_report_views.xml', |
||||
|
], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'LGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!--Monthly Payslip Email Template--> |
||||
|
<record id="email_template_payslip" model="mail.template"> |
||||
|
<field name="name">Monthly Payslip Email</field> |
||||
|
<field name="model_id" ref="hr_payroll_community.model_hr_payslip"/> |
||||
|
<field name="email_from">{{(user.email)}}</field> |
||||
|
<field name="email_to">{{object.employee_id.private_email}}</field> |
||||
|
<field name="subject">Ref {{object.number}}</field> |
||||
|
<field name="auto_delete" eval="True"/> |
||||
|
<field name="body_html"><![CDATA[ |
||||
|
<p>Hi,</p> |
||||
|
<p>Here by attaching payslip details of this month</p> |
||||
|
]]> |
||||
|
</field> |
||||
|
<field name="report_template_ids" eval="[(4, ref('hr_payroll_community.hr_payslip_report_action'))]"/> |
||||
|
<field name="template_fs">{{(object.number or '').replace('/','_')}}</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,5 @@ |
|||||
|
## Module <hr_payslip_monthly_report> |
||||
|
#### 31.05.2025 |
||||
|
#### Version 18.0.1.0.0 |
||||
|
#### ADD |
||||
|
- Initial commit for Payroll Advanced Features |
@ -0,0 +1,23 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import hr_payslip |
||||
|
from . import res_config_settings |
@ -0,0 +1,87 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
import logging |
||||
|
|
||||
|
from odoo import fields, models, _ |
||||
|
|
||||
|
_logger = logging.getLogger(__name__) |
||||
|
|
||||
|
|
||||
|
class HrPayslip(models.Model): |
||||
|
"""Inherit hr_payslip module for sending a mail.""" |
||||
|
_inherit = 'hr.payslip' |
||||
|
|
||||
|
is_send_mail = fields.Boolean( |
||||
|
string="Is Send Mail", |
||||
|
help="Checks the Mail is send or not") |
||||
|
|
||||
|
def action_payslip_done(self): |
||||
|
"""Checking auto email option is set. If set email containing payslip |
||||
|
details will send on confirmation""" |
||||
|
if self.env['ir.config_parameter'].sudo().get_param( |
||||
|
'send_payslip_by_email'): |
||||
|
self.write({'is_send_mail': True}) |
||||
|
res = super(HrPayslip, self).action_payslip_done() |
||||
|
if self.env['ir.config_parameter'].sudo().get_param( |
||||
|
'send_payslip_by_email'): |
||||
|
for payslip in self: |
||||
|
if payslip.employee_id.private_email: |
||||
|
template = self.env.ref( |
||||
|
'hr_payslip_monthly_report.email_template_payslip') |
||||
|
template.sudo().send_mail(payslip.id, force_send=True) |
||||
|
_logger.info("Payslip details for %s send by mail", |
||||
|
payslip.employee_id.name) |
||||
|
return res |
||||
|
|
||||
|
def action_payslip_send(self): |
||||
|
"""Opens a window to compose an email, |
||||
|
with template message loaded by default""" |
||||
|
self.ensure_one() |
||||
|
self.write({'is_send_mail': True}) |
||||
|
ir_model_data = self.env['ir.model.data'] |
||||
|
try: |
||||
|
template_id = ir_model_data._xmlid_lookup( |
||||
|
'hr_payslip_monthly_report.email_template_payslip')[1] |
||||
|
except ValueError: |
||||
|
template_id = False |
||||
|
try: |
||||
|
compose_form_id = ir_model_data._xmlid_lookup( |
||||
|
'mail.email_compose_message_wizard_form')[1] |
||||
|
except ValueError: |
||||
|
compose_form_id = False |
||||
|
ctx = { |
||||
|
'default_model': 'hr.payslip', |
||||
|
'default_res_ids': self.ids, |
||||
|
'default_template_id': template_id, |
||||
|
'default_composition_mode': 'comment', |
||||
|
'force_email': True, |
||||
|
} |
||||
|
return { |
||||
|
'name': _('Compose Email'), |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'mail.compose.message', |
||||
|
'views': [(compose_form_id, 'form')], |
||||
|
'view_id': compose_form_id, |
||||
|
'target': 'new', |
||||
|
'context': ctx, |
||||
|
} |
@ -0,0 +1,51 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class ResConfigSettings(models.TransientModel): |
||||
|
"""Inherit res_config_settings for adding a boolean for send |
||||
|
Payslip by Mail""" |
||||
|
_inherit = 'res.config.settings' |
||||
|
|
||||
|
send_payslip_by_email = fields.Boolean( |
||||
|
string="Automatic Send Payslip By Mail", |
||||
|
help="Is needed for automatic send mail") |
||||
|
|
||||
|
@api.model |
||||
|
def get_values(self): |
||||
|
"""Function for getting boolean""" |
||||
|
res = super(ResConfigSettings, self).get_values() |
||||
|
params = self.env['ir.config_parameter'].sudo() |
||||
|
send_payslip_by_email = params.get_param('send_payslip_by_email', |
||||
|
default=False) |
||||
|
res.update( |
||||
|
send_payslip_by_email=send_payslip_by_email |
||||
|
) |
||||
|
return res |
||||
|
|
||||
|
def set_values(self): |
||||
|
"""Function for setting boolean""" |
||||
|
super(ResConfigSettings, self).set_values() |
||||
|
self.env['ir.config_parameter'].sudo().set_param( |
||||
|
"send_payslip_by_email", |
||||
|
self.send_payslip_by_email) |
@ -0,0 +1,22 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
from . import hr_payslip_report |
@ -0,0 +1,160 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU LESSER |
||||
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
||||
|
# (LGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################# |
||||
|
import time |
||||
|
from calendar import monthrange |
||||
|
from datetime import date |
||||
|
|
||||
|
from odoo import fields, models, tools |
||||
|
|
||||
|
|
||||
|
class HrPayrollReportView(models.Model): |
||||
|
"""Create a new model for getting monthly report""" |
||||
|
_name = 'hr.payroll.report' |
||||
|
_auto = False |
||||
|
|
||||
|
now = date.today() |
||||
|
month_day = monthrange(now.year, now.month) |
||||
|
start_date = fields.Date(string="Start Date", |
||||
|
default=time.strftime('%Y-%m-01'), invisible=True, |
||||
|
help="Start Date for Report") |
||||
|
end_date = fields.Date(string="End Date", default=time.strftime( |
||||
|
'%Y-%m-' + str(month_day[1]) + ''), invisible=True, |
||||
|
help="End Date for Report") |
||||
|
name = fields.Many2one('hr.employee', string='Employee', |
||||
|
help="Choose Employee") |
||||
|
date_from = fields.Date(string='From', help="Starting Date for Report") |
||||
|
date_to = fields.Date(string='To', help="Ending Date for Report") |
||||
|
state = fields.Selection( |
||||
|
[('draft', 'Draft'), ('verify', 'Waiting'), ('done', 'Done'), |
||||
|
('cancel', 'Rejected')], |
||||
|
string='Status', help="Select Status for Report") |
||||
|
job_id = fields.Many2one('hr.job', string='Job Title', |
||||
|
help="Choose Hr Job") |
||||
|
company_id = fields.Many2one('res.company', string='Company', |
||||
|
help="Choose Company") |
||||
|
department_id = fields.Many2one('hr.department', |
||||
|
string='Department', |
||||
|
help="Choose Hr Department") |
||||
|
rule_name = fields.Many2one('hr.salary.rule.category', |
||||
|
string="Rule Category", |
||||
|
help="Choose Salary Rule Category") |
||||
|
rule_amount = fields.Float(string="Amount", help="Set Amount") |
||||
|
struct_id = fields.Many2one('hr.payroll.structure', |
||||
|
string="Salary Structure", |
||||
|
help="Choose Hr Payroll Structure") |
||||
|
rule_id = fields.Many2one('hr.salary.rule', |
||||
|
string="Salary Rule", help="Choose Salary Rule") |
||||
|
|
||||
|
def _select(self): |
||||
|
""" |
||||
|
Generate and return a SQL SELECT statement for retrieving specific fields from the database. |
||||
|
Returns: |
||||
|
str: SQL SELECT statement with the following fields: |
||||
|
- Minimum of psl.id |
||||
|
- ps.id |
||||
|
- ps.number |
||||
|
- emp.id as name |
||||
|
- dp.id as department_id |
||||
|
- jb.id as job_id |
||||
|
- cmp.id as company_id |
||||
|
- ps.date_from |
||||
|
- ps.date_to |
||||
|
- ps.state as state |
||||
|
- rl.id as rule_name |
||||
|
- psl.total as rule_amount |
||||
|
- ps.struct_id as struct_id |
||||
|
- rlu.id as rule_id |
||||
|
""" |
||||
|
select_str = """ |
||||
|
min(psl.id),ps.id,ps.number,emp.id as name,dp.id as |
||||
|
department_id,jb.id as job_id,cmp.id as company_id,ps.date_from, |
||||
|
ps.date_to, ps.state as state ,rl.id as rule_name, |
||||
|
psl.total as rule_amount,ps.struct_id as struct_id,rlu.id as rule_id |
||||
|
""" |
||||
|
return select_str |
||||
|
|
||||
|
def _from(self): |
||||
|
""" |
||||
|
Generate and return a SQL FROM clause for joining tables in a |
||||
|
database query. |
||||
|
|
||||
|
Returns: |
||||
|
str: SQL FROM clause with the following table joins: |
||||
|
- hr_payslip_line (psl) |
||||
|
- hr_payslip (ps) on ps.id = psl.slip_id |
||||
|
- hr_salary_rule (rlu) on rlu.id = psl.salary_rule_id |
||||
|
- hr_employee (emp) on ps.employee_id = emp.id |
||||
|
- hr_salary_rule_category (rl) on rl.id = psl.category_id |
||||
|
- hr_department (dp) (left join) on emp.department_id = dp.id |
||||
|
- hr_job (jb) (left join) on emp.job_id = jb.id |
||||
|
- res_company (cmp) on cmp.id = ps.company_id |
||||
|
""" |
||||
|
from_str = """ |
||||
|
hr_payslip_line psl |
||||
|
join hr_payslip ps on ps.id=psl.slip_id |
||||
|
join hr_salary_rule rlu on rlu.id = psl.salary_rule_id |
||||
|
join hr_employee emp on ps.employee_id=emp.id |
||||
|
join hr_salary_rule_category rl on rl.id = psl.category_id |
||||
|
left join hr_department dp on emp.department_id=dp.id |
||||
|
left join hr_job jb on emp.job_id=jb.id |
||||
|
join res_company cmp on cmp.id=ps.company_id |
||||
|
""" |
||||
|
return from_str |
||||
|
|
||||
|
def _group_by(self): |
||||
|
""" |
||||
|
Generate and return a SQL GROUP BY clause for grouping results in a |
||||
|
database query. |
||||
|
|
||||
|
Returns: |
||||
|
str: SQL GROUP BY clause with the following fields: |
||||
|
- ps.number |
||||
|
- ps.id |
||||
|
- emp.id |
||||
|
- dp.id |
||||
|
- jb.id |
||||
|
- cmp.id |
||||
|
- ps.date_from |
||||
|
- ps.date_to |
||||
|
- ps.state |
||||
|
- psl.total |
||||
|
- psl.name |
||||
|
- psl.category_id |
||||
|
- rl.id |
||||
|
- rlu.id |
||||
|
""" |
||||
|
group_by_str = """group by ps.number,ps.id,emp.id,dp.id,jb.id,cmp.id, |
||||
|
ps.date_from,ps.date_to,ps.state, |
||||
|
psl.total,psl.name,psl.category_id,rl.id,rlu.id""" |
||||
|
return group_by_str |
||||
|
|
||||
|
def init(self): |
||||
|
""" |
||||
|
Initialize or update a database view with a SELECT statement. |
||||
|
""" |
||||
|
tools.drop_view_if_exists(self.env.cr, self._table) |
||||
|
self.env.cr.execute("""CREATE or REPLACE VIEW %s as ( SELECT |
||||
|
%s |
||||
|
FROM %s |
||||
|
%s |
||||
|
)""" % ( |
||||
|
self._table, self._select(), self._from(), self._group_by())) |
@ -0,0 +1,88 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Pivot view of hr_payroll_report--> |
||||
|
<record id="hr_payroll_report_view_pivot" model="ir.ui.view"> |
||||
|
<field name="name">hr.payroll.view.pivot</field> |
||||
|
<field name="model">hr.payroll.report</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<pivot string="Payslip Analysis"> |
||||
|
<field name="name" type="row"/> |
||||
|
<field name="date_from" interval="month" type="col"/> |
||||
|
<field name="rule_amount" type="measure"/> |
||||
|
</pivot> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Graph view of hr_payroll_report--> |
||||
|
<record id="hr_payroll_report_view_graph" model="ir.ui.view"> |
||||
|
<field name="name">hr.payroll.view.graph</field> |
||||
|
<field name="model">hr.payroll.report</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<graph string="Payslip Analysis"> |
||||
|
<field name="date_from" type="row"/> |
||||
|
<field name="rule_amount" type="measure"/> |
||||
|
</graph> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!--Filtration for hr_payroll_report--> |
||||
|
<record id="hr_payroll_report_search" model="ir.ui.view"> |
||||
|
<field name="name">hr.payroll.select</field> |
||||
|
<field name="model">hr.payroll.report</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Payslip Analysis"> |
||||
|
<field name="name"/> |
||||
|
<field name="date_from"/> |
||||
|
<field name="company_id" groups="base.group_multi_company"/> |
||||
|
<field name="start_date" invisible="1"/> |
||||
|
<field name="end_date" invisible="1"/> |
||||
|
<filter string="This Month" name="thismonth" |
||||
|
domain="[('date_from','>=',time.strftime('%%Y-%%m-01'))]"/> |
||||
|
<filter string="This Year" name="year" |
||||
|
domain="[('date_from','<=', time.strftime('%%Y-12-31')),('date_from','>=',time.strftime('%%Y-01-01')),('date_to','<=', time.strftime('%%Y-12-31')),('date_to','>=',time.strftime('%%Y-01-01'))]"/> |
||||
|
<filter name="Done" string="Done" |
||||
|
domain="[('state','=', 'done')]"/> |
||||
|
<filter name="Draft" string="Draft" |
||||
|
domain="[('state','=','draft')]"/> |
||||
|
<separator/> |
||||
|
<field name="department_id"/> |
||||
|
<group expand="1" string="Group By"> |
||||
|
<filter string="Employee" name="Employee" |
||||
|
context="{'group_by':'name'}"/> |
||||
|
<filter string="Job" name="job" |
||||
|
context="{'group_by':'job_id'}"/> |
||||
|
<filter string="Department" name="department" |
||||
|
context="{'group_by':'department_id'}"/> |
||||
|
<filter name="status" string="Status" |
||||
|
context="{'group_by':'state'}"/> |
||||
|
<filter string="Company" name="company" |
||||
|
groups="base.group_multi_company" |
||||
|
context="{'group_by':'company_id'}"/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Window action to open hr_payroll_report--> |
||||
|
<record id="hr_payroll_report_action" model="ir.actions.act_window"> |
||||
|
<field name="res_model">hr.payroll.report</field> |
||||
|
<field name="name">Payslips</field> |
||||
|
<field name="view_mode">pivot,graph</field> |
||||
|
<field name="context">{'search_default_year':1}</field> |
||||
|
<field name="help">This report helps in payroll analysis. This helps you |
||||
|
to check your payslips and sorting it out from different group |
||||
|
criteria (Employee, Job title, Department, Company, Pay slip etc.). |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Menus for Report--> |
||||
|
<menuitem |
||||
|
name="Reports" |
||||
|
id="menu_hr_payslip_reports" |
||||
|
parent="hr_payroll_community.menu_hr_payroll_community_root" |
||||
|
groups="hr_payroll_community.group_hr_payroll_community_user" |
||||
|
sequence="45"/> |
||||
|
<menuitem |
||||
|
id="menu_hr_payslip_view_report" |
||||
|
name="Payslip Report" |
||||
|
parent="menu_hr_payslip_reports" |
||||
|
action="hr_payroll_report_action" |
||||
|
groups="hr_payroll_community.group_hr_payroll_community_user" |
||||
|
sequence="10"/> |
||||
|
</odoo> |
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 628 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 210 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 495 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 929 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 542 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 77 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 600 B |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 926 B |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 800 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 875 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 767 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 760 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 697 KiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 190 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 106 KiB |
After Width: | Height: | Size: 171 KiB |
After Width: | Height: | Size: 127 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 89 KiB |