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

Status: Merged
Merged at revision: 5
Proposed branch: lp:~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll
Merge into: lp:openerp-canada/6.1
Diff against target: 2837 lines (+2682/-0)
23 files modified
l10n_ca_hr_payroll/AUTHORS.txt (+4/-0)
l10n_ca_hr_payroll/__init__.py (+24/-0)
l10n_ca_hr_payroll/__openerp__.py (+50/-0)
l10n_ca_hr_payroll/l10n_ca_hr_payroll.py (+260/-0)
l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml (+282/-0)
l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml (+210/-0)
l10n_ca_hr_payroll_account/AUTHORS.txt (+3/-0)
l10n_ca_hr_payroll_account/__init__.py (+22/-0)
l10n_ca_hr_payroll_account/__openerp__.py (+51/-0)
l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml (+31/-0)
l10n_ca_on_hr_payroll/__init__.py (+24/-0)
l10n_ca_on_hr_payroll/__openerp__.py (+52/-0)
l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py (+141/-0)
l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml (+597/-0)
l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml (+149/-0)
l10n_ca_qc_hr_payroll/__init__.py (+24/-0)
l10n_ca_qc_hr_payroll/__openerp__.py (+46/-0)
l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py (+38/-0)
l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml (+534/-0)
l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml (+18/-0)
l10n_ca_qc_hr_payroll_account/__init__.py (+22/-0)
l10n_ca_qc_hr_payroll_account/__openerp__.py (+56/-0)
l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml (+44/-0)
To merge this branch: bzr merge lp:~openerp-canada/openerp-canada/6.1-l10n_ca_hr_payroll
Reviewer Review Type Date Requested Status
Maxime Chambreuil (http://www.savoirfairelinux.com) Approve
Review via email: mp+141101@code.launchpad.net

Description of the change

[ADD] Canadian and Quebec basic payroll rules
[ADD] Canadian and Quebec payroll accounting

To post a comment you must log in.
Revision history for this message
Maxime Chambreuil (http://www.savoirfairelinux.com) (max3903) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'l10n_ca_account_fiscal_position_rule/static'
2=== added directory 'l10n_ca_account_fiscal_position_rule/static/src'
3=== added directory 'l10n_ca_account_fiscal_position_rule/static/src/img'
4=== added file 'l10n_ca_account_fiscal_position_rule/static/src/img/icon.png'
5Binary 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
6=== added directory 'l10n_ca_hr_payroll'
7=== added file 'l10n_ca_hr_payroll/AUTHORS.txt'
8--- l10n_ca_hr_payroll/AUTHORS.txt 1970-01-01 00:00:00 +0000
9+++ l10n_ca_hr_payroll/AUTHORS.txt 2012-12-21 16:45:28 +0000
10@@ -0,0 +1,4 @@
11+Amura Consulting
12+Pierre Lamarche <pierre.lamarche@savoirfairelinux.com>
13+Maxime Chambreuil <maxime.chambreuil@savoirfairelinux.com>
14+Savoir-faire Linux <contact@savoirfairelinux.com>
15
16=== added file 'l10n_ca_hr_payroll/__init__.py'
17--- l10n_ca_hr_payroll/__init__.py 1970-01-01 00:00:00 +0000
18+++ l10n_ca_hr_payroll/__init__.py 2012-12-21 16:45:28 +0000
19@@ -0,0 +1,24 @@
20+#-*- coding:utf-8 -*-
21+##############################################################################
22+#
23+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
24+#
25+# This program is free software: you can redistribute it and/or modify
26+# it under the terms of the GNU Affero General Public License as published
27+# by
28+# the Free Software Foundation, either version 3 of the License, or
29+# (at your option) any later version.
30+#
31+# This program is distributed in the hope that it will be useful,
32+# but WITHOUT ANY WARRANTY; without even the implied warranty of
33+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34+# GNU Affero General Public License for more details.
35+#
36+# You should have received a copy of the GNU Affero General Public License
37+# along with this program. If not, see <http://www.gnu.org/licenses/>.
38+#
39+##############################################################################
40+
41+import l10n_ca_hr_payroll
42+
43+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
44
45=== added file 'l10n_ca_hr_payroll/__openerp__.py'
46--- l10n_ca_hr_payroll/__openerp__.py 1970-01-01 00:00:00 +0000
47+++ l10n_ca_hr_payroll/__openerp__.py 2012-12-21 16:45:28 +0000
48@@ -0,0 +1,50 @@
49+#-*- coding:utf-8 -*-
50+##############################################################################
51+#
52+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
53+#
54+# This program is free software: you can redistribute it and/or modify
55+# it under the terms of the GNU Affero General Public License as published by
56+# the Free Software Foundation, either version 3 of the License, or
57+# (at your option) any later version.
58+#
59+# This program is distributed in the hope that it will be useful,
60+# but WITHOUT ANY WARRANTY; without even the implied warranty of
61+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
62+# GNU Affero General Public License for more details.
63+#
64+# You should have received a copy of the GNU Affero General Public License
65+# along with this program. If not, see <http://www.gnu.org/licenses/>.
66+#
67+##############################################################################
68+{
69+ 'name': 'Canada - Payroll',
70+ 'category': 'Localization',
71+ 'version': '0.1',
72+ 'license': 'AGPL-3',
73+ 'category': 'Generic Modules/Human Resources',
74+ 'description': """
75+Canada Payroll Rules
76+==============================
77+ * Adds Federal Salary Rules
78+ * Adds Federal Salary Structure
79+ * Adds Federal Claim Codes, Deductions and Exemptions on the Employee Form
80+ * Adds 'Pays Per Year' field on the Contract Form
81+ """,
82+ 'author':'OpenERP Canada',
83+ 'website':'http://launchpad.net/openerp-canada',
84+ 'depends': [
85+ 'hr_payroll',
86+ 'l10n_ca_toponyms',
87+ ],
88+ 'data': [
89+ 'l10n_ca_hr_payroll_view.xml',
90+ 'l10n_ca_hr_payroll_data.xml',
91+ ],
92+ 'test': [],
93+ 'demo': [],
94+ 'installable': True,
95+ 'active': False,
96+}
97+
98+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
99
100=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll.py'
101--- l10n_ca_hr_payroll/l10n_ca_hr_payroll.py 1970-01-01 00:00:00 +0000
102+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll.py 2012-12-21 16:45:28 +0000
103@@ -0,0 +1,260 @@
104+#-*- coding:utf-8 -*-
105+##############################################################################
106+#
107+# Copyright (C) 2012 Amura Consulting. All Rights Reserved.
108+#
109+# This program is free software: you can redistribute it and/or modify
110+# it under the terms of the GNU Affero General Public License as published
111+# by
112+# the Free Software Foundation, either version 3 of the License, or
113+# (at your option) any later version.
114+#
115+# This program is distributed in the hope that it will be useful,
116+# but WITHOUT ANY WARRANTY; without even the implied warranty of
117+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
118+# GNU Affero General Public License for more details.
119+#
120+# You should have received a copy of the GNU Affero General Public License
121+# along with this program. If not, see <http://www.gnu.org/licenses/>.
122+#
123+##############################################################################
124+
125+from osv import fields, osv
126+
127+def get_jurisdiction(self, cursor, user_id, context=None):
128+ return (
129+ ('federal', 'Federal'),
130+ ('provincial', 'Provincial'))
131+
132+def get_type(self, cursor, user_id, context=None):
133+ return (
134+ ('federal', 'Federal'),
135+ ('ei', 'Employment Insurance'),
136+ ('qc', 'Quebec'),
137+ ('rqap', 'RQAP / RRQ'),
138+ ('csst', 'CSST'))
139+
140+class hr_payroll_tax_table(osv.osv):
141+ '''
142+ Canadian Tax Payroll Table
143+ '''
144+ _name = 'hr.payroll.tax.table'
145+ _description = 'Canadian Tax Payroll Table'
146+
147+ def onchange_year(self, cr, uid, ids, year, prov=False):
148+ res = {}
149+ res['name'] = 'Tax Table: ' + str(year)
150+ if prov:
151+ prov_obj = self.pool.get('res.country.state').browse(cr, uid, prov)
152+ res['name'] += ' / Provincial - ' + prov_obj.code
153+ else:
154+ res['name'] += ' / Federal'
155+
156+ return {'value': res}
157+
158+ _columns = {
159+ 'name': fields.char('Description', size=128),
160+ 'year': fields.integer('Year', required=True),
161+ 'date_from': fields.date('Date From'),
162+ 'date_to': fields.date('Date To'),
163+ 'jurisdiction': fields.selection(get_jurisdiction, 'Jurisdiction', required=True),
164+ 'state_id': fields.many2one('res.country.state', 'Province'),
165+ 'type': fields.selection(get_type, 'Type', required=True),
166+ 'line_federal_ids': fields.one2many('hr.payroll.tax.table.federal.line', 'table_id', 'Lines'),
167+ 'line_ei_ids': fields.one2many('hr.payroll.tax.table.ei.line', 'table_id', 'Lines'),
168+ 'line_qc_ids': fields.one2many('hr.payroll.tax.table.qc.line', 'table_id', 'Lines'),
169+ 'line_rqap_ids': fields.one2many('hr.payroll.tax.table.rqap.line', 'table_id', 'Lines'),
170+ 'line_csst_ids': fields.one2many('hr.payroll.tax.table.csst.line', 'table_id', 'Lines'),
171+ }
172+
173+ _defaults = {
174+ 'jurisdiction': 'federal',
175+ 'type': 'federal',
176+ }
177+
178+hr_payroll_tax_table()
179+
180+class hr_payroll_tax_table_federal_line(osv.osv):
181+ '''
182+ Federal Lines
183+ '''
184+ _name = 'hr.payroll.tax.table.federal.line'
185+ _description = 'Federal Lines'
186+ _columns = {
187+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
188+ 'inc_from': fields.float('Income From', digits=(16, 2), required=True),
189+ 'inc_to': fields.float('Income To', digits=(16, 2), required=True),
190+ 'code0': fields.float('Code 0', digits=(16, 2)),
191+ 'code1': fields.float('Code 1', digits=(16, 2)),
192+ 'code2': fields.float('Code 2', digits=(16, 2)),
193+ 'code3': fields.float('Code 3', digits=(16, 2)),
194+ 'code4': fields.float('Code 4', digits=(16, 2)),
195+ 'code5': fields.float('Code 5', digits=(16, 2)),
196+ 'code6': fields.float('Code 6', digits=(16, 2)),
197+ 'code7': fields.float('Code 7', digits=(16, 2)),
198+ 'code8': fields.float('Code 8', digits=(16, 2)),
199+ 'code9': fields.float('Code 9', digits=(16, 2)),
200+ 'code10': fields.float('Code 10', digits=(16, 2)),
201+ }
202+
203+ _rec_name = 'inc_from'
204+
205+hr_payroll_tax_table_federal_line()
206+
207+class hr_payroll_tax_table_ei_line(osv.osv):
208+ '''
209+ Employment Insurance Lines
210+ '''
211+ _name = 'hr.payroll.tax.table.ei.line'
212+ _description = 'Employment Insurance Lines'
213+ _columns = {
214+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
215+ 'inc_from': fields.float('Income From', digits=(16, 2), required=True),
216+ 'inc_to': fields.float('Income To', digits=(16, 2), required=True),
217+ 'rate': fields.float('Rate', digits=(16, 2), required=True),
218+ 'max_annual_insurable_earnings': fields.float('Maximum Annual Insurable Earnings', digits=(16, 2), required=True),
219+ }
220+
221+ _rec_name = 'inc_from'
222+
223+hr_payroll_tax_table_ei_line()
224+
225+class hr_payroll_tax_table_qc_line(osv.osv):
226+ '''
227+ Quebec Lines
228+ '''
229+ _name = 'hr.payroll.tax.table.qc.line'
230+ _description = 'Quebec Lines'
231+ _columns = {
232+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
233+ 'inc_from': fields.float('Income From', digits=(16, 2), required=True),
234+ 'inc_to': fields.float('Income To', digits=(16, 2), required=True),
235+ 'code0': fields.float('Code 0', digits=(16, 2)),
236+ 'codeA': fields.float('Code A', digits=(16, 2)),
237+ 'codeB': fields.float('Code B', digits=(16, 2)),
238+ 'codeC': fields.float('Code C', digits=(16, 2)),
239+ 'codeD': fields.float('Code D', digits=(16, 2)),
240+ 'codeE': fields.float('Code E', digits=(16, 2)),
241+ 'codeF': fields.float('Code F', digits=(16, 2)),
242+ 'codeG': fields.float('Code G', digits=(16, 2)),
243+ 'codeH': fields.float('Code H', digits=(16, 2)),
244+ 'codeI': fields.float('Code I', digits=(16, 2)),
245+ 'codeJ': fields.float('Code J', digits=(16, 2)),
246+ 'codeK': fields.float('Code K', digits=(16, 2)),
247+ 'codeL': fields.float('Code L', digits=(16, 2)),
248+ 'codeM': fields.float('Code M', digits=(16, 2)),
249+ 'codeN': fields.float('Code N', digits=(16, 2)),
250+ 'codeY': fields.float('Code Y', digits=(16, 2)),
251+ 'codeZ': fields.float('Code Z', digits=(16, 2)),
252+ }
253+
254+ _rec_name = 'inc_from'
255+
256+hr_payroll_tax_table_qc_line()
257+
258+class hr_payroll_tax_table_rqap_line(osv.osv):
259+ '''
260+ RQAP Lines
261+ '''
262+ _name = 'hr.payroll.tax.table.rqap.line'
263+ _description = 'RQAP Lines'
264+ _columns = {
265+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
266+ 'inc_from': fields.float('Income From', digits=(16, 2), required=True),
267+ 'inc_to': fields.float('Income To', digits=(16, 2), required=True),
268+ 'employee_contrib': fields.float('Employee contribution', digits=(16, 2)),
269+ 'employer_contrib': fields.float('Employer contribution', digits=(16, 2)),
270+ 'max_annual_insurable_earnings': fields.float('Maximum Annual Insurable Earnings', digits=(16, 2)),
271+ }
272+
273+hr_payroll_tax_table_rqap_line()
274+
275+class hr_payroll_tax_table_csst_line(osv.osv):
276+ '''
277+ CSST Lines
278+ '''
279+ _name = 'hr.payroll.tax.table.csst.line'
280+ _description = 'CSST Lines'
281+ _columns = {
282+ 'name': fields.char('Name', size=256, required=True),
283+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
284+ }
285+
286+hr_payroll_tax_table_csst_line()
287+
288+class hr_employee(osv.osv):
289+ _name = 'hr.employee'
290+ _inherit = 'hr.employee'
291+
292+ _columns = {
293+ 'ei_exempt': fields.boolean('EI Exempt'),
294+ '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),
295+ '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),
296+ 'cpp_exempt': fields.boolean('CPP/QPP Exempt'),
297+ 'qpip_exempt': fields.boolean('QPIP Exempt'),
298+ '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"),
299+ '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"),
300+ 'vac_pay': fields.float('Vacation Pay %', digits=(16,2)),
301+ '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"),
302+ '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"),
303+ 'hd': fields.float('Prescribed Zone (HD)', digits=(16,2), help="Annual deduction for living in a prescribed zone as indicated on Form TD1"),
304+ 'lcf': fields.float('Fed Labour sponsored funds (LCF)', digits=(16,2), help="Federal labour-sponsored funds tax credit"),
305+ 'lcp': fields.float('Prov Labour sponsored funds (LCP)', digits=(16,2), help="Provincial or territorial labour-sponsored funds tax credit"),
306+ '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)"),
307+ 'l': fields.float('Extra Tax Deductions (L)', digits=(16,2), help="Extra tax deductions requested for the pay period."),
308+ '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"),
309+ 'u1': fields.float('Union Dues (U1)', digits=(16,2), help="Union dues"),
310+ '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"),
311+ 'td1': fields.float('Personal Tax Credits Return (TD1)', digits=(16,2), required=True, help="Personal Tax Credits Return"),
312+ 'eeins': fields.float('Insurance - Employee Contribution (EeINS)', digits=(16,2), required=True),
313+ 'erins': fields.float('Insurance - Employer Contribution (ErINS)', digits=(16,2), required=True),
314+ }
315+
316+ _defaults = {
317+ 'td1f': 'code1',
318+ 'td1p': 'codeA',
319+ 'td1': 10822.00,
320+ 'eeins': 0.00,
321+ 'erins': 0.00,
322+ }
323+
324+hr_employee()
325+
326+class hr_contract(osv.osv):
327+ _inherit = 'hr.contract'
328+
329+ def _get_pays_per_year(self, cr, uid, ids, names, arg, context=None):
330+ """
331+ @param ids: ID of contract
332+ @return: The number of pays per year
333+ """
334+ res = {}
335+ #FIXME: Should likely pull these values from somewhere else, depending on whether a 52 or 53 year week is used
336+ schedule_pay = {
337+ 'weekly': 52,
338+ 'bi-weekly': 26,
339+ 'monthly': 12,
340+ 'bi-monthly': 6,
341+ 'quarterly': 4,
342+ 'semi-annually': 2,
343+ 'annually': 1,
344+ }
345+ for contract in self.browse(cr, uid, ids, context):
346+ if contract.schedule_pay and schedule_pay.get(contract.schedule_pay, False):
347+ res[contract.id] = schedule_pay[contract.schedule_pay]
348+
349+ return res
350+
351+ _columns = {
352+ 'pays_per_year': fields.function(_get_pays_per_year, method=True, string='Pays Per Year', type='float', readonly=True),
353+ 'weeks_of_vacation': fields.integer('Number of weeks of vacation', required=True),
354+ }
355+
356+ _defaults = {
357+ 'weeks_of_vacation': 2,
358+ }
359+
360+hr_contract()
361+
362+
363+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
364
365=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml'
366--- l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml 1970-01-01 00:00:00 +0000
367+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll_data.xml 2012-12-21 16:45:28 +0000
368@@ -0,0 +1,282 @@
369+<?xml version="1.0" encoding="utf-8"?>
370+<openerp>
371+ <data noupdate="1">
372+
373+ <!-- Salary Rules Category -->
374+
375+ <record id="I" model="hr.salary.rule.category">
376+ <field name="name">Taxable Income</field>
377+ <field name="code">I</field>
378+ </record>
379+
380+ <record id="CALC" model="hr.salary.rule.category">
381+ <field name="code">CALC</field>
382+ <field name="name">Standard Calculation</field>
383+ </record>
384+
385+ <record id="FCALC" model="hr.salary.rule.category">
386+ <field name="code">FCALC</field>
387+ <field name="name">Federal Calculation</field>
388+ </record>
389+
390+ <record id="PCALC" model="hr.salary.rule.category">
391+ <field name="code">PCALC</field>
392+ <field name="name">Provincial Calculation</field>
393+ </record>
394+
395+ <record id="EMP" model="hr.salary.rule.category">
396+ <field name="code">EMP</field>
397+ <field name="name">Employer Contribution</field>
398+ </record>
399+
400+ <record id="SDED" model="hr.salary.rule.category">
401+ <field name="code">SDED</field>
402+ <field name="name">Source Deduction</field>
403+ <field name="note">Used for after tax deductions at source</field>
404+ </record>
405+
406+ <record id="VAC" model="hr.salary.rule.category">
407+ <field name="code">VAC</field>
408+ <field name="name">Vacation Calculation</field>
409+ </record>
410+
411+ <!-- Update salary rules of hr_payroll -->
412+
413+ <record id="hr_payroll.hr_rule_basic" model="hr.salary.rule">
414+ <field name="appears_on_payslip" eval="0"/>
415+ </record>
416+
417+ <record id="hr_payroll.hr_rule_taxable" model="hr.salary.rule">
418+ <field name="appears_on_payslip" eval="0"/>
419+ </record>
420+
421+ <record id="hr_payroll.hr_rule_net" model="hr.salary.rule">
422+ <field name="amount_python_compute">result = BASICP + categories.ALW - categories.DED - categories.SDED</field>
423+ </record>
424+
425+ <!-- Common rules to all canadian salary structures -->
426+
427+ <record id="rule_ca_p" model="hr.salary.rule">
428+ <field name="name">Pays Per Year</field>
429+ <field name="sequence" eval="1"/>
430+ <field name="code">P</field>
431+ <field name="appears_on_payslip" eval="0"/>
432+ <field name="active" eval="1"/>
433+ <field name="category_id" ref="CALC"/>
434+ <field name="condition_select">none</field>
435+ <field name="amount_select">code</field>
436+ <field name="amount_python_compute">result = contract.pays_per_year or 0</field>
437+ <field name="note">Pays per year from the contract form</field>
438+ </record>
439+
440+ <record id="rule_ca_pocc" model="hr.salary.rule">
441+ <field name="name">Payslip Counter (POCC)</field>
442+ <field name="sequence" eval="1"/>
443+ <field name="code">POCC</field>
444+ <field name="appears_on_payslip" eval="0"/>
445+ <field name="active" eval="1"/>
446+ <field name="category_id" ref="CALC"/>
447+ <field name="condition_select">none</field>
448+ <field name="amount_select">fix</field>
449+ <field name="quantity">1.0</field>
450+ <field name="amount_fix">1.0</field>
451+ <field name="note">Sloppy way of counting payslips for use in PR calc</field>
452+ </record>
453+
454+ <record id="rule_ca_basic" model="hr.salary.rule">
455+ <field name="name">Basic per pay (BASICP)</field>
456+ <field name="sequence" eval="10"/>
457+ <field name="code">BASICP</field>
458+ <field name="appears_on_payslip" eval="1"/>
459+ <field name="active" eval="1"/>
460+ <field name="category_id" ref="CALC"/>
461+ <field name="condition_select">none</field>
462+ <field name="amount_select">code</field>
463+ <field name="amount_python_compute">result = BASIC / P</field>
464+ </record>
465+
466+ <record id="rule_ca_gross" model="hr.salary.rule">
467+ <field name="name">Gross per pay (GROSSP)</field>
468+ <field name="sequence" eval="101"/>
469+ <field name="code">GROSSP</field>
470+ <field name="appears_on_payslip" eval="1"/>
471+ <field name="active" eval="1"/>
472+ <field name="category_id" ref="CALC"/>
473+ <field name="condition_select">none</field>
474+ <field name="amount_select">code</field>
475+ <field name="amount_python_compute">result = GROSS / P</field>
476+ </record>
477+
478+ <!-- Employment Insurance - 140 -->
479+
480+ <record id="rule_ca_ei_maxie" model="hr.salary.rule">
481+ <field name="name">EI - Maximum Insurable Earnings (EIMAXIE)</field>
482+ <field name="sequence" eval="140"/>
483+ <field name="code">EIMAXIE</field>
484+ <field name="appears_on_payslip" eval="0"/>
485+ <field name="active" eval="1"/>
486+ <field name="category_id" ref="FCALC"/>
487+ <field name="condition_select">none</field>
488+ <field name="amount_select">code</field>
489+ <field name="amount_python_compute">result = min(GROSS,45900)</field>
490+ </record>
491+
492+ <!-- Employment Insurance - Employer - 145 -->
493+
494+ <record id="rule_ca_ei_er_c" model="hr.salary.rule">
495+ <field name="name">EI - Employer - Contribution (EIERC)</field>
496+ <field name="sequence" eval="145"/>
497+ <field name="code">EIERC</field>
498+ <field name="category_id" ref="EMP"/>
499+ <field name="appears_on_payslip" eval="0"/>
500+ <field name="active" eval="1"/>
501+ <field name="condition_select">python</field>
502+ <field name="condition_python">result = not employee.ei_exempt</field>
503+ <field name="amount_select">percentage</field>
504+ <field name="amount_percentage_base">EIEEC</field>
505+ <field name="quantity">1.0</field>
506+ <field name="amount_percentage">140.0</field>
507+ </record>
508+
509+ <record id="rule_ca_ei_er_pytdc" model="hr.salary.rule">
510+ <field name="name">EI - Employer - Previous Year To Date Contribution (EIERPYTDC)</field>
511+ <field name="sequence" eval="145"/>
512+ <field name="code">EIERPYTDC</field>
513+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
514+ <field name="appears_on_payslip" eval="0"/>
515+ <field name="active" eval="1"/>
516+ <field name="condition_select">none</field>
517+ <field name="amount_select">code</field>
518+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
519+date_to = payslip.date_to
520+result = payslip.sum('EIERYTDC',date_from,date_to)
521+ </field>
522+ </record>
523+
524+ <record id="rule_ca_ei_er_ytdc" model="hr.salary.rule">
525+ <field name="name">EI - Employer - Year To Date Contribution (EIERYTDC)</field>
526+ <field name="sequence" eval="146"/>
527+ <field name="code">EIERYTDC</field>
528+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
529+ <field name="appears_on_payslip" eval="0"/>
530+ <field name="active" eval="1"/>
531+ <field name="condition_select">none</field>
532+ <field name="amount_select">code</field>
533+ <field name="amount_python_compute">result = EIERPYTDC + EIERC</field>
534+ </record>
535+
536+ <!-- Federal Income Tax - 170 -->
537+
538+ <record id="rule_ca_fit_rate" model="hr.salary.rule">
539+ <field name="name">FIT - Rate 16.5% (FITRATE)</field>
540+ <field name="sequence" eval="170"/>
541+ <field name="code">FITRATE</field>
542+ <field name="appears_on_payslip" eval="0"/>
543+ <field name="active" eval="1"/>
544+ <field name="category_id" ref="FCALC"/>
545+ <field name="condition_select">none</field>
546+ <field name="amount_select">fix</field>
547+ <field name="quantity">1.0</field>
548+ <field name="amount_fix">16.5</field>
549+ </record>
550+
551+ <record id="rule_ca_fit_ti" model="hr.salary.rule">
552+ <field name="name">FIT - Taxable Income (FITTI)</field>
553+ <field name="sequence" eval="171"/>
554+ <field name="code">FITTI</field>
555+ <field name="appears_on_payslip" eval="0"/>
556+ <field name="active" eval="1"/>
557+ <field name="category_id" ref="FCALC"/>
558+ <field name="condition_select">none</field>
559+ <field name="amount_select">code</field>
560+ <field name="amount_python_compute">result = GROSS - (employee.td1 + QPIPEEMAXC + QPPEEMAXC + EIEEMAXC) * (1 + FITRATE * 0.01)</field>
561+ </record>
562+
563+ <record id="rule_ca_fit" model="hr.salary.rule">
564+ <field name="name">FIT - Federal Income Tax (FIT)</field>
565+ <field name="sequence" eval="172"/>
566+ <field name="code">FIT</field>
567+ <field name="appears_on_payslip" eval="1"/>
568+ <field name="active" eval="1"/>
569+ <field name="category_id" ref="hr_payroll.DED"/>
570+ <field name="condition_select">none</field>
571+ <field name="amount_select">code</field>
572+ <field name="amount_python_compute">if FITTI &gt;= 132407:
573+ res = (FITTI - 132407) * 0.29 + (132407-85415) * 0.26 + (85414-42708) * 0.22 + 42707 * 0.15
574+if FITTI &gt;= 85415 and FITTI &lt; 132407:
575+ res = (FITTI - 85415) * 0.26 + (85414-42708) * 0.22 + 42707 * 0.15
576+if FITTI &gt;= 42708 and FITTI &lt; 85414:
577+ res = (FITTI - 42708) * 0.22 + 42707 * 0.15
578+if FITTI &lt; 42707:
579+ res = FITTI * 0.15
580+result = res / P
581+ </field>
582+ </record>
583+
584+ <record id="rule_ca_fit_ytd" model="hr.salary.rule">
585+ <field name="name">FIT - Year To Date (FITYTD)</field>
586+ <field name="sequence" eval="173"/>
587+ <field name="code">FITYTD</field>
588+ <field name="category_id" ref="FCALC"/>
589+ <field name="appears_on_payslip" eval="1"/>
590+ <field name="active" eval="1"/>
591+ <field name="condition_select">none</field>
592+ <field name="amount_select">code</field>
593+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
594+date_to = payslip.date_to
595+result = payslip.sum('FITYTD',date_from,date_to) + FIT
596+ </field>
597+ </record>
598+
599+ <!-- Vacation - 210 -->
600+
601+ <record id="rule_ca_vac" model="hr.salary.rule">
602+ <field name="name">Vacation (VAC)</field>
603+ <field name="sequence" eval="210"/>
604+ <field name="code">VAC</field>
605+ <field name="category_id" ref="VAC"/>
606+ <field name="condition_select">none</field>
607+ <field name="amount_select">code</field>
608+ <field name="amount_python_compute">result = GROSSP * contract.weeks_of_vacation * 0.02</field>
609+ </record>
610+
611+ <record id="rule_ca_vac_ytd" model="hr.salary.rule">
612+ <field name="name">Vacation - Year To Date (VACYTD)</field>
613+ <field name="sequence" eval="211"/>
614+ <field name="code">VACYTD</field>
615+ <field name="category_id" ref="VAC"/>
616+ <field name="appears_on_payslip" eval="1"/>
617+ <field name="active" eval="1"/>
618+ <field name="condition_select">none</field>
619+ <field name="amount_select">code</field>
620+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
621+date_to = payslip.date_to
622+result = payslip.sum('VACYTD',date_from,date_to) + VAC
623+ </field>
624+ </record>
625+
626+ <!-- Base for Canadian Salary Structure -->
627+
628+ <record id="hr_structure_ca_base" model="hr.payroll.structure">
629+ <field name="code">CA</field>
630+ <field name="name">Canadian Base</field>
631+ <field eval="[(6, 0, [
632+ ref('rule_ca_p'),
633+ ref('rule_ca_pocc'),
634+ ref('rule_ca_basic'),
635+ ref('rule_ca_gross'),
636+ ref('rule_ca_ei_maxie'),
637+ ref('rule_ca_ei_er_c'),
638+ ref('rule_ca_ei_er_pytdc'),
639+ ref('rule_ca_ei_er_ytdc'),
640+ ref('rule_ca_fit_rate'),
641+ ref('rule_ca_fit_ti'),
642+ ref('rule_ca_fit'),
643+ ref('rule_ca_fit_ytd'),
644+ ref('rule_ca_vac'),
645+ ref('rule_ca_vac_ytd')
646+ ])]" name="rule_ids"/>
647+ </record>
648+
649+ </data>
650+</openerp>
651
652=== added file 'l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml'
653--- l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml 1970-01-01 00:00:00 +0000
654+++ l10n_ca_hr_payroll/l10n_ca_hr_payroll_view.xml 2012-12-21 16:45:28 +0000
655@@ -0,0 +1,210 @@
656+<?xml version="1.0" encoding="utf-8"?>
657+<openerp>
658+ <data>
659+
660+ <record id="hr_payroll_tax_table_form" model="ir.ui.view">
661+ <field name="name">hr.payroll.tax.table.form</field>
662+ <field name="model">hr.payroll.tax.table</field>
663+ <field name="type">form</field>
664+ <field name="arch" type="xml">
665+ <form string="Canadian Tax Table">
666+ <field name="name" select="1"/>
667+ <field name="year" select="1" on_change="onchange_year(year,state_id)"/>
668+ <field name="date_from"/>
669+ <field name="date_to"/>
670+ <field name="jurisdiction"/>
671+ <field name="state_id"
672+ attrs="{'invisible': [('jurisdiction','!=','provincial')], 'required': [('jurisdiction','=','provincial')]}"
673+ on_change="onchange_year(year,state_id)"
674+ domain="[('country_id.code', '=', 'CA')]"/>
675+ <field name="type"/>
676+ <newline/>
677+ <separator colspan="4"/>
678+ <newline/>
679+ <field name="line_federal_ids" nolabel="1" colspan="4" widget="one2many_list"
680+ attrs="{'invisible': [('type','!=','federal')]}">
681+ <tree string="Federal Lines" editable="top">
682+ <field name="inc_from"/>
683+ <field name="inc_to"/>
684+ <field name="code0"/>
685+ <field name="code1"/>
686+ <field name="code2"/>
687+ <field name="code3"/>
688+ <field name="code4"/>
689+ <field name="code5"/>
690+ <field name="code6"/>
691+ <field name="code7"/>
692+ <field name="code8"/>
693+ <field name="code9"/>
694+ <field name="code10"/>
695+ </tree>
696+ </field>
697+ <field name="line_ei_ids" nolabel="1" colspan="4" widget="one2many_list"
698+ attrs="{'invisible': [('type','!=','ei')]}">
699+ <tree string="Employment Insurance Lines" editable="top">
700+ <field name="inc_from"/>
701+ <field name="inc_to"/>
702+ <field name="rate"/>
703+ <field name="max_annual_insurable_earnings"/>
704+ </tree>
705+ </field>
706+ <field name="line_qc_ids" nolabel="1" colspan="4" widget="one2many_list"
707+ attrs="{'invisible': [('type','!=','qc')]}">
708+ <tree string="Quebec Lines" editable="top">
709+ <field name="inc_from"/>
710+ <field name="inc_to"/>
711+ <field name="code0"/>
712+ <field name="codeA"/>
713+ <field name="codeB"/>
714+ <field name="codeC"/>
715+ <field name="codeD"/>
716+ <field name="codeE"/>
717+ <field name="codeF"/>
718+ <field name="codeG"/>
719+ <field name="codeH"/>
720+ <field name="codeI"/>
721+ <field name="codeJ"/>
722+ <field name="codeK"/>
723+ <field name="codeL"/>
724+ <field name="codeM"/>
725+ <field name="codeN"/>
726+ <field name="codeY"/>
727+ <field name="codeZ"/>
728+ </tree>
729+ </field>
730+ <field name="line_rqap_ids" nolabel="1" colspan="4" widget="one2many_list"
731+ attrs="{'invisible': [('type','!=','rqap')]}">
732+ <tree string="RQAP / RRQ Lines" editable="top">
733+ <field name="inc_from"/>
734+ <field name="inc_to"/>
735+ <field name="employee_contrib"/>
736+ <field name="employer_contrib"/>
737+ <field name="max_annual_insurable_earnings"/>
738+ </tree>
739+ </field>
740+ <field name="line_csst_ids" nolabel="1" colspan="4" widget="one2many_list"
741+ attrs="{'invisible': [('type','!=','csst')]}">
742+ <tree string="CSST Lines" editable="top">
743+ <field name="name"/>
744+ </tree>
745+ </field>
746+ </form>
747+ </field>
748+ </record>
749+
750+ <record id="hr_payroll_tax_table_search" model="ir.ui.view">
751+ <field name="name">hr.payroll.tax.table.search</field>
752+ <field name="model">hr.payroll.tax.table</field>
753+ <field name="type">search</field>
754+ <field name="arch" type="xml">
755+ <search string="Canadian Tax Table">
756+ <field name="name"/>
757+ <field name="year"/>
758+ <field name="jurisdiction"/>
759+ <field name="state_id"/>
760+ <field name="type"/>
761+ </search>
762+ </field>
763+ </record>
764+
765+ <record id="hr_payroll_tax_table_tree" model="ir.ui.view">
766+ <field name="name">hr.payroll.tax.table.tree</field>
767+ <field name="model">hr.payroll.tax.table</field>
768+ <field name="type">tree</field>
769+ <field name="arch" type="xml">
770+ <tree string="Canadian Tax Table">
771+ <field name="name"/>
772+ <field name="year"/>
773+ <field name="jurisdiction"/>
774+ <field name="state_id"/>
775+ <field name="type"/>
776+ </tree>
777+ </field>
778+ </record>
779+
780+ <record id="action_hr_payroll_tax_table_tree" model="ir.actions.act_window">
781+ <field name="name">Canadian Tax Table</field>
782+ <field name="res_model">hr.payroll.tax.table</field>
783+ <field name="view_type">form</field>
784+ <field name="view_mode">tree,form</field>
785+ <field name="view_id" ref="hr_payroll_tax_table_tree"/>
786+ <field name="search_view_id" ref="hr_payroll_tax_table_search"/>
787+ </record>
788+
789+ <menuitem id="menu_hr_payroll_tax_table_tree" action="action_hr_payroll_tax_table_tree" parent="hr_payroll.payroll_configure"/>
790+
791+ <record id="hr_employee_view_form_inherit" model="ir.ui.view">
792+ <field name="name">hr.employee.view.form.inherit</field>
793+ <field name="model">hr.employee</field>
794+ <field name="type">form</field>
795+ <field name="inherit_id" ref="hr.view_employee_form"/>
796+ <field name="arch" type="xml">
797+ <notebook position="inside">
798+ <page string="Canadian Payroll">
799+ <group colspan="1" col="2">
800+ <separator string="Claim Codes" colspan="2"/>
801+ <field name="td1f" colspan="1"/>
802+ <field name="td1p" colspan="1"/>
803+ </group>
804+ <group colspan="3" col="2">
805+ <separator string="Exemptions" colspan="2"/>
806+ <group colspan="1" col="2">
807+ <field name="ei_ytd_adj"/>
808+ <field name="cpp_ytd_adj"/>
809+ </group>
810+ <group colspan="1" col="2">
811+ <field name="ei_exempt"/>
812+ <field name="cpp_exempt"/>
813+ <field name="qpip_exempt"/>
814+ </group>
815+ </group>
816+ <separator string="Deductions" colspan="4"/>
817+ <field name="f1"/>
818+ <field name="f2"/>
819+ <field name="hd"/>
820+ <field name="lcf"/>
821+ <field name="lcp"/>
822+ <field name="f"/>
823+ <field name="k3"/>
824+ <field name="u1"/>
825+ <field name="y"/>
826+ <field name="l"/>
827+ <field name="td1"/>
828+ <field name="eeins"/>
829+ <field name="erins"/>
830+ </page>
831+ </notebook>
832+ </field>
833+ </record>
834+
835+ <!-- Contract View -->
836+ <record id="hr_contract_form_inherit" model="ir.ui.view">
837+ <field name="name">hr.contract.view.form.inherit</field>
838+ <field name="model">hr.contract</field>
839+ <field name="type">form</field>
840+ <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
841+ <field name="arch" type="xml">
842+ <xpath expr="/form/notebook/page/group/field[@name='working_hours']" position="after">
843+ <field name="pays_per_year"/>
844+ <field name="weeks_of_vacation"/>
845+ </xpath>
846+ </field>
847+ </record>
848+
849+ <!-- End Contract View-->
850+
851+ <!-- Salary Rules - unhide the sequence, not sure why it's invisible -->
852+ <record id="hr_salary_rule_list_inherit" model="ir.ui.view">
853+ <field name="name">hr.salary.rule.list.inherit</field>
854+ <field name="model">hr.salary.rule</field>
855+ <field name="type">tree</field>
856+ <field name="inherit_id" ref="hr_payroll.hr_salary_rule_list"/>
857+ <field name="arch" type="xml">
858+ <xpath expr="//field[@name='sequence']" position="replace">
859+ <field name="sequence" groups="base.group_extended"/>
860+ </xpath>
861+ </field>
862+ </record>
863+
864+ </data>
865+</openerp>
866
867=== added directory 'l10n_ca_hr_payroll/static'
868=== added directory 'l10n_ca_hr_payroll/static/src'
869=== added directory 'l10n_ca_hr_payroll/static/src/img'
870=== added file 'l10n_ca_hr_payroll/static/src/img/icon.png'
871Binary 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
872=== added directory 'l10n_ca_hr_payroll_account'
873=== added file 'l10n_ca_hr_payroll_account/AUTHORS.txt'
874--- l10n_ca_hr_payroll_account/AUTHORS.txt 1970-01-01 00:00:00 +0000
875+++ l10n_ca_hr_payroll_account/AUTHORS.txt 2012-12-21 16:45:28 +0000
876@@ -0,0 +1,3 @@
877+Pierre Lamarche <pierre.lamarche@savoirfairelinux.com>
878+Maxime Chambreuil <maxime.chambreuil@savoirfairelinux.com>
879+Savoir-faire Linux <contact@savoirfairelinux.com>
880
881=== added file 'l10n_ca_hr_payroll_account/__init__.py'
882--- l10n_ca_hr_payroll_account/__init__.py 1970-01-01 00:00:00 +0000
883+++ l10n_ca_hr_payroll_account/__init__.py 2012-12-21 16:45:28 +0000
884@@ -0,0 +1,22 @@
885+#-*- coding:utf-8 -*-
886+##############################################################################
887+#
888+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
889+#
890+# This program is free software: you can redistribute it and/or modify
891+# it under the terms of the GNU Affero General Public License as published
892+# by
893+# the Free Software Foundation, either version 3 of the License, or
894+# (at your option) any later version.
895+#
896+# This program is distributed in the hope that it will be useful,
897+# but WITHOUT ANY WARRANTY; without even the implied warranty of
898+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
899+# GNU Affero General Public License for more details.
900+#
901+# You should have received a copy of the GNU Affero General Public License
902+# along with this program. If not, see <http://www.gnu.org/licenses/>.
903+#
904+##############################################################################
905+
906+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
907
908=== added file 'l10n_ca_hr_payroll_account/__openerp__.py'
909--- l10n_ca_hr_payroll_account/__openerp__.py 1970-01-01 00:00:00 +0000
910+++ l10n_ca_hr_payroll_account/__openerp__.py 2012-12-21 16:45:28 +0000
911@@ -0,0 +1,51 @@
912+#-*- coding:utf-8 -*-
913+##############################################################################
914+#
915+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
916+#
917+# This program is free software: you can redistribute it and/or modify
918+# it under the terms of the GNU Affero General Public License as published by
919+# the Free Software Foundation, either version 3 of the License, or
920+# (at your option) any later version.
921+#
922+# This program is distributed in the hope that it will be useful,
923+# but WITHOUT ANY WARRANTY; without even the implied warranty of
924+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
925+# GNU Affero General Public License for more details.
926+#
927+# You should have received a copy of the GNU Affero General Public License
928+# along with this program. If not, see <http://www.gnu.org/licenses/>.
929+#
930+##############################################################################
931+{
932+ 'name': 'Canada - Payroll Accounting',
933+ 'category': 'Localization',
934+ 'version': '0.1',
935+ 'license': 'AGPL-3',
936+ 'category': 'Generic Modules/Human Resources',
937+ 'description': """
938+Canada Payroll Accounting
939+=========================
940+
941+This module:
942+ * creates salary journal
943+ * creates financial accounts for payroll
944+ * updates salary rules with accounting information
945+ """,
946+ 'author':'OpenERP Canada',
947+ 'website':'http://launchpad.net/openerp-canada',
948+ 'depends': [
949+ 'l10n_ca',
950+ 'l10n_ca_hr_payroll',
951+ 'hr_payroll_account',
952+ ],
953+ 'data': [
954+ 'l10n_ca_hr_payroll_account_data.xml',
955+ ],
956+ 'test': [],
957+ 'demo': [],
958+ 'installable': True,
959+ 'active': False,
960+}
961+
962+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
963
964=== added file 'l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml'
965--- l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml 1970-01-01 00:00:00 +0000
966+++ l10n_ca_hr_payroll_account/l10n_ca_hr_payroll_account_data.xml 2012-12-21 16:45:28 +0000
967@@ -0,0 +1,31 @@
968+<?xml version="1.0" encoding="utf-8"?>
969+<openerp>
970+ <data noupdate="1">
971+
972+ <!-- Payroll Journal -->
973+
974+ <record id="payroll_journal" model="account.journal">
975+ <field name="name">Payroll Journal</field>
976+ <field name="code">PAYJ</field>
977+ <field name="type">general</field>
978+ <field name="view_id" ref="account.account_journal_view"/>
979+ </record>
980+
981+ <!-- Salary rules -->
982+
983+ <!-- Employment Insurance -->
984+
985+ <record id="l10n_ca_hr_payroll.rule_ca_ei_er_c" model="hr.salary.rule">
986+ <field name="account_debit" model='account.account' search="[('code','like','51203')]"/>
987+ <field name="account_credit" model='account.account' search="[('code','like','214112')]"/>
988+ </record>
989+
990+ <!-- Federal Tax Income -->
991+
992+ <record id="l10n_ca_hr_payroll.rule_ca_fit" model="hr.salary.rule">
993+ <field name="account_debit" model='account.account' search="[('code','like','51209')]"/>
994+ <field name="account_credit" model='account.account' search="[('code','like','21412')]"/>
995+ </record>
996+
997+ </data>
998+</openerp>
999
1000=== added directory 'l10n_ca_hr_payroll_account/static'
1001=== added directory 'l10n_ca_hr_payroll_account/static/src'
1002=== added directory 'l10n_ca_hr_payroll_account/static/src/img'
1003=== added file 'l10n_ca_hr_payroll_account/static/src/img/icon.png'
1004Binary 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
1005=== added directory 'l10n_ca_on_hr_payroll'
1006=== added file 'l10n_ca_on_hr_payroll/__init__.py'
1007--- l10n_ca_on_hr_payroll/__init__.py 1970-01-01 00:00:00 +0000
1008+++ l10n_ca_on_hr_payroll/__init__.py 2012-12-21 16:45:28 +0000
1009@@ -0,0 +1,24 @@
1010+#-*- coding:utf-8 -*-
1011+##############################################################################
1012+#
1013+# Copyright (C) 2012 Amura Consulting. All Rights Reserved.
1014+#
1015+# This program is free software: you can redistribute it and/or modify
1016+# it under the terms of the GNU Affero General Public License as published
1017+# by
1018+# the Free Software Foundation, either version 3 of the License, or
1019+# (at your option) any later version.
1020+#
1021+# This program is distributed in the hope that it will be useful,
1022+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1023+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1024+# GNU Affero General Public License for more details.
1025+#
1026+# You should have received a copy of the GNU Affero General Public License
1027+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1028+#
1029+##############################################################################
1030+
1031+import l10n_ca_on_hr_payroll
1032+
1033+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1034
1035=== added file 'l10n_ca_on_hr_payroll/__openerp__.py'
1036--- l10n_ca_on_hr_payroll/__openerp__.py 1970-01-01 00:00:00 +0000
1037+++ l10n_ca_on_hr_payroll/__openerp__.py 2012-12-21 16:45:28 +0000
1038@@ -0,0 +1,52 @@
1039+#-*- coding:utf-8 -*-
1040+##############################################################################
1041+#
1042+# Copyright (C) 2012 Amura Consulting. All Rights Reserved.
1043+#
1044+# This program is free software: you can redistribute it and/or modify
1045+# it under the terms of the GNU Affero General Public License as published by
1046+# the Free Software Foundation, either version 3 of the License, or
1047+# (at your option) any later version.
1048+#
1049+# This program is distributed in the hope that it will be useful,
1050+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1051+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1052+# GNU Affero General Public License for more details.
1053+#
1054+# You should have received a copy of the GNU Affero General Public License
1055+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1056+#
1057+##############################################################################
1058+{
1059+ 'name': 'Canada - Ontario - Payroll',
1060+ 'category': 'Localization',
1061+ 'version': '0.9',
1062+ 'category': 'Generic Modules/Human Resources',
1063+ 'description': """
1064+Ontario Canadian Payroll Rules
1065+==============================
1066+ * Adds all Federal and Provincial Salary Rules for Ontario
1067+ * Adds Ontario Salary Structure
1068+ * Adds Claim Codes, Deductions and Exemptions on the Employee Form
1069+ * Adds 'Pays Per Year' field on the Contract Form
1070+ """,
1071+ 'author':'Amura Consulting',
1072+ 'website':'http://www.openerp.com',
1073+ 'depends': [
1074+ 'hr_payroll',
1075+ ],
1076+ 'init_xml': [
1077+ ],
1078+ 'update_xml': [
1079+ 'l10n_ca_on_hr_payroll_view.xml',
1080+ 'l10n_ca_on_hr_payroll_data.xml',
1081+ ],
1082+ 'test': [
1083+ ],
1084+ 'demo_xml': [
1085+ ],
1086+ 'installable': True,
1087+ 'active': False,
1088+}
1089+
1090+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1091
1092=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py'
1093--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py 1970-01-01 00:00:00 +0000
1094+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll.py 2012-12-21 16:45:28 +0000
1095@@ -0,0 +1,141 @@
1096+#-*- coding:utf-8 -*-
1097+##############################################################################
1098+#
1099+# Copyright (C) 2012 Amura Consulting. All Rights Reserved.
1100+#
1101+# This program is free software: you can redistribute it and/or modify
1102+# it under the terms of the GNU Affero General Public License as published
1103+# by
1104+# the Free Software Foundation, either version 3 of the License, or
1105+# (at your option) any later version.
1106+#
1107+# This program is distributed in the hope that it will be useful,
1108+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1109+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1110+# GNU Affero General Public License for more details.
1111+#
1112+# You should have received a copy of the GNU Affero General Public License
1113+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1114+#
1115+##############################################################################
1116+
1117+from osv import fields, osv
1118+
1119+"""
1120+class hr_payroll_tax_table(osv.osv):
1121+ '''
1122+ Canadian Tax Payroll Table
1123+ '''
1124+ _name = 'hr.payroll.tax.table'
1125+ _description = 'Canadian Tax Payroll Table'
1126+
1127+ def onchange_year(self, cr, uid, ids, year, prov=False):
1128+ res = {}
1129+ res['name'] = 'Tax Table: ' + str(year)
1130+ if prov:
1131+ prov_obj = self.pool.get('res.country.state').browse(cr, uid, prov)
1132+ res['name'] += ' / Provincial - ' + prov_obj.code
1133+ else:
1134+ res['name'] += ' / Federal'
1135+
1136+ return {'value': res}
1137+
1138+ _columns = {
1139+ 'name': fields.char('Description', size=128),
1140+ 'year': fields.integer('Year', required=True),
1141+ 'date_from': fields.date('Date From'),
1142+ 'date_to': fields.date('Date To'),
1143+ 'fed_prov': fields.selection([
1144+ ('federal','Federal'),
1145+ ('provincial','Provincial')], 'Federal/Provincial', required=True),
1146+ 'province': fields.many2one('res.country.state', 'Province'),
1147+ 'line_ids': fields.one2many('hr.payroll.tax.table.line', 'table_id', 'Lines'),
1148+ }
1149+
1150+ _defaults = {
1151+ 'fed_prov': 'federal',
1152+ }
1153+hr_payroll_tax_table()
1154+
1155+class hr_payroll_tax_table_line(osv.osv):
1156+ '''
1157+ Canadian Tax Payroll Table Lines
1158+ '''
1159+ _name = 'hr.payroll.tax.table.line'
1160+ _description = 'Canadian Tax Payroll Table Lines'
1161+ _columns = {
1162+ 'name': fields.char('Name', size=64),
1163+ 'code': fields.char('Code', size=16),
1164+ 'inc_from': fields.float('Income From', digits=(16, 2)),
1165+ 'inc_to': fields.float('Income To', digits=(16, 2)),
1166+ 'rate': fields.float('Rate', digits=(16, 2)),
1167+ 'table_id': fields.many2one('hr.payroll.tax.table', 'Table'),
1168+ }
1169+hr_payroll_tax_table_line()
1170+"""
1171+
1172+class hr_employee(osv.osv):
1173+ _name = 'hr.employee'
1174+ _inherit = 'hr.employee'
1175+
1176+ _columns = {
1177+ 'ei_exempt': fields.boolean('EI Exempt'),
1178+ '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),
1179+ '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),
1180+ 'cpp_exempt': fields.boolean('CPP/QPP Exempt'),
1181+ 'qpip_exempt': fields.boolean('QPIP Exempt'),
1182+ '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"),
1183+ '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"),
1184+ 'vac_pay': fields.float('Vacation Pay %', digits=(16,2)),
1185+ '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"),
1186+ '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"),
1187+ 'hd': fields.float('Prescribed Zone (HD)', digits=(16,2), help="Annual deduction for living in a prescribed zone as indicated on Form TD1"),
1188+ 'lcf': fields.float('Fed Labour sponsored funds (LCF)', digits=(16,2), help="Federal labour-sponsored funds tax credit"),
1189+ 'lcp': fields.float('Prov Labour sponsored funds (LCP)', digits=(16,2), help="Provincial or territorial labour-sponsored funds tax credit"),
1190+ '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)"),
1191+ 'l': fields.float('Extra Tax Deductions (L)', digits=(16,2), help="Extra tax deductions requested for the pay period."),
1192+ '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"),
1193+ 'u1': fields.float('Union Dues (U1)', digits=(16,2), help="Union dues"),
1194+ '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"),
1195+ }
1196+
1197+ _defaults = {
1198+ 'td1f': 1,
1199+ 'td1p': 1,
1200+ }
1201+
1202+hr_employee()
1203+
1204+class hr_contract(osv.osv):
1205+ _inherit = 'hr.contract'
1206+
1207+ def _get_pays_per_year(self, cr, uid, ids, names, arg, context=None):
1208+ """
1209+ @param ids: ID of contract
1210+ @return: The number of pays per year
1211+ """
1212+ res = {}
1213+ #FIXME: Should likely pull these values from somewhere else, depending on whether a 52 or 53 year week is used
1214+ schedule_pay = {
1215+ 'monthly': 12,
1216+ 'quarterly': 4,
1217+ 'semi-annually': 2,
1218+ 'annually': 1,
1219+ 'weekly': 52,
1220+ 'bi-weekly': 26,
1221+ 'bi-monthly': 6,
1222+ }
1223+ for contract in self.browse(cr, uid, ids, context):
1224+ if contract.schedule_pay and schedule_pay.get(contract.schedule_pay, False):
1225+ res[contract.id] = schedule_pay[contract.schedule_pay]
1226+
1227+ return res
1228+
1229+ _columns = {
1230+ 'pays_per_year': fields.function(_get_pays_per_year, method=True, string='Pays Per Year', type='float', readonly=True),
1231+ }
1232+
1233+hr_contract()
1234+
1235+
1236+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1237
1238=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml'
1239--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml 1970-01-01 00:00:00 +0000
1240+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_data.xml 2012-12-21 16:45:28 +0000
1241@@ -0,0 +1,597 @@
1242+<?xml version="1.0" encoding="utf-8"?>
1243+<openerp>
1244+ <data noupdate="1">
1245+
1246+ <record id="I" model="hr.salary.rule.category">
1247+ <field name="name">Taxable Income</field>
1248+ <field name="code">I</field>
1249+ </record>
1250+
1251+ <record id="CALC" model="hr.salary.rule.category">
1252+ <field name="code">CALC</field>
1253+ <field name="name">Standard Calculation</field>
1254+ </record>
1255+
1256+ <record id="FCALC" model="hr.salary.rule.category">
1257+ <field name="code">FCALC</field>
1258+ <field name="name">Federal Calculation</field>
1259+ </record>
1260+
1261+ <record id="PCALC" model="hr.salary.rule.category">
1262+ <field name="code">PCALC</field>
1263+ <field name="name">Provincial Calculation</field>
1264+ </record>
1265+
1266+ <record id="EMP" model="hr.salary.rule.category">
1267+ <field name="code">EMP</field>
1268+ <field name="name">Employer Contribution</field>
1269+ </record>
1270+
1271+ <record id="SDED" model="hr.salary.rule.category">
1272+ <field name="code">SDED</field>
1273+ <field name="name">Source Deduction</field>
1274+ <field name="notes">Used for after tax deductions at source</field>
1275+ </record>
1276+
1277+ <record id="hr_salary_rule_p" model="hr.salary.rule">
1278+ <field name="name">Pays Per Year</field>
1279+ <field name="sequence" eval="1"/>
1280+ <field name="code">P</field>
1281+ <field eval="0" name="appears_on_payslip"/>
1282+ <field eval="1" name="active"/>
1283+ <field name="category_id" ref="CALC"/>
1284+ <field name="condition_select">none</field>
1285+ <field name="amount_select">code</field>
1286+ <field name="amount_python_compute">result = contract.pays_per_year or 0</field>
1287+ <field name="notes">Pays per year from the contract form</field>
1288+ </record>
1289+
1290+ <record id="hr_salary_rule_pocc" model="hr.salary.rule">
1291+ <field name="name">Payslip Counter(POCC)</field>
1292+ <field name="sequence" eval="1"/>
1293+ <field name="code">POCC</field>
1294+ <field eval="0" name="appears_on_payslip"/>
1295+ <field eval="1" name="active"/>
1296+ <field name="category_id" ref="CALC"/>
1297+ <field name="condition_select">none</field>
1298+ <field name="amount_select">fix</field>
1299+ <field name="quantity">1.0</field>
1300+ <field name="amount_fix">1.0</field>
1301+ <field name="notes">Sloppy way of counting payslips for use in PR calc</field>
1302+ </record>
1303+
1304+ <record id="hr_salary_rule_cppmax" model="hr.salary.rule">
1305+ <field name="name">CPP Maximum(CPPMAX)</field>
1306+ <field name="sequence" eval="1"/>
1307+ <field name="code">CPPMAX</field>
1308+ <field eval="0" name="appears_on_payslip"/>
1309+ <field eval="1" name="active"/>
1310+ <field name="category_id" ref="CALC"/>
1311+ <field name="condition_select">none</field>
1312+ <field name="amount_select">fix</field>
1313+ <field name="quantity">1.0</field>
1314+ <field name="amount_fix">2306.70</field>
1315+ <field name="notes">Annual maximum employee CPP contribution</field>
1316+ </record>
1317+
1318+ <record id="hr_salary_rule_eimax" model="hr.salary.rule">
1319+ <field name="name">EI Maximum(EIMAX)</field>
1320+ <field name="sequence" eval="1"/>
1321+ <field name="code">EIMAX</field>
1322+ <field eval="0" name="appears_on_payslip"/>
1323+ <field eval="1" name="active"/>
1324+ <field name="category_id" ref="CALC"/>
1325+ <field name="condition_select">none</field>
1326+ <field name="amount_select">fix</field>
1327+ <field name="quantity">1.0</field>
1328+ <field name="amount_fix">839.97</field>
1329+ <field name="notes">Annual maximum employee EI contribution</field>
1330+ </record>
1331+
1332+ <record id="hr_salary_rule_pr" model="hr.salary.rule">
1333+ <field name="name">Pays Remaining(PR)</field>
1334+ <field name="sequence" eval="2"/>
1335+ <field name="code">PR</field>
1336+ <field eval="0" name="appears_on_payslip"/>
1337+ <field eval="1" name="active"/>
1338+ <field name="category_id" ref="CALC"/>
1339+ <field name="condition_select">none</field>
1340+ <field name="amount_select">code</field>
1341+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1342+date_to = payslip.date_to
1343+result = P - payslip.sum('POCC',date_from,date_to)</field>
1344+ </record>
1345+
1346+ <record id="hr_salary_rule_ca_wage" model="hr.salary.rule">
1347+ <field name="name">Base Pay</field>
1348+ <field name="sequence" eval="2"/>
1349+ <field name="code">CAWAGE</field>
1350+ <field name="category_id" ref="I"/>
1351+ <field name="condition_select">none</field>
1352+ <field name="amount_select">code</field>
1353+ <field name="amount_python_compute">result = contract.wage</field>
1354+ </record>
1355+
1356+ <record id="hr_salary_rule_vpay" model="hr.salary.rule">
1357+ <field name="name">Vacation Pay</field>
1358+ <field name="sequence" eval="2"/>
1359+ <field name="code">VPAY</field>
1360+ <field name="category_id" ref="I"/>
1361+ <field name="condition_select">none</field>
1362+ <field name="amount_select">code</field>
1363+ <field name="amount_python_compute">result = categories.I * 0.04</field>
1364+ </record>
1365+
1366+ <record id="hr_salary_rule_i" model="hr.salary.rule">
1367+ <field name="name">Gross Pay</field>
1368+ <field name="sequence" eval="40"/>
1369+ <field name="code">I</field>
1370+ <field name="category_id" ref="hr_payroll.GROSS"/>
1371+ <field name="condition_select">none</field>
1372+ <field name="amount_select">code</field>
1373+ <field name="amount_python_compute">result = categories.I + categories.ALW</field>
1374+ </record>
1375+
1376+ <record id="hr_salary_rule_pi_ytd" model="hr.salary.rule">
1377+ <field name="name">Pensionable Income YTD(PIYTD)</field>
1378+ <field eval="45" name="sequence"/>
1379+ <field name="code">PIYTD</field>
1380+ <field name="category_id" ref="CALC"/>
1381+ <field eval="1" name="appears_on_payslip"/>
1382+ <field eval="1" name="active"/>
1383+ <field name="condition_select">none</field>
1384+ <field name="amount_select">code</field>
1385+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1386+date_to = payslip.date_to
1387+result = min(payslip.sum('I',date_from,date_to) + I, 50100)</field>
1388+ </record>
1389+
1390+ <record id="hr_salary_rule_ie_ytd" model="hr.salary.rule">
1391+ <field name="name">Insurable Income YTD(IEYTD)</field>
1392+ <field eval="45" name="sequence"/>
1393+ <field name="code">IEYTD</field>
1394+ <field name="category_id" ref="CALC"/>
1395+ <field eval="1" name="appears_on_payslip"/>
1396+ <field eval="1" name="active"/>
1397+ <field name="condition_select">none</field>
1398+ <field name="amount_select">code</field>
1399+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1400+date_to = payslip.date_to
1401+result = min(payslip.sum('I',date_from,date_to) + I, 45900)</field>
1402+ </record>
1403+
1404+ <record id="hr_salary_rule_u1" model="hr.salary.rule">
1405+ <field name="name">Union Dues(U1)</field>
1406+ <field name="sequence" eval="50"/>
1407+ <field name="code">U1</field>
1408+ <field name="category_id" ref="hr_payroll.DED"/>
1409+ <field name="condition_select">none</field>
1410+ <field name="amount_select">code</field>
1411+ <field name="amount_python_compute">result = employee.u1</field>
1412+ </record>
1413+
1414+ <record id="hr_salary_rule_l" model="hr.salary.rule">
1415+ <field name="name">Extra Tax Deductions Requested(L)</field>
1416+ <field name="sequence" eval="50"/>
1417+ <field name="code">L</field>
1418+ <field name="category_id" ref="CALC"/>
1419+ <field name="condition_select">none</field>
1420+ <field name="amount_select">code</field>
1421+ <field name="amount_python_compute">result = (employee.l + inputs.L.amount) if I else 0.0</field>
1422+ </record>
1423+
1424+ <record id="hr_salary_rule_f" model="hr.salary.rule">
1425+ <field name="name">RSP/RPP/RCA(F)</field>
1426+ <field eval="60" name="sequence"/>
1427+ <field name="code">F</field>
1428+ <field name="category_id" ref="hr_payroll.DED"/>
1429+ <field eval="1" name="appears_on_payslip"/>
1430+ <field eval="1" name="active"/>
1431+ <field name="condition_select">none</field>
1432+ <field name="amount_select">code</field>
1433+ <field name="amount_python_compute">result = employee.f or 0.0</field>
1434+ </record>
1435+
1436+ <record id="hr_salary_rule_f1" model="hr.salary.rule">
1437+ <field name="name">Childcare/Alimony(F1)</field>
1438+ <field eval="60" name="sequence"/>
1439+ <field name="code">F1</field>
1440+ <field name="category_id" ref="hr_payroll.DED"/>
1441+ <field eval="1" name="appears_on_payslip"/>
1442+ <field eval="1" name="active"/>
1443+ <field name="condition_select">none</field>
1444+ <field name="amount_select">code</field>
1445+ <field name="amount_python_compute">result = employee.f1 or 0.0</field>
1446+ </record>
1447+
1448+ <record id="hr_salary_rule_f2" model="hr.salary.rule">
1449+ <field name="name">Alimony/Maintenance(F2)</field>
1450+ <field eval="60" name="sequence"/>
1451+ <field name="code">F2</field>
1452+ <field name="category_id" ref="hr_payroll.DED"/>
1453+ <field eval="1" name="appears_on_payslip"/>
1454+ <field eval="1" name="active"/>
1455+ <field name="condition_select">none</field>
1456+ <field name="amount_select">code</field>
1457+ <field name="amount_python_compute">result = employee.f2 or 0.0</field>
1458+ </record>
1459+
1460+ <record id="hr_salary_rule_hd" model="hr.salary.rule">
1461+ <field name="name">Prescribed Zone(HD)</field>
1462+ <field eval="60" name="sequence"/>
1463+ <field name="code">HD</field>
1464+ <field name="category_id" ref="hr_payroll.DED"/>
1465+ <field eval="1" name="appears_on_payslip"/>
1466+ <field eval="1" name="active"/>
1467+ <field name="condition_select">none</field>
1468+ <field name="amount_select">code</field>
1469+ <field name="amount_python_compute">result = employee.hd or 0.0</field>
1470+ </record>
1471+
1472+ <record id="hr_salary_rule_a" model="hr.salary.rule">
1473+ <field name="name">Annual Taxable Income(A)</field>
1474+ <field eval="101" name="sequence"/>
1475+ <field name="code">A</field>
1476+ <field name="category_id" ref="CALC"/>
1477+ <field eval="0" name="appears_on_payslip"/>
1478+ <field eval="1" name="active"/>
1479+ <field name="condition_select">none</field>
1480+ <field name="amount_select">code</field>
1481+ <field name="amount_python_compute">result = max((P * (I - F - F2 - U1)) - HD - F1, 0.0)</field>
1482+ </record>
1483+
1484+ <record id="hr_salary_rule_r" model="hr.salary.rule">
1485+ <field name="name">Annual Federal Tax Rate(R)</field>
1486+ <field eval="110" name="sequence"/>
1487+ <field name="code">R</field>
1488+ <field name="category_id" ref="FCALC"/>
1489+ <field eval="0" name="appears_on_payslip"/>
1490+ <field eval="1" name="active"/>
1491+ <field name="condition_select">none</field>
1492+ <field name="amount_select">code</field>
1493+ <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>
1494+ </record>
1495+
1496+ <record id="hr_salary_rule_c" model="hr.salary.rule">
1497+ <field name="name">Canada Pension Plan(C)</field>
1498+ <field eval="140" name="sequence"/>
1499+ <field name="code">C</field>
1500+ <field name="category_id" ref="hr_payroll.DED"/>
1501+ <field eval="1" name="appears_on_payslip"/>
1502+ <field eval="1" name="active"/>
1503+ <field name="condition_select">python</field>
1504+ <field name="condition_python">result = not employee.cpp_exempt</field>
1505+ <field name="amount_select">code</field>
1506+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1507+date_to = payslip.date_to
1508+Ccalc = 0.0495 * (I - (3500.0 / P))
1509+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>
1510+ </record>
1511+
1512+ <record id="hr_salary_rule_ei" model="hr.salary.rule">
1513+ <field name="name">Employment Insurance(EI)</field>
1514+ <field eval="140" name="sequence"/>
1515+ <field name="code">EI</field>
1516+ <field name="category_id" ref="hr_payroll.DED"/>
1517+ <field eval="1" name="appears_on_payslip"/>
1518+ <field eval="1" name="active"/>
1519+ <field name="condition_select">python</field>
1520+ <field name="condition_python">result = not employee.cpp_exempt</field>
1521+ <field name="amount_select">code</field>
1522+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1523+date_to = payslip.date_to
1524+EIcalc = 0.0183 * I
1525+result = max(min(EIcalc, (EIMAX - payslip.sum('EI',date_from,date_to) - employee.ei_ytd_adj)), 0.0)</field>
1526+ </record>
1527+
1528+ <record id="hr_salary_rule_c_ytd" model="hr.salary.rule">
1529+ <field name="name">Canada Pension Plan YTD</field>
1530+ <field eval="145" name="sequence"/>
1531+ <field name="code">CPPYTD</field>
1532+ <field name="category_id" ref="FCALC"/>
1533+ <field eval="1" name="appears_on_payslip"/>
1534+ <field eval="1" name="active"/>
1535+ <field name="condition_select">none</field>
1536+ <field name="amount_select">code</field>
1537+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1538+date_to = payslip.date_to
1539+result = payslip.sum('C',date_from,date_to) + C</field>
1540+ </record>
1541+
1542+ <record id="hr_salary_rule_ei_ytd" model="hr.salary.rule">
1543+ <field name="name">Employment Insurance YTD</field>
1544+ <field eval="145" name="sequence"/>
1545+ <field name="code">EIYTD</field>
1546+ <field name="category_id" ref="FCALC"/>
1547+ <field eval="1" name="appears_on_payslip"/>
1548+ <field eval="1" name="active"/>
1549+ <field name="condition_select">none</field>
1550+ <field name="amount_select">code</field>
1551+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
1552+date_to = payslip.date_to
1553+result = payslip.sum('EI',date_from,date_to) + EI</field>
1554+ </record>
1555+
1556+ <record id="hr_salary_rule_empc" model="hr.salary.rule">
1557+ <field name="name">Employer CPP Contribution(EMPC)</field>
1558+ <field eval="146" name="sequence"/>
1559+ <field name="code">EMPC</field>
1560+ <field name="category_id" ref="EMP"/>
1561+ <field eval="0" name="appears_on_payslip"/>
1562+ <field eval="1" name="active"/>
1563+ <field name="condition_select">python</field>
1564+ <field name="condition_python">result = not employee.cpp_exempt</field>
1565+ <field name="amount_select">percentage</field>
1566+ <field name="amount_percentage_base">I</field>
1567+ <field name="quantity">1.0</field>
1568+ <field name="amount_percentage">100.0</field>
1569+ </record>
1570+
1571+ <record id="hr_salary_rule_empei" model="hr.salary.rule">
1572+ <field name="name">Employer EI Contribution(EMPEI)</field>
1573+ <field eval="146" name="sequence"/>
1574+ <field name="code">EMPEI</field>
1575+ <field name="category_id" ref="EMP"/>
1576+ <field eval="0" name="appears_on_payslip"/>
1577+ <field eval="1" name="active"/>
1578+ <field name="condition_select">python</field>
1579+ <field name="condition_python">result = not employee.ei_exempt</field>
1580+ <field name="amount_select">percentage</field>
1581+ <field name="amount_percentage_base">EI</field>
1582+ <field name="quantity">1.0</field>
1583+ <field name="amount_percentage">140.0</field>
1584+ </record>
1585+
1586+ <record id="hr_salary_rule_k" model="hr.salary.rule">
1587+ <field name="name">Annual Federal Constant(K)</field>
1588+ <field eval="150" name="sequence"/>
1589+ <field name="code">K</field>
1590+ <field name="category_id" ref="FCALC"/>
1591+ <field eval="0" name="appears_on_payslip"/>
1592+ <field eval="1" name="active"/>
1593+ <field name="condition_select">none</field>
1594+ <field name="amount_select">code</field>
1595+ <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>
1596+ </record>
1597+
1598+ <record id="hr_salary_rule_k1" model="hr.salary.rule">
1599+ <field name="name">Federal Personal Credit(K1)</field>
1600+ <field eval="150" name="sequence"/>
1601+ <field name="code">K1</field>
1602+ <field name="category_id" ref="FCALC"/>
1603+ <field eval="0" name="appears_on_payslip"/>
1604+ <field eval="1" name="active"/>
1605+ <field name="condition_select">none</field>
1606+ <field name="amount_select">code</field>
1607+ <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>
1608+ <field name="notes">Federal non-refundable personal tax credit.
1609+Appears on the Employee Form in Canadian Payroll.</field>
1610+ </record>
1611+
1612+ <record id="hr_salary_rule_k2" model="hr.salary.rule">
1613+ <field name="name">Annual Federal CPP/QPP(K2)</field>
1614+ <field eval="150" name="sequence"/>
1615+ <field name="code">K2</field>
1616+ <field name="category_id" ref="FCALC"/>
1617+ <field eval="0" name="appears_on_payslip"/>
1618+ <field eval="1" name="active"/>
1619+ <field name="condition_select">none</field>
1620+ <field name="amount_select">code</field>
1621+ <field name="amount_python_compute">result = (0.15 * min(CPPYTD + (PR * C), CPPMAX)) + (0.15 * min(EIYTD + (PR * EI), EIMAX))</field>
1622+ <field name="notes">Federal Canada (or Quebec) Pension Plan contributions and employment insurance premiums tax credits for the year.
1623+Used for calculations only</field>
1624+ </record>
1625+
1626+ <record id="hr_salary_rule_k3" model="hr.salary.rule">
1627+ <field name="name">Other Federal Tax Credits(K3)</field>
1628+ <field eval="150" name="sequence"/>
1629+ <field name="code">K3</field>
1630+ <field name="category_id" ref="FCALC"/>
1631+ <field eval="0" name="appears_on_payslip"/>
1632+ <field eval="1" name="active"/>
1633+ <field name="condition_select">none</field>
1634+ <field name="amount_select">code</field>
1635+ <field name="amount_python_compute">result = employee.k3 or 0.0</field>
1636+ <field name="notes">Other federal tax credits (such as medical expenses and charitable donations authorized by a tax services office or tax centre)
1637+Appears on the Employee Form in Canadian Payroll.</field>
1638+ </record>
1639+
1640+ <record id="hr_salary_rule_k4" model="hr.salary.rule">
1641+ <field name="name">Canada Employment Credit(K4)</field>
1642+ <field eval="150" name="sequence"/>
1643+ <field name="code">K4</field>
1644+ <field name="category_id" ref="FCALC"/>
1645+ <field eval="0" name="appears_on_payslip"/>
1646+ <field eval="1" name="active"/>
1647+ <field name="condition_select">none</field>
1648+ <field name="amount_select">code</field>
1649+ <field name="amount_python_compute">result = min(0.15 * A, 0.15 * 1095)</field>
1650+ <field name="notes">Canada employment credit.
1651+Used for calculations only</field>
1652+ </record>
1653+
1654+ <record id="hr_salary_rule_tcp" model="hr.salary.rule">
1655+ <field name="name">Provincial Claim Amount(TCP)</field>
1656+ <field eval="150" name="sequence"/>
1657+ <field name="code">TCP</field>
1658+ <field name="category_id" ref="PCALC"/>
1659+ <field eval="0" name="appears_on_payslip"/>
1660+ <field eval="1" name="active"/>
1661+ <field name="condition_select">none</field>
1662+ <field name="amount_select">code</field>
1663+ <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>
1664+ </record>
1665+
1666+ <record id="hr_salary_rule_v" model="hr.salary.rule">
1667+ <field name="name">Annual Provincial Tax Rate(V)</field>
1668+ <field eval="150" name="sequence"/>
1669+ <field name="code">V</field>
1670+ <field name="category_id" ref="PCALC"/>
1671+ <field eval="0" name="appears_on_payslip"/>
1672+ <field eval="1" name="active"/>
1673+ <field name="condition_select">none</field>
1674+ <field name="amount_select">code</field>
1675+ <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>
1676+ </record>
1677+
1678+ <record id="hr_salary_rule_kp" model="hr.salary.rule">
1679+ <field name="name">Provincial Constant(KP)</field>
1680+ <field eval="150" name="sequence"/>
1681+ <field name="code">KP</field>
1682+ <field name="category_id" ref="PCALC"/>
1683+ <field eval="0" name="appears_on_payslip"/>
1684+ <field eval="1" name="active"/>
1685+ <field name="condition_select">none</field>
1686+ <field name="amount_select">code</field>
1687+ <field name="amount_python_compute">result = (A &gt; 78043 and 3168) or (A &gt; 39020 and A &lt;= 78043 and 1600) or 0</field>
1688+ </record>
1689+
1690+ <record id="hr_salary_rule_k1p" model="hr.salary.rule">
1691+ <field name="name">Provincial Personal Tax Credit(K1P)</field>
1692+ <field eval="151" name="sequence"/>
1693+ <field name="code">K1P</field>
1694+ <field name="category_id" ref="PCALC"/>
1695+ <field eval="0" name="appears_on_payslip"/>
1696+ <field eval="1" name="active"/>
1697+ <field name="condition_select">none</field>
1698+ <field name="amount_select">code</field>
1699+ <field name="amount_python_compute">result = 0.0505 * TCP</field>
1700+ </record>
1701+
1702+ <record id="hr_salary_rule_k2p" model="hr.salary.rule">
1703+ <field name="name">Provincial CPP and EI Tax Credits(K2P)</field>
1704+ <field eval="151" name="sequence"/>
1705+ <field name="code">K2P</field>
1706+ <field name="category_id" ref="PCALC"/>
1707+ <field eval="0" name="appears_on_payslip"/>
1708+ <field eval="1" name="active"/>
1709+ <field name="condition_select">none</field>
1710+ <field name="amount_select">code</field>
1711+ <field name="amount_python_compute">result = (0.0505 * min(CPPYTD + (PR * C), CPPMAX)) + (0.0505 * min(EIYTD + (PR * EI), EIMAX))</field>
1712+ </record>
1713+
1714+ <record id="hr_salary_rule_t4" model="hr.salary.rule">
1715+ <field name="name">Annual Basic Provincial Tax(T4)</field>
1716+ <field eval="154" name="sequence"/>
1717+ <field name="code">T4</field>
1718+ <field name="category_id" ref="PCALC"/>
1719+ <field eval="0" name="appears_on_payslip"/>
1720+ <field eval="1" name="active"/>
1721+ <field name="condition_select">none</field>
1722+ <field name="amount_select">code</field>
1723+ <field name="amount_python_compute">result = max((V * A) - KP - K1P - K2P, 0.0)</field>
1724+ </record>
1725+
1726+ <record id="hr_salary_rule_v1" model="hr.salary.rule">
1727+ <field name="name">Surtax on Basic Provincial Tax(V1)</field>
1728+ <field eval="155" name="sequence"/>
1729+ <field name="code">V1</field>
1730+ <field name="category_id" ref="PCALC"/>
1731+ <field eval="0" name="appears_on_payslip"/>
1732+ <field eval="1" name="active"/>
1733+ <field name="condition_select">none</field>
1734+ <field name="amount_select">code</field>
1735+ <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>
1736+ </record>
1737+
1738+ <record id="hr_salary_rule_v2" model="hr.salary.rule">
1739+ <field name="name">Extra Tax for Ontario Health Premium(V2)</field>
1740+ <field eval="155" name="sequence"/>
1741+ <field name="code">V2</field>
1742+ <field name="category_id" ref="PCALC"/>
1743+ <field eval="0" name="appears_on_payslip"/>
1744+ <field eval="1" name="active"/>
1745+ <field name="condition_select">none</field>
1746+ <field name="amount_select">code</field>
1747+ <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>
1748+ </record>
1749+
1750+ <record id="hr_salary_rule_s" model="hr.salary.rule">
1751+ <field name="name">Ontario or British Columbia Tax Reduction(S)</field>
1752+ <field eval="156" name="sequence"/>
1753+ <field name="code">S</field>
1754+ <field name="category_id" ref="PCALC"/>
1755+ <field eval="0" name="appears_on_payslip"/>
1756+ <field eval="1" name="active"/>
1757+ <field name="condition_select">none</field>
1758+ <field name="amount_select">code</field>
1759+ <field name="amount_python_compute">result = max(min((2 * (217 + employee.y) - (T4 + V1)), T4 + V1 ), 0.0)</field>
1760+ </record>
1761+
1762+ <record id="hr_salary_rule_t3" model="hr.salary.rule">
1763+ <field name="name">Annual Basic Federal Tax(T3)</field>
1764+ <field eval="170" name="sequence"/>
1765+ <field name="code">T3</field>
1766+ <field name="category_id" ref="FCALC"/>
1767+ <field eval="0" name="appears_on_payslip"/>
1768+ <field eval="1" name="active"/>
1769+ <field name="condition_select">none</field>
1770+ <field name="amount_select">code</field>
1771+ <field name="amount_python_compute">result = max((R * A) - K - K1 - K2 - K3 - K4, 0.0)</field>
1772+ </record>
1773+
1774+ <record id="hr_salary_rule_t1" model="hr.salary.rule">
1775+ <field name="name">Annual Federal Tax(T1)</field>
1776+ <field eval="170" name="sequence"/>
1777+ <field name="code">T1</field>
1778+ <field name="category_id" ref="FCALC"/>
1779+ <field eval="0" name="appears_on_payslip"/>
1780+ <field eval="1" name="active"/>
1781+ <field name="condition_select">none</field>
1782+ <field name="amount_select">code</field>
1783+ <field name="amount_python_compute">result = max(T3 - employee.lcf, 0.0)</field>
1784+ </record>
1785+
1786+ <record id="hr_salary_rule_t2" model="hr.salary.rule">
1787+ <field name="name">Annual Provincial Tax Deduction - Ontario(T2)</field>
1788+ <field eval="160" name="sequence"/>
1789+ <field name="code">T2</field>
1790+ <field name="category_id" ref="PCALC"/>
1791+ <field eval="0" name="appears_on_payslip"/>
1792+ <field eval="1" name="active"/>
1793+ <field name="condition_select">none</field>
1794+ <field name="amount_select">code</field>
1795+ <field name="amount_python_compute">result = max(T4 + V1 + V2 - S - employee.lcp, 0.0)</field>
1796+ </record>
1797+
1798+ <record id="hr_salary_rule_t" model="hr.salary.rule">
1799+ <field name="name">Tax Deductions(T)</field>
1800+ <field eval="190" name="sequence"/>
1801+ <field name="code">T</field>
1802+ <field name="category_id" ref="hr_payroll.DED"/>
1803+ <field eval="1" name="appears_on_payslip"/>
1804+ <field eval="1" name="active"/>
1805+ <field name="condition_select">none</field>
1806+ <field name="amount_select">code</field>
1807+ <field name="amount_python_compute">result = ((T1 + T2) / P) + L</field>
1808+ </record>
1809+
1810+ <record id="hr_salary_rule_net" model="hr.salary.rule">
1811+ <field name="name">Net Pay(N)</field>
1812+ <field eval="200" name="sequence"/>
1813+ <field name="code">N</field>
1814+ <field name="category_id" ref="hr_payroll.NET"/>
1815+ <field eval="1" name="appears_on_payslip"/>
1816+ <field eval="1" name="active"/>
1817+ <field name="condition_select">none</field>
1818+ <field name="amount_select">code</field>
1819+ <field name="amount_python_compute">result = categories.I + categories.ALW - categories.DED - categories.SDED</field>
1820+ </record>
1821+
1822+ <!-- Inputs -->
1823+
1824+ <record id="hr_input_l" model="hr.rule.input">
1825+ <field name="name">Extra Tax Deductions(L)</field>
1826+ <field name="code">L</field>
1827+ <field name="input_id" ref="hr_salary_rule_l"/>
1828+ </record>
1829+
1830+ <!-- Salary Structure -->
1831+ <record id="hr_structure_cabase" model="hr.payroll.structure">
1832+ <field name="code">CABASE</field>
1833+ <field name="name">Ontario Base - Non-Commisioned</field>
1834+ <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"/>
1835+ </record>
1836+
1837+ </data>
1838+</openerp>
1839
1840=== added file 'l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml'
1841--- l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml 1970-01-01 00:00:00 +0000
1842+++ l10n_ca_on_hr_payroll/l10n_ca_on_hr_payroll_view.xml 2012-12-21 16:45:28 +0000
1843@@ -0,0 +1,149 @@
1844+<?xml version="1.0" encoding="utf-8"?>
1845+<openerp>
1846+ <data>
1847+ <!--
1848+ <record id="hr_payroll_tax_table_form" model="ir.ui.view">
1849+ <field name="name">hr.payroll.tax.table.form</field>
1850+ <field name="model">hr.payroll.tax.table</field>
1851+ <field name="type">form</field>
1852+ <field name="arch" type="xml">
1853+ <form string="Canadian Tax Table">
1854+ <field name="name" select="1" readonly="1"/>
1855+ <field name="year" select="1" on_change="onchange_year(year,province)"/>
1856+ <field name="date_from"/>
1857+ <field name="date_to"/>
1858+ <field name="fed_prov"/>
1859+ <field name="province" attrs="{'readonly': [('fed_prov','!=','provincial')], 'required': [('fed_prov','=','provincial')]}" on_change="onchange_year(year,province)"/>
1860+ <field name="line_ids" nolabel="1" colspan="4" widget="one2many_list"/>
1861+ </form>
1862+ </field>
1863+ </record>
1864+
1865+ <record id="hr_payroll_tax_table_tree" model="ir.ui.view">
1866+ <field name="name">hr.payroll.tax.table.tree</field>
1867+ <field name="model">hr.payroll.tax.table</field>
1868+ <field name="type">tree</field>
1869+ <field name="arch" type="xml">
1870+ <tree string="Canadian Tax Table">
1871+ <field name="name" />
1872+ <field name="year" />
1873+ <field name="fed_prov"/>
1874+ <field name="province" />
1875+ </tree>
1876+ </field>
1877+ </record>
1878+
1879+ <record id="hr_payroll_tax_table_line_form" model="ir.ui.view">
1880+ <field name="name">hr.payroll.tax.table.line.form</field>
1881+ <field name="model">hr.payroll.tax.table.line</field>
1882+ <field name="type">form</field>
1883+ <field name="arch" type="xml">
1884+ <form string="Canadian Tax Table">
1885+ <group col="6" colspan="4">
1886+ <field name="name" readonly="1"/>
1887+ <field name="code" select="1" colspan="1"/>
1888+ <field name="inc_from"/>
1889+ <field name="inc_to" />
1890+ <field name="rate" />
1891+ </group>
1892+ </form>
1893+ </field>
1894+ </record>
1895+
1896+ <record id="hr_payroll_tax_table_line_tree" model="ir.ui.view">
1897+ <field name="name">hr.payroll.tax.table.line.tree</field>
1898+ <field name="model">hr.payroll.tax.table.line</field>
1899+ <field name="type">tree</field>
1900+ <field name="arch" type="xml">
1901+ <tree string="Canadian Tax Table">
1902+ <field name="name" readonly="1"/>
1903+ <field name="code" select="1" colspan="1"/>
1904+ <field name="inc_from"/>
1905+ <field name="inc_to" />
1906+ <field name="rate" />
1907+ </tree>
1908+ </field>
1909+ </record>
1910+
1911+ <record id="action_hr_payroll_tax_table_tree" model="ir.actions.act_window">
1912+ <field name="name">Canadian Tax Table</field>
1913+ <field name="res_model">hr.payroll.tax.table</field>
1914+ <field name="view_type">form</field>
1915+ <field name="view_mode">tree,form</field>
1916+ <field name="view_id" ref="hr_payroll_tax_table_tree"/>
1917+ </record>
1918+
1919+ <menuitem id="menu_hr_payroll_tax_table_tree" action="action_hr_payroll_tax_table_tree" parent="hr_payroll.payroll_configure"/>
1920+ -->
1921+
1922+ <record id="hr_employee_view_form_inherit" model="ir.ui.view">
1923+ <field name="name">hr.employee.view.form.inherit</field>
1924+ <field name="model">hr.employee</field>
1925+ <field name="type">form</field>
1926+ <field name="inherit_id" ref="hr.view_employee_form"/>
1927+ <field name="arch" type="xml">
1928+ <notebook position="inside">
1929+ <page string="Canadian Payroll">
1930+ <group colspan="1" col="2">
1931+ <separator string="Claim Codes" colspan="2"/>
1932+ <field name="td1f" colspan="1"/>
1933+ <field name="td1p" colspan="1"/>
1934+ </group>
1935+ <group colspan="3" col="2">
1936+ <separator string="Exemptions" colspan="2"/>
1937+ <group colspan="1" col="2">
1938+ <field name="ei_ytd_adj"/>
1939+ <field name="cpp_ytd_adj"/>
1940+ </group>
1941+ <group colspan="1" col="2">
1942+ <field name="ei_exempt"/>
1943+ <field name="cpp_exempt"/>
1944+ <field name="qpip_exempt"/>
1945+ </group>
1946+ </group>
1947+ <separator string="Deductions" colspan="4"/>
1948+ <field name="f1"/>
1949+ <field name="f2"/>
1950+ <field name="hd"/>
1951+ <field name="lcf"/>
1952+ <field name="lcp"/>
1953+ <field name="f"/>
1954+ <field name="k3"/>
1955+ <field name="u1"/>
1956+ <field name="y"/>
1957+ <field name="l"/>
1958+ </page>
1959+ </notebook>
1960+ </field>
1961+ </record>
1962+
1963+ <!-- Contract View -->
1964+ <record id="hr_contract_form_inherit" model="ir.ui.view">
1965+ <field name="name">hr.contract.view.form.inherit</field>
1966+ <field name="model">hr.contract</field>
1967+ <field name="type">form</field>
1968+ <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
1969+ <field name="arch" type="xml">
1970+ <xpath expr="/form/notebook/page/group/field[@name='working_hours']" position="after">
1971+ <field name="pays_per_year"/>
1972+ </xpath>
1973+ </field>
1974+ </record>
1975+
1976+ <!-- End Contract View-->
1977+
1978+ <!-- Salary Rules - unhide the sequence, not sure why it's invisible -->
1979+ <record id="hr_salary_rule_list_inherit" model="ir.ui.view">
1980+ <field name="name">hr.salary.rule.list.inherit</field>
1981+ <field name="model">hr.salary.rule</field>
1982+ <field name="type">tree</field>
1983+ <field name="inherit_id" ref="hr_payroll.hr_salary_rule_list"/>
1984+ <field name="arch" type="xml">
1985+ <xpath expr="//field[@name='sequence']" position="replace">
1986+ <field name="sequence" groups="base.group_extended"/>
1987+ </xpath>
1988+ </field>
1989+ </record>
1990+
1991+ </data>
1992+</openerp>
1993
1994=== added directory 'l10n_ca_on_hr_payroll/static'
1995=== added directory 'l10n_ca_on_hr_payroll/static/src'
1996=== added directory 'l10n_ca_on_hr_payroll/static/src/img'
1997=== added file 'l10n_ca_on_hr_payroll/static/src/img/icon.png'
1998Binary 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
1999=== added directory 'l10n_ca_qc_hr_payroll'
2000=== added file 'l10n_ca_qc_hr_payroll/__init__.py'
2001--- l10n_ca_qc_hr_payroll/__init__.py 1970-01-01 00:00:00 +0000
2002+++ l10n_ca_qc_hr_payroll/__init__.py 2012-12-21 16:45:28 +0000
2003@@ -0,0 +1,24 @@
2004+#-*- coding:utf-8 -*-
2005+##############################################################################
2006+#
2007+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
2008+#
2009+# This program is free software: you can redistribute it and/or modify
2010+# it under the terms of the GNU Affero General Public License as published
2011+# by
2012+# the Free Software Foundation, either version 3 of the License, or
2013+# (at your option) any later version.
2014+#
2015+# This program is distributed in the hope that it will be useful,
2016+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2017+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2018+# GNU Affero General Public License for more details.
2019+#
2020+# You should have received a copy of the GNU Affero General Public License
2021+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2022+#
2023+##############################################################################
2024+
2025+import l10n_ca_qc_hr_payroll
2026+
2027+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2028
2029=== added file 'l10n_ca_qc_hr_payroll/__openerp__.py'
2030--- l10n_ca_qc_hr_payroll/__openerp__.py 1970-01-01 00:00:00 +0000
2031+++ l10n_ca_qc_hr_payroll/__openerp__.py 2012-12-21 16:45:28 +0000
2032@@ -0,0 +1,46 @@
2033+#-*- coding:utf-8 -*-
2034+##############################################################################
2035+#
2036+# Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
2037+#
2038+# This program is free software: you can redistribute it and/or modify
2039+# it under the terms of the GNU Affero General Public License as published by
2040+# the Free Software Foundation, either version 3 of the License, or
2041+# (at your option) any later version.
2042+#
2043+# This program is distributed in the hope that it will be useful,
2044+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2045+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2046+# GNU Affero General Public License for more details.
2047+#
2048+# You should have received a copy of the GNU Affero General Public License
2049+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2050+#
2051+##############################################################################
2052+{
2053+ 'name': 'Canada - Quebec - Payroll',
2054+ 'category': 'Localization',
2055+ 'version': '0.1',
2056+ 'license': 'AGPL-3',
2057+ 'category': 'Generic Modules/Human Resources',
2058+ 'description': """
2059+Quebec Payroll Rules
2060+==============================
2061+ * Adds all Quebec Salary Rules
2062+ """,
2063+ 'author':'Savoir-faire Linux',
2064+ 'website':'http://www.savoirfairelinux.com',
2065+ 'depends': [
2066+ 'l10n_ca_hr_payroll',
2067+ ],
2068+ 'data': [
2069+ 'l10n_ca_qc_hr_payroll_view.xml',
2070+ 'l10n_ca_qc_hr_payroll_data.xml',
2071+ ],
2072+ 'test': [],
2073+ 'demo': [],
2074+ 'installable': True,
2075+ 'active': False,
2076+}
2077+
2078+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2079
2080=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py'
2081--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py 1970-01-01 00:00:00 +0000
2082+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll.py 2012-12-21 16:45:28 +0000
2083@@ -0,0 +1,38 @@
2084+#-*- coding:utf-8 -*-
2085+##############################################################################
2086+#
2087+# Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
2088+#
2089+# This program is free software: you can redistribute it and/or modify
2090+# it under the terms of the GNU Affero General Public License as published
2091+# by
2092+# the Free Software Foundation, either version 3 of the License, or
2093+# (at your option) any later version.
2094+#
2095+# This program is distributed in the hope that it will be useful,
2096+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2097+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2098+# GNU Affero General Public License for more details.
2099+#
2100+# You should have received a copy of the GNU Affero General Public License
2101+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2102+#
2103+##############################################################################
2104+
2105+from osv import fields, osv
2106+
2107+class hr_employee(osv.osv):
2108+ _name = 'hr.employee'
2109+ _inherit = 'hr.employee'
2110+
2111+ _columns = {
2112+ 'tp10153': fields.float('Source Deductions Return (TP-1015.3)', digits=(16,2), required=True, help="Source Deductions Return"),
2113+ }
2114+
2115+ _defaults = {
2116+ 'tp10153': 10925.00,
2117+ }
2118+
2119+hr_employee()
2120+
2121+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2122
2123=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml'
2124--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml 1970-01-01 00:00:00 +0000
2125+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_data.xml 2012-12-21 16:45:28 +0000
2126@@ -0,0 +1,534 @@
2127+<?xml version="1.0" encoding="utf-8"?>
2128+<openerp>
2129+ <data noupdate="1">
2130+
2131+ <!-- Quebec Parental Insurance Plan - 120 -->
2132+
2133+ <record id="rule_qc_qpip_maxie" model="hr.salary.rule">
2134+ <field name="name">QPIP - Employee and Employer Maximum Insurable Earnings (QPIPMAXIE)</field>
2135+ <field name="sequence" eval="120"/>
2136+ <field name="code">QPIPMAXIE</field>
2137+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2138+ <field name="appears_on_payslip" eval="0"/>
2139+ <field name="active" eval="1"/>
2140+ <field name="condition_select">none</field>
2141+ <field name="amount_select">code</field>
2142+ <field name="amount_python_compute">result = min(GROSS,66000)</field>
2143+ </record>
2144+
2145+ <!-- Quebec Parental Insurance Plan - Employee - 121 -->
2146+
2147+ <record id="rule_qc_qpip_ee_rate" model="hr.salary.rule">
2148+ <field name="name">QPIP - Employee Rate - 0.559 % (QPIPRATE)</field>
2149+ <field name="sequence" eval="121"/>
2150+ <field name="code">QPIPEERATE</field>
2151+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2152+ <field name="appears_on_payslip" eval="0"/>
2153+ <field name="active" eval="1"/>
2154+ <field name="condition_select">none</field>
2155+ <field name="amount_select">fix</field>
2156+ <field name="quantity">1.0</field>
2157+ <field name="amount_fix">0.559</field>
2158+ </record>
2159+
2160+ <record id="rule_qc_qpip_ee_maxc" model="hr.salary.rule">
2161+ <field name="name">QPIP - Employee Maximum Contribution (QPIPEEMAXC)</field>
2162+ <field name="sequence" eval="122"/>
2163+ <field name="code">QPIPEEMAXC</field>
2164+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2165+ <field name="appears_on_payslip" eval="0"/>
2166+ <field name="active" eval="1"/>
2167+ <field name="condition_select">none</field>
2168+ <field name="amount_select">code</field>
2169+ <field name="amount_python_compute">result = QPIPMAXIE * QPIPEERATE * 0.01</field>
2170+ </record>
2171+
2172+ <record id="rule_qc_qpip_ee_pytdc" model="hr.salary.rule">
2173+ <field name="name">QPIP - Employee - Previous Year To Date Contribution (QPIPEEPYTDC)</field>
2174+ <field name="sequence" eval="122"/>
2175+ <field name="code">QPIPEEPYTDC</field>
2176+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2177+ <field name="appears_on_payslip" eval="0"/>
2178+ <field name="active" eval="1"/>
2179+ <field name="condition_select">none</field>
2180+ <field name="amount_select">code</field>
2181+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2182+date_to = payslip.date_to
2183+result = payslip.sum('QPIPEEYTDC',date_from,date_to)
2184+ </field>
2185+ </record>
2186+
2187+ <record id="rule_qc_qpip_ee_c" model="hr.salary.rule">
2188+ <field name="name">QPIP - Employee Contribution (QPIPEEC)</field>
2189+ <field name="sequence" eval="123"/>
2190+ <field name="code">QPIPEEC</field>
2191+ <field name="category_id" ref="hr_payroll.DED"/>
2192+ <field name="appears_on_payslip" eval="1"/>
2193+ <field name="active" eval="1"/>
2194+ <field name="condition_select">none</field>
2195+ <field name="amount_select">code</field>
2196+ <field name="amount_python_compute">if (QPIPEEPYTDC > QPIPEEMAXC):
2197+ result = 0
2198+else:
2199+ if (QPIPEEMAXC - QPIPEEPYTDC - (GROSS * QPIPEERATE * 0.01 / P) &gt;= 0):
2200+ result = GROSS * QPIPEERATE * 0.01 / P
2201+ else:
2202+ result = QPIPEEMAXC - QPIPEEPYTDC
2203+ </field>
2204+ </record>
2205+
2206+ <record id="rule_qc_qpip_ee_ytdc" model="hr.salary.rule">
2207+ <field name="name">QPIP - Employee - Year To Date Contribution (QPIPEEYTDC)</field>
2208+ <field name="sequence" eval="124"/>
2209+ <field name="code">QPIPEEYTDC</field>
2210+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2211+ <field name="appears_on_payslip" eval="1"/>
2212+ <field name="active" eval="1"/>
2213+ <field name="condition_select">none</field>
2214+ <field name="amount_select">code</field>
2215+ <field name="amount_python_compute">result = QPIPEEPYTDC + QPIPEEC</field>
2216+ </record>
2217+
2218+ <!-- Quebec Parental Insurance Plan - Employer - 125 -->
2219+
2220+ <record id="rule_qc_qpip_er_rate" model="hr.salary.rule">
2221+ <field name="name">QPIP - Employer Rate - 0.782 % (QPIPERRATE)</field>
2222+ <field name="sequence" eval="125"/>
2223+ <field name="code">QPIPERRATE</field>
2224+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2225+ <field name="appears_on_payslip" eval="0"/>
2226+ <field name="active" eval="1"/>
2227+ <field name="condition_select">none</field>
2228+ <field name="amount_select">fix</field>
2229+ <field name="quantity">1.0</field>
2230+ <field name="amount_fix">0.782</field>
2231+ </record>
2232+
2233+ <record id="rule_qc_qpip_er_maxc" model="hr.salary.rule">
2234+ <field name="name">QPIP - Employer Maximum Contribution (QPIPERMAXC)</field>
2235+ <field name="sequence" eval="126"/>
2236+ <field name="code">QPIPERMAXC</field>
2237+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2238+ <field name="appears_on_payslip" eval="0"/>
2239+ <field name="active" eval="1"/>
2240+ <field name="condition_select">none</field>
2241+ <field name="amount_select">code</field>
2242+ <field name="amount_python_compute">result = QPIPMAXIE * QPIPERRATE * 0.01</field>
2243+ </record>
2244+
2245+ <record id="rule_qc_qpip_er_pytdc" model="hr.salary.rule">
2246+ <field name="name">QPIP - Employer - Previous Year To Date Contribution (QPIPERPYTDC)</field>
2247+ <field name="sequence" eval="126"/>
2248+ <field name="code">QPIPERPYTDC</field>
2249+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2250+ <field name="appears_on_payslip" eval="0"/>
2251+ <field name="active" eval="1"/>
2252+ <field name="condition_select">none</field>
2253+ <field name="amount_select">code</field>
2254+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2255+date_to = payslip.date_to
2256+result = payslip.sum('QPIPERYTDC',date_from,date_to)
2257+ </field>
2258+ </record>
2259+
2260+ <record id="rule_qc_qpip_er_c" model="hr.salary.rule">
2261+ <field name="name">QPIP - Employer Contribution (QPIPERC)</field>
2262+ <field name="sequence" eval="127"/>
2263+ <field name="code">QPIPERC</field>
2264+ <field name="category_id" ref="l10n_ca_hr_payroll.EMP"/>
2265+ <field name="appears_on_payslip" eval="0"/>
2266+ <field name="active" eval="1"/>
2267+ <field name="condition_select">none</field>
2268+ <field name="amount_select">code</field>
2269+ <field name="amount_python_compute">if (QPIPERPYTDC > QPIPERMAXC):
2270+ result = 0
2271+else:
2272+ if (QPIPERMAXC - QPIPERPYTDC - (GROSS * QPIPERRATE * 0.01 / P) &gt;= 0):
2273+ result = GROSS * QPIPERRATE * 0.01 / P
2274+ else:
2275+ result = QPIPERMAXC - QPIPERPYTDC
2276+ </field>
2277+ </record>
2278+
2279+ <record id="rule_qc_qpip_er_ytdc" model="hr.salary.rule">
2280+ <field name="name">QPIP - Employer - Year To Date Contribution (QPIPERYTDC)</field>
2281+ <field name="sequence" eval="128"/>
2282+ <field name="code">QPIPERYTDC</field>
2283+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2284+ <field name="appears_on_payslip" eval="0"/>
2285+ <field name="active" eval="1"/>
2286+ <field name="condition_select">none</field>
2287+ <field name="amount_select">code</field>
2288+ <field name="amount_python_compute">result = QPIPERPYTDC + QPIPERC</field>
2289+ </record>
2290+
2291+ <!-- Quebec Pension Plan - 130 -->
2292+
2293+ <record id="rule_qc_qpp_maxie" model="hr.salary.rule">
2294+ <field name="name">QPP - Employee and Employer Maximum Insurable Earnings (QPPMAXIE)</field>
2295+ <field name="sequence" eval="130"/>
2296+ <field name="code">QPPMAXIE</field>
2297+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2298+ <field name="appears_on_payslip" eval="0"/>
2299+ <field name="active" eval="1"/>
2300+ <field name="condition_select">none</field>
2301+ <field name="amount_select">code</field>
2302+ <field name="amount_python_compute">result = min(GROSS,55100)</field>
2303+ </record>
2304+
2305+ <!-- Quebec Pension Plan - Employee - 130 -->
2306+
2307+ <record id="rule_qc_qpp_ee_rate" model="hr.salary.rule">
2308+ <field name="name">QPP - Employee - Rate 5.025% (QPPEERATE)</field>
2309+ <field name="sequence" eval="130"/>
2310+ <field name="code">QPPEERATE</field>
2311+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2312+ <field name="appears_on_payslip" eval="0"/>
2313+ <field name="active" eval="1"/>
2314+ <field name="condition_select">none</field>
2315+ <field name="amount_select">fix</field>
2316+ <field name="quantity">1.0</field>
2317+ <field name="amount_fix">5.025</field>
2318+ </record>
2319+
2320+ <record id="rule_qc_qpp_ee_maxc" model="hr.salary.rule">
2321+ <field name="name">QPP - Employee - Maximum Contribution (QPPEEMAXC)</field>
2322+ <field name="sequence" eval="131"/>
2323+ <field name="code">QPPEEMAXC</field>
2324+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2325+ <field name="appears_on_payslip" eval="0"/>
2326+ <field name="active" eval="1"/>
2327+ <field name="condition_select">none</field>
2328+ <field name="amount_select">code</field>
2329+ <field name="amount_python_compute">result = QPPMAXIE * QPPEERATE * 0.01</field>
2330+ </record>
2331+
2332+ <record id="rule_qc_qpp_ee_pytdc" model="hr.salary.rule">
2333+ <field name="name">QPP - Employee - Previous Year To Date Contribution (QPPEEPYTDC)</field>
2334+ <field name="sequence" eval="132"/>
2335+ <field name="code">QPPEEPYTDC</field>
2336+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2337+ <field name="appears_on_payslip" eval="0"/>
2338+ <field name="active" eval="1"/>
2339+ <field name="condition_select">none</field>
2340+ <field name="amount_select">code</field>
2341+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2342+date_to = payslip.date_to
2343+result = payslip.sum('QPPEEYTDC',date_from,date_to)
2344+ </field>
2345+ </record>
2346+
2347+ <record id="rule_qc_qpp_ee_c" model="hr.salary.rule">
2348+ <field name="name">QPP - Employee Contribution (QPPEEC)</field>
2349+ <field name="sequence" eval="133"/>
2350+ <field name="code">QPPEEC</field>
2351+ <field name="category_id" ref="hr_payroll.DED"/>
2352+ <field name="appears_on_payslip" eval="1"/>
2353+ <field name="active" eval="1"/>
2354+ <field name="condition_select">none</field>
2355+ <field name="amount_select">code</field>
2356+ <field name="amount_python_compute">if (QPPEEPYTDC > QPPEEMAXC):
2357+ result = 0
2358+else:
2359+ if (QPPEEMAXC - QPPEEPYTDC - (GROSS * QPPEERATE * 0.01 / P) &gt;= 0):
2360+ result = GROSS * QPPEERATE * 0.01 / P
2361+ else:
2362+ result = QPPEEMAXC - QPPEEPYTDC
2363+ </field>
2364+ </record>
2365+
2366+ <record id="rule_qc_qpp_ee_ytdc" model="hr.salary.rule">
2367+ <field name="name">QPP - Employee - Year To Date Contribution (QPPEEYTDC)</field>
2368+ <field name="sequence" eval="134"/>
2369+ <field name="code">QPPEEYTDC</field>
2370+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2371+ <field name="appears_on_payslip" eval="1"/>
2372+ <field name="active" eval="1"/>
2373+ <field name="condition_select">none</field>
2374+ <field name="amount_select">code</field>
2375+ <field name="amount_python_compute">result = QPPEEPYTDC + QPPEEC</field>
2376+ </record>
2377+
2378+ <!-- Quebec Pension Plan - Employer - 135 -->
2379+
2380+ <record id="rule_qc_qpp_er_rate" model="hr.salary.rule">
2381+ <field name="name">QPP - Employer - Rate 5.025% (QPPERRATE)</field>
2382+ <field name="sequence" eval="135"/>
2383+ <field name="code">QPPERRATE</field>
2384+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2385+ <field name="appears_on_payslip" eval="0"/>
2386+ <field name="active" eval="1"/>
2387+ <field name="condition_select">none</field>
2388+ <field name="amount_select">fix</field>
2389+ <field name="quantity">1.0</field>
2390+ <field name="amount_fix">5.025</field>
2391+ </record>
2392+
2393+ <record id="rule_qc_qpp_er_maxc" model="hr.salary.rule">
2394+ <field name="name">QPP - Employer - Maximum Contribution (QPPERMAXC)</field>
2395+ <field name="sequence" eval="136"/>
2396+ <field name="code">QPPERMAXC</field>
2397+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2398+ <field name="appears_on_payslip" eval="0"/>
2399+ <field name="active" eval="1"/>
2400+ <field name="condition_select">none</field>
2401+ <field name="amount_select">code</field>
2402+ <field name="amount_python_compute">result = QPPMAXIE * QPPERRATE * 0.01</field>
2403+ </record>
2404+
2405+ <record id="rule_qc_qpp_er_pytdc" model="hr.salary.rule">
2406+ <field name="name">QPP - Employer - Previous Year To Date Contribution (QPPERPYTDC)</field>
2407+ <field name="sequence" eval="137"/>
2408+ <field name="code">QPPERPYTDC</field>
2409+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2410+ <field name="appears_on_payslip" eval="0"/>
2411+ <field name="active" eval="1"/>
2412+ <field name="condition_select">none</field>
2413+ <field name="amount_select">code</field>
2414+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2415+date_to = payslip.date_to
2416+result = payslip.sum('QPPERYTDC',date_from,date_to)
2417+ </field>
2418+ </record>
2419+
2420+ <record id="rule_qc_qpp_er_c" model="hr.salary.rule">
2421+ <field name="name">QPP - Employer Contribution (QPPERC)</field>
2422+ <field name="sequence" eval="138"/>
2423+ <field name="code">QPPERC</field>
2424+ <field name="category_id" ref="hr_payroll.DED"/>
2425+ <field name="appears_on_payslip" eval="0"/>
2426+ <field name="active" eval="1"/>
2427+ <field name="condition_select">none</field>
2428+ <field name="amount_select">code</field>
2429+ <field name="amount_python_compute">if (QPPERPYTDC > QPPERMAXC):
2430+ result = 0
2431+else:
2432+ if (QPPERMAXC - QPPERPYTDC - (GROSS * QPPERRATE * 0.01 / P) &gt;= 0):
2433+ result = GROSS * QPPERRATE * 0.01 / P
2434+ else:
2435+ result = QPPERMAXC - QPPERPYTDC
2436+ </field>
2437+ </record>
2438+
2439+ <record id="rule_qc_qpp_er_ytdc" model="hr.salary.rule">
2440+ <field name="name">QPP - Employer - Year To Date Contribution (QPPERYTDC)</field>
2441+ <field name="sequence" eval="139"/>
2442+ <field name="code">QPPERYTDC</field>
2443+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2444+ <field name="appears_on_payslip" eval="0"/>
2445+ <field name="active" eval="1"/>
2446+ <field name="condition_select">none</field>
2447+ <field name="amount_select">code</field>
2448+ <field name="amount_python_compute">result = QPPERPYTDC + QPPERC</field>
2449+ </record>
2450+
2451+ <!-- Employment insurance - Employee - 140 -->
2452+
2453+ <record id="rule_qc_ei_ee_rate" model="hr.salary.rule">
2454+ <field name="name">EI - Employee - Rate 1.47% (EIEERATE)</field>
2455+ <field name="sequence" eval="140"/>
2456+ <field name="code">EIEERATE</field>
2457+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
2458+ <field name="appears_on_payslip" eval="0"/>
2459+ <field name="active" eval="1"/>
2460+ <field name="condition_select">none</field>
2461+ <field name="amount_select">fix</field>
2462+ <field name="quantity">1.0</field>
2463+ <field name="amount_fix">1.47</field>
2464+ </record>
2465+
2466+ <record id="rule_qc_ei_ee_maxc" model="hr.salary.rule">
2467+ <field name="name">EI - Employee - Maximum Contribution (EIEEMAXC)</field>
2468+ <field name="sequence" eval="141"/>
2469+ <field name="code">EIEEMAXC</field>
2470+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
2471+ <field name="appears_on_payslip" eval="0"/>
2472+ <field name="active" eval="1"/>
2473+ <field name="condition_select">none</field>
2474+ <field name="amount_select">code</field>
2475+ <field name="amount_python_compute">result = EIMAXIE * EIEERATE * 0.01</field>
2476+ </record>
2477+
2478+ <record id="rule_qc_ei_ee_pytdc" model="hr.salary.rule">
2479+ <field name="name">EI - Employee - Previous Year To Date Contribution (EIEEPYTDC)</field>
2480+ <field name="sequence" eval="141"/>
2481+ <field name="code">EIEEPYTDC</field>
2482+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
2483+ <field name="appears_on_payslip" eval="0"/>
2484+ <field name="active" eval="1"/>
2485+ <field name="condition_select">none</field>
2486+ <field name="amount_select">code</field>
2487+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2488+date_to = payslip.date_to
2489+result = payslip.sum('EIEEYTDC',date_from,date_to)
2490+ </field>
2491+ </record>
2492+
2493+ <record id="rule_qc_ei_ee_c" model="hr.salary.rule">
2494+ <field name="name">EI - Employee Contribution (EIEEC)</field>
2495+ <field name="sequence" eval="142"/>
2496+ <field name="code">EIEEC</field>
2497+ <field name="category_id" ref="hr_payroll.DED"/>
2498+ <field name="appears_on_payslip" eval="1"/>
2499+ <field name="active" eval="1"/>
2500+ <field name="condition_select">none</field>
2501+ <field name="amount_select">code</field>
2502+ <field name="amount_python_compute">if (EIEEPYTDC > EIEEMAXC):
2503+ result = 0
2504+else:
2505+ if (EIEEMAXC - EIEEPYTDC - (GROSS * EIEERATE * 0.01 / P) &gt;= 0):
2506+ result = GROSS * EIEERATE * 0.01 / P
2507+ else:
2508+ result = EIEEMAXC - EIEEPYTDC
2509+</field>
2510+ </record>
2511+
2512+ <record id="rule_qc_ei_ee_ytdc" model="hr.salary.rule">
2513+ <field name="name">EI - Employee - Year To Date Contribution (EIEEYTDC)</field>
2514+ <field name="sequence" eval="143"/>
2515+ <field name="code">EIEEYTDC</field>
2516+ <field name="category_id" ref="l10n_ca_hr_payroll.FCALC"/>
2517+ <field name="appears_on_payslip" eval="1"/>
2518+ <field name="active" eval="1"/>
2519+ <field name="condition_select">none</field>
2520+ <field name="amount_select">code</field>
2521+ <field name="amount_python_compute">result = EIEEPYTDC + EIEEC</field>
2522+ </record>
2523+
2524+ <!-- Insurance - Employee - 150 -->
2525+
2526+ <record id="rule_qc_ins_eec" model="hr.salary.rule">
2527+ <field name="name">Insurance - Employee Contribution (INSEEC)</field>
2528+ <field name="sequence" eval="150"/>
2529+ <field name="code">INSEEC</field>
2530+ <field name="category_id" ref="l10n_ca_hr_payroll.SDED"/>
2531+ <field name="appears_on_payslip" eval="1"/>
2532+ <field name="active" eval="1"/>
2533+ <field name="condition_select">none</field>
2534+ <field name="amount_select">code</field>
2535+ <field name="amount_python_compute">result = employee.eeins</field>
2536+ </record>
2537+
2538+ <record id="rule_qc_ins_ee_ytdc" model="hr.salary.rule">
2539+ <field name="name">Insurance - Employee - Year To Date Contribution (INSEEYTDC)</field>
2540+ <field name="sequence" eval="151"/>
2541+ <field name="code">INSEEYTDC</field>
2542+ <field name="category_id" ref="l10n_ca_hr_payroll.CALC"/>
2543+ <field name="appears_on_payslip" eval="1"/>
2544+ <field name="active" eval="1"/>
2545+ <field name="condition_select">none</field>
2546+ <field name="amount_select">code</field>
2547+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2548+date_to = payslip.date_to
2549+result = payslip.sum('INSEEYTDC',date_from,date_to) + INSEEC
2550+ </field>
2551+ </record>
2552+
2553+ <!-- Insurance - Employer - 155 -->
2554+
2555+ <record id="rule_qc_ins_erc" model="hr.salary.rule">
2556+ <field name="name">Insurance - Employer Contribution (INSERC)</field>
2557+ <field name="sequence" eval="150"/>
2558+ <field name="code">INSERC</field>
2559+ <field name="category_id" ref="l10n_ca_hr_payroll.EMP"/>
2560+ <field name="appears_on_payslip" eval="0"/>
2561+ <field name="active" eval="1"/>
2562+ <field name="condition_select">none</field>
2563+ <field name="amount_select">code</field>
2564+ <field name="amount_python_compute">result = employee.erins</field>
2565+ </record>
2566+
2567+ <!-- Quebec Income Tax - 180 -->
2568+
2569+ <record id="rule_qc_qit_ti" model="hr.salary.rule">
2570+ <field name="name">QIT - Taxable Income (QITTI)</field>
2571+ <field name="sequence" eval="181"/>
2572+ <field name="code">QITTI</field>
2573+ <field name="appears_on_payslip" eval="0"/>
2574+ <field name="active" eval="1"/>
2575+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2576+ <field name="condition_select">none</field>
2577+ <field name="amount_select">code</field>
2578+ <field name="amount_python_compute">result = GROSS - employee.tp10153</field>
2579+ </record>
2580+
2581+ <record id="rule_qc_qit" model="hr.salary.rule">
2582+ <field name="name">QIT - Quebec Income Tax (QIT)</field>
2583+ <field name="sequence" eval="182"/>
2584+ <field name="code">QIT</field>
2585+ <field name="appears_on_payslip" eval="1"/>
2586+ <field name="active" eval="1"/>
2587+ <field name="category_id" ref="hr_payroll.DED"/>
2588+ <field name="condition_select">none</field>
2589+ <field name="amount_select">code</field>
2590+ <field name="amount_python_compute">
2591+if QITTI &gt;= 80200:
2592+ res = (QITTI - 80200) * 0.24 + 40100 * 0.24 + 40100 * 0.16
2593+if QITTI &gt;= 40100 and QITTI &lt; 80200:
2594+ res = (QITTI - 40100) * 0.2 + 40100 * 0.16
2595+if QITTI &lt; 40100:
2596+ res = QITTI * 0.16
2597+result = res / P
2598+ </field>
2599+ </record>
2600+
2601+ <record id="rule_qc_qit_ytd" model="hr.salary.rule">
2602+ <field name="name">QIT - Year To Date (QITYTD)</field>
2603+ <field name="sequence" eval="183"/>
2604+ <field name="code">QITYTD</field>
2605+ <field name="category_id" ref="l10n_ca_hr_payroll.PCALC"/>
2606+ <field name="appears_on_payslip" eval="1"/>
2607+ <field name="active" eval="1"/>
2608+ <field name="condition_select">none</field>
2609+ <field name="amount_select">code</field>
2610+ <field name="amount_python_compute">date_from = payslip.date_to.split('-')[0] + '-01-01'
2611+date_to = payslip.date_to
2612+result = payslip.sum('QITYTD',date_from,date_to) + QIT
2613+ </field>
2614+ </record>
2615+
2616+ <!-- Salary Structure -->
2617+
2618+ <record id="hr_structure_qc" model="hr.payroll.structure">
2619+ <field name="code">QC</field>
2620+ <field name="name">Quebec Base</field>
2621+ <field name="rule_ids"
2622+ eval="[(6, 0, [
2623+ ref('rule_qc_qpip_maxie'),
2624+ ref('rule_qc_qpip_ee_rate'),
2625+ ref('rule_qc_qpip_ee_maxc'),
2626+ ref('rule_qc_qpip_ee_pytdc'),
2627+ ref('rule_qc_qpip_ee_c'),
2628+ ref('rule_qc_qpip_ee_ytdc'),
2629+ ref('rule_qc_qpip_er_rate'),
2630+ ref('rule_qc_qpip_er_maxc'),
2631+ ref('rule_qc_qpip_er_pytdc'),
2632+ ref('rule_qc_qpip_er_c'),
2633+ ref('rule_qc_qpip_er_ytdc'),
2634+ ref('rule_qc_qpp_maxie'),
2635+ ref('rule_qc_qpp_ee_rate'),
2636+ ref('rule_qc_qpp_ee_maxc'),
2637+ ref('rule_qc_qpp_ee_pytdc'),
2638+ ref('rule_qc_qpp_ee_c'),
2639+ ref('rule_qc_qpp_ee_ytdc'),
2640+ ref('rule_qc_qpp_er_rate'),
2641+ ref('rule_qc_qpp_er_maxc'),
2642+ ref('rule_qc_qpp_er_pytdc'),
2643+ ref('rule_qc_qpp_er_c'),
2644+ ref('rule_qc_qpp_er_ytdc'),
2645+ ref('rule_qc_ins_eec'),
2646+ ref('rule_qc_ins_erc'),
2647+ ref('rule_qc_ei_ee_rate'),
2648+ ref('rule_qc_ei_ee_maxc'),
2649+ ref('rule_qc_ei_ee_pytdc'),
2650+ ref('rule_qc_ei_ee_c'),
2651+ ref('rule_qc_ei_ee_ytdc'),
2652+ ref('rule_qc_qit_ti'),
2653+ ref('rule_qc_qit'),
2654+ ref('rule_qc_qit_ytd')
2655+ ])]"/>
2656+ <field name="parent_id" ref="l10n_ca_hr_payroll.hr_structure_ca_base"/>
2657+ </record>
2658+
2659+ </data>
2660+</openerp>
2661
2662=== added file 'l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml'
2663--- l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml 1970-01-01 00:00:00 +0000
2664+++ l10n_ca_qc_hr_payroll/l10n_ca_qc_hr_payroll_view.xml 2012-12-21 16:45:28 +0000
2665@@ -0,0 +1,18 @@
2666+<?xml version="1.0" encoding="utf-8"?>
2667+<openerp>
2668+ <data>
2669+
2670+ <record id="hr_employee_view_form_inherit" model="ir.ui.view">
2671+ <field name="name">hr.employee.view.form.inherit</field>
2672+ <field name="model">hr.employee</field>
2673+ <field name="type">form</field>
2674+ <field name="inherit_id" ref="l10n_ca_hr_payroll.hr_employee_view_form_inherit"/>
2675+ <field name="arch" type="xml">
2676+ <field name="td1" position="after">
2677+ <field name="tp10153"/>
2678+ </field>
2679+ </field>
2680+ </record>
2681+
2682+ </data>
2683+</openerp>
2684
2685=== added directory 'l10n_ca_qc_hr_payroll/static'
2686=== added directory 'l10n_ca_qc_hr_payroll/static/src'
2687=== added directory 'l10n_ca_qc_hr_payroll/static/src/img'
2688=== added file 'l10n_ca_qc_hr_payroll/static/src/img/icon.png'
2689Binary 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
2690=== added directory 'l10n_ca_qc_hr_payroll_account'
2691=== added file 'l10n_ca_qc_hr_payroll_account/__init__.py'
2692--- l10n_ca_qc_hr_payroll_account/__init__.py 1970-01-01 00:00:00 +0000
2693+++ l10n_ca_qc_hr_payroll_account/__init__.py 2012-12-21 16:45:28 +0000
2694@@ -0,0 +1,22 @@
2695+#-*- coding:utf-8 -*-
2696+##############################################################################
2697+#
2698+# Copyright (C) 2012 OpenERP Canada. All Rights Reserved.
2699+#
2700+# This program is free software: you can redistribute it and/or modify
2701+# it under the terms of the GNU Affero General Public License as published
2702+# by
2703+# the Free Software Foundation, either version 3 of the License, or
2704+# (at your option) any later version.
2705+#
2706+# This program is distributed in the hope that it will be useful,
2707+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2708+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2709+# GNU Affero General Public License for more details.
2710+#
2711+# You should have received a copy of the GNU Affero General Public License
2712+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2713+#
2714+##############################################################################
2715+
2716+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2717
2718=== added file 'l10n_ca_qc_hr_payroll_account/__openerp__.py'
2719--- l10n_ca_qc_hr_payroll_account/__openerp__.py 1970-01-01 00:00:00 +0000
2720+++ l10n_ca_qc_hr_payroll_account/__openerp__.py 2012-12-21 16:45:28 +0000
2721@@ -0,0 +1,56 @@
2722+#-*- coding:utf-8 -*-
2723+##############################################################################
2724+#
2725+# Copyright (C) 2012 Savoir-faire Linux. All Rights Reserved.
2726+#
2727+# This program is free software: you can redistribute it and/or modify
2728+# it under the terms of the GNU Affero General Public License as published by
2729+# the Free Software Foundation, either version 3 of the License, or
2730+# (at your option) any later version.
2731+#
2732+# This program is distributed in the hope that it will be useful,
2733+# but WITHOUT ANY WARRANTY; without even the implied warranty of
2734+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2735+# GNU Affero General Public License for more details.
2736+#
2737+# You should have received a copy of the GNU Affero General Public License
2738+# along with this program. If not, see <http://www.gnu.org/licenses/>.
2739+#
2740+##############################################################################
2741+{
2742+ 'name': 'Canada - Quebec - Payroll Accounting',
2743+ 'category': 'Localization',
2744+ 'version': '0.1',
2745+ 'license': 'AGPL-3',
2746+ 'category': 'Generic Modules/Human Resources',
2747+ 'description': """
2748+Quebec Payroll Accounting
2749+=========================
2750+
2751+This module:
2752+ * creates financial accounts for payroll
2753+ * updates salary rules with accounting information
2754+
2755+ !!! Warning !!!
2756+
2757+Make sure to install AND CONFIGURE the canadian chart of accounts module (l10n_ca)
2758+before installing this module. Chart template needs to be selected to populate
2759+the account.account table and allow you to link salary rules with the financial
2760+account.
2761+ """,
2762+ 'author':'Savoir-faire Linux',
2763+ 'website':'http:/www.savoirfairelinux.com',
2764+ 'depends': [
2765+ 'l10n_ca_qc_hr_payroll',
2766+ 'l10n_ca_hr_payroll_account',
2767+ ],
2768+ 'data': [
2769+ 'l10n_ca_qc_hr_payroll_account_data.xml',
2770+ ],
2771+ 'test': [],
2772+ 'demo': [],
2773+ 'installable': True,
2774+ 'active': False,
2775+}
2776+
2777+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2778
2779=== added file 'l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml'
2780--- l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml 1970-01-01 00:00:00 +0000
2781+++ l10n_ca_qc_hr_payroll_account/l10n_ca_qc_hr_payroll_account_data.xml 2012-12-21 16:45:28 +0000
2782@@ -0,0 +1,44 @@
2783+<?xml version="1.0" encoding="utf-8"?>
2784+<openerp>
2785+ <data noupdate="1">
2786+
2787+ <!-- Quebec Parental Insurance Plan -->
2788+
2789+ <record id="l10n_ca_qc_hr_payroll.rule_qc_qpip_ee_c" model="hr.salary.rule">
2790+ <field name="account_debit" model='account.account' search="[('code','like','51206')]"/>
2791+ <field name="account_credit" model='account.account' search="[('code','like','214231')]"/>
2792+ </record>
2793+
2794+ <record id="l10n_ca_qc_hr_payroll.rule_qc_qpip_er_c" model="hr.salary.rule">
2795+ <field name="account_debit" model='account.account' search="[('code','like','51206')]"/>
2796+ <field name="account_credit" model='account.account' search="[('code','like','214232')]"/>
2797+ </record>
2798+
2799+ <!-- Quebec Pension Plan -->
2800+
2801+ <record id="l10n_ca_qc_hr_payroll.rule_qc_qpp_ee_c" model="hr.salary.rule">
2802+ <field name="account_debit" model='account.account' search="[('code','like','51205')]"/>
2803+ <field name="account_credit" model='account.account' search="[('code','like','214221')]"/>
2804+ </record>
2805+
2806+ <record id="l10n_ca_qc_hr_payroll.rule_qc_qpp_er_c" model="hr.salary.rule">
2807+ <field name="account_debit" model='account.account' search="[('code','like','51205')]"/>
2808+ <field name="account_credit" model='account.account' search="[('code','like','214222')]"/>
2809+ </record>
2810+
2811+ <!-- Employment Insurance -->
2812+
2813+ <record id="l10n_ca_qc_hr_payroll.rule_qc_ei_ee_c" model="hr.salary.rule">
2814+ <field name="account_debit" model='account.account' search="[('code','like','51203')]"/>
2815+ <field name="account_credit" model='account.account' search="[('code','like','214111')]"/>
2816+ </record>
2817+
2818+ <!-- Quebec Tax Income -->
2819+
2820+ <record id="l10n_ca_qc_hr_payroll.rule_qc_qit" model="hr.salary.rule">
2821+ <field name="account_debit" model='account.account' search="[('code','like','51210')]"/>
2822+ <field name="account_credit" model='account.account' search="[('code','like','21426')]"/>
2823+ </record>
2824+
2825+ </data>
2826+</openerp>
2827
2828=== added directory 'l10n_ca_qc_hr_payroll_account/static'
2829=== added directory 'l10n_ca_qc_hr_payroll_account/static/src'
2830=== added directory 'l10n_ca_qc_hr_payroll_account/static/src/img'
2831=== added file 'l10n_ca_qc_hr_payroll_account/static/src/img/icon.png'
2832Binary 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
2833=== added directory 'l10n_ca_toponyms/static'
2834=== added directory 'l10n_ca_toponyms/static/src'
2835=== added directory 'l10n_ca_toponyms/static/src/img'
2836=== added file 'l10n_ca_toponyms/static/src/img/icon.png'
2837Binary 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

Subscribers

People subscribed via source and target branches