← Back to team overview

openerp-canada team mailing list archive

[Merge] lp:~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll into lp:openerp-canada/6.1

 

Maxime Chambreuil (http://www.savoirfairelinux.com) has proposed merging lp:~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll into lp:openerp-canada/6.1.

Requested reviews:
  OpenERP Committers (openerp-commiter)

For more details, see:
https://code.launchpad.net/~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll/+merge/141101

[ADD] Canadian and Quebec basic payroll rules
[ADD] Canadian and Quebec payroll accounting
-- 
https://code.launchpad.net/~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll/+merge/141101
Your team OpenERP Canada Team is subscribed to branch lp:~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll.
=== added directory 'l10n_ca_account_fiscal_position_rule/static'
=== added directory 'l10n_ca_account_fiscal_position_rule/static/src'
=== added directory 'l10n_ca_account_fiscal_position_rule/static/src/img'
=== added file 'l10n_ca_account_fiscal_position_rule/static/src/img/icon.png'
Binary files l10n_ca_account_fiscal_position_rule/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_account_fiscal_position_rule/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_hr_payroll'
=== added file 'l10n_ca_hr_payroll/AUTHORS.txt'
--- l10n_ca_hr_payroll/AUTHORS.txt	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/AUTHORS.txt	2012-12-21 16:45:28 +0000
@@ -0,0 +1,4 @@
+Amura Consulting
+Pierre Lamarche <pierre.lamarche@xxxxxxxxxxxxxxxxxxxx>
+Maxime Chambreuil <maxime.chambreuil@xxxxxxxxxxxxxxxxxxxx>
+Savoir-faire Linux <contact@xxxxxxxxxxxxxxxxxxxx>

=== added file 'l10n_ca_hr_payroll/__init__.py'
--- l10n_ca_hr_payroll/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/__init__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,24 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import l10n_ca_hr_payroll
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_hr_payroll/__openerp__.py'
--- l10n_ca_hr_payroll/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/__openerp__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,50 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Canada - Payroll',
+    'category': 'Localization',
+    'version': '0.1',
+    'license': 'AGPL-3',
+    'category': 'Generic Modules/Human Resources',
+    'description': """
+Canada Payroll Rules
+==============================
+ * Adds Federal Salary Rules
+ * Adds Federal Salary Structure
+ * Adds Federal Claim Codes, Deductions and Exemptions on the Employee Form
+ * Adds 'Pays Per Year' field on the Contract Form
+    """,
+    'author':'OpenERP Canada',
+    'website':'http://launchpad.net/openerp-canada',
+    'depends': [
+        'hr_payroll',
+        'l10n_ca_toponyms',
+    ],
+    'data': [
+        'l10n_ca_hr_payroll_view.xml',
+        'l10n_ca_hr_payroll_data.xml',
+    ],
+    'test': [],
+    'demo': [],
+    'installable': True,
+    'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll.py'
--- l10n_ca_hr_payroll/l10n_ca_hr_payroll.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,260 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Amura Consulting. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+def get_jurisdiction(self, cursor, user_id, context=None):
+    return (
+        ('federal', 'Federal'),
+        ('provincial', 'Provincial'))
+
+def get_type(self, cursor, user_id, context=None):
+    return (
+        ('federal', 'Federal'),
+        ('ei', 'Employment Insurance'),
+        ('qc', 'Quebec'),
+        ('rqap', 'RQAP / RRQ'),
+        ('csst', 'CSST'))
+
+class hr_payroll_tax_table(osv.osv):
+    '''
+    Canadian Tax Payroll Table
+    '''
+    _name = 'hr.payroll.tax.table'
+    _description = 'Canadian Tax Payroll Table'
+
+    def onchange_year(self, cr, uid, ids, year, prov=False):
+        res = {}
+        res['name'] = 'Tax Table: ' + str(year)
+        if prov:
+            prov_obj = self.pool.get('res.country.state').browse(cr, uid, prov)
+            res['name'] += ' / Provincial - ' + prov_obj.code
+        else:
+            res['name'] += ' / Federal'
+
+        return {'value': res}
+        
+    _columns = {
+            'name': fields.char('Description', size=128),
+            'year': fields.integer('Year', required=True),
+            'date_from': fields.date('Date From'),
+            'date_to': fields.date('Date To'),
+            'jurisdiction': fields.selection(get_jurisdiction, 'Jurisdiction', required=True),
+            'state_id': fields.many2one('res.country.state', 'Province'),
+            'type': fields.selection(get_type, 'Type', required=True),
+            'line_federal_ids': fields.one2many('hr.payroll.tax.table.federal.line', 'table_id', 'Lines'),
+            'line_ei_ids': fields.one2many('hr.payroll.tax.table.ei.line', 'table_id', 'Lines'),
+            'line_qc_ids': fields.one2many('hr.payroll.tax.table.qc.line', 'table_id', 'Lines'),
+            'line_rqap_ids': fields.one2many('hr.payroll.tax.table.rqap.line', 'table_id', 'Lines'),
+            'line_csst_ids': fields.one2many('hr.payroll.tax.table.csst.line', 'table_id', 'Lines'),
+            }
+
+    _defaults = {
+            'jurisdiction': 'federal',
+            'type': 'federal',
+            }
+
+hr_payroll_tax_table()
+
+class hr_payroll_tax_table_federal_line(osv.osv):
+    '''
+    Federal Lines
+    '''
+    _name = 'hr.payroll.tax.table.federal.line'
+    _description = 'Federal Lines'
+    _columns = {
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        'inc_from': fields.float('Income From', digits=(16, 2), required=True),
+        'inc_to': fields.float('Income To', digits=(16, 2), required=True),
+        'code0': fields.float('Code 0', digits=(16, 2)),
+        'code1': fields.float('Code 1', digits=(16, 2)),
+        'code2': fields.float('Code 2', digits=(16, 2)),
+        'code3': fields.float('Code 3', digits=(16, 2)),
+        'code4': fields.float('Code 4', digits=(16, 2)),
+        'code5': fields.float('Code 5', digits=(16, 2)),
+        'code6': fields.float('Code 6', digits=(16, 2)),
+        'code7': fields.float('Code 7', digits=(16, 2)),
+        'code8': fields.float('Code 8', digits=(16, 2)),
+        'code9': fields.float('Code 9', digits=(16, 2)),
+        'code10': fields.float('Code 10', digits=(16, 2)),
+        }
+
+    _rec_name = 'inc_from'
+
+hr_payroll_tax_table_federal_line()
+
+class hr_payroll_tax_table_ei_line(osv.osv):
+    '''
+    Employment Insurance Lines
+    '''
+    _name = 'hr.payroll.tax.table.ei.line'
+    _description = 'Employment Insurance Lines'
+    _columns = {
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        'inc_from': fields.float('Income From', digits=(16, 2), required=True),
+        'inc_to': fields.float('Income To', digits=(16, 2), required=True),
+        'rate': fields.float('Rate', digits=(16, 2), required=True),
+        'max_annual_insurable_earnings': fields.float('Maximum Annual Insurable Earnings', digits=(16, 2), required=True),
+        }
+
+    _rec_name = 'inc_from'
+
+hr_payroll_tax_table_ei_line()
+
+class hr_payroll_tax_table_qc_line(osv.osv):
+    '''
+    Quebec Lines
+    '''
+    _name = 'hr.payroll.tax.table.qc.line'
+    _description = 'Quebec Lines'
+    _columns = {
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        'inc_from': fields.float('Income From', digits=(16, 2), required=True),
+        'inc_to': fields.float('Income To', digits=(16, 2), required=True),
+        'code0': fields.float('Code 0', digits=(16, 2)),
+        'codeA': fields.float('Code A', digits=(16, 2)),
+        'codeB': fields.float('Code B', digits=(16, 2)),
+        'codeC': fields.float('Code C', digits=(16, 2)),
+        'codeD': fields.float('Code D', digits=(16, 2)),
+        'codeE': fields.float('Code E', digits=(16, 2)),
+        'codeF': fields.float('Code F', digits=(16, 2)),
+        'codeG': fields.float('Code G', digits=(16, 2)),
+        'codeH': fields.float('Code H', digits=(16, 2)),
+        'codeI': fields.float('Code I', digits=(16, 2)),
+        'codeJ': fields.float('Code J', digits=(16, 2)),
+        'codeK': fields.float('Code K', digits=(16, 2)),
+        'codeL': fields.float('Code L', digits=(16, 2)),
+        'codeM': fields.float('Code M', digits=(16, 2)),
+        'codeN': fields.float('Code N', digits=(16, 2)),
+        'codeY': fields.float('Code Y', digits=(16, 2)),
+        'codeZ': fields.float('Code Z', digits=(16, 2)),
+        }
+
+    _rec_name = 'inc_from'
+
+hr_payroll_tax_table_qc_line()
+
+class hr_payroll_tax_table_rqap_line(osv.osv):
+    '''
+    RQAP Lines
+    '''
+    _name = 'hr.payroll.tax.table.rqap.line'
+    _description = 'RQAP Lines'
+    _columns = {
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        'inc_from': fields.float('Income From', digits=(16, 2), required=True),
+        'inc_to': fields.float('Income To', digits=(16, 2), required=True),
+        'employee_contrib': fields.float('Employee contribution', digits=(16, 2)),
+        'employer_contrib': fields.float('Employer contribution', digits=(16, 2)),
+        'max_annual_insurable_earnings': fields.float('Maximum Annual Insurable Earnings', digits=(16, 2)),
+        }
+
+hr_payroll_tax_table_rqap_line()
+
+class hr_payroll_tax_table_csst_line(osv.osv):
+    '''
+    CSST Lines
+    '''
+    _name = 'hr.payroll.tax.table.csst.line'
+    _description = 'CSST Lines'
+    _columns = {
+        'name': fields.char('Name', size=256, required=True),
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        }
+
+hr_payroll_tax_table_csst_line()
+
+class hr_employee(osv.osv):
+    _name = 'hr.employee'
+    _inherit = 'hr.employee'
+
+    _columns = {
+        'ei_exempt': fields.boolean('EI Exempt'),
+        'td1f': fields.selection([('code1',1),('code2',2),('code3',3),('code4',4),('code5',5),('code6',6),('code7',7),('code8',8),('code9',9),('code10',10),('code0',0)], 'Federal Claim Code', required=True),
+        'td1p': fields.selection([('codeA','A'),('codeB','B'),('codeC','C'),('codeD','D'),('codeE','E'),('codeF','F'),('codeG','G'),('codeH','H'),('codeI','I'),('codeJ','J'),('codeK','K'),('codeL','L'),('codeM','M'),('codeN','N'),('codeY','Y'),('codeZ','Z'),('code0',0)], 'Provincial Claim Code', required=True),
+        'cpp_exempt': fields.boolean('CPP/QPP Exempt'),
+        'qpip_exempt': fields.boolean('QPIP Exempt'),
+        'cpp_ytd_adj': fields.float('CPP/QPP YTD Adjustment', help="Amount to adjust CPP/QPP for calculations. Used if employee has contributed elsewhere and will be factored in when calculating maximum CPP payment"),
+        'ei_ytd_adj': fields.float('EI YTD Adjustment', help="Amount to adjust EI for calculations. Used if employee has contributed elsewhere and will be factored in when calculating maximum EI payment"),
+        'vac_pay': fields.float('Vacation Pay %', digits=(16,2)),
+        'f1': fields.float('Childcare/Alimony (F1)', digits=(16,2), help="Annual deductions such as child care expenses and support payments, etc., authorized by a tax services office or tax centre"),
+        'f2': fields.float('Alimony/Maint Garnish (F2)', digits=(16,2), help="Alimony or maintenance payments required by a legal document to be payroll-deducted authorized by a tax services office or tax centre"),
+        'hd': fields.float('Prescribed Zone (HD)', digits=(16,2), help="Annual deduction for living in a prescribed zone as indicated on Form TD1"),
+        'lcf': fields.float('Fed Labour sponsored funds (LCF)', digits=(16,2), help="Federal labour-sponsored funds tax credit"),
+        'lcp': fields.float('Prov Labour sponsored funds (LCP)', digits=(16,2), help="Provincial or territorial labour-sponsored funds tax credit"),
+        'f': fields.float('RSP/RPP/RCA (F)', digits=(16,2), help="Payroll deductions for employee contributions to a registered pension plan (RPP), a registered retirement savings plan (RRSP), or a retirement compensation arrangement (RCA)"),
+        'l': fields.float('Extra Tax Deductions (L)', digits=(16,2), help="Extra tax deductions requested for the pay period."),
+        'k3': fields.float('Federal Medical (K3)', digits=(16,2), help="Other federal tax credits, such as medical expenses and charitable donations authorized by a tax services office or tax centre"),
+        'u1': fields.float('Union Dues (U1)', digits=(16,2), help="Union dues"),
+        'y': fields.float('MB/ON Extra Tax Reduction(Y)', digits=(16,2), help="Extra provincial or territorial tax reduction based on applicable amounts reported on the provincial or territorial Form TD1"),
+        'td1': fields.float('Personal Tax Credits Return (TD1)', digits=(16,2), required=True, help="Personal Tax Credits Return"),
+        'eeins': fields.float('Insurance - Employee Contribution (EeINS)', digits=(16,2), required=True),
+        'erins': fields.float('Insurance - Employer Contribution (ErINS)', digits=(16,2), required=True),
+            }
+
+    _defaults = {
+        'td1f': 'code1',
+        'td1p': 'codeA',
+        'td1': 10822.00,
+        'eeins': 0.00,
+        'erins': 0.00,
+        }
+
+hr_employee()
+
+class hr_contract(osv.osv):
+    _inherit = 'hr.contract'
+
+    def _get_pays_per_year(self, cr, uid, ids, names, arg, context=None):
+        """
+        @param ids: ID of contract
+        @return: The number of pays per year
+        """
+        res = {}
+        #FIXME: Should likely pull these values from somewhere else, depending on whether a 52 or 53 year week is used
+        schedule_pay = {
+            'weekly': 52,
+            'bi-weekly': 26,
+            'monthly': 12,
+            'bi-monthly': 6,
+            'quarterly': 4,
+            'semi-annually': 2,
+            'annually': 1,
+            }
+        for contract in self.browse(cr, uid, ids, context):
+            if contract.schedule_pay and schedule_pay.get(contract.schedule_pay, False):
+                res[contract.id] = schedule_pay[contract.schedule_pay]
+
+        return res
+
+    _columns = {
+        'pays_per_year': fields.function(_get_pays_per_year, method=True, string='Pays Per Year', type='float', readonly=True),
+        'weeks_of_vacation': fields.integer('Number of weeks of vacation', required=True),
+        }
+
+    _defaults = {
+        'weeks_of_vacation': 2,
+        }
+
+hr_contract()
+
+            
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml'
--- l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+	<!-- Salary Rules Category -->
+
+        <record id="I" model="hr.salary.rule.category">
+            <field name="name">Taxable Income</field>
+            <field name="code">I</field>
+        </record>
+
+        <record id="CALC" model="hr.salary.rule.category">
+            <field name="code">CALC</field>
+            <field name="name">Standard Calculation</field>
+        </record>
+
+        <record id="FCALC" model="hr.salary.rule.category">
+            <field name="code">FCALC</field>
+            <field name="name">Federal Calculation</field>
+        </record>
+
+        <record id="PCALC" model="hr.salary.rule.category">
+            <field name="code">PCALC</field>
+            <field name="name">Provincial Calculation</field>
+        </record>
+
+        <record id="EMP" model="hr.salary.rule.category">
+            <field name="code">EMP</field>
+            <field name="name">Employer Contribution</field>
+        </record>
+
+        <record id="SDED" model="hr.salary.rule.category">
+            <field name="code">SDED</field>
+            <field name="name">Source Deduction</field>
+            <field name="note">Used for after tax deductions at source</field>
+        </record>
+
+        <record id="VAC" model="hr.salary.rule.category">
+            <field name="code">VAC</field>
+            <field name="name">Vacation Calculation</field>
+        </record>
+
+	<!-- Update salary rules of hr_payroll -->
+
+        <record id="hr_payroll.hr_rule_basic" model="hr.salary.rule">
+            <field name="appears_on_payslip" eval="0"/>
+        </record>
+
+        <record id="hr_payroll.hr_rule_taxable" model="hr.salary.rule">
+            <field name="appears_on_payslip" eval="0"/>
+        </record>
+
+        <record id="hr_payroll.hr_rule_net" model="hr.salary.rule">
+            <field name="amount_python_compute">result = BASICP + categories.ALW - categories.DED - categories.SDED</field>
+        </record>
+
+	<!-- Common rules to all canadian salary structures -->
+
+        <record id="rule_ca_p" model="hr.salary.rule">
+            <field name="name">Pays Per Year</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">P</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = contract.pays_per_year or 0</field>
+            <field name="note">Pays per year from the contract form</field>
+        </record>
+
+        <record id="rule_ca_pocc" model="hr.salary.rule">
+            <field name="name">Payslip Counter (POCC)</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">POCC</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">1.0</field>
+            <field name="note">Sloppy way of counting payslips for use in PR calc</field>
+        </record>
+
+        <record id="rule_ca_basic" model="hr.salary.rule">
+            <field name="name">Basic per pay (BASICP)</field>
+            <field name="sequence" eval="10"/>
+            <field name="code">BASICP</field>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = BASIC / P</field>
+        </record>
+
+        <record id="rule_ca_gross" model="hr.salary.rule">
+            <field name="name">Gross per pay (GROSSP)</field>
+            <field name="sequence" eval="101"/>
+            <field name="code">GROSSP</field>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = GROSS / P</field>
+        </record>
+
+	<!-- Employment Insurance - 140 -->
+
+        <record id="rule_ca_ei_maxie" model="hr.salary.rule">
+            <field name="name">EI - Maximum Insurable Earnings (EIMAXIE)</field>
+            <field name="sequence" eval="140"/>
+            <field name="code">EIMAXIE</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="FCALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = min(GROSS,45900)</field>
+        </record>
+
+	<!-- Employment Insurance - Employer - 145 -->
+
+        <record id="rule_ca_ei_er_c" model="hr.salary.rule">
+            <field name="name">EI - Employer - Contribution (EIERC)</field>
+            <field name="sequence" eval="145"/>
+            <field name="code">EIERC</field>
+            <field name="category_id" ref="EMP"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">python</field>
+            <field name="condition_python">result = not employee.ei_exempt</field>
+            <field name="amount_select">percentage</field>
+            <field name="amount_percentage_base">EIEEC</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_percentage">140.0</field>
+        </record>
+
+        <record id="rule_ca_ei_er_pytdc" model="hr.salary.rule">
+            <field name="name">EI - Employer - Previous Year To Date Contribution (EIERPYTDC)</field>
+            <field name="sequence" eval="145"/>
+            <field name="code">EIERPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('EIERYTDC',date_from,date_to)
+            </field>
+        </record>
+
+        <record id="rule_ca_ei_er_ytdc" model="hr.salary.rule">
+            <field name="name">EI - Employer - Year To Date Contribution (EIERYTDC)</field>
+            <field name="sequence" eval="146"/>
+            <field name="code">EIERYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = EIERPYTDC + EIERC</field>
+        </record>
+
+	<!-- Federal Income Tax - 170 -->
+
+        <record id="rule_ca_fit_rate" model="hr.salary.rule">
+            <field name="name">FIT - Rate 16.5% (FITRATE)</field>
+            <field name="sequence" eval="170"/>
+            <field name="code">FITRATE</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="FCALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">16.5</field>
+        </record>
+
+        <record id="rule_ca_fit_ti" model="hr.salary.rule">
+            <field name="name">FIT - Taxable Income (FITTI)</field>
+            <field name="sequence" eval="171"/>
+            <field name="code">FITTI</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="FCALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = GROSS - (employee.td1 + QPIPEEMAXC + QPPEEMAXC + EIEEMAXC) * (1 + FITRATE * 0.01)</field>
+        </record>
+
+        <record id="rule_ca_fit" model="hr.salary.rule">
+            <field name="name">FIT - Federal Income Tax (FIT)</field>
+            <field name="sequence" eval="172"/>
+            <field name="code">FIT</field>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if FITTI &gt;= 132407:
+    res = (FITTI - 132407) * 0.29 + (132407-85415) * 0.26 + (85414-42708) * 0.22 + 42707 * 0.15
+if FITTI &gt;= 85415 and FITTI &lt; 132407:
+    res = (FITTI - 85415) * 0.26 + (85414-42708) * 0.22 + 42707 * 0.15
+if FITTI &gt;= 42708 and FITTI &lt; 85414:
+    res = (FITTI - 42708) * 0.22 + 42707 * 0.15
+if FITTI &lt; 42707:
+    res = FITTI * 0.15
+result = res / P
+	    </field>
+        </record>
+
+        <record id="rule_ca_fit_ytd" model="hr.salary.rule">
+            <field name="name">FIT - Year To Date (FITYTD)</field>
+            <field name="sequence" eval="173"/>
+            <field name="code">FITYTD</field>
+            <field name="category_id" ref="FCALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('FITYTD',date_from,date_to) + FIT
+            </field>
+        </record>
+
+        <!-- Vacation - 210 -->
+
+        <record id="rule_ca_vac" model="hr.salary.rule">
+            <field name="name">Vacation (VAC)</field>
+            <field name="sequence" eval="210"/>
+            <field name="code">VAC</field>
+            <field name="category_id" ref="VAC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = GROSSP * contract.weeks_of_vacation * 0.02</field>
+        </record>
+
+        <record id="rule_ca_vac_ytd" model="hr.salary.rule">
+            <field name="name">Vacation - Year To Date (VACYTD)</field>
+            <field name="sequence" eval="211"/>
+            <field name="code">VACYTD</field>
+            <field name="category_id" ref="VAC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('VACYTD',date_from,date_to) + VAC
+            </field>
+        </record>
+
+	<!-- Base for Canadian Salary Structure -->
+
+        <record id="hr_structure_ca_base" model="hr.payroll.structure">
+            <field name="code">CA</field>
+            <field name="name">Canadian Base</field>
+            <field eval="[(6, 0, [
+		ref('rule_ca_p'),
+		ref('rule_ca_pocc'),
+		ref('rule_ca_basic'),
+		ref('rule_ca_gross'),
+		ref('rule_ca_ei_maxie'),
+		ref('rule_ca_ei_er_c'),
+		ref('rule_ca_ei_er_pytdc'),
+		ref('rule_ca_ei_er_ytdc'),
+		ref('rule_ca_fit_rate'),
+		ref('rule_ca_fit_ti'),
+		ref('rule_ca_fit'),
+		ref('rule_ca_fit_ytd'),
+		ref('rule_ca_vac'),
+		ref('rule_ca_vac_ytd')
+		])]" name="rule_ids"/>
+        </record>
+
+    </data>
+</openerp>

=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml'
--- l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+
+        <record id="hr_payroll_tax_table_form" model="ir.ui.view">
+            <field name="name">hr.payroll.tax.table.form</field>
+            <field name="model">hr.payroll.tax.table</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <form string="Canadian Tax Table">
+                   <field name="name" select="1"/>
+                   <field name="year" select="1" on_change="onchange_year(year,state_id)"/>
+                   <field name="date_from"/>
+                   <field name="date_to"/>
+                   <field name="jurisdiction"/>
+                   <field name="state_id" 
+                          attrs="{'invisible': [('jurisdiction','!=','provincial')], 'required': [('jurisdiction','=','provincial')]}" 
+                          on_change="onchange_year(year,state_id)" 
+                          domain="[('country_id.code', '=', 'CA')]"/> 
+                   <field name="type"/>
+                   <newline/>
+                   <separator colspan="4"/>
+                   <newline/>
+                   <field name="line_federal_ids" nolabel="1" colspan="4" widget="one2many_list"
+                          attrs="{'invisible': [('type','!=','federal')]}">
+                       <tree string="Federal Lines" editable="top">
+                           <field name="inc_from"/>
+                           <field name="inc_to"/>
+                           <field name="code0"/>
+                           <field name="code1"/>
+                           <field name="code2"/>
+                           <field name="code3"/>
+                           <field name="code4"/>
+                           <field name="code5"/>
+                           <field name="code6"/>
+                           <field name="code7"/>
+                           <field name="code8"/>
+                           <field name="code9"/>
+                           <field name="code10"/>
+                       </tree>
+                   </field>
+                   <field name="line_ei_ids" nolabel="1" colspan="4" widget="one2many_list" 
+                          attrs="{'invisible': [('type','!=','ei')]}">
+                       <tree string="Employment Insurance Lines" editable="top">
+                           <field name="inc_from"/>
+                           <field name="inc_to"/>
+                           <field name="rate"/>
+                           <field name="max_annual_insurable_earnings"/>
+                       </tree>
+                   </field>
+                   <field name="line_qc_ids" nolabel="1" colspan="4" widget="one2many_list" 
+                          attrs="{'invisible': [('type','!=','qc')]}">
+                       <tree string="Quebec Lines" editable="top">
+                           <field name="inc_from"/>
+                           <field name="inc_to"/>
+                           <field name="code0"/>
+                           <field name="codeA"/>
+                           <field name="codeB"/>
+                           <field name="codeC"/>
+                           <field name="codeD"/>
+                           <field name="codeE"/>
+                           <field name="codeF"/>
+                           <field name="codeG"/>
+                           <field name="codeH"/>
+                           <field name="codeI"/>
+                           <field name="codeJ"/>
+                           <field name="codeK"/>
+                           <field name="codeL"/>
+                           <field name="codeM"/>
+                           <field name="codeN"/>
+                           <field name="codeY"/>
+                           <field name="codeZ"/>
+                       </tree>
+                   </field>
+                   <field name="line_rqap_ids" nolabel="1" colspan="4" widget="one2many_list" 
+                          attrs="{'invisible': [('type','!=','rqap')]}">
+                       <tree string="RQAP / RRQ Lines" editable="top">
+                           <field name="inc_from"/>
+                           <field name="inc_to"/>
+                           <field name="employee_contrib"/>
+                           <field name="employer_contrib"/>
+                           <field name="max_annual_insurable_earnings"/>
+                       </tree>
+                   </field>
+                   <field name="line_csst_ids" nolabel="1" colspan="4" widget="one2many_list" 
+                          attrs="{'invisible': [('type','!=','csst')]}">
+                       <tree string="CSST Lines" editable="top">
+                           <field name="name"/>
+                       </tree>
+                   </field>
+                </form>
+          </field>
+        </record>
+
+        <record id="hr_payroll_tax_table_search" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.search</field>
+          <field name="model">hr.payroll.tax.table</field>
+          <field name="type">search</field>
+          <field name="arch" type="xml">
+              <search string="Canadian Tax Table">
+                   <field name="name"/>
+                   <field name="year"/>
+                   <field name="jurisdiction"/>
+                   <field name="state_id"/>
+                   <field name="type"/>
+              </search>
+          </field>
+        </record>
+
+        <record id="hr_payroll_tax_table_tree" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.tree</field>
+          <field name="model">hr.payroll.tax.table</field>
+          <field name="type">tree</field>
+          <field name="arch" type="xml">
+              <tree string="Canadian Tax Table">
+                   <field name="name"/>
+                   <field name="year"/>
+                   <field name="jurisdiction"/>
+                   <field name="state_id"/>
+                   <field name="type"/>
+                </tree>
+            </field>
+        </record>
+                
+      <record id="action_hr_payroll_tax_table_tree" model="ir.actions.act_window">
+          <field name="name">Canadian Tax Table</field>
+          <field name="res_model">hr.payroll.tax.table</field>
+          <field name="view_type">form</field>
+          <field name="view_mode">tree,form</field>
+          <field name="view_id" ref="hr_payroll_tax_table_tree"/>
+          <field name="search_view_id" ref="hr_payroll_tax_table_search"/>
+      </record>
+  
+      <menuitem id="menu_hr_payroll_tax_table_tree" action="action_hr_payroll_tax_table_tree" parent="hr_payroll.payroll_configure"/>
+  
+      <record id="hr_employee_view_form_inherit" model="ir.ui.view">
+          <field name="name">hr.employee.view.form.inherit</field>
+          <field name="model">hr.employee</field>
+          <field name="type">form</field>
+          <field name="inherit_id" ref="hr.view_employee_form"/>
+          <field name="arch" type="xml">
+              <notebook position="inside">
+                  <page string="Canadian Payroll">
+                      <group colspan="1" col="2">
+                          <separator string="Claim Codes" colspan="2"/>
+                          <field name="td1f" colspan="1"/>
+                          <field name="td1p" colspan="1"/>
+                      </group>
+                      <group colspan="3" col="2">
+                          <separator string="Exemptions" colspan="2"/>
+                          <group colspan="1" col="2">
+                              <field name="ei_ytd_adj"/>
+                              <field name="cpp_ytd_adj"/>
+                          </group>
+                          <group colspan="1" col="2">
+                              <field name="ei_exempt"/>
+                              <field name="cpp_exempt"/>
+                              <field name="qpip_exempt"/>
+                          </group>
+                      </group>
+                      <separator string="Deductions" colspan="4"/>
+                      <field name="f1"/>
+                      <field name="f2"/>
+                      <field name="hd"/>
+                      <field name="lcf"/>
+                      <field name="lcp"/>
+                      <field name="f"/>
+                      <field name="k3"/>
+                      <field name="u1"/>
+                      <field name="y"/>
+                      <field name="l"/>
+                      <field name="td1"/>
+                      <field name="eeins"/>
+                      <field name="erins"/>
+                  </page>
+              </notebook>
+          </field>
+      </record>
+  
+      <!-- Contract View -->
+      <record id="hr_contract_form_inherit" model="ir.ui.view">
+          <field name="name">hr.contract.view.form.inherit</field>
+          <field name="model">hr.contract</field>
+          <field name="type">form</field>
+          <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
+          <field name="arch" type="xml">
+               <xpath expr="/form/notebook/page/group/field[@name='working_hours']" position="after">
+                  <field name="pays_per_year"/>
+                  <field name="weeks_of_vacation"/>
+              </xpath>
+          </field>
+      </record>
+  
+      <!-- End Contract View-->
+  
+      <!-- Salary Rules - unhide the sequence, not sure why it's invisible -->
+      <record id="hr_salary_rule_list_inherit" model="ir.ui.view">
+          <field name="name">hr.salary.rule.list.inherit</field>
+          <field name="model">hr.salary.rule</field>
+          <field name="type">tree</field>
+          <field name="inherit_id" ref="hr_payroll.hr_salary_rule_list"/>
+          <field name="arch" type="xml">
+              <xpath expr="//field[@name='sequence']" position="replace">
+                  <field name="sequence" groups="base.group_extended"/>
+              </xpath>
+          </field>
+      </record>
+  
+  </data>
+</openerp>

=== added directory 'l10n_ca_hr_payroll/static'
=== added directory 'l10n_ca_hr_payroll/static/src'
=== added directory 'l10n_ca_hr_payroll/static/src/img'
=== added file 'l10n_ca_hr_payroll/static/src/img/icon.png'
Binary files l10n_ca_hr_payroll/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_hr_payroll/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_hr_payroll_account'
=== added file 'l10n_ca_hr_payroll_account/AUTHORS.txt'
--- l10n_ca_hr_payroll_account/AUTHORS.txt	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll_account/AUTHORS.txt	2012-12-21 16:45:28 +0000
@@ -0,0 +1,3 @@
+Pierre Lamarche <pierre.lamarche@xxxxxxxxxxxxxxxxxxxx>
+Maxime Chambreuil <maxime.chambreuil@xxxxxxxxxxxxxxxxxxxx>
+Savoir-faire Linux <contact@xxxxxxxxxxxxxxxxxxxx>

=== added file 'l10n_ca_hr_payroll_account/__init__.py'
--- l10n_ca_hr_payroll_account/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll_account/__init__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,22 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_hr_payroll_account/__openerp__.py'
--- l10n_ca_hr_payroll_account/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll_account/__openerp__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,51 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Canada - Payroll Accounting',
+    'category': 'Localization',
+    'version': '0.1',
+    'license': 'AGPL-3',
+    'category': 'Generic Modules/Human Resources',
+    'description': """
+Canada Payroll Accounting 
+=========================
+
+This module:
+ * creates salary journal
+ * creates financial accounts for payroll
+ * updates salary rules with accounting information
+    """,
+    'author':'OpenERP Canada',
+    'website':'http://launchpad.net/openerp-canada',
+    'depends': [
+        'l10n_ca',
+        'l10n_ca_hr_payroll',
+        'hr_payroll_account',
+    ],
+    'data': [
+        'l10n_ca_hr_payroll_account_data.xml',
+    ],
+    'test': [],
+    'demo': [],
+    'installable': True,
+    'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml'
--- l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+	<!-- Payroll Journal -->
+
+	<record id="payroll_journal" model="account.journal">
+	    <field name="name">Payroll Journal</field>
+	    <field name="code">PAYJ</field>
+	    <field name="type">general</field>
+	    <field name="view_id" ref="account.account_journal_view"/>
+	</record>
+
+	<!-- Salary rules -->
+
+	<!-- Employment Insurance -->
+
+        <record id="l10n_ca_hr_payroll.rule_ca_ei_er_c" model="hr.salary.rule">
+            <field name="account_debit" model='account.account' search="[('code','like','51203')]"/>
+            <field name="account_credit" model='account.account' search="[('code','like','214112')]"/>
+        </record>
+
+        <!-- Federal Tax Income -->
+
+        <record id="l10n_ca_hr_payroll.rule_ca_fit" model="hr.salary.rule">
+            <field name="account_debit" model='account.account' search="[('code','like','51209')]"/>
+            <field name="account_credit" model='account.account' search="[('code','like','21412')]"/>
+        </record>
+
+    </data>
+</openerp>

=== added directory 'l10n_ca_hr_payroll_account/static'
=== added directory 'l10n_ca_hr_payroll_account/static/src'
=== added directory 'l10n_ca_hr_payroll_account/static/src/img'
=== added file 'l10n_ca_hr_payroll_account/static/src/img/icon.png'
Binary files l10n_ca_hr_payroll_account/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_hr_payroll_account/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_on_hr_payroll'
=== added file 'l10n_ca_on_hr_payroll/__init__.py'
--- l10n_ca_on_hr_payroll/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_on_hr_payroll/__init__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,24 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Amura Consulting. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import l10n_ca_on_hr_payroll
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_on_hr_payroll/__openerp__.py'
--- l10n_ca_on_hr_payroll/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_on_hr_payroll/__openerp__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,52 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Amura Consulting. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Canada - Ontario - Payroll',
+    'category': 'Localization',
+    'version': '0.9',
+    'category': 'Generic Modules/Human Resources',
+    'description': """
+Ontario Canadian Payroll Rules
+==============================
+ * Adds all Federal and Provincial Salary Rules for Ontario
+ * Adds Ontario Salary Structure
+ * Adds Claim Codes, Deductions and Exemptions on the Employee Form
+ * Adds 'Pays Per Year' field on the Contract Form
+    """,
+    'author':'Amura Consulting',
+    'website':'http://www.openerp.com',
+    'depends': [
+        'hr_payroll',
+    ],
+    'init_xml': [
+    ],
+    'update_xml': [
+        'l10n_ca_on_hr_payroll_view.xml',
+        'l10n_ca_on_hr_payroll_data.xml',
+    ],
+    'test': [
+    ],
+    'demo_xml': [
+    ],
+    'installable': True,
+    'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py'
--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,141 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Amura Consulting. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+"""
+class hr_payroll_tax_table(osv.osv):
+    '''
+    Canadian Tax Payroll Table
+    '''
+    _name = 'hr.payroll.tax.table'
+    _description = 'Canadian Tax Payroll Table'
+
+    def onchange_year(self, cr, uid, ids, year, prov=False):
+        res = {}
+        res['name'] = 'Tax Table: ' + str(year)
+        if prov:
+            prov_obj = self.pool.get('res.country.state').browse(cr, uid, prov)
+            res['name'] += ' / Provincial - ' + prov_obj.code
+        else:
+            res['name'] += ' / Federal'
+
+        return {'value': res}
+        
+    _columns = {
+            'name': fields.char('Description', size=128),
+            'year': fields.integer('Year', required=True),
+            'date_from': fields.date('Date From'),
+            'date_to': fields.date('Date To'),
+            'fed_prov': fields.selection([
+                ('federal','Federal'),
+                ('provincial','Provincial')], 'Federal/Provincial', required=True),
+            'province': fields.many2one('res.country.state', 'Province'),
+            'line_ids': fields.one2many('hr.payroll.tax.table.line', 'table_id', 'Lines'),
+            }
+
+    _defaults = {
+            'fed_prov': 'federal',
+            }
+hr_payroll_tax_table()
+
+class hr_payroll_tax_table_line(osv.osv):
+    '''
+    Canadian Tax Payroll Table Lines
+    '''
+    _name = 'hr.payroll.tax.table.line'
+    _description = 'Canadian Tax Payroll Table Lines'
+    _columns = {
+        'name': fields.char('Name', size=64),
+        'code': fields.char('Code', size=16),
+        'inc_from': fields.float('Income From', digits=(16, 2)),
+        'inc_to': fields.float('Income To', digits=(16, 2)),
+        'rate': fields.float('Rate', digits=(16, 2)),
+        'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
+        }
+hr_payroll_tax_table_line()
+"""
+
+class hr_employee(osv.osv):
+    _name = 'hr.employee'
+    _inherit = 'hr.employee'
+
+    _columns = {
+        'ei_exempt': fields.boolean('EI Exempt'),
+        'td1f': fields.selection([(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(0,0)], 'Federal Claim Code', required=True),
+        'td1p': fields.selection([(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10),(0,0)], 'Provincial Claim Code', required=True),
+        'cpp_exempt': fields.boolean('CPP/QPP Exempt'),
+        'qpip_exempt': fields.boolean('QPIP Exempt'),
+        'cpp_ytd_adj': fields.float('CPP/QPP YTD Adjustment', help="Amount to adjust CPP/QPP for calculations. Used if employee has contributed elsewhere and will be factored in when calculating maximum CPP payment"),
+        'ei_ytd_adj': fields.float('EI YTD Adjustment', help="Amount to adjust EI for calculations. Used if employee has contributed elsewhere and will be factored in when calculating maximum EI payment"),
+        'vac_pay': fields.float('Vacation Pay %', digits=(16,2)),
+        'f1': fields.float('Childcare/Alimony (F1)', digits=(16,2), help="Annual deductions such as child care expenses and support payments, etc., authorized by a tax services office or tax centre"),
+        'f2': fields.float('Alimony/Maint Garnish (F2)', digits=(16,2), help="Alimony or maintenance payments required by a legal document to be payroll-deducted authorized by a tax services office or tax centre"),
+        'hd': fields.float('Prescribed Zone (HD)', digits=(16,2), help="Annual deduction for living in a prescribed zone as indicated on Form TD1"),
+        'lcf': fields.float('Fed Labour sponsored funds (LCF)', digits=(16,2), help="Federal labour-sponsored funds tax credit"),
+        'lcp': fields.float('Prov Labour sponsored funds (LCP)', digits=(16,2), help="Provincial or territorial labour-sponsored funds tax credit"),
+        'f': fields.float('RSP/RPP/RCA (F)', digits=(16,2), help="Payroll deductions for employee contributions to a registered pension plan (RPP), a registered retirement savings plan (RRSP), or a retirement compensation arrangement (RCA)"),
+        'l': fields.float('Extra Tax Deductions (L)', digits=(16,2), help="Extra tax deductions requested for the pay period."),
+        'k3': fields.float('Federal Medical (K3)', digits=(16,2), help="Other federal tax credits, such as medical expenses and charitable donations authorized by a tax services office or tax centre"),
+        'u1': fields.float('Union Dues (U1)', digits=(16,2), help="Union dues"),
+        'y': fields.float('MB/ON Extra Tax Reduction(Y)', digits=(16,2), help="Extra provincial or territorial tax reduction based on applicable amounts reported on the provincial or territorial Form TD1"),
+            }
+
+    _defaults = {
+        'td1f': 1,
+        'td1p': 1,
+        }
+
+hr_employee()
+
+class hr_contract(osv.osv):
+    _inherit = 'hr.contract'
+
+    def _get_pays_per_year(self, cr, uid, ids, names, arg, context=None):
+        """
+        @param ids: ID of contract
+        @return: The number of pays per year
+        """
+        res = {}
+        #FIXME: Should likely pull these values from somewhere else, depending on whether a 52 or 53 year week is used
+        schedule_pay = {
+            'monthly': 12,
+            'quarterly': 4,
+            'semi-annually': 2,
+            'annually': 1,
+            'weekly': 52,
+            'bi-weekly': 26,
+            'bi-monthly': 6,
+            }
+        for contract in self.browse(cr, uid, ids, context):
+            if contract.schedule_pay and schedule_pay.get(contract.schedule_pay, False):
+                res[contract.id] = schedule_pay[contract.schedule_pay]
+
+        return res
+
+    _columns = {
+        'pays_per_year': fields.function(_get_pays_per_year, method=True, string='Pays Per Year', type='float', readonly=True),
+        }
+
+hr_contract()
+
+            
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml'
--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,597 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+        <record id="I" model="hr.salary.rule.category">
+            <field name="name">Taxable Income</field>
+            <field name="code">I</field>
+        </record>
+
+        <record id="CALC" model="hr.salary.rule.category">
+            <field name="code">CALC</field>
+            <field name="name">Standard Calculation</field>
+        </record>
+
+        <record id="FCALC" model="hr.salary.rule.category">
+            <field name="code">FCALC</field>
+            <field name="name">Federal Calculation</field>
+        </record>
+
+        <record id="PCALC" model="hr.salary.rule.category">
+            <field name="code">PCALC</field>
+            <field name="name">Provincial Calculation</field>
+        </record>
+
+        <record id="EMP" model="hr.salary.rule.category">
+            <field name="code">EMP</field>
+            <field name="name">Employer Contribution</field>
+        </record>
+
+        <record id="SDED" model="hr.salary.rule.category">
+            <field name="code">SDED</field>
+            <field name="name">Source Deduction</field>
+            <field name="notes">Used for after tax deductions at source</field>
+        </record>
+
+        <record id="hr_salary_rule_p" model="hr.salary.rule">
+            <field name="name">Pays Per Year</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">P</field>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = contract.pays_per_year or 0</field>
+            <field name="notes">Pays per year from the contract form</field>
+        </record>
+
+        <record id="hr_salary_rule_pocc" model="hr.salary.rule">
+            <field name="name">Payslip Counter(POCC)</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">POCC</field>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">1.0</field>
+            <field name="notes">Sloppy way of counting payslips for use in PR calc</field>
+        </record>
+
+        <record id="hr_salary_rule_cppmax" model="hr.salary.rule">
+            <field name="name">CPP Maximum(CPPMAX)</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">CPPMAX</field>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">2306.70</field>
+            <field name="notes">Annual maximum employee CPP contribution</field>
+        </record>
+
+        <record id="hr_salary_rule_eimax" model="hr.salary.rule">
+            <field name="name">EI Maximum(EIMAX)</field>
+            <field name="sequence" eval="1"/>
+            <field name="code">EIMAX</field>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">839.97</field>
+            <field name="notes">Annual maximum employee EI contribution</field>
+        </record>
+
+        <record id="hr_salary_rule_pr" model="hr.salary.rule">
+            <field name="name">Pays Remaining(PR)</field>
+            <field name="sequence" eval="2"/>
+            <field name="code">PR</field>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = P - payslip.sum('POCC',date_from,date_to)</field>
+        </record>
+
+        <record id="hr_salary_rule_ca_wage" model="hr.salary.rule">
+            <field name="name">Base Pay</field>
+            <field name="sequence" eval="2"/>
+            <field name="code">CAWAGE</field>
+            <field name="category_id" ref="I"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = contract.wage</field>
+        </record>
+
+        <record id="hr_salary_rule_vpay" model="hr.salary.rule">
+            <field name="name">Vacation Pay</field>
+            <field name="sequence" eval="2"/>
+            <field name="code">VPAY</field>
+            <field name="category_id" ref="I"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = categories.I * 0.04</field>
+        </record>
+
+        <record id="hr_salary_rule_i" model="hr.salary.rule">
+            <field name="name">Gross Pay</field>
+            <field name="sequence" eval="40"/>
+            <field name="code">I</field>
+            <field name="category_id" ref="hr_payroll.GROSS"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = categories.I + categories.ALW</field>
+        </record>
+
+        <record id="hr_salary_rule_pi_ytd" model="hr.salary.rule">
+            <field name="name">Pensionable Income YTD(PIYTD)</field>
+            <field eval="45" name="sequence"/>
+            <field name="code">PIYTD</field>
+            <field name="category_id" ref="CALC"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = min(payslip.sum('I',date_from,date_to) + I, 50100)</field>
+        </record>
+
+        <record id="hr_salary_rule_ie_ytd" model="hr.salary.rule">
+            <field name="name">Insurable Income YTD(IEYTD)</field>
+            <field eval="45" name="sequence"/>
+            <field name="code">IEYTD</field>
+            <field name="category_id" ref="CALC"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = min(payslip.sum('I',date_from,date_to) + I, 45900)</field>
+        </record>
+
+        <record id="hr_salary_rule_u1" model="hr.salary.rule">
+            <field name="name">Union Dues(U1)</field>
+            <field name="sequence" eval="50"/>
+            <field name="code">U1</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.u1</field>
+        </record>
+
+        <record id="hr_salary_rule_l" model="hr.salary.rule">
+            <field name="name">Extra Tax Deductions Requested(L)</field>
+            <field name="sequence" eval="50"/>
+            <field name="code">L</field>
+            <field name="category_id" ref="CALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (employee.l + inputs.L.amount) if I else 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_f" model="hr.salary.rule">
+            <field name="name">RSP/RPP/RCA(F)</field>
+            <field eval="60" name="sequence"/>
+            <field name="code">F</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.f or 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_f1" model="hr.salary.rule">
+            <field name="name">Childcare/Alimony(F1)</field>
+            <field eval="60" name="sequence"/>
+            <field name="code">F1</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.f1 or 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_f2" model="hr.salary.rule">
+            <field name="name">Alimony/Maintenance(F2)</field>
+            <field eval="60" name="sequence"/>
+            <field name="code">F2</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.f2 or 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_hd" model="hr.salary.rule">
+            <field name="name">Prescribed Zone(HD)</field>
+            <field eval="60" name="sequence"/>
+            <field name="code">HD</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.hd or 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_a" model="hr.salary.rule">
+            <field name="name">Annual Taxable Income(A)</field>
+            <field eval="101" name="sequence"/>
+            <field name="code">A</field>
+            <field name="category_id" ref="CALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max((P * (I - F - F2 - U1)) - HD - F1, 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_r" model="hr.salary.rule">
+            <field name="name">Annual Federal Tax Rate(R)</field>
+            <field eval="110" name="sequence"/>
+            <field name="code">R</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (A &gt; 132406 and 0.29) or (A &gt; 85424 and 0.26) or (A &gt; 42707 and 0.22) or 0.15</field>
+        </record>
+
+        <record id="hr_salary_rule_c" model="hr.salary.rule">
+            <field name="name">Canada Pension Plan(C)</field>
+            <field eval="140" name="sequence"/>
+            <field name="code">C</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">python</field>
+            <field name="condition_python">result = not employee.cpp_exempt</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+Ccalc = 0.0495 * (I - (3500.0 / P))
+result = max(Ccalc if (Ccalc &lt; (CPPMAX - (payslip.sum('C',date_from,date_to) + employee.cpp_ytd_adj))) else (CPPMAX - (payslip.sum('C',date_from,date_to) + employee.cpp_ytd_adj)), 0)</field>
+        </record>
+
+        <record id="hr_salary_rule_ei" model="hr.salary.rule">
+            <field name="name">Employment Insurance(EI)</field>
+            <field eval="140" name="sequence"/>
+            <field name="code">EI</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">python</field>
+            <field name="condition_python">result = not employee.cpp_exempt</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+EIcalc = 0.0183 * I
+result = max(min(EIcalc, (EIMAX - payslip.sum('EI',date_from,date_to) - employee.ei_ytd_adj)), 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_c_ytd" model="hr.salary.rule">
+            <field name="name">Canada Pension Plan YTD</field>
+            <field eval="145" name="sequence"/>
+            <field name="code">CPPYTD</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('C',date_from,date_to) + C</field>
+        </record>
+
+        <record id="hr_salary_rule_ei_ytd" model="hr.salary.rule">
+            <field name="name">Employment Insurance YTD</field>
+            <field eval="145" name="sequence"/>
+            <field name="code">EIYTD</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('EI',date_from,date_to) + EI</field>
+        </record>
+
+        <record id="hr_salary_rule_empc" model="hr.salary.rule">
+            <field name="name">Employer CPP Contribution(EMPC)</field>
+            <field eval="146" name="sequence"/>
+            <field name="code">EMPC</field>
+            <field name="category_id" ref="EMP"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">python</field>
+            <field name="condition_python">result = not employee.cpp_exempt</field>
+            <field name="amount_select">percentage</field>
+            <field name="amount_percentage_base">I</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_percentage">100.0</field>
+        </record>
+
+        <record id="hr_salary_rule_empei" model="hr.salary.rule">
+            <field name="name">Employer EI Contribution(EMPEI)</field>
+            <field eval="146" name="sequence"/>
+            <field name="code">EMPEI</field>
+            <field name="category_id" ref="EMP"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">python</field>
+            <field name="condition_python">result = not employee.ei_exempt</field>
+            <field name="amount_select">percentage</field>
+            <field name="amount_percentage_base">EI</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_percentage">140.0</field>
+        </record>
+
+        <record id="hr_salary_rule_k" model="hr.salary.rule">
+            <field name="name">Annual Federal Constant(K)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">K</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (A &gt; 132406 and 10378) or (A &gt; 85424 and 6406) or (A &gt; 42707 and 2989) or 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_k1" model="hr.salary.rule">
+            <field name="name">Federal Personal Credit(K1)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">K1</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.td1f == 1 and 1623.30 or employee.td1f == 2 and 1778.40 or employee.td1f == 3 and 2088.60 or employee.td1f == 4 and 2398.80 or employee.td1f == 5 and 2709.00 or employee.td1f == 6 and 3019.20 or employee.td1f == 7 and 3329.40 or employee.td1f == 8 and 3639.60 or employee.td1f == 9 and 3949.80 or employee.td1f == 10 and 4260.00 or employee.td1f == 0 and 0.0</field>
+            <field name="notes">Federal non-refundable personal tax credit.
+Appears on the Employee Form in Canadian Payroll.</field>
+        </record>
+
+        <record id="hr_salary_rule_k2" model="hr.salary.rule">
+            <field name="name">Annual Federal CPP/QPP(K2)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">K2</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (0.15 * min(CPPYTD + (PR * C), CPPMAX)) + (0.15 * min(EIYTD + (PR * EI), EIMAX))</field>
+            <field name="notes">Federal Canada (or Quebec) Pension Plan contributions and employment insurance premiums tax credits for the year.
+Used for calculations only</field>
+        </record>
+
+        <record id="hr_salary_rule_k3" model="hr.salary.rule">
+            <field name="name">Other Federal Tax Credits(K3)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">K3</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.k3 or 0.0</field>
+            <field name="notes">Other federal tax credits (such as medical expenses and charitable donations authorized by a tax services office or tax centre) 
+Appears on the Employee Form in Canadian Payroll.</field>
+        </record>
+
+        <record id="hr_salary_rule_k4" model="hr.salary.rule">
+            <field name="name">Canada Employment Credit(K4)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">K4</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = min(0.15 * A, 0.15 * 1095)</field>
+            <field name="notes">Canada employment credit.
+Used for calculations only</field>
+        </record>
+
+        <record id="hr_salary_rule_tcp" model="hr.salary.rule">
+            <field name="name">Provincial Claim Amount(TCP)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">TCP</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.td1p == 1 and 9405.00 or employee.td1p == 2 and 10418.00 or employee.td1p == 3 and 12444.00 or employee.td1p == 4 and 14470.00 or employee.td1p == 5 and 16496.00 or employee.td1p == 6 and 18522.00 or employee.td1p == 7 and 20548.00 or employee.td1p == 8 and 22574.00 or employee.td1p == 9 and 24600.00 or employee.td1p == 10 and 26626.00 or employee.td1p == 0 and 0.0</field>
+        </record>
+
+        <record id="hr_salary_rule_v" model="hr.salary.rule">
+            <field name="name">Annual Provincial Tax Rate(V)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">V</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (A &gt; 78043 and 0.1116) or (A &gt; 39020 and A &lt;= 78043 and 0.0915) or 0.0505</field>
+        </record>
+
+        <record id="hr_salary_rule_kp" model="hr.salary.rule">
+            <field name="name">Provincial Constant(KP)</field>
+            <field eval="150" name="sequence"/>
+            <field name="code">KP</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (A &gt; 78043 and 3168) or (A &gt; 39020 and A &lt;= 78043 and 1600) or 0</field>
+        </record>
+
+        <record id="hr_salary_rule_k1p" model="hr.salary.rule">
+            <field name="name">Provincial Personal Tax Credit(K1P)</field>
+            <field eval="151" name="sequence"/>
+            <field name="code">K1P</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = 0.0505 * TCP</field>
+        </record>
+
+        <record id="hr_salary_rule_k2p" model="hr.salary.rule">
+            <field name="name">Provincial CPP and EI Tax Credits(K2P)</field>
+            <field eval="151" name="sequence"/>
+            <field name="code">K2P</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (0.0505 * min(CPPYTD + (PR * C), CPPMAX)) + (0.0505 * min(EIYTD + (PR * EI), EIMAX))</field>
+        </record>
+
+        <record id="hr_salary_rule_t4" model="hr.salary.rule">
+            <field name="name">Annual Basic Provincial Tax(T4)</field>
+            <field eval="154" name="sequence"/>
+            <field name="code">T4</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max((V * A) - KP - K1P - K2P, 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_v1" model="hr.salary.rule">
+            <field name="name">Surtax on Basic Provincial Tax(V1)</field>
+            <field eval="155" name="sequence"/>
+            <field name="code">V1</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (T4 &gt; 5392 and (0.20 * (T4 - 4213)) + (0.36 * (T4 - 5392))) or (T4 &gt; 4213 and T4 &lt;= 5392 and (0.20 * (T4 - 4213))) or 0</field>
+        </record>
+
+        <record id="hr_salary_rule_v2" model="hr.salary.rule">
+            <field name="name">Extra Tax for Ontario Health Premium(V2)</field>
+            <field eval="155" name="sequence"/>
+            <field name="code">V2</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = (A &gt; 200000 and min(900, (750 + (0.25 * (A - 200000))))) or (A &gt; 72000 and A &lt;= 200000 and min(750, (600 + (0.25 * (A - 72000))))) or (A &gt; 48000 and A &lt;= 72000 and min(600, (450 + (0.25 * (A - 48000))))) or (A &gt; 36000 and A &lt;= 48000 and min(450, (300 + (0.06 * (A - 36000))))) or (A &gt; 20000 and A &lt;= 36000 and min(300, (0.06 * (A - 20000)))) or 0</field>
+        </record>
+
+        <record id="hr_salary_rule_s" model="hr.salary.rule">
+            <field name="name">Ontario or British Columbia Tax Reduction(S)</field>
+            <field eval="156" name="sequence"/>
+            <field name="code">S</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max(min((2 * (217 + employee.y) - (T4 + V1)), T4 + V1 ), 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_t3" model="hr.salary.rule">
+            <field name="name">Annual Basic Federal Tax(T3)</field>
+            <field eval="170" name="sequence"/>
+            <field name="code">T3</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max((R * A) - K - K1 - K2 - K3 - K4, 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_t1" model="hr.salary.rule">
+            <field name="name">Annual Federal Tax(T1)</field>
+            <field eval="170" name="sequence"/>
+            <field name="code">T1</field>
+            <field name="category_id" ref="FCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max(T3 - employee.lcf, 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_t2" model="hr.salary.rule">
+            <field name="name">Annual Provincial Tax Deduction - Ontario(T2)</field>
+            <field eval="160" name="sequence"/>
+            <field name="code">T2</field>
+            <field name="category_id" ref="PCALC"/>
+            <field eval="0" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = max(T4 + V1 + V2 - S - employee.lcp, 0.0)</field>
+        </record>
+
+        <record id="hr_salary_rule_t" model="hr.salary.rule">
+            <field name="name">Tax Deductions(T)</field>
+            <field eval="190" name="sequence"/>
+            <field name="code">T</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = ((T1 + T2) / P) + L</field>
+        </record>
+
+        <record id="hr_salary_rule_net" model="hr.salary.rule">
+            <field name="name">Net Pay(N)</field>
+            <field eval="200" name="sequence"/>
+            <field name="code">N</field>
+            <field name="category_id" ref="hr_payroll.NET"/>
+            <field eval="1" name="appears_on_payslip"/>
+            <field eval="1" name="active"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = categories.I + categories.ALW - categories.DED - categories.SDED</field>
+        </record>
+
+        <!-- Inputs -->
+        
+        <record id="hr_input_l" model="hr.rule.input">
+            <field name="name">Extra Tax Deductions(L)</field>
+            <field name="code">L</field>
+            <field name="input_id" ref="hr_salary_rule_l"/>
+        </record>
+
+        <!-- Salary Structure -->
+         <record id="hr_structure_cabase" model="hr.payroll.structure">
+            <field name="code">CABASE</field>
+            <field name="name">Ontario Base - Non-Commisioned</field>
+            <field eval="[(6, 0, [ref('hr_salary_rule_p'), ref('hr_salary_rule_pocc'), ref('hr_salary_rule_pr'), ref('hr_salary_rule_cppmax'), ref('hr_salary_rule_eimax'), ref('hr_salary_rule_ca_wage'), ref('hr_salary_rule_vpay'), ref('hr_salary_rule_u1'), ref('hr_salary_rule_l'), ref('hr_salary_rule_hd'), ref('hr_salary_rule_f'), ref('hr_salary_rule_f1'),  ref('hr_salary_rule_f2'), ref('hr_salary_rule_i'), ref('hr_salary_rule_pi_ytd'), ref('hr_salary_rule_ie_ytd'), ref('hr_salary_rule_a'), ref('hr_salary_rule_r'), ref('hr_salary_rule_c'), ref('hr_salary_rule_ei'), ref('hr_salary_rule_c_ytd'), ref('hr_salary_rule_ei_ytd'), ref('hr_salary_rule_empc'), ref('hr_salary_rule_empei'), ref('hr_salary_rule_k'), ref('hr_salary_rule_k1'), ref('hr_salary_rule_k2'), ref('hr_salary_rule_k3'), ref('hr_salary_rule_k4'), ref('hr_salary_rule_tcp'), ref('hr_salary_rule_v'),ref('hr_salary_rule_kp'), ref('hr_salary_rule_k1p'), ref('hr_salary_rule_k2p'), ref('hr_salary_rule_t4'), ref('hr_salary_rule_v1'), ref('hr_salary_rule_v2'), ref('hr_salary_rule_s'), ref('hr_salary_rule_t2'), ref('hr_salary_rule_t1'), ref('hr_salary_rule_t3'), ref('hr_salary_rule_t'), ref('hr_salary_rule_net')])]" name="rule_ids"/>
+        </record>
+
+    </data>
+</openerp>

=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml'
--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+      <!--
+      <record id="hr_payroll_tax_table_form" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.form</field>
+          <field name="model">hr.payroll.tax.table</field>
+          <field name="type">form</field>
+          <field name="arch" type="xml">
+              <form string="Canadian Tax Table">
+                   <field name="name" select="1" readonly="1"/>
+                   <field name="year" select="1" on_change="onchange_year(year,province)"/>
+                   <field name="date_from"/>
+                   <field name="date_to"/>
+                   <field name="fed_prov"/>
+                   <field name="province" attrs="{'readonly': [('fed_prov','!=','provincial')], 'required': [('fed_prov','=','provincial')]}" on_change="onchange_year(year,province)"/>
+                   <field name="line_ids" nolabel="1" colspan="4" widget="one2many_list"/>
+                </form>
+            </field>
+        </record>
+
+        <record id="hr_payroll_tax_table_tree" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.tree</field>
+          <field name="model">hr.payroll.tax.table</field>
+          <field name="type">tree</field>
+          <field name="arch" type="xml">
+              <tree string="Canadian Tax Table">
+                   <field name="name" />
+                   <field name="year" />
+                   <field name="fed_prov"/>
+                   <field name="province" />
+                </tree>
+            </field>
+        </record>
+                
+      <record id="hr_payroll_tax_table_line_form" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.line.form</field>
+          <field name="model">hr.payroll.tax.table.line</field>
+          <field name="type">form</field>
+          <field name="arch" type="xml">
+              <form string="Canadian Tax Table">
+                   <group col="6" colspan="4">
+                       <field name="name" readonly="1"/>
+                       <field name="code" select="1" colspan="1"/>
+                       <field name="inc_from"/>
+                       <field name="inc_to" />
+                       <field name="rate" />
+                   </group>
+                </form>
+            </field>
+        </record>
+
+      <record id="hr_payroll_tax_table_line_tree" model="ir.ui.view">
+          <field name="name">hr.payroll.tax.table.line.tree</field>
+          <field name="model">hr.payroll.tax.table.line</field>
+          <field name="type">tree</field>
+          <field name="arch" type="xml">
+              <tree string="Canadian Tax Table">
+                   <field name="name" readonly="1"/>
+                   <field name="code" select="1" colspan="1"/>
+                   <field name="inc_from"/>
+                   <field name="inc_to" />
+                   <field name="rate" />
+                </tree>
+            </field>
+        </record>
+
+    <record id="action_hr_payroll_tax_table_tree" model="ir.actions.act_window">
+      <field name="name">Canadian Tax Table</field>
+      <field name="res_model">hr.payroll.tax.table</field>
+      <field name="view_type">form</field>
+      <field name="view_mode">tree,form</field>
+      <field name="view_id" ref="hr_payroll_tax_table_tree"/>
+    </record>
+
+    <menuitem id="menu_hr_payroll_tax_table_tree" action="action_hr_payroll_tax_table_tree" parent="hr_payroll.payroll_configure"/>
+    -->
+
+    <record id="hr_employee_view_form_inherit" model="ir.ui.view">
+        <field name="name">hr.employee.view.form.inherit</field>
+        <field name="model">hr.employee</field>
+        <field name="type">form</field>
+        <field name="inherit_id" ref="hr.view_employee_form"/>
+        <field name="arch" type="xml">
+            <notebook position="inside">
+                <page string="Canadian Payroll">
+                    <group colspan="1" col="2">
+                        <separator string="Claim Codes" colspan="2"/>
+                        <field name="td1f" colspan="1"/>
+                        <field name="td1p" colspan="1"/>
+                    </group>
+                    <group colspan="3" col="2">
+                        <separator string="Exemptions" colspan="2"/>
+                        <group colspan="1" col="2">
+                            <field name="ei_ytd_adj"/>
+                            <field name="cpp_ytd_adj"/>
+                        </group>
+                        <group colspan="1" col="2">
+                            <field name="ei_exempt"/>
+                            <field name="cpp_exempt"/>
+                            <field name="qpip_exempt"/>
+                        </group>
+                    </group>
+                    <separator string="Deductions" colspan="4"/>
+                    <field name="f1"/>
+                    <field name="f2"/>
+                    <field name="hd"/>
+                    <field name="lcf"/>
+                    <field name="lcp"/>
+                    <field name="f"/>
+                    <field name="k3"/>
+                    <field name="u1"/>
+                    <field name="y"/>
+                    <field name="l"/>
+                </page>
+            </notebook>
+        </field>
+    </record>
+
+    <!-- Contract View -->
+    <record id="hr_contract_form_inherit" model="ir.ui.view">
+        <field name="name">hr.contract.view.form.inherit</field>
+        <field name="model">hr.contract</field>
+        <field name="type">form</field>
+        <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
+        <field name="arch" type="xml">
+             <xpath expr="/form/notebook/page/group/field[@name='working_hours']" position="after">
+                <field name="pays_per_year"/>
+            </xpath>
+        </field>
+    </record>
+
+    <!-- End Contract View-->
+
+    <!-- Salary Rules - unhide the sequence, not sure why it's invisible -->
+    <record id="hr_salary_rule_list_inherit" model="ir.ui.view">
+        <field name="name">hr.salary.rule.list.inherit</field>
+        <field name="model">hr.salary.rule</field>
+        <field name="type">tree</field>
+        <field name="inherit_id" ref="hr_payroll.hr_salary_rule_list"/>
+        <field name="arch" type="xml">
+            <xpath expr="//field[@name='sequence']" position="replace">
+                <field name="sequence" groups="base.group_extended"/>
+            </xpath>
+        </field>
+    </record>
+
+  </data>
+</openerp>

=== added directory 'l10n_ca_on_hr_payroll/static'
=== added directory 'l10n_ca_on_hr_payroll/static/src'
=== added directory 'l10n_ca_on_hr_payroll/static/src/img'
=== added file 'l10n_ca_on_hr_payroll/static/src/img/icon.png'
Binary files l10n_ca_on_hr_payroll/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_on_hr_payroll/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_qc_hr_payroll'
=== added file 'l10n_ca_qc_hr_payroll/__init__.py'
--- l10n_ca_qc_hr_payroll/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll/__init__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,24 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import l10n_ca_qc_hr_payroll
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_qc_hr_payroll/__openerp__.py'
--- l10n_ca_qc_hr_payroll/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll/__openerp__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,46 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Canada - Quebec - Payroll',
+    'category': 'Localization',
+    'version': '0.1',
+    'license': 'AGPL-3',
+    'category': 'Generic Modules/Human Resources',
+    'description': """
+Quebec Payroll Rules
+==============================
+ * Adds all Quebec Salary Rules
+    """,
+    'author':'Savoir-faire Linux',
+    'website':'http://www.savoirfairelinux.com',
+    'depends': [
+        'l10n_ca_hr_payroll',
+    ],
+    'data': [
+        'l10n_ca_qc_hr_payroll_view.xml',
+        'l10n_ca_qc_hr_payroll_data.xml',
+    ],
+    'test': [],
+    'demo': [],
+    'installable': True,
+    'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py'
--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,38 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+class hr_employee(osv.osv):
+    _name = 'hr.employee'
+    _inherit = 'hr.employee'
+
+    _columns = {
+        'tp10153': fields.float('Source Deductions Return (TP-1015.3)', digits=(16,2), required=True, help="Source Deductions Return"),
+            }
+
+    _defaults = {
+        'tp10153': 10925.00,
+        }
+
+hr_employee()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml'
--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,534 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+	<!-- Quebec Parental Insurance Plan - 120 -->
+
+        <record id="rule_qc_qpip_maxie" model="hr.salary.rule">
+            <field name="name">QPIP - Employee and Employer Maximum Insurable Earnings (QPIPMAXIE)</field>
+            <field name="sequence" eval="120"/>
+            <field name="code">QPIPMAXIE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = min(GROSS,66000)</field>
+        </record>
+
+	<!-- Quebec Parental Insurance Plan - Employee - 121 -->
+
+        <record id="rule_qc_qpip_ee_rate" model="hr.salary.rule">
+            <field name="name">QPIP - Employee Rate - 0.559 % (QPIPRATE)</field>
+            <field name="sequence" eval="121"/>
+            <field name="code">QPIPEERATE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">0.559</field>
+        </record>
+
+        <record id="rule_qc_qpip_ee_maxc" model="hr.salary.rule">
+            <field name="name">QPIP - Employee Maximum Contribution (QPIPEEMAXC)</field>
+            <field name="sequence" eval="122"/>
+            <field name="code">QPIPEEMAXC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPIPMAXIE * QPIPEERATE * 0.01</field>
+        </record>
+
+        <record id="rule_qc_qpip_ee_pytdc" model="hr.salary.rule">
+            <field name="name">QPIP - Employee - Previous Year To Date Contribution (QPIPEEPYTDC)</field>
+            <field name="sequence" eval="122"/>
+            <field name="code">QPIPEEPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('QPIPEEYTDC',date_from,date_to)
+	    </field>
+        </record>
+
+        <record id="rule_qc_qpip_ee_c" model="hr.salary.rule">
+            <field name="name">QPIP - Employee Contribution (QPIPEEC)</field>
+            <field name="sequence" eval="123"/>
+            <field name="code">QPIPEEC</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if (QPIPEEPYTDC > QPIPEEMAXC): 
+    result = 0
+else:
+    if (QPIPEEMAXC - QPIPEEPYTDC - (GROSS * QPIPEERATE * 0.01 / P) &gt;= 0):
+        result = GROSS * QPIPEERATE * 0.01 / P
+    else:
+        result = QPIPEEMAXC - QPIPEEPYTDC
+	    </field>
+        </record>
+
+        <record id="rule_qc_qpip_ee_ytdc" model="hr.salary.rule">
+            <field name="name">QPIP - Employee - Year To Date Contribution (QPIPEEYTDC)</field>
+            <field name="sequence" eval="124"/>
+            <field name="code">QPIPEEYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPIPEEPYTDC + QPIPEEC</field>
+        </record>
+
+	<!-- Quebec Parental Insurance Plan - Employer - 125 -->
+
+        <record id="rule_qc_qpip_er_rate" model="hr.salary.rule">
+            <field name="name">QPIP - Employer Rate - 0.782 % (QPIPERRATE)</field>
+            <field name="sequence" eval="125"/>
+            <field name="code">QPIPERRATE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">0.782</field>
+        </record>
+
+        <record id="rule_qc_qpip_er_maxc" model="hr.salary.rule">
+            <field name="name">QPIP - Employer Maximum Contribution (QPIPERMAXC)</field>
+            <field name="sequence" eval="126"/>
+            <field name="code">QPIPERMAXC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPIPMAXIE * QPIPERRATE * 0.01</field>
+        </record>
+
+        <record id="rule_qc_qpip_er_pytdc" model="hr.salary.rule">
+            <field name="name">QPIP - Employer - Previous Year To Date Contribution (QPIPERPYTDC)</field>
+            <field name="sequence" eval="126"/>
+            <field name="code">QPIPERPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('QPIPERYTDC',date_from,date_to)
+	    </field>
+        </record>
+
+        <record id="rule_qc_qpip_er_c" model="hr.salary.rule">
+            <field name="name">QPIP - Employer Contribution (QPIPERC)</field>
+            <field name="sequence" eval="127"/>
+            <field name="code">QPIPERC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.EMP"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if (QPIPERPYTDC > QPIPERMAXC): 
+    result = 0
+else:
+    if (QPIPERMAXC - QPIPERPYTDC - (GROSS * QPIPERRATE * 0.01 / P) &gt;= 0):
+        result = GROSS * QPIPERRATE * 0.01 / P
+    else:
+        result = QPIPERMAXC - QPIPERPYTDC
+	    </field>
+        </record>
+
+        <record id="rule_qc_qpip_er_ytdc" model="hr.salary.rule">
+            <field name="name">QPIP - Employer - Year To Date Contribution (QPIPERYTDC)</field>
+            <field name="sequence" eval="128"/>
+            <field name="code">QPIPERYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPIPERPYTDC + QPIPERC</field>
+        </record>
+
+	<!-- Quebec Pension Plan - 130 -->
+
+        <record id="rule_qc_qpp_maxie" model="hr.salary.rule">
+            <field name="name">QPP - Employee and Employer Maximum Insurable Earnings (QPPMAXIE)</field>
+            <field name="sequence" eval="130"/>
+            <field name="code">QPPMAXIE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = min(GROSS,55100)</field>
+        </record>
+
+	<!-- Quebec Pension Plan - Employee - 130 -->
+
+        <record id="rule_qc_qpp_ee_rate" model="hr.salary.rule">
+            <field name="name">QPP - Employee - Rate 5.025% (QPPEERATE)</field>
+            <field name="sequence" eval="130"/>
+            <field name="code">QPPEERATE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">5.025</field>
+        </record>
+
+        <record id="rule_qc_qpp_ee_maxc" model="hr.salary.rule">
+            <field name="name">QPP - Employee - Maximum Contribution (QPPEEMAXC)</field>
+            <field name="sequence" eval="131"/>
+            <field name="code">QPPEEMAXC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPPMAXIE * QPPEERATE * 0.01</field>
+        </record>
+
+        <record id="rule_qc_qpp_ee_pytdc" model="hr.salary.rule">
+            <field name="name">QPP - Employee - Previous Year To Date Contribution (QPPEEPYTDC)</field>
+            <field name="sequence" eval="132"/>
+            <field name="code">QPPEEPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('QPPEEYTDC',date_from,date_to)
+            </field>
+        </record>
+
+        <record id="rule_qc_qpp_ee_c" model="hr.salary.rule">
+            <field name="name">QPP - Employee Contribution (QPPEEC)</field>
+            <field name="sequence" eval="133"/>
+            <field name="code">QPPEEC</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if (QPPEEPYTDC > QPPEEMAXC):
+    result = 0
+else:
+    if (QPPEEMAXC - QPPEEPYTDC - (GROSS * QPPEERATE * 0.01 / P) &gt;= 0):
+        result = GROSS * QPPEERATE * 0.01 / P
+    else:
+        result = QPPEEMAXC - QPPEEPYTDC
+            </field>
+        </record>
+
+        <record id="rule_qc_qpp_ee_ytdc" model="hr.salary.rule">
+            <field name="name">QPP - Employee - Year To Date Contribution (QPPEEYTDC)</field>
+            <field name="sequence" eval="134"/>
+            <field name="code">QPPEEYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPPEEPYTDC + QPPEEC</field>
+        </record>
+
+	<!-- Quebec Pension Plan - Employer - 135 -->
+
+        <record id="rule_qc_qpp_er_rate" model="hr.salary.rule">
+            <field name="name">QPP - Employer - Rate 5.025% (QPPERRATE)</field>
+            <field name="sequence" eval="135"/>
+            <field name="code">QPPERRATE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">5.025</field>
+        </record>
+
+        <record id="rule_qc_qpp_er_maxc" model="hr.salary.rule">
+            <field name="name">QPP - Employer - Maximum Contribution (QPPERMAXC)</field>
+            <field name="sequence" eval="136"/>
+            <field name="code">QPPERMAXC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPPMAXIE * QPPERRATE * 0.01</field>
+        </record>
+
+        <record id="rule_qc_qpp_er_pytdc" model="hr.salary.rule">
+            <field name="name">QPP - Employer - Previous Year To Date Contribution (QPPERPYTDC)</field>
+            <field name="sequence" eval="137"/>
+            <field name="code">QPPERPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('QPPERYTDC',date_from,date_to)
+            </field>
+        </record>
+
+        <record id="rule_qc_qpp_er_c" model="hr.salary.rule">
+            <field name="name">QPP - Employer Contribution (QPPERC)</field>
+            <field name="sequence" eval="138"/>
+            <field name="code">QPPERC</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if (QPPERPYTDC > QPPERMAXC):
+    result = 0
+else:
+    if (QPPERMAXC - QPPERPYTDC - (GROSS * QPPERRATE * 0.01 / P) &gt;= 0):
+        result = GROSS * QPPERRATE * 0.01 / P
+    else:
+        result = QPPERMAXC - QPPERPYTDC
+            </field>
+        </record>
+
+        <record id="rule_qc_qpp_er_ytdc" model="hr.salary.rule">
+            <field name="name">QPP - Employer - Year To Date Contribution (QPPERYTDC)</field>
+            <field name="sequence" eval="139"/>
+            <field name="code">QPPERYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = QPPERPYTDC + QPPERC</field>
+        </record>
+
+	<!-- Employment insurance - Employee - 140 -->
+
+        <record id="rule_qc_ei_ee_rate" model="hr.salary.rule">
+            <field name="name">EI - Employee - Rate 1.47% (EIEERATE)</field>
+            <field name="sequence" eval="140"/>
+            <field name="code">EIEERATE</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">fix</field>
+            <field name="quantity">1.0</field>
+            <field name="amount_fix">1.47</field>
+        </record>
+
+        <record id="rule_qc_ei_ee_maxc" model="hr.salary.rule">
+            <field name="name">EI - Employee - Maximum Contribution (EIEEMAXC)</field>
+            <field name="sequence" eval="141"/>
+            <field name="code">EIEEMAXC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = EIMAXIE * EIEERATE * 0.01</field>
+        </record>
+
+        <record id="rule_qc_ei_ee_pytdc" model="hr.salary.rule">
+            <field name="name">EI - Employee - Previous Year To Date Contribution (EIEEPYTDC)</field>
+            <field name="sequence" eval="141"/>
+            <field name="code">EIEEPYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('EIEEYTDC',date_from,date_to)
+            </field>
+        </record>
+
+        <record id="rule_qc_ei_ee_c" model="hr.salary.rule">
+            <field name="name">EI - Employee Contribution (EIEEC)</field>
+            <field name="sequence" eval="142"/>
+            <field name="code">EIEEC</field>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">if (EIEEPYTDC > EIEEMAXC):
+    result = 0
+else:
+    if (EIEEMAXC - EIEEPYTDC - (GROSS * EIEERATE * 0.01 / P) &gt;= 0):
+        result = GROSS * EIEERATE * 0.01 / P
+    else:
+        result = EIEEMAXC - EIEEPYTDC
+</field>
+        </record>
+
+        <record id="rule_qc_ei_ee_ytdc" model="hr.salary.rule">
+            <field name="name">EI - Employee - Year To Date Contribution (EIEEYTDC)</field>
+            <field name="sequence" eval="143"/>
+            <field name="code">EIEEYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = EIEEPYTDC + EIEEC</field>
+        </record>
+
+	<!-- Insurance -  Employee - 150 -->
+
+        <record id="rule_qc_ins_eec" model="hr.salary.rule">
+            <field name="name">Insurance - Employee Contribution (INSEEC)</field>
+            <field name="sequence" eval="150"/>
+            <field name="code">INSEEC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.SDED"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.eeins</field>
+        </record>
+
+        <record id="rule_qc_ins_ee_ytdc" model="hr.salary.rule">
+            <field name="name">Insurance - Employee - Year To Date Contribution (INSEEYTDC)</field>
+            <field name="sequence" eval="151"/>
+            <field name="code">INSEEYTDC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.CALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('INSEEYTDC',date_from,date_to) + INSEEC
+	    </field>
+        </record>
+
+	<!-- Insurance - Employer - 155 -->
+
+        <record id="rule_qc_ins_erc" model="hr.salary.rule">
+            <field name="name">Insurance - Employer Contribution (INSERC)</field>
+            <field name="sequence" eval="150"/>
+            <field name="code">INSERC</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.EMP"/>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = employee.erins</field>
+        </record>
+
+	<!-- Quebec Income Tax - 180 -->
+
+        <record id="rule_qc_qit_ti" model="hr.salary.rule">
+            <field name="name">QIT - Taxable Income (QITTI)</field>
+            <field name="sequence" eval="181"/>
+            <field name="code">QITTI</field>
+            <field name="appears_on_payslip" eval="0"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">result = GROSS - employee.tp10153</field>
+        </record>
+
+        <record id="rule_qc_qit" model="hr.salary.rule">
+            <field name="name">QIT - Quebec Income Tax (QIT)</field>
+            <field name="sequence" eval="182"/>
+            <field name="code">QIT</field>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="category_id" ref="hr_payroll.DED"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">
+if QITTI &gt;= 80200:
+    res = (QITTI - 80200) * 0.24 + 40100 * 0.24 + 40100 * 0.16
+if QITTI &gt;= 40100 and QITTI &lt; 80200:
+    res = (QITTI - 40100) * 0.2 + 40100 * 0.16
+if QITTI &lt; 40100:
+    res = QITTI * 0.16
+result = res / P
+            </field>
+        </record>
+
+        <record id="rule_qc_qit_ytd" model="hr.salary.rule">
+            <field name="name">QIT - Year To Date (QITYTD)</field>
+            <field name="sequence" eval="183"/>
+            <field name="code">QITYTD</field>
+            <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
+            <field name="appears_on_payslip" eval="1"/>
+            <field name="active" eval="1"/>
+            <field name="condition_select">none</field>
+            <field name="amount_select">code</field>
+            <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
+date_to = payslip.date_to
+result = payslip.sum('QITYTD',date_from,date_to) + QIT
+	    </field>
+        </record>
+
+        <!-- Salary Structure -->
+
+         <record id="hr_structure_qc" model="hr.payroll.structure">
+            <field name="code">QC</field>
+            <field name="name">Quebec Base</field>
+            <field name="rule_ids"
+		eval="[(6, 0, [
+		ref('rule_qc_qpip_maxie'),
+		ref('rule_qc_qpip_ee_rate'),
+		ref('rule_qc_qpip_ee_maxc'),
+		ref('rule_qc_qpip_ee_pytdc'),
+		ref('rule_qc_qpip_ee_c'),
+		ref('rule_qc_qpip_ee_ytdc'),
+		ref('rule_qc_qpip_er_rate'),
+		ref('rule_qc_qpip_er_maxc'),
+		ref('rule_qc_qpip_er_pytdc'),
+		ref('rule_qc_qpip_er_c'),
+		ref('rule_qc_qpip_er_ytdc'),
+		ref('rule_qc_qpp_maxie'),
+		ref('rule_qc_qpp_ee_rate'),
+		ref('rule_qc_qpp_ee_maxc'),
+		ref('rule_qc_qpp_ee_pytdc'),
+		ref('rule_qc_qpp_ee_c'),
+		ref('rule_qc_qpp_ee_ytdc'),
+		ref('rule_qc_qpp_er_rate'),
+		ref('rule_qc_qpp_er_maxc'),
+		ref('rule_qc_qpp_er_pytdc'),
+		ref('rule_qc_qpp_er_c'),
+		ref('rule_qc_qpp_er_ytdc'),
+		ref('rule_qc_ins_eec'),
+		ref('rule_qc_ins_erc'),
+		ref('rule_qc_ei_ee_rate'),
+		ref('rule_qc_ei_ee_maxc'),
+		ref('rule_qc_ei_ee_pytdc'),
+		ref('rule_qc_ei_ee_c'),
+		ref('rule_qc_ei_ee_ytdc'),
+		ref('rule_qc_qit_ti'),
+		ref('rule_qc_qit'),
+		ref('rule_qc_qit_ytd')
+		])]"/>
+            <field name="parent_id" ref="l10n_ca_hr_payroll.hr_structure_ca_base"/>
+        </record>
+
+    </data>
+</openerp>

=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml'
--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+  <data>
+
+      <record id="hr_employee_view_form_inherit" model="ir.ui.view">
+          <field name="name">hr.employee.view.form.inherit</field>
+          <field name="model">hr.employee</field>
+          <field name="type">form</field>
+          <field name="inherit_id" ref="l10n_ca_hr_payroll.hr_employee_view_form_inherit"/>
+          <field name="arch" type="xml">
+              <field name="td1" position="after">
+                  <field name="tp10153"/>
+              </field>
+          </field>
+      </record>
+  
+  </data>
+</openerp>

=== added directory 'l10n_ca_qc_hr_payroll/static'
=== added directory 'l10n_ca_qc_hr_payroll/static/src'
=== added directory 'l10n_ca_qc_hr_payroll/static/src/img'
=== added file 'l10n_ca_qc_hr_payroll/static/src/img/icon.png'
Binary files l10n_ca_qc_hr_payroll/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_qc_hr_payroll/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_qc_hr_payroll_account'
=== added file 'l10n_ca_qc_hr_payroll_account/__init__.py'
--- l10n_ca_qc_hr_payroll_account/__init__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll_account/__init__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,22 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_qc_hr_payroll_account/__openerp__.py'
--- l10n_ca_qc_hr_payroll_account/__openerp__.py	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll_account/__openerp__.py	2012-12-21 16:45:28 +0000
@@ -0,0 +1,56 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+#    Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+{
+    'name': 'Canada - Quebec - Payroll Accounting',
+    'category': 'Localization',
+    'version': '0.1',
+    'license': 'AGPL-3',
+    'category': 'Generic Modules/Human Resources',
+    'description': """
+Quebec Payroll Accounting 
+=========================
+
+This module:
+ * creates financial accounts for payroll
+ * updates salary rules with accounting information
+
+    !!! Warning !!!
+
+Make sure to install AND CONFIGURE the canadian chart of accounts module (l10n_ca)
+before installing this module. Chart template needs to be selected to populate
+the account.account table and allow you to link salary rules with the financial 
+account.
+    """,
+    'author':'Savoir-faire Linux',
+    'website':'http:/www.savoirfairelinux.com',
+    'depends': [
+        'l10n_ca_qc_hr_payroll',
+        'l10n_ca_hr_payroll_account',
+    ],
+    'data': [
+        'l10n_ca_qc_hr_payroll_account_data.xml',
+    ],
+    'test': [],
+    'demo': [],
+    'installable': True,
+    'active': False,
+}
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml'
--- l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml	1970-01-01 00:00:00 +0000
+++ l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml	2012-12-21 16:45:28 +0000
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+	<!-- Quebec Parental Insurance Plan -->
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_qpip_ee_c" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51206')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','214231')]"/>
+	</record>
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_qpip_er_c" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51206')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','214232')]"/>
+	</record>
+
+	<!-- Quebec Pension Plan -->
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_qpp_ee_c" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51205')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','214221')]"/>
+	</record>
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_qpp_er_c" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51205')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','214222')]"/>
+	</record>
+
+	<!-- Employment Insurance -->
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_ei_ee_c" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51203')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','214111')]"/>
+	</record>
+
+	<!-- Quebec Tax Income -->
+
+	<record id="l10n_ca_qc_hr_payroll.rule_qc_qit" model="hr.salary.rule">
+	    <field name="account_debit" model='account.account' search="[('code','like','51210')]"/>
+	    <field name="account_credit" model='account.account' search="[('code','like','21426')]"/>
+	</record>
+
+    </data>
+</openerp>

=== added directory 'l10n_ca_qc_hr_payroll_account/static'
=== added directory 'l10n_ca_qc_hr_payroll_account/static/src'
=== added directory 'l10n_ca_qc_hr_payroll_account/static/src/img'
=== added file 'l10n_ca_qc_hr_payroll_account/static/src/img/icon.png'
Binary files l10n_ca_qc_hr_payroll_account/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_qc_hr_payroll_account/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ
=== added directory 'l10n_ca_toponyms/static'
=== added directory 'l10n_ca_toponyms/static/src'
=== added directory 'l10n_ca_toponyms/static/src/img'
=== added file 'l10n_ca_toponyms/static/src/img/icon.png'
Binary files l10n_ca_toponyms/static/src/img/icon.png	1970-01-01 00:00:00 +0000 and l10n_ca_toponyms/static/src/img/icon.png	2012-12-21 16:45:28 +0000 differ

Follow ups