2010-06-18 20:30:58 +00:00
#-*- coding:utf-8 -*-
##############################################################################
#
2010-07-27 07:11:45 +00:00
# OpenERP, Open Source Management Solution
2010-06-18 20:30:58 +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
2010-10-28 06:54:18 +00:00
# it under the terms of the GNU Affero General Public License as published by
2010-06-18 20:30:58 +00:00
# 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
2010-10-28 06:54:18 +00:00
# GNU Affero General Public License for more details.
2010-06-18 20:30:58 +00:00
#
2010-10-28 06:54:18 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-06-18 20:30:58 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import time
import netsvc
2010-07-27 07:11:45 +00:00
from datetime import date , datetime , timedelta
from osv import fields , osv
2010-06-18 20:30:58 +00:00
from tools import config
from tools . translate import _
2011-04-20 08:50:11 +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-18 20:30:58 +00:00
2010-10-14 12:06:38 +00:00
class hr_payroll_structure ( osv . osv ) :
_inherit = ' hr.payroll.structure '
_description = ' Salary Structure '
2010-10-27 12:49:59 +00:00
2010-10-14 12:06:38 +00:00
_columns = {
' account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' ) ,
}
hr_payroll_structure ( )
class hr_employee ( osv . osv ) :
'''
Employee
'''
_inherit = ' hr.employee '
_description = ' Employee '
_columns = {
' property_bank_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Bank Account " ,
method = True ,
domain = " [( ' type ' , ' = ' , ' liquidity ' )] " ,
view_load = True ,
2011-03-02 10:44:41 +00:00
help = " Select Bank Account from where Salary Expense will be Paid, to be used for payslip verification. " ) ,
2010-10-14 12:06:38 +00:00
' salary_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Salary Account " ,
method = True ,
domain = " [( ' type ' , ' = ' , ' other ' )] " ,
view_load = True ,
2010-12-27 08:38:50 +00:00
help = " Expense account when Salary Expense will be recorded " ) ,
2010-10-14 12:06:38 +00:00
' employee_account ' : fields . property (
' account.account ' ,
type = ' many2one ' ,
relation = ' account.account ' ,
string = " Employee Account " ,
method = True ,
domain = " [( ' type ' , ' = ' , ' other ' )] " ,
view_load = True ,
help = " Employee Payable Account " ) ,
' 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 " ) ,
}
hr_employee ( )
2011-04-13 13:16:28 +00:00
#class payroll_register(osv.osv):
# _inherit = 'hr.payroll.register'
# _description = 'Payroll Register'
#
# _columns = {
# 'journal_id': fields.many2one('account.journal', 'Expense Journal'),
# 'bank_journal_id': fields.many2one('account.journal', 'Bank Journal'),
# 'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], help="Keep empty to use the period of the validation(Payslip) date."),
# }
#
# def compute_sheet(self, cr, uid, ids, context=None):
# emp_pool = self.pool.get('hr.employee')
# slip_pool = self.pool.get('hr.payslip')
# func_pool = self.pool.get('hr.payroll.structure')
# slip_line_pool = self.pool.get('hr.payslip.line')
# wf_service = netsvc.LocalService("workflow")
# vals = self.browse(cr, uid, ids, context=context)[0]
# emp_ids = emp_pool.search(cr, uid, [])
#
# 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)])
# if old_slips:
# slip_pool.write(cr, uid, old_slips, {'register_id':ids[0]})
# for sid in old_slips:
# wf_service.trg_validate(uid, 'hr.payslip', sid, 'compute_sheet', cr)
# 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
# }
# slip_id = slip_pool.create(cr, uid, res)
# wf_service.trg_validate(uid, 'hr.payslip', slip_id, 'compute_sheet', cr)
#
# number = self.pool.get('ir.sequence').get(cr, uid, 'salary.register')
# self.write(cr, uid, ids, {'state':'draft', 'number':number})
# return True
#
#payroll_register()
2010-10-27 12:49:59 +00:00
2011-04-13 13:16:28 +00:00
#class payroll_advice(osv.osv):
# _inherit = 'hr.payroll.advice'
# _description = 'Bank Advice Note'
#
# _columns = {
# 'account_id': fields.many2one('account.account', 'Account'),
# }
#payroll_advice()
2010-10-14 12:06:38 +00:00
class contrib_register ( osv . osv ) :
2011-04-13 13:16:28 +00:00
_inherit = ' hr.contribution.register '
2010-10-14 12:06:38 +00:00
_description = ' Contribution Register '
2010-11-19 13:48:01 +00:00
def _total_contrib ( self , cr , uid , ids , field_names , arg , context = None ) :
2011-04-13 13:16:28 +00:00
# line_pool = self.pool.get('hr.contibution.register.line')
2010-10-14 12:06:38 +00:00
period_id = self . pool . get ( ' account.period ' ) . search ( cr , uid , [ ( ' date_start ' , ' <= ' , time . strftime ( ' % Y- % m- %d ' ) ) , ( ' date_stop ' , ' >= ' , time . strftime ( ' % Y- % m- %d ' ) ) ] ) [ 0 ]
2010-11-19 13:48:01 +00:00
fiscalyear_id = self . pool . get ( ' account.period ' ) . browse ( cr , uid , period_id , context = context ) . fiscalyear_id
2010-10-14 12:06:38 +00:00
res = { }
2011-04-13 13:16:28 +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)])
# years = line_pool.search(cr, uid, [('period_id.fiscalyear_id','=',fiscalyear_id.id), ('register_id','=',cur.id)])
#
# e_month = 0.0
# c_month = 0.0
# for i in line_pool.browse(cr, uid, current, context=context):
# e_month += i.emp_deduction
# c_month += i.comp_deduction
#
# e_year = 0.0
# c_year = 0.0
# for j in line_pool.browse(cr, uid, years, context=context):
# e_year += i.emp_deduction
# c_year += i.comp_deduction
#
# 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-10-14 12:06:38 +00:00
return res
2010-10-27 12:49:59 +00:00
2010-10-14 12:06:38 +00:00
_columns = {
' account_id ' : fields . many2one ( ' account.account ' , ' Account ' ) ,
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' ) ,
' 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 ) ) ,
}
contrib_register ( )
2011-04-13 13:16:28 +00:00
#class contrib_register_line(osv.osv):
# _inherit = 'hr.contibution.register.line'
# _description = 'Contribution Register Line'
#
# _columns = {
# 'period_id': fields.many2one('account.period', 'Period'),
# }
#contrib_register_line()
#class hr_holidays_status(osv.osv):
# _inherit = 'hr.holidays.status'
# _columns = {
# 'account_id': fields.many2one('account.account', 'Account'),
# 'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account'),
# }
#hr_holidays_status()
2010-10-14 12:06:38 +00:00
2010-06-18 20:30:58 +00:00
class hr_payslip ( osv . osv ) :
'''
Pay Slip
'''
_inherit = ' hr.payslip '
_description = ' Pay Slip '
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
_columns = {
2010-12-27 08:38:50 +00:00
' journal_id ' : fields . many2one ( ' account.journal ' , ' Expense Journal ' ) ,
2010-10-14 12:06:38 +00:00
' bank_journal_id ' : fields . many2one ( ' account.journal ' , ' Bank Journal ' ) ,
' move_ids ' : fields . one2many ( ' hr.payslip.account.move ' , ' slip_id ' , ' Accounting vouchers ' ) ,
2010-06-18 20:30:58 +00:00
' move_line_ids ' : fields . many2many ( ' account.move.line ' , ' payslip_lines_rel ' , ' slip_id ' , ' line_id ' , ' Accounting Lines ' , readonly = True ) ,
' move_payment_ids ' : fields . many2many ( ' account.move.line ' , ' payslip_payment_rel ' , ' slip_id ' , ' payment_id ' , ' Payment Lines ' , readonly = True ) ,
' period_id ' : fields . many2one ( ' account.period ' , ' Force Period ' , domain = [ ( ' state ' , ' <> ' , ' done ' ) ] , help = " Keep empty to use the period of the validation(Payslip) date. " ) ,
2011-04-20 10:38:11 +00:00
' account_move_ids ' : fields . many2many ( ' account.move ' , ' payslip_move_rel ' , ' slip_id ' , ' move_id ' , ' Accounting Entries ' , readonly = True ) ,
2010-06-18 20:30:58 +00:00
}
2011-04-14 13:33:15 +00:00
def get_payslip_lines ( self , cr , uid , contract_ids , payslip_id , context ) :
2011-04-19 07:02:04 +00:00
journal_obj = self . pool . get ( ' account.journal ' )
rule_obj = self . pool . get ( ' hr.salary.rule ' )
contract_obj = self . pool . get ( ' hr.contract ' )
structure_obj = self . pool . get ( ' hr.payroll.structure ' )
vals_account = { }
2011-04-14 13:33:15 +00:00
result = super ( hr_payslip , self ) . get_payslip_lines ( cr , uid , contract_ids , payslip_id , context )
2011-04-19 07:02:04 +00:00
structure_ids = contract_obj . get_all_structures ( cr , uid , contract_ids , context = context )
2011-04-14 13:33:15 +00:00
#get the rules of the structure and thier children
2011-04-19 07:02:04 +00:00
rule_ids = structure_obj . get_all_rules ( cr , uid , structure_ids , context = context )
2011-04-14 13:33:15 +00:00
sorted_rule_ids = [ id for id , sequence in sorted ( rule_ids , key = lambda x : x [ 1 ] ) ]
2011-04-19 07:02:04 +00:00
journal_id = [ record . journal_id . id for record in self . browse ( cr , uid , [ payslip_id ] , context = context ) ]
for jou in journal_obj . browse ( cr , uid , journal_id , context = context ) :
credit_account = jou . default_credit_account_id . id
debit_account = jou . default_debit_account_id . id
for rule in rule_obj . browse ( cr , uid , sorted_rule_ids , context = context ) :
if not rule . account_debit . id :
2011-04-19 12:44:01 +00:00
rule_obj . write ( cr , uid , [ rule . id ] , { ' account_debit ' : debit_account } )
2011-04-19 07:02:04 +00:00
if not rule . account_credit . id :
2011-04-19 12:44:01 +00:00
rule_obj . write ( cr , uid , [ rule . id ] , { ' account_credit ' : credit_account } )
2011-04-14 13:33:15 +00:00
for value in result :
if value [ ' salary_rule_id ' ] == rule . id :
2011-04-19 12:44:01 +00:00
if rule . category_id . name == ' Deduction ' :
if not rule . account_debit . id :
value [ ' account_id ' ] = debit_account
else :
value [ ' account_id ' ] = rule . account_debit . id
elif rule . category_id . name == ' Allowance ' :
if not rule . account_credit . id :
value [ ' account_id ' ] = credit_account
else :
value [ ' account_id ' ] = rule . account_credit . id
2011-04-19 07:02:04 +00:00
else :
2011-04-19 12:44:01 +00:00
emp_account_id = [ record . employee_id . employee_account . id for record in self . browse ( cr , uid , [ payslip_id ] , context = context ) ]
value [ ' account_id ' ] = emp_account_id [ 0 ]
2011-04-20 08:55:19 +00:00
if rule . analytic_account_id :
value [ ' analytic_account_id ' ] = rule . analytic_account_id . id
2011-04-14 13:33:15 +00:00
return result
2011-04-18 12:27:08 +00:00
2010-06-18 20:30:58 +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-27 07:11:45 +00:00
def cancel_sheet ( self , cr , uid , ids , context = None ) :
2010-06-18 20:30:58 +00:00
move_pool = self . pool . get ( ' account.move ' )
2010-07-02 10:37:15 +00:00
slip_move = self . pool . get ( ' hr.payslip.account.move ' )
move_ids = [ ]
2010-07-27 07:11:45 +00:00
for slip in self . browse ( cr , uid , ids , context = context ) :
2010-07-02 10:37:15 +00:00
for line in slip . move_ids :
move_ids . append ( line . id )
if line . move_id :
if line . move_id . state == ' posted ' :
move_pool . button_cancel ( cr , uid [ line . move_id . id ] , context )
2010-07-27 07:11:45 +00:00
move_pool . unlink ( cr , uid , [ line . move_id . id ] , context = context )
slip_move . unlink ( cr , uid , move_ids , context = context )
self . write ( cr , uid , ids , { ' state ' : ' cancel ' } , context = context )
2010-06-18 20:30:58 +00:00
return True
2010-07-27 07:11:45 +00:00
def process_sheet ( self , cr , uid , ids , context = None ) :
2010-06-18 20:30:58 +00:00
move_pool = self . pool . get ( ' account.move ' )
movel_pool = self . pool . get ( ' account.move.line ' )
invoice_pool = self . pool . get ( ' account.invoice ' )
2010-07-27 07:11:45 +00:00
fiscalyear_pool = self . pool . get ( ' account.fiscalyear ' )
period_pool = self . pool . get ( ' account.period ' )
for slip in self . browse ( cr , uid , ids , context = context ) :
2010-12-29 11:16:31 +00:00
if not slip . bank_journal_id or not slip . journal_id :
# Call super method to process sheet if journal_id or bank_journal_id are not specified.
super ( hr_payslip , self ) . process_sheet ( cr , uid , [ slip . id ] , context = context )
continue
2010-06-18 20:30:58 +00:00
line_ids = [ ]
partner = False
partner_id = False
exp_ids = [ ]
2010-07-27 07:11:45 +00:00
2010-06-19 15:04:13 +00:00
partner = slip . employee_id . bank_account_id . partner_id
2010-06-18 20:30:58 +00:00
partner_id = partner . id
2011-04-18 12:27:08 +00:00
for line in slip . line_ids :
if line . category_id . name == ' Net ' :
amt = line . total
2010-07-27 07:11:45 +00:00
fiscal_year_ids = fiscalyear_pool . search ( cr , uid , [ ] , context = context )
2010-06-18 20:30:58 +00:00
if not fiscal_year_ids :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Please define fiscal year for perticular contract ' ) )
2010-07-27 07:11:45 +00:00
fiscal_year_objs = fiscalyear_pool . read ( cr , uid , fiscal_year_ids , [ ' date_start ' , ' date_stop ' ] , context = context )
2010-06-18 20:30:58 +00:00
year_exist = False
for fiscal_year in fiscal_year_objs :
2011-04-18 12:27:08 +00:00
if ( ( fiscal_year [ ' date_start ' ] < = slip . date_from ) and ( fiscal_year [ ' date_stop ' ] > = slip . date_to ) ) :
2010-06-18 20:30:58 +00:00
year_exist = True
if not year_exist :
2010-11-18 16:21:31 +00:00
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Fiscal Year is not defined for slip date %s ' ) % slip . date )
2011-04-18 12:27:08 +00:00
search_periods = period_pool . search ( cr , uid , [ ( ' date_start ' , ' <= ' , slip . date_from ) , ( ' date_stop ' , ' >= ' , slip . date_to ) ] , context = context )
2010-07-27 07:11:45 +00:00
if not search_periods :
2010-11-18 16:21:31 +00:00
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Period is not defined for slip date %s ' ) % slip . date )
2010-07-27 07:11:45 +00:00
period_id = search_periods [ 0 ]
2010-06-18 20:30:58 +00:00
name = ' Payment of Salary to %s ' % ( slip . employee_id . name )
move = {
' journal_id ' : slip . bank_journal_id . id ,
2010-07-27 07:11:45 +00:00
' period_id ' : period_id ,
2011-04-18 12:27:08 +00:00
' date ' : slip . date_from ,
2010-06-18 20:30:58 +00:00
' type ' : ' bank_pay_voucher ' ,
' ref ' : slip . number ,
' narration ' : name
}
2010-07-27 07:11:45 +00:00
move_id = move_pool . create ( cr , uid , move , context = context )
2010-06-18 20:30:58 +00:00
self . create_voucher ( cr , uid , [ slip . id ] , name , move_id )
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
name = " To %s account " % ( slip . employee_id . name )
2011-02-28 09:01:20 +00:00
if not slip . employee_id . property_bank_account . id :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Employee Bank Account is not defined for %s ' ) % slip . employee_id . name )
2010-06-18 20:30:58 +00:00
ded_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
2011-04-18 12:27:08 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : slip . employee_id . property_bank_account . id ,
2010-06-18 20:30:58 +00:00
' debit ' : 0.0 ,
2011-04-18 12:27:08 +00:00
' credit ' : amt ,
2010-10-27 12:49:59 +00:00
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , ded_rec , context = context ) ]
2010-06-18 20:30:58 +00:00
name = " By %s account " % ( slip . employee_id . property_bank_account . name )
cre_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
' partner_id ' : partner_id ,
2011-04-18 12:27:08 +00:00
' date ' : slip . date_from ,
2010-06-18 20:30:58 +00:00
' account_id ' : partner . property_account_payable . id ,
2011-04-18 12:27:08 +00:00
' debit ' : amt ,
2010-10-27 12:49:59 +00:00
' credit ' : 0.0 ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , cre_rec , context = context ) ]
2011-04-18 12:27:08 +00:00
# other_pay = slip.other_pay
2010-06-18 20:30:58 +00:00
#Process all Reambuse Entries
2011-04-18 12:27:08 +00:00
# for line in slip.line_ids:
# if line.type == 'otherpay' and line.expanse_id.invoice_id:
# if not line.expanse_id.invoice_id.move_id:
# raise osv.except_osv(_('Warning !'), _('Please Confirm all Expense Invoice appear for Reimbursement'))
# invids = [line.expanse_id.invoice_id.id]
# amount = line.total
# acc_id = slip.bank_journal_id.default_credit_account_id and slip.bank_journal_id.default_credit_account_id.id
# period_id = slip.period_id.id
# journal_id = slip.bank_journal_id.id
# name = '[%s]-%s' % (slip.number, line.name)
# invoice_pool.pay_and_reconcile(cr, uid, invids, amount, acc_id, period_id, journal_id, False, period_id, False, context, name)
# other_pay -= amount
# #TODO: link this account entries to the Payment Lines also Expense Entries to Account Lines
# l_ids = movel_pool.search(cr, uid, [('name','=',name)], context=context)
# line_ids += l_ids
#
# l_ids = movel_pool.search(cr, uid, [('invoice','=',line.expanse_id.invoice_id.id)], context=context)
# exp_ids += l_ids
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
#Process for Other payment if any
2011-04-18 12:27:08 +00:00
# other_move_id = False
# if slip.other_pay > 0:
# narration = 'Payment of Other Payeble amounts to %s' % (slip.employee_id.name)
# move = {
# 'journal_id': slip.bank_journal_id.id,
# 'period_id': period_id,
# 'date': slip.date_from,
# 'type':'bank_pay_voucher',
# 'ref':slip.number,
# 'narration': narration
# }
# other_move_id = move_pool.create(cr, uid, move, context=context)
# self.create_voucher(cr, uid, [slip.id], narration, move_id)
#
# name = "To %s account" % (slip.employee_id.name)
# ded_rec = {
# 'move_id':other_move_id,
# 'name':name,
# 'date':slip.date_from,
# 'account_id':slip.employee_id.property_bank_account.id,
# 'debit': 0.0,
# 'credit': other_pay,
# 'journal_id':slip.journal_id.id,
# 'period_id':period_id,
# 'ref':slip.number
# }
# line_ids += [movel_pool.create(cr, uid, ded_rec, context=context)]
# name = "By %s account" % (slip.employee_id.property_bank_account.name)
# cre_rec = {
# 'move_id':other_move_id,
# 'name':name,
# 'partner_id':partner_id,
# 'date':slip.date_from,
# 'account_id':partner.property_account_payable.id,
# 'debit': other_pay,
# 'credit':0.0,
# 'journal_id':slip.journal_id.id,
# 'period_id':period_id,
# 'ref':slip.number
# }
# line_ids += [movel_pool.create(cr, uid, cre_rec, context=context)]
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
rec = {
' state ' : ' done ' ,
' move_payment_ids ' : [ ( 6 , 0 , line_ids ) ] ,
2011-04-20 10:38:11 +00:00
' paid ' : True ,
' account_move_ids ' : [ ( 4 , move_id ) ] ,
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , [ slip . id ] , rec , context = context )
2010-06-18 20:30:58 +00:00
for exp_id in exp_ids :
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , [ slip . id ] , { ' move_line_ids ' : [ ( 4 , exp_id ) ] } , context = context )
2010-06-18 20:30:58 +00:00
return True
2010-07-27 07:11:45 +00:00
def account_check_sheet ( self , cr , uid , ids , context = None ) :
self . write ( cr , uid , ids , { ' state ' : ' accont_check ' } , context = context )
2010-06-18 20:30:58 +00:00
return True
2010-07-27 07:11:45 +00:00
def hr_check_sheet ( self , cr , uid , ids , context = None ) :
self . write ( cr , uid , ids , { ' state ' : ' hr_check ' } , context = context )
2010-06-18 20:30:58 +00:00
return True
2010-07-27 07:11:45 +00:00
def verify_sheet ( self , cr , uid , ids , context = None ) :
2010-06-18 20:30:58 +00:00
move_pool = self . pool . get ( ' account.move ' )
movel_pool = self . pool . get ( ' account.move.line ' )
exp_pool = self . pool . get ( ' hr.expense.expense ' )
2010-07-27 07:11:45 +00:00
fiscalyear_pool = self . pool . get ( ' account.fiscalyear ' )
period_pool = self . pool . get ( ' account.period ' )
property_pool = self . pool . get ( ' ir.property ' )
payslip_pool = self . pool . get ( ' hr.payslip.line ' )
for slip in self . browse ( cr , uid , ids , context = context ) :
2011-04-14 13:33:15 +00:00
for line in slip . line_ids :
if line . category_id . name == ' Basic ' :
basic_amt = line . total
2010-12-29 11:16:31 +00:00
if not slip . journal_id :
# Call super method to verify sheet if journal_id is not specified.
super ( hr_payslip , self ) . verify_sheet ( cr , uid , [ slip . id ] , context = context )
continue
2010-06-18 20:30:58 +00:00
total_deduct = 0.0
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
line_ids = [ ]
2011-04-20 10:38:11 +00:00
move_ids = [ ]
2010-06-18 20:30:58 +00:00
partner = False
partner_id = False
2010-07-27 07:11:45 +00:00
2010-06-19 15:04:13 +00:00
if not slip . employee_id . bank_account_id :
2011-02-28 09:01:20 +00:00
raise osv . except_osv ( _ ( ' Integrity Error ! ' ) , _ ( ' Please define bank account for %s ! ' ) % ( slip . employee_id . name ) )
2010-07-27 07:11:45 +00:00
2010-06-19 15:04:13 +00:00
if not slip . employee_id . bank_account_id . partner_id :
2011-02-28 09:01:20 +00:00
raise osv . except_osv ( _ ( ' Integrity Error ! ' ) , _ ( ' Please define partner in bank account for %s ! ' ) % ( slip . employee_id . name ) )
2010-07-27 07:11:45 +00:00
2010-06-19 15:04:13 +00:00
partner = slip . employee_id . bank_account_id . partner_id
partner_id = slip . employee_id . bank_account_id . partner_id . id
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
period_id = False
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
if slip . period_id :
period_id = slip . period_id . id
else :
2010-07-27 07:11:45 +00:00
fiscal_year_ids = fiscalyear_pool . search ( cr , uid , [ ] , context = context )
2010-06-18 20:30:58 +00:00
if not fiscal_year_ids :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Please define fiscal year for perticular contract ' ) )
2010-07-27 07:11:45 +00:00
fiscal_year_objs = fiscalyear_pool . read ( cr , uid , fiscal_year_ids , [ ' date_start ' , ' date_stop ' ] , context = context )
2010-06-18 20:30:58 +00:00
year_exist = False
for fiscal_year in fiscal_year_objs :
2011-04-13 13:16:28 +00:00
if ( ( fiscal_year [ ' date_start ' ] < = slip . date_from ) and ( fiscal_year [ ' date_stop ' ] > = slip . date_to ) ) :
2010-06-18 20:30:58 +00:00
year_exist = True
if not year_exist :
2010-11-18 16:21:31 +00:00
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Fiscal Year is not defined for slip date %s ' ) % slip . date )
2011-04-13 13:16:28 +00:00
search_periods = period_pool . search ( cr , uid , [ ( ' date_start ' , ' = ' , slip . date_from ) , ( ' date_stop ' , ' = ' , slip . date_to ) ] , context = context )
2010-07-27 07:11:45 +00:00
if not search_periods :
2010-11-18 16:21:31 +00:00
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Period is not defined for slip date %s ' ) % slip . date )
2010-07-27 07:11:45 +00:00
period_id = search_periods [ 0 ]
2010-06-18 20:30:58 +00:00
move = {
' journal_id ' : slip . journal_id . id ,
2010-07-27 07:11:45 +00:00
' period_id ' : period_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-06-18 20:30:58 +00:00
' ref ' : slip . number ,
' narration ' : slip . name
}
2010-07-27 07:11:45 +00:00
move_id = move_pool . create ( cr , uid , move , context = context )
2011-04-20 10:38:11 +00:00
move_ids + = [ move_id ]
2010-06-18 20:30:58 +00:00
self . create_voucher ( cr , uid , [ slip . id ] , slip . name , move_id )
2010-07-27 07:11:45 +00:00
2011-02-28 09:01:20 +00:00
if not slip . employee_id . salary_account . id :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Please define Salary Account for %s . ' ) % slip . employee_id . name )
2010-06-18 20:30:58 +00:00
line = {
' move_id ' : move_id ,
' name ' : " By Basic Salary / " + slip . employee_id . name ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : slip . employee_id . salary_account . id ,
2011-04-14 13:33:15 +00:00
' debit ' : basic_amt ,
2010-06-18 20:30:58 +00:00
' credit ' : 0.0 ,
2011-04-14 13:33:15 +00:00
# 'quantity':slip.working_days,
2010-06-18 20:30:58 +00:00
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' analytic_account_id ' : False ,
' ref ' : slip . number
}
#Setting Analysis Account for Basic Salary
if slip . employee_id . analytic_account :
line [ ' analytic_account_id ' ] = slip . employee_id . analytic_account . id
2010-07-27 07:11:45 +00:00
move_line_id = movel_pool . create ( cr , uid , line , context = context )
2010-06-18 20:30:58 +00:00
line_ids + = [ move_line_id ]
2010-07-27 07:11:45 +00:00
2011-02-28 09:01:20 +00:00
if not slip . employee_id . employee_account . id :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( ' Please define Employee Payable Account for %s . ' ) % slip . employee_id . name )
2010-06-18 20:30:58 +00:00
line = {
' move_id ' : move_id ,
2011-03-02 10:44:41 +00:00
' name ' : " To Basic Payble Salary / " + slip . employee_id . name ,
2010-06-18 20:30:58 +00:00
' partner_id ' : partner_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : slip . employee_id . employee_account . id ,
2010-06-18 20:30:58 +00:00
' debit ' : 0.0 ,
2011-04-14 13:33:15 +00:00
# 'quantity':slip.working_days,
' credit ' : basic_amt ,
2010-06-18 20:30:58 +00:00
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , line , context = context ) ]
2010-06-18 20:30:58 +00:00
for line in slip . line_ids :
2011-04-18 12:27:08 +00:00
if line . name == ' Net ' or line . name == ' Gross ' or line . name == ' Basic ' :
continue
2010-06-18 20:30:58 +00:00
name = " [ %s ] - %s / %s " % ( line . code , line . name , slip . employee_id . name )
amount = line . total
2010-07-27 07:11:45 +00:00
2011-04-14 13:33:15 +00:00
# if line.type == 'leaves':
# continue
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : line . account_id . id ,
2010-06-18 20:30:58 +00:00
' debit ' : 0.0 ,
2010-10-27 12:49:59 +00:00
' credit ' : 0.0 ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' analytic_account_id ' : False ,
' ref ' : slip . number ,
' quantity ' : 1
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
#Setting Analysis Account for Salary Slip Lines
if line . analytic_account_id :
rec [ ' analytic_account_id ' ] = line . analytic_account_id . id
2011-04-14 13:33:15 +00:00
# else:
# rec['analytic_account_id'] = slip.deg_id.account_id.id
2010-07-27 07:11:45 +00:00
2011-04-14 13:33:15 +00:00
# if line.type == 'allowance' or line.type == 'otherpay':
if line . category_id . name == ' Allowance ' :
2010-06-18 20:30:58 +00:00
rec [ ' debit ' ] = amount
if not partner . property_account_payable :
raise osv . except_osv ( _ ( ' Integrity Error ! ' ) , _ ( ' Please Configure Partners Payable Account!! ' ) )
ded_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
' partner_id ' : partner_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : partner . property_account_payable . id ,
2010-06-18 20:30:58 +00:00
' debit ' : 0.0 ,
2010-10-27 12:49:59 +00:00
' quantity ' : 1 ,
' credit ' : amount ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , ded_rec , context = context ) ]
2011-04-14 13:33:15 +00:00
elif line . category_id . name == ' Deduction ' :
2010-06-18 20:30:58 +00:00
if not partner . property_account_receivable :
raise osv . except_osv ( _ ( ' Integrity Error ! ' ) , _ ( ' Please Configure Partners Receivable Account!! ' ) )
2011-04-18 12:27:08 +00:00
amount = - ( amount )
2010-06-18 20:30:58 +00:00
rec [ ' credit ' ] = amount
total_deduct + = amount
ded_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
' partner_id ' : partner_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-10-27 12:49:59 +00:00
' quantity ' : 1 ,
2010-07-27 07:11:45 +00:00
' account_id ' : partner . property_account_receivable . id ,
2010-06-18 20:30:58 +00:00
' debit ' : amount ,
2010-10-27 12:49:59 +00:00
' credit ' : 0.0 ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , ded_rec , context = context ) ]
line_ids + = [ movel_pool . create ( cr , uid , rec , context = context ) ]
2010-10-17 22:27:08 +00:00
# if self._debug:
# for contrib in line.category_id.contribute_ids:
# _log.debug("%s %s %s %s %s", contrib.name, contrub.code, contrub.amount_type, contrib.contribute_per, line.total)
2010-06-18 20:30:58 +00:00
adj_move_id = False
if total_deduct > 0 :
move = {
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-06-18 20:30:58 +00:00
' ref ' : slip . number ,
2010-10-27 12:49:59 +00:00
' narration ' : ' Adjustment: %s ' % ( slip . name )
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
adj_move_id = move_pool . create ( cr , uid , move , context = context )
2011-04-20 10:38:11 +00:00
move_ids + = [ adj_move_id ]
2010-06-18 20:30:58 +00:00
name = " Adjustment Entry - %s " % ( slip . employee_id . name )
self . create_voucher ( cr , uid , [ slip . id ] , name , adj_move_id )
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
ded_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : adj_move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
' partner_id ' : partner_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : partner . property_account_receivable . id ,
2010-06-18 20:30:58 +00:00
' debit ' : 0.0 ,
2010-10-27 12:49:59 +00:00
' quantity ' : 1 ,
' credit ' : total_deduct ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , ded_rec , context = context ) ]
2010-06-18 20:30:58 +00:00
cre_rec = {
2010-10-27 12:49:59 +00:00
' move_id ' : adj_move_id ,
2010-06-18 20:30:58 +00:00
' name ' : name ,
' partner_id ' : partner_id ,
2011-04-14 13:33:15 +00:00
' date ' : slip . date_from ,
2010-07-27 07:11:45 +00:00
' account_id ' : partner . property_account_payable . id ,
2010-06-18 20:30:58 +00:00
' debit ' : total_deduct ,
2010-10-27 12:49:59 +00:00
' quantity ' : 1 ,
' credit ' : 0.0 ,
' journal_id ' : slip . journal_id . id ,
' period_id ' : period_id ,
' ref ' : slip . number
2010-06-18 20:30:58 +00:00
}
2010-07-27 07:11:45 +00:00
line_ids + = [ movel_pool . create ( cr , uid , cre_rec , context = context ) ]
2010-06-18 20:30:58 +00:00
rec = {
' state ' : ' confirm ' ,
' move_line_ids ' : [ ( 6 , 0 , line_ids ) ] ,
2011-04-20 10:38:11 +00:00
' account_move_ids ' : [ ( 6 , 0 , move_ids ) ]
2010-06-18 20:30:58 +00:00
}
if not slip . period_id :
rec [ ' period_id ' ] = period_id
2010-07-27 07:11:45 +00:00
2011-04-14 13:33:15 +00:00
# dates = prev_bounds(slip.date)
exp_ids = exp_pool . search ( cr , uid , [ ( ' date_valid ' , ' >= ' , slip . date_from ) , ( ' date_valid ' , ' <= ' , slip . date_to ) , ( ' state ' , ' = ' , ' invoiced ' ) ] , context = context )
2011-04-19 12:46:37 +00:00
# if exp_ids:
# acc = property_pool.get(cr, uid, 'property_account_expense_categ', 'product.category')
# for exp in exp_pool.browse(cr, uid, exp_ids, context=context):
# exp_res = {
# 'name':exp.name,
# 'amount_type':'fix',
# 'type':'otherpay',
# 'category_id':exp.category_id.id,
# 'amount':exp.amount,
# 'slip_id':slip.id,
# 'expanse_id':exp.id,
# 'account_id':acc
# }
# payslip_pool.create(cr, uid, exp_res, context=context)
2010-07-27 07:11:45 +00:00
self . write ( cr , uid , [ slip . id ] , rec , context = context )
2010-06-18 20:30:58 +00:00
return True
2010-07-27 07:11:45 +00:00
2010-06-18 20:30:58 +00:00
hr_payslip ( )
2010-10-14 12:06:38 +00:00
class hr_payslip_line ( osv . osv ) :
_inherit = ' hr.payslip.line '
_columns = {
' account_id ' : fields . many2one ( ' account.account ' , ' General Account ' ) ,
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' ) ,
}
hr_payslip_line ( )
2011-04-13 13:16:28 +00:00
class hr_salary_rule ( osv . osv ) :
_inherit = ' hr.salary.rule '
_columns = {
# 'account_id': fields.many2one('account.account', 'General Account'),
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' ) ,
' account_tax_id ' : fields . many2one ( ' account.tax.code ' , ' Tax Code ' ) ,
' account_debit ' : fields . many2one ( ' account.account ' , ' Debit Account ' ) ,
' account_credit ' : fields . many2one ( ' account.account ' , ' Credit Account ' ) ,
}
hr_salary_rule ( )
2010-06-18 20:30:58 +00:00
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 ) ,
2010-10-11 05:45:00 +00:00
' move_id ' : fields . many2one ( ' account.move ' , ' Expense Entries ' , required = False , readonly = True ) ,
2010-06-18 20:30:58 +00:00
' slip_id ' : fields . many2one ( ' hr.payslip ' , ' Pay Slip ' , required = False ) ,
' sequence ' : fields . integer ( ' Sequence ' ) ,
}
account_move_link_slip ( )
2011-04-13 13:16:28 +00:00
class hr_contract ( osv . osv ) :
_inherit = ' hr.contract '
_description = ' Employee Contract '
_columns = {
' analytic_account_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' ) ,
' journal_id ' : fields . many2one ( ' account.journal ' , ' Journal ' ) ,
}
hr_contract ( )
2010-11-18 16:21:31 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: