summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMantavya Gajjar <mga@tinyerp.com>2010-06-19 02:00:58 +0530
committerMantavya Gajjar <mga@tinyerp.com>2010-06-19 02:00:58 +0530
commitbbbf3a272ca0d9250f88dfd71663bf2ec8191729 (patch)
treece633404ef5dca1aeae0edc68732d81e25b3aef3
parentf5f8c836c3a8c253bda1efa43d50db958de68de0 (diff)
[ADD]: a special module that will manage accounting entries for the hr_payroll
bzr revid: mga@tinyerp.com-20100618203058-hvvcssp0iqdpqmla
-rw-r--r--addons/hr_payroll_account/__init__.py23
-rw-r--r--addons/hr_payroll_account/__openerp__.py47
-rw-r--r--addons/hr_payroll_account/hr_payroll_account.py618
-rw-r--r--addons/hr_payroll_account/hr_payroll_account_view.xml61
-rw-r--r--addons/hr_payroll_account/hr_payroll_account_workflow.xml39
5 files changed, 788 insertions, 0 deletions
diff --git a/addons/hr_payroll_account/__init__.py b/addons/hr_payroll_account/__init__.py
new file mode 100644
index 00000000000..81979b0ae58
--- /dev/null
+++ b/addons/hr_payroll_account/__init__.py
@@ -0,0 +1,23 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# 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/>.
+#
+##############################################################################
+
+import hr_payroll_account
diff --git a/addons/hr_payroll_account/__openerp__.py b/addons/hr_payroll_account/__openerp__.py
new file mode 100644
index 00000000000..c3c75f6ec8d
--- /dev/null
+++ b/addons/hr_payroll_account/__openerp__.py
@@ -0,0 +1,47 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# 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/>.
+#
+##############################################################################
+{
+ 'name': 'Human Resource Payroll Accounting',
+ 'version': '1.0',
+ 'category': 'Generic Modules/Human Resources',
+ 'description': """Generic Payroll system Integrated with Accountings
+ * Expanse Encoding
+ * Payment Encoding
+ * Comany Contribution Managemet
+ """,
+ 'author':'Tiny/Axelor',
+ 'website':'http://www.openerp.com',
+ 'depends': [
+ 'hr_payroll',
+ 'account',
+ ],
+ 'init_xml': [
+ ],
+ 'update_xml': [
+ "hr_payroll_account_view.xml",
+ "hr_payroll_account_workflow.xml"
+ ],
+ 'demo_xml': [
+ ],
+ 'installable': True,
+ 'active': False,
+}
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
new file mode 100644
index 00000000000..6bbcf8e296e
--- /dev/null
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -0,0 +1,618 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# 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/>.
+#
+##############################################################################
+
+import time
+import netsvc
+from osv import osv
+from osv import fields
+from tools import config
+from tools.translate import _
+
+from datetime import date
+from datetime import datetime
+from datetime import timedelta
+
+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
+
+class hr_payslip(osv.osv):
+ '''
+ Pay Slip
+ '''
+ _inherit = 'hr.payslip'
+ _description = 'Pay Slip'
+
+ _columns = {
+ 'move_ids':fields.one2many('hr.payslip.account.move', 'slip_id', 'Accounting vouchers', required=False),
+ '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."),
+ }
+
+ 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)
+
+ def cancel_sheet(self, cr, uid, ids, context={}):
+ move_pool = self.pool.get('account.move')
+
+ for slip in self.browse(cr, uid, ids, context):
+ if slip.move_id:
+ if slip.move_id.state == 'posted':
+ move_pool.button_cancel(cr, uid [slip.move_id.id], context)
+ move_pool.unlink(cr, uid, [slip.move_id.id])
+
+ if slip.adj_move_id:
+ if slip.adj_move_id.state == 'posted':
+ move_pool.button_cancel(cr, uid [slip.adj_move_id.id], context)
+ move_pool.unlink(cr, uid, [slip.adj_move_id.id])
+
+ if slip.other_move_id:
+ if slip.other_move_id.state == 'posted':
+ move_pool.button_cancel(cr, uid [slip.other_move_id.id], context)
+ move_pool.unlink(cr, uid, [slip.other_move_id.id])
+
+ self.write(cr, uid, ids, {'state':'cancel'})
+ return True
+
+ def process_sheet(self, cr, uid, ids, context={}):
+ move_pool = self.pool.get('account.move')
+ movel_pool = self.pool.get('account.move.line')
+ invoice_pool = self.pool.get('account.invoice')
+
+ for slip in self.browse(cr,uid,ids):
+ line_ids = []
+ partner = False
+ partner_id = False
+ exp_ids = []
+
+ partner = slip.employee_id.address_home_id.partner_id
+ partner_id = partner.id
+
+ fiscal_year_ids = self.pool.get('account.fiscalyear').search(cr, uid, [])
+ if not fiscal_year_ids:
+ raise osv.except_osv(_('Warning !'), _('Please define fiscal year for perticular contract'))
+ fiscal_year_objs = self.pool.get('account.fiscalyear').read(cr, uid, fiscal_year_ids, ['date_start','date_stop'])
+ year_exist = False
+ for fiscal_year in fiscal_year_objs:
+ if ((fiscal_year['date_start'] <= slip.date) and (fiscal_year['date_stop'] >= slip.date)):
+ year_exist = True
+ if not year_exist:
+ raise osv.except_osv(_('Warning !'), _('Fiscal Year is not defined for slip date %s'%slip.date))
+ search_period = self.pool.get('account.period').search(cr,uid,[('date_start','<=',slip.date),('date_stop','>=',slip.date)])
+ if not search_period:
+ raise osv.except_osv(_('Warning !'), _('Period is not defined for slip date %s'%slip.date))
+ period_id = search_period[0]
+ name = 'Payment of Salary to %s' % (slip.employee_id.name)
+ move = {
+ 'journal_id': slip.bank_journal_id.id,
+ 'period_id': period_id,
+ 'date': slip.date,
+ 'type':'bank_pay_voucher',
+ 'ref':slip.number,
+ 'narration': name
+ }
+ move_id = move_pool.create(cr, uid, move)
+ self.create_voucher(cr, uid, [slip.id], name, move_id)
+
+ name = "To %s account" % (slip.employee_id.name)
+ ded_rec = {
+ 'move_id':move_id,
+ 'name': name,
+ #'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': slip.employee_id.property_bank_account.id,
+ 'debit': 0.0,
+ 'credit' : slip.total_pay,
+ 'journal_id' : slip.journal_id.id,
+ 'period_id' :period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_rec)]
+ name = "By %s account" % (slip.employee_id.property_bank_account.name)
+ cre_rec = {
+ 'move_id':move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': partner.property_account_payable.id,
+ 'debit': slip.total_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)]
+
+ other_pay = slip.other_pay
+ #Process all Reambuse Entries
+ 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 Expanse 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 Expanse Entries to Account Lines
+ l_ids = movel_pool.search(cr, uid, [('name','=',name)])
+ line_ids += l_ids
+
+ l_ids = movel_pool.search(cr, uid, [('invoice','=',line.expanse_id.invoice_id.id)])
+ exp_ids += l_ids
+
+ #Process for Other payment if any
+ 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,
+ 'type':'bank_pay_voucher',
+ 'ref':slip.number,
+ 'narration': narration
+ }
+ other_move_id = move_pool.create(cr, uid, move)
+ 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,
+ '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)]
+ 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,
+ '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)]
+
+ rec = {
+ 'state':'done',
+ 'move_payment_ids':[(6, 0, line_ids)],
+ 'paid':True
+ }
+ self.write(cr, uid, [slip.id], rec)
+ for exp_id in exp_ids:
+ self.write(cr, uid, [slip.id], {'move_line_ids':[(4, exp_id)]})
+
+ return True
+
+ def account_check_sheet(self, cr, uid, ids, context={}):
+ self.write(cr, uid, ids, {'state':'accont_check'})
+ return True
+
+ def hr_check_sheet(self, cr, uid, ids, context={}):
+ self.write(cr, uid, ids, {'state':'hr_check'})
+ return True
+
+ def verify_sheet(self, cr, uid, ids, context={}):
+
+ move_pool = self.pool.get('account.move')
+ movel_pool = self.pool.get('account.move.line')
+ exp_pool = self.pool.get('hr.expense.expense')
+
+ for slip in self.browse(cr,uid,ids):
+ total_deduct = 0.0
+
+ line_ids = []
+ partner = False
+ partner_id = False
+
+ if not slip.employee_id.address_home_id:
+ raise osv.except_osv(_('Integrity Error !'), _('Please defined the Employee Home Address Along with Partners !!'))
+
+ if not slip.employee_id.address_home_id.partner_id:
+ raise osv.except_osv(_('Integrity Error !'), _('Please defined the Partner in Home Address !!'))
+
+ partner = slip.employee_id.address_home_id.partner_id
+ partner_id = slip.employee_id.address_home_id.partner_id.id
+
+ period_id = False
+
+ if slip.period_id:
+ period_id = slip.period_id.id
+ else:
+ fiscal_year_ids = self.pool.get('account.fiscalyear').search(cr, uid, [])
+ if not fiscal_year_ids:
+ raise osv.except_osv(_('Warning !'), _('Please define fiscal year for perticular contract'))
+ fiscal_year_objs = self.pool.get('account.fiscalyear').read(cr, uid, fiscal_year_ids, ['date_start','date_stop'])
+ year_exist = False
+ for fiscal_year in fiscal_year_objs:
+ if ((fiscal_year['date_start'] <= slip.date) and (fiscal_year['date_stop'] >= slip.date)):
+ year_exist = True
+ if not year_exist:
+ raise osv.except_osv(_('Warning !'), _('Fiscal Year is not defined for slip date %s'%slip.date))
+ search_period = self.pool.get('account.period').search(cr,uid,[('date_start','<=',slip.date),('date_stop','>=',slip.date)])
+ if not search_period:
+ raise osv.except_osv(_('Warning !'), _('Period is not defined for slip date %s'%slip.date))
+ period_id = search_period[0]
+
+ move = {
+ #'name': slip.name,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'date': slip.date,
+ 'ref':slip.number,
+ 'narration': slip.name
+ }
+ move_id = move_pool.create(cr, uid, move)
+ self.create_voucher(cr, uid, [slip.id], slip.name, move_id)
+
+ line = {
+ 'move_id':move_id,
+ 'name': "By Basic Salary / " + slip.employee_id.name,
+ 'date': slip.date,
+ 'account_id': slip.employee_id.salary_account.id,
+ 'debit': slip.basic,
+ 'credit': 0.0,
+ 'quantity':slip.working_days,
+ '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
+
+ move_line_id = movel_pool.create(cr, uid, line)
+ line_ids += [move_line_id]
+
+ line = {
+ 'move_id':move_id,
+ 'name': "To Basic Paysble Salary / " + slip.employee_id.name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': slip.employee_id.employee_account.id,
+ 'debit': 0.0,
+ 'quantity':slip.working_days,
+ 'credit': slip.basic,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, line)]
+
+ for line in slip.line_ids:
+ name = "[%s] - %s / %s" % (line.code, line.name, slip.employee_id.name)
+ amount = line.total
+
+ if line.type == 'leaves':
+ continue
+
+ rec = {
+ 'move_id':move_id,
+ 'name': name,
+ 'date': slip.date,
+ 'account_id': line.account_id.id,
+ 'debit': 0.0,
+ 'credit' : 0.0,
+ 'journal_id' : slip.journal_id.id,
+ 'period_id' :period_id,
+ 'analytic_account_id':False,
+ 'ref':slip.number,
+ 'quantity':1
+ }
+
+ #Setting Analysis Account for Salary Slip Lines
+ if line.analytic_account_id:
+ rec['analytic_account_id'] = line.analytic_account_id.id
+ else:
+ rec['analytic_account_id'] = slip.deg_id.account_id.id
+
+ if line.type == 'allounce' or line.type == 'otherpay':
+ rec['debit'] = amount
+ if not partner.property_account_payable:
+ raise osv.except_osv(_('Integrity Error !'), _('Please Configure Partners Payable Account!!'))
+ ded_rec = {
+ 'move_id':move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': partner.property_account_payable.id,
+ 'debit': 0.0,
+ 'quantity':1,
+ 'credit' : amount,
+ 'journal_id' : slip.journal_id.id,
+ 'period_id' :period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_rec)]
+ elif line.type == 'deduction' or line.type == 'otherdeduct':
+ if not partner.property_account_receivable:
+ raise osv.except_osv(_('Integrity Error !'), _('Please Configure Partners Receivable Account!!'))
+ rec['credit'] = amount
+ total_deduct += amount
+ ded_rec = {
+ 'move_id':move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'quantity':1,
+ 'account_id': partner.property_account_receivable.id,
+ 'debit': amount,
+ 'credit' : 0.0,
+ 'journal_id' : slip.journal_id.id,
+ 'period_id' :period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_rec)]
+
+ line_ids += [movel_pool.create(cr, uid, rec)]
+
+ if line.company_contrib > 0:
+ company_contrib = line.company_contrib
+# if line.category_id.amount_type == 'per':
+# company_contrib = (amount * line.category_id.contribute_per)
+
+ narration = """Company Contribution of %s Encode same as a Company Expanse @ %s""" % (line.name, company_contrib)
+ move = {
+ #'name': slip.name,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'date': slip.date,
+ 'ref':slip.number,
+ 'narration': narration
+ }
+ company_contrib_move_id = move_pool.create(cr, uid, move)
+ name = "[%s] - %s / %s - Company Contribution" % (line.code, line.name, slip.employee_id.name)
+ self.create_voucher(cr, uid, [slip.id], name, company_contrib_move_id)
+
+ ded_deb = {
+ 'move_id':company_contrib_move_id,
+ 'name': name,
+ 'date': slip.date,
+ 'quantity':1,
+ 'account_id': line.category_id.account_id.id,
+ 'debit': company_contrib,
+ 'credit' : 0.0,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_deb)]
+ ded_cre = {
+ 'move_id':company_contrib_move_id,
+ 'name': name,
+ 'date': slip.date,
+ 'quantity':1,
+ 'account_id': line.category_id.register_id.account_id.id,
+ 'debit': 0.0,
+ 'credit' : company_contrib,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_cre)]
+
+ if line.category_id.include_in_salary:
+ narration = """Company Contribution of %s Deducted from Employee %s""" % (line.name, company_contrib)
+ move = {
+ #'name': slip.name,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'date': slip.date,
+ 'ref':slip.number,
+ 'narration': narration
+ }
+ include_in_salary_move_id = move_pool.create(cr, uid, move)
+ self.create_voucher(cr, uid, [slip.id], narration, include_in_salary_move_id)
+
+ total_deduct += company_contrib
+ ded_deb = {
+ 'move_id':include_in_salary_move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'quantity':1,
+ 'account_id': partner.property_account_receivable.id,
+ 'debit': company_contrib,
+ 'credit' : 0.0,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_deb)]
+ ded_cre = {
+ 'move_id':include_in_salary_move_id,
+ 'name': name,
+ 'date': slip.date,
+ 'quantity':1,
+ 'account_id': line.category_id.account_id.id,
+ 'debit': 0.0,
+ 'credit' : company_contrib,
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_cre)]
+
+ #make an entry line to contribution register
+# if line.category_id.register_id:
+# ctr = {
+# 'register_id':line.category_id.register_id.id,
+# 'name':line.name,
+# 'code':line.code,
+# 'employee_id':slip.employee_id.id,
+# 'period_id':period_id,
+# 'emp_deduction':amount,
+# }
+# if line.category_id.contribute:
+# ctr['comp_deduction'] = amount
+#
+# company = 0.0
+# employee = 0.0
+# if line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'per':
+# new_amount = (amount * (line.category_id.contribute_per / (1+line.category_id.contribute_per)))
+# company = new_amount
+# employee = amount - company
+#
+# elif line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'fix':
+# company = line.category_id.contribute_per
+# employee = amount - company
+
+# elif line.category_id.contribute and line.category_id.include_in_salary and line.category_id.amount_type == 'func':
+# company = self.pool.get('hr.allounce.deduction.categoty').execute_function(cr, uid, line.category_id.id, line.slip_id.basic, context)
+# employee = amount
+#
+# elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'per':
+# company = amount * line.category_id.contribute_per
+# employee = amount
+#
+# elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'fix':
+# company = line.category_id.contribute_per
+# employee = amount
+
+# elif line.category_id.contribute and not line.category_id.include_in_salary and line.category_id.amount_type == 'func':
+# company = self.pool.get('hr.allounce.deduction.categoty').execute_function(cr, uid, line.category_id.id, line.slip_id.basic, context)
+# employee = amount
+#
+# ctr['emp_deduction'] = employee
+# ctr['comp_deduction'] = company
+#
+# self.pool.get('hr.contibution.register.line').create(cr, uid, ctr)
+
+ adj_move_id = False
+ if total_deduct > 0:
+ move = {
+ 'journal_id': slip.journal_id.id,
+ 'period_id': period_id,
+ 'date': slip.date,
+ 'ref':slip.number,
+ 'narration': 'Adjustment : %s' % (slip.name)
+ }
+ adj_move_id = move_pool.create(cr, uid, move)
+ name = "Adjustment Entry - %s" % (slip.employee_id.name)
+ self.create_voucher(cr, uid, [slip.id], name, adj_move_id)
+
+ ded_rec = {
+ 'move_id':adj_move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': partner.property_account_receivable.id,
+ 'debit': 0.0,
+ 'quantity':1,
+ 'credit' : total_deduct,
+ 'journal_id' : slip.journal_id.id,
+ 'period_id' :period_id,
+ 'ref':slip.number
+ }
+ line_ids += [movel_pool.create(cr, uid, ded_rec)]
+ cre_rec = {
+ 'move_id':adj_move_id,
+ 'name': name,
+ 'partner_id': partner_id,
+ 'date': slip.date,
+ 'account_id': partner.property_account_payable.id,
+ 'debit': total_deduct,
+ 'quantity':1,
+ '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)]
+
+ rec = {
+ 'state':'confirm',
+ 'move_line_ids':[(6, 0,line_ids)],
+ }
+ if not slip.period_id:
+ rec['period_id'] = period_id
+
+ dates = prev_bounds(slip.date)
+ exp_ids = exp_pool.search(cr, uid, [('date_valid','>=',dates[0]), ('date_valid','<=',dates[1]), ('state','=','invoiced')])
+ if exp_ids:
+ acc = self.pool.get('ir.property').get(cr, uid, 'property_account_expense_categ', 'product.category')
+ for exp in exp_pool.browse(cr, uid, exp_ids):
+ 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
+ }
+ self.pool.get('hr.payslip.line').create(cr, uid, exp_res)
+
+ self.write(cr, uid, [slip.id], rec)
+
+ return True
+
+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()
+
diff --git a/addons/hr_payroll_account/hr_payroll_account_view.xml b/addons/hr_payroll_account/hr_payroll_account_view.xml
new file mode 100644
index 00000000000..6ef6c812c0b
--- /dev/null
+++ b/addons/hr_payroll_account/hr_payroll_account_view.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<openerp>
+ <data>
+
+ <record id="view_hr_payslip_form_inherit" model="ir.ui.view">
+ <field name="name">hr.payslip.form</field>
+ <field name="model">hr.payslip</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
+ <field name="arch" type="xml">
+ <page string="Accounting Details" position="replace">
+ <page string="Accounting Details">
+ <group col="4" colspan="3">
+ <separator colspan="4" string="Accounting Informations"/>
+ <field name="move_ids" colspan="4" nolabel="1" readonly="1">
+ <tree string="Accounting Vouchers">
+ <field name="sequence"/>
+ <field name="name"/>
+ <field name="move_id"/>
+ </tree>
+ <form string="Accounting Vouchers">
+ <field name="sequence"/>
+ <field name="name"/>
+ <field name="move_id"/>
+ </form>
+ </field>
+ </group>
+ <group col="2" colspan="1">
+ <separator colspan="2" string="Other Informations"/>
+ <field name="paid" readonly="1"/>
+ <field name="company_id"/>
+ <field name="register_id"/>
+ <field name="deg_id"/>
+ <field name="contract_id" domain="[('employee_id','=',employee_id)]"/>
+ </group>
+ <separator colspan="4" string="Description"/>
+ <field name="note" colspan="4" nolabel="1"/>
+ </page>
+ </page>
+ </field>
+ </record>
+
+ <record id="view_hr_payslip_form_inherit1" model="ir.ui.view">
+ <field name="name">hr.payslip.form</field>
+ <field name="model">hr.payslip</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="view_hr_payslip_form_inherit"/>
+ <field name="arch" type="xml">
+ <notebook position="inside">
+ <page string="Account Lines">
+ <field name="move_line_ids" colspan="4" nolabel="1"/>
+ </page>
+ <page string="Payment Lines">
+ <field name="move_payment_ids" colspan="4" nolabel="1"/>
+ </page>
+ </notebook>
+ </field>
+ </record>
+
+ </data>
+</openerp>
diff --git a/addons/hr_payroll_account/hr_payroll_account_workflow.xml b/addons/hr_payroll_account/hr_payroll_account_workflow.xml
new file mode 100644
index 00000000000..80c9848ee39
--- /dev/null
+++ b/addons/hr_payroll_account/hr_payroll_account_workflow.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <record id="act_account_check" model="workflow.activity">
+ <field name="wkf_id" ref="hr_payroll.wkf"/>
+ <field name="name">account_check</field>
+ <field name="action">account_check_sheet()</field>
+ <field name="kind">function</field>
+ </record>
+
+ <record id="hr_payroll.t2" model="workflow.transition">
+ <field name="act_from" ref="hr_payroll.act_draft"/>
+ <field name="act_to" ref="hr_payroll.act_hr_check"/>
+ <field name="condition">True</field>
+ <field name="signal">verify_sheet</field>
+ </record>
+
+ <record id="t3" model="workflow.transition">
+ <field name="act_from" ref="hr_payroll.act_hr_check"/>
+ <field name="act_to" ref="act_account_check"/>
+ <field name="condition">True</field>
+ <field name="signal">verify_twice_sheet</field>
+ </record>
+
+ <record id="hr_payroll.t5" model="workflow.transition">
+ <field name="act_from" ref="act_account_check"/>
+ <field name="act_to" ref="hr_payroll.act_confirm"/>
+ <field name="signal">final_verify_sheet</field>
+ </record>
+
+ <record id="hr_payroll.t9" model="workflow.transition">
+ <field name="act_from" ref="act_account_check"/>
+ <field name="act_to" ref="hr_payroll.act_cancel"/>
+ <field name="signal">cancel_sheet</field>
+ </record>
+
+ </data>
+</openerp>