odoo18/addons_extensions/hr_payroll/models/wages_register.py

62 lines
2.2 KiB
Python

from datetime import timedelta, datetime, date
from dateutil.relativedelta import relativedelta
from odoo import api, fields, models, _
from odoo.http import request
from odoo import http
import babel.dates
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
@api.model
def get_wage_register_data(self, date):
if not date:
now = fields.Datetime.now()
date = babel.dates.format_datetime(now, "MMMM yyyy", locale='en')
sql = """
SELECT
e.name AS employee,
job.name AS designation,
e.doj AS date_of_joining,
e.birthday AS date_of_birth,
to_char(p.date_from, 'Month YYYY') AS month_of_wages,
e.l10n_in_uan AS uan_no,
e.l10n_in_esic_number AS esic_no,
bank.acc_number AS bank_account_no,
SUM(CASE WHEN pl.code = 'BASIC' THEN pl.total ELSE 0 END) AS basic,
SUM(CASE WHEN pl.code = 'HRA' THEN pl.total ELSE 0 END) AS hra,
SUM(CASE WHEN pl.code = 'SPA' THEN pl.total ELSE 0 END) AS other_allowance,
SUM(CASE WHEN pl.code = 'GROSS' THEN pl.total ELSE 0 END) AS gross_wages,
SUM(CASE WHEN pl.code = 'ESICS' THEN pl.total ELSE 0 END) AS esi,
SUM(CASE WHEN pl.code = 'PF' THEN pl.total ELSE 0 END) AS pf,
SUM(CASE WHEN pl.code = 'PT' THEN pl.total ELSE 0 END) AS pt,
SUM(CASE WHEN pl.code = 'DED' THEN pl.total ELSE 0 END) AS total_deductions,
SUM(CASE WHEN pl.code = 'LTA' THEN pl.total ELSE 0 END) AS lta,
p.net_wage AS net_amount_payable
FROM hr_payslip p
JOIN hr_employee e ON p.employee_id = e.id
LEFT JOIN hr_job job ON e.job_id = job.id
LEFT JOIN hr_payslip_line pl ON pl.slip_id = p.id
LEFT JOIN hr_salary_rule_category cat_earn ON cat_earn.code = 'GROSS'
LEFT JOIN hr_salary_rule_category cat_deduct ON cat_deduct.code = 'DED'
LEFT JOIN res_partner_bank bank ON bank.id = e.bank_account_id
GROUP BY
e.name, job.name, e.doj, e.birthday,
p.date_from, e.l10n_in_uan, e.l10n_in_esic_number, e.bank_account_id, p.net_wage, bank.acc_number
ORDER BY e.name;
"""
self.env.cr.execute(sql)
result = self.env.cr.dictfetchall()
data = []
for i in result:
i['designation'] = i['designation']['en_US']
data.append(i)
return data