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

Proposed by [SISB] Edgar Rivero
Status: Merged
Approved by: Aristóbulo Meneses
Approved revision: 191
Merged at revision: 207
Proposed branch: lp:~inddiana/sisb/edgar_bug_facturas
Merge into: lp:sisb
Diff against target: 362 lines (+310/-3)
4 files modified
diana_fixes/__openerp__.py (+8/-2)
diana_fixes/model/fixes.py (+78/-0)
diana_fixes/view/factura_fixes.xml (+223/-0)
sisb_account_invoice_wizard/account_invoice.xml (+1/-1)
To merge this branch: bzr merge lp:~inddiana/sisb/edgar_bug_facturas
Reviewer Review Type Date Requested Status
Industrias Diana Pending
Review via email: mp+110125@code.launchpad.net

This proposal supersedes a proposal from 2012-03-16.

Description of the change

[FIX] Modificacion para que el boton 'Cambiar numero de control'
no aparezca cuando la factura ya se encuentre pagada.
[FIX] Colocado como requerido los campos de la factura refencia
y fecha del documento.
[FIX] Se hace invisible el boton 'Pagar factura' para todas las
facturas.
[FIX] Modificado para que no sea pueda tildar 'Expediente' y
'Sin Doc. Iva' una vez la factura a cambiado su estado de draft
[FIX] Se hace invisible el boton 'Factura Rectificativa'
para las facturas rectificativas.
[FIX] Validado que las facturas no puedan agregarsele lineas
con precio de unidad con valor 0 o menor.
[FIX] Validado que no se puedan agregar lineas a la factura
sin impuesto.
[FIX] Modificado funcion que genera facturas rectificativas
para generar estas con check_total en 0.

To post a comment you must log in.
Revision history for this message
Aristóbulo Meneses (aristobulo) wrote : Posted in a previous version of this proposal

[TODO] Planificar crear un módulo nuevo para parches a la OVL con este tipo de validaciones.

lp:~inddiana/sisb/edgar_bug_facturas updated
191. By [SISB] Edgar Rivero

[FIX] Se sobre escriben las vistas que agregan el parent_id, para agregar
un domain para que no se puedan seleccionar una factura rectificativa a
partir de otra factura rectificativa y tampoco aparezca en la vista de
facturas al proveedor/cliente.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'diana_fixes/__openerp__.py'
2--- diana_fixes/__openerp__.py 2012-01-11 15:05:33 +0000
3+++ diana_fixes/__openerp__.py 2012-06-13 18:01:24 +0000
4@@ -1,7 +1,7 @@
5 # -*- coding: utf-8 -*-
6 {
7 'name' : 'Diana FIXES',
8- 'version' : '0.1',
9+ 'version' : '0.2',
10 'author' : 'Industrias Diana, C.A. <sisb@industriasdiana.gob.ve>',
11 'description' : """
12 Conjunto de sobreescrituras para corregir
13@@ -10,9 +10,15 @@
14 'category' : 'other',
15 'website' : 'www.industriasdiana.gob.ve',
16 'depends' : [
17- 'base_vat'
18+ 'base_vat',
19+ 'account',
20+ 'account_voucher',
21+ 'l10n_ve_fiscal_requirements',
22+ 'l10n_ve_fiscal_reports',
23+ 'l10n_ve_withholding_iva',
24 ],
25 'update_xml' : [
26+ 'view/factura_fixes.xml',
27 ],
28 'active' : False,
29 'installable' : True,
30
31=== modified file 'diana_fixes/model/fixes.py'
32--- diana_fixes/model/fixes.py 2012-01-11 15:47:40 +0000
33+++ diana_fixes/model/fixes.py 2012-06-13 18:01:24 +0000
34@@ -1,5 +1,6 @@
35 # -*- coding: utf-8 -*-
36 from osv import osv, fields
37+import decimal_precision as dp
38 import netsvc
39 import pooler
40
41@@ -29,3 +30,80 @@
42 }
43
44 account_aged_trial_balance()
45+
46+class account_invoice_line(osv.osv):
47+ _inherit='account.invoice.line'
48+
49+ def write(self, cr, uid, ids, vals, context=None):
50+ """Sobre escribir ORM write para validar que la factura no se le agreguen
51+ lineas con precio unitario menor a 0, y que se hayan agregado impuestos"""
52+ if context is None:
53+ context = {}
54+
55+ if vals.get('price_unit', 1) <= 0.0:
56+ raise osv.except_osv('Error con Precio Unidad',"El precio unidad debe tener un valor mayor a 0")
57+
58+ if vals.get('invoice_line_tax_id', False):
59+ if vals['invoice_line_tax_id'][0][2] == []:
60+ raise osv.except_osv('Error con Impuestos',"Se debe asignar una cuenta de impuesto a la línea, asi se encuentre exenta")
61+ return super(account_invoice_line, self).write(cr, uid, ids, vals, context=context)
62+
63+ def create(self, cr, uid, vals, context=None):
64+ """Sobre escribir ORM create para validar que la factura no se le agreguen
65+ lineas con precio unitario menor a 0, y que se hayan agregado impuestos"""
66+ if context is None:
67+ context = {}
68+
69+ if float(vals['price_unit']) <= 0.0:
70+ raise osv.except_osv('Error con Precio Unidad',"El precio unidad debe tener un valor mayor a 0")
71+
72+ if vals['invoice_line_tax_id'][0][2] == []:
73+ raise osv.except_osv('Error con Impuestos',"Se debe asignar una cuenta de impuesto a la línea, asi se encuentre exenta")
74+ return super(account_invoice_line, self).create(cr, uid, vals, context=context)
75+
76+account_invoice_line()
77+
78+class account_invoice_refund(osv.osv_memory):
79+
80+ """Refunds invoice"""
81+
82+ """Para sobre escribir el wizard de facturas rectificativas y poder usar
83+ siempre por defecto 'Facturas rectificativas'.
84+
85+ Tambien se hereda para colocar en 0.0 el Total al generar una factura
86+ rectificativa."""
87+
88+ _inherit = "account.invoice.refund"
89+ _description = "Sobreescribir Factura Rectificativas"
90+
91+ _defaults = {
92+ 'filter_refund': 'refund',
93+ }
94+
95+ def compute_refund(self, cr, uid, ids, mode='refund', context=None):
96+ """
97+ Super de compute_refund para colocar las facturas rectificativas con el
98+ monto check_total en 0
99+ """
100+ result = super(account_invoice_refund, self).compute_refund(cr, uid, ids, mode, context)
101+ inv_obj = self.pool.get('account.invoice')
102+ if result.get('domain', False):
103+ for res in result['domain']:
104+ if res[0] == 'id':
105+ inv_obj.write(cr, uid, res[2], {'check_total':0.0}, context)
106+
107+ return result
108+
109+account_invoice_refund()
110+
111+class account_invoice(osv.osv):
112+ """Se hereda account.invoice para modificar el campo wh_iva_rate, creado
113+ por l10n_ve_withholding_iva y colocarlo siempre en readonly, esto porque
114+ ese campo se debe llenar por defecto segun el proveedor/cliente"""
115+ _inherit = "account.invoice"
116+
117+ _columns = {
118+ 'wh_iva_rate': fields.float('Wh rate', digits_compute= dp.get_precision('Withhold'), readonly=True, help="Withholding vat rate"),
119+ }
120+
121+account_invoice()
122
123=== added directory 'diana_fixes/view'
124=== added file 'diana_fixes/view/factura_fixes.xml'
125--- diana_fixes/view/factura_fixes.xml 1970-01-01 00:00:00 +0000
126+++ diana_fixes/view/factura_fixes.xml 2012-06-13 18:01:24 +0000
127@@ -0,0 +1,223 @@
128+<?xml version="1.0" encoding="utf-8"?>
129+<openerp>
130+ <data>
131+
132+<!--
133+ En facturas al proveedor se hace requerido nro_ctrl (Numero de control)
134+ y este solo puedo ser modificado cuando la factura este en borrador.
135+ Tambien se modifica el boton 'Cambiar numero de control' para solo se
136+ pueda usar cuando la factura este en borrador o abierto.
137+ Y se hace requerido y que solo modificable en borrador o abierto, el
138+ campo reference, que es usado para la 'Referencia libre'.
139+-->
140+ <record id="l10n_ve_fiscal_requirements.account_invoice_nro_control_supplier_form" model="ir.ui.view">
141+ <field name="name">account.invoice.nro.control.supplier.form</field>
142+ <field name="model">account.invoice</field>
143+ <field name="type">form</field>
144+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
145+ <field name="arch" type="xml">
146+ <xpath expr="/form/notebook/page/field[@name='reference']" position="replace">
147+ <field name='reference' nolabel="1" required='True' attrs="{'readonly':[('state','not in',('open','draft'))]}"/>
148+ </xpath>
149+ <xpath expr="/form/notebook/page/field[@name='check_total']" position="after">
150+ <group colspan="2">
151+ <field name="nro_ctrl" required="1" attrs="{'readonly':[('state','&lt;&gt;','draft')]}"/>
152+ <button name="%(l10n_ve_fiscal_requirements.action_wiz_nroctrl)d" type='action' string='Change control number' icon="gtk-execute" states='draft,open'/>
153+ </group>
154+ </xpath>
155+ </field>
156+ </record>
157+
158+<!--
159+ En facturas al cliente se hace requerido nro_ctrl (Numero de control)
160+ y este solo puedo ser modificado cuando la factura este en borrador.
161+ Tambien se modifica el boton 'Cambiar numero de control' para solo se
162+ pueda usar cuando la factura este en borrador o abierto.
163+-->
164+ <record id="l10n_ve_fiscal_requirements.account_invoice_nro_control_customer_form" model="ir.ui.view">
165+ <field name="name">account.invoice.nro.control.customer.form</field>
166+ <field name="model">account.invoice</field>
167+ <field name="type">form</field>
168+ <field name="inherit_id" ref="account.invoice_form"/>
169+ <field name="arch" type="xml">
170+ <xpath expr="/form/notebook/page/field[@name='payment_term']" position="after">
171+ <group colspan="2" >
172+ <field name="nro_ctrl" required="1" attrs="{'readonly':[('state','&lt;&gt;','draft')]}"/>
173+ <button name="%(l10n_ve_fiscal_requirements.action_wiz_nroctrl)d" type='action' string='Change control number' icon="gtk-execute" states='draft,open'/>
174+ </group>
175+ </xpath>
176+ </field>
177+ </record>
178+
179+<!--
180+ Se modifica en facturas a clientes, date_document (Fecha del Documento)
181+ para que sea modificado solo cuando este se encuentre en borrador o
182+ abierto y es requerido.
183+-->
184+ <record model="ir.ui.view" id="l10n_ve_fiscal_reports.inherited_account_invoice_form_fiscal">
185+ <field name="name">account.invoice.inherit.fiscal</field>
186+ <field name="model">account.invoice</field>
187+ <field name="inherit_id" ref="account.invoice_form"/>
188+ <field name="arch" type="xml">
189+ <data>
190+ <field name="date_invoice" position="after">
191+ <field name="date_document" required="True" attrs="{'readonly':[('state','not in',('open','draft'))]}"/>
192+ </field>
193+ </data>
194+ </field>
195+ </record>
196+
197+<!--
198+ Se modifica el campo boleano expedence (Expediente) para que solo
199+ pueda ser modificado cuando la factura este en borrador o abierto.
200+ Tambien se modifica date_document (Fecha del Documento) para que sea
201+ modificado solo cuando este se encuentre en borrador o abierto y es
202+ requerido en las facturas al proveedor.
203+-->
204+ <record model="ir.ui.view" id="l10n_ve_fiscal_reports.inherited_account_invoice_form_fiscal2">
205+ <field name="name">account.invoice.inherit.fiscal2</field>
206+ <field name="model">account.invoice</field>
207+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
208+ <field name="arch" type="xml">
209+ <xpath expr="/form/group/group" position="after">
210+ <field name="expedient" attrs="{'readonly':['|',('type','in',['out_invoice','out_refund']),('state','&lt;&gt;','draft')]}"/>
211+ </xpath>
212+ <xpath expr='//field[@name="date_due"]' position="after">
213+ <field name="date_document" required="True" attrs="{'readonly':[('state','not in',('open','draft'))]}"/>
214+ </xpath>
215+ </field>
216+ </record>
217+
218+
219+<!--
220+ Se coloca invisible el boton de 'Pagar factura', para facturas del
221+ cliente. Esto se hace porque el boton no es necesario.
222+-->
223+ <record id="account_voucher.view_invoice_customer" model="ir.ui.view">
224+ <field name="name">account.invoice.customer.pay</field>
225+ <field name="model">account.invoice</field>
226+ <field name="type">form</field>
227+ <field name="inherit_id" ref="account.invoice_form"/>
228+ <field name="arch" type="xml">
229+ <button name="invoice_open" position="after">
230+ <button name="invoice_pay_customer" type="object" string="Payment" states="open" icon="gtk-go-forward" invisible='True'/>
231+ </button>
232+ </field>
233+ </record>
234+
235+<!--
236+ Se coloca invisible el boton de 'Pagar factura', para facturas del
237+ proveedor. Esto se hace porque el boton no es necesario.
238+-->
239+ <record id="account_voucher.view_invoice_supplier" model="ir.ui.view">
240+ <field name="name">account.invoice.supplier.pay</field>
241+ <field name="model">account.invoice</field>
242+ <field name="type">form</field>
243+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
244+ <field name="arch" type="xml">
245+ <button name="invoice_open" position="after">
246+ <button name="invoice_pay_customer" type="object" string="Pay Invoice" states="open" icon="gtk-go-forward" invisible='True'/>
247+ </button>
248+ </field>
249+ </record>
250+
251+<!--
252+ Se modifica el campo boleano vat_apply (Sin Doc. Iva) para que solo
253+ pueda ser modificado cuando la factura este en borrador.
254+-->
255+ <record id="account_invoice_wh_iva_supplier_inherit" model="ir.ui.view">
256+ <field name="name">account.invoice.wh.iva.supplier.inherit</field>
257+ <field name="model">account.invoice</field>
258+ <field name="type">form</field>
259+ <field name="inherit_id" ref="l10n_ve_withholding_iva.account_invoice_wh_iva_supplier"/>
260+ <field name="arch" type="xml">
261+ <xpath expr="//field[@name='vat_apply']" position="replace">
262+ <field name="vat_apply" attrs="{'readonly':[('state','&lt;&gt;','draft')]}"/>
263+ </xpath>
264+ </field>
265+ </record>
266+
267+<!--
268+ Se coloca invisible el boton de 'Factura Rectificativa', para facturas del
269+ proveedor, cuando la factura sea una factura rectificativa.
270+-->
271+ <record id="l10n_ve_fiscal_requirements.account_invoice_refund_supplier_form" model="ir.ui.view">
272+ <field name="name">account.invoice.refund.supplier.form</field>
273+ <field name="model">account.invoice</field>
274+ <field name="type">form</field>
275+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
276+ <field name="arch" type="xml">
277+ <xpath expr="/form/notebook/page/group/group/button[@string='Refund']" position="replace">
278+ <button name="%(account.action_account_invoice_refund)d" type='action' string='Refund' icon="gtk-execute" attrs="{'invisible':['|',('type','in',('out_refund','in_refund')),('state','not in',('open','paid'))]}"/>
279+ </xpath>
280+ </field>
281+ </record>
282+
283+<!--
284+ Se coloca invisible el boton de 'Factura Rectificativa', para facturas del
285+ cliente, cuando la factura sea una factura rectificativa.
286+-->
287+ <record id="l10n_ve_fiscal_requirements.account_invoice_refund_customer_form" model="ir.ui.view">
288+ <field name="name">account.invoice.refund.customer.form</field>
289+ <field name="model">account.invoice</field>
290+ <field name="type">form</field>
291+ <field name="inherit_id" ref="account.invoice_form"/>
292+ <field name="arch" type="xml">
293+ <xpath expr="/form/notebook/page/group/group/button[@string='Refund']" position="replace">
294+ <button name="%(account.action_account_invoice_refund)d" type='action' string='Refund' icon="gtk-execute" attrs="{'invisible':['|',('type','in',('out_refund','in_refund')),('state','not in',('open','paid'))]}"/>
295+ </xpath>
296+ </field>
297+ </record>
298+
299+<!--
300+ Se sobre escribe la vista para agregar un domain a parent_id para que no
301+ se puedan seleccionar una factura rectificativa a partir de otra factura
302+ rectificativa y tampoco aparezca en la vista de facturas al cliente.
303+ Para las facturas al cliente.
304+-->
305+ <record id="l10n_ve_fiscal_requirements.account_inv_ext_form_crdrc" model="ir.ui.view">
306+ <field name="name">invoice.ext.form.crdr.customer</field>
307+ <field name="model">account.invoice</field>
308+ <field name="type">form</field>
309+ <field name="inherit_id" ref="account.invoice_form"/>
310+ <field name="arch" type="xml">
311+ <xpath expr="/form/group/group" position="after">
312+ <newline/>
313+ <field name="parent_id" attrs="{'required':[('type','=','out_refund')], 'invisible':[('type','!=','out_refund')]}" domain="[('partner_id','=',partner_id),('id','!=',active_id),('type','in',['out_invoice'])]"/>
314+ </xpath>
315+ <xpath expr="//button[@string='Refund']" position="after">
316+ <button name="%(l10n_ve_fiscal_requirements.action_account_invoice_debit)d" type='action' string='Debit Note' icon="gtk-execute" attrs="{'invisible':['|',('state','in',['proforma2','proforma','cancel', 'draft']),('type','in',['out_refund', 'in_refund'])]}"/>
317+ </xpath>
318+ <xpath expr="//button[@string='Refund']" position="after">
319+ <button name="%(l10n_ve_fiscal_requirements.action_account_invoice_parent)d" type='action' string='Parent Invoice' states='open,paid' icon="gtk-execute" attrs="{'invisible':[('type','!=','out_invoice')]}"/>
320+ </xpath>
321+ </field>
322+ </record>
323+
324+<!--
325+ Se sobre escribe la vista para agregar un domain a parent_id para que no
326+ se puedan seleccionar una factura rectificativa a partir de otra factura
327+ rectificativa y tampoco aparezca en la vista de facturas al proveedor.
328+ Para las facturas al proveedor.
329+-->
330+ <record id="l10n_ve_fiscal_requirements.account_inv_ext_form_crdrs" model="ir.ui.view">
331+ <field name="name">invoice.ext.form.crdr.supplier</field>
332+ <field name="model">account.invoice</field>
333+ <field name="type">form</field>
334+ <field name="inherit_id" ref="account.invoice_supplier_form"/>
335+ <field name="arch" type="xml">
336+ <xpath expr="/form/group/group" position="after">
337+ <newline/>
338+ <field name="parent_id" attrs="{'required':[('type','=','in_refund')], 'invisible':[('type','!=','in_refund')]}" domain="[('partner_id','=',partner_id),('id','!=',active_id),('type','in',['in_invoice'])]"/>
339+ </xpath>
340+ <xpath expr="//button[@string='Refund']" position="after">
341+ <button name="%(l10n_ve_fiscal_requirements.action_account_invoice_debit)d" type='action' string='Debit Note' icon="gtk-execute" attrs="{'invisible':['|',('state','in',['proforma2','proforma','cancel', 'draft']),('type','in',['out_refund', 'in_refund'])]}"/>
342+ </xpath>
343+ <xpath expr="//button[@string='Refund']" position="after">
344+ <button name="%(l10n_ve_fiscal_requirements.action_account_invoice_parent)d" type='action' string='Parent Invoice' states='open,paid' icon="gtk-execute" attrs="{'invisible':[('type','!=','in_refund')]}"/>
345+ </xpath>
346+ </field>
347+ </record>
348+
349+ </data>
350+</openerp>
351
352=== modified file 'sisb_account_invoice_wizard/account_invoice.xml'
353--- sisb_account_invoice_wizard/account_invoice.xml 2012-01-25 16:20:51 +0000
354+++ sisb_account_invoice_wizard/account_invoice.xml 2012-06-13 18:01:24 +0000
355@@ -13,6 +13,6 @@
356 </group>
357 </xpath>
358 </field>
359- </record>
360+ </record>
361 </data>
362 </openerp>

Subscribers

People subscribed via source and target branches