This question has been flagged
1 Reply
8343 Views

I tried to create a programmed action in one module. Declared this in my view.

<record id="ir_cron_personnel_actions" model="ir.cron">
        <field name="name">Run Personnel Actions Job</field>
        <field eval="True" name="active"/>
        <field name="user_id" ref="base.user_root"/>
        <field name="interval_number">1</field>
        <field name="interval_type">days</field>
        <field name="numbercall">-1</field>
        <field eval="'hr.personnel.action'" name="model"/>
        <field eval="'run_personnel_actions'" name="function"/>
        <field eval="'()'" name="args"/>
    </record>

And then declared this on my .py file.

def run_personnel_actions(self, cr, uid, ids, context=None):
        """Runs a determined action on the date set in the field effective_date.

        Returns None"""

        #This variables holds the objects we are going to be using in each action.
        hr_obj = self.pool.get('hr.employee')
        hr_cont_obj = self.pool.get('hr.contract')
        hr_cont_rate_obj = self.pool.get('hr.contract.rate')
        hr_holiday = self.pool.get('hr.holidays')
        hr_pay_obj = self.pool.get('hr.payslip')
        hr_payslip_obj = self.pool.get('hr.payslip.input')

        actions = self.browse(cr, uid, ids, context=None)
        #Loop for traversing all records in the hr.personnel.action table and if the status is for approved and the date is today, run them.
        for action in actions:
            #These variables hold the ids of the contract and payroll associated to the employee.
            hr_cont_id = hr_cont_obj.search(cr, uid, [('employee_id', '=', action.employee_id.id)],
                                   order='id', context=None)
            hr_pay_id = hr_pay_obj.search(cr, uid, [('employee_id', '=', action.employee_id.id)], 
                                 order='id', context=None)
            hr_cont_record = hr_cont_obj.browse(cr, uid, hr_cont_id[-1], context=None)

            if action.states == 'approved' and action.effective_date == datetime.date.today():
                if action.action_requested == '1':
                    hr_payslip_obj.create(cr, uid, {'contract_id':hr_cont_id[-1], 
                                    'amount':action.proposed_bonus, 
                                    'name':"Bonus payment", 
                                    'code':1, 
                                    'payslip_id':hr_pay_id[0]}, context=None)
                    self.write(cr, uid, ids, {'states':'applied'}, context=None)

But so far it doesn't run when is supposed to, and doesn't raisee any error at all.

Avatar
Discard
Best Answer

try making it like this.

<record id="ir_cron_personnel_actions" model="ir.cron">
        <field name="name">Run Personnel Actions Job</field>
        <field name="active" eval="True"/>
        <field name="interval_number">1</field>
        <field name="interval_type">days</field>
        <field name="numbercall">-1</field>
        <field name="doall" eval="False"/>
        <field name="model">hr.personnel.action</field>
        <field name="function">run_personnel_actions</field>
        <field name="args">()</field>
    </record>

Create a test button to make sure the function works or increase interval so you can see if the fuction works correctly.

Avatar
Discard
Author

Hi, thanks for the answer. I try changing it like you suggested and make a button that called the same function. The button did what's supposed to, but still the action pass and nothing happens. I know the job is running as i can see how it changes the next date to be performed. I am thinking, if i pass the function the args (self, cr, uid, ids, context=None) that ids i supposed to take all the records in my table, right? Maybe that is the issue, what do you think?

Author

When you pass the <field name="args">()</field> that is supposed to get all records on the object that the function is stored? I think the problem may be that when the function is called the ids doesn't pass all the records ids, and therefore it doesn't get running. That would explain why when the button is called it runs, because it pass the id of the record i am currently in. I am correct?