[REF] hr_payroll: replace workflow by python code
remove workflow and replace by python code.
note: hr.payslip states are messy, 4 states are defined, 3 are used
and 5 exist.
This commit is contained in:
committed by
Thibault Delavallée
parent
ec01c4b089
commit
6ec13d5f36
@@ -30,7 +30,6 @@ Generic Payroll system.
|
||||
'security/ir.model.access.csv',
|
||||
'wizard/hr_payroll_payslips_by_employees_views.xml',
|
||||
'views/hr_payroll_views.xml',
|
||||
'views/hr_payroll_workflow.xml',
|
||||
'data/hr_payroll_sequence.xml',
|
||||
'views/hr_payroll_report.xml',
|
||||
'data/hr_payroll_data.xml',
|
||||
|
||||
@@ -173,6 +173,7 @@ class HrPayslip(models.Model):
|
||||
date_to = fields.Date(string='Date To', readonly=True, required=True,
|
||||
default=str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10],
|
||||
states={'draft': [('readonly', False)]})
|
||||
# this is chaos: 4 states are defined, 3 are used ('verify' isn't) and 5 exist ('confirm' seems to have existed)
|
||||
state = fields.Selection([
|
||||
('draft', 'Draft'),
|
||||
('verify', 'Waiting'),
|
||||
@@ -223,24 +224,25 @@ class HrPayslip(models.Model):
|
||||
raise ValidationError(_("Payslip 'Date From' must be before 'Date To'."))
|
||||
|
||||
@api.multi
|
||||
def cancel_sheet(self):
|
||||
return self.write({'state': 'cancel'})
|
||||
def action_payslip_draft(self):
|
||||
return self.write({'state': 'draft'})
|
||||
|
||||
@api.multi
|
||||
def process_sheet(self):
|
||||
return self.write({'paid': True, 'state': 'done'})
|
||||
|
||||
@api.multi
|
||||
def hr_verify_sheet(self):
|
||||
def action_payslip_done(self):
|
||||
self.compute_sheet()
|
||||
return self.write({'state': 'verify'})
|
||||
return self.write({'state': 'done'})
|
||||
|
||||
@api.multi
|
||||
def action_payslip_cancel(self):
|
||||
if self.filtered(lambda slip: slip.state == 'done'):
|
||||
raise UserError(_("Cannot cancel a payslip that is done."))
|
||||
return self.write({'state': 'cancel'})
|
||||
|
||||
@api.multi
|
||||
def refund_sheet(self):
|
||||
for payslip in self:
|
||||
copied_payslip = payslip.copy({'credit_note': True, 'name': _('Refund: ') + payslip.name})
|
||||
copied_payslip.signal_workflow('hr_verify_sheet')
|
||||
copied_payslip.signal_workflow('process_sheet')
|
||||
copied_payslip.action_payslip_done()
|
||||
formview_ref = self.env.ref('hr_payroll.view_hr_payslip_form', False)
|
||||
treeview_ref = self.env.ref('hr_payroll.view_hr_payslip_tree', False)
|
||||
return {
|
||||
|
||||
@@ -37,7 +37,7 @@ class TestPayslipFlow(TestPayslipBase):
|
||||
richard_payslip.with_context(context).compute_sheet()
|
||||
|
||||
# Then I click on the 'Confirm' button on payslip
|
||||
richard_payslip.signal_workflow('hr_verify_sheet')
|
||||
richard_payslip.action_payslip_done()
|
||||
|
||||
# I verify that the payslip is in done state
|
||||
self.assertEqual(richard_payslip.state, 'done', 'State not changed!')
|
||||
|
||||
@@ -209,11 +209,11 @@
|
||||
<field name="arch" type="xml">
|
||||
<form string="Payslip">
|
||||
<header>
|
||||
<button string="Confirm" name="hr_verify_sheet" states="draft" class="oe_highlight"/>
|
||||
<button string="Confirm" name="action_payslip_done" type="object" states="draft" class="oe_highlight"/>
|
||||
<button string="Refund" name="refund_sheet" states="confirm,done" type='object' />
|
||||
<button string="Set to Draft" name="draft" states="cancel"/>
|
||||
<button string="Set to Draft" name="action_payslip_draft" type="object" states="cancel"/>
|
||||
<button string="Compute Sheet" name="compute_sheet" type="object" states="draft" class="oe_highlight"/>
|
||||
<button string="Cancel Payslip" name="cancel_sheet" states="draft,hr_check,confirm,verify"/>
|
||||
<button string="Cancel Payslip" name="action_payslip_cancel" type="object" states="draft,hr_check,confirm,verify"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirm"/>
|
||||
</header>
|
||||
<sheet>
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="wkf" model="workflow">
|
||||
<field name="name">hr.payslip.basic</field>
|
||||
<field name="osv">hr.payslip</field>
|
||||
<field name="on_create">True</field>
|
||||
</record>
|
||||
|
||||
<record id="act_draft" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">draft</field>
|
||||
<field name="flow_start">True</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="action">write({'state': 'draft'})</field>
|
||||
<field name="split_mode">OR</field>
|
||||
</record>
|
||||
|
||||
<record id="act_verify" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">verify</field>
|
||||
<field name="action">hr_verify_sheet()</field>
|
||||
<field name="kind">function</field>
|
||||
</record>
|
||||
|
||||
<record id="act_cancel" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">cancel</field>
|
||||
<field name="action">cancel_sheet()</field>
|
||||
<field name="kind">function</field>
|
||||
</record>
|
||||
|
||||
<record id="act_done" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf"/>
|
||||
<field name="name">done</field>
|
||||
<field name="action">process_sheet()</field>
|
||||
<field name="kind">function</field>
|
||||
<field name="flow_stop">True</field>
|
||||
</record>
|
||||
|
||||
<record id="t1" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_verify"/>
|
||||
<field name="signal">hr_verify_sheet</field>
|
||||
</record>
|
||||
|
||||
<record id="t2" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">cancel_sheet</field>
|
||||
</record>
|
||||
|
||||
<record id="t3" model="workflow.transition">
|
||||
<field name="act_from" ref="act_cancel"/>
|
||||
<field name="act_to" ref="act_draft"/>
|
||||
<field name="signal">draft</field>
|
||||
</record>
|
||||
|
||||
<record id="t4" model="workflow.transition">
|
||||
<field name="act_from" ref="act_verify"/>
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="signal">cancel_sheet</field>
|
||||
</record>
|
||||
|
||||
<record id="t5" model="workflow.transition">
|
||||
<field name="act_from" ref="act_verify"/>
|
||||
<field name="act_to" ref="act_done"/>
|
||||
<field name="condition">check_done()</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -45,14 +45,14 @@ class HrPayslip(models.Model):
|
||||
self.journal_id = self.contract_id.journal_id.id or (not self.contract_id and self.default_get(['journal_id'])['journal_id'])
|
||||
|
||||
@api.multi
|
||||
def cancel_sheet(self):
|
||||
def action_payslip_cancel(self):
|
||||
moves = self.mapped('move_id')
|
||||
moves.filtered(lambda x: x.state == 'posted').button_cancel()
|
||||
moves.unlink()
|
||||
return super(HrPayslip, self).cancel_sheet()
|
||||
return super(HrPayslip, self).action_payslip_cancel()
|
||||
|
||||
@api.multi
|
||||
def process_sheet(self):
|
||||
def action_payslip_done(self):
|
||||
precision = self.env['decimal.precision'].precision_get('Payroll')
|
||||
|
||||
for slip in self:
|
||||
@@ -138,7 +138,7 @@ class HrPayslip(models.Model):
|
||||
move = self.env['account.move'].create(move_dict)
|
||||
slip.write({'move_id': move.id, 'date': date})
|
||||
move.post()
|
||||
return super(HrPayslip, self).process_sheet()
|
||||
return super(HrPayslip, self).action_payslip_done()
|
||||
|
||||
|
||||
class HrSalaryRule(models.Model):
|
||||
|
||||
@@ -107,12 +107,12 @@ class TestHrPayrollAccount(common.TransactionCase):
|
||||
self.hr_payslip.with_context(context).compute_sheet()
|
||||
|
||||
# I want to check cancel button. So I first cancel the sheet then make it set to draft.
|
||||
self.hr_payslip.cancel_sheet()
|
||||
self.hr_payslip.action_payslip_cancel()
|
||||
self.assertEqual(self.hr_payslip.state, 'cancel', "Payslip is rejected.")
|
||||
self.hr_payslip.signal_workflow('draft')
|
||||
self.hr_payslip.action_payslip_draft()
|
||||
|
||||
# Confirm Payslip
|
||||
self.hr_payslip.signal_workflow('hr_verify_sheet')
|
||||
self.hr_payslip.action_payslip_done()
|
||||
|
||||
# I verify that the Accounting Entries are created.
|
||||
self.assertTrue(self.hr_payslip.move_id, 'Accounting Entries has not been created')
|
||||
|
||||
@@ -139,8 +139,7 @@ class HrPayslipRun(models.Model):
|
||||
})
|
||||
for slip in run.slip_ids:
|
||||
# TODO is it necessary to interleave the calls ?
|
||||
slip.signal_workflow('hr_verify_sheet')
|
||||
slip.signal_workflow('process_sheet')
|
||||
slip.action_payslip_done()
|
||||
if not slip.employee_id.bank_account_id or 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)
|
||||
|
||||
Reference in New Issue
Block a user