Merge lp:~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz into lp:~openerp-brazil-core-team/openerp.pt-br-localiz/openerp.pt-br-localiz-v7.0
- openerp.pt-br-localiz
- Merge into openerp.pt-br-localiz-v7.0
Status: | Superseded |
---|---|
Proposed branch: | lp:~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz |
Merge into: | lp:~openerp-brazil-core-team/openerp.pt-br-localiz/openerp.pt-br-localiz-v7.0 |
Diff against target: |
980 lines (+576/-181) 14 files modified
l10n_br_crm/crm_lead_view.xml (+3/-6) l10n_br_crm/crm_opportunity_view.xml (+3/-6) l10n_br_crm_zip/__init__.py (+21/-0) l10n_br_crm_zip/__openerp__.py (+39/-0) l10n_br_crm_zip/crm_lead.py (+75/-0) l10n_br_crm_zip/crm_lead_view.xml (+19/-0) l10n_br_crm_zip/crm_opportunity_view.xml (+19/-0) l10n_br_data_zip/__openerp__.py (+3/-3) l10n_br_data_zip/l10n_br_data_zip.py (+138/-4) l10n_br_data_zip/l10n_br_data_zip_view.xml (+3/-1) l10n_br_data_zip/res_partner.py (+42/-82) l10n_br_data_zip/res_partner_view.xml (+1/-1) l10n_br_data_zip/wizard/l10n_br_data_zip_search.py (+175/-72) l10n_br_data_zip/wizard/l10n_br_data_zip_search_view.xml (+35/-6) |
To merge this branch: | bzr merge lp:~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Renato Lima - http://www.akretion.com | Needs Resubmitting | ||
Fabio Negrini | Needs Resubmitting | ||
Raphaël Valyi - http://www.akretion.com | Pending | ||
Review via email: mp+152671@code.launchpad.net |
This proposal supersedes a proposal from 2013-03-08.
This proposal has been superseded by a proposal from 2013-03-15.
Commit message
Description of the change
Migração do módulo ZIP e com novas funcionalidades.
Bug de não atualizar os dados do parceiro após a seleção corrigido
Fabio Negrini (fnegrini) wrote : Posted in a previous version of this proposal | # |
Fabio Negrini (fnegrini) wrote : | # |
Agora os dados do parceiro são atualizados imediatamente mesmo quando é aberto o wizard
Renato Lima - http://www.akretion.com (renatonlima) wrote : | # |
Olá Fabio,
Mais uma vez obrigado pela contribuição, eu fiz alguns testes e existe um problema, eu tinha colocado no wizard de busca duas tela, uma com os campos do endereço principais obrigatórios para as pessoas preencherem esses campos antes da busca do ceps para reduzir o resultado da busca, porque os campos no endereço do parceiro são obrigatórios e como você eliminou no wizard a tela com os campos obrigatórios de endereço e esta pegando diretamente os campos do parceiros para aparecer o resultado diretamente (o que achei interessante), existe um problema que se você não preencher os campos do endereço como pais, estado, municio, bairro e endereço, o wizard tenta trazer todos os ceps e como a base de cep tem alguns mil registro, acaba trabando o OpenERP.
Neste casso eu sugiro no método de busca você conferir se ao pressionar o botão de busca pelo menos esses campos pais, estado, municio, bairro ou endereço ou cep estão preenchidos, caso não estejam preenchidos você pode fazer o raise falando que para busca pelo menos esses campos devem ser preenchido, uma outra solução e também no método search do cep verificar se há mais de 80 ou 100 elementos na lista com os IDs caso tenha mais você pode cortar a lista e trazer somente os 80 ou 100 primeiros
- 516. By root <root@ubuntu-desktop>
-
corrigido bug de tentar trazer todos os ceps. Obrigatório Estado, Município e Logradouro
Fabio Negrini (fnegrini) wrote : | # |
Renato,
Criei uma excessão para impedir este tipo de busca. Baixe a revno 516 e pde testar novamente.
Renato Lima - http://www.akretion.com (renatonlima) wrote : | # |
Olá Fabio,
No arquivo l10n_br_data_zip.py no inicio do arquivo você deve importar:
from openerp.
Na linha onde esta:
raise osv.except_
Deveria ficar assim:
l10n_br_data_zip
raise osv.except_
_'Necessário informar Estado, município e logradouro')
- 517. By root <root@ubuntu-desktop>
-
Chamada da excessão agora permite tradução. Revisão nas views do CRM
Fabio Negrini (fnegrini) wrote : | # |
Renato,
Chamada de excessão alterada para permitir tradução.
Aproveito para informar que a branch também já está com o módulo l10n_br_crm convertido e o novo módulo l10n_br_crm_zip que integra a busca por cep nos prospectos e oportunidades do CRM. Importante testar antes de proceder com o merge.
Revno 517
Abs,
Fabio
Renato Lima - http://www.akretion.com (renatonlima) wrote : | # |
Olá Fábio,
Eu testei a revisão #517 e existe um problema de encoding se você digitar uma rua, bairro ou complemento usando por exemplo: "ç" gera um erro. Eu não tive tenho de olhar com detalhes, mas parece que o problema esta quando você procura o CEP no método search ou quando você volta o resultado da busca do cep para o endereço do parceiro.
Fabio Negrini (fnegrini) wrote : | # |
Renato,
Não consegui reproduzir o Erro. Fiz vários testes e todos retornaram sem problemas. Um dos testes que fiz foi fazer a seguinte busca:
Endereço: José
Bairro: Ahú
Cidade: Curitiba
Estado: Paraná
A busca retorna três endereços listados pelo Wizard. Testei o retorno dos três e todos funcionaram corretamente. Tem como passar um passo-a-passo para reproduzir o erro?
Abs,
Fabio
Unmerged revisions
Preview Diff
1 | === modified file 'l10n_br_crm/crm_lead_view.xml' |
2 | --- l10n_br_crm/crm_lead_view.xml 2013-01-03 04:21:33 +0000 |
3 | +++ l10n_br_crm/crm_lead_view.xml 2013-03-13 12:27:20 +0000 |
4 | @@ -12,17 +12,14 @@ |
5 | <field name="city" invisible="1" /> |
6 | </field> |
7 | <field name="state_id" position="replace"> |
8 | - <field name="state_id" /> |
9 | - <field name="l10n_br_city_id" placeholder="municipio" on_change="onchange_l10n_br_city_id(l10n_br_city_id)" /> |
10 | + <field name="state_id" placeholder="estado"/> |
11 | + <field name="l10n_br_city_id" placeholder="municipio"/> |
12 | </field> |
13 | <field name="street2" position="replace"> |
14 | + <field name="district" placeholder="bairro"/> |
15 | <field name="number" placeholder="numero"/> |
16 | <field name="street2" placeholder="complemento"/> |
17 | </field> |
18 | - <!-- FIXME field name="zip" position="replace"> |
19 | - <field name="zip" on_change="onchange_mask_zip(zip)" /> |
20 | - <button name="zip_search" string="Pesquisar CEP" colspan="2" type="object" icon="gtk-select-all"/> |
21 | - </field --> |
22 | </field> |
23 | </record> |
24 | |
25 | |
26 | === modified file 'l10n_br_crm/crm_opportunity_view.xml' |
27 | --- l10n_br_crm/crm_opportunity_view.xml 2013-01-03 04:21:33 +0000 |
28 | +++ l10n_br_crm/crm_opportunity_view.xml 2013-03-13 12:27:20 +0000 |
29 | @@ -12,17 +12,14 @@ |
30 | <field name="city" invisible="1" /> |
31 | </field> |
32 | <field name="state_id" position="replace"> |
33 | - <field name="state_id" /> |
34 | - <field name="l10n_br_city_id" placeholder="municipio" on_change="onchange_l10n_br_city_id(l10n_br_city_id)" /> |
35 | + <field name="state_id" placeholder="estado"/> |
36 | + <field name="l10n_br_city_id" placeholder="municipio" /> |
37 | </field> |
38 | <field name="street2" position="replace"> |
39 | + <field name="district" placeholder="bairro"/> |
40 | <field name="number" placeholder="numero" /> |
41 | <field name="street2" placeholder="complemento" /> |
42 | </field> |
43 | - <!-- FIXME field name="zip" position="replace"> |
44 | - <field name="zip" on_change="onchange_mask_zip(zip)" /> |
45 | - <button name="zip_search" string="Pesquisar CEP" colspan="2" type="object" icon="gtk-select-all"/> |
46 | - </field --> |
47 | </field> |
48 | </record> |
49 | |
50 | |
51 | === added directory 'l10n_br_crm_zip' |
52 | === added file 'l10n_br_crm_zip/__init__.py' |
53 | --- l10n_br_crm_zip/__init__.py 1970-01-01 00:00:00 +0000 |
54 | +++ l10n_br_crm_zip/__init__.py 2013-03-13 12:27:20 +0000 |
55 | @@ -0,0 +1,21 @@ |
56 | +# -*- encoding: utf-8 -*- |
57 | +############################################################################### |
58 | +# # |
59 | +# Copyright (C) 2011 Renato Lima - Akretion # |
60 | +# # |
61 | +#This program is free software: you can redistribute it and/or modify # |
62 | +#it under the terms of the GNU Affero General Public License as published by # |
63 | +#the Free Software Foundation, either version 3 of the License, or # |
64 | +#(at your option) any later version. # |
65 | +# # |
66 | +#This program is distributed in the hope that it will be useful, # |
67 | +#but WITHOUT ANY WARRANTY; without even the implied warranty of # |
68 | +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # |
69 | +#GNU Affero General Public License for more details. # |
70 | +# # |
71 | +#You should have received a copy of the GNU Affero General Public License # |
72 | +#along with this program. If not, see <http://www.gnu.org/licenses/>. # |
73 | +############################################################################### |
74 | + |
75 | +import crm_lead |
76 | + |
77 | |
78 | === added file 'l10n_br_crm_zip/__openerp__.py' |
79 | --- l10n_br_crm_zip/__openerp__.py 1970-01-01 00:00:00 +0000 |
80 | +++ l10n_br_crm_zip/__openerp__.py 2013-03-13 12:27:20 +0000 |
81 | @@ -0,0 +1,39 @@ |
82 | +# -*- encoding: utf-8 -*- |
83 | +############################################################################### |
84 | +# # |
85 | +# Copyright (C) 2011 Fabio Negrini - Akretion # |
86 | +# # |
87 | +#This program is free software: you can redistribute it and/or modify # |
88 | +#it under the terms of the GNU Affero General Public License as published by # |
89 | +#the Free Software Foundation, either version 3 of the License, or # |
90 | +#(at your option) any later version. # |
91 | +# # |
92 | +#This program is distributed in the hope that it will be useful, # |
93 | +#but WITHOUT ANY WARRANTY; without even the implied warranty of # |
94 | +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # |
95 | +#GNU Affero General Public License for more details. # |
96 | +# # |
97 | +#You should have received a copy of the GNU Affero General Public License # |
98 | +#along with this program. If not, see <http://www.gnu.org/licenses/>. # |
99 | +############################################################################### |
100 | + |
101 | +{ |
102 | + 'name': 'CRM ZIP', |
103 | + 'description': 'ZIP Search Integration for Brazilian Localization of CRM module', |
104 | + 'category': 'Localization', |
105 | + 'license': 'AGPL-3', |
106 | + 'author': 'Fabio Negrini - OpenERP Brasil', |
107 | + 'website': 'http://openerpbrasil.org', |
108 | + 'version': '0.6', |
109 | + 'depends': [ |
110 | + 'l10n_br_data_zip', |
111 | + 'l10n_br_crm', |
112 | + ], |
113 | + 'data': [ |
114 | + 'crm_lead_view.xml', |
115 | + 'crm_opportunity_view.xml', |
116 | + ], |
117 | + 'demo': [], |
118 | + 'installable': True, |
119 | + 'auto_install': True, |
120 | +} |
121 | |
122 | === added file 'l10n_br_crm_zip/crm_lead.py' |
123 | --- l10n_br_crm_zip/crm_lead.py 1970-01-01 00:00:00 +0000 |
124 | +++ l10n_br_crm_zip/crm_lead.py 2013-03-13 12:27:20 +0000 |
125 | @@ -0,0 +1,75 @@ |
126 | +# -*- encoding: utf-8 -*- |
127 | +############################################################################### |
128 | +# # |
129 | +# Copyright (C) 2012 Renato Lima - Akretion # |
130 | +# # |
131 | +#This program is free software: you can redistribute it and/or modify # |
132 | +#it under the terms of the GNU Affero General Public License as published by # |
133 | +#the Free Software Foundation, either version 3 of the License, or # |
134 | +#(at your option) any later version. # |
135 | +# # |
136 | +#This program is distributed in the hope that it will be useful, # |
137 | +#but WITHOUT ANY WARRANTY; without even the implied warranty of # |
138 | +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # |
139 | +#GNU Affero General Public License for more details. # |
140 | +# # |
141 | +#You should have received a copy of the GNU Affero General Public License # |
142 | +#along with this program. If not, see <http://www.gnu.org/licenses/>. # |
143 | +############################################################################### |
144 | + |
145 | +from openerp.osv import fields, osv |
146 | + |
147 | + |
148 | +class crm_lead(osv.Model): |
149 | + """ CRM Lead Case """ |
150 | + _inherit = "crm.lead" |
151 | + |
152 | + |
153 | + def zip_search(self, cr, uid, ids, context=None): |
154 | + |
155 | + obj_zip = self.pool.get('l10n_br_data.zip') |
156 | + |
157 | + for crm_lead in self.browse(cr, uid, ids): |
158 | + |
159 | + zip_ids = obj_zip.zip_search_multi(cr, uid, ids, context, |
160 | + country_id = crm_lead.country_id.id, \ |
161 | + state_id = crm_lead.state_id.id, \ |
162 | + l10n_br_city_id = crm_lead.l10n_br_city_id.id, \ |
163 | + district = crm_lead.district, \ |
164 | + street = crm_lead.street, \ |
165 | + zip = crm_lead.zip, |
166 | + ) |
167 | + |
168 | + if len(zip_ids) == 1: |
169 | + |
170 | + zip_read = obj_zip.set_result(cr, uid, ids, context, zip_ids[0]) |
171 | + |
172 | + result = { |
173 | + 'country_id': zip_read['country_id'], |
174 | + 'state_id': zip_read['state_id'], |
175 | + 'l10n_br_city_id': zip_read['l10n_br_city_id'], |
176 | + 'district': zip_read['district'], |
177 | + 'street': zip_read['street'], |
178 | + 'zip': zip_read['zip'], |
179 | + } |
180 | + |
181 | + self.write(cr, uid, crm_lead.id, result) |
182 | + |
183 | + return True |
184 | + |
185 | + else: |
186 | + |
187 | + if len(zip_ids) > 1: |
188 | + |
189 | + return obj_zip.create_wizard(cr, uid, ids, context, self._name, |
190 | + country_id = crm_lead.country_id.id, \ |
191 | + state_id = crm_lead.state_id.id, \ |
192 | + l10n_br_city_id = crm_lead.l10n_br_city_id.id, \ |
193 | + district = crm_lead.district, \ |
194 | + street = crm_lead.street, \ |
195 | + zip = crm_lead.zip, |
196 | + zip_ids = zip_ids |
197 | + ) |
198 | + else: |
199 | + |
200 | + return True |
201 | \ No newline at end of file |
202 | |
203 | === added file 'l10n_br_crm_zip/crm_lead_view.xml' |
204 | --- l10n_br_crm_zip/crm_lead_view.xml 1970-01-01 00:00:00 +0000 |
205 | +++ l10n_br_crm_zip/crm_lead_view.xml 2013-03-13 12:27:20 +0000 |
206 | @@ -0,0 +1,19 @@ |
207 | +<?xml version="1.0" encoding="utf-8"?> |
208 | +<openerp> |
209 | + <data> |
210 | + |
211 | + <!-- CRM Lead Form View --> |
212 | + <record model="ir.ui.view" id="l10n_br_crm_case_form_view_leads1"> |
213 | + <field name="name">l10n_br_crm.leads1</field> |
214 | + <field name="model">crm.lead</field> |
215 | + <field name="inherit_id" ref="crm.crm_case_form_view_leads" /> |
216 | + <field name="arch" type="xml"> |
217 | + <field name="zip" position="replace"> |
218 | + <field name="zip"/> |
219 | + <button name="zip_search" string="Buscar Endereço" colspan="2" type="object" icon="gtk-select-all"/> |
220 | + </field> |
221 | + </field> |
222 | + </record> |
223 | + |
224 | + </data> |
225 | +</openerp> |
226 | |
227 | === added file 'l10n_br_crm_zip/crm_opportunity_view.xml' |
228 | --- l10n_br_crm_zip/crm_opportunity_view.xml 1970-01-01 00:00:00 +0000 |
229 | +++ l10n_br_crm_zip/crm_opportunity_view.xml 2013-03-13 12:27:20 +0000 |
230 | @@ -0,0 +1,19 @@ |
231 | +<?xml version="1.0" encoding="utf-8"?> |
232 | +<openerp> |
233 | + <data> |
234 | + |
235 | + <!-- CRM Opportunity Form View --> |
236 | + <record model="ir.ui.view" id="l10n_br_crm_case_form_view_oppor1"> |
237 | + <field name="name">l10n_br_crm.opportunities1</field> |
238 | + <field name="model">crm.lead</field> |
239 | + <field name="inherit_id" ref="crm.crm_case_form_view_oppor" /> |
240 | + <field name="arch" type="xml"> |
241 | + <field name="zip" position="replace"> |
242 | + <field name="zip"/> |
243 | + <button name="zip_search" string="Buscar Endereço" colspan="2" type="object" icon="gtk-select-all"/> |
244 | + </field> |
245 | + </field> |
246 | + </record> |
247 | + |
248 | + </data> |
249 | +</openerp> |
250 | |
251 | === modified file 'l10n_br_data_zip/__openerp__.py' |
252 | --- l10n_br_data_zip/__openerp__.py 2013-02-11 15:51:01 +0000 |
253 | +++ l10n_br_data_zip/__openerp__.py 2013-03-13 12:27:20 +0000 |
254 | @@ -19,7 +19,7 @@ |
255 | |
256 | { |
257 | 'name': 'Brazilian Localisation Data Extension for zip codes', |
258 | - 'description': 'Brazilian Localisation Data Extension for zip codes', |
259 | + 'description': 'Brazilian Localization Data Extension for zip codes', |
260 | 'license': 'AGPL-3', |
261 | 'author': 'Akretion, OpenERP Brasil', |
262 | 'version': '0.1', |
263 | @@ -27,14 +27,14 @@ |
264 | 'l10n_br_base', |
265 | ], |
266 | 'data': [ |
267 | - 'zip.sql' |
268 | + 'zip.sql', |
269 | 'l10n_br_data_zip_view.xml', |
270 | 'res_partner_view.xml', |
271 | 'wizard/l10n_br_data_zip_search_view.xml', |
272 | 'security/ir.model.access.csv', |
273 | ], |
274 | 'demo': [], |
275 | - 'category': 'Localisation', |
276 | + 'category': 'Localization', |
277 | 'active': False, |
278 | 'installable': True |
279 | } |
280 | |
281 | === modified file 'l10n_br_data_zip/l10n_br_data_zip.py' |
282 | --- l10n_br_data_zip/l10n_br_data_zip.py 2013-01-19 00:22:49 +0000 |
283 | +++ l10n_br_data_zip/l10n_br_data_zip.py 2013-03-13 12:27:20 +0000 |
284 | @@ -16,9 +16,9 @@ |
285 | #You should have received a copy of the GNU Affero General Public License # |
286 | #along with this program. If not, see <http://www.gnu.org/licenses/>. # |
287 | ############################################################################### |
288 | - |
289 | -from osv import osv, fields |
290 | - |
291 | +import re |
292 | +from openerp.osv import osv, fields |
293 | +from openerp.tools.translate import _ |
294 | |
295 | class l10n_br_data_zip(osv.Model): |
296 | """ Este objeto persiste todos os códigos postais que podem ser |
297 | @@ -37,5 +37,139 @@ |
298 | domain="[('country_id','=',country_id)]"), |
299 | 'l10n_br_city_id': fields.many2one( |
300 | 'l10n_br_base.city', 'Cidade', |
301 | - required=True, domain="[('state_id','=',state_id)]") |
302 | + required=True, domain="[('state_id','=',state_id)]"), |
303 | } |
304 | + |
305 | + def set_domain(self, country_id=False, state_id=False, l10n_br_city_id=False, district=False, street=False, zip=False): |
306 | + |
307 | + domain = [] |
308 | + |
309 | + if zip: |
310 | + new_zip = re.sub('[^0-9]', '', zip or '') |
311 | + domain.append(('code', '=', new_zip)) |
312 | + else: |
313 | + |
314 | + if state_id == False or \ |
315 | + l10n_br_city_id == False or\ |
316 | + len(street or '') == 0: |
317 | + raise osv.except_osv(_('Parametros insuficientes'), |
318 | + _('Necessário informar Estado, município e logradouro')) |
319 | + |
320 | + if country_id: |
321 | + domain.append(('country_id', '=', country_id)) |
322 | + |
323 | + if state_id: |
324 | + domain.append(('state_id', '=', state_id)) |
325 | + |
326 | + if l10n_br_city_id: |
327 | + domain.append(('l10n_br_city_id', '=', l10n_br_city_id)) |
328 | + |
329 | + if district: |
330 | + domain.append(('district', 'like', district)) |
331 | + |
332 | + if street: |
333 | + domain.append(('street', 'like', street)) |
334 | + |
335 | + return domain |
336 | + |
337 | + def set_result(self, cr, uid, ids, context, zip_id=None): |
338 | + |
339 | + result = { |
340 | + 'country_id': False, |
341 | + 'state_id': False, |
342 | + 'l10n_br_city_id': False, |
343 | + 'district': False, |
344 | + 'street': False, |
345 | + 'zip': False |
346 | + } |
347 | + |
348 | + if zip_id != None: |
349 | + |
350 | + zip_read = self.read(cr, uid, zip_id, [ |
351 | + 'street_type', |
352 | + 'street', |
353 | + 'district', |
354 | + 'code', |
355 | + 'l10n_br_city_id', |
356 | + 'state_id', |
357 | + 'country_id' |
358 | + ], |
359 | + context=context) |
360 | + |
361 | + zip = zip_read['code'] |
362 | + |
363 | + if len(zip) == 8: |
364 | + zip = '%s-%s' % (zip[0:5], zip[5:8]) |
365 | + |
366 | + result = { |
367 | + 'country_id': zip_read['country_id'] and zip_read['country_id'][0] or False, |
368 | + 'state_id': zip_read['state_id'] and zip_read['state_id'][0] or False, |
369 | + 'l10n_br_city_id': zip_read['l10n_br_city_id'] and zip_read['l10n_br_city_id'][0] or False, |
370 | + 'district': (zip_read['district'] or ''), |
371 | + 'street': ((zip_read['street_type'] or '') + ' ' + (zip_read['street'] or '')), |
372 | + 'zip': zip, |
373 | + } |
374 | + |
375 | + return result |
376 | + |
377 | + |
378 | + def zip_search_multi(self, cr, uid, ids, context, country_id=False, state_id=False, l10n_br_city_id=False, district=False, street=False, zip=False): |
379 | + |
380 | + domain = self.set_domain(country_id = country_id, |
381 | + state_id = state_id, |
382 | + l10n_br_city_id = l10n_br_city_id, |
383 | + district = district, |
384 | + street = street, |
385 | + zip = zip) |
386 | + |
387 | + zip_id = self.search(cr, uid, domain) |
388 | + |
389 | + return zip_id |
390 | + |
391 | + def zip_search(self, cr, uid, ids, context, country_id=False, state_id=False, l10n_br_city_id=False, district=False, street=False, zip=False): |
392 | + |
393 | + result = self.set_result(cr, uid, ids, context) |
394 | + |
395 | + zip_id = self.zip_search_multi(cr, uid, ids, context, |
396 | + country_id, |
397 | + state_id, |
398 | + l10n_br_city_id, |
399 | + district, |
400 | + street, |
401 | + zip) |
402 | + |
403 | + if len(zip_id) == 1: |
404 | + |
405 | + result = self.set_result(cr, uid, ids, context, zip_id[0]) |
406 | + |
407 | + return result |
408 | + |
409 | + else: |
410 | + |
411 | + return False |
412 | + |
413 | + def create_wizard(self, cr, uid, ids, context, object_name, country_id=False, state_id=False, l10n_br_city_id=False, district=False, street=False, zip=False, zip_ids=False): |
414 | + |
415 | + context.update({'zip': zip, |
416 | + 'street': street, |
417 | + 'district': district, |
418 | + 'country_id': country_id, |
419 | + 'state_id': state_id, |
420 | + 'l10n_br_city_id': l10n_br_city_id, |
421 | + 'zip_ids': zip_ids, |
422 | + 'address_id': ids[0], |
423 | + 'object_name': object_name}) |
424 | + |
425 | + result = { |
426 | + 'name': 'Zip Search', |
427 | + 'view_type': 'form', |
428 | + 'view_mode': 'form', |
429 | + 'res_model': 'l10n_br_data.zip.search', |
430 | + 'view_id': False, |
431 | + 'context': context, |
432 | + 'type': 'ir.actions.act_window', |
433 | + 'target': 'new', |
434 | + 'nodestroy': True, |
435 | + } |
436 | + |
437 | + return result |
438 | |
439 | === modified file 'l10n_br_data_zip/l10n_br_data_zip_view.xml' |
440 | --- l10n_br_data_zip/l10n_br_data_zip_view.xml 2012-12-11 04:31:17 +0000 |
441 | +++ l10n_br_data_zip/l10n_br_data_zip_view.xml 2013-03-13 12:27:20 +0000 |
442 | @@ -8,6 +8,7 @@ |
443 | <field name="arch" type="xml"> |
444 | <tree string="CEPs"> |
445 | <field name="code" select="1"/> |
446 | + <field name="district" select="1"/> |
447 | <field name="street_type" select="1"/> |
448 | <field name="street" select="1"/> |
449 | </tree> |
450 | @@ -29,7 +30,8 @@ |
451 | </form> |
452 | </field> |
453 | </record> |
454 | - |
455 | + |
456 | + |
457 | <record model="ir.actions.act_window" id="action_l10n_br_data_zip"> |
458 | <field name="name">CEPs</field> |
459 | <field name="type">ir.actions.act_window</field> |
460 | |
461 | === modified file 'l10n_br_data_zip/res_partner.py' |
462 | --- l10n_br_data_zip/res_partner.py 2013-01-20 23:42:40 +0000 |
463 | +++ l10n_br_data_zip/res_partner.py 2013-03-13 12:27:20 +0000 |
464 | @@ -18,97 +18,57 @@ |
465 | ############################################################################### |
466 | |
467 | import re |
468 | -from osv import osv |
469 | +from openerp.osv import osv |
470 | |
471 | |
472 | class res_partner(osv.Model): |
473 | _inherit = 'res.partner' |
474 | |
475 | - #TODO migrate |
476 | def zip_search(self, cr, uid, ids, context=None): |
477 | |
478 | - result = { |
479 | - 'street': False, |
480 | - 'l10n_br_city_id': False, |
481 | - 'city': False, |
482 | - 'state_id': False, |
483 | - 'country_id': False, |
484 | - 'zip': False |
485 | - } |
486 | - |
487 | obj_zip = self.pool.get('l10n_br_data.zip') |
488 | |
489 | for res_partner in self.browse(cr, uid, ids): |
490 | + |
491 | + zip_ids = obj_zip.zip_search_multi(cr, uid, ids, context, |
492 | + country_id = res_partner.country_id.id, \ |
493 | + state_id = res_partner.state_id.id, \ |
494 | + l10n_br_city_id = res_partner.l10n_br_city_id.id, \ |
495 | + district = res_partner.district, \ |
496 | + street = res_partner.street, \ |
497 | + zip = res_partner.zip, |
498 | + ) |
499 | + |
500 | + if len(zip_ids) == 1: |
501 | + |
502 | + zip_read = obj_zip.set_result(cr, uid, ids, context, zip_ids[0]) |
503 | |
504 | - domain = [] |
505 | - if res_partner.zip: |
506 | - zip = re.sub('[^0-9]', '', res_partner.zip or '') |
507 | - domain.append(('code', '=', zip)) |
508 | + result = { |
509 | + 'country_id': zip_read['country_id'], |
510 | + 'state_id': zip_read['state_id'], |
511 | + 'l10n_br_city_id': zip_read['l10n_br_city_id'], |
512 | + 'district': zip_read['district'], |
513 | + 'street': zip_read['street'], |
514 | + 'zip': zip_read['zip'], |
515 | + } |
516 | + |
517 | + self.write(cr, uid, res_partner.id, result) |
518 | + |
519 | + return True |
520 | + |
521 | else: |
522 | - domain.append(('street', '=', res_partner.street)) |
523 | - domain.append(('district', '=', res_partner.district)) |
524 | - domain.append(('country_id', '=', \ |
525 | - res_partner.country_id.id)) |
526 | - domain.append(('state_id', '=', \ |
527 | - res_partner.state_id.id)) |
528 | - domain.append(('l10n_br_city_id', '=', \ |
529 | - res_partner.l10n_br_city_id.id)) |
530 | - |
531 | - zip_id = obj_zip.search(cr, uid, domain) |
532 | - |
533 | - if not len(zip_id) == 1: |
534 | - |
535 | - context.update({ |
536 | - 'zip': res_partner.zip, |
537 | - 'street': res_partner.street, |
538 | - 'district': res_partner.district, |
539 | - 'country_id': \ |
540 | - res_partner.country_id.id, |
541 | - 'state_id': res_partner.state_id.id, |
542 | - 'l10n_br_city_id': \ |
543 | - res_partner.l10n_br_city_id.id, |
544 | - 'address_id': ids, |
545 | - 'object_name': self._name, |
546 | - }) |
547 | - |
548 | - result = { |
549 | - 'name': 'Zip Search', |
550 | - 'view_type': 'form', |
551 | - 'view_mode': 'form', |
552 | - 'res_model': 'l10n_br_data.zip.search', |
553 | - 'view_id': False, |
554 | - 'context': context, |
555 | - 'type': 'ir.actions.act_window', |
556 | - 'target': 'new', |
557 | - 'nodestroy': True, |
558 | - } |
559 | - return result |
560 | - |
561 | - zip_read = obj_zip.read(cr, uid, zip_id, [ |
562 | - 'street_type', |
563 | - 'street', 'district', |
564 | - 'code', |
565 | - 'l10n_br_city_id', |
566 | - 'city', 'state_id', |
567 | - 'country_id' |
568 | - ], |
569 | - context=context)[0] |
570 | - |
571 | - zip = re.sub('[^0-9]', '', zip_read['code'] or '') |
572 | - if len(zip) == 8: |
573 | - zip = '%s-%s' % (zip[0:5], zip[5:8]) |
574 | - |
575 | - result['street'] = ((zip_read['street_type'] or '') + ' ' \ |
576 | - + (zip_read['street'] or '')) |
577 | - result['district'] = zip_read['district'] |
578 | - result['zip'] = zip |
579 | - result['l10n_br_city_id'] = zip_read['l10n_br_city_id'] \ |
580 | - and zip_read['l10n_br_city_id'][0] or False |
581 | - result['city'] = zip_read['l10n_br_city_id'] \ |
582 | - and zip_read['l10n_br_city_id'][1] or '' |
583 | - result['state_id'] = zip_read['state_id'] \ |
584 | - and zip_read['state_id'][0] or False |
585 | - result['country_id'] = zip_read['country_id'] \ |
586 | - and zip_read['country_id'][0] or False |
587 | - self.write(cr, uid, res_partner.id, result) |
588 | - return False |
589 | + |
590 | + if len(zip_ids) > 1: |
591 | + |
592 | + return obj_zip.create_wizard(cr, uid, ids, context, self._name, |
593 | + country_id = res_partner.country_id.id, \ |
594 | + state_id = res_partner.state_id.id, \ |
595 | + l10n_br_city_id = res_partner.l10n_br_city_id.id, \ |
596 | + district = res_partner.district, \ |
597 | + street = res_partner.street, \ |
598 | + zip = res_partner.zip, |
599 | + zip_ids = zip_ids |
600 | + ) |
601 | + else: |
602 | + |
603 | + return True |
604 | |
605 | === modified file 'l10n_br_data_zip/res_partner_view.xml' |
606 | --- l10n_br_data_zip/res_partner_view.xml 2012-12-11 04:31:17 +0000 |
607 | +++ l10n_br_data_zip/res_partner_view.xml 2013-03-13 12:27:20 +0000 |
608 | @@ -10,7 +10,7 @@ |
609 | <field name="arch" type="xml"> |
610 | <field name="zip" position="replace"> |
611 | <field name="zip" placeholder="ZIP" on_change="onchange_mask_zip(zip)"/> |
612 | - <button name="zip_search" string="Pesquisar CEP" type="object"/> |
613 | + <button name="zip_search" string="Buscar Endereço" type="object"/> |
614 | </field> |
615 | </field> |
616 | </record> |
617 | |
618 | === modified file 'l10n_br_data_zip/wizard/l10n_br_data_zip_search.py' |
619 | --- l10n_br_data_zip/wizard/l10n_br_data_zip_search.py 2013-01-03 04:21:33 +0000 |
620 | +++ l10n_br_data_zip/wizard/l10n_br_data_zip_search.py 2013-03-13 12:27:20 +0000 |
621 | @@ -20,13 +20,16 @@ |
622 | import re |
623 | import string |
624 | |
625 | -from osv import osv, fields |
626 | - |
627 | - |
628 | -class l10n_br_data_zip_search(osv.osv_memory): |
629 | +from openerp.osv import osv, fields |
630 | + |
631 | + |
632 | + |
633 | +class l10n_br_data_zip_search(osv.TransientModel): |
634 | + |
635 | _name = 'l10n_br_data.zip.search' |
636 | + |
637 | _description = 'Zipcode Search' |
638 | - #_inherit = 'ir.wizard.screen' |
639 | + |
640 | _columns = { |
641 | 'code': fields.char('CEP', size=8), |
642 | 'street': fields.char('Logradouro', size=72), |
643 | @@ -38,15 +41,28 @@ |
644 | 'l10n_br_city_id': fields.many2one( |
645 | 'l10n_br_base.city', 'Cidade', |
646 | domain="[('state_id','=',state_id)]"), |
647 | - 'zip_ids': fields.many2many('l10n_br_data.zip','zip_search', |
648 | + |
649 | + 'zip_ids': fields.many2many('l10n_br_data.zip.result','zip_search', |
650 | 'zip_id', 'zip_search_id', 'CEP', |
651 | - readonly=True), |
652 | + readonly=False), |
653 | + |
654 | 'state':fields.selection([('init','init'), |
655 | - ('done','done')], 'state', readonly=True)} |
656 | + ('done','done')], 'state', readonly=True), |
657 | + 'address_id': fields.integer('Id do objeto', invisible=True), |
658 | + 'object_name': fields.char('Nome do bjeto', size=100, invisible=True), |
659 | + } |
660 | |
661 | _defaults = { |
662 | 'state': 'init'} |
663 | |
664 | + def create(self, cr, uid, vals, context): |
665 | + |
666 | + result = super(l10n_br_data_zip_search, self).create(cr, uid, vals, context) |
667 | + |
668 | + context.update({'search_id': result}) |
669 | + |
670 | + return result |
671 | + |
672 | def default_get(self, cr, uid, fields_list, context=None): |
673 | |
674 | if context is None: |
675 | @@ -61,78 +77,165 @@ |
676 | data['country_id'] = context.get('country_id', False) |
677 | data['state_id'] = context.get('state_id', False) |
678 | data['l10n_br_city_id'] = context.get('l10n_br_city_id', False) |
679 | + data['address_id'] = context.get('address_id', False) |
680 | + data['object_name'] = context.get('object_name', False) |
681 | + |
682 | + zip_ids = context.get('zip_ids', False) |
683 | + |
684 | + if zip_ids != False: |
685 | + |
686 | + obj_zip_result = self.pool.get('l10n_br_data.zip.result') |
687 | + |
688 | + zip_result_ids = obj_zip_result.map_to_zip_result(cr, uid, 0, context, |
689 | + zip_ids, data['object_name'], data['address_id']) |
690 | + |
691 | + data['zip_ids'] = zip_result_ids |
692 | + |
693 | + data['state'] = 'done' |
694 | |
695 | return data |
696 | - |
697 | + |
698 | def zip_search(self, cr, uid, ids, context=None): |
699 | |
700 | data = self.read(cr, uid, ids, [], context=context)[0] |
701 | |
702 | - domain = [ |
703 | - ('country_id','=',data['country_id'][0]), |
704 | - ('state_id','=',data['state_id'][0]), |
705 | - ('l10n_br_city_id','=',data['l10n_br_city_id'][0]),] |
706 | - |
707 | - if data['code']: |
708 | - zip = re.sub('[^0-9]', '', data['code'] or '') |
709 | - domain.append(('code','=',zip)) |
710 | - |
711 | - if data['street']: |
712 | - domain.append(('street','=',data['street'])) |
713 | - |
714 | - if data['district']: |
715 | - domain.append(('district','=',data['district'])) |
716 | - |
717 | obj_zip = self.pool.get('l10n_br_data.zip') |
718 | + |
719 | + obj_zip_result = self.pool.get('l10n_br_data.zip.result') |
720 | + |
721 | + domain = obj_zip.set_domain(country_id = data['country_id'][0], \ |
722 | + state_id = data['state_id'][0], \ |
723 | + l10n_br_city_id = data['l10n_br_city_id'][0],\ |
724 | + district = data['district'], \ |
725 | + street = data['street'], \ |
726 | + zip = data['code']) |
727 | + |
728 | + # Search zip_ids |
729 | zip_ids = obj_zip.search(cr, uid, domain) |
730 | |
731 | + #MAP zip to zip.search.result |
732 | + zip_result_ids = obj_zip_result.map_to_zip_result(cr, uid, ids, context, |
733 | + zip_ids, data['object_name'], data['address_id']) |
734 | + |
735 | self.write(cr, uid, ids, |
736 | {'state': 'done', |
737 | - 'zip_ids': [[6, 0, zip_ids]]}, context=context) |
738 | - return False |
739 | - |
740 | - def zip_search_end(self, cr, uid, ids, context=None): |
741 | - |
742 | - result = { |
743 | - 'street': False, |
744 | - 'l10n_br_city_id': False, |
745 | - 'city': False, |
746 | - 'state_id': False, |
747 | - 'country_id': False, |
748 | - 'zip': False |
749 | - } |
750 | - |
751 | - data = self.read(cr, uid, ids, [], context=context)[0] |
752 | - |
753 | - if data['zip_ids']: |
754 | - address_id = context.get('address_id', False) |
755 | - object_name = context.get('object_name', False) |
756 | - if address_id and object_name: |
757 | - obj_zip = self.pool.get('l10n_br_data.zip') |
758 | - zip_read = obj_zip.read( |
759 | - cr, uid, data['zip_ids'], ['street_type', |
760 | - 'street', |
761 | - 'district', |
762 | - 'code', |
763 | - 'l10n_br_city_id', |
764 | - 'city', 'state_id', |
765 | - 'country_id'], context=context)[0] |
766 | - |
767 | - zip = re.sub('[^0-9]', '', zip_read['code'] or '') |
768 | - if len(zip) == 8: |
769 | - zip = '%s-%s' % (zip[0:5], zip[5:8]) |
770 | - |
771 | - result['street'] = ((zip_read['street_type'] or '') + ' ' + (zip_read['street'] or '')) |
772 | - result['district'] = zip_read['district'] |
773 | - result['zip'] = zip |
774 | - result['l10n_br_city_id'] = zip_read['l10n_br_city_id'] and zip_read['l10n_br_city_id'][0] or False |
775 | - result['city'] = zip_read['l10n_br_city_id'] and zip_read['l10n_br_city_id'][1] or '' |
776 | - result['state_id'] = zip_read['state_id'] and zip_read['state_id'][0] or False |
777 | - result['country_id'] = zip_read['country_id'] and zip_read['country_id'][0] or False |
778 | - |
779 | - obj_partner = self.pool.get(object_name) |
780 | - obj_partner.write(cr, uid, address_id, result, context=context) |
781 | - |
782 | - return {'type': 'ir.actions.act_window_close'} |
783 | - |
784 | -l10n_br_data_zip_search() |
785 | + 'zip_ids': [[6, 0, zip_result_ids]]}, context=context) |
786 | + |
787 | + return { |
788 | + 'type': 'ir.actions.act_window', |
789 | + 'res_model': 'l10n_br_data.zip.search', |
790 | + 'view_mode': 'form', |
791 | + 'view_type': 'form', |
792 | + 'res_id': data['id'], |
793 | + 'views': [(False, 'form')], |
794 | + 'target': 'new', |
795 | + 'nodestroy': True, |
796 | + } |
797 | + |
798 | + def zip_new_search(self, cr, uid, ids, context=None): |
799 | + |
800 | + data = self.read(cr, uid, ids, [], context=context)[0] |
801 | + |
802 | + self.write(cr, uid, ids, |
803 | + {'state': 'init', |
804 | + 'zip_ids': [[6, 0, []]]}, context=context) |
805 | + |
806 | + return { |
807 | + 'type': 'ir.actions.act_window', |
808 | + 'res_model': 'l10n_br_data.zip.search', |
809 | + 'view_mode': 'form', |
810 | + 'view_type': 'form', |
811 | + 'res_id': data['id'], |
812 | + 'views': [(False, 'form')], |
813 | + 'target': 'new', |
814 | + 'nodestroy': True |
815 | + } |
816 | + |
817 | + |
818 | + |
819 | + |
820 | +class l10n_br_data_zip_result(osv.TransientModel): |
821 | + |
822 | + _name = 'l10n_br_data.zip.result' |
823 | + |
824 | + _description = 'Zipcode result' |
825 | + |
826 | + _columns = { |
827 | + 'zip_id': fields.many2one('l10n_br_data.zip', 'Zipcode', readonly=True, invisible=True), |
828 | + 'search_id': fields.many2one('l10n_br_data.zip.search', 'Search', readonly=True, invisible=True), |
829 | + 'address_id': fields.integer('Id do objeto', invisible=True), |
830 | + 'object_name': fields.char('Nome do bjeto', size=100, invisible=True), |
831 | + #ZIPCODE data to be shown |
832 | + 'code': fields.char('CEP', size=9, readonly=True), |
833 | + 'street': fields.char('Logradouro', size=72, readonly=True), |
834 | + 'district': fields.char('Bairro', size=72, readonly=True), |
835 | + 'country_id': fields.many2one('res.country', 'Country', readonly=True), |
836 | + 'state_id': fields.many2one('res.country.state', 'Estado', |
837 | + domain="[('country_id','=',country_id)]", readonly=True), |
838 | + 'l10n_br_city_id': fields.many2one( |
839 | + 'l10n_br_base.city', 'Cidade', |
840 | + required=True, domain="[('state_id','=',state_id)]", readonly=True), |
841 | + } |
842 | + |
843 | + |
844 | + def map_to_zip_result(self, cr, uid, ids, context, zip_ids, object_name, address_id): |
845 | + |
846 | + obj_zip = self.pool.get('l10n_br_data.zip') |
847 | + |
848 | + result = [] |
849 | + |
850 | + for zip_id in zip_ids: |
851 | + |
852 | + zip_data = obj_zip.set_result(cr, uid, ids, context, zip_id) |
853 | + |
854 | + zip_result_data = { |
855 | + 'zip_id': False, |
856 | + 'code': False, |
857 | + 'street': False, |
858 | + 'district': False, |
859 | + 'country_id': False, |
860 | + 'state_id': False, |
861 | + 'l10n_br_city_id': False, |
862 | + } |
863 | + |
864 | + zip_result_data['zip_id'] = zip_id |
865 | + zip_result_data['object_name'] = object_name |
866 | + zip_result_data['address_id'] = address_id |
867 | + zip_result_data['code'] = zip_data['zip'] |
868 | + zip_result_data['street'] = zip_data['street'] |
869 | + zip_result_data['district'] = zip_data['district'] |
870 | + zip_result_data['country_id'] = zip_data['country_id'] |
871 | + zip_result_data['state_id'] = zip_data['state_id'] |
872 | + zip_result_data['l10n_br_city_id'] = zip_data['l10n_br_city_id'] |
873 | + |
874 | + |
875 | + zip_result_id = self.create(cr, uid, zip_result_data, context=context) |
876 | + |
877 | + result.append(zip_result_id) |
878 | + |
879 | + return result |
880 | + |
881 | + def zip_select(self, cr, uid, ids, context=None): |
882 | + |
883 | + data = self.read(cr, uid, ids, [], context=context)[0] |
884 | + |
885 | + address_id = data['address_id'] |
886 | + |
887 | + object_name = data['object_name'] |
888 | + |
889 | + if address_id and object_name: |
890 | + |
891 | + obj = self.pool.get(object_name) |
892 | + |
893 | + obj_zip = self.pool.get('l10n_br_data.zip') |
894 | + |
895 | + result = obj_zip.set_result(cr, uid, ids, context, data['zip_id'][0]) |
896 | + |
897 | + obj.write(cr, uid, address_id, result, context=context) |
898 | + |
899 | + return True |
900 | + |
901 | + |
902 | + |
903 | + |
904 | + |
905 | |
906 | === modified file 'l10n_br_data_zip/wizard/l10n_br_data_zip_search_view.xml' |
907 | --- l10n_br_data_zip/wizard/l10n_br_data_zip_search_view.xml 2013-01-03 04:21:33 +0000 |
908 | +++ l10n_br_data_zip/wizard/l10n_br_data_zip_search_view.xml 2013-03-13 12:27:20 +0000 |
909 | @@ -1,7 +1,7 @@ |
910 | <?xml version="1.0" encoding="utf-8"?> |
911 | <openerp> |
912 | <data noupdate="0"> |
913 | - |
914 | + |
915 | <record id="view_l10n_br_data_zip_search" model="ir.ui.view"> |
916 | <field name="name">Pesquisar CEP</field> |
917 | <field name="model">l10n_br_data.zip.search</field> |
918 | @@ -19,20 +19,49 @@ |
919 | </group> |
920 | <group colspan="8" col="8" states="done"> |
921 | <!-- <separator colspan="8" string="Resuldado da Pesquisa"/> --> |
922 | - <field colspan="8" height="130" nolabel="1" name="zip_ids" /> |
923 | + <field colspan="8" height="130" nolabel="1" name="zip_ids" wizard="one2many_list" readonly="1"/> |
924 | </group> |
925 | <footer states="init"> |
926 | <button name="zip_search" string="Pesquisar" type="object" class="oe_highlight"/> |
927 | - or |
928 | <button special="cancel" string="Cancelar" class="oe_link"/> |
929 | </footer> |
930 | <footer states="done"> |
931 | - <button name="zip_search_end" type="object" string="Fechar" class="oe_highlight"/> |
932 | + <!-- <button name="zip_search_end" string="Transferir" type="object" class="oe_highlight"/> --> |
933 | + <button special="cancel" string="Cancelar" class="oe_link"/> |
934 | + <button name="zip_new_search" string="Nova Pesquisa" type="object" class="oe_highlight"/> |
935 | </footer> |
936 | </form> |
937 | </field> |
938 | </record> |
939 | - |
940 | + |
941 | + <record model="ir.ui.view" id="view_l10n_br_data_zip_result_tree"> |
942 | + <field name="name">l10n_br_data.zip.result</field> |
943 | + <field name="model">l10n_br_data.zip.result</field> |
944 | + <field name="arch" type="xml"> |
945 | + <tree string="CEPs"> |
946 | + <button name="zip_select" string="Selecionar" type="object" icon="gtk-apply"/> |
947 | + <field name="code" select="1"/> |
948 | + <field name="district" select="1"/> |
949 | + <field name="street" select="1"/> |
950 | + </tree> |
951 | + </field> |
952 | + </record> |
953 | + |
954 | + <record model="ir.ui.view" id="view_l10n_br_data_zip_result_form"> |
955 | + <field name="name">l10n_br_data.zip.result</field> |
956 | + <field name="model">l10n_br_data.zip.result</field> |
957 | + <field name="arch" type="xml"> |
958 | + <form string="CEPs"> |
959 | + <field name="code" select="1"/> |
960 | + <field name="street" select="1"/> |
961 | + <field name="district" select="2"/> |
962 | + <field name="country_id" select="2"/> |
963 | + <field name="state_id" select="2"/> |
964 | + <field name="l10n_br_city_id" select="2"/> |
965 | + </form> |
966 | + </field> |
967 | + </record> |
968 | + |
969 | <record id="action_l10n_br_data_zip_search" model="ir.actions.act_window"> |
970 | <field name="name">Pesquisar CEP</field> |
971 | <field name="type">ir.actions.act_window</field> |
972 | @@ -41,6 +70,6 @@ |
973 | <field name="view_mode">form</field> |
974 | <field name="target">new</field> |
975 | </record> |
976 | - |
977 | + |
978 | </data> |
979 | </openerp> |
980 | \ No newline at end of file |
Ainda não está 100% quando há um retorno do wizard, mas pode melhorar até o release final.