~technofluid-team/openobject-addons/technofluid_multiple_installations

« back to all changes in this revision

Viewing changes to hr_payroll_account/hr_payroll_account.py

[ADD]: a special module that will manage accounting entries for the hr_payroll

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.address_home_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.address_home_id:
 
259
                raise osv.except_osv(_('Integrity Error !'), _('Please defined the Employee Home Address Along with Partners !!'))
 
260
            
 
261
            if not slip.employee_id.address_home_id.partner_id:
 
262
                raise osv.except_osv(_('Integrity Error !'), _('Please defined the Partner in Home Address !!'))
 
263
            
 
264
            partner = slip.employee_id.address_home_id.partner_id
 
265
            partner_id = slip.employee_id.address_home_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