Merge lp:~dorian-kemps/unifield-server/US-1080 into lp:unifield-server

Proposed by jftempo
Status: Merged
Merged at revision: 5329
Proposed branch: lp:~dorian-kemps/unifield-server/US-1080
Merge into: lp:unifield-server
Diff against target: 2467 lines (+1684/-43) (has conflicts)
15 files modified
bin/addons/msf_doc_import/__openerp__.py (+1/-0)
bin/addons/msf_doc_import/wizard/__init__.py (+5/-0)
bin/addons/msf_doc_import/wizard/wizard_import_product_line.py (+313/-0)
bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml (+38/-0)
bin/addons/msf_profile/i18n/fr_MF.po (+466/-40)
bin/addons/product/__openerp__.py (+3/-1)
bin/addons/product/product.py (+29/-1)
bin/addons/product/report/__init__.py (+1/-0)
bin/addons/product/report/product_mass_update_export.py (+55/-0)
bin/addons/product/report/product_mass_update_export_view.xml (+14/-0)
bin/addons/product/report/product_mass_update_export_xls.mako (+146/-0)
bin/addons/product/wizard/__init__.py (+1/-0)
bin/addons/product/wizard/product_mass_update.py (+467/-0)
bin/addons/product/wizard/product_mass_update_view.xml (+139/-0)
bin/addons/product_attributes/product_attributes_view.xml (+6/-1)
Text conflict in bin/addons/msf_profile/i18n/fr_MF.po
To merge this branch: bzr merge lp:~dorian-kemps/unifield-server/US-1080
Reviewer Review Type Date Requested Status
UniField Reviewer Team Pending
Review via email: mp+360164@code.launchpad.net
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
=== modified file 'bin/addons/msf_doc_import/__openerp__.py'
--- bin/addons/msf_doc_import/__openerp__.py 2018-04-18 13:37:31 +0000
+++ bin/addons/msf_doc_import/__openerp__.py 2019-04-15 13:13:32 +0000
@@ -61,6 +61,7 @@
61 'wizard/wizard_import_threshold_value_line.xml',61 'wizard/wizard_import_threshold_value_line.xml',
62 'wizard/wizard_import_stock_warehouse_order_point_line.xml',62 'wizard/wizard_import_stock_warehouse_order_point_line.xml',
63 'wizard/wizard_import_product_list.xml',63 'wizard/wizard_import_product_list.xml',
64 'wizard/wizard_import_product_line_view.xml',
64 'wizard/wizard_import_supplier_catalogue.xml',65 'wizard/wizard_import_supplier_catalogue.xml',
65 'wizard/wizard_po_simulation_screen_view.xml',66 'wizard/wizard_po_simulation_screen_view.xml',
66 'wizard/wizard_in_simulation_screen_view.xml',67 'wizard/wizard_in_simulation_screen_view.xml',
6768
=== modified file 'bin/addons/msf_doc_import/wizard/__init__.py'
--- bin/addons/msf_doc_import/wizard/__init__.py 2018-07-04 09:34:39 +0000
+++ bin/addons/msf_doc_import/wizard/__init__.py 2019-04-15 13:13:32 +0000
@@ -108,6 +108,10 @@
108 (_('Product Code'), 'string'), (_('Product Description'), 'string'), (_('Comment'), 'string')]108 (_('Product Code'), 'string'), (_('Product Description'), 'string'), (_('Comment'), 'string')]
109PRODUCT_LIST_COLUMNS_FOR_IMPORT = [x for (x,y) in PRODUCT_LIST_COLUMNS_HEADER_FOR_IMPORT]109PRODUCT_LIST_COLUMNS_FOR_IMPORT = [x for (x,y) in PRODUCT_LIST_COLUMNS_HEADER_FOR_IMPORT]
110110
111COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT = [
112 (_('Product Code'), 'string')]
113COLUMNS_FOR_PRODUCT_LINE_IMPORT = [x for (x, y) in COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT]
114
111ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT = [115ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT = [
112 ('Description', 'string'), ('Account', 'string'), ('Quantity', 'number'), ('Unit Price', 'number'), ('Destination', 'string'), ('Cost Center', 'string'), ('Funding Pool', 'string')]116 ('Description', 'string'), ('Account', 'string'), ('Quantity', 'number'), ('Unit Price', 'number'), ('Destination', 'string'), ('Cost Center', 'string'), ('Funding Pool', 'string')]
113ACCOUNT_INVOICE_COLUMNS_FOR_IMPORT = [x for (x,y) in ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT]117ACCOUNT_INVOICE_COLUMNS_FOR_IMPORT = [x for (x,y) in ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT]
@@ -153,6 +157,7 @@
153import wizard_import_threshold_value_line157import wizard_import_threshold_value_line
154import wizard_import_stock_warehouse_order_point_line158import wizard_import_stock_warehouse_order_point_line
155import wizard_import_product_list159import wizard_import_product_list
160import wizard_import_product_line
156import wizard_import_supplier_catalogue161import wizard_import_supplier_catalogue
157import wizard_po_simulation_screen162import wizard_po_simulation_screen
158import wizard_in_simulation_screen163import wizard_in_simulation_screen
159164
=== added file 'bin/addons/msf_doc_import/wizard/wizard_import_product_line.py'
--- bin/addons/msf_doc_import/wizard/wizard_import_product_line.py 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/wizard/wizard_import_product_line.py 2019-04-15 13:13:32 +0000
@@ -0,0 +1,313 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2011 MSF, TeMPO Consulting.
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##############################################################################
21import threading
22import pooler
23from osv import osv, fields
24from tools.translate import _
25import base64
26from spreadsheet_xml.spreadsheet_xml import SpreadsheetXML
27import time
28import tools
29from msf_doc_import import check_line
30from msf_doc_import.wizard import COLUMNS_FOR_PRODUCT_LINE_IMPORT as columns_for_product_line_import
31
32
33class wizard_import_product_line(osv.osv_memory):
34 _name = 'wizard.import.product.line'
35 _description = 'Import Products data from Excel sheet'
36
37 def get_bool_values(self, cr, uid, ids, fields, arg, context=None):
38 res = {}
39 if isinstance(ids, (int, long)):
40 ids = [ids]
41 for obj in self.browse(cr, uid, ids, context=context):
42 res[obj.id] = False
43 if obj.message:
44 res[obj.id] = True
45 return res
46
47 _columns = {
48 'file': fields.binary(string='File to import', required=True, readonly=True, states={'draft': [('readonly', False)]}),
49 'message': fields.text(string='Message', readonly=True),
50 'product_mass_upd_id': fields.many2one('product.mass.update', string='Product Mass Update', required=True),
51 'data': fields.binary('Lines with errors'),
52 'filename': fields.char('Lines with errors', size=256),
53 'filename_template': fields.char('Templates', size=256),
54 'import_error_ok': fields.function(get_bool_values, method=True, readonly=True, type="boolean", string="Error at import", store=False),
55 'percent_completed': fields.integer('% completed', readonly=True),
56 'state': fields.selection([('draft', 'Draft'), ('in_progress', 'In Progress'), ('done', 'Done')],
57 string="State", required=True, readonly=True),
58 }
59
60 def _import(self, dbname, uid, ids, context=None):
61 '''
62 Import file
63 '''
64 cr = pooler.get_db(dbname).cursor()
65
66 if context is None:
67 context = {}
68 wiz_common_import = self.pool.get('wiz.common.import')
69 context.update({'import_in_progress': True, 'noraise': True})
70 start_time = time.time()
71 obj_data = self.pool.get('ir.model.data')
72 product_obj = self.pool.get('product.product')
73 p_mass_upd_obj = self.pool.get('product.mass.update')
74 line_with_error = []
75
76 # Get the expected product creator id
77 instance_level = self.pool.get('res.users').browse(cr, uid, uid).company_id.instance_id.level
78 prod_creator_id = False
79 if instance_level == 'section':
80 prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_3')[1]
81 elif instance_level == 'coordo':
82 prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_4')[1]
83
84 for wiz_browse in self.browse(cr, uid, ids, context):
85 p_mass_upd_id = wiz_browse.product_mass_upd_id.id
86 try:
87 product_ids = [prod.id for prod in wiz_browse.product_mass_upd_id.product_ids]
88
89 ignore_lines, complete_lines, lines_to_correct = 0, 0, 0
90 line_ignored_num = []
91 error_list = []
92 error_log = ''
93 message = ''
94 line_num = 0
95 header_index = context['header_index']
96 mandatory_col_count = 1 # ignore Status column
97
98 file_obj = SpreadsheetXML(xmlstring=base64.decodestring(wiz_browse.file))
99 rows = file_obj.getRows()
100
101 header_row = rows.next()
102 header_error = False
103
104 if len(header_row) != mandatory_col_count and len(header_row) != len(columns_for_product_line_import):
105 header_row = False
106 header_error = True
107 error_list.append(_("\n\tNumber of columns is not equal to %s") % len(columns_for_product_line_import))
108
109 if header_row:
110 for i, h_name in enumerate(columns_for_product_line_import):
111 # To be able to import without Status column
112 if h_name != 'state' or len(header_row) != mandatory_col_count:
113 tr_header_row = _(tools.ustr(header_row[i]))
114 tr_h_name = _(h_name)
115 if len(header_row) > i and tr_header_row != tr_h_name:
116 header_error = True
117 if tr_header_row.upper() == tr_h_name.upper():
118 error_list.append(_("\n\tPlease check spelling on column '%s'.") % tr_header_row)
119
120 if header_error:
121 msg = _("\n\tYou can not import this file because the header of columns doesn't match with the expected headers: %s") % ','.join([_(x) for x in columns_for_product_line_import])
122 error_list.append(msg)
123 msg = _("\n\tPlease ensure that all these columns are present and in this exact order.")
124 error_list.append(msg)
125
126 if not error_list:
127 # iterator on rows
128 rows = file_obj.getRows()
129 rows.next() # skip header
130 # ignore the first row
131
132 line_num = 0
133 total_line_num = file_obj.getNbRows()
134 percent_completed = 0
135 for row in rows:
136 line_num += 1
137 error_list_line = []
138
139 col_count = len(row)
140 template_col_count = len(header_index.items())
141 if col_count != template_col_count and col_count != mandatory_col_count:
142 message += _("""Line %s in the Excel file: You should have exactly %s columns in this order: %s \n""") % (line_num, template_col_count,','.join(columns_for_fo_line_import))
143 line_with_error.append(wiz_common_import.get_line_values(cr, uid, ids, row, cell_nb=False, error_list=error_list, line_num=line_num, context=context))
144 ignore_lines += 1
145 line_ignored_num.append(line_num)
146 percent_completed = float(line_num)/float(total_line_num-1)*100.0
147 self.write(cr, uid, ids, {'percent_completed': percent_completed})
148 continue
149 try:
150 if not check_line.check_empty_line(row=row, col_count=col_count, line_num=line_num):
151 percent_completed = float(line_num)/float(total_line_num-1)*100.0
152 self.write(cr, uid, ids, {'percent_completed': percent_completed})
153 line_num -= 1
154 total_line_num -= 1
155 continue
156
157 # Cell 0: Product
158 if row[0]:
159 prod_ids = product_obj.search(cr, uid, [('default_code', '=ilike', row[0].data),
160 ('active', 'in', ['t', 'f'])], context=context)
161 if prod_ids and prod_ids[0] not in product_ids:
162 prod = product_obj.browse(cr, uid, prod_ids[0], fields_to_fetch=['international_status'], context=context)
163 if prod_creator_id and prod.international_status.id == prod_creator_id:
164 product_ids.append(prod.id)
165 else:
166 if instance_level == 'section':
167 error_list_line.append(_('Product %s doesn\'t have the expected Product Creator "HQ". ')
168 % (row[0].data,))
169 elif instance_level == 'coordo':
170 error_list_line.append(_('Product %s doesn\'t have the expected Product Creator "Local". ')
171 % (row[0].data,))
172 else:
173 error_list_line.append(_('You must be on Coordo or HQ instance to add products to the list. '))
174 elif not prod_ids:
175 error_list_line.append(_('Product code %s doesn\'t exist in the DB. ') % (row[0].data,))
176 else:
177 error_list_line.append(_('Product code is mandatory. '))
178
179 if error_list_line:
180 lines_to_correct += 1
181 line_txt = _('Line %s: ') % (line_num,)
182 error_list.append(line_txt + ' '.join(error_list_line))
183
184 percent_completed = float(line_num)/float(total_line_num-1)*100.0
185 complete_lines += 1
186
187 except IndexError, e:
188 error_log += _("Line %s in the Excel file was added to the file of the lines with errors, it got elements outside the defined %s columns. Details: %s") % (line_num, template_col_count, e)
189 line_with_error.append(wiz_common_import.get_line_values(cr, uid, ids, row, cell_nb=False, error_list=error_list, line_num=line_num, context=context))
190 ignore_lines += 1
191 line_ignored_num.append(line_num)
192 percent_completed = float(line_num)/float(total_line_num-1)*100.0
193 cr.rollback()
194 continue
195 except osv.except_osv as osv_error:
196 osv_value = osv_error.value
197 osv_name = osv_error.name
198 message += _("Line %s in the Excel file: %s: %s\n") % (line_num, osv_name, osv_value)
199 ignore_lines += 1
200 line_with_error.append(wiz_common_import.get_line_values(cr, uid, ids, row, cell_nb=False, error_list=error_list, line_num=line_num, context=context))
201 percent_completed = float(line_num)/float(total_line_num-1)*100.0
202 cr.rollback()
203 continue
204 finally:
205 self.write(cr, uid, ids, {'percent_completed': percent_completed})
206 cr.commit()
207
208 # Update products
209 p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'product_ids': [(6, 0, product_ids)]}, context=context)
210
211 error_log += '\n'.join(error_list)
212 if error_log:
213 error_log = _("Reported errors for ignored lines : \n") + error_log
214 end_time = time.time()
215 total_time = tools.ustr(round(end_time-start_time)) + _(' second(s)')
216 final_message = _('''
217 Importation completed in %s!
218# of imported lines : %s on %s lines
219# of ignored lines: %s
220# of lines to correct: %s
221 %s
222
223 %s
224 ''') % (total_time ,complete_lines, line_num, ignore_lines, lines_to_correct, error_log, message)
225 wizard_vals = {'message': final_message, 'state': 'done'}
226 if line_with_error:
227 file_to_export = wiz_common_import.export_file_with_error(cr, uid, ids, line_with_error=line_with_error, header_index=header_index)
228 wizard_vals.update(file_to_export)
229 self.write(cr, uid, ids, wizard_vals, context=context)
230 # we reset the state of the FO to draft (initial state)
231 except Exception as e:
232 self.write(cr, uid, ids, {
233 'message': _('An unknow error occurred, please contact the support team. Error message: %s') % tools.ustr(e),
234 'state': 'done',
235 }, context=context)
236 finally:
237 p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'state': 'draft', 'import_in_progress': False}, context)
238 cr.commit()
239 cr.close(True)
240
241 def import_file(self, cr, uid, ids, context=None):
242 """
243 Launch a thread for importing lines.
244 """
245 wiz_common_import = self.pool.get('wiz.common.import')
246 p_mass_upd_obj = self.pool.get('product.mass.update')
247 for wiz_read in self.read(cr, uid, ids, ['product_mass_upd_id', 'file']):
248 p_mass_upd_id = wiz_read['product_mass_upd_id']
249 if not wiz_read['file']:
250 return self.write(cr, uid, ids, {'message': _("Nothing to import")})
251 try:
252 fileobj = SpreadsheetXML(xmlstring=base64.decodestring(wiz_read['file']))
253 # iterator on rows
254 reader = fileobj.getRows()
255 reader_iterator = iter(reader)
256 # get first line
257 first_row = next(reader_iterator)
258 header_index = wiz_common_import.get_header_index(cr, uid, ids, first_row, error_list=[], line_num=0, context=context)
259 context.update({'p_mass_upd_id': p_mass_upd_id, 'header_index': header_index})
260 res, res1 = wiz_common_import.check_header_values(cr, uid, ids, context, header_index, columns_for_product_line_import, origin='')
261 if not res:
262 return self.write(cr, uid, ids, res1, context)
263 except osv.except_osv as osv_error:
264 osv_value = osv_error.value
265 osv_name = osv_error.name
266 message = "%s: %s\n" % (osv_name, osv_value)
267 return self.write(cr, uid, ids, {'message': message})
268 except StopIteration:
269 return self.write(cr, uid, ids, {'message': _('The file has no row, nothing to import')})
270 p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'state': 'done', 'import_in_progress': True}, context)
271 thread = threading.Thread(target=self._import, args=(cr.dbname, uid, ids, context))
272 thread.start()
273 msg_to_return = _("""Import in progress, please leave this window open and press the button 'Update' when you think that the import is done.
274Otherwise, you can continue to use Unifield.""")
275 return self.write(cr, uid, ids, {'message': msg_to_return, 'state': 'in_progress'}, context=context)
276
277 def dummy(self, cr, uid, ids, context=None):
278 """
279 This button is only for updating the view.
280 """
281 if isinstance(ids, (int, long)):
282 ids = [ids]
283 for wiz_read in self.read(cr, uid, ids, ['fo_id', 'state', 'file']):
284 if wiz_read['state'] != 'done':
285 self.write(cr, uid, ids, {'message': _(' Import in progress... \n Please wait that the import is finished before editing.')})
286 return False
287
288 def cancel(self, cr, uid, ids, context=None):
289 '''
290 Return to the initial view. I don't use the special cancel because when I open the wizard with target: crush, and I click on cancel (the special),
291 I come back on the home page. Here, I come back on the object on which I opened the wizard.
292 '''
293 if isinstance(ids, (int, long)):
294 ids=[ids]
295 for wiz_obj in self.read(cr, uid, ids, ['product_mass_upd_id']):
296 p_mass_upd_id = wiz_obj['product_mass_upd_id']
297 return {'type': 'ir.actions.act_window',
298 'res_model': 'product.mass.update',
299 'view_type': 'form',
300 'view_mode': 'form, tree',
301 'target': 'crush',
302 'res_id': p_mass_upd_id,
303 'context': context,
304 }
305
306 def close_import(self, cr, uid, ids, context=None):
307 '''
308 Return to the initial view
309 '''
310 return self.cancel(cr, uid, ids, context=context)
311
312
313wizard_import_product_line()
0314
=== added file 'bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml'
--- bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml 1970-01-01 00:00:00 +0000
+++ bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml 2019-04-15 13:13:32 +0000
@@ -0,0 +1,38 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<openerp>
3 <data>
4
5 <record id="wizard_to_import_product_line" model="ir.ui.view">
6 <field name="name">wizard.to.import.product.line</field>
7 <field name="model">wizard.import.product.line</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Import of lines">
11 <separator colspan="4" string="File to import" />
12 <field name="file" filename="filename_template" />
13 <field name="percent_completed" widget="progressbar" attrs="{'invisible':[('state', '=', 'draft')]}"/>
14 <field name="filename_template" invisible="1" />
15 <field name="filename" invisible="1" />
16 <field name="data" filename="filename" readonly="1"
17 attrs="{'invisible':[('import_error_ok', '!=', False), ('state', '!=', 'done')]}"/>
18
19 <separator colspan="12" string="Information" />
20 <field name="message" colspan="4" nolabel="1" />
21 <group name="buttons" string="" colspan="24" col="6">
22 <button name="cancel" string="Cancel" icon="gtk-cancel" type="object"
23 attrs="{'invisible':[('state', '!=', 'draft')]}"/>
24 <button name="import_file" string="Import file" icon="gtk-go-forward" type="object"
25 attrs="{'invisible':[('state', '!=', 'draft')]}"/>
26 <button name="dummy" string="Update" icon="gtk-execute" type="object"
27 attrs="{'invisible':[('state', '!=', 'in_progress')]}"/>
28 <button name="close_import" string="Close window" icon="gtk-cancel" type="object"
29 attrs="{'invisible':[('state', '!=', 'done')]}"/>
30 </group>
31 <newline/>
32 <field name="state" colspan="1"/>
33 </form>
34 </field>
35 </record>
36
37 </data>
38</openerp>
0\ No newline at end of file39\ No newline at end of file
140
=== modified file 'bin/addons/msf_profile/i18n/fr_MF.po'
--- bin/addons/msf_profile/i18n/fr_MF.po 2019-04-08 09:30:07 +0000
+++ bin/addons/msf_profile/i18n/fr_MF.po 2019-04-15 13:13:32 +0000
@@ -1200,6 +1200,7 @@
1200#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:3681200#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:368
1201#: code:addons/msf_doc_import/wizard/wizard_import_ir_line.py:3241201#: code:addons/msf_doc_import/wizard/wizard_import_ir_line.py:324
1202#: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:2751202#: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:275
1203#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:280
1203#, python-format1204#, python-format
1204msgid "Import in progress, please leave this window open and press the button 'Update' when you think that the import is done.\n"1205msgid "Import in progress, please leave this window open and press the button 'Update' when you think that the import is done.\n"
1205"Otherwise, you can continue to use Unifield."1206"Otherwise, you can continue to use Unifield."
@@ -1701,10 +1702,11 @@
1701msgid "Backup Size"1702msgid "Backup Size"
1702msgstr "Taille Sauvegarde"1703msgstr "Taille Sauvegarde"
17031704
1704#. module: product_attributes1705#. module: product_attributes, product
1705#: selection:product.product,state_ud:01706#: selection:product.product,state_ud:0
1707#: selection:product.mass.update,product_state:0
1706msgid "Stopped"1708msgid "Stopped"
1707msgstr "Arrêter"1709msgstr "Arrêté"
17081710
1709#. module: register_accounting1711#. module: register_accounting
1710#: report:addons/register_accounting/report/liquidity_position_xls.mako:2681712#: report:addons/register_accounting/report/liquidity_position_xls.mako:268
@@ -3826,6 +3828,7 @@
3826#: code:addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.py:2373828#: code:addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.py:237
3827#: code:addons/msf_doc_import/wizard/wizard_import_supplier_catalogue.py:3823829#: code:addons/msf_doc_import/wizard/wizard_import_supplier_catalogue.py:382
3828#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:2003830#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:200
3831#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:190
3829#, python-format3832#, python-format
3830msgid "Line %s in the Excel file was added to the file of the lines with errors, it got elements outside the defined %s columns. Details: %s"3833msgid "Line %s in the Excel file was added to the file of the lines with errors, it got elements outside the defined %s columns. Details: %s"
3831msgstr "La ligne %s du fichier Excel a été ajoutée au fichier des lignes en erreur, elle a des éléments en dehors des colonnes définies %s. Détails: %s"3834msgstr "La ligne %s du fichier Excel a été ajoutée au fichier des lignes en erreur, elle a des éléments en dehors des colonnes définies %s. Détails: %s"
@@ -8636,7 +8639,7 @@
8636msgid "Either there are no moves linked to the picking or Accounting Journals are misconfigured!"8639msgid "Either there are no moves linked to the picking or Accounting Journals are misconfigured!"
8637msgstr "Soit les Journaux Comptables sont mal configurés, soit il n'y a pas de mouvement connexe à ce prélèvement !"8640msgstr "Soit les Journaux Comptables sont mal configurés, soit il n'y a pas de mouvement connexe à ce prélèvement !"
86388641
8639#. modules: tender_flow, financing_contract, msf_tools, account_voucher, account_override, purchase_allocation_report, register_accounting, mission_stock, msf_accrual, finance, sync_client, return_claim, account_mcdb, res_currency_tables, supplier_catalogue, procurement_request, stock_forecast, analytic, stock_override, msf_doc_import, analytic_distribution, msf_order_date, account_payment, msf_homere_interface, consumption_calculation, msf_instance, purchase_override, specific_rules, kit, out_step, base, msf_supply_doc_export, msf_budget, account_corrections, account, msf_outgoing, documents_done, sale, sales_followup, procurement, sourcing, purchase, msf_audittrail, stock8642#. modules: tender_flow, financing_contract, msf_tools, account_voucher, account_override, purchase_allocation_report, register_accounting, mission_stock, msf_accrual, finance, sync_client, return_claim, account_mcdb, res_currency_tables, supplier_catalogue, procurement_request, stock_forecast, analytic, stock_override, msf_doc_import, analytic_distribution, msf_order_date, account_payment, msf_homere_interface, consumption_calculation, msf_instance, purchase_override, specific_rules, kit, out_step, base, msf_supply_doc_export, msf_budget, account_corrections, account, msf_outgoing, documents_done, sale, sales_followup, procurement, sourcing, purchase, msf_audittrail, stock, product
8640#: selection:msf.instance.cloud,state:08643#: selection:msf.instance.cloud,state:0
8641#: field:ppl.processor,draft_step1:08644#: field:ppl.processor,draft_step1:0
8642#: field:ppl.processor,draft_step2:08645#: field:ppl.processor,draft_step2:0
@@ -8804,7 +8807,12 @@
8804#: field:internal.picking.processor,draft:08807#: field:internal.picking.processor,draft:0
8805#: field:outgoing.delivery.processor,draft:08808#: field:outgoing.delivery.processor,draft:0
8806#: selection:internal.request.import,state:08809#: selection:internal.request.import,state:0
8810<<<<<<< TREE
8807#: selection:wizard.import.ppl.to.create.ship,state:08811#: selection:wizard.import.ppl.to.create.ship,state:0
8812=======
8813#: selection:wizard.import.product.line,state:0
8814#: selection:product.mass.update,state:0
8815>>>>>>> MERGE-SOURCE
8808#, python-format8816#, python-format
8809msgid "Draft"8817msgid "Draft"
8810msgstr "Brouillon"8818msgstr "Brouillon"
@@ -12401,6 +12409,7 @@
12401#. modules: stock_forecast, product12409#. modules: stock_forecast, product
12402#: selection:product.template,procure_method:012410#: selection:product.template,procure_method:0
12403#: selection:stock.forecast,procurement_method:012411#: selection:stock.forecast,procurement_method:0
12412#: selection:product.mass.update,procure_method:0
12404msgid "Make to Stock"12413msgid "Make to Stock"
12405msgstr "Production sur Stock"12414msgstr "Production sur Stock"
1240612415
@@ -15765,8 +15774,9 @@
15765msgid "total m³"15774msgid "total m³"
15766msgstr "total m³"15775msgstr "total m³"
1576715776
15768#. module: product_expiry15777#. module: product_expiry, product
15769#: field:product.product,use_time:015778#: field:product.product,use_time:0
15779#: field:product.mass.update,use_time:0
15770msgid "Product Use Time"15780msgid "Product Use Time"
15771msgstr "Produit - Durée d'utilisation "15781msgstr "Produit - Durée d'utilisation "
1577215782
@@ -16856,7 +16866,7 @@
16856msgid "%s update%s"16866msgid "%s update%s"
16857msgstr "%s update%s"16867msgstr "%s update%s"
1685816868
16859#. modules: msf_budget, sales_followup, account, product_attributes, register_accounting, unifield_setup, object_query, order_types, mission_stock, msf_accrual, procurement_report, msf_partner, res_currency_tables, salr, sourcing, tender_flow, msf_doc_import, finance16869#. modules: msf_budget, sales_followup, account, product_attributes, register_accounting, unifield_setup, object_query, order_types, mission_stock, msf_accrual, procurement_report, msf_partner, res_currency_tables, salr, sourcing, tender_flow, msf_doc_import, finance, product
16860#: view:account.state.open:016870#: view:account.state.open:0
16861#: selection:mission.stock.wizard,split_stock:016871#: selection:mission.stock.wizard,split_stock:0
16862#: selection:mission.stock.wizard,with_valuation:016872#: selection:mission.stock.wizard,with_valuation:0
@@ -16903,6 +16913,13 @@
16903#: selection:po.automation.config,name:016913#: selection:po.automation.config,name:0
16904#: view:tender.cancel.wizard:016914#: view:tender.cancel.wizard:0
16905#: view:tender.line.cancel.wizard:016915#: view:tender.line.cancel.wizard:0
16916#: selection:product.mass.update,active_product:0
16917#: selection:product.mass.update,dangerous_goods:0
16918#: selection:product.mass.update,heat_sensitive_item:0
16919#: selection:product.mass.update,short_shelf_life:0
16920#: selection:product.mass.update,single_use:0
16921#: selection:product.mass.update,sterilized:0
16922#: report:addons/product/report/product_mass_update_export_xls.mako:136
16906#, python-format16923#, python-format
16907msgid "No"16924msgid "No"
16908msgstr "Non"16925msgstr "Non"
@@ -17320,8 +17337,9 @@
17320msgid "Error! The nomenclature complete name must be unique."17337msgid "Error! The nomenclature complete name must be unique."
17321msgstr "Error! The nomenclature complete name must be unique."17338msgstr "Error! The nomenclature complete name must be unique."
1732217339
17323#. module: service_purchasing17340#. module: service_purchasing, product
17324#: code:addons/service_purchasing/service_purchasing.py:7017341#: code:addons/service_purchasing/service_purchasing.py:70
17342#: code:addons/product/wizard/product_mass_update.py:328
17325#, python-format17343#, python-format
17326msgid "You must select on order procurement method for %s products."17344msgid "You must select on order procurement method for %s products."
17327msgstr "Vous devez sélectionner 'Sur commande' comme méthode d'acquisition pour les produits %s."17345msgstr "Vous devez sélectionner 'Sur commande' comme méthode d'acquisition pour les produits %s."
@@ -17708,6 +17726,7 @@
1770817726
17709#. module: product17727#. module: product
17710#: help:product.template,state:017728#: help:product.template,state:0
17729#: help:product.mass.update,product_state:0
17711msgid "Tells the user if he can use the product or not."17730msgid "Tells the user if he can use the product or not."
17712msgstr "Indique à l'utilisateur s'il peut ou ne peut pas utiliser le produit."17731msgstr "Indique à l'utilisateur s'il peut ou ne peut pas utiliser le produit."
1771317732
@@ -18038,8 +18057,9 @@
18038msgid "The record exists in database?"18057msgid "The record exists in database?"
18039msgstr "The record exists in database?"18058msgstr "The record exists in database?"
1804018059
18041#. module: product_attributes18060#. module: product_attributes, product
18042#: field:product.product,single_use:018061#: field:product.product,single_use:0
18062#: field:product.mass.update,single_use:0
18043msgid "Single Use"18063msgid "Single Use"
18044msgstr "Utilisation unique"18064msgstr "Utilisation unique"
1804518065
@@ -22386,8 +22406,9 @@
22386msgid "Wizard Name"22406msgid "Wizard Name"
22387msgstr "Nom de l'Assistant"22407msgstr "Nom de l'Assistant"
2238822408
22389#. module: procurement22409#. module: procurement, product
22390#: help:procurement.order,procure_method:022410#: help:procurement.order,procure_method:0
22411#: help:product.mass.update,procure_method:0
22391msgid "If you encode manually a Procurement, you probably want to use a make to order method."22412msgid "If you encode manually a Procurement, you probably want to use a make to order method."
22392msgstr "Si vous saisissez manuellement un Approvisionnement, vous voulez probablement utiliser une méthode Production sur Commande"22413msgstr "Si vous saisissez manuellement un Approvisionnement, vous voulez probablement utiliser une méthode Production sur Commande"
2239322414
@@ -22855,7 +22876,11 @@
22855#: view:wizard.import.threshold.value.line:022876#: view:wizard.import.threshold.value.line:0
22856#: view:automated.import.job:022877#: view:automated.import.job:0
22857#: view:procurement.request.import:022878#: view:procurement.request.import:0
22879<<<<<<< TREE
22858#: view:wizard.import.ppl.to.create.ship:022880#: view:wizard.import.ppl.to.create.ship:0
22881=======
22882#: view:wizard.import.product.line:0
22883>>>>>>> MERGE-SOURCE
22859msgid "Import file"22884msgid "Import file"
22860msgstr "Importer le fichier"22885msgstr "Importer le fichier"
2286122886
@@ -25231,7 +25256,7 @@
25231msgid "Europe/Bucharest"25256msgid "Europe/Bucharest"
25232msgstr "Europe/Bucharest"25257msgstr "Europe/Bucharest"
2523325258
25234#. modules: msf_budget, account, account_payment, product_attributes, register_accounting, unifield_setup, object_query, order_types, mission_stock, msf_accrual, procurement_report, stock, msf_partner, salr, sourcing, tender_flow, msf_doc_import, finance25259#. modules: msf_budget, account, account_payment, product_attributes, register_accounting, unifield_setup, object_query, order_types, mission_stock, msf_accrual, procurement_report, stock, msf_partner, salr, sourcing, tender_flow, msf_doc_import, finance, product
25235#: view:account.state.open:025260#: view:account.state.open:0
25236#: view:account.payment.make.payment:025261#: view:account.payment.make.payment:0
25237#: selection:mission.stock.wizard,split_stock:025262#: selection:mission.stock.wizard,split_stock:0
@@ -25271,6 +25296,13 @@
25271#: selection:po.automation.config,name:025296#: selection:po.automation.config,name:0
25272#: view:tender.cancel.wizard:025297#: view:tender.cancel.wizard:0
25273#: view:tender.line.cancel.wizard:025298#: view:tender.line.cancel.wizard:0
25299#: selection:product.mass.update,active_product:0
25300#: selection:product.mass.update,dangerous_goods:0
25301#: selection:product.mass.update,heat_sensitive_item:0
25302#: selection:product.mass.update,short_shelf_life:0
25303#: selection:product.mass.update,single_use:0
25304#: selection:product.mass.update,sterilized:0
25305#: report:addons/product/report/product_mass_update_export_xls.mako:136
25274#, python-format25306#, python-format
25275msgid "Yes"25307msgid "Yes"
25276msgstr "Oui"25308msgstr "Oui"
@@ -25313,8 +25345,9 @@
25313msgid "Adds commitment, requested and effective dates on Sales Orders."25345msgid "Adds commitment, requested and effective dates on Sales Orders."
25314msgstr "Ajoute les dates d'engagement, désirées et effectives sur les commandes terrains."25346msgstr "Ajoute les dates d'engagement, désirées et effectives sur les commandes terrains."
2531525347
25316#. module: product_list25348#. module: product_list, product
25317#: view:product.to.list:025349#: view:product.to.list:0
25350#: view:product.mass.update:0
25318msgid "Import products"25351msgid "Import products"
25319msgstr "Importer les produits"25352msgstr "Importer les produits"
2532025353
@@ -27660,7 +27693,7 @@
27660msgid "Asia/Omsk"27693msgid "Asia/Omsk"
27661msgstr "Asia/Omsk"27694msgstr "Asia/Omsk"
2766227695
27663#. module: msf_doc_import27696#. module: msf_doc_import, product
27664#: field:stock.partial.picking,percent_completed:027697#: field:stock.partial.picking,percent_completed:0
27665#: field:wizard.import.auto.supply.line,percent_completed:027698#: field:wizard.import.auto.supply.line,percent_completed:0
27666#: field:wizard.import.fo.line,percent_completed:027699#: field:wizard.import.fo.line,percent_completed:0
@@ -27675,6 +27708,9 @@
27675#: field:wizard.import.supplier.catalogue,percent_completed:027708#: field:wizard.import.supplier.catalogue,percent_completed:0
27676#: field:wizard.import.tender.line,percent_completed:027709#: field:wizard.import.tender.line,percent_completed:0
27677#: field:wizard.import.threshold.value.line,percent_completed:027710#: field:wizard.import.threshold.value.line,percent_completed:0
27711#: field:wizard.import.product.line,percent_completed:0
27712#: field:product.mass.update,percent_completed:0
27713#: field:product.mass.update.progressbar,percent_completed:0
27678msgid "% completed"27714msgid "% completed"
27679msgstr "% terminé"27715msgstr "% terminé"
2768027716
@@ -31708,6 +31744,8 @@
31708#: field:wizard.import.threshold.value.line,data:031744#: field:wizard.import.threshold.value.line,data:0
31709#: field:wizard.import.threshold.value.line,filename:031745#: field:wizard.import.threshold.value.line,filename:0
31710#: field:internal.request.import,error_filename:031746#: field:internal.request.import,error_filename:0
31747#: field:wizard.import.product.line,data:0
31748#: field:wizard.import.product.line,filename:0
31711msgid "Lines with errors"31749msgid "Lines with errors"
31712msgstr "Lignes avec des erreurs"31750msgstr "Lignes avec des erreurs"
3171331751
@@ -32129,8 +32167,9 @@
32129msgid "RFQ - closed"32167msgid "RFQ - closed"
32130msgstr "Demande de Devis- fermé"32168msgstr "Demande de Devis- fermé"
3213132169
32132#. module: product_expiry32170#. module: product_expiry, product
32133#: help:product.product,use_time:032171#: help:product.product,use_time:0
32172#: help:product.mass.update,use_time:0
32134msgid "The number of months before a production lot starts deteriorating without becoming dangerous."32173msgid "The number of months before a production lot starts deteriorating without becoming dangerous."
32135msgstr "Nombre de mois avant qu'un lot de production ne commence à se détériorer, sans être dangereux"32174msgstr "Nombre de mois avant qu'un lot de production ne commence à se détériorer, sans être dangereux"
3213632175
@@ -33391,10 +33430,11 @@
33391msgid "Asia/Dushanbe"33430msgid "Asia/Dushanbe"
33392msgstr "Asia/Dushanbe"33431msgstr "Asia/Dushanbe"
3339333432
33394#. module: product_attributes33433#. module: product_attributes, product
33395#: selection:product.product,state_ud:033434#: selection:product.product,state_ud:0
33435#: selection:product.mass.update,product_state:0
33396msgid "Phase Out"33436msgid "Phase Out"
33397msgstr "Phase Out"33437msgstr "Élimination"
3339833438
33399#. module: sync_so33439#. module: sync_so
33400#: field:purchase.order,push_fo:033440#: field:purchase.order,push_fo:0
@@ -34481,8 +34521,9 @@
34481msgid "From comparison to closed."34521msgid "From comparison to closed."
34482msgstr "De comparaison à fermé."34522msgstr "De comparaison à fermé."
3448334523
34484#. module: product_expiry34524#. module: product_expiry, product
34485#: help:product.product,alert_time:034525#: help:product.product,alert_time:0
34526#: help:product.mass.update,alert_time:0
34486msgid "The number of months after which an alert should be notified about the production lot."34527msgid "The number of months after which an alert should be notified about the production lot."
34487msgstr "Nombre de mois après lequel une alerte devrait être affichée en ce qui concerne le lot de production."34528msgstr "Nombre de mois après lequel une alerte devrait être affichée en ce qui concerne le lot de production."
3448834529
@@ -34823,7 +34864,7 @@
34823msgid "IR/FO Order"34864msgid "IR/FO Order"
34824msgstr "IR/FO Order"34865msgstr "IR/FO Order"
3482534866
34826#. modules: purchase, account, analytic_distribution_supply, msf_homere_interface, res_currency_tables, register_accounting, account_hq_entries, account_corrections, product_attributes, base, account_subscription, analytic_distribution, purchase_override34867#. modules: purchase, account, analytic_distribution_supply, msf_homere_interface, res_currency_tables, register_accounting, account_hq_entries, account_corrections, product_attributes, base, account_subscription, analytic_distribution, purchase_override, product
34827#: selection:account.entries.report,move_line_state:034868#: selection:account.entries.report,move_line_state:0
34828#: selection:account.move.line,state:034869#: selection:account.move.line,state:0
34829#: selection:wizard.journal.items.corrections.lines,analytic_distribution_state:034870#: selection:wizard.journal.items.corrections.lines,analytic_distribution_state:0
@@ -34846,6 +34887,7 @@
34846#: selection:wizard.advance.line,analytic_distribution_state:034887#: selection:wizard.advance.line,analytic_distribution_state:0
34847#: selection:res.currency.table,state:034888#: selection:res.currency.table,state:0
34848#: selection:purchase.order.merged.line,analytic_distribution_state:034889#: selection:purchase.order.merged.line,analytic_distribution_state:0
34890#: selection:product.mass.update,product_state:0
34849msgid "Valid"34891msgid "Valid"
34850msgstr "Valide"34892msgstr "Valide"
3485134893
@@ -36109,7 +36151,11 @@
36109msgid "cancel_voucher - (account.voucher)"36151msgid "cancel_voucher - (account.voucher)"
36110msgstr "cancel_voucher - (account.voucher)"36152msgstr "cancel_voucher - (account.voucher)"
3611136153
36154<<<<<<< TREE
36112#. modules: sales_followup, msf_homere_interface, msf_field_access_rights, consumption_calculation, sale, update_client, product_attributes, purchase_followup, sf_doc_import, register_accounting, finance, msf_supply_doc_export, product_nomenclature, account_mcdb36155#. modules: sales_followup, msf_homere_interface, msf_field_access_rights, consumption_calculation, sale, update_client, product_attributes, purchase_followup, sf_doc_import, register_accounting, finance, msf_supply_doc_export, product_nomenclature, account_mcdb
36156=======
36157#. modules: sales_followup, msf_homere_interface, msf_field_access_rights, consumption_calculation, sale, update_client, product_attributes, purchase_followup, msf_doc_import, register_accounting, finance, msf_supply_doc_export, product
36158>>>>>>> MERGE-SOURCE
36113#: field:cash.request.liquidity,status:036159#: field:cash.request.liquidity,status:0
36114#: field:cash.request.liquidity.bank,status:036160#: field:cash.request.liquidity.bank,status:0
36115#: field:cash.request.liquidity.cash,status:036161#: field:cash.request.liquidity.cash,status:0
@@ -36140,9 +36186,14 @@
36140#: report:addons/sales_followup/report/ir_track_changes_report_xls.mako:22436186#: report:addons/sales_followup/report/ir_track_changes_report_xls.mako:224
36141#: report:addons/register_accounting/report/fully_report_xls.mako:59036187#: report:addons/register_accounting/report/fully_report_xls.mako:590
36142#: report:addons/msf_supply_doc_export/report/report_internal_request_xls.mako:6536188#: report:addons/msf_supply_doc_export/report/report_internal_request_xls.mako:65
36189<<<<<<< TREE
36143#: field:product.nomenclature,status:036190#: field:product.nomenclature,status:0
36144#: report:addons/account_mcdb/report/combined_journals_report.mako:27336191#: report:addons/account_mcdb/report/combined_journals_report.mako:273
36145#: report:combined.journals.report.pdf:036192#: report:combined.journals.report.pdf:0
36193=======
36194#: field:product.mass.update,product_state:0
36195#: field:product.mass.update,state:0
36196>>>>>>> MERGE-SOURCE
36146#, python-format36197#, python-format
36147msgid "Status"36198msgid "Status"
36148msgstr "Statut"36199msgstr "Statut"
@@ -42634,7 +42685,7 @@
42634msgid "Contract code/name:"42685msgid "Contract code/name:"
42635msgstr "Contrat - Code/Nom:"42686msgstr "Contrat - Code/Nom:"
4263642687
42637#. modules: sales_followup, register_accounting, import_data, sync_client, base, purchase_followup, msf_doc_import, stock42688#. modules: sales_followup, register_accounting, import_data, sync_client, base, purchase_followup, msf_doc_import, stock, product
42638#: view:base.module.update:042689#: view:base.module.update:0
42639#: view:base.update.translations:042690#: view:base.update.translations:0
42640#: selection:import_data,import_mode:042691#: selection:import_data,import_mode:0
@@ -42661,7 +42712,12 @@
42661#: view:product.product:042712#: view:product.product:0
42662#: model:ir.ui.menu,name:sync_client.update_menu42713#: model:ir.ui.menu,name:sync_client.update_menu
42663#: view:sync.client.update_entity:042714#: view:sync.client.update_entity:0
42715<<<<<<< TREE
42664#: view:stock.expired.damaged.report:042716#: view:stock.expired.damaged.report:0
42717=======
42718#: view:wizard.import.product.line:0
42719#: view:product.mass.update:0
42720>>>>>>> MERGE-SOURCE
42665msgid "Update"42721msgid "Update"
42666msgstr "Mettre à jour"42722msgstr "Mettre à jour"
4266742723
@@ -44041,7 +44097,11 @@
44041msgid "Contains Dangerous goods"44097msgid "Contains Dangerous goods"
44042msgstr "Contient des Produits Dangereux"44098msgstr "Contient des Produits Dangereux"
4404344099
44100<<<<<<< TREE
44044#. modules: sales_followup, register_accounting, stock_override, order_nomenclature, consumption_calculation, product_asset, specific_rules, account_override, supplier_catalogue, product_list, tender_flow, msf_supply_doc_export, msf_doc_import, stock_forecast, purchase_allocation_report, procurement_request, kit, purchase_compare_rfq, stock44101#. modules: sales_followup, register_accounting, stock_override, order_nomenclature, consumption_calculation, product_asset, specific_rules, account_override, supplier_catalogue, product_list, tender_flow, msf_supply_doc_export, msf_doc_import, stock_forecast, purchase_allocation_report, procurement_request, kit, purchase_compare_rfq, stock
44102=======
44103#. modules: sales_followup, register_accounting, stock_override, order_nomenclature, consumption_calculation, product_asset, specific_rules, account_override, supplier_catalogue, product_list, tender_flow, msf_supply_doc_export, msf_doc_import, stock_forecast, purchase_allocation_report, procurement_request, kit, purchase_compare_rfq, product
44104>>>>>>> MERGE-SOURCE
44045#: field:account.invoice.line,product_code:044105#: field:account.invoice.line,product_code:0
44046#: code:addons/consumption_calculation/consumption_calculation.py:48244106#: code:addons/consumption_calculation/consumption_calculation.py:482
44047#: report:addons/consumption_calculation/report/report_real_consumption_xls.mako:6944107#: report:addons/consumption_calculation/report/report_real_consumption_xls.mako:69
@@ -44106,9 +44166,13 @@
44106#: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:13044166#: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:130
44107#: code:addons/sale/wizard/internal_request_import.py:4344167#: code:addons/sale/wizard/internal_request_import.py:43
44108#: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:21444168#: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:214
44169<<<<<<< TREE
44109#: report:addons/specific_rules/report/report_stock_inventory_xls.mako:22344170#: report:addons/specific_rules/report/report_stock_inventory_xls.mako:223
44110#: report:addons/stock/report/stock_reception_report_xls.mako:23744171#: report:addons/stock/report/stock_reception_report_xls.mako:237
44111#: report:addons/stock/report/stock_expired_damaged_report_xls.mako:21844172#: report:addons/stock/report/stock_expired_damaged_report_xls.mako:218
44173=======
44174#: report:addons/product/report/product_mass_update_export_xls.mako:113
44175>>>>>>> MERGE-SOURCE
44112#, python-format44176#, python-format
44113msgid "Product Code"44177msgid "Product Code"
44114msgstr "Code Produit"44178msgstr "Code Produit"
@@ -44253,8 +44317,9 @@
44253msgid "Portrait"44317msgid "Portrait"
44254msgstr "Portrait"44318msgstr "Portrait"
4425544319
44256#. module: consumption_calculation44320#. module: consumption_calculation, product
44257#: help:product.product,procure_delay:044321#: help:product.product,procure_delay:0
44322#: help:product.mass.update,procure_delay:0
44258msgid "It's the default time to procure this product. This lead time will be used on the Order cycle procurement computation"44323msgid "It's the default time to procure this product. This lead time will be used on the Order cycle procurement computation"
44259msgstr "C'est le temps nécessaire par défaut pour se procurer ce produit. Ce délai de livraison sera utilisé lors du calcul du cycle de commandes d'approvisionnement."44324msgstr "C'est le temps nécessaire par défaut pour se procurer ce produit. Ce délai de livraison sera utilisé lors du calcul du cycle de commandes d'approvisionnement."
4426044325
@@ -44718,11 +44783,12 @@
4471844783
44719#. module: msf_doc_import44784#. module: msf_doc_import
44720#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:13144785#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:131
44786#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:121
44721#, python-format44787#, python-format
44722msgid "\n"44788msgid "\n"
44723" Please check spelling on column '%s'."44789" Please check spelling on column '%s'."
44724msgstr "\n"44790msgstr "\n"
44725" Please check spelling on column '%s'."44791" Veuillez vérifier l'orthographe sur la colonne '%s'."
4472644792
44727#. module: sync_client44793#. module: sync_client
44728#: view:sync.monitor:044794#: view:sync.monitor:0
@@ -45688,6 +45754,7 @@
45688#: field:stock.location,stock_virtual_specific:045754#: field:stock.location,stock_virtual_specific:0
45689#: field:stock.location,stock_virtual:045755#: field:stock.location,stock_virtual:0
45690#: selection:product.price.type,field:045756#: selection:product.price.type,field:0
45757#: report:addons/product/report/product_mass_update_export_xls.mako:116
45691msgid "Virtual Stock"45758msgid "Virtual Stock"
45692msgstr "Stock Virtuel"45759msgstr "Stock Virtuel"
4569345760
@@ -46516,6 +46583,7 @@
4651646583
46517#. module: msf_doc_import46584#. module: msf_doc_import
46518#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:13446585#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:134
46586#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:124
46519#, python-format46587#, python-format
46520msgid "\n"46588msgid "\n"
46521" You can not import this file because the header of columns doesn't match with the expected headers: %s"46589" You can not import this file because the header of columns doesn't match with the expected headers: %s"
@@ -47552,8 +47620,9 @@
47552msgid "RfQ Line Ref"47620msgid "RfQ Line Ref"
47553msgstr "Réf. Ligne Demande de Devis"47621msgstr "Réf. Ligne Demande de Devis"
4755447622
47555#. module: product_expiry47623#. module: product_expiry, product
47556#: field:product.product,alert_time:047624#: field:product.product,alert_time:0
47625#: field:product.mass.update,alert_time:0
47557msgid "Product Alert Time"47626msgid "Product Alert Time"
47558msgstr "Produit - Période d'Alerte"47627msgstr "Produit - Période d'Alerte"
4755947628
@@ -48746,7 +48815,7 @@
48746#: code:addons/msf_doc_import/wizard/wiz_common_import.py:10848815#: code:addons/msf_doc_import/wizard/wiz_common_import.py:108
48747#, python-format48816#, python-format
48748msgid "The column \"%s\" is not taken into account. Please correct it. The list of columns accepted is: %s"48817msgid "The column \"%s\" is not taken into account. Please correct it. The list of columns accepted is: %s"
48749msgstr "La colone \"%s\" n'est pas prise en compte. Merci de corriger. La liste des colonnes acceptée est : %s"48818msgstr "La colonne \"%s\" n'est pas prise en compte. Merci de corriger. La liste des colonnes acceptée est : %s"
4875048819
48751#. module: msf_outgoing48820#. module: msf_outgoing
48752#: report:picking.ticket:048821#: report:picking.ticket:0
@@ -51280,7 +51349,7 @@
51280msgid "Indian/Mayotte"51349msgid "Indian/Mayotte"
51281msgstr "Indien/Mayotte"51350msgstr "Indien/Mayotte"
5128251351
51283#. modules: purchase, register_accounting, supplier_catalogue, sale, account_override, msf_doc_import51352#. modules: purchase, register_accounting, supplier_catalogue, sale, account_override, msf_doc_import, product
51284#: view:account.invoice:051353#: view:account.invoice:0
51285#: view:composition.kit:051354#: view:composition.kit:0
51286#: view:initial.stock.inventory:051355#: view:initial.stock.inventory:0
@@ -51298,6 +51367,7 @@
51298#: view:account.invoice:051367#: view:account.invoice:0
51299#: view:sale.order:051368#: view:sale.order:0
51300#: view:supplier.catalogue:051369#: view:supplier.catalogue:0
51370#: view:product.mass.update:0
51301msgid " Import Lines "51371msgid " Import Lines "
51302msgstr "Importer les Lignes"51372msgstr "Importer les Lignes"
5130351373
@@ -52436,10 +52506,11 @@
52436msgid "Line Number"52506msgid "Line Number"
52437msgstr "Numéro de Ligne"52507msgstr "Numéro de Ligne"
5243852508
52439#. module: product_nomenclature52509#. module: product_nomenclature, product
52440#: help:product.category,active:052510#: help:product.category,active:0
52441#: help:product.nomenclature,active:052511#: help:product.nomenclature,active:0
52442#: help:product.uom.categ,active:052512#: help:product.uom.categ,active:0
52513#: help:product.mass.update,active_product:0
52443msgid "If the active field is set to False, it allows to hide the nomenclature without removing it."52514msgid "If the active field is set to False, it allows to hide the nomenclature without removing it."
52444msgstr "Si ce champ actif est configuré sur Faux, cela permet de cacher la nomenclature sans la supprimer."52515msgstr "Si ce champ actif est configuré sur Faux, cela permet de cacher la nomenclature sans la supprimer."
5244552516
@@ -54626,7 +54697,12 @@
54626msgid "Nb treated lines"54697msgid "Nb treated lines"
54627msgstr "Nb lignes traitées"54698msgstr "Nb lignes traitées"
5462854699
54629#. module: product_attributes54700#. module: product_attributes, product
54701#: selection:product.mass.update,dangerous_goods:0
54702#: selection:product.mass.update,heat_sensitive_item:0
54703#: selection:product.mass.update,short_shelf_life:0
54704#: selection:product.mass.update,single_use:0
54705#: selection:product.mass.update,sterilized:0
54630#: selection:product.product,dangerous_goods:054706#: selection:product.product,dangerous_goods:0
54631#: selection:product.product,short_shelf_life:054707#: selection:product.product,short_shelf_life:0
54632#: selection:product.product,single_use:054708#: selection:product.product,single_use:0
@@ -57925,8 +58001,9 @@
57925msgid "FX rates by currency table"58001msgid "FX rates by currency table"
57926msgstr "FX rates by currency table"58002msgstr "FX rates by currency table"
5792758003
57928#. module: product_attributes58004#. module: product_attributes, product
57929#: field:product.product,sterilized:058005#: field:product.product,sterilized:0
58006#: field:product.mass.update,sterilized:0
57930msgid "Sterile"58007msgid "Sterile"
57931msgstr "Stérile"58008msgstr "Stérile"
5793258009
@@ -63884,8 +63961,9 @@
63884msgid "Sales Management"63961msgid "Sales Management"
63885msgstr "Gestion des Commandes de Terrain"63962msgstr "Gestion des Commandes de Terrain"
6388663963
63887#. module: product_expiry63964#. module: product_expiry, product
63888#: field:product.product,life_time:063965#: field:product.product,life_time:0
63966#: field:product.mass.update,life_time:0
63889msgid "Product Life Time"63967msgid "Product Life Time"
63890msgstr "Durée de vie du produit"63968msgstr "Durée de vie du produit"
6389163969
@@ -64402,10 +64480,11 @@
64402msgid "Accrual Account"64480msgid "Accrual Account"
64403msgstr "Compte de Régularisation"64481msgstr "Compte de Régularisation"
6440464482
64405#. module: account64483#. module: account, product
64406#: view:account.chart.template:064484#: view:account.chart.template:0
64407#: field:product.category,property_account_income_categ:064485#: field:product.category,property_account_income_categ:0
64408#: field:product.template,property_account_income:064486#: field:product.template,property_account_income:0
64487#: field:product.mass.update,property_account_income:0
64409msgid "Income Account"64488msgid "Income Account"
64410msgstr "Compte de Produits "64489msgstr "Compte de Produits "
6441164490
@@ -65943,8 +66022,9 @@
65943msgid "Proprietary instance:"66022msgid "Proprietary instance:"
65944msgstr "Instance propriétaire :"66023msgstr "Instance propriétaire :"
6594566024
65946#. module: account66025#. module: account, product
65947#: help:product.template,property_account_expense:066026#: help:product.template,property_account_expense:0
66027#: help:product.mass.update,property_account_expense:0
65948msgid "This account will be used for invoices instead of the default one to value expenses for the current product"66028msgid "This account will be used for invoices instead of the default one to value expenses for the current product"
65949msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des dépenses du produit actuel"66029msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des dépenses du produit actuel"
6595066030
@@ -66152,6 +66232,7 @@
6615266232
66153#. module: msf_doc_import66233#. module: msf_doc_import
66154#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:32266234#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:322
66235#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:236
66155#, python-format66236#, python-format
66156msgid "An unknow error occurred, please contact the support team. Error message: %s"66237msgid "An unknow error occurred, please contact the support team. Error message: %s"
66157msgstr "Une erreur inconnue est survenue, veuillez contacter votre équipe support. Message d'erreur : %s"66238msgstr "Une erreur inconnue est survenue, veuillez contacter votre équipe support. Message d'erreur : %s"
@@ -68438,6 +68519,7 @@
68438#: view:stock.production.lot:068519#: view:stock.production.lot:0
68439#: field:stock.location,stock_real:068520#: field:stock.location,stock_real:0
68440#: field:stock.production.lot,stock_available:068521#: field:stock.production.lot,stock_available:0
68522#: report:addons/product/report/product_mass_update_export_xls.mako:115
68441msgid "Real Stock"68523msgid "Real Stock"
68442msgstr "Stock Réel"68524msgstr "Stock Réel"
6844368525
@@ -69686,6 +69768,7 @@
69686#: field:threshold.value,line_ids:069768#: field:threshold.value,line_ids:0
69687#: field:threshold.value,product_ids:069769#: field:threshold.value,product_ids:0
69688#: view:restrictive.country.setup:069770#: view:restrictive.country.setup:0
69771#: view:product.mass.update:0
69689#, python-format69772#, python-format
69690msgid "Products"69773msgid "Products"
69691msgstr "Produits"69774msgstr "Produits"
@@ -70267,6 +70350,7 @@
7026770350
70268#. module: product70351#. module: product
70269#: help:product.template,supply_method:070352#: help:product.template,supply_method:0
70353#: help:product.mass.update,supply_method:0
70270msgid "Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."70354msgid "Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."
70271msgstr "Produire' génère une commande de production ou tâches, en fonction du type de produit. 'Acheter' va générer des bons de commandes à la demande."70355msgstr "Produire' génère une commande de production ou tâches, en fonction du type de produit. 'Acheter' va générer des bons de commandes à la demande."
7027270356
@@ -71718,11 +71802,12 @@
71718msgid "Expected Ship Date"71802msgid "Expected Ship Date"
71719msgstr "Date Prévue d'Expédition"71803msgstr "Date Prévue d'Expédition"
7172071804
71721#. modules: account, msf_accrual71805#. modules: account, msf_accrual, product
71722#: view:account.chart.template:071806#: view:account.chart.template:0
71723#: field:product.category,property_account_expense_categ:071807#: field:product.category,property_account_expense_categ:0
71724#: field:product.template,property_account_expense:071808#: field:product.template,property_account_expense:0
71725#: field:msf.accrual.line,expense_account_id:071809#: field:msf.accrual.line,expense_account_id:0
71810#: field:product.mass.update,property_account_expense:0
71726msgid "Expense Account"71811msgid "Expense Account"
71727msgstr "Compte de Charge"71812msgstr "Compte de Charge"
7172871813
@@ -72845,6 +72930,7 @@
72845#: field:product.heat_sensitive,active:072930#: field:product.heat_sensitive,active:0
72846#: field:sync.client.message_rule,active:072931#: field:sync.client.message_rule,active:0
72847#: selection:sync.version.instance.monitor,instance_state:072932#: selection:sync.version.instance.monitor,instance_state:0
72933#: field:product.mass.update,active_product:0
72848#, python-format72934#, python-format
72849msgid "Active"72935msgid "Active"
72850msgstr "Actif"72936msgstr "Actif"
@@ -73532,7 +73618,7 @@
73532msgid "Expected Pack Date"73618msgid "Expected Pack Date"
73533msgstr "Date Prévue de Colisage"73619msgstr "Date Prévue de Colisage"
7353473620
73535#. modules: tender_flow, analytic_distribution_supply, product_nomenclature, financing_contract, msf_tools, account_hq_entries, export_import_lang, account_override, procurement_cycle, account_journal, register_accounting, mission_stock, return_claim, sync_client, account_mcdb, res_currency_tables, supplier_catalogue, stock_schedule, procurement_request, spreadsheet_xml, unifield_setup, purchase_compare_rfq, stock_batch_recall, purchase_followup, stock_override, msf_doc_import, analytic_distribution, msf_order_date, msf_cross_docking, reason_types_moves, purchase_allocation_report, finance, msf_homere_interface, msf_instance, account_reconciliation, service_purchasing, consumption_calculation, purchase_override, specific_rules, kit, base, account_subscription, res_currency_functional, msf_budget, account_corrections, account, msf_outgoing, stock_move_tracking, msf_partner, product_attributes, order_nomenclature, documents_done, sale, msf_config_locations, sales_followup, sourcing, msf_custom_settings, product_list, object_query, stock, msf_profile73621#. modules: tender_flow, analytic_distribution_supply, product_nomenclature, financing_contract, msf_tools, account_hq_entries, export_import_lang, account_override, procurement_cycle, account_journal, register_accounting, mission_stock, return_claim, sync_client, account_mcdb, res_currency_tables, supplier_catalogue, stock_schedule, procurement_request, spreadsheet_xml, unifield_setup, purchase_compare_rfq, stock_batch_recall, purchase_followup, stock_override, msf_doc_import, analytic_distribution, msf_order_date, msf_cross_docking, reason_types_moves, purchase_allocation_report, finance, msf_homere_interface, msf_instance, account_reconciliation, service_purchasing, consumption_calculation, purchase_override, specific_rules, kit, base, account_subscription, res_currency_functional, msf_budget, account_corrections, account, msf_outgoing, stock_move_tracking, msf_partner, product_attributes, order_nomenclature, documents_done, sale, msf_config_locations, sales_followup, sourcing, msf_custom_settings, product_list, object_query, stock, msf_profile, product
73536#: code:addons/account/account.py:29473622#: code:addons/account/account.py:294
73537#: code:addons/account/account.py:98873623#: code:addons/account/account.py:988
73538#: code:addons/account/account.py:99273624#: code:addons/account/account.py:992
@@ -74643,6 +74729,12 @@
74643#: code:addons/sale/wizard/internal_request_import.py:16674729#: code:addons/sale/wizard/internal_request_import.py:166
74644#: code:addons/msf_outgoing/wizard/create_picking_processor.py:5574730#: code:addons/msf_outgoing/wizard/create_picking_processor.py:55
74645#: selection:internal.request.import,state:074731#: selection:internal.request.import,state:0
74732#: code:addons/product/wizard/product_mass_update.py:182
74733#: code:addons/product/wizard/product_mass_update.py:198
74734#: code:addons/product/wizard/product_mass_update.py:204
74735#: code:addons/product/wizard/product_mass_update.py:210
74736#: code:addons/product/wizard/product_mass_update.py:216
74737#: selection:product.mass.update,state:0
74646#, python-format, python-format74738#, python-format, python-format
74647msgid "Error"74739msgid "Error"
74648msgstr "Erreur"74740msgstr "Erreur"
@@ -74822,8 +74914,9 @@
74822#: view:purchase.order.confirm.wizard:074914#: view:purchase.order.confirm.wizard:0
74823#: view:purchase.order.cancel.wizard:074915#: view:purchase.order.cancel.wizard:0
74824#: view:tender.line.cancel.wizard:074916#: view:tender.line.cancel.wizard:0
74917#: view:wizard.import.product.line:0
74825msgid "Close window"74918msgid "Close window"
74826msgstr "Ferme la fenêtre"74919msgstr "Fermer la fenêtre"
7482774920
74828#. module: msf_outgoing74921#. module: msf_outgoing
74829#: code:addons/msf_outgoing/msf_outgoing.py:96874922#: code:addons/msf_outgoing/msf_outgoing.py:968
@@ -75544,6 +75637,7 @@
75544#: field:multiple.sourcing.wizard,type:075637#: field:multiple.sourcing.wizard,type:0
75545#: field:stock.forecast,procurement_method:075638#: field:stock.forecast,procurement_method:0
75546#: report:stock.forecast.report:075639#: report:stock.forecast.report:0
75640#: field:product.mass.update,procure_method:0
75547msgid "Procurement Method"75641msgid "Procurement Method"
75548msgstr "Approvisionnement- Méthode"75642msgstr "Approvisionnement- Méthode"
7554975643
@@ -76058,8 +76152,9 @@
76058msgid "To validate"76152msgid "To validate"
76059msgstr "A valider"76153msgstr "A valider"
7606076154
76061#. module: account76155#. module: account, product
76062#: help:product.template,property_account_income:076156#: help:product.template,property_account_income:0
76157#: help:product.mass.update,property_account_income:0
76063msgid "This account will be used for invoices instead of the default one to value sales for the current product"76158msgid "This account will be used for invoices instead of the default one to value sales for the current product"
76064msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des ventes du produit actuel"76159msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des ventes du produit actuel"
7606576160
@@ -77240,6 +77335,7 @@
77240#: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:19677335#: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:196
77241#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:21077336#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:210
77242#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:21977337#: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:219
77338#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:200
77243#, python-format77339#, python-format
77244msgid "Line %s in the Excel file: %s: %s\n"77340msgid "Line %s in the Excel file: %s: %s\n"
77245""77341""
@@ -80311,6 +80407,7 @@
80311#. modules: stock_forecast, product80407#. modules: stock_forecast, product
80312#: selection:product.template,supply_method:080408#: selection:product.template,supply_method:0
80313#: selection:stock.forecast,supply_method:080409#: selection:stock.forecast,supply_method:0
80410#: selection:product.mass.update,supply_method:0
80314msgid "Buy"80411msgid "Buy"
80315msgstr "Acheter"80412msgstr "Acheter"
8031680413
@@ -83036,7 +83133,11 @@
83036#: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:8983133#: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:89
83037#: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:17383134#: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:173
83038#: field:internal.request.import,state:083135#: field:internal.request.import,state:0
83136<<<<<<< TREE
83039#: field:wizard.import.ppl.to.create.ship,state:083137#: field:wizard.import.ppl.to.create.ship,state:0
83138=======
83139#: field:wizard.import.product.line,state:0
83140>>>>>>> MERGE-SOURCE
83040#, python-format83141#, python-format
83041msgid "State"83142msgid "State"
83042msgstr "État"83143msgstr "État"
@@ -83970,6 +84071,7 @@
83970#: field:reserved.products.wizard,product_id:084071#: field:reserved.products.wizard,product_id:0
83971#: field:internal.request.import.line,imp_product_id:084072#: field:internal.request.import.line,imp_product_id:0
83972#: field:internal.request.import.line,in_product_id:084073#: field:internal.request.import.line,in_product_id:0
84074#: field:product.mass.update.errors,product_id:0
83973#, python-format84075#, python-format
83974msgid "Product"84076msgid "Product"
83975msgstr "Produit"84077msgstr "Produit"
@@ -84073,7 +84175,7 @@
84073msgid "Select a supplier"84175msgid "Select a supplier"
84074msgstr "Sélectionner un fournisseur"84176msgstr "Sélectionner un fournisseur"
8407584177
84076#. modules: delivery_mechanism, msf_budget, account, msf_outgoing, account_payment, msf_homere_interface, sync_client, register_accounting, specific_rules, sale, sales_followup, base, stock, tender_flow, msf_tools, return_claim, msf_doc_import, analytic_distribution, finance84178#. modules: delivery_mechanism, msf_budget, account, msf_outgoing, account_payment, msf_homere_interface, sync_client, register_accounting, specific_rules, sale, sales_followup, base, stock, tender_flow, msf_tools, return_claim, msf_doc_import, analytic_distribution, finance, product
84077#: selection:account.invoice.report,state:084179#: selection:account.invoice.report,state:0
84078#: selection:account.journal.period,state:084180#: selection:account.journal.period,state:0
84079#: selection:account.subscription,state:084181#: selection:account.subscription,state:0
@@ -84139,7 +84241,12 @@
84139#: code:addons/sale/sale_order.py:320784241#: code:addons/sale/sale_order.py:3207
84140#: code:addons/sale/sale_order.py:320884242#: code:addons/sale/sale_order.py:3208
84141#: selection:internal.request.import,state:084243#: selection:internal.request.import,state:0
84244<<<<<<< TREE
84142#: selection:wizard.import.ppl.to.create.ship,state:084245#: selection:wizard.import.ppl.to.create.ship,state:0
84246=======
84247#: selection:wizard.import.product.line,state:0
84248#: selection:product.mass.update,state:0
84249>>>>>>> MERGE-SOURCE
84143#, python-format84250#, python-format
84144msgid "Done"84251msgid "Done"
84145msgstr "Terminé"84252msgstr "Terminé"
@@ -84899,7 +85006,7 @@
84899msgid "Sourced-n line"85006msgid "Sourced-n line"
84900msgstr "Ligne sourcée-n"85007msgstr "Ligne sourcée-n"
8490185008
84902#. modules: analytic_distribution, sales_followup, register_accounting, reason_types_moves, msf_homere_interface, stock_override, consumption_calculation, sale, specific_rules, order_types, msf_tools, mission_stock, msf_doc_import85009#. modules: analytic_distribution, sales_followup, register_accounting, reason_types_moves, msf_homere_interface, stock_override, consumption_calculation, sale, specific_rules, order_types, msf_tools, mission_stock, msf_doc_import, product
84903#: field:import.commitment.wizard,in_progress:085010#: field:import.commitment.wizard,in_progress:0
84904#: view:product.history.consumption:085011#: view:product.history.consumption:0
84905#: selection:product.history.consumption,fake_status:085012#: selection:product.history.consumption,fake_status:0
@@ -84938,7 +85045,12 @@
84938#: selection:sale.followup.multi.wizard,state:085045#: selection:sale.followup.multi.wizard,state:0
84939#: selection:export.report.stock.inventory,state:085046#: selection:export.report.stock.inventory,state:0
84940#: selection:export.report.stock.move,state:085047#: selection:export.report.stock.move,state:0
85048<<<<<<< TREE
84941#: selection:wizard.import.ppl.to.create.ship,state:085049#: selection:wizard.import.ppl.to.create.ship,state:0
85050=======
85051#: selection:wizard.import.product.line,state:0
85052#: selection:product.mass.update,state:0
85053>>>>>>> MERGE-SOURCE
84942#, python-format85054#, python-format
84943msgid "In Progress"85055msgid "In Progress"
84944msgstr "En cours"85056msgstr "En cours"
@@ -85935,9 +86047,10 @@
85935msgid "Asia/Harbin"86047msgid "Asia/Harbin"
85936msgstr "Asia/Harbin"86048msgstr "Asia/Harbin"
8593786049
85938#. module: stock_forecast86050#. module: stock_forecast, product
85939#: field:stock.forecast,dangerous_goods:086051#: field:stock.forecast,dangerous_goods:0
85940#: report:stock.forecast.report:086052#: report:stock.forecast.report:0
86053#: field:product.mass.update,dangerous_goods:0
85941msgid "Dangerous Goods"86054msgid "Dangerous Goods"
85942msgstr "Marchandises Dangereuses"86055msgstr "Marchandises Dangereuses"
8594386056
@@ -86411,6 +86524,7 @@
86411#. modules: consumption_calculation, product86524#. modules: consumption_calculation, product
86412#: selection:product.price.type,field:086525#: selection:product.price.type,field:0
86413#: field:product.product,procure_delay:086526#: field:product.product,procure_delay:0
86527#: field:product.mass.update,procure_delay:0
86414msgid "Procurement Lead Time"86528msgid "Procurement Lead Time"
86415msgstr "Délai d'approvisionnement"86529msgstr "Délai d'approvisionnement"
8641686530
@@ -88148,10 +88262,11 @@
88148msgid "Invisible expiry date"88262msgid "Invisible expiry date"
88149msgstr "Invisible expiry date"88263msgstr "Invisible expiry date"
8815088264
88151#. modules: stock_forecast, product_attributes88265#. modules: stock_forecast, product_attributes, product
88152#: field:product.product,short_shelf_life:088266#: field:product.product,short_shelf_life:0
88153#: field:stock.forecast,short_shelf_life:088267#: field:stock.forecast,short_shelf_life:0
88154#: report:stock.forecast.report:088268#: report:stock.forecast.report:0
88269#: field:product.mass.update,short_shelf_life:0
88155msgid "Short Shelf Life"88270msgid "Short Shelf Life"
88156msgstr "Durée de Conservation Limitée "88271msgstr "Durée de Conservation Limitée "
8815788272
@@ -88534,6 +88649,8 @@
88534#: field:physical.inventory,file_to_import2:088649#: field:physical.inventory,file_to_import2:0
88535#: field:supplier.catalogue,file_to_import:088650#: field:supplier.catalogue,file_to_import:0
88536#: field:internal.request.import,file_to_import:088651#: field:internal.request.import,file_to_import:0
88652#: view:wizard.import.product.line:0
88653#: field:wizard.import.product.line,file:0
88537msgid "File to import"88654msgid "File to import"
88538msgstr "Fichier à importer"88655msgstr "Fichier à importer"
8853988656
@@ -91514,6 +91631,7 @@
91514#: model:process.node,name:procurement.process_node_serviceonorder091631#: model:process.node,name:procurement.process_node_serviceonorder0
91515#: selection:product.template,procure_method:091632#: selection:product.template,procure_method:0
91516#: selection:stock.forecast,procurement_method:091633#: selection:stock.forecast,procurement_method:0
91634#: selection:product.mass.update,procure_method:0
91517msgid "Make to Order"91635msgid "Make to Order"
91518msgstr "Production sur Commande"91636msgstr "Production sur Commande"
9151991637
@@ -92913,6 +93031,7 @@
92913#. modules: stock_forecast, product93031#. modules: stock_forecast, product
92914#: selection:product.template,supply_method:093032#: selection:product.template,supply_method:0
92915#: selection:stock.forecast,supply_method:093033#: selection:stock.forecast,supply_method:0
93034#: selection:product.mass.update,supply_method:0
92916msgid "Produce"93035msgid "Produce"
92917msgstr "Produire"93036msgstr "Produire"
9291893037
@@ -95866,9 +95985,10 @@
95866msgid "This ISO code is the name of po files to use for translations"95985msgid "This ISO code is the name of po files to use for translations"
95867msgstr "Ce code ISO est le nom des fichiers po utilisés pour les traductions"95986msgstr "Ce code ISO est le nom des fichiers po utilisés pour les traductions"
9586895987
95869#. module: product_attributes, purchase95988#. module: product_attributes, purchase, product
95870#: field:product.product,heat_sensitive_item:095989#: field:product.product,heat_sensitive_item:0
95871#: field:purchase.order.line,heat_sensitive_item:095990#: field:purchase.order.line,heat_sensitive_item:0
95991#: field:product.mass.update,heat_sensitive_item:0
95872msgid "Temperature sensitive item"95992msgid "Temperature sensitive item"
95873msgstr "Article sensible à la température"95993msgstr "Article sensible à la température"
9587495994
@@ -97010,9 +97130,10 @@
97010msgid "Last reviewed on (hidden)"97130msgid "Last reviewed on (hidden)"
97011msgstr "Revu la dernière fois le (caché)"97131msgstr "Revu la dernière fois le (caché)"
9701297132
97013#. module: stock_forecast97133#. module: stock_forecast, product
97014#: field:stock.forecast,supply_method:097134#: field:stock.forecast,supply_method:0
97015#: report:stock.forecast.report:097135#: report:stock.forecast.report:0
97136#: field:product.mass.update,supply_method:0
97016msgid "Supply Method"97137msgid "Supply Method"
97017msgstr "Méthode d'Approvisionnement"97138msgstr "Méthode d'Approvisionnement"
9701897139
@@ -98079,7 +98200,11 @@
98079#: view:integrity.finance.wizard:098200#: view:integrity.finance.wizard:0
98080#: view:stock.move.cancel.wizard:098201#: view:stock.move.cancel.wizard:0
98081#: view:stock.picking.cancel.wizard:098202#: view:stock.picking.cancel.wizard:0
98203<<<<<<< TREE
98082#: view:wizard.pick.import:098204#: view:wizard.pick.import:0
98205=======
98206#: view:wizard.import.product.line:0
98207>>>>>>> MERGE-SOURCE
98083#, python-format98208#, python-format
98084msgid "Cancel"98209msgid "Cancel"
98085msgstr "Annuler"98210msgstr "Annuler"
@@ -99636,8 +99761,9 @@
99636msgid "Available Shipped"99761msgid "Available Shipped"
99637msgstr "Disponible expédié"99762msgstr "Disponible expédié"
9963899763
99639#. module: product_attributes99764#. module: product_attributes, product
99640#: selection:product.product,state_ud:099765#: selection:product.product,state_ud:0
99766#: selection:product.mass.update,product_state:0
99641msgid "Archived"99767msgid "Archived"
99642msgstr "Archivé"99768msgstr "Archivé"
9964399769
@@ -101236,8 +101362,9 @@
101236msgid "Page need to be refreshed - please press \"F5\""101362msgid "Page need to be refreshed - please press \"F5\""
101237msgstr "La page doit être rafraîchie, veuillez cliquer sur \"F5\""101363msgstr "La page doit être rafraîchie, veuillez cliquer sur \"F5\""
101238101364
101239#. module: product_expiry101365#. module: product_expiry, product
101240#: help:product.product,life_time:0101366#: help:product.product,life_time:0
101367#: help:product.mass.update,life_time:0
101241msgid "The number of months before a production lot may become dangerous and should not be consumed."101368msgid "The number of months before a production lot may become dangerous and should not be consumed."
101242msgstr "Nombre de mois avant qu'un lot de production ne devienne dangereux et qu'il ne puisse plus être consommé."101369msgstr "Nombre de mois avant qu'un lot de production ne devienne dangereux et qu'il ne puisse plus être consommé."
101243101370
@@ -103871,6 +103998,7 @@
103871#, python-format103998#, python-format
103872msgid "Source Location %s is inactive"103999msgid "Source Location %s is inactive"
103873msgstr "La Zone Source %s est inactive"104000msgstr "La Zone Source %s est inactive"
104001<<<<<<< TREE
103874104002
103875#. module: sale104003#. module: sale
103876#: report:addons/sale/report/sale_donation_stock_moves_report_xls.mako:140104004#: report:addons/sale/report/sale_donation_stock_moves_report_xls.mako:140
@@ -105388,3 +105516,301 @@
105388#, python-format105516#, python-format
105389msgid "Product %s, BN: %s not enough stock to process quantity %s %s (stock level: %s)"105517msgid "Product %s, BN: %s not enough stock to process quantity %s %s (stock level: %s)"
105390msgstr "Produit %s, Lot: %s, pas assez de stock pour traiter la qantité %s %s (quantité en stock: %s)"105518msgstr "Produit %s, Lot: %s, pas assez de stock pour traiter la qantité %s %s (quantité en stock: %s)"
105519=======
105520
105521#. module: product
105522#: model:ir.ui.menu,name:product.parent_product_mass_update
105523msgid "Products Update"
105524msgstr "MàJ de Produits"
105525
105526#. module: product
105527#: field:product.product,expected_prod_creator:0
105528msgid "Expected Product Creator for Product Mass Update"
105529msgstr "Créateur Produit attendu pour la MàJ de Produits en Masse"
105530
105531#. module: product
105532#: model:ir.model,name:product.model_product_mass_update_progressbar
105533msgid "Product Mass Update Progress Bar"
105534msgstr "Barre de Progression de la MàJ de Produits en Masse"
105535
105536#. module: product
105537#: code:addons/product/wizard/product_mass_update.py:343
105538#: model:ir.actions.report.xml,name:product.product_mass_update_export_xls
105539#: report:addons/product/report/product_mass_update_export_xls.mako:92
105540#, python-format
105541msgid "Product Mass Update Errors"
105542msgstr "Erreurs de la MàJ de Produits en Masse"
105543
105544#. modules: msf_doc_import, product, product_attributes
105545#: field:wizard.import.product.line,product_mass_upd_id:0
105546#: model:ir.actions.act_window,name:product.previous_mass_update_action
105547#: model:ir.model,name:product.model_product_mass_update
105548#: view:product.mass.update:0
105549#: field:product.mass.update.progressbar,p_mass_upd_id:0
105550#: model:ir.ui.menu,name:product_attributes.menu_import_request
105551msgid "Product Mass Update"
105552msgstr "MàJ de Produits en Masse"
105553
105554#. module: product
105555#: field:product.mass.update,date_done:0
105556msgid "Date of the update"
105557msgstr "Date de la mise à jour"
105558
105559#. module: product
105560#: field:product.mass.update,seller_id:0
105561msgid "Default Partner"
105562msgstr "Partenaire par Défaut"
105563
105564#. module: product
105565#: view:product.mass.update:0
105566msgid " New Data "
105567msgstr " Nouvelles Données "
105568
105569#. module: product
105570#: view:product.mass.update:0
105571msgid "Delete Update"
105572msgstr "Supprimer la Mise à Jour"
105573
105574#. module: product
105575#: view:product.mass.update:0
105576msgid "Apply Update"
105577msgstr "Appliquer la Mise à Jour"
105578
105579#. module: msf_doc_import
105580#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:219
105581#, python-format
105582msgid "\n"
105583" Importation completed in %s!\n"
105584"# of imported lines : %s on %s lines\n"
105585"# of ignored lines: %s\n"
105586"# of lines to correct: %s\n"
105587" %s\n"
105588"\n"
105589" %s\n"
105590" "
105591msgstr "\n"
105592" Import terminé en %s!\n"
105593"# de lignes importées : %s sur %s lignes\n"
105594"# de lignes ignorées: %s\n"
105595"# de lignes à corriger: %s\n"
105596" %s\n"
105597"\n"
105598" %s\n"
105599" "
105600
105601#. module: msf_doc_import
105602#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:177
105603#, python-format
105604msgid "Product code %s doesn't exist in the DB. "
105605msgstr "Le Code Produit %s n'existe pas dans la BDD. "
105606
105607#. module: msf_doc_import
105608#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:110
105609#, python-format
105610msgid "\n"
105611" Number of columns is not equal to %s"
105612msgstr "\n"
105613" Le nombre de colonnes n'est pas égal à %s"
105614
105615#. module: msf_doc_import
105616#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:169
105617#, python-format
105618msgid "Product %s doesn't have the expected Product Creator \"HQ\". "
105619msgstr "Le Produit %s n'a pas le Créateur Produit attendu \"HQ\". "
105620
105621#. module: msf_doc_import
105622#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:254
105623#, python-format
105624msgid "Nothing to import"
105625msgstr "Rien à importer"
105626
105627#. module: msf_doc_import
105628#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:183
105629#, python-format
105630msgid "Line %s: "
105631msgstr "Ligne %s: "
105632
105633#. module: msf_doc_import
105634#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:145
105635#, python-format
105636msgid "Line %s in the Excel file: You should have exactly %s columns in this order: %s \n"
105637""
105638msgstr "Ligne %s du fichier Excel: Vous devriez avoir exactement %s colonnes dans cet ordre: %s \n"
105639""
105640
105641#. module: msf_doc_import
105642#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:292
105643#, python-format
105644msgid " Import in progress... \n"
105645" Please wait that the import is finished before editing."
105646msgstr " Import en cours... \n"
105647" Veuillez attendre que l'import soit terminer avant de faire des modifications."
105648
105649#. module: msf_doc_import
105650#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:218
105651#, python-format
105652msgid " second(s)"
105653msgstr " seconde(s)"
105654
105655#. module: msf_doc_import
105656#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:172
105657#, python-format
105658msgid "Product %s doesn't have the expected Product Creator \"Local\". "
105659msgstr "Le Produit %s n'a pas le Créateur Produit attendu \"Local\". "
105660
105661#. module: msf_doc_import
105662#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:179
105663#, python-format
105664msgid "Product code is mandatory. "
105665msgstr "Le Code Produit est obligatoire. "
105666
105667#. module: msf_doc_import
105668#: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:136
105669#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:126
105670#, python-format
105671msgid "\n"
105672" Please ensure that all these columns are present and in this exact order."
105673msgstr "\n"
105674" Veuillez vous assurer que toutes les colonnes sont présentes et dans cet ordre."
105675
105676#. module: msf_doc_import
105677#: model:ir.model,name:msf_doc_import.model_wizard_import_product_line
105678msgid "Import Products data from Excel sheet"
105679msgstr "Import des données de Produits depuis la feuille Excel"
105680
105681#. module: msf_doc_import
105682#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:216
105683#, python-format
105684msgid "Reported errors for ignored lines : \n"
105685""
105686msgstr "Erreurs signalées pour les lignes ignorées : \n"
105687""
105688
105689#. module: msf_doc_import
105690#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:175
105691#, python-format
105692msgid "You must be on Coordo or HQ instance to add products to the list. "
105693msgstr "Vous devez etre sur une instance Coordo ou HQ pour ajouter des produits à la liste. "
105694
105695#. module: msf_doc_import
105696#: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:273
105697#, python-format
105698msgid "The file has no row, nothing to import"
105699msgstr "Le fichier n'a pas de ligne, il n'y a rien à importer"
105700
105701#. module: product
105702#: selection:product.mass.update,product_state:0
105703msgid "Status 1"
105704msgstr "Statut 1"
105705
105706#. module: product
105707#: selection:product.mass.update,product_state:0
105708msgid "Status 2"
105709msgstr "Statut 2"
105710
105711#. module: product
105712#: code:addons/product/wizard/product_mass_update.py:210
105713#, python-format
105714msgid "Use Time must be an integer."
105715msgstr "La Durée d'utilisation doit être un entier."
105716
105717#. module: product
105718#: code:addons/product/wizard/product_mass_update.py:198
105719#, python-format
105720msgid "Alert Time must be an integer."
105721msgstr "La Période d'Alerte doit être un entier."
105722
105723#. module: product
105724#: code:addons/product/wizard/product_mass_update.py:204
105725#, python-format
105726msgid "Life Time must be an integer."
105727msgstr "La Durée de Vie d'un produit doit être un entier."
105728
105729#. module: product
105730#: code:addons/product/wizard/product_mass_update.py:216
105731#, python-format
105732msgid "Procurement Lead Time must be a float."
105733msgstr "Le Délai d'approvisionnement doit être nombre à virgule."
105734
105735#. module: product
105736#: code:addons/product/wizard/product_mass_update.py:237
105737#, python-format
105738msgid "Update in progress, please leave this window open and press the button 'Update' when you think that the update is done. Otherwise, you can continue to use Unifield."
105739msgstr "Mise à jour en cours, veuillez laisser cette fenêtre ouverte et appuyer sur le bouton 'Mettre à jour' lorsque vous pensez que la mise à jour est finie. Sinon, vous pouvez continuer à utiliser Unifield."
105740
105741#. module: product
105742#: view:product.mass.update:0
105743msgid "Non-Deactivable Products"
105744msgstr "Produits Non-Désactivables"
105745
105746#. module: product
105747#: view:product.mass.update:0
105748msgid "Export Product List"
105749msgstr "Exporter la Liste des Produits"
105750
105751#. module: product
105752#: report:addons/product/report/product_mass_update_export_xls.mako:104
105753msgid "PRODUCT MASS UPDATE ERRORS"
105754msgstr "ERREURS DE LA MÀJ DE PRODUITS EN MASSE"
105755
105756#. module: product
105757#: view:product.mass.update:0
105758msgid "Reset Update"
105759msgstr "Réinitialiser la Mise à Jour"
105760
105761#. module: product
105762#: code:addons/product/wizard/product_mass_update.py:182
105763#, python-format
105764msgid "You can not apply an update on no products."
105765msgstr "Vous ne pouvez pas appliquer de mise à jour à aucun produits."
105766
105767#. module: product
105768#: code:addons/product/wizard/product_mass_update.py:287
105769msgid "Some products could not be deactivated. No product will be changed until all of them can be deactivated. Please check the corresponding tab."
105770msgstr "Certains produits n'ont pas pu être désactivés. Aucun produit ne sera modifié tant qu'ils ne pourront pas tous être désactivés. Veuillez vérifier l'onglet approprié."
105771
105772#. module: product
105773#: field:product.mass.update,name:0
105774msgid "Update Reference"
105775msgstr "Référence de la MàJ"
105776
105777#. module: product
105778#: field:product.mass.update.errors,stock_exist:0
105779#: report:addons/product/report/product_mass_update_export_xls.mako:119
105780msgid "Stock Exist"
105781msgstr "Stock Présent"
105782
105783#. module: product
105784#: field:product.mass.update.errors,open_documents:0
105785#: report:addons/product/report/product_mass_update_export_xls.mako:119
105786msgid "Open Documents"
105787msgstr "Documents Ouverts"
105788
105789#. module: product
105790#: code:addons/product/wizard/product_mass_update.py:323
105791#, python-format
105792msgid "An error has occured during the update:\n"
105793"%s"
105794msgstr "Une erreur est survenue lors de la mise à jour:\n"
105795"%s"
105796
105797#. module: product
105798#: field:product.mass.update,user_id:0
105799msgid "User who Updated"
105800msgstr "Utilisateur qui a Mis à Jour"
105801
105802#. module: product
105803#: field:product.mass.update,empty_exp_account:0
105804msgid "Set Expense Account as empty"
105805msgstr "Mettre le Compte de Charge à vide"
105806
105807#. module: product
105808#: field:product.mass.update,empty_inc_account:0
105809msgid "Set Income Account as empty"
105810msgstr "Mettre le Compte de Produits à vide"
105811
105812#. module: product
105813#: field:product.mass.update,empty_status:0
105814msgid "Set Status as empty"
105815msgstr "Mettre le Statut à vide"
105816>>>>>>> MERGE-SOURCE
105391105817
=== modified file 'bin/addons/product/__openerp__.py'
--- bin/addons/product/__openerp__.py 2017-09-28 14:05:02 +0000
+++ bin/addons/product/__openerp__.py 2019-04-15 13:13:32 +0000
@@ -54,7 +54,9 @@
54 'product_report.xml',54 'product_report.xml',
55 'product_view.xml',55 'product_view.xml',
56 'pricelist_view.xml',56 'pricelist_view.xml',
57 'process/product_process.xml'57 'process/product_process.xml',
58 'wizard/product_mass_update_view.xml',
59 'report/product_mass_update_export_view.xml',
58 ],60 ],
59 'test':[],61 'test':[],
60 'installable': True,62 'installable': True,
6163
=== modified file 'bin/addons/product/product.py'
--- bin/addons/product/product.py 2019-02-08 16:56:18 +0000
+++ bin/addons/product/product.py 2019-04-15 13:13:32 +0000
@@ -588,6 +588,34 @@
588 (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '')588 (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '')
589 return res589 return res
590590
591 def _get_expected_prod_creator(self, cr, uid, ids, field_names, arg, context=None):
592 if context is None:
593 context = {}
594
595 res = {}
596 for id in ids:
597 res[id] = False
598
599 return res
600
601 def _expected_prod_creator_search(self, cr, uid, obj, name, args, context=None):
602 '''
603 Returns all documents according to the product creator
604 '''
605 if context is None:
606 context = {}
607
608 obj_data = self.pool.get('ir.model.data')
609 instance_level = self.pool.get('res.users').browse(cr, uid, uid).company_id.instance_id.level
610 prod_creator_id = False
611 for arg in args:
612 if arg[0] == 'expected_prod_creator':
613 if instance_level == 'section':
614 prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_3')[1]
615 elif instance_level == 'coordo':
616 prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_4')[1]
617
618 return [('international_status', '=', prod_creator_id)]
591619
592 _defaults = {620 _defaults = {
593 'active': lambda *a: 1,621 'active': lambda *a: 1,
@@ -619,9 +647,9 @@
619 'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Sale Price')),647 'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Sale Price')),
620 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),648 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
621 'name_template': fields.related('product_tmpl_id', 'name', string="Name", type='char', size=128, store=True, write_relate=False),649 'name_template': fields.related('product_tmpl_id', 'name', string="Name", type='char', size=128, store=True, write_relate=False),
650 'expected_prod_creator': fields.function(_get_expected_prod_creator, method=True, type='many2one', relation='product.international.status', fnct_search=_expected_prod_creator_search, readonly=True, string='Expected Product Creator for Product Mass Update'),
622 }651 }
623652
624
625 def unlink(self, cr, uid, ids, context=None):653 def unlink(self, cr, uid, ids, context=None):
626 unlink_ids = []654 unlink_ids = []
627 unlink_product_tmpl_ids = []655 unlink_product_tmpl_ids = []
628656
=== modified file 'bin/addons/product/report/__init__.py'
--- bin/addons/product/report/__init__.py 2011-01-14 00:11:01 +0000
+++ bin/addons/product/report/__init__.py 2019-04-15 13:13:32 +0000
@@ -19,6 +19,7 @@
19#19#
20##############################################################################20##############################################################################
21import product_pricelist21import product_pricelist
22import product_mass_update_export
2223
23# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2425
2526
=== added file 'bin/addons/product/report/product_mass_update_export.py'
--- bin/addons/product/report/product_mass_update_export.py 1970-01-01 00:00:00 +0000
+++ bin/addons/product/report/product_mass_update_export.py 2019-04-15 13:13:32 +0000
@@ -0,0 +1,55 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 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
22from report import report_sxw
23from spreadsheet_xml.spreadsheet_xml_write import SpreadsheetReport
24from tools.translate import _
25
26
27class product_mass_update_export_parser(report_sxw.rml_parse):
28
29 def __init__(self, cr, uid, name, context):
30 super(product_mass_update_export_parser, self).__init__(cr, uid, name, context=context)
31 self.counter = 0
32 self.localcontext.update({
33 'getErrors': self.get_errors,
34 })
35
36 def get_errors(self):
37 upd_errors = []
38
39 if not self.ids:
40 return upd_errors
41
42 for upd_error in self.pool.get('product.mass.update').browse(self.cr, self.uid, self.ids[0], fields_to_fetch=['not_deactivated_product_ids'], context=self.localcontext).not_deactivated_product_ids:
43 upd_errors.append({
44 'default_code': upd_error.product_id.default_code,
45 'name': upd_error.product_id.name,
46 'stock_exist': upd_error.stock_exist,
47 'qty_available': upd_error.product_id.qty_available,
48 'virtual_available': upd_error.product_id.virtual_available,
49 'open_documents': upd_error.open_documents,
50 })
51
52 return upd_errors
53
54
55SpreadsheetReport('report.product_mass_update_export_xls', 'product.mass.update', 'addons/product/report/product_mass_update_export_xls.mako', parser=product_mass_update_export_parser)
056
=== added file 'bin/addons/product/report/product_mass_update_export_view.xml'
--- bin/addons/product/report/product_mass_update_export_view.xml 1970-01-01 00:00:00 +0000
+++ bin/addons/product/report/product_mass_update_export_view.xml 2019-04-15 13:13:32 +0000
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8" ?>
2<openerp>
3 <data>
4 <report
5 id="product_mass_update_export_xls"
6 string="Product Mass Update Errors"
7 model="product.mass.update"
8 name="product_mass_update_export_xls"
9 file="product/report/product_mass_update_export_xls.mako"
10 report_type="webkit"
11 menu="False"
12 />
13 </data>
14</openerp>
0\ No newline at end of file15\ No newline at end of file
116
=== added file 'bin/addons/product/report/product_mass_update_export_xls.mako'
--- bin/addons/product/report/product_mass_update_export_xls.mako 1970-01-01 00:00:00 +0000
+++ bin/addons/product/report/product_mass_update_export_xls.mako 2019-04-15 13:13:32 +0000
@@ -0,0 +1,146 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <Author>Unifield</Author>
10 <LastAuthor>MSFUser</LastAuthor>
11 <Created>2014-04-16T22:36:07Z</Created>
12 <Company>Medecins Sans Frontieres</Company>
13 <Version>11.9999</Version>
14 </DocumentProperties>
15 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
16 <WindowHeight>11640</WindowHeight>
17 <WindowWidth>15480</WindowWidth>
18 <WindowTopX>120</WindowTopX>
19 <WindowTopY>75</WindowTopY>
20 <ProtectStructure>False</ProtectStructure>
21 <ProtectWindows>False</ProtectWindows>
22 </ExcelWorkbook>
23 <Styles>
24 <Style ss:ID="ssCell">
25 <Alignment ss:Vertical="Top" ss:WrapText="1"/>
26 <Font ss:Bold="1" />
27 </Style>
28 <Style ss:ID="ssCellBlue">
29 <Alignment ss:Vertical="Top" ss:WrapText="1"/>
30 <Font ss:Color="#0000FF" />
31 </Style>
32
33 <!-- File header -->
34 <Style ss:ID="big_header">
35 <Font x:Family="Swiss" ss:Size="14" ss:Bold="1"/>
36 </Style>
37 <Style ss:ID="file_header">
38 <Font ss:Size="10" />
39 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
40 </Style>
41
42 <!-- Line header -->
43 <Style ss:ID="line_header">
44 <Borders>
45 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
46 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
47 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
48 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
49 </Borders>
50 <Font x:Family="Swiss" ss:Size="10" ss:Bold="1"/>
51 <Interior/>
52 </Style>
53
54 <!-- Lines -->
55 <Style ss:ID="line_left">
56 <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
57 <Borders>
58 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
59 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
60 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
61 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
62 </Borders>
63 <Font ss:Size="10" />
64 <NumberFormat ss:Format="#0"/>
65 </Style>
66 <Style ss:ID="line_right">
67 <Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/>
68 <Borders>
69 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
70 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
71 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
72 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
73 </Borders>
74 <Font ss:Size="10" />
75 <NumberFormat ss:Format="#0"/>
76 </Style>
77 <Style ss:ID="line_center">
78 <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
79 <Borders>
80 <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
81 <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
82 <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
83 <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
84 </Borders>
85 <Font ss:Size="10" />
86 <NumberFormat ss:Format="#0"/>
87 </Style>
88</Styles>
89
90
91% for r in objects:
92<ss:Worksheet ss:Name="${_('Product Mass Update Errors')|x}">
93 <Table x:FullColumns="1" x:FullRows="1">
94 ## Product code
95 <Column ss:AutoFitWidth="1" ss:Width="150.00" />
96 ## Product code
97 <Column ss:AutoFitWidth="1" ss:Width="300.00" />
98 ## Stock Exist
99 <Column ss:AutoFitWidth="1" ss:Width="70.00" />
100 ## Real Stock
101 <Column ss:AutoFitWidth="1" ss:Width="80.00" />
102 ## Virtual Stock
103 <Column ss:AutoFitWidth="1" ss:Width="80.00" />
104 ## Open Documents
105 <Column ss:AutoFitWidth="1" ss:Width="500.00" />
106
107 <Row ss:Height="18">
108 <Cell ss:StyleID="big_header" ss:MergeAcross="1"><Data ss:Type="String">${_('PRODUCT MASS UPDATE ERRORS')|x}</Data><NamedCell ss:Name="Print_Area"/></Cell>
109 </Row>
110
111 <Row></Row>
112
113 ## WORKSHEET HEADER
114
115 <%
116 headers_list = [
117 _('Product Code'),
118 _('Description'),
119 _('Stock Exist'),
120 _('Real Stock'),
121 _('Virtual Stock'),
122 _('Open Documents'),
123 ]
124 %>
125
126 <Row>
127 % for h in headers_list:
128 <Cell ss:StyleID="line_header"><Data ss:Type="String">${h|x}</Data></Cell>
129 % endfor
130 </Row>
131
132 % for upd_errors in getErrors():
133 <Row>
134 <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('default_code', '')|x}</Data></Cell>
135 <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('name', '')|x}</Data></Cell>
136 <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('stock_exist', '') and _('Yes') or _('No')|x}</Data></Cell>
137 <Cell ss:StyleID="line_right"><Data ss:Type="Number">${upd_errors.get('qty_available', 0)|x}</Data></Cell>
138 <Cell ss:StyleID="line_right"><Data ss:Type="Number">${upd_errors.get('virtual_available', 0)|x}</Data></Cell>
139 <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('open_documents', '')|x}</Data></Cell>
140 </Row>
141 % endfor
142 </Table>
143
144</ss:Worksheet>
145% endfor
146</Workbook>
0147
=== modified file 'bin/addons/product/wizard/__init__.py'
--- bin/addons/product/wizard/__init__.py 2011-01-14 00:11:01 +0000
+++ bin/addons/product/wizard/__init__.py 2019-04-15 13:13:32 +0000
@@ -19,6 +19,7 @@
19#19#
20##############################################################################20##############################################################################
21import product_price21import product_price
22import product_mass_update
2223
23# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:24# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2425
2526
=== added file 'bin/addons/product/wizard/product_mass_update.py'
--- bin/addons/product/wizard/product_mass_update.py 1970-01-01 00:00:00 +0000
+++ bin/addons/product/wizard/product_mass_update.py 2019-04-15 13:13:32 +0000
@@ -0,0 +1,467 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 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
22from osv import osv, fields
23from tools.translate import _
24import tools
25import time
26import base64
27import threading
28import pooler
29from msf_doc_import import GENERIC_MESSAGE
30from spreadsheet_xml.spreadsheet_xml_write import SpreadsheetCreator
31from spreadsheet_xml.spreadsheet_xml import SpreadsheetXML
32from msf_doc_import.wizard import COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT as columns_header_for_product_line_import
33from msf_doc_import.wizard import COLUMNS_FOR_PRODUCT_LINE_IMPORT as columns_for_product_line_import
34
35
36class product_mass_update(osv.osv):
37 _name = 'product.mass.update'
38 _description = 'Product Mass Update'
39
40 _order = 'id desc'
41
42 def _get_percent_completed(self, cr, uid, ids, field_names, arg, context=None):
43 if context is None:
44 context = {}
45
46 upd_progress_obj = self.pool.get('product.mass.update.progressbar')
47
48 res = {}
49 for p_mass_upd in self.browse(cr, uid, ids, fields_to_fetch=['state'], context=context):
50 if p_mass_upd.state == 'done':
51 res[p_mass_upd.id] = 100
52 else:
53 upd_progress_ids = upd_progress_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context)
54 if upd_progress_ids:
55 res[p_mass_upd.id] = round(upd_progress_obj.browse(cr, uid, upd_progress_ids[0], context=context).percent_completed, 0) or 0
56
57 return res
58
59 _columns = {
60 'name': fields.char(size=64, string='Update Reference'),
61 'state': fields.selection(selection=[('draft', 'Draft'), ('in_progress', 'In Progress'), ('error', 'Error'), ('done', 'Done')], string='Status', readonly=True),
62 'date_done': fields.datetime(string='Date of the update'),
63 'user_id': fields.many2one('res.users', string='User who Updated', readonly=True),
64 'import_in_progress': fields.boolean(string='Import in progress'),
65 'percent_completed': fields.function(_get_percent_completed, method=True, string='% completed', type='integer', readonly=True),
66 'message': fields.text(string='Message', readonly=True),
67 'product_ids': fields.many2many('product.product', 'prod_mass_update_product_rel', 'product_id',
68 'prod_mass_update_id', string="Product selection", order_by="default_code",
69 domain=[('expected_prod_creator', '=', 'True'), '|', ('active', '=', True), ('active', '=', False)]),
70 'not_deactivated_product_ids': fields.one2many('product.mass.update.errors', 'p_mass_upd_id',
71 string="Product(s) that can not be deactivated"),
72 'has_not_deactivable': fields.boolean(string='Document has non-deactivable product(s)', readonly=True),
73 # Fields
74 'active_product': fields.selection(selection=[('no', 'No'), ('yes', 'Yes')], string='Active', help="If the active field is set to False, it allows to hide the nomenclature without removing it."),
75 'dangerous_goods': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Dangerous Goods'),
76 'heat_sensitive_item': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Temperature sensitive item'),
77 'single_use': fields.selection(selection=[('no', 'No'), ('yes', 'Yes'), ('no_know', 'tbd')], string='Single Use'),
78 'short_shelf_life': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Short Shelf Life'),
79 'alert_time': fields.char(string='Product Alert Time', size=32, help="The number of months after which an alert should be notified about the production lot."),
80 'life_time': fields.char('Product Life Time', size=32, help='The number of months before a production lot may become dangerous and should not be consumed.'),
81 'use_time': fields.char('Product Use Time', size=32, help='The number of months before a production lot starts deteriorating without becoming dangerous.'),
82 'procure_delay': fields.char(string='Procurement Lead Time', size=32,
83 help='It\'s the default time to procure this product. This lead time will be used on the Order cycle procurement computation'),
84 'procure_method': fields.selection([('make_to_stock', 'Make to Stock'), ('make_to_order', 'Make to Order')], 'Procurement Method',
85 help="If you encode manually a Procurement, you probably want to use a make to order method."),
86 'product_state': fields.selection([('valid', 'Valid'), ('phase_out', 'Phase Out'), ('stopped', 'Stopped'), ('archived', 'Archived'), ('status1', 'Status 1'), ('status2', 'Status 2'), ], 'Status', help="Tells the user if he can use the product or not."),
87 'sterilized': fields.selection(selection=[('no', 'No'), ('yes', 'Yes'), ('no_know', 'tbd')], string='Sterile'),
88 'supply_method': fields.selection([('produce', 'Produce'), ('buy', 'Buy')], 'Supply Method',
89 help="Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."),
90 'seller_id': fields.many2one('res.partner', 'Default Partner'),
91 'property_account_income': fields.many2one('account.account', string='Income Account',
92 help='This account will be used for invoices instead of the default one to value sales for the current product'),
93 'property_account_expense': fields.many2one('account.account', string='Expense Account',
94 help='This account will be used for invoices instead of the default one to value expenses for the current product'),
95 'empty_status': fields.boolean(string='Set Status as empty'),
96 'empty_inc_account': fields.boolean(string='Set Income Account as empty'),
97 'empty_exp_account': fields.boolean(string='Set Expense Account as empty'),
98 }
99
100 _defaults = {
101 'state': 'draft',
102 'import_in_progress': False,
103 'message': '',
104 'active_product': '',
105 'dangerous_goods': '',
106 'heat_sensitive_item': '',
107 'single_use': '',
108 'short_shelf_life': '',
109 'procure_method': '',
110 'sterilized': '',
111 'supply_method': '',
112 }
113
114 def write(self, cr, user, ids, vals, context=None):
115 '''
116 override write method
117 '''
118 if context is None:
119 context = {}
120
121 if context.get('button') == 'dummy' and '__last_update' in context:
122 del context['__last_update']
123
124 if not ids:
125 return True
126
127 if 'empty_status' in vals and vals['empty_status']:
128 vals['product_state'] = ''
129 if 'empty_inc_account' in vals and vals['empty_inc_account']:
130 vals['property_account_income'] = False
131 if 'empty_exp_account' in vals and vals['empty_exp_account']:
132 vals['property_account_expense'] = False
133
134 return super(product_mass_update, self).write(cr, user, ids, vals, context)
135
136 def copy(self, cr, uid, id, default=None, context=None):
137 if context is None:
138 context = {}
139
140 if default is None:
141 default = {}
142
143 default.update({
144 'user_id': False,
145 'date_done': False,
146 'message': '',
147 'not_deactivated_product_ids': [(6, 0, [])],
148 'has_not_deactivable': False,
149 'empty_status': False,
150 'empty_inc_account': False,
151 'empty_exp_account': False,
152 })
153
154 return super(product_mass_update, self).copy(cr, uid, id, default=default, context=context)
155
156 def onchange_status_check(self, cr, uid, ids, empty_status):
157 if empty_status:
158 return {'value': {'product_state': ''}}
159 return {'value': {}}
160
161 def onchange_inc_check(self, cr, uid, ids, empty_inc_account):
162 if empty_inc_account:
163 return {'value': {'property_account_income': False}}
164 return {'value': {}}
165
166 def onchange_exp_check(self, cr, uid, ids, empty_exp_account):
167 if empty_exp_account:
168 return {'value': {'property_account_expense': False}}
169 return {'value': {}}
170
171 def cancel_update(self, cr, uid, ids, context=None):
172 '''
173 Delete the current Product Mass Update
174 '''
175 if context is None:
176 context = {}
177
178 self.unlink(cr, uid, ids, context=context)
179
180 return {
181 'type': 'ir.actions.act_window',
182 'res_model': 'product.mass.update',
183 'view_type': 'form',
184 'view_mode': 'tree,form',
185 'target': 'crush',
186 }
187
188 def dummy(self, cr, uid, ids, context=None):
189 """
190 This button is only for updating the view.
191 """
192 if isinstance(ids, (int, long)):
193 ids = [ids]
194
195 return True
196
197 def reset_update(self, cr, uid, ids, context=None):
198 """
199 This button is only for resetting the update
200 """
201 if context is None:
202 context = {}
203
204 if isinstance(ids, (int, long)):
205 ids = [ids]
206
207 # Unlink existing errors
208 upd_errors_obj = self.pool.get('product.mass.update.errors')
209 errors_ids = upd_errors_obj.search(cr, uid, [('p_mass_upd_id', 'in', ids)], context=context)
210 upd_errors_obj.unlink(cr, uid, errors_ids, context=context)
211
212 vals = {
213 'state': 'draft',
214 'message': '',
215 'has_not_deactivable': False,
216 }
217 self.write(cr, uid, ids, vals, context=context)
218
219 return True
220
221 def launch_update(self, cr, uid, ids, context=None):
222 '''
223 Launch a thread for update
224 '''
225 if not ids:
226 return True
227
228 data_obj = self.pool.get('ir.model.data')
229 p_state_obj = self.pool.get('product.status')
230
231 p_mass_upd = self.browse(cr, uid, ids[0], context=context)
232 if not p_mass_upd.product_ids:
233 raise osv.except_osv(_('Error'), _('You can not apply an update on no products.'))
234
235 vals = {}
236 if p_mass_upd.dangerous_goods:
237 vals.update({'dangerous_goods': p_mass_upd.dangerous_goods})
238 if p_mass_upd.heat_sensitive_item:
239 heat_attr = p_mass_upd.heat_sensitive_item == 'True' and 'heat_yes' or p_mass_upd.heat_sensitive_item == 'False' and 'heat_no' \
240 or p_mass_upd.heat_sensitive_item == 'tbd' and 'heat_no_know' or False
241 heat_id = data_obj.get_object_reference(cr, uid, 'product_attributes', heat_attr)[1]
242 if heat_id:
243 vals.update({'heat_sensitive_item': heat_id})
244 if p_mass_upd.short_shelf_life:
245 vals.update({'short_shelf_life': p_mass_upd.short_shelf_life})
246 if p_mass_upd.alert_time:
247 try:
248 alert_time = int(p_mass_upd.alert_time)
249 vals.update({'alert_time': alert_time})
250 except ValueError:
251 raise osv.except_osv(_('Error'), _('Alert Time must be an integer.'))
252 if p_mass_upd.life_time:
253 try:
254 life_time = int(p_mass_upd.life_time)
255 vals.update({'life_time': life_time})
256 except ValueError:
257 raise osv.except_osv(_('Error'), _('Life Time must be an integer.'))
258 if p_mass_upd.use_time:
259 try:
260 use_time = int(p_mass_upd.use_time)
261 vals.update({'use_time': use_time})
262 except ValueError:
263 raise osv.except_osv(_('Error'), _('Use Time must be an integer.'))
264 if p_mass_upd.procure_delay:
265 try:
266 procure_delay = float(p_mass_upd.procure_delay)
267 vals.update({'procure_delay': procure_delay})
268 except ValueError:
269 raise osv.except_osv(_('Error'), _('Procurement Lead Time must be a float.'))
270 if p_mass_upd.procure_method:
271 vals.update({'procure_method': p_mass_upd.procure_method})
272 if p_mass_upd.single_use:
273 vals.update({'single_use': p_mass_upd.single_use})
274 if p_mass_upd.product_state:
275 p_state_ids = p_state_obj.search(cr, uid, [('code', '=', p_mass_upd.product_state)], context=context)
276 if p_state_ids:
277 vals.update({'state': p_state_ids[0]})
278 elif p_mass_upd.empty_status:
279 vals.update({'state': False})
280 if p_mass_upd.sterilized:
281 vals.update({'sterilized': p_mass_upd.sterilized})
282 if p_mass_upd.supply_method:
283 vals.update({'supply_method': p_mass_upd.supply_method})
284 if p_mass_upd.property_account_income:
285 vals.update({'property_account_income': p_mass_upd.property_account_income.id})
286 elif p_mass_upd.empty_inc_account:
287 vals.update({'property_account_income': False})
288 if p_mass_upd.property_account_expense:
289 vals.update({'property_account_expense': p_mass_upd.property_account_expense.id})
290 elif p_mass_upd.empty_exp_account:
291 vals.update({'property_account_expense': False})
292
293 thread = threading.Thread(target=self.apply_update, args=(cr, uid, ids, vals, context))
294 thread.start()
295
296 msg_to_return = _("Update in progress, please leave this window open and press the button 'Update' when you think that the update is done. Otherwise, you can continue to use Unifield.")
297 return self.write(cr, uid, ids, {'message': msg_to_return, 'state': 'in_progress'}, context=context)
298
299 def apply_update(self, cr, uid, ids, vals, context=None):
300 '''
301 Apply the current Product Mass Update
302 '''
303 if context is None:
304 context = {}
305
306 # New cursor
307 cr = pooler.get_db(cr.dbname).cursor()
308
309 prod_obj = self.pool.get('product.product')
310 p_suppinfo_obj = self.pool.get('product.supplierinfo')
311 upd_progress_obj = self.pool.get('product.mass.update.progressbar')
312 upd_errors_obj = self.pool.get('product.mass.update.errors')
313
314 p_mass_upd = self.browse(cr, uid, ids[0], context=context)
315 try:
316 # For the progress bar
317 upd_progress_ids = upd_progress_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context)
318 if upd_progress_ids:
319 upd_progress_id = upd_progress_ids[0]
320 else:
321 upd_progress_id = upd_progress_obj.create(cr, uid, {'p_mass_upd_id': p_mass_upd.id}, context=context)
322
323 num_prod = 0
324 not_deactivated = []
325 for prod in p_mass_upd.product_ids:
326 # Check procurement method
327 if p_mass_upd.procure_method and prod.type in ('consu', 'service', 'service_recep') and \
328 p_mass_upd.procure_method != 'make_to_order':
329 raise osv.except_osv(_('Error'), _('You must select on order procurement method for %s products.')
330 % (prod.type == 'consu' and 'Non-stockable' or 'Service'))
331 # Deactivation
332 if p_mass_upd.seller_id and not p_suppinfo_obj.search(cr, uid, [('product_id', '=', prod.id), ('name', '=', p_mass_upd.seller_id.id)], context=context):
333 p_suppinfo_obj.create(cr, uid, {'product_id': prod.id, 'name': p_mass_upd.seller_id.id, 'sequence': 1}, context=context)
334 if p_mass_upd.active_product:
335 if not prod.active and p_mass_upd.active_product == 'yes':
336 prod_obj.reactivate_product(cr, uid, [prod.id], context=context)
337 elif prod.active and p_mass_upd.active_product == 'no':
338 deactivated = prod_obj.deactivate_product(cr, uid, [prod.id], context=context)
339 if deactivated != True: # If doesn't return True, the product has not been deactivated
340 not_deactivated.append(deactivated.get('res_id'))
341 num_prod += 1
342 percent_completed = float(num_prod) / float(len(p_mass_upd.product_ids)) * 100.0
343 upd_progress_obj.write(cr, uid, upd_progress_id, {'percent_completed': percent_completed}, context=context)
344
345 if not_deactivated:
346 cr.rollback() # Rollback deactivation and product seller creation
347 for wiz_prod_error in self.pool.get('product.deactivation.error').browse(cr, uid, not_deactivated):
348 err_vals = {
349 'p_mass_upd_id': p_mass_upd.id,
350 'product_id': wiz_prod_error.product_id.id,
351 'stock_exist': wiz_prod_error.stock_exist,
352 'open_documents': wiz_prod_error.error_lines and ', '.join([x.doc_ref for x in wiz_prod_error.error_lines if x.doc_ref]) or '',
353 }
354 upd_errors_obj.create(cr, uid, err_vals, context=context)
355
356 p_mass_upd_vals = {
357 'has_not_deactivable': True,
358 'message': _('Some products could not be deactivated. No product will be changed until all of them can be deactivated. Please check the corresponding tab.'),
359 'state': 'error',
360 }
361 self.write(cr, uid, p_mass_upd.id, p_mass_upd_vals, context=context)
362 else:
363 prod_obj.write(cr, uid, [prod.id for prod in p_mass_upd.product_ids], vals, context=context)
364 user_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).id
365
366 # Unlink existing errors
367 errors_ids = upd_errors_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context)
368 upd_errors_obj.unlink(cr, uid, errors_ids, context=context)
369
370 p_mass_upd_vals = {
371 'has_not_deactivable': False,
372 'date_done': time.strftime('%Y-%m-%d %H:%M'),
373 'user_id': user_id,
374 'state': 'done',
375 }
376 self.write(cr, uid, p_mass_upd.id, p_mass_upd_vals, context=context)
377 except Exception as e:
378 err = _('An error has occured during the update:\n%s') % tools.ustr(e.value or e)
379 self.write(cr, uid, p_mass_upd.id, {'state': 'error', 'message': err}, context=context)
380 finally:
381 cr.commit()
382 cr.close(True)
383
384 return True
385
386 def wizard_import_products(self, cr, uid, ids, context=None):
387 '''
388 Launches the wizard to import lines from a file
389 '''
390 if context is None:
391 context = {}
392 if isinstance(ids, (int, long)):
393 ids = [ids]
394 context.update({'active_id': ids[0]})
395 columns_header = [(_(f[0]), f[1]) for f in columns_header_for_product_line_import]
396 default_template = SpreadsheetCreator('Template of import', columns_header, [])
397 file = base64.encodestring(default_template.get_xml(default_filters=['decode.utf8']))
398 export_id = self.pool.get('wizard.import.product.line').create(cr, uid, {
399 'file': file,
400 'filename_template': 'template.xls',
401 'filename': 'Lines_Not_Imported.xls',
402 'message': """%s %s""" % (_(GENERIC_MESSAGE), ', '.join([_(f) for f in columns_for_product_line_import]), ),
403 'product_mass_upd_id': ids[0],
404 'state': 'draft',
405 }, context)
406
407 return {
408 'type': 'ir.actions.act_window',
409 'res_model': 'wizard.import.product.line',
410 'res_id': export_id,
411 'view_type': 'form',
412 'view_mode': 'form',
413 'target': 'crush',
414 'context': context,
415 }
416
417 def export_product_errors(self, cr, uid, ids, context=None):
418 return {
419 'type': 'ir.actions.report.xml',
420 'report_name': 'product_mass_update_export_xls',
421 'datas': {'ids': ids, 'target_filename': _('Product Mass Update Errors')},
422 'nodestroy': True,
423 'context': context,
424 }
425
426
427product_mass_update()
428
429
430class product_mass_update_progressbar(osv.osv_memory):
431 _name = 'product.mass.update.progressbar'
432 _description = 'Product Mass Update Progress Bar'
433
434 _columns = {
435 'p_mass_upd_id': fields.many2one('product.mass.update', 'Product Mass Update'),
436 'percent_completed': fields.integer(string='% completed', readonly=True),
437 }
438
439 _default = {
440 'p_mass_upd_id': False,
441 'percent_completed': 0,
442 }
443
444
445product_mass_update_progressbar()
446
447
448class product_mass_update_errors(osv.osv):
449 _name = 'product.mass.update.errors'
450 _description = 'Product Mass Update Errors'
451
452 _order = 'product_id'
453
454 _columns = {
455 'p_mass_upd_id': fields.many2one('product.mass.update', 'Product Mass Update', ondelete='cascade'),
456 'product_id': fields.many2one('product.product', string='Product', required=True),
457 'stock_exist': fields.boolean(string='Stock Exist'),
458 'open_documents': fields.char(string='Open Documents', size=256),
459 }
460
461 _default = {
462 'stock_exist': False,
463 'open_documents': '',
464 }
465
466
467product_mass_update_errors()
0468
=== added file 'bin/addons/product/wizard/product_mass_update_view.xml'
--- bin/addons/product/wizard/product_mass_update_view.xml 1970-01-01 00:00:00 +0000
+++ bin/addons/product/wizard/product_mass_update_view.xml 2019-04-15 13:13:32 +0000
@@ -0,0 +1,139 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <!-- Views -->
5 <record id="view_product_mass_update_form" model="ir.ui.view">
6 <field name="name">product.mass.update.form</field>
7 <field name="model">product.mass.update</field>
8 <field name="type">form</field>
9 <field name="arch" type="xml">
10 <form string="Product Mass Update" hide_delete_button="1" >
11 <field name="name" attrs="{'readonly': [('state', '!=', 'draft')]}" />
12 <group string=" New Data " colspan="4" attrs="{'readonly': [('state', '!=', 'draft')]}">
13 <field name="active_product" />
14 <field name="dangerous_goods" />
15 <field name="heat_sensitive_item" />
16 <field name="single_use" />
17 <field name="short_shelf_life" />
18 <field name="alert_time" />
19 <field name="life_time" />
20 <field name="use_time" />
21 <field name="procure_delay" />
22 <field name="procure_method" />
23 <group colspan="2">
24 <field name="product_state" attrs="{'readonly':['|', ('empty_status', '=', True), ('state', '!=', 'draft')]}" />
25 <field name="empty_status" on_change="onchange_status_check(empty_status)" />
26 </group>
27 <field name="sterilized" />
28 <field name="supply_method" />
29 <field name="seller_id" />
30 <group colspan="2">
31 <field name="property_account_income" attrs="{'readonly':['|', ('empty_inc_account', '=', True), ('state', '!=', 'draft')]}"
32 domain="[('type','&lt;&gt;','view'), ('type','&lt;&gt;','consolidation'),
33 ('user_type_code', 'in', ['expense', 'income', 'asset']),
34 ('user_type_name', '&lt;&gt;', 'Extra-accounting expenses')]"/>
35 <field name="empty_inc_account" on_change="onchange_inc_check(empty_inc_account)" />
36 </group>
37 <group colspan="2">
38 <field name="property_account_expense" attrs="{'readonly':['|', ('empty_exp_account', '=', True), ('state', '!=', 'draft')]}"
39 domain="[('type','&lt;&gt;','view'), ('type','&lt;&gt;','consolidation'),
40 ('user_type_code', 'in', ['expense', 'income', 'asset']),
41 ('user_type_name', '&lt;&gt;', 'Extra-accounting expenses')]"/>
42 <field name="empty_exp_account" on_change="onchange_exp_check(empty_exp_account)" />
43 </group>
44 </group>
45 <field name="has_not_deactivable" invisible="1" />
46 <group colspan="4" attrs="{'invisible':[('has_not_deactivable', '=', False), ('state', 'not in', ['in_progress', 'error'])]}">
47 <html>
48 <style>
49 #prod_mass_upd_error p, #prod_mass_upd_error span, #prod_mass_upd_error textarea {
50 text-align: center;
51 v-align: middle;
52 color: red;
53 font-weight: bold;
54 font-size: 1.2em;
55 resize: None;
56 }
57 </style>
58 <div id="prod_mass_upd_error">
59 <field name="message" colspan="4" nolabel="1" />
60 </div>
61 </html>
62 </group>
63 <group colspan="4">
64 <field name="percent_completed" widget="progressbar" colspan="2" attrs="{'invisible':[('state', 'not in', ['in_progress', 'done'])]}"/>
65 <button name="dummy" string="Update" icon="gtk-execute" colspan="2" type="object" attrs="{'invisible':[('state', '!=', 'in_progress')]}"/>
66 <button name="reset_update" string="Reset Update" icon="gtk-undo" colspan="2" type="object" attrs="{'invisible':[('state', '!=', 'error')]}"/>
67 </group>
68 <notebook>
69 <page string="Products">
70 <group name="import" string=" Import Lines " colspan="4" attrs="{'invisible':[('state', '!=', 'draft')]}">
71 <button name="wizard_import_products" string="Import products" icon="gtk-dnd" colspan="2" type="object"/>
72 </group>
73 <field name="product_ids" colspan="4" nolabel="1" attrs="{'readonly': [('state', '!=', 'draft')]}" domain="[('active', 'in', ['t', 'f'])]">
74 <tree string="Products" hide_edit_button="1" colors="grey:active == False">
75 <field name="default_code" />
76 <field name="name" />
77 <field name="active" invisible="1" />
78 </tree>
79 </field>
80 </page>
81 <page string="Non-Deactivable Products" attrs="{'invisible': [('has_not_deactivable', '=', False)]}">
82 <button name="export_product_errors" string="Export Product List" icon="gtk-execute" colspan="4" type="object" />
83 <field name="not_deactivated_product_ids" colspan="4" nolabel="1" readonly="1">
84 <tree string="Products" noteditable="1">
85 <field name="product_id" />
86 <field name="stock_exist" />
87 <field name="open_documents" />
88 </tree>
89 </field>
90 </page>
91 </notebook>
92 <group colspan="4">
93 <field name="state" colspan="2" />
94 <button name="cancel_update" string="Delete Update" icon="gtk-cancel" colspan="1" type="object" attrs="{'invisible':[('state', '!=', 'draft')]}"/>
95 <button name="launch_update" string="Apply Update" icon="gtk-go-forward" colspan="1" type="object" attrs="{'invisible': [('state', '!=', 'draft')]}"/>
96 </group>
97 </form>
98 </field>
99 </record>
100
101 <record id="view_product_mass_update_tree" model="ir.ui.view">
102 <field name="name">product.mass.update.tree</field>
103 <field name="model">product.mass.update</field>
104 <field name="type">tree</field>
105 <field name="arch" type="xml">
106 <tree string="Product Mass Update" noteditable="state!='draft'" hide_delete_button="1" colors="blue:state in ('draft');red:state in ('error')">
107 <field name="name"/>
108 <field name="product_ids"/>
109 <field name="date_done"/>
110 <field name="user_id"/>
111 <field name="state"/>
112 </tree>
113 </field>
114 </record>
115
116 <record id="view_product_mass_update_search" model="ir.ui.view">
117 <field name="name">product.mass.update.search</field>
118 <field name="model">product.mass.update</field>
119 <field name="type">search</field>
120 <field name="arch" type="xml">
121 <search string="Product Mass Update">
122 <field name="name"/>
123 <field name="date_done"/>
124 <field name="user_id"/>
125 <field name="state"/>
126 </search>
127 </field>
128 </record>
129
130 <!-- Menu -->
131 <record id="previous_mass_update_action" model="ir.actions.act_window">
132 <field name="name">Product Mass Update</field>
133 <field name="res_model">product.mass.update</field>
134 <field name="view_type">form</field>
135 <field name="view_id" ref="view_product_mass_update_tree"/>
136 <field name="context">{}</field>
137 </record>
138 </data>
139</openerp>
0140
=== modified file 'bin/addons/product_attributes/product_attributes_view.xml'
--- bin/addons/product_attributes/product_attributes_view.xml 2019-02-11 10:03:13 +0000
+++ bin/addons/product_attributes/product_attributes_view.xml 2019-04-15 13:13:32 +0000
@@ -11,7 +11,7 @@
11 <field name="arch" type="xml">11 <field name="arch" type="xml">
12 <data>12 <data>
13 <xpath expr="/tree" position="replace">13 <xpath expr="/tree" position="replace">
14 <tree colors="red:virtual_available&lt;0;blue:virtual_available&gt;=0 and state in ('draft', 'end', 'obsolete');black:virtual_available&gt;=0 and state not in ('draft', 'end', 'obsolete')" string="Products">14 <tree colors="red:virtual_available&lt;0;blue:virtual_available&gt;=0 and state in ('draft', 'end', 'obsolete');grey:active == False" string="Products">
15 <field name="default_code" string="Code"/>15 <field name="default_code" string="Code"/>
16 <field name="name" string="Description"/>16 <field name="name" string="Description"/>
17 <field name="categ_id" invisible="1"/>17 <field name="categ_id" invisible="1"/>
@@ -28,6 +28,7 @@
28 <field name="international_status"/>28 <field name="international_status"/>
29 <field name="uf_create_date" string="Creation"/>29 <field name="uf_create_date" string="Creation"/>
30 <field name="uf_write_date" string="Modification"/>30 <field name="uf_write_date" string="Modification"/>
31 <field name="active" invisible="1"/>
31 </tree>32 </tree>
32 </xpath>33 </xpath>
33 </data>34 </data>
@@ -821,5 +822,9 @@
821 </field>822 </field>
822 </record>823 </record>
823824
825 <!-- Product Mass Update Menu -->
826 <menuitem id="product.parent_product_mass_update" parent="product_attributes.menu_main_product" name="Products Update" />
827 <menuitem action="product.previous_mass_update_action" id="menu_import_request" sequence="1" parent="product.parent_product_mass_update" />
828
824 </data>829 </data>
825</openerp>830</openerp>

Subscribers

People subscribed via source and target branches