Merge lp:~inddiana/sisb/sisb_nomina_resumen_reporte_gastos into lp:sisb

Proposed by [SISB] Aryrosa Fuentes
Status: Merged
Merged at revision: 985
Proposed branch: lp:~inddiana/sisb/sisb_nomina_resumen_reporte_gastos
Merge into: lp:sisb
Diff against target: 558 lines (+502/-0)
10 files modified
sisb_nomina_resumen/__init__.py (+1/-0)
sisb_nomina_resumen/__openerp__.py (+42/-0)
sisb_nomina_resumen/i18n/es_VE.po (+109/-0)
sisb_nomina_resumen/report/__init__.py (+1/-0)
sisb_nomina_resumen/report/report_nomina_resumen.py (+35/-0)
sisb_nomina_resumen/security/groups.xml (+20/-0)
sisb_nomina_resumen/security/ir.model.access.csv (+2/-0)
sisb_nomina_resumen/wizard/__init__.py (+1/-0)
sisb_nomina_resumen/wizard/sisb_nomina_resumen.py (+253/-0)
sisb_nomina_resumen/wizard/sisb_nomina_resumen_wizard.xml (+38/-0)
To merge this branch: bzr merge lp:~inddiana/sisb/sisb_nomina_resumen_reporte_gastos
Reviewer Review Type Date Requested Status
Juan Lugo Pending
Review via email: mp+337282@code.launchpad.net

Description of the change

[IMP] se creo el modulo sisb_nomina_resumen para generar un reporte de los gasto de nominas por mes.
[FIX] Ajsutes en el reporte con respecto a la forma de obtener la fecha de inicio de la relacion laboral. Se asume que en sisb_nomina ya existe la funcion que realiza el calculo.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added directory 'sisb_nomina_resumen'
=== added file 'sisb_nomina_resumen/__init__.py'
--- sisb_nomina_resumen/__init__.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/__init__.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,1 @@
1import wizard, report
02
=== added file 'sisb_nomina_resumen/__openerp__.py'
--- sisb_nomina_resumen/__openerp__.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/__openerp__.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,42 @@
1# -*- coding:utf-8 -*-
2##############################################################################
3#
4# SISB, Sistema Integral Simon Bolivar
5# Copyright (C) 2012-2013 Industrias Diana, C.A. All Rights Reserved
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 published by
9# the Free Software Foundation, either version 3 of the License, or
10# (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 'name': 'Resumen general de asignaciones y deducciones de nomina.',
23 'version': '1.0',
24 "author": "Industrias Diana C.A.",
25 "category": "Human Resources",
26 "website": "http://www.industriasdiana.gob.ve",
27 'description': """Modulo que genera un reporte general con todas las asignaciones y deducciones de todos
28 los trabajadores, clasificandolos por el tipo de nomina, en formato .ods y protegido
29 contra escritura.""",
30 'depends': ['base', 'sisb_nomina'],
31 'external_dependencies': {
32 'python': ['xlwt']
33 },
34 'init_xml': [],
35 'update_xml': [
36 'security/groups.xml',
37 'security/ir.model.access.csv',
38 'wizard/sisb_nomina_resumen_wizard.xml'
39 ],
40 'active': True,
41 'installable': True
42}
043
=== added directory 'sisb_nomina_resumen/i18n'
=== added file 'sisb_nomina_resumen/i18n/es_VE.mo'
1Binary files sisb_nomina_resumen/i18n/es_VE.mo 1970-01-01 00:00:00 +0000 and sisb_nomina_resumen/i18n/es_VE.mo 2018-02-07 15:37:15 +0000 differ44Binary files sisb_nomina_resumen/i18n/es_VE.mo 1970-01-01 00:00:00 +0000 and sisb_nomina_resumen/i18n/es_VE.mo 2018-02-07 15:37:15 +0000 differ
=== added file 'sisb_nomina_resumen/i18n/es_VE.po'
--- sisb_nomina_resumen/i18n/es_VE.po 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/i18n/es_VE.po 2018-02-07 15:37:15 +0000
@@ -0,0 +1,109 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * sisb_nomina_resumen
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 6.0.4\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2017-05-10 13:33+0000\n"
10"PO-Revision-Date: 2017-05-10 09:37-0400\n"
11"Last-Translator: carmelo <carmelolopez3@hotmail.com>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: 8bit\n"
16"Plural-Forms: \n"
17
18#. module: sisb_nomina_resumen
19#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:190
20#, python-format
21msgid "Net Total"
22msgstr "Total Neto"
23
24#. module: sisb_nomina_resumen
25#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:157
26#, python-format
27msgid "Roster"
28msgstr "Nómina"
29
30#. module: sisb_nomina_resumen
31#: view:sisb.nomina.resumen:0
32msgid "Print"
33msgstr "Imprimir"
34
35#. module: sisb_nomina_resumen
36#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:220
37#, python-format
38msgid "roster_report_"
39msgstr "reporte_nomina_"
40
41#. module: sisb_nomina_resumen
42#: model:ir.actions.act_window,name:sisb_nomina_resumen.action_wizard_sisb_nomina_resumen
43#: model:ir.ui.menu,name:sisb_nomina_resumen.menu_wizard_sisb_nomina_resumen
44msgid "Resumen mensual de nomina"
45msgstr "Resumen mensual de nomina"
46
47#. module: sisb_nomina_resumen
48#: model:ir.actions.report.xml,name:sisb_nomina_resumen.report_nomina_resumen
49msgid "Reporte de nomina"
50msgstr "Reporte de nomina"
51
52#. module: sisb_nomina_resumen
53#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:177
54#, python-format
55msgid "Total bonuses"
56msgstr "Total Asignaciones"
57
58#. module: sisb_nomina_resumen
59#: field:sisb.nomina.resumen,month:0
60msgid "Month"
61msgstr "Mes"
62
63#. module: sisb_nomina_resumen
64#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:158
65#, python-format
66msgid "Employee"
67msgstr "Empleado"
68
69#. module: sisb_nomina_resumen
70#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:162
71#, python-format
72msgid "Job"
73msgstr "Cargo"
74
75#. module: sisb_nomina_resumen
76#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:159
77#, python-format
78msgid "Identification"
79msgstr "Cédula"
80
81#. module: sisb_nomina_resumen
82#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:160
83#, python-format
84msgid "Join date"
85msgstr "Fecha Ingreso"
86
87#. module: sisb_nomina_resumen
88#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:161
89#, python-format
90msgid "Department"
91msgstr "Departamento"
92
93#. module: sisb_nomina_resumen
94#: model:ir.model,name:sisb_nomina_resumen.model_sisb_nomina_resumen
95msgid "sisb.nomina.resumen"
96msgstr "sisb.nomina.resumen"
97
98#. module: sisb_nomina_resumen
99#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:223
100#, python-format
101msgid "No data found"
102msgstr "No se encontró información"
103
104#. module: sisb_nomina_resumen
105#: code:addons/sisb_nomina_resumen/wizard/sisb_nomina_resumen.py:186
106#, python-format
107msgid "Total debts"
108msgstr "Total Deducciones"
109
0110
=== added directory 'sisb_nomina_resumen/report'
=== added file 'sisb_nomina_resumen/report/__init__.py'
--- sisb_nomina_resumen/report/__init__.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/report/__init__.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,1 @@
1import report_nomina_resumen
02
=== added file 'sisb_nomina_resumen/report/report_nomina_resumen.py'
--- sisb_nomina_resumen/report/report_nomina_resumen.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/report/report_nomina_resumen.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,35 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3from report import report_sxw
4import os
5
6
7class report_nomina_resumen(report_sxw.rml_parse):
8 """ Herencia a clase base para reportes de OpenERP
9 """
10 _name = 'report.nomina.resumen'
11
12 def __init__(self, cr, uid, name, context):
13 """ Se sobrecarga el init para agregarle el context
14 """
15 super(report_nomina_resumen, self).__init__(cr, uid, name, context)
16 self.context = context
17
18
19report_sxw = report_sxw.report_sxw
20
21
22class TxtParser(report_sxw):
23 def __init__(self, name, table, rml=False, parser=False, header=True, store=False):
24 self.parser_instance = False
25 self.localcontext = {}
26 report_sxw.__init__(self, name, table, rml, parser, header, store)
27
28 def create_single_pdf(self, cursor, uid, ids, data, report_xml, context):
29 file = open(data['file'], 'r')
30 output = file.read()
31 os.remove(data['file'])
32 return (output, 'ods')
33
34
35TxtParser('report.nomina.resumen', 'nomina.resumen', None, parser=report_nomina_resumen, header=False)
036
=== added directory 'sisb_nomina_resumen/security'
=== added file 'sisb_nomina_resumen/security/groups.xml'
--- sisb_nomina_resumen/security/groups.xml 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/security/groups.xml 2018-02-07 15:37:15 +0000
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data noupdate="0">
4 <!-- Groups -->
5 <record id="group_sisb_nomina_resumen" model="res.groups">
6 <field name="name">Nomina / Reporte Mensual</field>
7 </record>
8 <!-- Access to menues -->
9 <record model="ir.ui.menu" id="hr.menu_hr_root">
10 <field eval="[(4, ref('group_sisb_nomina_resumen'))]" name="groups_id"/>
11 </record>
12
13 <record model="ir.ui.menu" id="hr.menu_hr_reporting">
14 <field eval="[(4, ref('group_sisb_nomina_resumen'))]" name="groups_id"/>
15 </record>
16 <record model="ir.ui.menu" id="sisb_nomina.menu_hr_payroll_reporting">
17 <field eval="[(4, ref('group_sisb_nomina_resumen'))]" name="groups_id"/>
18 </record>
19 </data>
20</openerp>
021
=== added file 'sisb_nomina_resumen/security/ir.model.access.csv'
--- sisb_nomina_resumen/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/security/ir.model.access.csv 2018-02-07 15:37:15 +0000
@@ -0,0 +1,2 @@
1id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2access_sisb_nomina_resumen_hr_month,Resumen Nomina: hr.month,sisb_nomina.model_hr_month,group_sisb_nomina_resumen,1,0,0,0
03
=== added directory 'sisb_nomina_resumen/wizard'
=== added file 'sisb_nomina_resumen/wizard/__init__.py'
--- sisb_nomina_resumen/wizard/__init__.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/wizard/__init__.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,1 @@
1import sisb_nomina_resumen
02
=== added file 'sisb_nomina_resumen/wizard/sisb_nomina_resumen.py'
--- sisb_nomina_resumen/wizard/sisb_nomina_resumen.py 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/wizard/sisb_nomina_resumen.py 2018-02-07 15:37:15 +0000
@@ -0,0 +1,253 @@
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3"""Modelos del modulo :Resumen mensual de nomina:"""
4from osv import fields, osv
5from tools.translate import _
6from datetime import datetime
7import xlwt
8
9
10class FitCol(object):
11 """Ajusta el ancho de las columnas automaticamente"""
12
13 def __init__(self, sheet):
14 self.sheet = sheet
15 self.widths = dict()
16
17 def write(self, r, c, label='', *args, **kwargs):
18 if isinstance(label, str) and len(args) == 0:
19 data = label.decode('utf-8')
20 elif isinstance(label, str) and len(args) > 0:
21 data = datetime.strptime(label, '%Y-%m-%d')
22 else:
23 data = label
24 self.sheet.write(r, c, data, *args, **kwargs)
25 if isinstance(label, (int, float)):
26 label = str(label).decode('utf-8')
27 width = (len(label) + 1) * 256
28 if width > self.widths.get(c, 0):
29 self.widths[c] = width
30 self.sheet.col(c).width = width
31
32 def __getattr__(self, attr):
33 return getattr(self.sheet, attr)
34
35
36class sisb_nomina_resumen(osv.osv_memory):
37 """Asistente para el reporte del resumen de nomina"""
38 _name = 'sisb.nomina.resumen'
39 _columns = {
40 'month': fields.many2one('hr.month', 'Month', required=True)
41 }
42
43 def get_employees_data(self, cr, month):
44 """ Query a Postgres para obtener informacion de los empleados en un mes.
45
46 :param month: Nombre del mes a consultar.
47 """
48 query = '''
49 SELECT
50 hde.payroll as nom,
51 he.name as emp,
52 he.identification_id as ide,
53 date_start_rel_laboral(he.id) as dst,
54 hde.department_id as dpt,
55 hde.job as job,
56 case when hpl.type_calc = 'deduction' then 'debt' else 'bonus' end as typ,
57 hc.name as con,
58 sum(hpl.total)
59 FROM
60 hr_payslip_line as hpl
61 join hr_payslip as hrp on hrp.id = hpl.slip_id
62 join hr_employee as he on he.id = hpl.employee_id
63 join hr_department_employee as hde on hde.employee_id = he.id
64 and hde.date_start < hrp.date_from and (hde.date_end > hrp.date_from or hde.date_end is null)
65 join hr_concept as hc on hc.id = hpl.concept_id and hc.type <> 'aporte_patronal'
66 join hr_process as hp on hp.id = hpl.process_id and hp.type in ('nomina')
67 join hr_period_process_rel as hppr on hppr.process_id = hp.id
68 join hr_period as hpe on hpe.id = hppr.period_id
69 join hr_month as hm on hm.id = hpe.hr_month_id and hm.name = '%s'
70 WHERE appears_on_payslip = True
71 group by emp, con, typ, ide, nom, dst, dpt, job
72 order by emp, typ, con
73 ''' % (month)
74
75 cr.execute(query)
76 employees = {}
77 for roster, name, identification, join_date, department, job, asign, concept, total in cr.fetchall():
78 if identification not in employees:
79 employees[identification] = {}
80 employees[identification]['roster'] = roster
81 employees[identification]['name'] = name
82 employees[identification]['identification'] = identification
83 employees[identification]['join_date'] = join_date
84 employees[identification]['department'] = department
85 employees[identification]['job'] = job
86 if 'bonuses' not in employees[identification]:
87 employees[identification]['bonuses'] = {}
88 if 'debts' not in employees[identification]:
89 employees[identification]['debts'] = {}
90 if asign == 'bonus':
91 employees[identification]['bonuses'][concept] = total
92 else:
93 employees[identification]['debts'][concept] = total
94
95 return employees
96
97 def get_concepts_header(self, cr, month):
98 """ Query que se trae todos los conceptos de asignaciones y deducciones de los trabajadores en el mes indicado.
99
100 :param month: Nombre del mes a consultar.
101 """
102 query = '''
103 SELECT
104 case when hpl.type_calc = 'deduction' then 'debt' else 'bonus' end as asigned,
105 hc.name as concept,
106 hc.code as code
107 FROM
108 hr_payslip_line as hpl
109 join hr_employee as he on he.id = hpl.employee_id
110 join hr_payroll as hno on hno.id = he.hr_payroll_id
111 join hr_concept as hc on hc.id = hpl.concept_id and hc.type <> 'aporte_patronal'
112 join hr_process as hp on hp.id = hpl.process_id and hp.type in ('nomina')
113 join hr_period_process_rel as hppr on hppr.process_id = hp.id
114 join hr_period as hpe on hpe.id = hppr.period_id
115 join hr_month as hm on hm.id = hpe.hr_month_id and hm.name = '%s'
116 WHERE appears_on_payslip = True
117 group by concept, asigned, hc.code
118 order by asigned, concept
119 ''' % (month)
120
121 cr.execute(query)
122 bonuses = ['']
123 debts = []
124 for row in cr.fetchall():
125 con_type, concept, code = row
126 if con_type == 'bonus':
127 if code == '0100':
128 bonuses[0] = concept
129 else:
130 bonuses.append(concept)
131 else:
132 debts.append(concept)
133
134 return {'bonuses': bonuses, 'debts': debts}
135
136 def get_payrolls_pages(self, cr, month):
137 """ Query que se trae los nombres de las nominas de los trabajadores del mes indicado.
138
139 :param month: Nombre del mes a consultar.
140 """
141 query = '''
142 SELECT
143 hde.payroll as roster
144 FROM
145 hr_payslip_line as hpl
146 join hr_payslip as hrp on hrp.id = hpl.slip_id
147 join hr_employee as he on he.id = hpl.employee_id
148 join hr_payroll as hno on hno.id = he.hr_payroll_id
149 join hr_department_employee as hde on hde.employee_id = he.id and hde.date_start < hrp.date_from
150 and (hde.date_end > hrp.date_from or hde.date_end is null)
151 join hr_process as hp on hp.id = hpl.process_id and hp.type in ('nomina')
152 join hr_period_process_rel as hppr on hppr.process_id = hp.id
153 join hr_period as hpe on hpe.id = hppr.period_id
154 join hr_month as hm on hm.id = hpe.hr_month_id and hm.name = '%s'
155 WHERE appears_on_payslip = True
156 group by roster
157 ''' % (month)
158
159 cr.execute(query)
160 return [row[0] for row in cr.fetchall()]
161
162 def print_results(self, cr, uid, ids, context=None):
163 """ Funcion llamada por el wizard para imprimir los resultados.
164 """
165 month = self.browse(cr, uid, ids)[0].month.name
166 rosters = self.get_payrolls_pages(cr, month)
167 doc = xlwt.Workbook()
168 pages = {}
169 j = {} # Seran los indices de las filas de cada pagina
170 for roster in rosters:
171 roster = roster[:31] # Por limitaciones de los archivos xls, los nombres de paginas no pueden exceder los 31 caracteres
172 # Se crean las paginas y se guardan. Se le van creando las cabeceras
173 pages[roster] = doc.add_sheet(roster, True)
174 pages[roster].protect = True
175 pages[roster] = FitCol(pages[roster])
176 pages[roster].write(0, 0, _('N°'))
177 pages[roster].write(0, 1, _('Employee'))
178 pages[roster].write(0, 2, _('Identification'))
179 pages[roster].write(0, 3, _('Join date'))
180 pages[roster].write(0, 4, _('Department'))
181 pages[roster].write(0, 5, _('Job'))
182 j[roster] = 1
183
184 # Se procede a crear las cabeceras de conceptos en cada una de las paginas
185 i = 6 # Columns index
186 columns = {}
187 concepts = self.get_concepts_header(cr, month)
188 bonuses = concepts['bonuses']
189 debts = concepts['debts']
190 for bonus in bonuses:
191 for page in pages.values():
192 page.write(0, i, bonus)
193 columns[bonus] = i
194 i += 1
195 for page in pages.values():
196 page.write(0, i, _('Total bonuses'))
197 columns['bonuses'] = i
198 i += 1
199 for debt in debts:
200 for page in pages.values():
201 page.write(0, i, debt)
202 columns[debt] = i
203 i += 1
204 for page in pages.values():
205 page.write(0, i, _('Total debts'))
206 columns['debts'] = i
207 i += 1
208 for page in pages.values():
209 page.write(0, i, _('Net Total'))
210 columns['net_total'] = i
211
212 # -------- EMPEZAMOS A LLENAR LA DATA DE LOS TRABAJADORES ------------
213 datas = self.get_employees_data(cr, month)
214 date_format = xlwt.XFStyle()
215 date_format.num_format_str = 'dd/mm/yyyy'
216 currency_format = xlwt.XFStyle()
217 currency_format.num_format_str = "#,##0.00"
218 for data in datas:
219 n = datas[data]['roster'][:31]
220 pages[n].write(j[n], 0, j[n])
221 pages[n].write(j[n], 1, datas[data]['name'])
222 pages[n].write(j[n], 2, int(datas[data]['identification']))
223 pages[n].write(j[n], 3, datas[data]['join_date'], date_format)
224 pages[n].write(j[n], 4, datas[data]['department'])
225 pages[n].write(j[n], 5, datas[data]['job'])
226 total_bonuses = 0
227 for bonus in datas[data]['bonuses']:
228 pages[n].write(j[n], columns[bonus], datas[data]['bonuses'][bonus], currency_format)
229 total_bonuses += datas[data]['bonuses'][bonus]
230 pages[n].write(j[n], columns['bonuses'], total_bonuses, currency_format)
231 total_debts = 0
232 for debt in datas[data]['debts']:
233 pages[n].write(j[n], columns[debt], datas[data]['debts'][debt], currency_format)
234 total_debts += datas[data]['debts'][debt]
235 pages[n].write(j[n], columns['debts'], total_debts, currency_format)
236 pages[n].write(j[n], columns['net_total'], total_bonuses - total_debts, currency_format)
237 j[n] += 1
238 try:
239 file_name = '/tmp/' + _('roster_report_') + datetime.now().strftime('%H%M%S%d%m%Y')
240 doc.save(file_name)
241 except:
242 raise osv.except_osv('ERROR', _('No data found'))
243
244 data = {}
245 data['file'] = file_name
246 return {
247 'type': 'ir.actions.report.xml',
248 'report_name': 'nomina.resumen',
249 'datas': data,
250 }
251
252
253sisb_nomina_resumen()
0254
=== added file 'sisb_nomina_resumen/wizard/sisb_nomina_resumen_wizard.xml'
--- sisb_nomina_resumen/wizard/sisb_nomina_resumen_wizard.xml 1970-01-01 00:00:00 +0000
+++ sisb_nomina_resumen/wizard/sisb_nomina_resumen_wizard.xml 2018-02-07 15:37:15 +0000
@@ -0,0 +1,38 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <!-- Wizard view -->
5 <record id="view_sisb_nomina_resumen" model="ir.ui.view">
6 <field name="name">sisb.nomina.resumen.form</field>
7 <field name="model">sisb.nomina.resumen</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form>
11 <field name="month" />
12 <button name="print_results" string="Print" type="object" icon="gtk-print" />
13 </form>
14 </field>
15 </record>
16 <!-- Action -->
17 <record id="action_wizard_sisb_nomina_resumen" model="ir.actions.act_window">
18 <field name="name">Resumen mensual de nomina</field>
19 <field name="type">ir.actions.act_window</field>
20 <field name="res_model">sisb.nomina.resumen</field>
21 <field name="view_type">form</field>
22 <field name="view_mode">form</field>
23 <field name="target">new</field>
24 </record>
25 <!-- Report -->
26 <report
27 auto="False"
28 id="report_nomina_resumen"
29 model="sisb.nomina.resumen"
30 name="nomina.resumen"
31 rml=""
32 string="Reporte de nomina"
33 />
34 <!-- Menu -->
35 <menuitem id="menu_wizard_sisb_nomina_resumen" action="action_wizard_sisb_nomina_resumen"
36 parent="sisb_nomina.menu_hr_payroll_reporting" name="Resumen mensual de nomina" groups="group_sisb_nomina_resumen" />
37 </data>
38</openerp>

Subscribers

People subscribed via source and target branches