2010-06-05 06:39:12 +00:00
#-*- coding:utf-8 -*-
##############################################################################
#
2010-07-01 07:31:46 +00:00
# OpenERP, Open Source Management Solution
2010-06-05 06:39:12 +00:00
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# d$
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
2010-06-05 07:32:16 +00:00
import time
2010-07-27 07:11:45 +00:00
from datetime import date , datetime , timedelta
2010-06-05 07:32:16 +00:00
import netsvc
2010-07-27 07:11:45 +00:00
from osv import fields , osv
2010-06-05 07:32:16 +00:00
from tools import config
from tools . translate import _
2010-07-27 07:11:45 +00:00
2010-06-18 03:11:40 +00:00
def prev_bounds ( cdate = False ) :
when = date . fromtimestamp ( time . mktime ( time . strptime ( cdate , " % Y- % m- %d " ) ) )
this_first = date ( when . year , when . month , 1 )
month = when . month + 1
year = when . year
if month > 12 :
month = 1
year + = 1
next_month = date ( year , month , 1 )
prev_end = next_month - timedelta ( days = 1 )
return this_first , prev_end
2010-06-06 18:26:08 +00:00
class hr_contract_wage_type ( osv . osv ) :
"""
2010-06-07 13:26:59 +00:00
Wage types
2010-06-06 18:26:08 +00:00
Basic = Basic Salary
Grows = Basic + Allowances
New = Grows - Deductions
"""
2010-07-01 07:31:46 +00:00
2010-06-06 18:26:08 +00:00
_inherit = ' hr.contract.wage.type '
_columns = {
' type ' : fields . selection ( [ ( ' basic ' , ' Basic ' ) , ( ' gross ' , ' Gross ' ) , ( ' net ' , ' Net ' ) ] , ' Type ' , required = True ) ,
}
hr_contract_wage_type ( )
2010-06-05 07:32:16 +00:00
class hr_passport ( osv . osv ) :
2010-06-06 18:26:08 +00:00
"""
Employee Passport
Passport based Contratacts for Employees
"""
2010-07-01 07:31:46 +00:00
2010-06-05 07:32:16 +00:00
_name = ' hr.passport '
_description = ' Passport Detail '
2010-07-01 07:31:46 +00:00
2010-06-05 07:32:16 +00:00
_columns = {
' employee_id ' : fields . many2one ( ' hr.employee ' , ' Employee ' , required = True ) ,
' name ' : fields . char ( ' Passport No ' , size = 64 , required = True , readonly = False ) ,
' country_id ' : fields . many2one ( ' res.country ' , ' Country of Issue ' , required = True ) ,
2010-06-06 18:26:08 +00:00
' address_id ' : fields . many2one ( ' res.partner.address ' , ' Address ' , required = False ) ,
' date_issue ' : fields . date ( ' Passport Issue Date ' , required = True ) ,
' date_expire ' : fields . date ( ' Passport Expire Date ' , required = True ) ,
2010-06-05 07:32:16 +00:00
' contracts_ids ' : fields . one2many ( ' hr.contract ' , ' passport_id ' , ' Contracts ' , required = False , readonly = True ) ,
2010-06-06 18:26:08 +00:00
' note ' : fields . text ( ' Description ' ) ,
2010-06-05 07:32:16 +00:00
}
hr_passport ( )
2010-06-06 18:26:08 +00:00
class hr_payroll_structure ( osv . osv ) :
"""
Salary structure used to defined
2010-06-09 14:38:22 +00:00
- Basic
- Allowlance
- Deductions
2010-06-06 18:26:08 +00:00
"""
2010-07-01 07:31:46 +00:00
2010-06-06 18:26:08 +00:00
_name = ' hr.payroll.structure '
_description = ' Salary Structure '
2010-06-05 07:32:16 +00:00
_columns = {
2010-06-06 18:26:08 +00:00
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
' code ' : fields . char ( ' Code ' , size = 64 , required = True , readonly = False ) ,
2010-06-06 16:29:11 +00:00
' line_ids ' : fields . one2many ( ' hr.payslip.line ' , ' function_id ' , ' Salary Structure ' , required = False ) ,
2010-06-05 07:32:16 +00:00
' account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , required = False ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' note ' : fields . text ( ' Description ' ) ,
2010-06-05 07:32:16 +00:00
}
_defaults = {
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
2010-07-01 07:31:46 +00:00
2010-06-05 07:32:16 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
2010-06-06 18:26:08 +00:00
"""
Create a new record in hr_payroll_structure model from existing one
@param cr : cursor to database
@param user : id of current user
@param id : list of record ids on which copy method executes
@param default : dict type contains the values to be override during copy of object
@param context : context arguments , like lang , time zone
2010-07-01 07:31:46 +00:00
2010-06-06 18:26:08 +00:00
@return : returns a id of newly created record
"""
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
code = self . browse ( cr , uid , id , context = context ) . code
2010-06-05 07:32:16 +00:00
default = {
' code ' : code + " (copy) " ,
' company_id ' : self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context ) . company_id . id
}
2010-07-27 07:11:45 +00:00
res_id = super ( hr_payroll_structure , self ) . copy ( cr , uid , id , default , context = context )
2010-06-06 18:26:08 +00:00
return res_id
2010-07-01 07:31:46 +00:00
2010-06-06 18:26:08 +00:00
hr_payroll_structure ( )
2010-06-05 07:32:16 +00:00
class hr_contract ( osv . osv ) :
2010-06-06 19:09:53 +00:00
"""
Employee contract based on the visa , work permits
allowas to configure different Salary structure
"""
2010-07-01 07:31:46 +00:00
2010-06-05 07:32:16 +00:00
_inherit = ' hr.contract '
_description = ' Employee Contract '
2010-07-01 07:31:46 +00:00
2010-06-05 07:32:16 +00:00
_columns = {
' permit_no ' : fields . char ( ' Work Permit No ' , size = 256 , required = False , readonly = False ) ,
2010-09-11 09:32:15 +00:00
# 'passport_id':fields.many2one('hr.passport', 'Passport', required=False),
' passport_id ' : fields . char ( ' Passport ' , size = 64 , required = False ) ,
2010-06-05 07:32:16 +00:00
' visa_no ' : fields . char ( ' Visa No ' , size = 64 , required = False , readonly = False ) ,
' visa_expire ' : fields . date ( ' Visa Expire Date ' ) ,
2010-06-06 18:26:08 +00:00
' struct_id ' : fields . many2one ( ' hr.payroll.structure ' , ' Salary Structure ' ) ,
2010-06-18 03:11:40 +00:00
' working_days_per_week ' : fields . integer ( ' Working Days ' , help = " No of Working days / week for an employee " )
}
_defaults = {
' working_days_per_week ' : lambda * a : 5 ,
2010-06-05 07:32:16 +00:00
}
2010-09-11 09:32:15 +00:00
def on_change_employee_id ( self , cr , uid , ids , employee_id ) :
v = { }
passport = self . pool . get ( ' hr.employee ' ) . browse ( cr , uid , employee_id ) . passport_id
if passport :
v [ ' passport_id ' ] = passport
return { ' value ' : v }
2010-06-05 07:32:16 +00:00
hr_contract ( )
2010-06-06 16:29:11 +00:00
class payroll_register ( osv . osv ) :
2010-06-09 14:38:22 +00:00
"""
2010-06-06 16:29:11 +00:00
Payroll Register
2010-06-09 14:38:22 +00:00
"""
2010-06-06 16:29:11 +00:00
_name = ' hr.payroll.register '
_description = ' Payroll Register '
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def _calculate ( self , cr , uid , ids , field_names , arg , context = None ) :
2010-06-06 16:29:11 +00:00
res = { }
allounce = 0.0
deduction = 0.0
net = 0.0
grows = 0.0
2010-07-27 07:11:45 +00:00
for register in self . browse ( cr , uid , ids , context = context ) :
2010-06-06 16:29:11 +00:00
for slip in register . line_ids :
allounce + = slip . allounce
deduction + = slip . deduction
net + = slip . net
grows + = slip . grows
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
res [ register . id ] = {
' allounce ' : allounce ,
' deduction ' : deduction ,
' net ' : net ,
' grows ' : grows
}
return res
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' name ' : fields . char ( ' Name ' , size = 64 , required = True , readonly = False ) ,
' date ' : fields . date ( ' Date ' , required = True ) ,
' number ' : fields . char ( ' Number ' , size = 64 , required = False , readonly = True ) ,
' line_ids ' : fields . one2many ( ' hr.payslip ' , ' register_id ' , ' Payslips ' , required = False ) ,
' state ' : fields . selection ( [
( ' new ' , ' New Slip ' ) ,
( ' draft ' , ' Wating for Verification ' ) ,
( ' hr_check ' , ' Wating for HR Verification ' ) ,
( ' accont_check ' , ' Wating for Account Verification ' ) ,
( ' confirm ' , ' Confirm Sheet ' ) ,
( ' done ' , ' Paid Salary ' ) ,
( ' cancel ' , ' Reject ' ) ,
] , ' State ' , select = True , readonly = True ) ,
' journal_id ' : fields . many2one ( ' account.journal ' , ' Expanse Journal ' , required = True ) ,
' bank_journal_id ' : fields . many2one ( ' account.journal ' , ' Bank Journal ' , required = True ) ,
' active ' : fields . boolean ( ' Active ' , required = False ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
' period_id ' : fields . many2one ( ' account.period ' , ' Force Period ' , domain = [ ( ' state ' , ' <> ' , ' done ' ) ] , help = " Keep empty to use the period of the validation(Payslip) date. " ) ,
2010-07-07 06:21:07 +00:00
' grows ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Gross Salary ' , type = ' float ' , digits = ( 16 , 4 ) ) ,
' net ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Net Salary ' , digits = ( 16 , 4 ) ) ,
' allounce ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Allowance ' , digits = ( 16 , 4 ) ) ,
' deduction ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Deduction ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' note ' : fields . text ( ' Description ' ) ,
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_defaults = {
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' state ' : lambda * a : ' new ' ,
' active ' : lambda * a : True ,
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
2010-07-27 07:11:45 +00:00
def compute_sheet ( self , cr , uid , ids , context = None ) :
2010-06-06 16:29:11 +00:00
emp_pool = self . pool . get ( ' hr.employee ' )
slip_pool = self . pool . get ( ' hr.payslip ' )
2010-06-06 18:26:08 +00:00
func_pool = self . pool . get ( ' hr.payroll.structure ' )
2010-06-06 16:29:11 +00:00
slip_line_pool = self . pool . get ( ' hr.payslip.line ' )
wf_service = netsvc . LocalService ( " workflow " )
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
vals = self . browse ( cr , uid , ids , context = context ) [ 0 ]
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
emp_ids = emp_pool . search ( cr , uid , [ ] , context = context )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
for emp in emp_pool . browse ( cr , uid , emp_ids , context = context ) :
old_slips = slip_pool . search ( cr , uid , [ ( ' employee_id ' , ' = ' , emp . id ) , ( ' date ' , ' = ' , vals . date ) ] , context = context )
2010-06-06 16:29:11 +00:00
if old_slips :
2010-07-27 07:11:45 +00:00
slip_pool . write ( cr , uid , old_slips , { ' register_id ' : ids [ 0 ] } , context = context )
2010-06-06 16:29:11 +00:00
for sid in old_slips :
wf_service . trg_validate ( uid , ' hr.payslip ' , sid , ' compute_sheet ' , cr )
2010-07-02 10:37:15 +00:00
else :
res = {
' employee_id ' : emp . id ,
' basic ' : 0.0 ,
' register_id ' : ids [ 0 ] ,
' name ' : vals . name ,
' date ' : vals . date ,
' journal_id ' : vals . journal_id . id ,
' bank_journal_id ' : vals . bank_journal_id . id
}
2010-07-27 07:11:45 +00:00
slip_id = slip_pool . create ( cr , uid , res , context = context )
2010-07-02 10:37:15 +00:00
wf_service . trg_validate ( uid , ' hr.payslip ' , slip_id , ' compute_sheet ' , cr )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
number = self . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' salary.register ' )
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , ids , { ' state ' : ' draft ' , ' number ' : number } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-27 07:11:45 +00:00
def verify_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
slip_pool = self . pool . get ( ' hr.payslip ' )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
for id in ids :
2010-07-27 07:11:45 +00:00
sids = slip_pool . search ( cr , uid , [ ( ' register_id ' , ' = ' , id ) ] , context = context )
2010-06-06 16:29:11 +00:00
wf_service = netsvc . LocalService ( " workflow " )
for sid in sids :
wf_service . trg_validate ( uid , ' hr.payslip ' , sid , ' verify_sheet ' , cr )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , ids , { ' state ' : ' hr_check ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def final_verify_sheet ( self , cr , uid , ids , context = None ) :
2010-06-06 16:29:11 +00:00
slip_pool = self . pool . get ( ' hr.payslip ' )
advice_pool = self . pool . get ( ' hr.payroll.advice ' )
advice_line_pool = self . pool . get ( ' hr.payroll.advice.line ' )
2010-07-27 07:11:45 +00:00
sequence_pool = self . pool . get ( ' ir.sequence ' )
users_pool = self . pool . get ( ' res.users ' )
if context is None :
context = { }
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
for id in ids :
2010-07-27 07:11:45 +00:00
sids = slip_pool . search ( cr , uid , [ ( ' register_id ' , ' = ' , id ) , ( ' state ' , ' = ' , ' hr_check ' ) ] , context = context )
2010-06-06 16:29:11 +00:00
wf_service = netsvc . LocalService ( " workflow " )
for sid in sids :
wf_service . trg_validate ( uid , ' hr.payslip ' , sid , ' final_verify_sheet ' , cr )
2010-07-27 07:11:45 +00:00
for reg in self . browse ( cr , uid , ids , context = context ) :
2010-06-06 16:29:11 +00:00
accs = { }
for slip in reg . line_ids :
pid = False
if accs . get ( slip . employee_id . property_bank_account . code , False ) == False :
advice = {
2010-07-27 07:11:45 +00:00
' name ' : ' Payment Advice from %s / Bank Account %s ' % ( users_pool . browse ( cr , uid , uid , context = context ) . company_id . name , slip . employee_id . property_bank_account . name ) ,
' number ' : sequence_pool . get ( cr , uid , ' payment.advice ' ) ,
2010-06-06 16:29:11 +00:00
' register_id ' : reg . id ,
' account_id ' : slip . employee_id . property_bank_account . id
}
2010-07-27 07:11:45 +00:00
pid = advice_pool . create ( cr , uid , advice , context = context )
2010-06-06 16:29:11 +00:00
accs [ slip . employee_id . property_bank_account . code ] = pid
else :
pid = accs [ slip . employee_id . property_bank_account . code ]
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
pline = {
' advice_id ' : pid ,
2010-09-11 13:29:00 +00:00
' name ' : slip . employee_id . identification_id ,
2010-06-06 16:29:11 +00:00
' employee_id ' : slip . employee_id . id ,
' amount ' : slip . other_pay + slip . net ,
' bysal ' : slip . net
}
2010-07-27 07:11:45 +00:00
id = advice_line_pool . create ( cr , uid , pline , context = context )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , ids , { ' state ' : ' confirm ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-27 07:11:45 +00:00
def process_sheet ( self , cr , uid , ids , context = None ) :
2010-06-06 16:29:11 +00:00
slip_pool = self . pool . get ( ' hr.payslip ' )
for id in ids :
2010-07-27 07:11:45 +00:00
sids = slip_pool . search ( cr , uid , [ ( ' register_id ' , ' = ' , id ) , ( ' state ' , ' = ' , ' confirm ' ) ] , context = context )
2010-06-06 16:29:11 +00:00
wf_service = netsvc . LocalService ( " workflow " )
for sid in sids :
wf_service . trg_validate ( uid , ' hr.payslip ' , sid , ' process_sheet ' , cr )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , ids , { ' state ' : ' done ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
payroll_register ( )
class payroll_advice ( osv . osv ) :
'''
Bank Advice Note
'''
_name = ' hr.payroll.advice '
_description = ' Bank Advice Note '
2010-07-01 07:31:46 +00:00
2010-08-05 04:41:04 +00:00
def _get_bank ( self , cr , uid , ids , field_name , args , context = None ) :
res = { }
if context is None :
context = { }
for rec in self . browse ( cr , uid , ids , context = context ) :
if rec . company_id and rec . company_id . partner_id . bank_ids :
res [ rec . id ] = rec . company_id . partner_id . bank_ids [ 0 ] . bank . name
else :
res [ rec . id ] = ' '
return res
2010-06-06 16:29:11 +00:00
_columns = {
' register_id ' : fields . many2one ( ' hr.payroll.register ' , ' Payroll Register ' , required = False ) ,
' name ' : fields . char ( ' Name ' , size = 2048 , required = True , readonly = False ) ,
' note ' : fields . text ( ' Description ' ) ,
' date ' : fields . date ( ' Date ' ) ,
' state ' : fields . selection ( [
( ' draft ' , ' Draft Sheet ' ) ,
( ' confirm ' , ' Confirm Sheet ' ) ,
( ' cancel ' , ' Reject ' ) ,
] , ' State ' , select = True , readonly = True ) ,
' number ' : fields . char ( ' Number ' , size = 64 , required = False , readonly = True ) ,
' line_ids ' : fields . one2many ( ' hr.payroll.advice.line ' , ' advice_id ' , ' Employee Salary ' , required = False ) ,
' chaque_nos ' : fields . char ( ' Chaque Nos ' , size = 256 , required = False , readonly = False ) ,
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' , required = True ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
2010-08-05 04:41:04 +00:00
' bank ' : fields . function ( _get_bank , method = True , string = ' Bank ' , type = " char " ) ,
2010-06-06 16:29:11 +00:00
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_defaults = {
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' state ' : lambda * a : ' draft ' ,
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def confirm_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' confirm ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def set_to_draft ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' draft ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-27 07:11:45 +00:00
def cancel_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' cancel ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-08-05 13:41:55 +00:00
def onchange_company_id ( self , cr , uid , ids , company_id = False , context = None ) :
2010-08-05 04:41:04 +00:00
res = { }
if context is None :
context = { }
if company_id :
company = self . pool . get ( ' res.company ' ) . browse ( cr , uid , company_id , context = context )
2010-08-05 13:41:55 +00:00
if company . partner_id . bank_ids :
res . update ( { ' bank ' : company . partner_id . bank_ids [ 0 ] . bank . name } )
2010-08-05 04:41:04 +00:00
return {
' value ' : res
}
2010-06-06 16:29:11 +00:00
payroll_advice ( )
class payroll_advice_line ( osv . osv ) :
'''
Bank Advice Lines
'''
_name = ' hr.payroll.advice.line '
_description = ' Bank Advice Lines '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' advice_id ' : fields . many2one ( ' hr.payroll.advice ' , ' Bank Advice ' , required = False ) ,
' name ' : fields . char ( ' Bank Account A/C ' , size = 64 , required = True , readonly = False ) ,
' employee_id ' : fields . many2one ( ' hr.employee ' , ' Employee ' , required = True ) ,
2010-07-07 06:21:07 +00:00
' amount ' : fields . float ( ' Amount ' , digits = ( 16 , 4 ) ) ,
' bysal ' : fields . float ( ' By Salary ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' flag ' : fields . char ( ' D/C ' , size = 8 , required = True , readonly = False ) ,
}
_defaults = {
' flag ' : lambda * a : ' C ' ,
}
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def onchange_employee_id ( self , cr , uid , ids , ddate , employee_id , context = None ) :
2010-06-06 16:29:11 +00:00
vals = { }
2010-07-01 07:31:46 +00:00
slip_pool = self . pool . get ( ' hr.payslip ' )
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
if employee_id :
dates = prev_bounds ( ddate )
sids = False
2010-07-27 07:11:45 +00:00
sids = slip_pool . search ( cr , uid , [ ( ' paid ' , ' = ' , False ) , ( ' state ' , ' = ' , ' confirm ' ) , ( ' date ' , ' >= ' , dates [ 0 ] ) , ( ' employee_id ' , ' = ' , employee_id ) , ( ' date ' , ' <= ' , dates [ 1 ] ) ] , context = context )
2010-06-06 16:29:11 +00:00
if sids :
2010-07-27 07:11:45 +00:00
slip = slip_pool . browse ( cr , uid , sids [ 0 ] , context = context )
2010-09-11 13:29:00 +00:00
vals [ ' name ' ] = slip . employee_id . identification_id
2010-06-06 16:29:11 +00:00
vals [ ' amount ' ] = slip . net + slip . other_pay
vals [ ' bysal ' ] = slip . net
return {
' value ' : vals
}
payroll_advice_line ( )
class contrib_register ( osv . osv ) :
'''
Contribution Register
'''
_name = ' hr.contibution.register '
_description = ' Contribution Register '
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def _total_contrib ( self , cr , uid , ids , field_names , arg , context = None ) :
2010-06-06 16:29:11 +00:00
line_pool = self . pool . get ( ' hr.contibution.register.line ' )
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
period_id = self . pool . get ( ' account.period ' ) . search ( cr , uid , [ ( ' date_start ' , ' <= ' , time . strftime ( ' % Y- % m- %d ' ) ) , ( ' date_stop ' , ' >= ' , time . strftime ( ' % Y- % m- %d ' ) ) ] , context = context ) [ 0 ]
fiscalyear_id = self . pool . get ( ' account.period ' ) . browse ( cr , uid , period_id , context = context ) . fiscalyear_id
2010-06-06 16:29:11 +00:00
res = { }
2010-07-27 07:11:45 +00:00
for cur in self . browse ( cr , uid , ids , context = context ) :
current = line_pool . search ( cr , uid , [ ( ' period_id ' , ' = ' , period_id ) , ( ' register_id ' , ' = ' , cur . id ) ] , context = context )
years = line_pool . search ( cr , uid , [ ( ' period_id.fiscalyear_id ' , ' = ' , fiscalyear_id . id ) , ( ' register_id ' , ' = ' , cur . id ) ] , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
e_month = 0.0
c_month = 0.0
2010-07-27 07:11:45 +00:00
for i in line_pool . browse ( cr , uid , current , context = context ) :
2010-06-06 16:29:11 +00:00
e_month + = i . emp_deduction
c_month + = i . comp_deduction
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
e_year = 0.0
c_year = 0.0
2010-07-27 07:11:45 +00:00
for j in line_pool . browse ( cr , uid , years , context = context ) :
2010-06-06 16:29:11 +00:00
e_year + = i . emp_deduction
c_year + = i . comp_deduction
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
res [ cur . id ] = {
' monthly_total_by_emp ' : e_month ,
' monthly_total_by_comp ' : c_month ,
' yearly_total_by_emp ' : e_year ,
' yearly_total_by_comp ' : c_year
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
return res
_columns = {
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' , required = True ) ,
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , required = False ) ,
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
' register_line_ids ' : fields . one2many ( ' hr.contibution.register.line ' , ' register_id ' , ' Register Line ' , readonly = True ) ,
2010-07-07 06:21:07 +00:00
' yearly_total_by_emp ' : fields . function ( _total_contrib , method = True , multi = ' dc ' , store = True , string = ' Total By Employee ' , digits = ( 16 , 4 ) ) ,
' yearly_total_by_comp ' : fields . function ( _total_contrib , method = True , multi = ' dc ' , store = True , string = ' Total By Company ' , digits = ( 16 , 4 ) ) ,
' monthly_total_by_emp ' : fields . function ( _total_contrib , method = True , multi = ' dc ' , store = True , string = ' Total By Employee ' , digits = ( 16 , 4 ) ) ,
' monthly_total_by_comp ' : fields . function ( _total_contrib , method = True , multi = ' dc ' , store = True , string = ' Total By Company ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' note ' : fields . text ( ' Description ' ) ,
}
_defaults = {
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
contrib_register ( )
class contrib_register_line ( osv . osv ) :
'''
Contribution Register Line
'''
_name = ' hr.contibution.register.line '
_description = ' Contribution Register Line '
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def _total ( self , cr , uid , ids , field_names , arg , context = None ) :
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
res = { }
2010-07-27 07:11:45 +00:00
for line in self . browse ( cr , uid , ids , context = context ) :
2010-06-06 16:29:11 +00:00
res [ line . id ] = line . emp_deduction + line . comp_deduction
return res
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
' register_id ' : fields . many2one ( ' hr.contibution.register ' , ' Register ' , required = False ) ,
' code ' : fields . char ( ' Code ' , size = 64 , required = False , readonly = False ) ,
' employee_id ' : fields . many2one ( ' hr.employee ' , ' Employee ' , required = True ) ,
' period_id ' : fields . many2one ( ' account.period ' , ' Period ' ) ,
2010-07-07 06:21:07 +00:00
' emp_deduction ' : fields . float ( ' Employee Deduction ' , digits = ( 16 , 4 ) ) ,
' comp_deduction ' : fields . float ( ' Company Deduction ' , digits = ( 16 , 4 ) ) ,
' total ' : fields . function ( _total , method = True , store = True , string = ' Total ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
}
contrib_register_line ( )
class payment_category ( osv . osv ) :
2010-06-09 14:38:22 +00:00
"""
Allowance , Deduction Heads
House Rent Allowance , Medical Allowance , Food Allowance
2010-07-01 07:31:46 +00:00
Professional Tax , Advance TDS , Providend Funds , etc
2010-06-09 14:38:22 +00:00
"""
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_name = ' hr.allounce.deduction.categoty '
2010-06-09 14:38:22 +00:00
_description = ' Allowance Deduction Heads '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' name ' : fields . char ( ' Categoty Name ' , size = 64 , required = True , readonly = False ) ,
' code ' : fields . char ( ' Categoty Code ' , size = 64 , required = True , readonly = False ) ,
' type ' : fields . selection ( [
2010-06-18 00:51:41 +00:00
( ' allowance ' , ' Allowance ' ) ,
( ' deduction ' , ' Deduction ' ) ,
2010-06-06 16:29:11 +00:00
( ' other ' , ' Others ' ) ,
] , ' Type ' , select = True ) ,
2010-07-02 10:37:15 +00:00
' base ' : fields . text ( ' Based on ' , required = True , readonly = False , help = ' This will use to computer the % f ields values, in general its on basic, but You can use all heads code field in small letter as a variable name i.e. hra, ma, lta, etc...., also you can use, static varible basic ' ) ,
2010-06-06 16:29:11 +00:00
' condition ' : fields . char ( ' Condition ' , size = 1024 , required = True , readonly = False , help = ' Applied this head for calculation if condition is true ' ) ,
' sequence ' : fields . integer ( ' Sequence ' , required = True , help = ' Use to arrange calculation sequence ' ) ,
2010-07-01 07:31:46 +00:00
' note ' : fields . text ( ' Description ' ) ,
2010-06-09 14:38:22 +00:00
' user_id ' : fields . char ( ' User ' , size = 64 , required = False , readonly = False ) ,
' state ' : fields . char ( ' Label ' , size = 64 , required = False , readonly = False ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
2010-07-02 10:37:15 +00:00
' contribute_ids ' : fields . one2many ( ' company.contribution ' , ' category_id ' , ' Contributions ' , required = False ) ,
2010-06-09 14:38:22 +00:00
}
_defaults = {
' condition ' : lambda * a : ' True ' ,
' base ' : lambda * a : ' basic ' ,
' sequence ' : lambda * a : 5 ,
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
payment_category ( )
class company_contribution ( osv . osv ) :
"""
Company contribution
Allows to configure company contribution for some taxes
"""
2010-07-01 07:31:46 +00:00
2010-06-09 14:38:22 +00:00
_name = ' company.contribution '
_description = " Company Contribution "
2010-07-01 07:31:46 +00:00
2010-06-09 14:38:22 +00:00
_columns = {
' category_id ' : fields . many2one ( ' hr.allounce.deduction.categoty ' , ' Heads ' , required = False ) ,
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
2010-06-09 14:54:48 +00:00
' code ' : fields . char ( ' Code ' , size = 64 , required = True , readonly = False ) ,
2010-06-09 14:38:22 +00:00
' gratuity ' : fields . boolean ( ' Use for Gratuity ? ' , required = False ) ,
' line_ids ' : fields . one2many ( ' company.contribution.line ' , ' contribution_id ' , ' Calculations ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' register_id ' : fields . property (
' hr.contibution.register ' ,
type = ' many2one ' ,
relation = ' hr.contibution.register ' ,
string = " Contribution Register " ,
method = True ,
view_load = True ,
help = " Contribution register based on company " ,
required = False
) ,
' amount_type ' : fields . selection ( [
( ' fix ' , ' Fixed Amount ' ) ,
2010-07-07 13:03:47 +00:00
( ' per ' , ' Percentage ' ) ,
2010-06-06 16:29:11 +00:00
( ' func ' , ' Function Calculation ' ) ,
] , ' Amount Type ' , select = True ) ,
2010-07-07 06:21:07 +00:00
' contribute_per ' : fields . float ( ' Contribution ' , digits = ( 16 , 4 ) , help = ' Define Company contribution ratio 1.00=100 % c ontribution, If Employee Contribute 5 % then company will and here 0.50 defined then company will contribute 50 % o n employee 5 % c ontribution ' ) ,
2010-06-09 14:38:22 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
2010-06-09 14:54:48 +00:00
' active ' : fields . boolean ( ' Active ' , required = False ) ,
' note ' : fields . text ( ' Description ' ) ,
2010-06-06 16:29:11 +00:00
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_defaults = {
' amount_type ' : lambda * a : ' fix ' ,
2010-06-09 14:54:48 +00:00
' active ' : lambda * a : True ,
2010-06-06 16:29:11 +00:00
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def execute_function ( self , cr , uid , id , value , context = None ) :
2010-06-06 16:29:11 +00:00
"""
2010-06-07 13:26:59 +00:00
self : pointer to self object
cr : cursor to database
uid : user id of current executer
2010-06-06 16:29:11 +00:00
"""
2010-06-09 14:38:22 +00:00
line_pool = self . pool . get ( ' company.contribution.line ' )
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
res = 0
2010-07-27 07:11:45 +00:00
ids = line_pool . search ( cr , uid , [ ( ' category_id ' , ' = ' , id ) , ( ' to_val ' , ' >= ' , value ) , ( ' from_val ' , ' <= ' , value ) ] , context = context )
2010-06-06 16:29:11 +00:00
if not ids :
2010-07-27 07:11:45 +00:00
ids = line_pool . search ( cr , uid , [ ( ' category_id ' , ' = ' , id ) , ( ' from ' , ' <= ' , value ) ] , context = context )
2010-06-06 16:29:11 +00:00
if not ids :
res = 0
else :
2010-07-27 07:11:45 +00:00
res = line_pool . browse ( cr , uid , ids , context = context ) [ 0 ] . value
2010-06-06 16:29:11 +00:00
return res
2010-07-01 07:31:46 +00:00
2010-06-09 14:38:22 +00:00
company_contribution ( )
2010-06-06 16:29:11 +00:00
2010-06-09 14:38:22 +00:00
class company_contribution_line ( osv . osv ) :
"""
Company contribution lines
"""
2010-07-01 07:31:46 +00:00
2010-06-09 14:38:22 +00:00
_name = ' company.contribution.line '
2010-06-06 16:29:11 +00:00
_description = ' Allowance Deduction Categoty '
_order = ' sequence '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
2010-06-09 14:38:22 +00:00
' contribution_id ' : fields . many2one ( ' company.contribution ' , ' Contribution ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = False , readonly = False ) ,
' umo_id ' : fields . many2one ( ' product.uom ' , ' Unite ' , required = False ) ,
2010-07-07 06:21:07 +00:00
' from_val ' : fields . float ( ' From ' , digits = ( 16 , 4 ) ) ,
' to_val ' : fields . float ( ' To ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' amount_type ' : fields . selection ( [
( ' fix ' , ' Fixed Amount ' ) ,
] , ' Amount Type ' , select = True ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
2010-07-07 06:21:07 +00:00
' value ' : fields . float ( ' Value ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
}
2010-06-09 14:38:22 +00:00
company_contribution_line ( )
2010-06-06 16:29:11 +00:00
class hr_holidays_status ( osv . osv ) :
_inherit = " hr.holidays.status "
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
' type ' : fields . selection ( [
2010-07-01 07:31:46 +00:00
( ' paid ' , ' Paid Holiday ' ) ,
( ' unpaid ' , ' Un-Paid Holiday ' ) ,
2010-06-06 16:29:11 +00:00
( ' halfpaid ' , ' Half-Pay Holiday ' )
] , string = ' Payment ' ) ,
2010-06-07 13:26:59 +00:00
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , required = False ) ,
2010-06-18 00:51:41 +00:00
' head_id ' : fields . many2one ( ' hr.allounce.deduction.categoty ' , ' Payroll Head ' , domain = [ ( ' type ' , ' = ' , ' deduction ' ) ] ) ,
2010-06-07 13:26:59 +00:00
' code ' : fields . char ( ' Code ' , size = 64 , required = False , readonly = False ) ,
2010-06-06 16:29:11 +00:00
}
_defaults = {
' type ' : lambda * args : ' unpaid ' ,
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
hr_holidays_status ( )
class hr_expense_expense ( osv . osv ) :
_inherit = " hr.expense.expense "
_description = " Expense "
_columns = {
' category_id ' : fields . many2one ( ' hr.allounce.deduction.categoty ' , ' Payroll Head ' , domain = [ ( ' type ' , ' = ' , ' other ' ) ] ) ,
}
hr_expense_expense ( )
class hr_payslip ( osv . osv ) :
'''
Pay Slip
'''
_name = ' hr.payslip '
_description = ' Pay Slip '
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def _calculate ( self , cr , uid , ids , field_names , arg , context = None ) :
slip_line_obj = self . pool . get ( ' hr.payslip.line ' )
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
res = { }
2010-07-27 07:11:45 +00:00
for rs in self . browse ( cr , uid , ids , context = context ) :
2010-06-06 16:29:11 +00:00
allow = 0.0
deduct = 0.0
others = 0.0
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
obj = {
' basic ' : rs . basic
}
if rs . igross > 0 :
obj . update ( {
' gross ' : rs . igross
} )
if rs . inet > 0 :
obj . update ( {
' net ' : rs . inet
} )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
for line in rs . line_ids :
amount = 0.0
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if line . amount_type == ' per ' :
2010-06-18 00:51:41 +00:00
try :
amount = line . amount * eval ( str ( line . category_id . base ) , obj )
except Exception , e :
raise osv . except_osv ( _ ( ' Variable Error ! ' ) , _ ( ' Variable Error : %s ' % ( e ) ) )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
elif line . amount_type in ( ' fix ' , ' func ' ) :
amount = line . amount
cd = line . category_id . code . lower ( )
obj [ cd ] = amount
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
contrib = 0.0
2010-06-18 00:51:41 +00:00
if line . type == ' allowance ' :
2010-06-06 16:29:11 +00:00
allow + = amount
others + = contrib
amount - = contrib
elif line . type == ' deduction ' :
deduct + = amount
others - = contrib
amount + = contrib
elif line . type == ' advance ' :
others + = amount
elif line . type == ' loan ' :
others + = amount
elif line . type == ' otherpay ' :
others + = amount
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
slip_line_obj . write ( cr , uid , [ line . id ] , { ' total ' : amount } , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
record = {
2010-06-18 00:51:41 +00:00
' allounce ' : round ( allow ) ,
' deduction ' : round ( deduct ) ,
' grows ' : round ( rs . basic + allow ) ,
' net ' : round ( rs . basic + allow - deduct ) ,
2010-06-06 16:29:11 +00:00
' other_pay ' : others ,
2010-06-18 00:51:41 +00:00
' total_pay ' : round ( rs . basic + allow - deduct )
2010-06-06 16:29:11 +00:00
}
res [ rs . id ] = record
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
return res
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
2010-06-06 18:26:08 +00:00
' deg_id ' : fields . many2one ( ' hr.payroll.structure ' , ' Designation ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' register_id ' : fields . many2one ( ' hr.payroll.register ' , ' Register ' , required = False ) ,
' journal_id ' : fields . many2one ( ' account.journal ' , ' Expanse Journal ' , required = True ) ,
' bank_journal_id ' : fields . many2one ( ' account.journal ' , ' Bank Journal ' , required = True ) ,
' name ' : fields . char ( ' Name ' , size = 64 , required = False , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' number ' : fields . char ( ' Number ' , size = 64 , required = False , readonly = True ) ,
' employee_id ' : fields . many2one ( ' hr.employee ' , ' Employee ' , required = True ) ,
' date ' : fields . date ( ' Date ' ) ,
' state ' : fields . selection ( [
( ' new ' , ' New Slip ' ) ,
( ' draft ' , ' Wating for Verification ' ) ,
( ' hr_check ' , ' Wating for HR Verification ' ) ,
( ' accont_check ' , ' Wating for Account Verification ' ) ,
( ' confirm ' , ' Confirm Sheet ' ) ,
( ' done ' , ' Paid Salary ' ) ,
( ' cancel ' , ' Reject ' ) ,
] , ' State ' , select = True , readonly = True ) ,
' basic_before_leaves ' : fields . float ( ' Basic Salary ' , readonly = True , digits = ( 16 , 2 ) ) ,
2010-07-07 06:21:07 +00:00
' leaves ' : fields . float ( ' Leave Deductions ' , readonly = True , digits = ( 16 , 2 ) ) ,
' basic ' : fields . float ( ' Net Basic ' , readonly = True , digits = ( 16 , 2 ) ) ,
2010-06-06 16:29:11 +00:00
' grows ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Gross Salary ' , type = ' float ' , digits = ( 16 , 2 ) ) ,
' net ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Net Salary ' , digits = ( 16 , 2 ) ) ,
' allounce ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Allowance ' , digits = ( 16 , 2 ) ) ,
' deduction ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Deduction ' , digits = ( 16 , 2 ) ) ,
' other_pay ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Others ' , digits = ( 16 , 2 ) ) ,
' total_pay ' : fields . function ( _calculate , method = True , store = True , multi = ' dc ' , string = ' Total Payment ' , digits = ( 16 , 2 ) ) ,
' line_ids ' : fields . one2many ( ' hr.payslip.line ' , ' slip_id ' , ' Payslip Line ' , required = False , readonly = True , states = { ' draft ' : [ ( ' readonly ' , False ) ] } ) ,
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = False ) ,
' holiday_days ' : fields . integer ( ' No of Leaves ' , readonly = True ) ,
' worked_days ' : fields . integer ( ' Worked Day ' , readonly = True ) ,
' working_days ' : fields . integer ( ' Working Days ' , readonly = True ) ,
' paid ' : fields . boolean ( ' Paid ? ' , required = False ) ,
' note ' : fields . text ( ' Description ' ) ,
2010-06-18 00:51:41 +00:00
' contract_id ' : fields . many2one ( ' hr.contract ' , ' Contract ' , required = False ) ,
' igross ' : fields . float ( ' Calculaton Field ' , readonly = True , digits = ( 16 , 2 ) , help = " Calculation field used for internal calculation, do not place this on form " ) ,
' inet ' : fields . float ( ' Calculaton Field ' , readonly = True , digits = ( 16 , 2 ) , help = " Calculation field used for internal calculation, do not place this on form " ) ,
2010-09-23 09:17:34 +00:00
' period_id ' : fields . many2one ( ' account.period ' , ' Force Period ' , domain = [ ( ' state ' , ' <> ' , ' done ' ) ] , help = " Keep empty to use the period of the validation(Payslip) date. " ) ,
2010-06-06 16:29:11 +00:00
}
_defaults = {
' date ' : lambda * a : time . strftime ( ' % Y- % m- %d ' ) ,
' state ' : lambda * a : ' new ' ,
' company_id ' : lambda self , cr , uid , context : \
self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid ,
context = context ) . company_id . id ,
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
company_id = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context ) . company_id . id
default = {
' line_ids ' : False ,
' move_ids ' : False ,
' move_line_ids ' : False ,
' move_payment_ids ' : False ,
' company_id ' : company_id ,
' period_id ' : False ,
' basic_before_leaves ' : 0 ,
' basic ' : 0
}
2010-07-27 07:11:45 +00:00
res_id = super ( hr_payslip , self ) . copy ( cr , uid , id , default , context = context )
2010-06-06 16:29:11 +00:00
return res_id
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
def create_voucher ( self , cr , uid , ids , name , voucher , sequence = 5 ) :
slip_move = self . pool . get ( ' hr.payslip.account.move ' )
for slip in ids :
res = {
' slip_id ' : slip ,
' move_id ' : voucher ,
' sequence ' : sequence ,
' name ' : name
}
slip_move . create ( cr , uid , res )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def set_to_draft ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' draft ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def cancel_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' cancel ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def account_check_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' accont_check ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def hr_check_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' hr_check ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-27 07:11:45 +00:00
def process_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' done ' } , context = context )
2010-07-02 10:37:15 +00:00
return True
2010-07-27 07:11:45 +00:00
def verify_sheet ( self , cr , uid , ids , context = None ) :
if context is None :
context = { }
self . write ( cr , uid , ids , { ' state ' : ' confirm ' } , context = context )
2010-06-06 16:29:11 +00:00
return True
2010-07-27 07:11:45 +00:00
def get_contract ( self , cr , uid , employee , date , context = None ) :
if context is None :
context = { }
2010-06-18 00:51:41 +00:00
sql_req = '''
SELECT c . id as id , c . wage as wage , struct_id as function
FROM hr_contract c
LEFT JOIN hr_employee emp on ( c . employee_id = emp . id )
LEFT JOIN hr_contract_wage_type cwt on ( cwt . id = c . wage_type_id )
LEFT JOIN hr_contract_wage_type_period p on ( cwt . period_id = p . id )
WHERE
( emp . id = % s ) AND
( date_start < = % s ) AND
( date_end IS NULL OR date_end > = % s )
LIMIT 1
'''
cr . execute ( sql_req , ( employee . id , date , date ) )
2010-07-01 07:31:46 +00:00
contract = cr . dictfetchone ( )
2010-06-29 17:22:04 +00:00
contract = contract and contract or { }
2010-06-18 00:51:41 +00:00
return contract
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def _get_leaves ( self , cr , user , slip , employee , context = None ) :
2010-06-18 03:11:40 +00:00
"""
Compute leaves for an employee
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
@param cr : cursor to database
@param user : id of current user
@param slip : object of the hr . payroll . slip model
@param employee : object of the hr . employee model
@param context : context arguments , like lang , time zone
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
@return : return a result
"""
2010-07-27 07:11:45 +00:00
if context is None :
context = { }
2010-06-18 03:11:40 +00:00
result = [ ]
dates = prev_bounds ( slip . date )
sql = ''' select id from hr_holidays
2010-07-01 07:31:46 +00:00
where date_from > = ' %s ' and date_to < = ' %s '
and employee_id = % s
2010-06-18 03:11:40 +00:00
and state = ' validate ' ''' % (dates[0], dates[1], slip.employee_id.id)
cr . execute ( sql )
res = cr . fetchall ( )
if res :
result = [ x [ 0 ] for x in res ]
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
return result
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def compute_sheet ( self , cr , uid , ids , context = None ) :
2010-06-06 16:29:11 +00:00
emp_pool = self . pool . get ( ' hr.employee ' )
slip_pool = self . pool . get ( ' hr.payslip ' )
2010-06-06 18:26:08 +00:00
func_pool = self . pool . get ( ' hr.payroll.structure ' )
2010-06-06 16:29:11 +00:00
slip_line_pool = self . pool . get ( ' hr.payslip.line ' )
holiday_pool = self . pool . get ( ' hr.holidays ' )
2010-07-27 07:11:45 +00:00
contract_obj = self . pool . get ( ' hr.contract ' )
sequence_obj = self . pool . get ( ' ir.sequence ' )
if context is None :
context = { }
date = self . read ( cr , uid , ids , [ ' date ' ] , context = context ) [ 0 ] [ ' date ' ]
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
#Check for the Holidays
def get_days ( start , end , month , year , calc_day ) :
count = 0
import datetime
for day in range ( start , end ) :
if datetime . date ( year , month , day ) . weekday ( ) == calc_day :
count + = 1
return count
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
for slip in self . browse ( cr , uid , ids , context = context ) :
2010-06-18 00:51:41 +00:00
contracts = self . get_contract ( cr , uid , slip . employee_id , date , context )
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
if contracts . get ( ' id ' , False ) == False :
2010-06-06 16:29:11 +00:00
continue
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
contract = contract_obj . browse ( cr , uid , contracts . get ( ' id ' ) , context = context )
2010-06-06 16:29:11 +00:00
sal_type = contract . wage_type_id . type
2010-06-18 00:51:41 +00:00
function = contract . struct_id . id
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
lines = [ ]
if function :
2010-07-27 07:11:45 +00:00
func = func_pool . read ( cr , uid , function , [ ' line_ids ' ] , context = context )
lines = slip_line_pool . browse ( cr , uid , func [ ' line_ids ' ] , context = context )
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
lines + = slip . employee_id . line_ids
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
old_slip_ids = slip_line_pool . search ( cr , uid , [ ( ' slip_id ' , ' = ' , slip . id ) ] , context = context )
slip_line_pool . unlink ( cr , uid , old_slip_ids , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
ad = [ ]
lns = { }
all_per = 0.0
ded_per = 0.0
all_fix = 0.0
ded_fix = 0.0
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
obj = {
' basic ' : 0.0
}
update = {
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
}
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if contract . wage_type_id . type == ' gross ' :
obj [ ' gross ' ] = contract . wage
2010-06-18 00:51:41 +00:00
update [ ' igross ' ] = contract . wage
2010-06-06 16:29:11 +00:00
if contract . wage_type_id . type == ' net ' :
obj [ ' net ' ] = contract . wage
2010-06-18 00:51:41 +00:00
update [ ' inet ' ] = contract . wage
2010-06-06 16:29:11 +00:00
if contract . wage_type_id . type == ' basic ' :
obj [ ' basic ' ] = contract . wage
2010-06-18 00:51:41 +00:00
update [ ' basic ' ] = contract . wage
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
c_type = {
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
}
2010-06-18 00:51:41 +00:00
2010-06-06 16:29:11 +00:00
for line in lines :
cd = line . code . lower ( )
2010-06-18 00:51:41 +00:00
obj [ cd ] = line . amount or 0.0
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
for line in lines :
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if line . category_id . code in ad :
continue
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
ad . append ( line . category_id . code )
cd = line . category_id . code . lower ( )
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
calculate = False
2010-06-06 16:29:11 +00:00
try :
exp = line . category_id . condition
calculate = eval ( exp , obj )
except Exception , e :
raise osv . except_osv ( _ ( ' Variable Error ! ' ) , _ ( ' Variable Error : %s ' % ( e ) ) )
if not calculate :
continue
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
percent = 0.0
2010-06-06 16:29:11 +00:00
value = 0.0
base = False
company_contrib = 0.0
2010-06-18 00:51:41 +00:00
base = line . category_id . base
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
try :
2010-06-18 00:51:41 +00:00
# Please have a look at the configuration guide for rules and restrictions
amt = eval ( base , obj )
2010-06-06 16:29:11 +00:00
except Exception , e :
raise osv . except_osv ( _ ( ' Variable Error ! ' ) , _ ( ' Variable Error : %s ' % ( e ) ) )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if sal_type in ( ' gross ' , ' net ' ) :
if line . amount_type == ' per ' :
2010-06-18 00:51:41 +00:00
percent = line . amount
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if amt > 1 :
2010-06-18 00:51:41 +00:00
value = percent * amt
elif amt > 0 and amt < = 1 :
percent = percent * amt
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
if value > 0 :
percent = 0.0
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
elif line . amount_type == ' fix ' :
2010-06-06 16:29:11 +00:00
value = line . amount
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
elif line . amount_type == ' func ' :
2010-07-27 07:11:45 +00:00
value = slip_line_pool . execute_function ( cr , uid , line . id , amt , context )
2010-06-18 00:51:41 +00:00
line . amount = value
2010-06-06 16:29:11 +00:00
else :
if line . amount_type in ( ' fix ' , ' per ' ) :
value = line . amount
2010-07-27 07:11:45 +00:00
2010-06-06 16:29:11 +00:00
elif line . amount_type == ' func ' :
2010-07-27 07:11:45 +00:00
value = slip_line_pool . execute_function ( cr , uid , line . id , amt , context )
2010-06-18 03:11:40 +00:00
line . amount = value
2010-07-01 07:31:46 +00:00
2010-06-18 00:51:41 +00:00
if line . type == ' allowance ' :
all_per + = percent
2010-06-06 16:29:11 +00:00
all_fix + = value
elif line . type == ' deduction ' :
2010-06-18 00:51:41 +00:00
ded_per + = percent
2010-06-06 16:29:11 +00:00
ded_fix + = value
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
vals = {
2010-07-01 07:31:46 +00:00
' amount ' : line . amount ,
' slip_id ' : slip . id ,
' employee_id ' : False ,
2010-06-06 16:29:11 +00:00
' function_id ' : False ,
' base ' : base
}
slip_line_pool . copy ( cr , uid , line . id , vals , { } )
2010-07-27 07:11:45 +00:00
2010-06-06 16:29:11 +00:00
if sal_type in ( ' gross ' , ' net ' ) :
sal = contract . wage
if sal_type == ' net ' :
sal + = ded_fix
sal - = all_fix
per = 0.0
if sal_type == ' net ' :
per = ( all_per - ded_per )
else :
per = all_per
if per < = 0 :
per * = - 1
final = ( per * 100 ) + 100
basic = ( sal * 100 ) / final
else :
basic = contract . wage
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
number = sequence_obj . get ( cr , uid , ' salary.slip ' )
2010-06-18 03:11:40 +00:00
ttyme = datetime . fromtimestamp ( time . mktime ( time . strptime ( slip . date , " % Y- % m- %d " ) ) )
update . update ( {
' deg_id ' : function ,
2010-07-01 07:31:46 +00:00
' number ' : number ,
2010-06-18 03:11:40 +00:00
' basic ' : round ( basic ) ,
' basic_before_leaves ' : round ( basic ) ,
2010-07-01 07:31:46 +00:00
' name ' : ' Salary Slip of %s for %s ' % ( slip . employee_id . name , ttyme . strftime ( ' % B- % Y ' ) ) ,
2010-06-18 03:11:40 +00:00
' state ' : ' draft ' ,
' contract_id ' : contract . id ,
' company_id ' : slip . employee_id . company_id . id
} )
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , [ slip . id ] , update , context = context )
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
for slip in self . browse ( cr , uid , ids , context = context ) :
2010-06-29 17:22:04 +00:00
if not slip . contract_id :
continue
2010-07-01 07:31:46 +00:00
2010-06-29 17:22:04 +00:00
basic_before_leaves = slip . basic
2010-06-06 16:29:11 +00:00
working_day = 0
off_days = 0
2010-06-18 03:11:40 +00:00
dates = prev_bounds ( slip . date )
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
days_arr = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ]
for dy in range ( contract . working_days_per_week , 7 ) :
off_days + = get_days ( 1 , dates [ 1 ] . day , dates [ 1 ] . month , dates [ 1 ] . year , days_arr [ dy ] )
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
total_off = off_days
working_day = dates [ 1 ] . day - total_off
perday = slip . net / working_day
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
total = 0.0
leave = 0.0
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
leave_ids = self . _get_leaves ( cr , uid , slip , slip . employee_id , context )
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
total_leave = 0.0
paid_leave = 0.0
2010-07-27 07:11:45 +00:00
for hday in holiday_pool . browse ( cr , uid , leave_ids , context = context ) :
2010-06-18 03:11:40 +00:00
res = {
' slip_id ' : slip . id ,
' name ' : hday . holiday_status_id . name + ' - %s ' % ( hday . number_of_days ) ,
' code ' : hday . holiday_status_id . code ,
' amount_type ' : ' fix ' ,
' category_id ' : hday . holiday_status_id . head_id . id ,
' account_id ' : hday . holiday_status_id . account_id . id ,
' analytic_account_id ' : hday . holiday_status_id . analytic_account_id . id
}
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
days = hday . number_of_days
if hday . number_of_days < 0 :
days = hday . number_of_days * - 1
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
total_leave + = days
if hday . holiday_status_id . type == ' paid ' :
paid_leave + = days
continue
2010-07-01 07:31:46 +00:00
2010-06-18 03:11:40 +00:00
elif hday . holiday_status_id . type == ' halfpaid ' :
paid_leave + = ( days / 2 )
res [ ' name ' ] = hday . holiday_status_id . name + ' - %s /2 ' % ( days )
res [ ' amount ' ] = perday * ( days / 2 )
total + = perday * ( days / 2 )
leave + = days / 2
res [ ' type ' ] = ' deduction '
else :
res [ ' name ' ] = hday . holiday_status_id . name + ' - %s ' % ( days )
res [ ' amount ' ] = perday * days
res [ ' type ' ] = ' deduction '
leave + = days
total + = perday * days
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
slip_line_pool . create ( cr , uid , res , context = context )
2010-06-18 03:11:40 +00:00
basic = basic - total
leaves = total
2010-06-06 16:29:11 +00:00
2010-06-18 00:51:41 +00:00
update . update ( {
2010-06-06 16:29:11 +00:00
' basic_before_leaves ' : round ( basic_before_leaves ) ,
' leaves ' : total ,
' holiday_days ' : leave ,
' worked_days ' : working_day - leave ,
' working_days ' : working_day ,
2010-06-18 00:51:41 +00:00
} )
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , [ slip . id ] , update , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
return True
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
hr_payslip ( )
class account_move_link_slip ( osv . osv ) :
'''
Account Move Link to Pay Slip
'''
_name = ' hr.payslip.account.move '
_description = ' Account Move Link to Pay Slip '
_columns = {
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
' move_id ' : fields . many2one ( ' account.move ' , ' Expanse Entries ' , required = False , readonly = True ) ,
' slip_id ' : fields . many2one ( ' hr.payslip ' , ' Pay Slip ' , required = False ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
}
account_move_link_slip ( )
class line_condition ( osv . osv ) :
'''
Line Condition
'''
_name = ' hr.payslip.line.condition '
_description = ' Line Condition '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' name ' : fields . char ( ' Name ' , size = 64 , required = False , readonly = False ) ,
' date_start ' : fields . date ( ' Start Date ' ) ,
' date_end ' : fields . date ( ' End Date ' ) ,
' state ' : fields . selection ( [
( ' total ' , ' Override By ' ) ,
( ' add ' , ' Add to Structure ' )
] , ' Condition ' , select = True , readonly = False ) ,
}
line_condition ( )
class hr_payslip_line ( osv . osv ) :
'''
Payslip Line
'''
_name = ' hr.payslip.line '
_description = ' Payslip Line '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
def onchange_category ( self , cr , uid , ids , category_id ) :
seq = 0
2010-06-18 00:51:41 +00:00
res = {
}
2010-06-06 16:29:11 +00:00
if category_id :
2010-06-18 00:51:41 +00:00
category = self . pool . get ( ' hr.allounce.deduction.categoty ' ) . browse ( cr , uid , category_id )
res . update ( {
' sequence ' : category . sequence ,
' name ' : category . name ,
' code ' : category . code ,
' type ' : category . type
} )
return { ' value ' : res }
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
def onchange_amount ( self , cr , uid , ids , amount , typ ) :
amt = amount
if typ and typ == ' per ' :
if int ( amt ) > 0 :
amt = amt / 100
return { ' value ' : { ' amount ' : amt } }
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' slip_id ' : fields . many2one ( ' hr.payslip ' , ' Pay Slip ' , required = False ) ,
' condition_id ' : fields . many2one ( ' hr.payslip.line.condition ' , ' Condition ' , required = False ) ,
2010-06-06 18:26:08 +00:00
' function_id ' : fields . many2one ( ' hr.payroll.structure ' , ' Function ' , required = False ) ,
2010-06-06 16:29:11 +00:00
' employee_id ' : fields . many2one ( ' hr.employee ' , ' Employee ' , required = False ) ,
' name ' : fields . char ( ' Name ' , size = 256 , required = True , readonly = False ) ,
' base ' : fields . char ( ' Formula ' , size = 1024 , required = False , readonly = False ) ,
' code ' : fields . char ( ' Code ' , size = 64 , required = False , readonly = False ) ,
' type ' : fields . selection ( [
2010-06-18 00:51:41 +00:00
( ' allowance ' , ' Allowance ' ) ,
2010-06-06 16:29:11 +00:00
( ' deduction ' , ' Deduction ' ) ,
( ' leaves ' , ' Leaves ' ) ,
( ' advance ' , ' Advance ' ) ,
( ' loan ' , ' Loan ' ) ,
( ' installment ' , ' Loan Installment ' ) ,
( ' otherpay ' , ' Other Payment ' ) ,
( ' otherdeduct ' , ' Other Deduction ' ) ,
] , ' Type ' , select = True , required = True ) ,
' category_id ' : fields . many2one ( ' hr.allounce.deduction.categoty ' , ' Category ' , required = True ) ,
' amount_type ' : fields . selection ( [
( ' per ' , ' Percentage ( % ) ' ) ,
( ' fix ' , ' Fixed Amount ' ) ,
( ' func ' , ' Function Value ' ) ,
] , ' Amount Type ' , select = True ) ,
' amount ' : fields . float ( ' Amount / Percentage ' , digits = ( 16 , 4 ) ) ,
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , required = False ) ,
' account_id ' : fields . many2one ( ' account.account ' , ' General Account ' , required = True ) ,
2010-07-07 06:21:07 +00:00
' total ' : fields . float ( ' Sub Total ' , readonly = True , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
#'total': fields.function(_calculate, method=True, type='float', string='Label', store=True),
2010-07-07 06:21:07 +00:00
' company_contrib ' : fields . float ( ' Company Contribution ' , readonly = True , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' expanse_id ' : fields . many2one ( ' hr.expense.expense ' , ' Expense ' ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
' note ' : fields . text ( ' Description ' ) ,
' line_ids ' : fields . one2many ( ' hr.payslip.line.line ' , ' slipline_id ' , ' Calculations ' , required = False )
}
_order = ' sequence '
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
def execute_function ( self , cr , uid , id , value , context = None ) :
if context is None :
context = { }
2010-06-06 16:29:11 +00:00
line_pool = self . pool . get ( ' hr.payslip.line.line ' )
res = 0
2010-07-27 07:11:45 +00:00
ids = line_pool . search ( cr , uid , [ ( ' slipline_id ' , ' = ' , id ) , ( ' from_val ' , ' <= ' , value ) , ( ' to_val ' , ' >= ' , value ) ] , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if not ids :
2010-07-27 07:11:45 +00:00
ids = line_pool . search ( cr , uid , [ ( ' slipline_id ' , ' = ' , id ) , ( ' from_val ' , ' <= ' , value ) ] , context = context )
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
if not ids :
2010-06-18 00:51:41 +00:00
return res
2010-07-01 07:31:46 +00:00
2010-07-27 07:11:45 +00:00
res = line_pool . browse ( cr , uid , ids , context = context ) [ - 1 ] . value
2010-06-06 16:29:11 +00:00
return res
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
hr_payslip_line ( )
class hr_payslip_line_line ( osv . osv ) :
'''
Function Line
'''
_name = ' hr.payslip.line.line '
_description = ' Function Line '
_order = ' sequence '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
' slipline_id ' : fields . many2one ( ' hr.payslip.line ' , ' Slip Line ' , required = False ) ,
' name ' : fields . char ( ' Name ' , size = 64 , required = False , readonly = False ) ,
' umo_id ' : fields . many2one ( ' product.uom ' , ' Unite ' , required = False ) ,
2010-07-07 06:21:07 +00:00
' from_val ' : fields . float ( ' From ' , digits = ( 16 , 4 ) ) ,
' to_val ' : fields . float ( ' To ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
' amount_type ' : fields . selection ( [
( ' fix ' , ' Fixed Amount ' ) ,
] , ' Amount Type ' , select = True ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
2010-07-07 06:21:07 +00:00
' value ' : fields . float ( ' Value ' , digits = ( 16 , 4 ) ) ,
2010-06-06 16:29:11 +00:00
}
hr_payslip_line_line ( )
class hr_employee ( osv . osv ) :
'''
Employee
'''
_inherit = ' hr.employee '
_description = ' Employee '
2010-07-01 07:31:46 +00:00
2010-06-06 16:29:11 +00:00
_columns = {
2010-09-11 13:29:00 +00:00
# 'pan_no':fields.char('PAN No', size=64, required=False, readonly=False),
2010-08-19 09:38:02 +00:00
' esp_account ' : fields . char ( ' EPS Account ' , size = 64 , required = False , readonly = False , help = " EPS Account " ) ,
' pf_account ' : fields . char ( ' PF Account ' , size = 64 , required = False , readonly = False , help = " Providend Fund Account " ) ,
2010-06-06 16:29:11 +00:00
' pg_joining ' : fields . date ( ' PF Join Date ' ) ,
2010-08-19 09:38:02 +00:00
' esi_account ' : fields . char ( ' ESI Account ' , size = 64 , required = False , readonly = False , help = " ESI Account " ) ,
2010-06-06 16:29:11 +00:00
' hospital_id ' : fields . many2one ( ' res.partner.address ' , ' ESI Hospital ' , required = False ) ,
2010-09-11 09:32:15 +00:00
' passport_id ' : fields . char ( ' Passport ' , size = 64 ) ,
2010-06-06 19:09:53 +00:00
' otherid ' : fields . char ( ' Other Id ' , size = 64 , required = False ) ,
2010-07-02 10:37:15 +00:00
' bank_account_id ' : fields . many2one ( ' res.partner.bank ' , ' Bank Account ' , required = False , readonly = False ) ,
2010-06-06 16:29:11 +00:00
' line_ids ' : fields . one2many ( ' hr.payslip.line ' , ' employee_id ' , ' Salary Structure ' , required = False ) ,
' slip_ids ' : fields . one2many ( ' hr.payslip ' , ' employee_id ' , ' Payslips ' , required = False , readonly = True ) ,
' property_bank_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Bank Account " ,
method = True ,
view_load = True ,
help = " Select Bank Account from where Salary Expanse will be Paid " ,
required = True ) ,
' salary_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Salary Account " ,
method = True ,
view_load = True ,
help = " Expanse account when Salary Expanse will be recorded " ,
required = True ) ,
' employee_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Employee Account " ,
method = True ,
view_load = True ,
help = " Employee Payable Account " ,
required = True ) ,
' analytic_account ' : fields . property (
' account.analytic.account ' ,
type = ' many2one ' ,
relation = ' account.analytic.account ' ,
string = " Analytic Account " ,
method = True ,
view_load = True ,
help = " Analytic Account for Salary Analysis " ,
required = False ) ,
}
hr_employee ( )
2010-07-02 10:37:15 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: