72ffaf435cacd305a1255eadc825817612702793
[odoo/odoo.git] / addons / hr_payroll_account / hr_payroll_account.py
1 #-*- coding:utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution    
5 #    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6 #    d$
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU General Public License as published by
10 #    the Free Software Foundation, either version 3 of the License, or
11 #    (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU General Public License for more details.
17 #
18 #    You should have received a copy of the GNU General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 import time
24 import netsvc
25 from osv import osv
26 from osv import fields
27 from tools import config
28 from tools.translate import _
29
30 from datetime import date
31 from datetime import datetime
32 from datetime import timedelta
33
34 def prev_bounds(cdate=False):
35     when = date.fromtimestamp(time.mktime(time.strptime(cdate,"%Y-%m-%d")))
36     this_first = date(when.year, when.month, 1)
37     month = when.month + 1
38     year = when.year
39     if month > 12:
40         month = 1
41         year += 1
42     next_month = date(year, month, 1)
43     prev_end = next_month - timedelta(days=1)
44     return this_first, prev_end
45
46 class hr_payslip(osv.osv):
47     '''
48     Pay Slip
49     '''
50     _inherit = 'hr.payslip'
51     _description = 'Pay Slip'
52     
53     _columns = {
54         'move_ids':fields.one2many('hr.payslip.account.move', 'slip_id', 'Accounting vouchers', required=False),
55         'move_line_ids':fields.many2many('account.move.line', 'payslip_lines_rel', 'slip_id', 'line_id', 'Accounting Lines', readonly=True),
56         'move_payment_ids':fields.many2many('account.move.line', 'payslip_payment_rel', 'slip_id', 'payment_id', 'Payment Lines', readonly=True),
57         'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], help="Keep empty to use the period of the validation(Payslip) date."),
58     }
59     
60     def create_voucher(self, cr, uid, ids, name, voucher, sequence=5):
61         slip_move = self.pool.get('hr.payslip.account.move')
62         for slip in ids:
63             res = {
64                 'slip_id':slip,
65                 'move_id':voucher,
66                 'sequence':sequence,
67                 'name':name
68             }
69             slip_move.create(cr, uid, res)
70     
71     def cancel_sheet(self, cr, uid, ids, context={}):
72         move_pool = self.pool.get('account.move')
73
74         for slip in self.browse(cr, uid, ids, context):
75             if slip.move_id:
76                 if slip.move_id.state == 'posted':
77                     move_pool.button_cancel(cr, uid [slip.move_id.id], context)
78                 move_pool.unlink(cr, uid, [slip.move_id.id])
79             
80             if slip.adj_move_id:
81                 if slip.adj_move_id.state == 'posted':
82                     move_pool.button_cancel(cr, uid [slip.adj_move_id.id], context)
83                 move_pool.unlink(cr, uid, [slip.adj_move_id.id])
84                 
85             if slip.other_move_id:
86                 if slip.other_move_id.state == 'posted':
87                     move_pool.button_cancel(cr, uid [slip.other_move_id.id], context)
88                 move_pool.unlink(cr, uid, [slip.other_move_id.id])
89             
90         self.write(cr, uid, ids, {'state':'cancel'})
91         return True
92     
93     def process_sheet(self, cr, uid, ids, context={}):
94         move_pool = self.pool.get('account.move')
95         movel_pool = self.pool.get('account.move.line')
96         invoice_pool = self.pool.get('account.invoice')
97         
98         for slip in self.browse(cr,uid,ids):    
99             line_ids = []
100             partner = False
101             partner_id = False
102             exp_ids = []
103             
104             partner = slip.employee_id.bank_account_id.partner_id
105             partner_id = partner.id
106             
107             fiscal_year_ids = self.pool.get('account.fiscalyear').search(cr, uid, [])
108             if not fiscal_year_ids:
109                 raise osv.except_osv(_('Warning !'), _('Please define fiscal year for perticular contract'))
110             fiscal_year_objs = self.pool.get('account.fiscalyear').read(cr, uid, fiscal_year_ids, ['date_start','date_stop'])
111             year_exist = False
112             for fiscal_year in fiscal_year_objs:
113                 if ((fiscal_year['date_start'] <= slip.date) and (fiscal_year['date_stop'] >= slip.date)):
114                     year_exist = True
115             if not year_exist:
116                 raise osv.except_osv(_('Warning !'), _('Fiscal Year is not defined for slip date %s'%slip.date))
117             search_period = self.pool.get('account.period').search(cr,uid,[('date_start','<=',slip.date),('date_stop','>=',slip.date)])
118             if not search_period:
119                 raise osv.except_osv(_('Warning !'), _('Period is not defined for slip date %s'%slip.date))
120             period_id = search_period[0]
121             name = 'Payment of Salary to %s' % (slip.employee_id.name)
122             move = {
123                 'journal_id': slip.bank_journal_id.id,
124                 'period_id': period_id, 
125                 'date': slip.date,
126                 'type':'bank_pay_voucher',
127                 'ref':slip.number,
128                 'narration': name
129             }
130             move_id = move_pool.create(cr, uid, move)
131             self.create_voucher(cr, uid, [slip.id], name, move_id)
132             
133             name = "To %s account" % (slip.employee_id.name)
134             ded_rec = {
135                 'move_id':move_id,
136                 'name': name,
137                 #'partner_id': partner_id,
138                 'date': slip.date, 
139                 'account_id': slip.employee_id.property_bank_account.id, 
140                 'debit': 0.0,
141                 'credit' : slip.total_pay,
142                 'journal_id' : slip.journal_id.id,
143                 'period_id' :period_id,
144                 'ref':slip.number
145             }
146             line_ids += [movel_pool.create(cr, uid, ded_rec)]
147             name = "By %s account" % (slip.employee_id.property_bank_account.name)
148             cre_rec = {
149                 'move_id':move_id,
150                 'name': name,
151                 'partner_id': partner_id,
152                 'date': slip.date,
153                 'account_id': partner.property_account_payable.id,
154                 'debit':  slip.total_pay,
155                 'credit' : 0.0,
156                 'journal_id' : slip.journal_id.id,
157                 'period_id' :period_id,
158                 'ref':slip.number
159             }
160             line_ids += [movel_pool.create(cr, uid, cre_rec)]
161             
162             other_pay = slip.other_pay
163             #Process all Reambuse Entries
164             for line in slip.line_ids:
165                 if line.type == 'otherpay' and line.expanse_id.invoice_id:
166                     if not line.expanse_id.invoice_id.move_id:
167                         raise osv.except_osv(_('Warning !'), _('Please Confirm all Expanse Invoice appear for Reimbursement'))
168                     invids = [line.expanse_id.invoice_id.id]
169                     amount = line.total
170                     acc_id = slip.bank_journal_id.default_credit_account_id and slip.bank_journal_id.default_credit_account_id.id
171                     period_id = slip.period_id.id
172                     journal_id = slip.bank_journal_id.id
173                     name = '[%s]-%s' % (slip.number, line.name)
174                     invoice_pool.pay_and_reconcile(cr, uid, invids, amount, acc_id, period_id, journal_id, False, period_id, False, context, name)
175                     other_pay -= amount
176                     #TODO: link this account entries to the Payment Lines also Expanse Entries to Account Lines
177                     l_ids = movel_pool.search(cr, uid, [('name','=',name)])
178                     line_ids += l_ids
179                     
180                     l_ids = movel_pool.search(cr, uid, [('invoice','=',line.expanse_id.invoice_id.id)])
181                     exp_ids += l_ids
182             
183             #Process for Other payment if any
184             other_move_id = False
185             if slip.other_pay > 0:
186                 narration = 'Payment of Other Payeble amounts to %s' % (slip.employee_id.name)
187                 move = {
188                     'journal_id': slip.bank_journal_id.id,
189                     'period_id': period_id, 
190                     'date': slip.date,
191                     'type':'bank_pay_voucher',
192                     'ref':slip.number,
193                     'narration': narration
194                 }
195                 other_move_id = move_pool.create(cr, uid, move)
196                 self.create_voucher(cr, uid, [slip.id], narration, move_id)
197                 
198                 name = "To %s account" % (slip.employee_id.name)
199                 ded_rec = {
200                     'move_id':other_move_id,
201                     'name':name,
202                     'date':slip.date, 
203                     'account_id':slip.employee_id.property_bank_account.id, 
204                     'debit': 0.0,
205                     'credit': other_pay,
206                     'journal_id':slip.journal_id.id,
207                     'period_id':period_id,
208                     'ref':slip.number
209                 }
210                 line_ids += [movel_pool.create(cr, uid, ded_rec)]
211                 name = "By %s account" % (slip.employee_id.property_bank_account.name)
212                 cre_rec = {
213                     'move_id':other_move_id,
214                     'name':name,
215                     'partner_id':partner_id,
216                     'date':slip.date,
217                     'account_id':partner.property_account_payable.id,
218                     'debit': other_pay,
219                     'credit':0.0,
220                     'journal_id':slip.journal_id.id,
221                     'period_id':period_id,
222                     'ref':slip.number
223                 }
224                 line_ids += [movel_pool.create(cr, uid, cre_rec)]
225             
226             rec = {
227                 'state':'done',
228                 'move_payment_ids':[(6, 0, line_ids)],
229                 'paid':True
230             }
231             self.write(cr, uid, [slip.id], rec)
232             for exp_id in exp_ids:
233                 self.write(cr, uid, [slip.id], {'move_line_ids':[(4, exp_id)]})
234             
235         return True
236     
237     def account_check_sheet(self, cr, uid, ids, context={}):
238         self.write(cr, uid, ids, {'state':'accont_check'})
239         return True
240     
241     def hr_check_sheet(self, cr, uid, ids, context={}):
242         self.write(cr, uid, ids, {'state':'hr_check'})
243         return True
244     
245     def verify_sheet(self, cr, uid, ids, context={}):
246         
247         move_pool = self.pool.get('account.move')
248         movel_pool = self.pool.get('account.move.line')
249         exp_pool = self.pool.get('hr.expense.expense')
250         
251         for slip in self.browse(cr,uid,ids):
252             total_deduct = 0.0
253             
254             line_ids = []
255             partner = False
256             partner_id = False
257             
258             if not slip.employee_id.bank_account_id:
259                 raise osv.except_osv(_('Integrity Error !'), _('Please defined bank account for %s !' % (slip.employee_id.name)))
260             
261             if not slip.employee_id.bank_account_id.partner_id:
262                 raise osv.except_osv(_('Integrity Error !'), _('Please defined partner in bank account for %s !' % (slip.employee_id.name)))
263             
264             partner = slip.employee_id.bank_account_id.partner_id
265             partner_id = slip.employee_id.bank_account_id.partner_id.id
266             
267             period_id = False
268             
269             if slip.period_id:
270                 period_id = slip.period_id.id
271             else:
272                 fiscal_year_ids = self.pool.get('account.fiscalyear').search(cr, uid, [])
273                 if not fiscal_year_ids:
274                     raise osv.except_osv(_('Warning !'), _('Please define fiscal year for perticular contract'))
275                 fiscal_year_objs = self.pool.get('account.fiscalyear').read(cr, uid, fiscal_year_ids, ['date_start','date_stop'])
276                 year_exist = False
277                 for fiscal_year in fiscal_year_objs:
278                     if ((fiscal_year['date_start'] <= slip.date) and (fiscal_year['date_stop'] >= slip.date)):
279                         year_exist = True
280                 if not year_exist:
281                     raise osv.except_osv(_('Warning !'), _('Fiscal Year is not defined for slip date %s'%slip.date))
282                 search_period = self.pool.get('account.period').search(cr,uid,[('date_start','<=',slip.date),('date_stop','>=',slip.date)])
283                 if not search_period:
284                     raise osv.except_osv(_('Warning !'), _('Period is not defined for slip date %s'%slip.date))
285                 period_id = search_period[0]
286             
287             move = {
288                 #'name': slip.name, 
289                 'journal_id': slip.journal_id.id,
290                 'period_id': period_id, 
291                 'date': slip.date,
292                 'ref':slip.number,
293                 'narration': slip.name
294             }
295             move_id = move_pool.create(cr, uid, move)
296             self.create_voucher(cr, uid, [slip.id], slip.name, move_id)
297             
298             line = {
299                 'move_id':move_id,
300                 'name': "By Basic Salary / " + slip.employee_id.name,
301                 'date': slip.date,
302                 'account_id': slip.employee_id.salary_account.id, 
303                 'debit': slip.basic,
304                 'credit': 0.0,
305                 'quantity':slip.working_days,
306                 'journal_id': slip.journal_id.id,
307                 'period_id': period_id,
308                 'analytic_account_id': False,
309                 'ref':slip.number
310             }
311             
312             #Setting Analysis Account for Basic Salary
313             if slip.employee_id.analytic_account:
314                 line['analytic_account_id'] = slip.employee_id.analytic_account.id
315             
316             move_line_id = movel_pool.create(cr, uid, line)
317             line_ids += [move_line_id]
318             
319             line = {
320                 'move_id':move_id,
321                 'name': "To Basic Paysble Salary / " + slip.employee_id.name,
322                 'partner_id': partner_id,
323                 'date': slip.date, 
324                 'account_id': slip.employee_id.employee_account.id, 
325                 'debit': 0.0,
326                 'quantity':slip.working_days,
327                 'credit': slip.basic,
328                 'journal_id': slip.journal_id.id,
329                 'period_id': period_id,
330                 'ref':slip.number
331             }
332             line_ids += [movel_pool.create(cr, uid, line)]
333             
334             for line in slip.line_ids:
335                 name = "[%s] - %s / %s" % (line.code, line.name, slip.employee_id.name)
336                 amount = line.total
337                 
338                 if line.type == 'leaves':
339                     continue
340                 
341                 rec = {
342                     'move_id':move_id,
343                     'name': name,
344                     'date': slip.date, 
345                     'account_id': line.account_id.id, 
346                     'debit': 0.0,
347                     'credit' : 0.0,
348                     'journal_id' : slip.journal_id.id,
349                     'period_id' :period_id,
350                     'analytic_account_id':False,
351                     'ref':slip.number,
352                     'quantity':1
353                 }
354                 
355                 #Setting Analysis Account for Salary Slip Lines
356                 if line.analytic_account_id:
357                     rec['analytic_account_id'] = line.analytic_account_id.id
358                 else: 
359                     rec['analytic_account_id'] = slip.deg_id.account_id.id
360                     
361                 if line.type == 'allounce' or line.type == 'otherpay':
362                     rec['debit'] = amount
363                     if not partner.property_account_payable:
364                         raise osv.except_osv(_('Integrity Error !'), _('Please Configure Partners Payable Account!!'))
365                     ded_rec = {
366                         'move_id':move_id,
367                         'name': name,
368                         'partner_id': partner_id,
369                         'date': slip.date, 
370                         'account_id': partner.property_account_payable.id, 
371                         'debit': 0.0,
372                         'quantity':1,
373                         'credit' : amount,
374                         'journal_id' : slip.journal_id.id,
375                         'period_id' :period_id,
376                         'ref':slip.number
377                     }
378                     line_ids += [movel_pool.create(cr, uid, ded_rec)]
379                 elif line.type == 'deduction' or line.type == 'otherdeduct':
380                     if not partner.property_account_receivable:
381                         raise osv.except_osv(_('Integrity Error !'), _('Please Configure Partners Receivable Account!!'))
382                     rec['credit'] = amount
383                     total_deduct += amount
384                     ded_rec = {
385                         'move_id':move_id,
386                         'name': name,
387                         'partner_id': partner_id,
388                         'date': slip.date, 
389                         'quantity':1,
390                         'account_id': partner.property_account_receivable.id, 
391                         'debit': amount,
392                         'credit' : 0.0,
393                         'journal_id' : slip.journal_id.id,
394                         'period_id' :period_id,
395                         'ref':slip.number
396                     }
397                     line_ids += [movel_pool.create(cr, uid, ded_rec)]
398                 
399                 line_ids += [movel_pool.create(cr, uid, rec)]
400                 
401                 if line.company_contrib > 0:
402                     company_contrib = line.company_contrib
403 #                    if line.category_id.amount_type == 'per':
404 #                        company_contrib = (amount * line.category_id.contribute_per)
405
406                     narration = """Company Contribution of %s Encode same as a Company Expanse @ %s""" % (line.name, company_contrib)
407                     move = {
408                         #'name': slip.name, 
409                         'journal_id': slip.journal_id.id,
410                         'period_id': period_id, 
411                         'date': slip.date,
412                         'ref':slip.number,
413                         'narration': narration
414                     }
415                     company_contrib_move_id = move_pool.create(cr, uid, move)
416                     name = "[%s] - %s / %s - Company Contribution" % (line.code, line.name, slip.employee_id.name)
417                     self.create_voucher(cr, uid, [slip.id], name, company_contrib_move_id)
418                     
419                     ded_deb = {
420                         'move_id':company_contrib_move_id,
421                         'name': name,
422                         'date': slip.date, 
423                         'quantity':1,
424                         'account_id': line.category_id.account_id.id,
425                         'debit': company_contrib,
426                         'credit' : 0.0,
427                         'journal_id': slip.journal_id.id,
428                         'period_id': period_id,
429                         'ref':slip.number
430                     }
431                     line_ids += [movel_pool.create(cr, uid, ded_deb)]
432                     ded_cre = {
433                         'move_id':company_contrib_move_id,
434                         'name': name,
435                         'date': slip.date, 
436                         'quantity':1,
437                         'account_id': line.category_id.register_id.account_id.id,
438                         'debit': 0.0,
439                         'credit' : company_contrib,
440                         'journal_id': slip.journal_id.id,
441                         'period_id': period_id,
442                         'ref':slip.number
443                     }
444                     line_ids += [movel_pool.create(cr, uid, ded_cre)]
445                     
446                     if line.category_id.include_in_salary:
447                         narration = """Company Contribution of %s Deducted from Employee %s""" % (line.name, company_contrib)
448                         move = {
449                             #'name': slip.name, 
450                             'journal_id': slip.journal_id.id,
451                             'period_id': period_id, 
452                             'date': slip.date,
453                             'ref':slip.number,
454                             'narration': narration
455                         }
456                         include_in_salary_move_id = move_pool.create(cr, uid, move)
457                         self.create_voucher(cr, uid, [slip.id], narration, include_in_salary_move_id)
458                         
459                         total_deduct += company_contrib
460                         ded_deb = {
461                             'move_id':include_in_salary_move_id,
462                             'name': name,
463                             'partner_id': partner_id,
464                             'date': slip.date, 
465                             'quantity':1,
466                             'account_id': partner.property_account_receivable.id,
467                             'debit': company_contrib,
468                             'credit' : 0.0,
469                             'journal_id': slip.journal_id.id,
470                             'period_id': period_id,
471                             'ref':slip.number
472                         }
473                         line_ids += [movel_pool.create(cr, uid, ded_deb)]
474                         ded_cre = {
475                             'move_id':include_in_salary_move_id,
476                             'name': name,
477                             'date': slip.date, 
478                             'quantity':1,
479                             'account_id': line.category_id.account_id.id,
480                             'debit': 0.0,
481                             'credit' : company_contrib,
482                             'journal_id': slip.journal_id.id,
483                             'period_id': period_id,
484                             'ref':slip.number
485                         }
486                         line_ids += [movel_pool.create(cr, uid, ded_cre)]
487
488                 #make an entry line to contribution register
489 #                if line.category_id.register_id:
490 #                    ctr = {
491 #                        'register_id':line.category_id.register_id.id,
492 #                        'name':line.name,
493 #                        'code':line.code,
494 #                        'employee_id':slip.employee_id.id,
495 #                        'period_id':period_id,
496 #                        'emp_deduction':amount,
497 #                    }
498 #                    if line.category_id.contribute:
499 #                        ctr['comp_deduction'] = amount
500 #                    
501 #                    company = 0.0
502 #                    employee = 0.0
503 #                    if line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'per':
504 #                        new_amount = (amount * (line.category_id.contribute_per / (1+line.category_id.contribute_per)))
505 #                        company = new_amount
506 #                        employee = amount - company
507 #                    
508 #                    elif line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'fix':
509 #                        company = line.category_id.contribute_per
510 #                        employee = amount - company
511
512 #                    elif line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'func':
513 #                        company = self.pool.get('hr.allounce.deduction.categoty').execute_function(cr, uid, line.category_id.id, line.slip_id.basic, context)
514 #                        employee = amount
515 #                    
516 #                    elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'per':
517 #                        company = amount * line.category_id.contribute_per
518 #                        employee = amount
519 #                    
520 #                    elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'fix':
521 #                        company = line.category_id.contribute_per
522 #                        employee = amount
523
524 #                    elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'func':
525 #                        company = self.pool.get('hr.allounce.deduction.categoty').execute_function(cr, uid, line.category_id.id, line.slip_id.basic, context)
526 #                        employee = amount
527 #                        
528 #                    ctr['emp_deduction'] = employee
529 #                    ctr['comp_deduction'] = company
530 #                        
531 #                    self.pool.get('hr.contibution.register.line').create(cr, uid, ctr)
532
533             adj_move_id = False
534             if total_deduct > 0:
535                 move = {
536                     'journal_id': slip.journal_id.id,
537                     'period_id': period_id,
538                     'date': slip.date,
539                     'ref':slip.number,
540                     'narration': 'Adjustment : %s' % (slip.name)
541                 }
542                 adj_move_id = move_pool.create(cr, uid, move)
543                 name = "Adjustment Entry - %s" % (slip.employee_id.name)
544                 self.create_voucher(cr, uid, [slip.id], name, adj_move_id)
545                 
546                 ded_rec = {
547                     'move_id':adj_move_id,
548                     'name': name,
549                     'partner_id': partner_id,
550                     'date': slip.date, 
551                     'account_id': partner.property_account_receivable.id, 
552                     'debit': 0.0,
553                     'quantity':1,
554                     'credit' : total_deduct,
555                     'journal_id' : slip.journal_id.id,
556                     'period_id' :period_id,
557                     'ref':slip.number
558                 }
559                 line_ids += [movel_pool.create(cr, uid, ded_rec)]
560                 cre_rec = {
561                     'move_id':adj_move_id,
562                     'name': name,
563                     'partner_id': partner_id,
564                     'date': slip.date,
565                     'account_id': partner.property_account_payable.id, 
566                     'debit': total_deduct,
567                     'quantity':1,
568                     'credit' : 0.0,
569                     'journal_id' : slip.journal_id.id,
570                     'period_id' :period_id,
571                     'ref':slip.number
572                 }
573                 line_ids += [movel_pool.create(cr, uid, cre_rec)]
574
575             rec = {
576                 'state':'confirm',
577                 'move_line_ids':[(6, 0,line_ids)],
578             }
579             if not slip.period_id:
580                 rec['period_id'] = period_id
581             
582             dates = prev_bounds(slip.date)
583             exp_ids = exp_pool.search(cr, uid, [('date_valid','>=',dates[0]), ('date_valid','<=',dates[1]), ('state','=','invoiced')])
584             if exp_ids:
585                 acc = self.pool.get('ir.property').get(cr, uid, 'property_account_expense_categ', 'product.category')
586                 for exp in exp_pool.browse(cr, uid, exp_ids):
587                     exp_res = {
588                         'name':exp.name,
589                         'amount_type':'fix',
590                         'type':'otherpay',
591                         'category_id':exp.category_id.id,
592                         'amount':exp.amount,
593                         'slip_id':slip.id,
594                         'expanse_id':exp.id,
595                         'account_id':acc
596                     }
597                     self.pool.get('hr.payslip.line').create(cr, uid, exp_res)
598             
599             self.write(cr, uid, [slip.id], rec)
600             
601         return True
602         
603 hr_payslip()
604
605 class account_move_link_slip(osv.osv):
606     '''
607     Account Move Link to Pay Slip
608     '''
609     _name = 'hr.payslip.account.move'
610     _description = 'Account Move Link to Pay Slip'
611     _columns = {
612         'name':fields.char('Name', size=256, required=True, readonly=False),
613         'move_id':fields.many2one('account.move', 'Expanse Entries', required=False, readonly=True),
614         'slip_id':fields.many2one('hr.payslip', 'Pay Slip', required=False),
615         'sequence': fields.integer('Sequence'),
616     }
617 account_move_link_slip()
618