[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:
Denis Vermylen (dve)
2016-09-02 10:16:48 +02:00
committed by Thibault Delavallée
parent ec01c4b089
commit 6ec13d5f36
8 changed files with 24 additions and 96 deletions
-1
View File
@@ -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',
+12 -10
View File
@@ -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 {
+1 -1
View File
@@ -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!')
+3 -3
View File
@@ -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)