Merge lp:~openerp-community/openerp-mexico-localization/6.1-hrpayroll into lp:openerp-mexico-localization/6.1

Proposed by Eduardo Vizcaino Granados
Status: Needs review
Proposed branch: lp:~openerp-community/openerp-mexico-localization/6.1-hrpayroll
Merge into: lp:openerp-mexico-localization/6.1
Diff against target: 1668 lines (+1643/-0)
5 files modified
l10n_mx_hr_payroll/__init__.py (+27/-0)
l10n_mx_hr_payroll/__openerp__.py (+53/-0)
l10n_mx_hr_payroll/hr_payroll.py (+430/-0)
l10n_mx_hr_payroll/hr_payroll_data.xml (+977/-0)
l10n_mx_hr_payroll/hr_payroll_view.xml (+156/-0)
To merge this branch: bzr merge lp:~openerp-community/openerp-mexico-localization/6.1-hrpayroll
Reviewer Review Type Date Requested Status
OscarAlca (community) Needs Fixing
Nhomar - Vauxoo Needs Fixing
Review via email: mp+134393@code.launchpad.net

Description of the change

Bases minimas para l10n payroll
conceptos

To post a comment you must log in.
208. By Nhomar - Vauxoo

[MERGE]

209. By Nhomar - Vauxoo

[CLEAN] print arreglados

210. By Nhomar - Vauxoo

[CLEAN] comments

211. By Nhomar - Vauxoo

[CLEAN] comments

Revision history for this message
Nhomar - Vauxoo (nhomar) wrote :

Comentando que debes limpiar los prints.

En las líneas mencionadas

review: Needs Fixing
Revision history for this message
Eduardo Vizcaino Granados (evigra) wrote :

Aun los cambios no estan completos
sigo reparando

212. By Eduardo Vizcaino Granados

[FIX] Modifield field an amended rules

213. By Eduardo Vizcaino Granados

[FIX] Modifield field an amended rules

214. By Eduardo Vizcaino Granados

[FIX] Amended rules

215. By Eduardo Vizcaino Granados

UPDATE

216. By Eduardo Vizcaino Granados

UPDATE

217. By Eduardo Vizcaino Granados

UPDATE

218. By Eduardo Vizcaino Granados

UPDATE

219. By Eduardo Vizcaino Granados

[UPDATE] Rules

220. By Eduardo Vizcaino Granados

[UPDATE] Rules

221. By Eduardo Vizcaino Granados

[UPDATE] Rules

222. By Eduardo Vizcaino Granados

[UPDATE] Rules

223. By Eduardo Vizcaino Granados

[UPDATE] Rules

224. By Eduardo Vizcaino Granados

[UPDATE] Rules

225. By Eduardo Vizcaino Granados

[UPDATE] Rules

Revision history for this message
OscarAlca (oscarolar) wrote :

Aun quedan prints en algunos archivos, hay que quitarlos

review: Needs Fixing
226. By Eduardo Vizcaino Granados

[UPDATE] Rules

227. By Eduardo Vizcaino Granados

[UPDATE] Rules

228. By Eduardo Vizcaino Granados

[UPDATE] Rules

229. By Eduardo Vizcaino Granados

[UPDATE] Rules

230. By Eduardo Vizcaino Granados

[UPDATE] Rules

231. By Eduardo Vizcaino Granados

[UPDATE] Rules

232. By Eduardo Vizcaino Granados

[UPDATE] Rules

233. By Eduardo Vizcaino Granados

[UPDATE] Rules

234. By Eduardo Vizcaino Granados

[UPDATE] Rules

235. By Eduardo Vizcaino Granados

[UPDATE] Rules

236. By Eduardo Vizcaino Granados

[UPDATE] Rules

237. By Eduardo Vizcaino Granados

[UPDATE] Rules

238. By Eduardo Vizcaino Granados

[UPDATE] Rules

239. By Eduardo Vizcaino Granados

[UPDATE] Rules

240. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

241. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

242. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

Unmerged revisions

242. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

241. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

240. By Eduardo Vizcaino Granados

[UPDATE] Rules and methods

239. By Eduardo Vizcaino Granados

[UPDATE] Rules

238. By Eduardo Vizcaino Granados

[UPDATE] Rules

237. By Eduardo Vizcaino Granados

[UPDATE] Rules

236. By Eduardo Vizcaino Granados

[UPDATE] Rules

235. By Eduardo Vizcaino Granados

[UPDATE] Rules

234. By Eduardo Vizcaino Granados

[UPDATE] Rules

233. By Eduardo Vizcaino Granados

[UPDATE] Rules

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'l10n_mx_hr_payroll'
=== added file 'l10n_mx_hr_payroll/__init__.py'
--- l10n_mx_hr_payroll/__init__.py 1970-01-01 00:00:00 +0000
+++ l10n_mx_hr_payroll/__init__.py 2012-12-04 15:42:21 +0000
@@ -0,0 +1,27 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22
23import hr_payroll
24
25
26# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
27
028
=== added file 'l10n_mx_hr_payroll/__openerp__.py'
--- l10n_mx_hr_payroll/__openerp__.py 1970-01-01 00:00:00 +0000
+++ l10n_mx_hr_payroll/__openerp__.py 2012-12-04 15:42:21 +0000
@@ -0,0 +1,53 @@
1# -*- encoding: utf-8 -*-
2###########################################################################
3# Module Writen to OpenERP, Open Source Management Solution
4#
5# Copyright (c) 2012 - Alce Consorsio Imobiliario
6# All Rights Reserved.
7############################################################################
8# Coded by: EDUARDO VIZCAINO GRANADOS (evigra@hotmail.com)
9############################################################################
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU Affero General Public License as
13# published by the Free Software Foundation, either version 3 of the
14# License, or (at your option) any later version.
15#
16# This program is distributed in the hope that it will be useful,
17# but WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19# GNU Affero General Public License for more details.
20#
21# You should have received a copy of the GNU Affero General Public License
22# along with this program. If not, see <http://www.gnu.org/licenses/>.
23#
24##############################################################################
25{
26 "name" : "l10n_mx_hr_payroll",
27 "version": "0.1",
28 "author": "Alce Consorsio Inmobiliario",
29 "category" : "Localization/Mexico",
30 'complexity': "easy",
31 "website": "",
32 "depends": [
33 'hr',
34 'hr_payroll',
35 ],
36 "data": [
37 'hr_payroll_view.xml',
38 ],
39 'update_xml': [
40 'hr_payroll_data.xml',
41 ],
42 "description": """l10n_mx_hr_payroll
43=======================================
44Este modulo agrega las reglas de salario
45para generar la nomina especifica de la
46empresa Alce COnsorsio Inmobiliario
47""",
48 "auto_install": False,
49 "installable": True,
50}
51# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
52
53
054
=== added file 'l10n_mx_hr_payroll/hr_payroll.py'
--- l10n_mx_hr_payroll/hr_payroll.py 1970-01-01 00:00:00 +0000
+++ l10n_mx_hr_payroll/hr_payroll.py 2012-12-04 15:42:21 +0000
@@ -0,0 +1,430 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19# sudo easy_install python-dateutil
20##############################################################################
21
22from osv import osv,fields
23from datetime import *
24import time, sys, subprocess,os
25from dateutil.relativedelta import *
26from dateutil.easter import *
27from dateutil.rrule import *
28from dateutil.parser import *
29
30import netsvc
31import tools
32from tools.translate import _
33import decimal_precision as dp
34
35from tools.safe_eval import safe_eval as eval
36
37class hr_payslip_employees(osv.osv_memory):
38
39 _inherit ='hr.payslip.employees'
40 _description = 'Generate payslips for all selected employees'
41
42 def compute_sheet(self, cr, uid, ids, context=None):
43 print "WIZARD LALO"
44 emp_pool = self.pool.get('hr.employee')
45 slip_pool = self.pool.get('hr.payslip')
46 run_pool = self.pool.get('hr.payslip.run')
47 slip_ids = []
48 if context is None:
49 context = {}
50 data = self.read(cr, uid, ids, context=context)[0]
51 run_data = {}
52 if context and context.get('active_id', False):
53 run_data = run_pool.read(cr, uid, context['active_id'], ['date_start', 'date_end', 'credit_note'])
54 from_date = run_data.get('date_start', False)
55 to_date = run_data.get('date_end', False)
56 credit_note = run_data.get('credit_note', False)
57 if not data['employee_ids']:
58 raise osv.except_osv(_("Warning !"), _("You must select employee(s) to generate payslip(s)"))
59 for emp in emp_pool.browse(cr, uid, data['employee_ids'], context=context):
60
61
62 dayp_from_date = datetime.strptime(from_date,"%Y-%m-%d")
63 day_from_date = dayp_from_date.strftime("%Y-%m-%d")
64
65 dayp_to_date = datetime.strptime(to_date,"%Y-%m-%d")
66 day_to_date = dayp_to_date.strftime("%Y-%m-%d")
67
68
69 # '&',('date_from','<=', day_from_date),('date_to','>=', day_from_date)
70 # '&',('date_from','<=', day_to_date),('date_to','>=', day_to_date)
71
72 # '|','&',('date_from','<=', day_from_date),('date_to','>=', day_from_date),'&',('date_from','<=', day_to_date),('date_to','>=', day_to_date)
73 # '&',('employee_id','=', emp.id),'|','&',('date_from','<=', day_from_date),('date_to','>=', day_from_date),'&',('date_from','<=', day_to_date),('date_to','>=', day_to_date)
74
75 payslip_ids = slip_pool.search(cr,uid,['&',('employee_id','=', emp.id),'|','&',('date_from','<=', day_from_date),('date_to','>=', day_from_date),'&',('date_from','<=', day_to_date),('date_to','>=', day_to_date)])
76
77 print "IDS",payslip_ids
78 print "NAME=",emp.name,emp.id
79 print "DATE=",from_date, " DATE=",to_date
80 if len(payslip_ids)==0:
81
82 slip_data = slip_pool.onchange_employee_id(cr, uid, [], from_date, to_date, emp.id, contract_id=False, context=context)
83 for x in slip_data['value'].get('worked_days_line_ids', False):
84 print "X=====", x
85 res = {
86 'employee_id': emp.id,
87 'name': slip_data['value'].get('name', False),
88 'struct_id': slip_data['value'].get('struct_id', False),
89 'contract_id': slip_data['value'].get('contract_id', False),
90 'payslip_run_id': context.get('active_id', False),
91 'input_line_ids': [(0, 0, x) for x in slip_data['value'].get('input_line_ids', False)],
92 'worked_days_line_ids': [(0, 0, x) for x in slip_data['value'].get('worked_days_line_ids', False)],
93 'date_from': from_date,
94 'date_to': to_date,
95 'credit_note': credit_note,
96 }
97 slip_ids=[slip_pool.create(cr, uid, res, context=context)]
98 print "slip_ids=",slip_ids
99 slip_pool.compute_sheet(cr, uid, slip_ids, context=context)
100 return {'type': 'ir.actions.act_window_close'}
101
102hr_payslip_employees()
103
104
105class hr_payslip(osv.osv):
106 _inherit = 'hr.payslip'
107 def onchange_employee_id(self, cr, uid, ids, date_from, date_to, employee_id=False, contract_id=False, context=None):
108 empolyee_obj = self.pool.get('hr.employee')
109 contract_obj = self.pool.get('hr.contract')
110 worked_days_obj = self.pool.get('hr.payslip.worked_days')
111 input_obj = self.pool.get('hr.payslip.input')
112
113 if context is None:
114 context = {}
115 #delete old worked days lines
116 old_worked_days_ids = ids and worked_days_obj.search(cr, uid, [('payslip_id', '=', ids[0])], context=context) or False
117 if old_worked_days_ids:
118 worked_days_obj.unlink(cr, uid, old_worked_days_ids, context=context)
119
120 #delete old input lines
121 old_input_ids = ids and input_obj.search(cr, uid, [('payslip_id', '=', ids[0])], context=context) or False
122 if old_input_ids:
123 input_obj.unlink(cr, uid, old_input_ids, context=context)
124
125
126 #defaults
127 res = {'value':{
128 'line_ids':[],
129 'input_line_ids': [],
130 'worked_days_line_ids': [],
131 #'details_by_salary_head':[], TODO put me back
132 'name':'',
133 'contract_id': False,
134 'struct_id': False,
135 }
136 }
137 if (not employee_id) or (not date_from) or (not date_to):
138 return res
139 ttyme = datetime.fromtimestamp(time.mktime(time.strptime(date_from, "%Y-%m-%d")))
140 employee_id = empolyee_obj.browse(cr, uid, employee_id, context=context)
141 res['value'].update({
142 'name': _('Salary Slip of %s for %s') % (employee_id.name, tools.ustr(ttyme.strftime('%B-%Y'))),
143 'company_id': employee_id.company_id.id
144 })
145
146 if not context.get('contract', False):
147 #fill with the first contract of the employee
148 contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context)
149 res['value'].update({
150 'struct_id': contract_ids and contract_obj.read(cr, uid, contract_ids[0], ['struct_id'], context=context)['struct_id'][0] or False,
151 'contract_id': contract_ids and contract_ids[0] or False,
152 })
153 else:
154 if contract_id:
155 #set the list of contract for which the input have to be filled
156 contract_ids = [contract_id]
157 #fill the structure with the one on the selected contract
158 contract_record = contract_obj.browse(cr, uid, contract_id, context=context)
159 res['value'].update({
160 'struct_id': contract_record.struct_id.id,
161 'contract_id': contract_id
162 })
163 else:
164 #if we don't give the contract, then the input to fill should be for all current contracts of the employee
165 contract_ids = self.get_contract(cr, uid, employee_id, date_from, date_to, context=context)
166 if not contract_ids:
167 return res
168
169 #computation of the salary input
170 context['lang']="en_US"
171 worked_days_line_ids = self.get_worked_day_lines(cr, uid, contract_ids, date_from, date_to, context=context)
172 input_line_ids = self.get_inputs(cr, uid, contract_ids, date_from, date_to, context=context)
173 res['value'].update({
174 'worked_days_line_ids': worked_days_line_ids,
175 'input_line_ids': input_line_ids,
176 })
177 print "RES=", res
178 return res
179
180
181 def get_worked_day_lines(self, cr, uid, contract_ids, date_from, date_to, context=None):
182 def was_on_leave(employee_id, datetime_day, context=None):
183 res = False
184 day = datetime_day.strftime("%Y-%m-%d")
185
186 holiday_ids = self.pool.get('hr.holidays').search(cr, uid, [('state','=','validate'),('employee_id','=',employee_id),('type','=','remove'),('date_from','<=',day),('date_to','>=',day)])
187 if holiday_ids:
188 res = self.pool.get('hr.holidays').browse(cr, uid, holiday_ids, context=context)[0].holiday_status_id.name
189 return res
190
191 res = []
192 print "CONTEXT=========", context
193
194 for contract in self.pool.get('hr.contract').browse(cr, uid, contract_ids, context=context):
195 if not contract.working_hours:
196 #fill only if the contract as a working schedule linked
197 continue
198 attendances = {
199 'name': _("Normal Working Days paid at 100%"),
200 'sequence': 1,
201 'code': 'WORK100',
202 'number_of_days': 0.0,
203 'number_of_hours': 0.0,
204 'contract_id': contract.id,
205 }
206 leaves = {}
207 day_from = datetime.strptime(date_from,"%Y-%m-%d")
208 day_to = datetime.strptime(date_to,"%Y-%m-%d")
209 nb_of_days = (day_to - day_from).days + 1
210
211
212 for day in range(0, nb_of_days):
213 working_hours_on_day = self.pool.get('resource.calendar').working_hours_on_day(cr, uid, contract.working_hours, day_from + timedelta(days=day), context)
214 print "DAY=",day, " HOURS=",contract.working_hours, " working_hours_on_day====", working_hours_on_day
215 if working_hours_on_day:
216 #the employee had to work
217
218 leave_type = was_on_leave(contract.employee_id.id, day_from + timedelta(days=day), context=context)
219 print "leave_type=",leave_type
220 if leave_type:
221 #if he was on leave, fill the leaves dict
222 if leave_type in leaves:
223 leaves[leave_type]['number_of_days'] += 1.0
224 leaves[leave_type]['number_of_hours'] += working_hours_on_day
225 else:
226 code=leave_type.replace(" ","_").upper()
227 leaves[leave_type] = {
228 'name': leave_type,
229 'sequence': 5,
230 'code': code,
231 'number_of_days': 1.0,
232 'number_of_hours': working_hours_on_day,
233 'contract_id': contract.id,
234 }
235 else:
236 #add the input vals to tmp (increment if existing)
237 attendances['number_of_days'] += 1.0
238 attendances['number_of_hours'] += working_hours_on_day
239 holidays_obj = self.pool.get('hr.holidays.status')
240 holidays_ids=holidays_obj.search(cr, uid, [])
241 for holiday in holidays_obj.browse(cr, uid, holidays_ids, context=context):
242 if holiday.name not in leaves:
243 code=holiday.name.replace(" ","_").upper()
244 leaves[holiday.name] = {
245 'name': holiday.name,
246 'sequence': 5,
247 'code': code,
248 'number_of_days': 0.0,
249 'number_of_hours': 0,
250 'contract_id': contract.id,
251 }
252
253 leaves = [value for key,value in leaves.items()]
254 res += [attendances] + leaves
255 return res
256
257 def compute_sheet(self, cr, uid, ids, context=None):
258 print "IDS===========", ids
259 slip_line_pool = self.pool.get('hr.payslip.line')
260 sequence_obj = self.pool.get('ir.sequence')
261 for payslip in self.browse(cr, uid, ids, context=context):
262 number = payslip.number or sequence_obj.get(cr, uid, 'salary.slip')
263
264 #delete old payslip lines
265 old_slipline_ids = slip_line_pool.search(cr, uid, [('slip_id', '=', payslip.id)], context=context)
266# old_slipline_ids
267
268 if old_slipline_ids:
269 slip_line_pool.unlink(cr, uid, old_slipline_ids, context=context)
270 print "ANTES"
271 if payslip.contract_id:
272 #set the list of contract for which the rules have to be applied
273 contract_ids = [payslip.contract_id.id]
274 else:
275
276 #if we don't give the contract, then the rules to apply should be for all current contracts of the employee
277 contract_ids = self.get_contract(cr, uid, payslip.employee_id, payslip.date_from, payslip.date_to, context=context)
278 print "DESPUES"
279 lines = [(0,0,line) for line in self.pool.get('hr.payslip').get_payslip_lines(cr, uid, contract_ids, payslip.id, context=context)]
280 print "lines=",lines
281 self.write(cr, uid, [payslip.id], {'line_ids': lines, 'number': number,}, context=context)
282 return True
283
284 def get_inputs(self, cr, uid, contract_ids, date_from, date_to, context=None):
285 res = []
286 contract_obj = self.pool.get('hr.contract')
287 concept_obj = self.pool.get('hr.contract.concept')
288 rule_obj = self.pool.get('hr.salary.rule')
289
290 structure_ids = contract_obj.get_all_structures(cr, uid, contract_ids, context=context)
291 rule_ids = self.pool.get('hr.payroll.structure').get_all_rules(cr, uid, structure_ids, context=context)
292 sorted_rule_ids = [id for id, sequence in sorted(rule_ids, key=lambda x:x[1])]
293 for contract in contract_obj.browse(cr, uid, contract_ids, context=context):
294 ###########################
295 today=datetime.today().date()
296
297 concept_id=concept_obj.search(cr, uid, [('contract_id','=',contract.id),('code','=','ANTIG')])
298 inicio=datetime(int(str(contract.date_start)[:4]),int(str(contract.date_start)[5:7]),int(str(contract.date_start)[8:10]))
299 days=today - inicio.date()
300 str_days=str(days)
301 antiguedad = float(int(str_days.replace(str_days[-14:],"")))/365
302
303 vals_contract={"amount":antiguedad}
304 concept_obj.write(cr, uid, concept_id, vals_contract)
305
306 inicio2= datetime(int(today.strftime("%Y")),01,01)
307
308 if inicio2 > inicio:
309 fecha=inicio2
310 else:
311 fecha=inicio
312
313 concept_id=concept_obj.search(cr, uid, [('contract_id','=',contract.id),('code','=','DLANU')])
314 days=today - fecha.date()
315 str_days=str(days)
316 DLANU = float(int(str_days.replace(str_days[-14:],"")))/365
317 vals_contract={"amount":DLANU}
318 concept_obj.write(cr, uid, concept_id, vals_contract)
319
320
321
322
323
324 ###########################
325 for rule in rule_obj.browse(cr, uid, sorted_rule_ids, context=context):
326 if rule.input_ids:
327 for input in rule.input_ids:
328 inputs = {
329 'name': input.name,
330 'code': input.code,
331 'amount': 0.0,
332 'contract_id': contract.id,
333 }
334 res += [inputs]
335 return res
336
337hr_payslip()
338class hr_contract(osv.osv):
339 _inherit = 'hr.contract'
340 _columns = {
341 'concept_ids': fields.one2many('hr.contract.concept','contract_id','Concept')
342 }
343 def create(self, cr, uid, vals, context=False):
344 ids=False
345 res=self.save(cr, uid, vals, ids)
346 return res
347 def write(self, cr, uid, ids, vals, context=None, update=True):
348 res=self.save(cr, uid, vals, ids)
349 return res
350 def save(self, cr, uid, vals, ids, context=False):
351 obj_concept = self.pool.get('hr.contract.concept')
352 if (type(ids) is list and len(ids)>0) or ids==False:
353 if(ids==0 or ids==False):
354 ids=[]
355 res = super(hr_contract, self).create(cr, uid, vals, context=context)
356 ids.append(res)
357 data_before = self.browse(cr, uid, ids)[0]
358 before_name = data_before.name
359 data = self.browse(cr, uid, ids)[0]
360 else:
361 data_before = self.browse(cr, uid, ids)[0]
362 res = super(hr_contract, self).write(cr, uid, ids, vals)
363 data = self.browse(cr, uid, ids)[0]
364 if len(data.concept_ids)==0:
365 vals_concept={"contract_id":ids[0],"code":"DAGUI", "name":"Dias de aguinaldo","description":"Son los dias otorgados por la empresa", "amount":15}
366 obj_concept.create(cr, uid, vals_concept, context=context)
367 vals_concept={"contract_id":ids[0],"code":"ANTIG", "name":"Antiguedad","description":"Son los años de servicio laborandos en este contrato", "amount":0}
368 obj_concept.create(cr, uid, vals_concept, context=context)
369 vals_concept={"contract_id":ids[0],"code":"CINFO", "name":"Prestamo Infonavit","description":"Es la retencion al empleado para el pago de su credito", "amount":0}
370 obj_concept.create(cr, uid, vals_concept, context=context)
371 vals_concept={"contract_id":ids[0],"code":"DLANU", "name":"Dias Laborados en el año","description":"Son los dias laborados durante el año, para determinar proporciones", "amount":0}
372 obj_concept.create(cr, uid, vals_concept, context=context)
373
374 return res
375hr_contract()
376
377class hr_payslip_run(osv.osv):
378 _inherit = 'hr.payslip.run'
379 _columns = {
380 'date': fields.date('Date'),
381 'type': fields.selection((('nor','Normal'), ('agu','Aguinaldo'), ('ptu','PTU')), 'Type'),
382 'schedule_pay': fields.selection([
383 ('monthly', 'Monthly'),
384 ('quarterly', 'Quarterly'),
385 ('semi-annually', 'Semi-annually'),
386 ('annually', 'Annually'),
387 ('weekly', 'Weekly'),
388 ('bi-weekly', 'Bi-weekly'),
389 ('bi-monthly', 'Bi-monthly'),
390 ], 'Scheduled Pay', select=True),
391 }
392 _defaults = {
393 'type': 'nor',
394 }
395hr_payslip_run()
396"""
397class hr_holidays_status(osv.osv):
398 _name = 'hr.holidays.status'
399 _columns = {
400 'code': fields.char('Code', size=20, required=True, readonly=False),
401 }
402hr_holidays_status()
403"""
404
405class hr_contract_concept(osv.osv):
406 _name = 'hr.contract.concept'
407 _columns = {
408 'contract_id': fields.many2one('hr.contract', 'Contract',),
409 'history_ids': fields.one2many('hr.concept.history','concept_id','History'),
410 'name': fields.char('Concept', size=75, required=True, readonly=False),
411 'code': fields.char('Code', size=20, required=True, readonly=False),
412 'description': fields.char('Description', size=250, required=False, readonly=False),
413 'concept_type': fields.selection((('rec','Recursive'), ('val','Value')), 'Amount Type'),
414 'amount': fields.float('Amount'),
415 'amount_type': fields.selection((('per','Percentage'), ('val','Value')), 'Amount Type'),
416 }
417hr_contract_concept()
418
419class hr_concept_history(osv.osv):
420 _name = 'hr.concept.history'
421 _columns = {
422 'concept_id': fields.many2one('hr.contract.concept', 'Concept',),
423 'date': fields.date('Date'),
424 'amount_initial':fields.float('Amount Initial'),
425 'amount_final':fields.float('Amount Final'),
426 'amount':fields.float('Amount'),
427 }
428hr_concept_history()
429
430
0431
=== added file 'l10n_mx_hr_payroll/hr_payroll_data.xml'
--- l10n_mx_hr_payroll/hr_payroll_data.xml 1970-01-01 00:00:00 +0000
+++ l10n_mx_hr_payroll/hr_payroll_data.xml 2012-12-04 15:42:21 +0000
@@ -0,0 +1,977 @@
1<?xml version="1.0"?>
2<openerp>
3 <data>
4 <!-- ESTRUCTURA SALARIAL -->
5 <record id="nomina" model="hr.payroll.structure">
6 <field name="name">Nomina</field>
7 <field name="code">NOM</field>
8 </record>
9 <!-- FIN ESTRUCTURA SALARIAL -->
10
11 <!-- CATEGORIAS -->
12 <record id="CAT_CONCEPTOS" model="hr.salary.rule.category">
13 <field name="name">CONCEPTOS EMPLEADO</field>
14 <field name="code">CONCEP</field>
15 </record>
16 <record id="CAT_REGLAS" model="hr.salary.rule.category">
17 <field name="name">REGLAS</field>
18 <field name="code">REGLAS</field>
19 </record>
20
21 <record id="CAT_CONFIGURACIONES" model="hr.salary.rule.category">
22 <field name="name">CONFIGURACIONES</field>
23 <field name="code">CONFIGURACIONES</field>
24 </record>
25 <record id="CAT_PERCEPCIONES_G" model="hr.salary.rule.category">
26 <field name="name">PRECEPCIONES GRAVADAS</field>
27 <field name="code">PGRAVA</field>
28 </record>
29 <record id="CAT_PERCEPCIONES_E" model="hr.salary.rule.category">
30 <field name="name">PRECEPCIONES EXENTAS</field>
31 <field name="code">PEXENT</field>
32 </record>
33 <record id="CAT_PERCEPCIONES" model="hr.salary.rule.category">
34 <field name="name">PERCEPCIONES</field>
35 <field name="code">PERCEPCIONES</field>
36 </record>
37 <record id="CAT_IMSS_G" model="hr.salary.rule.category">
38 <field name="name">IMSS GRAVADO</field>
39 <field name="code">IGRAVA</field>
40 </record>
41 <record id="CAT_OBLIGACIONES" model="hr.salary.rule.category">
42 <field name="name">IMSS EXENTO</field>
43 <field name="code">IEXENT</field>
44 </record>
45 <record id="CAT_IMSS" model="hr.salary.rule.category">
46 <field name="name">IMSS</field>
47 <field name="code">IMSS</field>
48 </record>
49
50 <record id="CAT_DEDUCCIONES" model="hr.salary.rule.category">
51 <field name="name">DEDUCCIONES</field>
52 <field name="code">DEDUCCIONES</field>
53 </record>
54
55 <record id="CAT_OBLIGACIONES" model="hr.salary.rule.category">
56 <field name="name">OBLIGACIONES</field>
57 <field name="code">OBLIGACIONES</field>
58 </record>
59 <!-- FIN CATEGORIAS -->
60
61
62 <!-- REGLAS SALARIALES -->
63 <record id="REG10" model="hr.salary.rule">
64 <field name="category_id" ref="CAT_CONFIGURACIONES"/>
65 <field name="appears_on_payslip" eval="False"/>
66 <field name="name">Vacaciones</field>
67 <field name="sequence">10</field>
68 <field name="code">VACACI</field>
69 <field name="condition_select">none</field>
70 <field name="amount_select">code</field>
71 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
72if antiguedad<2:
73 vac=6
74elif antiguedad<3:
75 vac=8
76elif antiguedad<4:
77 vac=10
78elif antiguedad<5:
79 vac=12
80elif antiguedad<10:
81 vac=14
82elif antiguedad<15:
83 vac=16
84elif antiguedad<20:
85 vac=18
86elif antiguedad<25:
87 vac=20
88elif antiguedad<30:
89 vac=22
90elif antiguedad<35:
91 vac=24
92result = vac]]></field>
93 </record>
94
95
96 <record id="REG12" model="hr.salary.rule">
97 <field name="category_id" ref="CAT_CONFIGURACIONES"/>
98 <field name="name">Salario General Vigente al DF</field>
99 <field name="sequence">12</field>
100 <field name="code">SGVDF</field>
101 <field name="condition_select">none</field>
102 <field name="amount_select">code</field>
103 <field name="appears_on_payslip" eval="False"/>
104 <field name="amount_python_compute">result = 62.33</field>
105 </record>
106
107
108 <record id="REG14" model="hr.salary.rule">
109 <field name="category_id" ref="CAT_CONFIGURACIONES"/>
110 <field name="name">Zona salarial del empleado</field>
111 <field name="sequence">14</field>
112 <field name="code">ZSALA</field>
113 <field name="condition_select">none</field>
114 <field name="amount_select">code</field>
115 <field name="appears_on_payslip" eval="False"/>
116 <field name="amount_python_compute">result = 59 </field>
117 </record>
118
119
120
121 <record id="REG9" model="hr.salary.rule">
122 <field name="category_id" ref="CAT_CONCEPTOS"/>
123 <field name="appears_on_payslip" eval="False"/>
124 <field name="name">Antiguedad (Años)</field>
125 <field name="sequence">9</field>
126 <field name="code">ANTIG</field>
127 <field name="condition_select">none</field>
128 <field name="amount_select">code</field>
129 <field name="amount_python_compute"><![CDATA[result=0
130for concept in contract.concept_ids:
131 if concept.code == 'ANTIG':
132 result=concept.amount]]></field>
133 </record>
134
135 <record id="REG18" model="hr.salary.rule">
136 <field name="category_id" ref="CAT_CONCEPTOS"/>
137 <field name="appears_on_payslip" eval="False"/>
138 <field name="name">Dias de Aguinaldo</field>
139 <field name="sequence">18</field>
140 <field name="code">DAGUI</field>
141 <field name="condition_select">none</field>
142 <field name="amount_select">code</field>
143 <field name="amount_python_compute"><![CDATA[monto = [c.amount for c in contract.concept_ids if c.code == 'DAGUI']
144result=monto and monto[0] or 0.0 ]]></field>
145 </record>
146
147 <record id="REG20" model="hr.salary.rule">
148 <field name="category_id" ref="CAT_CONCEPTOS"/>
149 <field name="appears_on_payslip" eval="False"/>
150 <field name="name">Salario Diario Integrado</field>
151 <field name="sequence">20</field>
152 <field name="code">SDI</field>
153 <field name="condition_select">none</field>
154 <field name="amount_select">code</field>
155 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
156aguinaldo=DAGUI
157vac =VACACI
158
159factor=(vac*.25+aguinaldo)/365+1
160result = factor * contract.wage]]></field>
161 </record>
162 <record id="REG21" model="hr.salary.rule">
163 <field name="category_id" ref="CAT_CONCEPTOS"/>
164 <field name="appears_on_payslip" eval="False"/>
165 <field name="name">Vacaciones Disfrutadas</field>
166 <field name="sequence">20</field>
167 <field name="code">VDISFR</field>
168 <field name="condition_select">none</field>
169 <field name="amount_select">code</field>
170 <field name="amount_python_compute"><![CDATA[monto = [c.amount for c in contract.concept_ids if c.code == 'DAGUI']
171result=monto and monto[0] or 0.0 ]]></field>
172 </record>
173
174
175
176
177
178
179
180
181
182
183 <record id="REG40" model="hr.salary.rule">
184 <field name="category_id" ref="CAT_REGLAS"/>
185 <field name="name">PAGO DE AGUINALDO</field>
186 <field name="sequence">16</field>
187 <field name="code">PAGUI</field>
188 <field name="condition_select">python</field>
189 <field name="condition_python"><![CDATA[result=0
190if payslip.payslip_run_id=='agu':
191 result=1]]></field>
192 <field name="amount_select">code</field>
193 <field name="amount_python_compute">result= 1</field>
194
195 </record>
196
197
198
199
200
201
202
203
204
205
206
207 <!-- ######################################### -->
208 <record id="REG100" model="hr.salary.rule">
209 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
210 <field name="appears_on_payslip" eval="False"/>
211 <field name="name">Sueldo (ISR Gravado)</field>
212 <field name="sequence">100</field>
213 <field name="code">S_ISG</field>
214 <field name="condition_select">none</field>
215 <field name="amount_select">code</field>
216 <field name="amount_python_compute">result = contract.wage * worked_days.WORK100.number_of_days</field>
217 </record>
218 <record id="REG101" model="hr.salary.rule">
219 <field name="category_id" ref="CAT_IMSS_G"/>
220 <field name="appears_on_payslip" eval="False"/>
221 <field name="name">Sueldo (IMSS Gravado)</field>
222 <field name="sequence">101</field>
223 <field name="code">S_IMG</field>
224 <field name="condition_select">none</field>
225 <field name="amount_select">code</field>
226 <field name="amount_python_compute">result = S_ISG</field>
227 </record>
228 <record id="RE102" model="hr.salary.rule">
229 <field name="category_id" ref="CAT_PERCEPCIONES"/>
230 <field name="name">Sueldo</field>
231 <field name="sequence">102</field>
232 <field name="code">SUELD</field>
233 <field name="condition_select">none</field>
234 <field name="amount_select">code</field>
235 <field name="amount_python_compute">result = S_ISG</field>
236 </record>
237
238
239 <!--
240 <record id="REG51-1" model="hr.structure.salary.rule.rel">
241 <field name="struct_id" ref="nomina"/>
242 <field name="rule_id" ref="REG51"/>
243 </record>
244
245 <record id="ACCION" model="hr.rule.input">
246 <field name="name">Codigo de accion</field>
247 <field name="code">CODE</field>
248 <field name="input_id" ref="REG51"/>
249 </record>
250 <record id="MONTO" model="hr.rule.input">
251 <field name="name">Monto de accion</field>
252 <field name="code">AMOUNT</field>
253 <field name="input_id" ref="REG51"/>
254 </record>
255 -->
256
257 <!-- ######################################### -->
258 <record id="REG110" model="hr.salary.rule">
259 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
260 <field name="appears_on_payslip" eval="False"/>
261 <field name="name">Septimo Dia (ISR Gravado)</field>
262 <field name="sequence">110</field>
263 <field name="code">SD_ISG</field>
264 <field name="condition_select">none</field>
265 <field name="amount_select">code</field>
266 <field name="amount_python_compute">result = contract.wage * worked_days.WORK100.number_of_days / 6</field>
267 </record>
268 <record id="REG111" model="hr.salary.rule">
269 <field name="category_id" ref="CAT_IMSS_G"/>
270 <field name="name">Septimo Dia (IMSS Gravado)</field>
271 <field name="appears_on_payslip" eval="False"/>
272 <field name="sequence">111</field>
273 <field name="code">SD_IMG</field>
274 <field name="condition_select">none</field>
275 <field name="amount_select">code</field>
276 <field name="amount_python_compute">result = SD_ISG</field>
277 </record>
278 <record id="REG112" model="hr.salary.rule">
279 <field name="category_id" ref="CAT_PERCEPCIONES"/>
280 <field name="name">Septimo Dia</field>
281 <field name="sequence">112</field>
282 <field name="code">SDIA</field>
283 <field name="condition_select">none</field>
284 <field name="amount_select">code</field>
285 <field name="amount_python_compute">result = SD_ISG</field>
286 </record>
287
288 <!-- ######################################### -->
289 <record id="REG120" model="hr.salary.rule">
290 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
291 <field name="appears_on_payslip" eval="False"/>
292 <field name="name">Bono de Asistencia (ISR Gravado)</field>
293 <field name="sequence">120</field>
294 <field name="code">BA_ISG</field>
295 <field name="condition_select">none</field>
296 <field name="amount_select">code</field>
297 <field name="amount_python_compute">result = 0.10 * contract.wage * worked_days.WORK100.number_of_days * 7 /6</field>
298 </record>
299 <record id="REG121" model="hr.salary.rule">
300 <field name="category_id" ref="CAT_IMSS_G"/>
301 <field name="appears_on_payslip" eval="False"/>
302 <field name="name">Bono de Asistencia (IMSS Gravado)</field>
303 <field name="sequence">121</field>
304 <field name="code">BA_IMG</field>
305 <field name="condition_select">none</field>
306 <field name="amount_select">code</field>
307 <field name="amount_python_compute">result = BA_ISG</field>
308 </record>
309 <record id="REG122" model="hr.salary.rule">
310 <field name="category_id" ref="CAT_PERCEPCIONES"/>
311 <field name="name">Bono de Asistencia</field>
312 <field name="sequence">122</field>
313 <field name="code">BA</field>
314 <field name="condition_select">none</field>
315 <field name="amount_select">code</field>
316 <field name="amount_python_compute">result = BA_ISG</field>
317 </record>
318
319 <!-- ######################################### -->
320 <record id="REG130" model="hr.salary.rule">
321 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
322 <field name="appears_on_payslip" eval="False"/>
323 <field name="name">Bono de Puntualidad (ISR Gravado)</field>
324 <field name="sequence">130</field>
325 <field name="code">BP_ISG</field>
326 <field name="condition_select">none</field>
327 <field name="amount_select">code</field>
328 <field name="amount_python_compute">result = 0.10 * contract.wage * worked_days.WORK100.number_of_days * 7 /6</field>
329 </record>
330 <record id="REG131" model="hr.salary.rule">
331 <field name="category_id" ref="CAT_IMSS_G"/>
332 <field name="name">Bono de Puntualidad (IMSS Gravado)</field>
333 <field name="appears_on_payslip" eval="False"/>
334 <field name="sequence">131</field>
335 <field name="code">BP_IMG</field>
336 <field name="condition_select">none</field>
337 <field name="amount_select">code</field>
338 <field name="amount_python_compute">result = BP_ISG</field>
339 </record>
340 <record id="REG132" model="hr.salary.rule">
341 <field name="category_id" ref="CAT_PERCEPCIONES"/>
342 <field name="name">Bono de Puntualidad</field>
343 <field name="sequence">132</field>
344 <field name="code">SD</field>
345 <field name="condition_select">none</field>
346 <field name="amount_select">code</field>
347 <field name="amount_python_compute">result = BA_ISG</field>
348 </record>
349
350
351 <!-- ######################################### -->
352 <record id="REG140" model="hr.salary.rule">
353 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
354 <field name="name">Despensa (ISR Gravado)</field>
355 <field name="appears_on_payslip" eval="False"/>
356 <field name="sequence">140</field>
357 <field name="code">D_ISG</field>
358 <field name="condition_select">none</field>
359 <field name="amount_select">code</field>
360 <field name="amount_python_compute">result = SGVDF * 0.4 * worked_days.WORK100.number_of_days * 7 /6</field>
361 </record>
362 <record id="REG141" model="hr.salary.rule">
363 <field name="category_id" ref="CAT_IMSS_G"/>
364 <field name="name">Despensa (IMSS Gravado)</field>
365 <field name="appears_on_payslip" eval="False"/>
366 <field name="sequence">141</field>
367 <field name="code">D_IMG</field>
368 <field name="condition_select">none</field>
369 <field name="amount_select">code</field>
370 <field name="amount_python_compute">result = D_ISG</field>
371 </record>
372 <record id="REG142" model="hr.salary.rule">
373 <field name="category_id" ref="CAT_PERCEPCIONES"/>
374 <field name="name">Despensa</field>
375 <field name="sequence">142</field>
376 <field name="code">D</field>
377 <field name="condition_select">none</field>
378 <field name="amount_select">code</field>
379 <field name="amount_python_compute">result = D_ISG</field>
380 </record>
381
382
383 <!-- ######################################### -->
384 <record id="REG150" model="hr.salary.rule">
385 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
386 <field name="name">Aguinaldo (ISR Gravado)</field>
387 <field name="appears_on_payslip" eval="False"/>
388 <field name="sequence">150</field>
389 <field name="code">A_ISG</field>
390 <field name="condition_select">python</field>
391 <field name="condition_python"><![CDATA[antiguedad=ANTIG
392aguinaldo=DAGUI
393if antiguedad>1:
394 proporcional=1
395else:
396 proporcional=antiguedad
397
398monto_aguinaldo = proporcional * aguinaldo * contract.wage
399
400result=0
401if payslip.payslip_run_id.type=='agu' and monto_aguinaldo - 30 * ZSALA>0:
402 result=1]]></field>
403 <field name="amount_select">code</field>
404 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
405aguinaldo=DAGUI
406if antiguedad>1:
407 proporcional=1
408else:
409 proporcional=antiguedad
410monto_aguinaldo = proporcional * aguinaldo * contract.wage
411result= monto_aguinaldo - 30 * ZSALA]]></field>
412 </record>
413
414 <record id="REG151" model="hr.salary.rule">
415 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
416 <field name="name">Aguinaldo (ISR Exento)</field>
417 <field name="appears_on_payslip" eval="False"/>
418 <field name="sequence">151</field>
419 <field name="code">A_ISE</field>
420 <field name="condition_select">python</field>
421
422 <field name="condition_python"><![CDATA[result=0
423if payslip.payslip_run_id.type=='agu':
424 result=1]]></field>
425
426 <field name="amount_select">code</field>
427 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
428aguinaldo=DAGUI
429if antiguedad>1:
430 proporcional=1
431else:
432 proporcional=antiguedad
433result = proporcional * aguinaldo * contract.wage
434if result> 30 * ZSALA and PAGUI>0:
435 result= monto_aguinaldo - 30 * ZSALA]]></field>
436 </record>
437
438
439 <record id="REG152" model="hr.salary.rule">
440 <field name="category_id" ref="CAT_IMSS_G"/>
441 <field name="name">Aguinaldo (IMSS Gravado)</field>
442 <field name="appears_on_payslip" eval="False"/>
443 <field name="sequence">152</field>
444 <field name="code">A_IMG</field>
445 <field name="condition_select">python</field>
446 <field name="condition_python"><![CDATA[antiguedad=ANTIG
447aguinaldo=DAGUI
448if antiguedad>1:
449 proporcional=1
450else:
451 proporcional=antiguedad
452monto_aguinaldo = proporcional * aguinaldo * contract.wage
453
454result=0
455if payslip.payslip_run_id.type=='agu' and monto_aguinaldo - 30 * ZSALA>0:
456 result=1]]></field>
457 <field name="amount_select">code</field>
458 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
459aguinaldo=DAGUI
460if antiguedad>1:
461 proporcional=1
462else:
463 proporcional=antiguedad
464monto_aguinaldo = proporcional * aguinaldo * contract.wage
465result= monto_aguinaldo - 30 * ZSALA]]></field>
466 </record>
467 <record id="REG153" model="hr.salary.rule">
468 <field name="category_id" ref="CAT_PERCEPCIONES"/>
469 <field name="name">Aguinaldo</field>
470 <field name="sequence">153</field>
471 <field name="code">A</field>
472 <field name="condition_select">python</field>
473 <field name="condition_python"><![CDATA[result=0
474if payslip.payslip_run_id.type=='agu':
475 result=1]]></field>
476 <field name="amount_select">code</field>
477 <field name="amount_python_compute"><![CDATA[antiguedad=ANTIG
478aguinaldo=DAGUI
479if antiguedad>1:
480 proporcional=1
481else:
482 proporcional=antiguedad
483result = proporcional * aguinaldo * contract.wage]]></field>
484 </record>
485
486 <record id="REG154" model="hr.salary.rule">
487 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
488 <field name="name">Vacaciones (ISR Gravado)</field>
489 <field name="appears_on_payslip" eval="False"/>
490 <field name="sequence">154</field>
491 <field name="code">V_ISG</field>
492 <field name="condition_select">python</field>
493 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
494 <field name="amount_select">code</field>
495 <field name="amount_python_compute">result = contract.wage * worked_days.LEGAL_LEAVES.number_of_days </field>
496 </record>
497
498 <record id="REG155" model="hr.salary.rule">
499 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
500 <field name="name">Vacaciones (ISR Exento)</field>
501 <field name="appears_on_payslip" eval="False"/>
502 <field name="sequence">155</field>
503 <field name="code">V_ISE</field>
504 <field name="condition_select">python</field>
505 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
506 <field name="amount_select">code</field>
507 <field name="amount_python_compute">result = 0</field>
508 </record>
509
510 <record id="REG156" model="hr.salary.rule">
511 <field name="category_id" ref="CAT_PERCEPCIONES"/>
512 <field name="name">Vacaciones</field>
513 <field name="sequence">155</field>
514 <field name="code">VPAGAD</field>
515 <field name="condition_select">python</field>
516 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
517 <field name="amount_select">code</field>
518 <field name="amount_python_compute">result = contract.wage * worked_days.LEGAL_LEAVES.number_of_days </field>
519 </record>
520
521
522
523 <record id="REG157" model="hr.salary.rule">
524 <field name="category_id" ref="CAT_PERCEPCIONES_G"/>
525 <field name="name">Prima Vacacional (ISR Gravado)</field>
526 <field name="appears_on_payslip" eval="False"/>
527 <field name="sequence">157</field>
528 <field name="code">PV_ISG</field>
529 <field name="condition_select">python</field>
530 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
531 <field name="amount_select">code</field>
532 <field name="amount_python_compute">result = contract.wage * worked_days.LEGAL_LEAVES.number_of_days * 0.25</field>
533 </record>
534
535 <record id="REG158" model="hr.salary.rule">
536 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
537 <field name="name">Prima Vacacional (ISR Exento)</field>
538 <field name="appears_on_payslip" eval="False"/>
539 <field name="sequence">158</field>
540 <field name="code">PV_ISE</field>
541 <field name="condition_select">python</field>
542 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
543 <field name="amount_select">code</field>
544 <field name="amount_python_compute">result = 0</field>
545 </record>
546 <record id="REG159" model="hr.salary.rule">
547 <field name="category_id" ref="CAT_PERCEPCIONES"/>
548 <field name="name">Prima Vacacional</field>
549 <field name="sequence">158</field>
550 <field name="code">PRIVAC</field>
551 <field name="condition_select">python</field>
552 <field name="condition_python"><![CDATA[result=worked_days.LEGAL_LEAVES.number_of_days>0]]></field>
553 <field name="amount_select">code</field>
554 <field name="amount_python_compute">result = contract.wage * worked_days.LEGAL_LEAVES.number_of_days * 0.25</field>
555 </record>
556
557
558 <record id="REG160" model="hr.salary.rule">
559 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
560 <field name="name">Incapacidad (por riesgo de trabajo)</field>
561 <field name="sequence">160</field>
562 <field name="code">I_RT</field>
563 <field name="condition_select">python</field>
564 <field name="condition_python"><![CDATA[result=worked_days.OCCUPATIONAL_RISK_LEAVES.number_of_days>0]]></field>
565 <field name="amount_select">code</field>
566 <field name="amount_python_compute">result = 0</field>
567 </record>
568 <record id="REG161" model="hr.salary.rule">
569 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
570 <field name="name">Incapacidad (por enfermedad general)</field>
571 <field name="sequence">161</field>
572 <field name="code">I_EG</field>
573 <field name="condition_select">python</field>
574 <field name="condition_python"><![CDATA[result=worked_days.GENERAL_DISEASE_LEAVES.number_of_days>0]]></field>
575 <field name="amount_select">code</field>
576 <field name="amount_python_compute">result = worked_days.GENERAL_DISEASE_LEAVES.number_of_days * contract.wage * 0.4</field>
577 </record>
578
579
580 <record id="REG162" model="hr.salary.rule">
581 <field name="category_id" ref="CAT_PERCEPCIONES_E"/>
582 <field name="name">Incapacidad (por embarazo y maternidad)</field>
583 <field name="sequence">162</field>
584 <field name="code">I_EM</field>
585 <field name="condition_select">python</field>
586 <field name="condition_python"><![CDATA[result=worked_days.PREGNANCY_LEAVES.number_of_days>0]]></field>
587 <field name="amount_select">code</field>
588 <field name="amount_python_compute">result = 0</field>
589 </record>
590
591
592
593 <!--
594 <record id="REG160" model="hr.salary.rule">
595 <field name="category_id" ref="hr_payroll.PEXENT"/>
596 <field name="name">FINIQUITO Vacaciones </field>
597 <field name="sequence">160</field>
598 <field name="code">FAGUI</field>
599 <field name="condition_select">python</field>
600 <field name="condition_python">result = PAGUI</field>
601 <field name="amount_select">code</field>
602 <field name="amount_python_compute"><![CDATA[
603antiguedad=ANTIG
604result = contract.wage * 20 * antiguedad
605
606 ]]></field>
607 </record>
608 -->
609
610
611 <record id="REG190" model="hr.salary.rule">
612 <field name="category_id" ref="CAT_CONCEPTOS"/>
613 <field name="appears_on_payslip" eval="False"/>
614 <field name="name">PERCEPCIONES EXENTAS</field>
615 <field name="sequence">190</field>
616 <field name="code">PEXENT</field>
617 <field name="condition_select">none</field>
618 <field name="amount_select">code</field>
619 <field name="amount_python_compute">result = categories.PEXENT</field>
620 </record>
621 <record id="REG191" model="hr.salary.rule">
622 <field name="category_id" ref="CAT_CONCEPTOS"/>
623 <field name="appears_on_payslip" eval="False"/>
624 <field name="name">PERCEPCIONES GRAVADAS</field>
625 <field name="sequence">191</field>
626 <field name="code">PGRAVA</field>
627 <field name="condition_select">none</field>
628 <field name="amount_select">code</field>
629 <field name="amount_python_compute">result = categories.PGRAVA</field>
630 </record>
631 <record id="REG195" model="hr.salary.rule">
632 <field name="category_id" ref="CAT_CONCEPTOS"/>
633 <field name="name">PERCEPCIONES</field>
634 <field name="sequence">195</field>
635 <field name="code">PERCEPCIONES</field>
636 <field name="condition_select">none</field>
637 <field name="amount_select">code</field>
638 <field name="amount_python_compute">result = categories.PERCEPCIONES</field>
639 </record>
640
641 <record id="REG199" model="hr.salary.rule">
642 <field name="category_id" ref="CAT_CONFIGURACIONES"/>
643 <field name="appears_on_payslip" eval="False"/>
644 <field name="name">ISPT</field>
645 <field name="sequence">199</field>
646 <field name="code">ISPT</field>
647 <field name="condition_select">none</field>
648 <field name="amount_select">code</field>
649 <field name="amount_python_compute"><![CDATA[LI_aux = 0.01
650LS_aux = 114.24
651if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
652 LI = LI_aux
653 CF = 0
654 Ex = 0.0192
655
656LI_aux = LS_aux + 0.01
657LS_aux = 969.50
658if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
659 LI = LI_aux
660 CF = 2.17
661 Ex = 0.064
662
663LI_aux = LS_aux + 0.01
664LS_aux = 1703.80
665if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
666 LI = LI_aux
667 CF = 56.91
668 Ex = 0.1088
669
670LI_aux = LS_aux + 0.01
671LS_aux = 1980.58
672if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
673 LI = LI_aux
674 CF = 136.85
675 Ex = 0.16
676
677LI_aux = LS_aux + 0.01
678LS_aux = 2371.32
679if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
680 LI = LI_aux
681 CF = 181.06
682 Ex = 0.1792
683
684LI_aux = LS_aux + 0.01
685LS_aux = 4782.61
686if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
687 LI = LI_aux
688 CF = 251.16
689 Ex = 0.2136
690
691LI_aux = LS_aux + 0.01
692LS_aux = 7538.09
693if categories.PGRAVA>LI_aux and categories.PGRAVA<LS_aux:
694 LI = LI_aux
695 CF = 766.15
696 Ex = 0.2352
697
698LI_aux = LS_aux + 0.01
699if categories.PGRAVA>LI_aux:
700 LI = LI_aux
701 CF = 1414.28
702 Ex = 0.30
703result = ((categories.PGRAVA - LI) * Ex + CF)]]></field>
704 </record>
705
706<!-- ######################################### -->
707<!-- ######################################### -->
708<!-- ######################################### -->
709
710 <record id="REG200" model="hr.salary.rule">
711 <field name="category_id" ref="CAT_CONFIGURACIONES"/>
712 <field name="name">Subsidio al Empleo acreditado</field>
713 <field name="sequence">200</field>
714 <field name="code">SEA</field>
715 <field name="condition_select">none</field>
716 <field name="amount_select">code</field>
717 <field name="amount_python_compute"><![CDATA[if categories.PGRAVA>0.01 and categories.PGRAVA<407.33:
718 result = 93.73
719if categories.PGRAVA>407.34 and categories.PGRAVA<610.96:
720 result = 93.66
721if categories.PGRAVA>610.97 and categories.PGRAVA<799.68:
722 result = 93.66
723if categories.PGRAVA>799.69 and categories.PGRAVA<814.66:
724 result = 90.44
725if categories.PGRAVA>814.67 and categories.PGRAVA<1023.75:
726 result = 88.06
727if categories.PGRAVA>1023.76 and categories.PGRAVA<1086.16:
728 result = 81.55
729if categories.PGRAVA>1086.20 and categories.PGRAVA<1228.57:
730 result = 74.83
731if categories.PGRAVA>1228.58 and categories.PGRAVA<1433.32:
732 result = 67.83
733if categories.PGRAVA>1433.33 and categories.PGRAVA<1638.07:
734 result = 58.38
735if categories.PGRAVA>1638.08 and categories.PGRAVA<1699.88:
736 result = 50.12
737if categories.PGRAVA>1699.89:
738 result = 0
739result=result*-1]]></field>
740 </record>
741
742 <record id="REG202" model="hr.salary.rule">
743 <field name="category_id" ref="CAT_DEDUCCIONES"/>
744 <field name="name">Subsidio al empleo (sp) </field>
745 <field name="sequence">202</field>
746 <field name="code">SESP</field>
747 <field name="condition_select">python</field>
748 <field name="condition_python">result = -ISPT > SEA</field>
749 <field name="amount_select">code</field>
750 <field name="amount_python_compute">result =SEA + ISPT</field>
751 </record>
752
753 <record id="REG204" model="hr.salary.rule">
754 <field name="category_id" ref="CAT_CONCEPTOS"/>
755 <field name="name">ISPT antes de Sub al Empleo</field>
756 <field name="sequence">204</field>
757 <field name="code">ISPT_SE</field>
758 <field name="condition_select">none</field>
759 <field name="amount_select">code</field>
760 <field name="amount_python_compute">result =ISPT</field>
761 </record>
762
763 <record id="REG206" model="hr.salary.rule">
764 <field name="category_id" ref="CAT_DEDUCCIONES"/>
765 <field name="name">ISPT (sp)</field>
766 <field name="sequence">206</field>
767 <field name="code">ISPT_SP</field>
768 <field name="condition_select">python</field>
769 <field name="condition_python">result = SEA> - ISPT </field>
770 <field name="amount_select">code</field>
771 <field name="amount_python_compute">result =SEA + ISPT_SE</field>
772 </record>
773
774 <record id="REG207" model="hr.salary.rule">
775 <field name="category_id" ref="CAT_DEDUCCIONES"/>
776 <field name="name">Prestamo Infonavit</field>
777 <field name="sequence">207</field>
778 <field name="code">CINFO_T</field>
779 <field name="condition_select">python</field>
780 <field name="condition_python"><![CDATA[monto = [c.amount for c in contract.concept_ids if c.code == 'CINFO']
781prestamo=monto and monto[0] or 0.0
782if prestamo>0:
783 result = 1]]></field>
784 <field name="amount_python_compute"><![CDATA[monto = [c.amount for c in contract.concept_ids if c.code == 'CINFO']
785retencion=monto and monto[0] or 0.0
786result = retencion]]></field>
787 </record>
788
789 <record id="REG250" model="hr.salary.rule">
790 <field name="category_id" ref="CAT_IMSS"/>
791 <field name="name">Prestaciones en especie</field>
792 <field name="sequence">250</field>
793 <field name="code">PE_T</field>
794 <field name="condition_select">python</field>
795 <field name="condition_python">result = SDI>3 * SGVDF </field>
796 <field name="amount_select">code</field>
797 <field name="amount_python_compute">result =((SDI * worked_days.WORK100.number_of_days * 7 /6)-(3 * SGVDF))*0.004</field>
798 </record>
799
800 <record id="REG251" model="hr.salary.rule">
801 <field name="category_id" ref="CAT_IMSS"/>
802 <field name="name">Prestaciones en especie (Pensionados y beneficiarios)</field>
803 <field name="sequence">251</field>
804 <field name="code">PEPB_T</field>
805 <field name="condition_select">none</field>
806 <field name="amount_select">code</field>
807 <field name="amount_python_compute">result = SDI * 0.00375 * worked_days.WORK100.number_of_days * 7 /6</field>
808 </record>
809
810 <record id="REG252" model="hr.salary.rule">
811 <field name="category_id" ref="CAT_IMSS"/>
812 <field name="name">Prestaciones en dinero</field>
813 <field name="sequence">252</field>
814 <field name="code">PD_T</field>
815 <field name="condition_select">none</field>
816 <field name="amount_select">code</field>
817 <field name="amount_python_compute">result = SDI * 0.0025 * worked_days.WORK100.number_of_days * 7 /6</field>
818 </record>
819
820 <record id="REG253" model="hr.salary.rule">
821 <field name="category_id" ref="CAT_IMSS"/>
822 <field name="name">Seguro de invalides y vida</field>
823 <field name="sequence">253</field>
824 <field name="code">SIV_T</field>
825 <field name="condition_select">none</field>
826 <field name="amount_select">code</field>
827 <field name="amount_python_compute">result = SDI * 0.00625 * worked_days.WORK100.number_of_days * 7 /6</field>
828 </record>
829
830 <record id="REG254" model="hr.salary.rule">
831 <field name="category_id" ref="CAT_IMSS"/>
832 <field name="name">Cesantia en edad avanzada y vejes</field>
833 <field name="sequence">254</field>
834 <field name="code">CEAV_T</field>
835 <field name="condition_select">none</field>
836 <field name="amount_select">code</field>
837 <field name="amount_python_compute">result = SDI * 0.01125 * worked_days.WORK100.number_of_days * 7 /6</field>
838 </record>
839
840 <record id="REG255" model="hr.salary.rule">
841 <field name="category_id" ref="CAT_DEDUCCIONES"/>
842 <field name="name">IMSS</field>
843 <field name="sequence">255</field>
844 <field name="code">IMSS_T</field>
845 <field name="condition_select">none</field>
846 <field name="amount_select">code</field>
847 <field name="amount_python_compute">result = categories.IMSS</field>
848 </record>
849
850 <record id="REG259" model="hr.salary.rule">
851 <field name="category_id" ref="CAT_CONCEPTOS"/>
852 <field name="name">DEDUCCIONES</field>
853 <field name="sequence">259</field>
854 <field name="code">DEDUCCIONES</field>
855 <field name="condition_select">none</field>
856 <field name="amount_select">code</field>
857 <field name="amount_python_compute">result = categories.DEDUCCIONES</field>
858 </record>
859
860 <!-- ###################################### -->
861 <!-- ###################################### -->
862 <!-- ###################################### -->
863
864 <record id="REG260" model="hr.salary.rule">
865 <field name="category_id" ref="CAT_OBLIGACIONES"/>
866 <field name="name">Prestaciones en especie(Cuota fija)</field>
867 <field name="sequence">260</field>
868 <field name="code">PE_E</field>
869 <field name="condition_select">none</field>
870 <field name="amount_select">code</field>
871 <field name="amount_python_compute">result = SDI * 0.204 * worked_days.WORK100.number_of_days * 7 /6</field>
872 </record>
873
874 <record id="REG261" model="hr.salary.rule">
875 <field name="category_id" ref="CAT_OBLIGACIONES"/>
876 <field name="name">Prestaciones en especie(Cuota adicional)</field>
877 <field name="sequence">261</field>
878 <field name="code">PE_E</field>
879 <field name="condition_select">python</field>
880 <field name="condition_python">result = SDI>3 * SGVDF </field>
881 <field name="amount_select">code</field>
882 <field name="amount_python_compute">result =((SDI * worked_days.WORK100.number_of_days * 7 /6)-(3 * SGVDF))*0.011</field>
883 </record>
884
885 <record id="REG262" model="hr.salary.rule">
886 <field name="category_id" ref="CAT_OBLIGACIONES"/>
887 <field name="name">Prestaciones en especie (Pensionados y beneficiarios)</field>
888 <field name="sequence">262</field>
889 <field name="code">PEPB_E</field>
890 <field name="condition_select">none</field>
891 <field name="amount_select">code</field>
892 <field name="amount_python_compute">result = SDI * 0.0105 * worked_days.WORK100.number_of_days * 7 /6</field>
893 </record>
894
895 <record id="REG263" model="hr.salary.rule">
896 <field name="category_id" ref="CAT_OBLIGACIONES"/>
897 <field name="name">Prestaciones en dinero</field>
898 <field name="sequence">263</field>
899 <field name="code">PD_E</field>
900 <field name="condition_select">none</field>
901 <field name="amount_select">code</field>
902 <field name="amount_python_compute">result = SDI * 0.007 * worked_days.WORK100.number_of_days * 7 /6</field>
903 </record>
904
905 <record id="REG264" model="hr.salary.rule">
906 <field name="category_id" ref="CAT_OBLIGACIONES"/>
907
908 <field name="name">Seguro de invalides y vida</field>
909 <field name="sequence">264</field>
910 <field name="code">SIV_E</field>
911 <field name="condition_select">none</field>
912 <field name="amount_select">code</field>
913 <field name="amount_python_compute">result = SDI * 0.0175 * worked_days.WORK100.number_of_days * 7 /6</field>
914 </record>
915
916 <record id="REG265" model="hr.salary.rule">
917 <field name="category_id" ref="CAT_OBLIGACIONES"/>
918 <field name="name">Seguro para el retiro</field>
919 <field name="sequence">265</field>
920 <field name="code">SR_E</field>
921 <field name="condition_select">none</field>
922 <field name="amount_select">code</field>
923 <field name="amount_python_compute">result = SDI * 0.02 * worked_days.WORK100.number_of_days * 7 /6</field>
924 </record>
925
926 <record id="REG266" model="hr.salary.rule">
927 <field name="category_id" ref="CAT_OBLIGACIONES"/>
928 <field name="name">Cesantia en edad avanzada y vejes</field>
929 <field name="sequence">266</field>
930 <field name="code">CEAV_E</field>
931 <field name="condition_select">none</field>
932 <field name="amount_select">code</field>
933 <field name="amount_python_compute">result = SDI * 0.0315 * worked_days.WORK100.number_of_days * 7 /6</field>
934 </record>
935
936 <record id="REG267" model="hr.salary.rule">
937 <field name="category_id" ref="CAT_OBLIGACIONES"/>
938 <field name="name">Guarderias y Prestaciones Sociales</field>
939 <field name="sequence">267</field>
940 <field name="code">GPS_E</field>
941 <field name="condition_select">none</field>
942 <field name="amount_select">code</field>
943 <field name="amount_python_compute">result = SDI * 0.01 * worked_days.WORK100.number_of_days * 7 /6</field>
944 </record>
945
946 <record id="REG268" model="hr.salary.rule">
947 <field name="category_id" ref="CAT_OBLIGACIONES"/>
948 <field name="name">Infonavit</field>
949 <field name="sequence">268</field>
950 <field name="code">I_E</field>
951 <field name="condition_select">none</field>
952 <field name="amount_select">code</field>
953 <field name="amount_python_compute">result = SDI * 0.05 * worked_days.WORK100.number_of_days * 7 /6</field>
954 </record>
955
956 <record id="REG269" model="hr.salary.rule">
957 <field name="category_id" ref="CAT_CONCEPTOS"/>
958 <field name="name">OBLIGACIONES</field>
959 <field name="sequence">269</field>
960 <field name="code">OBLIGACIONES</field>
961 <field name="condition_select">none</field>
962 <field name="amount_select">code</field>
963 <field name="amount_python_compute">result = categories.OBLIGACIONES</field>
964 </record>
965
966 <record id="REG300" model="hr.salary.rule">
967 <field name="category_id" ref="CAT_CONCEPTOS"/>
968 <field name="name">PAGO</field>
969 <field name="sequence">300</field>
970 <field name="code">PAGO</field>
971 <field name="condition_select">none</field>
972 <field name="amount_select">code</field>
973 <field name="amount_python_compute">result = categories.PEXENT + categories.PGRAVA - categories.DEDUCCIONES </field>
974 </record>
975
976 </data>
977</openerp>
0978
=== added file 'l10n_mx_hr_payroll/hr_payroll_view.xml'
--- l10n_mx_hr_payroll/hr_payroll_view.xml 1970-01-01 00:00:00 +0000
+++ l10n_mx_hr_payroll/hr_payroll_view.xml 2012-12-04 15:42:21 +0000
@@ -0,0 +1,156 @@
1<?xml version="1.0"?>
2<openerp>
3 <data>
4 <record id="view_hr_contract_concept_form" model="ir.ui.view">
5 <field name="name">hr.contract.concept.form</field>
6 <field name="model">hr.contract.concept</field>
7 <field name="type">form</field>
8 <field name="arch" type="xml">
9 <form string="Employee Function">
10 <field name="code"/>
11 <field name="name"/>
12 <field name="description"/>
13 <field name="concept_type"/>
14 <field name="amount"/>
15 <field name="amount_type"/>
16 <field name="history_ids"/>
17 </form>
18 </field>
19 </record>
20 <record id="view_hr_contract_concept_tree" model="ir.ui.view">
21 <field name="name">hr.contract.concept.tree</field>
22 <field name="model">hr.contract.concept</field>
23 <field name="type">tree</field>
24 <field name="arch" type="xml">
25 <tree string="Employee Function">
26 <field name="code"/>
27 <field name="name"/>
28 <field name="description"/>
29 <field name="amount"/>
30 <field name="history_ids"/>
31 </tree>
32 </field>
33 </record>
34 <record id="view_concept_history_tree" model="ir.ui.view">
35 <field name="name">hr.concept.history.tree</field>
36 <field name="model">hr.concept.history</field>
37 <field name="type">tree</field>
38 <field name="arch" type="xml">
39 <tree string="Employee Function">
40 <field name="date"/>
41 <field name="amount_initial"/>
42 <field name="amount_final"/>
43 <field name="amount"/>
44 </tree>
45 </field>
46 </record>
47 <record id="view_hr_contract_form" model="ir.ui.view">
48 <field name="name">hr.contract</field>
49 <field name="model">hr.contract</field>
50 <field name="type">form</field>
51 <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
52 <field name="arch" type="xml">
53 <xpath expr="/form/notebook/page[@string='Work Permit']" position="after">
54 <page string="Concept">
55 <field name="concept_ids" nolabel="1" colspan="4"/>
56 </page>
57 </xpath>
58 </field>
59 </record>
60<!--
61 <record id="view_hr_holidays_status_form" model="ir.ui.view">
62 <field name="name">hr.holidays.status.form</field>
63 <field name="model">hr.holidays.status</field>
64 <field name="type">form</field>
65 <field name="inherit_id" ref="hr_holidays.edit_holiday_status_form"/>
66 <field name="arch" type="xml">
67 <xpath expr="/form/group/field[@name='name']" position="before">
68 <field name="code"/>
69 </xpath>
70 </field>
71 </record>
72-->
73 <record id="view_hr_payroll_payslip_employees_inherit_form" model="ir.ui.view">
74 <field name="name">hr_payroll.payslip.employees.inherit.form</field>
75 <field name="model">hr.payslip.employees</field>
76 <field name="type">form</field>
77 <field name="inherit_id" ref="hr_payroll.view_hr_payslip_by_employees"/>
78 <field name="arch" type="xml">
79 <xpath expr="/form/group/field[@name='employee_ids']" position="replace">
80 <field name="employee_ids" domain="" nolabel="1" colspan="4"/>
81 </xpath>
82 </field>
83 </record>
84 <!--
85 <record id="view_hr_employee_inherit_search" model="ir.ui.view">
86 <field name="name">hr.employee.inherit.search</field>
87 <field name="model">hr.employee</field>
88 <field name="type">search</field>
89 <field name="inherit_id" ref="hr.view_employee_filter"/>
90 <field name="arch" type="xml">
91 <xpath expr="/search/field[@name='name']" position="after">
92 <field name="name" colspan="4"/>
93 </xpath>
94 </field>
95 </record>
96 -->
97 <record id="view_hr_payslip_run_inherit_form" model="ir.ui.view">
98 <field name="name">hr.payslip.run.inherit.form</field>
99 <field name="model">hr.payslip.run</field>
100 <field name="type">form</field>
101 <field name="inherit_id" ref="hr_payroll.hr_payslip_run_form"/>
102 <field name="arch" type="xml">
103 <xpath expr="/form/group/field[@name='credit_note']" position="replace">
104 <field name="credit_note" invisible="1"/>
105 </xpath>
106 <xpath expr="/form/group/field[@name='date_start']" position="after">
107 <field name="type"/>
108 <field name="schedule_pay"/>
109 </xpath>
110 </field>
111 </record>
112
113 <record id="view_hr_payslip_form" model="ir.ui.view">
114 <field name="name">hr.payslip</field>
115 <field name="model">hr.payslip</field>
116 <field name="type">form</field>
117 <field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
118 <field name="arch" type="xml">
119 <xpath expr="/form/group/field[@name='employee_id']" position="replace">
120 <field name="employee_id"/>
121 </xpath>
122 <xpath expr="/form/notebook/page/field[@name='line_ids']" position="replace">
123
124 <field name="line_ids" colspan="4" nolabel="1">
125 <tree string="Salary Structure" editable="bottom" colors="grey:code in ('PEPB_T','PD_T','SIV_T','CEAV_T','PE_E','PEPB_E','PD_E','SIV_E','SR_E','CEAV_E','GPS_E','I_E' );green:code in ('PERCEPCIONES','DEDUCCIONES','OBLIGACIONES')">
126 <field name="name"/>
127 <field name="code"/>
128 <field name="category_id"/>
129 <field name="sequence" invisible="1"/>
130 <field name="quantity" invisible="1"/>
131 <field name="rate" invisible="1"/>
132 <field name="amount" invisible="1"/>
133 <field name="total"/>
134 </tree>
135 <form string="Payslip Line">
136 <group>
137 <field name="name" select="1"/>
138 <field name="code" select="1"/>
139 <field name="category_id"/>
140 <field name="sequence" groups="base.group_extended"/>
141 <field name="quantity"/>
142 <field name="rate"/>
143 <field name="amount"/>
144 <field name="total"/>
145 <field name="salary_rule_id" groups="base.group_extended"/>
146 </group>
147 </form>
148 </field>
149 </xpath>
150
151 </field>
152 </record>
153
154 </data>
155</openerp>
156