forked from Mapan/odoo17e
92 lines
4.2 KiB
Python
92 lines
4.2 KiB
Python
# -*- coding:utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class HrPayrollAdvice(models.Model):
|
|
_name = 'hr.payroll.advice'
|
|
_description = "Indian HR Payroll Advice"
|
|
|
|
def _get_default_date(self):
|
|
return fields.Date.from_string(fields.Date.today())
|
|
|
|
name = fields.Char(required=True)
|
|
note = fields.Text(string='Description', default='Please make the payroll transfer from above account number to the below mentioned account numbers towards employee salaries:')
|
|
date = fields.Date(required=True, default=_get_default_date,
|
|
help='Advice Date is used to search Payslips')
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('confirm', 'Confirmed'),
|
|
('cancel', 'Cancelled'),
|
|
], string='Status', default='draft', index=True, readonly=True)
|
|
number = fields.Char(string='Reference', readonly=True)
|
|
line_ids = fields.One2many('hr.payroll.advice.line', 'advice_id', string='Employee Salary', copy=True)
|
|
chaque_nos = fields.Char(string='Cheque Numbers')
|
|
neft = fields.Boolean(string='NEFT Transaction', help='Check this box if your company use online transfer for salary')
|
|
company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company)
|
|
bank_id = fields.Many2one('res.bank', string='Bank',
|
|
help='Select the Bank from which the salary is going to be paid')
|
|
batch_id = fields.Many2one('hr.payslip.run', string='Batch', readonly=True)
|
|
|
|
def compute_advice(self):
|
|
"""
|
|
Advice - Create Advice lines in Payment Advice and
|
|
compute Advice lines.
|
|
"""
|
|
for advice in self:
|
|
old_lines = self.env['hr.payroll.advice.line'].search([('advice_id', '=', advice.id)])
|
|
if old_lines:
|
|
old_lines.unlink()
|
|
payslips = self.env['hr.payslip'].search([('date_from', '<=', advice.date), ('date_to', '>=', advice.date), ('state', '=', 'done')])
|
|
for slip in payslips:
|
|
if not slip.employee_id.bank_account_id and not slip.employee_id.bank_account_id.acc_number:
|
|
raise UserError(_('Please define bank account for the %s employee', slip.employee_id.name))
|
|
payslip_line = self.env['hr.payslip.line'].search([('slip_id', '=', slip.id), ('code', '=', 'NET')], limit=1)
|
|
if payslip_line:
|
|
self.env['hr.payroll.advice.line'].create({
|
|
'advice_id': advice.id,
|
|
'name': slip.employee_id.bank_account_id.acc_number,
|
|
'ifsc_code': slip.employee_id.bank_account_id.bank_bic or '',
|
|
'employee_id': slip.employee_id.id,
|
|
'bysal': payslip_line.total
|
|
})
|
|
slip.advice_id = advice.id
|
|
|
|
def confirm_sheet(self):
|
|
"""
|
|
confirm Advice - confirmed Advice after computing Advice Lines..
|
|
"""
|
|
for advice in self:
|
|
if not advice.line_ids:
|
|
raise UserError(_('You can not confirm Payment advice without advice lines.'))
|
|
date = fields.Date.from_string(fields.Date.today())
|
|
advice_year = date.strftime('%m') + '-' + date.strftime('%Y')
|
|
number = self.env['ir.sequence'].next_by_code('payment.advice')
|
|
if number is False:
|
|
self.env['ir.sequence'].create({
|
|
'name': "Payment Advice",
|
|
'code': "payment.advice",
|
|
'padding': 3,
|
|
})
|
|
number = self.env['ir.sequence'].next_by_code('payment.advice')
|
|
advice.write({
|
|
'number': 'PAY' + '/' + advice_year + '/' + number,
|
|
'state': 'confirm',
|
|
})
|
|
|
|
def set_to_draft(self):
|
|
"""Resets Advice as draft.
|
|
"""
|
|
self.write({'state': 'draft'})
|
|
|
|
def cancel_sheet(self):
|
|
"""Marks Advice as cancelled.
|
|
"""
|
|
self.write({'state': 'cancel'})
|
|
|
|
@api.onchange('company_id')
|
|
def _onchange_company_id(self):
|
|
self.bank_id = self.company_id.partner_id.bank_ids and self.company_id.partner_id.bank_ids[0].bank_id.id or False
|