Merge lp:~dorian-kemps/unifield-server/US-1080 into lp:unifield-server
- US-1080
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
UniField Reviewer Team | Pending | ||
Review via email: mp+360164@code.launchpad.net |
Commit message
Description of the change
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
1 | === modified file 'bin/addons/msf_doc_import/__openerp__.py' | |||
2 | --- bin/addons/msf_doc_import/__openerp__.py 2018-04-18 13:37:31 +0000 | |||
3 | +++ bin/addons/msf_doc_import/__openerp__.py 2019-04-15 13:13:32 +0000 | |||
4 | @@ -61,6 +61,7 @@ | |||
5 | 61 | 'wizard/wizard_import_threshold_value_line.xml', | 61 | 'wizard/wizard_import_threshold_value_line.xml', |
6 | 62 | 'wizard/wizard_import_stock_warehouse_order_point_line.xml', | 62 | 'wizard/wizard_import_stock_warehouse_order_point_line.xml', |
7 | 63 | 'wizard/wizard_import_product_list.xml', | 63 | 'wizard/wizard_import_product_list.xml', |
8 | 64 | 'wizard/wizard_import_product_line_view.xml', | ||
9 | 64 | 'wizard/wizard_import_supplier_catalogue.xml', | 65 | 'wizard/wizard_import_supplier_catalogue.xml', |
10 | 65 | 'wizard/wizard_po_simulation_screen_view.xml', | 66 | 'wizard/wizard_po_simulation_screen_view.xml', |
11 | 66 | 'wizard/wizard_in_simulation_screen_view.xml', | 67 | 'wizard/wizard_in_simulation_screen_view.xml', |
12 | 67 | 68 | ||
13 | === modified file 'bin/addons/msf_doc_import/wizard/__init__.py' | |||
14 | --- bin/addons/msf_doc_import/wizard/__init__.py 2018-07-04 09:34:39 +0000 | |||
15 | +++ bin/addons/msf_doc_import/wizard/__init__.py 2019-04-15 13:13:32 +0000 | |||
16 | @@ -108,6 +108,10 @@ | |||
17 | 108 | (_('Product Code'), 'string'), (_('Product Description'), 'string'), (_('Comment'), 'string')] | 108 | (_('Product Code'), 'string'), (_('Product Description'), 'string'), (_('Comment'), 'string')] |
18 | 109 | PRODUCT_LIST_COLUMNS_FOR_IMPORT = [x for (x,y) in PRODUCT_LIST_COLUMNS_HEADER_FOR_IMPORT] | 109 | PRODUCT_LIST_COLUMNS_FOR_IMPORT = [x for (x,y) in PRODUCT_LIST_COLUMNS_HEADER_FOR_IMPORT] |
19 | 110 | 110 | ||
20 | 111 | COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT = [ | ||
21 | 112 | (_('Product Code'), 'string')] | ||
22 | 113 | COLUMNS_FOR_PRODUCT_LINE_IMPORT = [x for (x, y) in COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT] | ||
23 | 114 | |||
24 | 111 | ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT = [ | 115 | ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT = [ |
25 | 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')] |
26 | 113 | ACCOUNT_INVOICE_COLUMNS_FOR_IMPORT = [x for (x,y) in ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT] | 117 | ACCOUNT_INVOICE_COLUMNS_FOR_IMPORT = [x for (x,y) in ACCOUNT_INVOICE_COLUMNS_HEADER_FOR_IMPORT] |
27 | @@ -153,6 +157,7 @@ | |||
28 | 153 | import wizard_import_threshold_value_line | 157 | import wizard_import_threshold_value_line |
29 | 154 | import wizard_import_stock_warehouse_order_point_line | 158 | import wizard_import_stock_warehouse_order_point_line |
30 | 155 | import wizard_import_product_list | 159 | import wizard_import_product_list |
31 | 160 | import wizard_import_product_line | ||
32 | 156 | import wizard_import_supplier_catalogue | 161 | import wizard_import_supplier_catalogue |
33 | 157 | import wizard_po_simulation_screen | 162 | import wizard_po_simulation_screen |
34 | 158 | import wizard_in_simulation_screen | 163 | import wizard_in_simulation_screen |
35 | 159 | 164 | ||
36 | === added file 'bin/addons/msf_doc_import/wizard/wizard_import_product_line.py' | |||
37 | --- bin/addons/msf_doc_import/wizard/wizard_import_product_line.py 1970-01-01 00:00:00 +0000 | |||
38 | +++ bin/addons/msf_doc_import/wizard/wizard_import_product_line.py 2019-04-15 13:13:32 +0000 | |||
39 | @@ -0,0 +1,313 @@ | |||
40 | 1 | # -*- coding: utf-8 -*- | ||
41 | 2 | ############################################################################## | ||
42 | 3 | # | ||
43 | 4 | # OpenERP, Open Source Management Solution | ||
44 | 5 | # Copyright (C) 2011 MSF, TeMPO Consulting. | ||
45 | 6 | # | ||
46 | 7 | # This program is free software: you can redistribute it and/or modify | ||
47 | 8 | # it under the terms of the GNU Affero General Public License as | ||
48 | 9 | # published by the Free Software Foundation, either version 3 of the | ||
49 | 10 | # License, or (at your option) any later version. | ||
50 | 11 | # | ||
51 | 12 | # This program is distributed in the hope that it will be useful, | ||
52 | 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
53 | 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
54 | 15 | # GNU Affero General Public License for more details. | ||
55 | 16 | # | ||
56 | 17 | # You should have received a copy of the GNU Affero General Public License | ||
57 | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
58 | 19 | # | ||
59 | 20 | ############################################################################## | ||
60 | 21 | import threading | ||
61 | 22 | import pooler | ||
62 | 23 | from osv import osv, fields | ||
63 | 24 | from tools.translate import _ | ||
64 | 25 | import base64 | ||
65 | 26 | from spreadsheet_xml.spreadsheet_xml import SpreadsheetXML | ||
66 | 27 | import time | ||
67 | 28 | import tools | ||
68 | 29 | from msf_doc_import import check_line | ||
69 | 30 | from msf_doc_import.wizard import COLUMNS_FOR_PRODUCT_LINE_IMPORT as columns_for_product_line_import | ||
70 | 31 | |||
71 | 32 | |||
72 | 33 | class wizard_import_product_line(osv.osv_memory): | ||
73 | 34 | _name = 'wizard.import.product.line' | ||
74 | 35 | _description = 'Import Products data from Excel sheet' | ||
75 | 36 | |||
76 | 37 | def get_bool_values(self, cr, uid, ids, fields, arg, context=None): | ||
77 | 38 | res = {} | ||
78 | 39 | if isinstance(ids, (int, long)): | ||
79 | 40 | ids = [ids] | ||
80 | 41 | for obj in self.browse(cr, uid, ids, context=context): | ||
81 | 42 | res[obj.id] = False | ||
82 | 43 | if obj.message: | ||
83 | 44 | res[obj.id] = True | ||
84 | 45 | return res | ||
85 | 46 | |||
86 | 47 | _columns = { | ||
87 | 48 | 'file': fields.binary(string='File to import', required=True, readonly=True, states={'draft': [('readonly', False)]}), | ||
88 | 49 | 'message': fields.text(string='Message', readonly=True), | ||
89 | 50 | 'product_mass_upd_id': fields.many2one('product.mass.update', string='Product Mass Update', required=True), | ||
90 | 51 | 'data': fields.binary('Lines with errors'), | ||
91 | 52 | 'filename': fields.char('Lines with errors', size=256), | ||
92 | 53 | 'filename_template': fields.char('Templates', size=256), | ||
93 | 54 | 'import_error_ok': fields.function(get_bool_values, method=True, readonly=True, type="boolean", string="Error at import", store=False), | ||
94 | 55 | 'percent_completed': fields.integer('% completed', readonly=True), | ||
95 | 56 | 'state': fields.selection([('draft', 'Draft'), ('in_progress', 'In Progress'), ('done', 'Done')], | ||
96 | 57 | string="State", required=True, readonly=True), | ||
97 | 58 | } | ||
98 | 59 | |||
99 | 60 | def _import(self, dbname, uid, ids, context=None): | ||
100 | 61 | ''' | ||
101 | 62 | Import file | ||
102 | 63 | ''' | ||
103 | 64 | cr = pooler.get_db(dbname).cursor() | ||
104 | 65 | |||
105 | 66 | if context is None: | ||
106 | 67 | context = {} | ||
107 | 68 | wiz_common_import = self.pool.get('wiz.common.import') | ||
108 | 69 | context.update({'import_in_progress': True, 'noraise': True}) | ||
109 | 70 | start_time = time.time() | ||
110 | 71 | obj_data = self.pool.get('ir.model.data') | ||
111 | 72 | product_obj = self.pool.get('product.product') | ||
112 | 73 | p_mass_upd_obj = self.pool.get('product.mass.update') | ||
113 | 74 | line_with_error = [] | ||
114 | 75 | |||
115 | 76 | # Get the expected product creator id | ||
116 | 77 | instance_level = self.pool.get('res.users').browse(cr, uid, uid).company_id.instance_id.level | ||
117 | 78 | prod_creator_id = False | ||
118 | 79 | if instance_level == 'section': | ||
119 | 80 | prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_3')[1] | ||
120 | 81 | elif instance_level == 'coordo': | ||
121 | 82 | prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_4')[1] | ||
122 | 83 | |||
123 | 84 | for wiz_browse in self.browse(cr, uid, ids, context): | ||
124 | 85 | p_mass_upd_id = wiz_browse.product_mass_upd_id.id | ||
125 | 86 | try: | ||
126 | 87 | product_ids = [prod.id for prod in wiz_browse.product_mass_upd_id.product_ids] | ||
127 | 88 | |||
128 | 89 | ignore_lines, complete_lines, lines_to_correct = 0, 0, 0 | ||
129 | 90 | line_ignored_num = [] | ||
130 | 91 | error_list = [] | ||
131 | 92 | error_log = '' | ||
132 | 93 | message = '' | ||
133 | 94 | line_num = 0 | ||
134 | 95 | header_index = context['header_index'] | ||
135 | 96 | mandatory_col_count = 1 # ignore Status column | ||
136 | 97 | |||
137 | 98 | file_obj = SpreadsheetXML(xmlstring=base64.decodestring(wiz_browse.file)) | ||
138 | 99 | rows = file_obj.getRows() | ||
139 | 100 | |||
140 | 101 | header_row = rows.next() | ||
141 | 102 | header_error = False | ||
142 | 103 | |||
143 | 104 | if len(header_row) != mandatory_col_count and len(header_row) != len(columns_for_product_line_import): | ||
144 | 105 | header_row = False | ||
145 | 106 | header_error = True | ||
146 | 107 | error_list.append(_("\n\tNumber of columns is not equal to %s") % len(columns_for_product_line_import)) | ||
147 | 108 | |||
148 | 109 | if header_row: | ||
149 | 110 | for i, h_name in enumerate(columns_for_product_line_import): | ||
150 | 111 | # To be able to import without Status column | ||
151 | 112 | if h_name != 'state' or len(header_row) != mandatory_col_count: | ||
152 | 113 | tr_header_row = _(tools.ustr(header_row[i])) | ||
153 | 114 | tr_h_name = _(h_name) | ||
154 | 115 | if len(header_row) > i and tr_header_row != tr_h_name: | ||
155 | 116 | header_error = True | ||
156 | 117 | if tr_header_row.upper() == tr_h_name.upper(): | ||
157 | 118 | error_list.append(_("\n\tPlease check spelling on column '%s'.") % tr_header_row) | ||
158 | 119 | |||
159 | 120 | if header_error: | ||
160 | 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]) | ||
161 | 122 | error_list.append(msg) | ||
162 | 123 | msg = _("\n\tPlease ensure that all these columns are present and in this exact order.") | ||
163 | 124 | error_list.append(msg) | ||
164 | 125 | |||
165 | 126 | if not error_list: | ||
166 | 127 | # iterator on rows | ||
167 | 128 | rows = file_obj.getRows() | ||
168 | 129 | rows.next() # skip header | ||
169 | 130 | # ignore the first row | ||
170 | 131 | |||
171 | 132 | line_num = 0 | ||
172 | 133 | total_line_num = file_obj.getNbRows() | ||
173 | 134 | percent_completed = 0 | ||
174 | 135 | for row in rows: | ||
175 | 136 | line_num += 1 | ||
176 | 137 | error_list_line = [] | ||
177 | 138 | |||
178 | 139 | col_count = len(row) | ||
179 | 140 | template_col_count = len(header_index.items()) | ||
180 | 141 | if col_count != template_col_count and col_count != mandatory_col_count: | ||
181 | 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)) | ||
182 | 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)) | ||
183 | 144 | ignore_lines += 1 | ||
184 | 145 | line_ignored_num.append(line_num) | ||
185 | 146 | percent_completed = float(line_num)/float(total_line_num-1)*100.0 | ||
186 | 147 | self.write(cr, uid, ids, {'percent_completed': percent_completed}) | ||
187 | 148 | continue | ||
188 | 149 | try: | ||
189 | 150 | if not check_line.check_empty_line(row=row, col_count=col_count, line_num=line_num): | ||
190 | 151 | percent_completed = float(line_num)/float(total_line_num-1)*100.0 | ||
191 | 152 | self.write(cr, uid, ids, {'percent_completed': percent_completed}) | ||
192 | 153 | line_num -= 1 | ||
193 | 154 | total_line_num -= 1 | ||
194 | 155 | continue | ||
195 | 156 | |||
196 | 157 | # Cell 0: Product | ||
197 | 158 | if row[0]: | ||
198 | 159 | prod_ids = product_obj.search(cr, uid, [('default_code', '=ilike', row[0].data), | ||
199 | 160 | ('active', 'in', ['t', 'f'])], context=context) | ||
200 | 161 | if prod_ids and prod_ids[0] not in product_ids: | ||
201 | 162 | prod = product_obj.browse(cr, uid, prod_ids[0], fields_to_fetch=['international_status'], context=context) | ||
202 | 163 | if prod_creator_id and prod.international_status.id == prod_creator_id: | ||
203 | 164 | product_ids.append(prod.id) | ||
204 | 165 | else: | ||
205 | 166 | if instance_level == 'section': | ||
206 | 167 | error_list_line.append(_('Product %s doesn\'t have the expected Product Creator "HQ". ') | ||
207 | 168 | % (row[0].data,)) | ||
208 | 169 | elif instance_level == 'coordo': | ||
209 | 170 | error_list_line.append(_('Product %s doesn\'t have the expected Product Creator "Local". ') | ||
210 | 171 | % (row[0].data,)) | ||
211 | 172 | else: | ||
212 | 173 | error_list_line.append(_('You must be on Coordo or HQ instance to add products to the list. ')) | ||
213 | 174 | elif not prod_ids: | ||
214 | 175 | error_list_line.append(_('Product code %s doesn\'t exist in the DB. ') % (row[0].data,)) | ||
215 | 176 | else: | ||
216 | 177 | error_list_line.append(_('Product code is mandatory. ')) | ||
217 | 178 | |||
218 | 179 | if error_list_line: | ||
219 | 180 | lines_to_correct += 1 | ||
220 | 181 | line_txt = _('Line %s: ') % (line_num,) | ||
221 | 182 | error_list.append(line_txt + ' '.join(error_list_line)) | ||
222 | 183 | |||
223 | 184 | percent_completed = float(line_num)/float(total_line_num-1)*100.0 | ||
224 | 185 | complete_lines += 1 | ||
225 | 186 | |||
226 | 187 | except IndexError, e: | ||
227 | 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) | ||
228 | 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)) | ||
229 | 190 | ignore_lines += 1 | ||
230 | 191 | line_ignored_num.append(line_num) | ||
231 | 192 | percent_completed = float(line_num)/float(total_line_num-1)*100.0 | ||
232 | 193 | cr.rollback() | ||
233 | 194 | continue | ||
234 | 195 | except osv.except_osv as osv_error: | ||
235 | 196 | osv_value = osv_error.value | ||
236 | 197 | osv_name = osv_error.name | ||
237 | 198 | message += _("Line %s in the Excel file: %s: %s\n") % (line_num, osv_name, osv_value) | ||
238 | 199 | ignore_lines += 1 | ||
239 | 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)) | ||
240 | 201 | percent_completed = float(line_num)/float(total_line_num-1)*100.0 | ||
241 | 202 | cr.rollback() | ||
242 | 203 | continue | ||
243 | 204 | finally: | ||
244 | 205 | self.write(cr, uid, ids, {'percent_completed': percent_completed}) | ||
245 | 206 | cr.commit() | ||
246 | 207 | |||
247 | 208 | # Update products | ||
248 | 209 | p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'product_ids': [(6, 0, product_ids)]}, context=context) | ||
249 | 210 | |||
250 | 211 | error_log += '\n'.join(error_list) | ||
251 | 212 | if error_log: | ||
252 | 213 | error_log = _("Reported errors for ignored lines : \n") + error_log | ||
253 | 214 | end_time = time.time() | ||
254 | 215 | total_time = tools.ustr(round(end_time-start_time)) + _(' second(s)') | ||
255 | 216 | final_message = _(''' | ||
256 | 217 | Importation completed in %s! | ||
257 | 218 | # of imported lines : %s on %s lines | ||
258 | 219 | # of ignored lines: %s | ||
259 | 220 | # of lines to correct: %s | ||
260 | 221 | %s | ||
261 | 222 | |||
262 | 223 | %s | ||
263 | 224 | ''') % (total_time ,complete_lines, line_num, ignore_lines, lines_to_correct, error_log, message) | ||
264 | 225 | wizard_vals = {'message': final_message, 'state': 'done'} | ||
265 | 226 | if line_with_error: | ||
266 | 227 | file_to_export = wiz_common_import.export_file_with_error(cr, uid, ids, line_with_error=line_with_error, header_index=header_index) | ||
267 | 228 | wizard_vals.update(file_to_export) | ||
268 | 229 | self.write(cr, uid, ids, wizard_vals, context=context) | ||
269 | 230 | # we reset the state of the FO to draft (initial state) | ||
270 | 231 | except Exception as e: | ||
271 | 232 | self.write(cr, uid, ids, { | ||
272 | 233 | 'message': _('An unknow error occurred, please contact the support team. Error message: %s') % tools.ustr(e), | ||
273 | 234 | 'state': 'done', | ||
274 | 235 | }, context=context) | ||
275 | 236 | finally: | ||
276 | 237 | p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'state': 'draft', 'import_in_progress': False}, context) | ||
277 | 238 | cr.commit() | ||
278 | 239 | cr.close(True) | ||
279 | 240 | |||
280 | 241 | def import_file(self, cr, uid, ids, context=None): | ||
281 | 242 | """ | ||
282 | 243 | Launch a thread for importing lines. | ||
283 | 244 | """ | ||
284 | 245 | wiz_common_import = self.pool.get('wiz.common.import') | ||
285 | 246 | p_mass_upd_obj = self.pool.get('product.mass.update') | ||
286 | 247 | for wiz_read in self.read(cr, uid, ids, ['product_mass_upd_id', 'file']): | ||
287 | 248 | p_mass_upd_id = wiz_read['product_mass_upd_id'] | ||
288 | 249 | if not wiz_read['file']: | ||
289 | 250 | return self.write(cr, uid, ids, {'message': _("Nothing to import")}) | ||
290 | 251 | try: | ||
291 | 252 | fileobj = SpreadsheetXML(xmlstring=base64.decodestring(wiz_read['file'])) | ||
292 | 253 | # iterator on rows | ||
293 | 254 | reader = fileobj.getRows() | ||
294 | 255 | reader_iterator = iter(reader) | ||
295 | 256 | # get first line | ||
296 | 257 | first_row = next(reader_iterator) | ||
297 | 258 | header_index = wiz_common_import.get_header_index(cr, uid, ids, first_row, error_list=[], line_num=0, context=context) | ||
298 | 259 | context.update({'p_mass_upd_id': p_mass_upd_id, 'header_index': header_index}) | ||
299 | 260 | res, res1 = wiz_common_import.check_header_values(cr, uid, ids, context, header_index, columns_for_product_line_import, origin='') | ||
300 | 261 | if not res: | ||
301 | 262 | return self.write(cr, uid, ids, res1, context) | ||
302 | 263 | except osv.except_osv as osv_error: | ||
303 | 264 | osv_value = osv_error.value | ||
304 | 265 | osv_name = osv_error.name | ||
305 | 266 | message = "%s: %s\n" % (osv_name, osv_value) | ||
306 | 267 | return self.write(cr, uid, ids, {'message': message}) | ||
307 | 268 | except StopIteration: | ||
308 | 269 | return self.write(cr, uid, ids, {'message': _('The file has no row, nothing to import')}) | ||
309 | 270 | p_mass_upd_obj.write(cr, uid, p_mass_upd_id, {'state': 'done', 'import_in_progress': True}, context) | ||
310 | 271 | thread = threading.Thread(target=self._import, args=(cr.dbname, uid, ids, context)) | ||
311 | 272 | thread.start() | ||
312 | 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. | ||
313 | 274 | Otherwise, you can continue to use Unifield.""") | ||
314 | 275 | return self.write(cr, uid, ids, {'message': msg_to_return, 'state': 'in_progress'}, context=context) | ||
315 | 276 | |||
316 | 277 | def dummy(self, cr, uid, ids, context=None): | ||
317 | 278 | """ | ||
318 | 279 | This button is only for updating the view. | ||
319 | 280 | """ | ||
320 | 281 | if isinstance(ids, (int, long)): | ||
321 | 282 | ids = [ids] | ||
322 | 283 | for wiz_read in self.read(cr, uid, ids, ['fo_id', 'state', 'file']): | ||
323 | 284 | if wiz_read['state'] != 'done': | ||
324 | 285 | self.write(cr, uid, ids, {'message': _(' Import in progress... \n Please wait that the import is finished before editing.')}) | ||
325 | 286 | return False | ||
326 | 287 | |||
327 | 288 | def cancel(self, cr, uid, ids, context=None): | ||
328 | 289 | ''' | ||
329 | 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), | ||
330 | 291 | I come back on the home page. Here, I come back on the object on which I opened the wizard. | ||
331 | 292 | ''' | ||
332 | 293 | if isinstance(ids, (int, long)): | ||
333 | 294 | ids=[ids] | ||
334 | 295 | for wiz_obj in self.read(cr, uid, ids, ['product_mass_upd_id']): | ||
335 | 296 | p_mass_upd_id = wiz_obj['product_mass_upd_id'] | ||
336 | 297 | return {'type': 'ir.actions.act_window', | ||
337 | 298 | 'res_model': 'product.mass.update', | ||
338 | 299 | 'view_type': 'form', | ||
339 | 300 | 'view_mode': 'form, tree', | ||
340 | 301 | 'target': 'crush', | ||
341 | 302 | 'res_id': p_mass_upd_id, | ||
342 | 303 | 'context': context, | ||
343 | 304 | } | ||
344 | 305 | |||
345 | 306 | def close_import(self, cr, uid, ids, context=None): | ||
346 | 307 | ''' | ||
347 | 308 | Return to the initial view | ||
348 | 309 | ''' | ||
349 | 310 | return self.cancel(cr, uid, ids, context=context) | ||
350 | 311 | |||
351 | 312 | |||
352 | 313 | wizard_import_product_line() | ||
353 | 0 | 314 | ||
354 | === added file 'bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml' | |||
355 | --- bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml 1970-01-01 00:00:00 +0000 | |||
356 | +++ bin/addons/msf_doc_import/wizard/wizard_import_product_line_view.xml 2019-04-15 13:13:32 +0000 | |||
357 | @@ -0,0 +1,38 @@ | |||
358 | 1 | <?xml version="1.0" encoding="utf-8" ?> | ||
359 | 2 | <openerp> | ||
360 | 3 | <data> | ||
361 | 4 | |||
362 | 5 | <record id="wizard_to_import_product_line" model="ir.ui.view"> | ||
363 | 6 | <field name="name">wizard.to.import.product.line</field> | ||
364 | 7 | <field name="model">wizard.import.product.line</field> | ||
365 | 8 | <field name="type">form</field> | ||
366 | 9 | <field name="arch" type="xml"> | ||
367 | 10 | <form string="Import of lines"> | ||
368 | 11 | <separator colspan="4" string="File to import" /> | ||
369 | 12 | <field name="file" filename="filename_template" /> | ||
370 | 13 | <field name="percent_completed" widget="progressbar" attrs="{'invisible':[('state', '=', 'draft')]}"/> | ||
371 | 14 | <field name="filename_template" invisible="1" /> | ||
372 | 15 | <field name="filename" invisible="1" /> | ||
373 | 16 | <field name="data" filename="filename" readonly="1" | ||
374 | 17 | attrs="{'invisible':[('import_error_ok', '!=', False), ('state', '!=', 'done')]}"/> | ||
375 | 18 | |||
376 | 19 | <separator colspan="12" string="Information" /> | ||
377 | 20 | <field name="message" colspan="4" nolabel="1" /> | ||
378 | 21 | <group name="buttons" string="" colspan="24" col="6"> | ||
379 | 22 | <button name="cancel" string="Cancel" icon="gtk-cancel" type="object" | ||
380 | 23 | attrs="{'invisible':[('state', '!=', 'draft')]}"/> | ||
381 | 24 | <button name="import_file" string="Import file" icon="gtk-go-forward" type="object" | ||
382 | 25 | attrs="{'invisible':[('state', '!=', 'draft')]}"/> | ||
383 | 26 | <button name="dummy" string="Update" icon="gtk-execute" type="object" | ||
384 | 27 | attrs="{'invisible':[('state', '!=', 'in_progress')]}"/> | ||
385 | 28 | <button name="close_import" string="Close window" icon="gtk-cancel" type="object" | ||
386 | 29 | attrs="{'invisible':[('state', '!=', 'done')]}"/> | ||
387 | 30 | </group> | ||
388 | 31 | <newline/> | ||
389 | 32 | <field name="state" colspan="1"/> | ||
390 | 33 | </form> | ||
391 | 34 | </field> | ||
392 | 35 | </record> | ||
393 | 36 | |||
394 | 37 | </data> | ||
395 | 38 | </openerp> | ||
396 | 0 | \ No newline at end of file | 39 | \ No newline at end of file |
397 | 1 | 40 | ||
398 | === modified file 'bin/addons/msf_profile/i18n/fr_MF.po' | |||
399 | --- bin/addons/msf_profile/i18n/fr_MF.po 2019-04-08 09:30:07 +0000 | |||
400 | +++ bin/addons/msf_profile/i18n/fr_MF.po 2019-04-15 13:13:32 +0000 | |||
401 | @@ -1200,6 +1200,7 @@ | |||
402 | 1200 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:368 | 1200 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:368 |
403 | 1201 | #: code:addons/msf_doc_import/wizard/wizard_import_ir_line.py:324 | 1201 | #: code:addons/msf_doc_import/wizard/wizard_import_ir_line.py:324 |
404 | 1202 | #: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:275 | 1202 | #: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:275 |
405 | 1203 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:280 | ||
406 | 1203 | #, python-format | 1204 | #, python-format |
407 | 1204 | msgid "Import in progress, please leave this window open and press the button 'Update' when you think that the import is done.\n" | 1205 | msgid "Import in progress, please leave this window open and press the button 'Update' when you think that the import is done.\n" |
408 | 1205 | "Otherwise, you can continue to use Unifield." | 1206 | "Otherwise, you can continue to use Unifield." |
409 | @@ -1701,10 +1702,11 @@ | |||
410 | 1701 | msgid "Backup Size" | 1702 | msgid "Backup Size" |
411 | 1702 | msgstr "Taille Sauvegarde" | 1703 | msgstr "Taille Sauvegarde" |
412 | 1703 | 1704 | ||
414 | 1704 | #. module: product_attributes | 1705 | #. module: product_attributes, product |
415 | 1705 | #: selection:product.product,state_ud:0 | 1706 | #: selection:product.product,state_ud:0 |
416 | 1707 | #: selection:product.mass.update,product_state:0 | ||
417 | 1706 | msgid "Stopped" | 1708 | msgid "Stopped" |
419 | 1707 | msgstr "Arrêter" | 1709 | msgstr "Arrêté" |
420 | 1708 | 1710 | ||
421 | 1709 | #. module: register_accounting | 1711 | #. module: register_accounting |
422 | 1710 | #: report:addons/register_accounting/report/liquidity_position_xls.mako:268 | 1712 | #: report:addons/register_accounting/report/liquidity_position_xls.mako:268 |
423 | @@ -3826,6 +3828,7 @@ | |||
424 | 3826 | #: code:addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.py:237 | 3828 | #: code:addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.py:237 |
425 | 3827 | #: code:addons/msf_doc_import/wizard/wizard_import_supplier_catalogue.py:382 | 3829 | #: code:addons/msf_doc_import/wizard/wizard_import_supplier_catalogue.py:382 |
426 | 3828 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:200 | 3830 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:200 |
427 | 3831 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:190 | ||
428 | 3829 | #, python-format | 3832 | #, python-format |
429 | 3830 | msgid "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" | 3833 | msgid "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" |
430 | 3831 | msgstr "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" | 3834 | msgstr "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" |
431 | @@ -8636,7 +8639,7 @@ | |||
432 | 8636 | msgid "Either there are no moves linked to the picking or Accounting Journals are misconfigured!" | 8639 | msgid "Either there are no moves linked to the picking or Accounting Journals are misconfigured!" |
433 | 8637 | msgstr "Soit les Journaux Comptables sont mal configurés, soit il n'y a pas de mouvement connexe à ce prélèvement !" | 8640 | msgstr "Soit les Journaux Comptables sont mal configurés, soit il n'y a pas de mouvement connexe à ce prélèvement !" |
434 | 8638 | 8641 | ||
436 | 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, stock | 8642 | #. 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 |
437 | 8640 | #: selection:msf.instance.cloud,state:0 | 8643 | #: selection:msf.instance.cloud,state:0 |
438 | 8641 | #: field:ppl.processor,draft_step1:0 | 8644 | #: field:ppl.processor,draft_step1:0 |
439 | 8642 | #: field:ppl.processor,draft_step2:0 | 8645 | #: field:ppl.processor,draft_step2:0 |
440 | @@ -8804,7 +8807,12 @@ | |||
441 | 8804 | #: field:internal.picking.processor,draft:0 | 8807 | #: field:internal.picking.processor,draft:0 |
442 | 8805 | #: field:outgoing.delivery.processor,draft:0 | 8808 | #: field:outgoing.delivery.processor,draft:0 |
443 | 8806 | #: selection:internal.request.import,state:0 | 8809 | #: selection:internal.request.import,state:0 |
444 | 8810 | <<<<<<< TREE | ||
445 | 8807 | #: selection:wizard.import.ppl.to.create.ship,state:0 | 8811 | #: selection:wizard.import.ppl.to.create.ship,state:0 |
446 | 8812 | ======= | ||
447 | 8813 | #: selection:wizard.import.product.line,state:0 | ||
448 | 8814 | #: selection:product.mass.update,state:0 | ||
449 | 8815 | >>>>>>> MERGE-SOURCE | ||
450 | 8808 | #, python-format | 8816 | #, python-format |
451 | 8809 | msgid "Draft" | 8817 | msgid "Draft" |
452 | 8810 | msgstr "Brouillon" | 8818 | msgstr "Brouillon" |
453 | @@ -12401,6 +12409,7 @@ | |||
454 | 12401 | #. modules: stock_forecast, product | 12409 | #. modules: stock_forecast, product |
455 | 12402 | #: selection:product.template,procure_method:0 | 12410 | #: selection:product.template,procure_method:0 |
456 | 12403 | #: selection:stock.forecast,procurement_method:0 | 12411 | #: selection:stock.forecast,procurement_method:0 |
457 | 12412 | #: selection:product.mass.update,procure_method:0 | ||
458 | 12404 | msgid "Make to Stock" | 12413 | msgid "Make to Stock" |
459 | 12405 | msgstr "Production sur Stock" | 12414 | msgstr "Production sur Stock" |
460 | 12406 | 12415 | ||
461 | @@ -15765,8 +15774,9 @@ | |||
462 | 15765 | msgid "total m³" | 15774 | msgid "total m³" |
463 | 15766 | msgstr "total m³" | 15775 | msgstr "total m³" |
464 | 15767 | 15776 | ||
466 | 15768 | #. module: product_expiry | 15777 | #. module: product_expiry, product |
467 | 15769 | #: field:product.product,use_time:0 | 15778 | #: field:product.product,use_time:0 |
468 | 15779 | #: field:product.mass.update,use_time:0 | ||
469 | 15770 | msgid "Product Use Time" | 15780 | msgid "Product Use Time" |
470 | 15771 | msgstr "Produit - Durée d'utilisation " | 15781 | msgstr "Produit - Durée d'utilisation " |
471 | 15772 | 15782 | ||
472 | @@ -16856,7 +16866,7 @@ | |||
473 | 16856 | msgid "%s update%s" | 16866 | msgid "%s update%s" |
474 | 16857 | msgstr "%s update%s" | 16867 | msgstr "%s update%s" |
475 | 16858 | 16868 | ||
477 | 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, finance | 16869 | #. 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 |
478 | 16860 | #: view:account.state.open:0 | 16870 | #: view:account.state.open:0 |
479 | 16861 | #: selection:mission.stock.wizard,split_stock:0 | 16871 | #: selection:mission.stock.wizard,split_stock:0 |
480 | 16862 | #: selection:mission.stock.wizard,with_valuation:0 | 16872 | #: selection:mission.stock.wizard,with_valuation:0 |
481 | @@ -16903,6 +16913,13 @@ | |||
482 | 16903 | #: selection:po.automation.config,name:0 | 16913 | #: selection:po.automation.config,name:0 |
483 | 16904 | #: view:tender.cancel.wizard:0 | 16914 | #: view:tender.cancel.wizard:0 |
484 | 16905 | #: view:tender.line.cancel.wizard:0 | 16915 | #: view:tender.line.cancel.wizard:0 |
485 | 16916 | #: selection:product.mass.update,active_product:0 | ||
486 | 16917 | #: selection:product.mass.update,dangerous_goods:0 | ||
487 | 16918 | #: selection:product.mass.update,heat_sensitive_item:0 | ||
488 | 16919 | #: selection:product.mass.update,short_shelf_life:0 | ||
489 | 16920 | #: selection:product.mass.update,single_use:0 | ||
490 | 16921 | #: selection:product.mass.update,sterilized:0 | ||
491 | 16922 | #: report:addons/product/report/product_mass_update_export_xls.mako:136 | ||
492 | 16906 | #, python-format | 16923 | #, python-format |
493 | 16907 | msgid "No" | 16924 | msgid "No" |
494 | 16908 | msgstr "Non" | 16925 | msgstr "Non" |
495 | @@ -17320,8 +17337,9 @@ | |||
496 | 17320 | msgid "Error! The nomenclature complete name must be unique." | 17337 | msgid "Error! The nomenclature complete name must be unique." |
497 | 17321 | msgstr "Error! The nomenclature complete name must be unique." | 17338 | msgstr "Error! The nomenclature complete name must be unique." |
498 | 17322 | 17339 | ||
500 | 17323 | #. module: service_purchasing | 17340 | #. module: service_purchasing, product |
501 | 17324 | #: code:addons/service_purchasing/service_purchasing.py:70 | 17341 | #: code:addons/service_purchasing/service_purchasing.py:70 |
502 | 17342 | #: code:addons/product/wizard/product_mass_update.py:328 | ||
503 | 17325 | #, python-format | 17343 | #, python-format |
504 | 17326 | msgid "You must select on order procurement method for %s products." | 17344 | msgid "You must select on order procurement method for %s products." |
505 | 17327 | msgstr "Vous devez sélectionner 'Sur commande' comme méthode d'acquisition pour les produits %s." | 17345 | msgstr "Vous devez sélectionner 'Sur commande' comme méthode d'acquisition pour les produits %s." |
506 | @@ -17708,6 +17726,7 @@ | |||
507 | 17708 | 17726 | ||
508 | 17709 | #. module: product | 17727 | #. module: product |
509 | 17710 | #: help:product.template,state:0 | 17728 | #: help:product.template,state:0 |
510 | 17729 | #: help:product.mass.update,product_state:0 | ||
511 | 17711 | msgid "Tells the user if he can use the product or not." | 17730 | msgid "Tells the user if he can use the product or not." |
512 | 17712 | msgstr "Indique à l'utilisateur s'il peut ou ne peut pas utiliser le produit." | 17731 | msgstr "Indique à l'utilisateur s'il peut ou ne peut pas utiliser le produit." |
513 | 17713 | 17732 | ||
514 | @@ -18038,8 +18057,9 @@ | |||
515 | 18038 | msgid "The record exists in database?" | 18057 | msgid "The record exists in database?" |
516 | 18039 | msgstr "The record exists in database?" | 18058 | msgstr "The record exists in database?" |
517 | 18040 | 18059 | ||
519 | 18041 | #. module: product_attributes | 18060 | #. module: product_attributes, product |
520 | 18042 | #: field:product.product,single_use:0 | 18061 | #: field:product.product,single_use:0 |
521 | 18062 | #: field:product.mass.update,single_use:0 | ||
522 | 18043 | msgid "Single Use" | 18063 | msgid "Single Use" |
523 | 18044 | msgstr "Utilisation unique" | 18064 | msgstr "Utilisation unique" |
524 | 18045 | 18065 | ||
525 | @@ -22386,8 +22406,9 @@ | |||
526 | 22386 | msgid "Wizard Name" | 22406 | msgid "Wizard Name" |
527 | 22387 | msgstr "Nom de l'Assistant" | 22407 | msgstr "Nom de l'Assistant" |
528 | 22388 | 22408 | ||
530 | 22389 | #. module: procurement | 22409 | #. module: procurement, product |
531 | 22390 | #: help:procurement.order,procure_method:0 | 22410 | #: help:procurement.order,procure_method:0 |
532 | 22411 | #: help:product.mass.update,procure_method:0 | ||
533 | 22391 | msgid "If you encode manually a Procurement, you probably want to use a make to order method." | 22412 | msgid "If you encode manually a Procurement, you probably want to use a make to order method." |
534 | 22392 | msgstr "Si vous saisissez manuellement un Approvisionnement, vous voulez probablement utiliser une méthode Production sur Commande" | 22413 | msgstr "Si vous saisissez manuellement un Approvisionnement, vous voulez probablement utiliser une méthode Production sur Commande" |
535 | 22393 | 22414 | ||
536 | @@ -22855,7 +22876,11 @@ | |||
537 | 22855 | #: view:wizard.import.threshold.value.line:0 | 22876 | #: view:wizard.import.threshold.value.line:0 |
538 | 22856 | #: view:automated.import.job:0 | 22877 | #: view:automated.import.job:0 |
539 | 22857 | #: view:procurement.request.import:0 | 22878 | #: view:procurement.request.import:0 |
540 | 22879 | <<<<<<< TREE | ||
541 | 22858 | #: view:wizard.import.ppl.to.create.ship:0 | 22880 | #: view:wizard.import.ppl.to.create.ship:0 |
542 | 22881 | ======= | ||
543 | 22882 | #: view:wizard.import.product.line:0 | ||
544 | 22883 | >>>>>>> MERGE-SOURCE | ||
545 | 22859 | msgid "Import file" | 22884 | msgid "Import file" |
546 | 22860 | msgstr "Importer le fichier" | 22885 | msgstr "Importer le fichier" |
547 | 22861 | 22886 | ||
548 | @@ -25231,7 +25256,7 @@ | |||
549 | 25231 | msgid "Europe/Bucharest" | 25256 | msgid "Europe/Bucharest" |
550 | 25232 | msgstr "Europe/Bucharest" | 25257 | msgstr "Europe/Bucharest" |
551 | 25233 | 25258 | ||
553 | 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, finance | 25259 | #. 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 |
554 | 25235 | #: view:account.state.open:0 | 25260 | #: view:account.state.open:0 |
555 | 25236 | #: view:account.payment.make.payment:0 | 25261 | #: view:account.payment.make.payment:0 |
556 | 25237 | #: selection:mission.stock.wizard,split_stock:0 | 25262 | #: selection:mission.stock.wizard,split_stock:0 |
557 | @@ -25271,6 +25296,13 @@ | |||
558 | 25271 | #: selection:po.automation.config,name:0 | 25296 | #: selection:po.automation.config,name:0 |
559 | 25272 | #: view:tender.cancel.wizard:0 | 25297 | #: view:tender.cancel.wizard:0 |
560 | 25273 | #: view:tender.line.cancel.wizard:0 | 25298 | #: view:tender.line.cancel.wizard:0 |
561 | 25299 | #: selection:product.mass.update,active_product:0 | ||
562 | 25300 | #: selection:product.mass.update,dangerous_goods:0 | ||
563 | 25301 | #: selection:product.mass.update,heat_sensitive_item:0 | ||
564 | 25302 | #: selection:product.mass.update,short_shelf_life:0 | ||
565 | 25303 | #: selection:product.mass.update,single_use:0 | ||
566 | 25304 | #: selection:product.mass.update,sterilized:0 | ||
567 | 25305 | #: report:addons/product/report/product_mass_update_export_xls.mako:136 | ||
568 | 25274 | #, python-format | 25306 | #, python-format |
569 | 25275 | msgid "Yes" | 25307 | msgid "Yes" |
570 | 25276 | msgstr "Oui" | 25308 | msgstr "Oui" |
571 | @@ -25313,8 +25345,9 @@ | |||
572 | 25313 | msgid "Adds commitment, requested and effective dates on Sales Orders." | 25345 | msgid "Adds commitment, requested and effective dates on Sales Orders." |
573 | 25314 | msgstr "Ajoute les dates d'engagement, désirées et effectives sur les commandes terrains." | 25346 | msgstr "Ajoute les dates d'engagement, désirées et effectives sur les commandes terrains." |
574 | 25315 | 25347 | ||
576 | 25316 | #. module: product_list | 25348 | #. module: product_list, product |
577 | 25317 | #: view:product.to.list:0 | 25349 | #: view:product.to.list:0 |
578 | 25350 | #: view:product.mass.update:0 | ||
579 | 25318 | msgid "Import products" | 25351 | msgid "Import products" |
580 | 25319 | msgstr "Importer les produits" | 25352 | msgstr "Importer les produits" |
581 | 25320 | 25353 | ||
582 | @@ -27660,7 +27693,7 @@ | |||
583 | 27660 | msgid "Asia/Omsk" | 27693 | msgid "Asia/Omsk" |
584 | 27661 | msgstr "Asia/Omsk" | 27694 | msgstr "Asia/Omsk" |
585 | 27662 | 27695 | ||
587 | 27663 | #. module: msf_doc_import | 27696 | #. module: msf_doc_import, product |
588 | 27664 | #: field:stock.partial.picking,percent_completed:0 | 27697 | #: field:stock.partial.picking,percent_completed:0 |
589 | 27665 | #: field:wizard.import.auto.supply.line,percent_completed:0 | 27698 | #: field:wizard.import.auto.supply.line,percent_completed:0 |
590 | 27666 | #: field:wizard.import.fo.line,percent_completed:0 | 27699 | #: field:wizard.import.fo.line,percent_completed:0 |
591 | @@ -27675,6 +27708,9 @@ | |||
592 | 27675 | #: field:wizard.import.supplier.catalogue,percent_completed:0 | 27708 | #: field:wizard.import.supplier.catalogue,percent_completed:0 |
593 | 27676 | #: field:wizard.import.tender.line,percent_completed:0 | 27709 | #: field:wizard.import.tender.line,percent_completed:0 |
594 | 27677 | #: field:wizard.import.threshold.value.line,percent_completed:0 | 27710 | #: field:wizard.import.threshold.value.line,percent_completed:0 |
595 | 27711 | #: field:wizard.import.product.line,percent_completed:0 | ||
596 | 27712 | #: field:product.mass.update,percent_completed:0 | ||
597 | 27713 | #: field:product.mass.update.progressbar,percent_completed:0 | ||
598 | 27678 | msgid "% completed" | 27714 | msgid "% completed" |
599 | 27679 | msgstr "% terminé" | 27715 | msgstr "% terminé" |
600 | 27680 | 27716 | ||
601 | @@ -31708,6 +31744,8 @@ | |||
602 | 31708 | #: field:wizard.import.threshold.value.line,data:0 | 31744 | #: field:wizard.import.threshold.value.line,data:0 |
603 | 31709 | #: field:wizard.import.threshold.value.line,filename:0 | 31745 | #: field:wizard.import.threshold.value.line,filename:0 |
604 | 31710 | #: field:internal.request.import,error_filename:0 | 31746 | #: field:internal.request.import,error_filename:0 |
605 | 31747 | #: field:wizard.import.product.line,data:0 | ||
606 | 31748 | #: field:wizard.import.product.line,filename:0 | ||
607 | 31711 | msgid "Lines with errors" | 31749 | msgid "Lines with errors" |
608 | 31712 | msgstr "Lignes avec des erreurs" | 31750 | msgstr "Lignes avec des erreurs" |
609 | 31713 | 31751 | ||
610 | @@ -32129,8 +32167,9 @@ | |||
611 | 32129 | msgid "RFQ - closed" | 32167 | msgid "RFQ - closed" |
612 | 32130 | msgstr "Demande de Devis- fermé" | 32168 | msgstr "Demande de Devis- fermé" |
613 | 32131 | 32169 | ||
615 | 32132 | #. module: product_expiry | 32170 | #. module: product_expiry, product |
616 | 32133 | #: help:product.product,use_time:0 | 32171 | #: help:product.product,use_time:0 |
617 | 32172 | #: help:product.mass.update,use_time:0 | ||
618 | 32134 | msgid "The number of months before a production lot starts deteriorating without becoming dangerous." | 32173 | msgid "The number of months before a production lot starts deteriorating without becoming dangerous." |
619 | 32135 | msgstr "Nombre de mois avant qu'un lot de production ne commence à se détériorer, sans être dangereux" | 32174 | msgstr "Nombre de mois avant qu'un lot de production ne commence à se détériorer, sans être dangereux" |
620 | 32136 | 32175 | ||
621 | @@ -33391,10 +33430,11 @@ | |||
622 | 33391 | msgid "Asia/Dushanbe" | 33430 | msgid "Asia/Dushanbe" |
623 | 33392 | msgstr "Asia/Dushanbe" | 33431 | msgstr "Asia/Dushanbe" |
624 | 33393 | 33432 | ||
626 | 33394 | #. module: product_attributes | 33433 | #. module: product_attributes, product |
627 | 33395 | #: selection:product.product,state_ud:0 | 33434 | #: selection:product.product,state_ud:0 |
628 | 33435 | #: selection:product.mass.update,product_state:0 | ||
629 | 33396 | msgid "Phase Out" | 33436 | msgid "Phase Out" |
631 | 33397 | msgstr "Phase Out" | 33437 | msgstr "Élimination" |
632 | 33398 | 33438 | ||
633 | 33399 | #. module: sync_so | 33439 | #. module: sync_so |
634 | 33400 | #: field:purchase.order,push_fo:0 | 33440 | #: field:purchase.order,push_fo:0 |
635 | @@ -34481,8 +34521,9 @@ | |||
636 | 34481 | msgid "From comparison to closed." | 34521 | msgid "From comparison to closed." |
637 | 34482 | msgstr "De comparaison à fermé." | 34522 | msgstr "De comparaison à fermé." |
638 | 34483 | 34523 | ||
640 | 34484 | #. module: product_expiry | 34524 | #. module: product_expiry, product |
641 | 34485 | #: help:product.product,alert_time:0 | 34525 | #: help:product.product,alert_time:0 |
642 | 34526 | #: help:product.mass.update,alert_time:0 | ||
643 | 34486 | msgid "The number of months after which an alert should be notified about the production lot." | 34527 | msgid "The number of months after which an alert should be notified about the production lot." |
644 | 34487 | msgstr "Nombre de mois après lequel une alerte devrait être affichée en ce qui concerne le lot de production." | 34528 | msgstr "Nombre de mois après lequel une alerte devrait être affichée en ce qui concerne le lot de production." |
645 | 34488 | 34529 | ||
646 | @@ -34823,7 +34864,7 @@ | |||
647 | 34823 | msgid "IR/FO Order" | 34864 | msgid "IR/FO Order" |
648 | 34824 | msgstr "IR/FO Order" | 34865 | msgstr "IR/FO Order" |
649 | 34825 | 34866 | ||
651 | 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_override | 34867 | #. 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 |
652 | 34827 | #: selection:account.entries.report,move_line_state:0 | 34868 | #: selection:account.entries.report,move_line_state:0 |
653 | 34828 | #: selection:account.move.line,state:0 | 34869 | #: selection:account.move.line,state:0 |
654 | 34829 | #: selection:wizard.journal.items.corrections.lines,analytic_distribution_state:0 | 34870 | #: selection:wizard.journal.items.corrections.lines,analytic_distribution_state:0 |
655 | @@ -34846,6 +34887,7 @@ | |||
656 | 34846 | #: selection:wizard.advance.line,analytic_distribution_state:0 | 34887 | #: selection:wizard.advance.line,analytic_distribution_state:0 |
657 | 34847 | #: selection:res.currency.table,state:0 | 34888 | #: selection:res.currency.table,state:0 |
658 | 34848 | #: selection:purchase.order.merged.line,analytic_distribution_state:0 | 34889 | #: selection:purchase.order.merged.line,analytic_distribution_state:0 |
659 | 34890 | #: selection:product.mass.update,product_state:0 | ||
660 | 34849 | msgid "Valid" | 34891 | msgid "Valid" |
661 | 34850 | msgstr "Valide" | 34892 | msgstr "Valide" |
662 | 34851 | 34893 | ||
663 | @@ -36109,7 +36151,11 @@ | |||
664 | 36109 | msgid "cancel_voucher - (account.voucher)" | 36151 | msgid "cancel_voucher - (account.voucher)" |
665 | 36110 | msgstr "cancel_voucher - (account.voucher)" | 36152 | msgstr "cancel_voucher - (account.voucher)" |
666 | 36111 | 36153 | ||
667 | 36154 | <<<<<<< TREE | ||
668 | 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_mcdb | 36155 | #. 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 |
669 | 36156 | ======= | ||
670 | 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 | ||
671 | 36158 | >>>>>>> MERGE-SOURCE | ||
672 | 36113 | #: field:cash.request.liquidity,status:0 | 36159 | #: field:cash.request.liquidity,status:0 |
673 | 36114 | #: field:cash.request.liquidity.bank,status:0 | 36160 | #: field:cash.request.liquidity.bank,status:0 |
674 | 36115 | #: field:cash.request.liquidity.cash,status:0 | 36161 | #: field:cash.request.liquidity.cash,status:0 |
675 | @@ -36140,9 +36186,14 @@ | |||
676 | 36140 | #: report:addons/sales_followup/report/ir_track_changes_report_xls.mako:224 | 36186 | #: report:addons/sales_followup/report/ir_track_changes_report_xls.mako:224 |
677 | 36141 | #: report:addons/register_accounting/report/fully_report_xls.mako:590 | 36187 | #: report:addons/register_accounting/report/fully_report_xls.mako:590 |
678 | 36142 | #: report:addons/msf_supply_doc_export/report/report_internal_request_xls.mako:65 | 36188 | #: report:addons/msf_supply_doc_export/report/report_internal_request_xls.mako:65 |
679 | 36189 | <<<<<<< TREE | ||
680 | 36143 | #: field:product.nomenclature,status:0 | 36190 | #: field:product.nomenclature,status:0 |
681 | 36144 | #: report:addons/account_mcdb/report/combined_journals_report.mako:273 | 36191 | #: report:addons/account_mcdb/report/combined_journals_report.mako:273 |
682 | 36145 | #: report:combined.journals.report.pdf:0 | 36192 | #: report:combined.journals.report.pdf:0 |
683 | 36193 | ======= | ||
684 | 36194 | #: field:product.mass.update,product_state:0 | ||
685 | 36195 | #: field:product.mass.update,state:0 | ||
686 | 36196 | >>>>>>> MERGE-SOURCE | ||
687 | 36146 | #, python-format | 36197 | #, python-format |
688 | 36147 | msgid "Status" | 36198 | msgid "Status" |
689 | 36148 | msgstr "Statut" | 36199 | msgstr "Statut" |
690 | @@ -42634,7 +42685,7 @@ | |||
691 | 42634 | msgid "Contract code/name:" | 42685 | msgid "Contract code/name:" |
692 | 42635 | msgstr "Contrat - Code/Nom:" | 42686 | msgstr "Contrat - Code/Nom:" |
693 | 42636 | 42687 | ||
695 | 42637 | #. modules: sales_followup, register_accounting, import_data, sync_client, base, purchase_followup, msf_doc_import, stock | 42688 | #. modules: sales_followup, register_accounting, import_data, sync_client, base, purchase_followup, msf_doc_import, stock, product |
696 | 42638 | #: view:base.module.update:0 | 42689 | #: view:base.module.update:0 |
697 | 42639 | #: view:base.update.translations:0 | 42690 | #: view:base.update.translations:0 |
698 | 42640 | #: selection:import_data,import_mode:0 | 42691 | #: selection:import_data,import_mode:0 |
699 | @@ -42661,7 +42712,12 @@ | |||
700 | 42661 | #: view:product.product:0 | 42712 | #: view:product.product:0 |
701 | 42662 | #: model:ir.ui.menu,name:sync_client.update_menu | 42713 | #: model:ir.ui.menu,name:sync_client.update_menu |
702 | 42663 | #: view:sync.client.update_entity:0 | 42714 | #: view:sync.client.update_entity:0 |
703 | 42715 | <<<<<<< TREE | ||
704 | 42664 | #: view:stock.expired.damaged.report:0 | 42716 | #: view:stock.expired.damaged.report:0 |
705 | 42717 | ======= | ||
706 | 42718 | #: view:wizard.import.product.line:0 | ||
707 | 42719 | #: view:product.mass.update:0 | ||
708 | 42720 | >>>>>>> MERGE-SOURCE | ||
709 | 42665 | msgid "Update" | 42721 | msgid "Update" |
710 | 42666 | msgstr "Mettre à jour" | 42722 | msgstr "Mettre à jour" |
711 | 42667 | 42723 | ||
712 | @@ -44041,7 +44097,11 @@ | |||
713 | 44041 | msgid "Contains Dangerous goods" | 44097 | msgid "Contains Dangerous goods" |
714 | 44042 | msgstr "Contient des Produits Dangereux" | 44098 | msgstr "Contient des Produits Dangereux" |
715 | 44043 | 44099 | ||
716 | 44100 | <<<<<<< TREE | ||
717 | 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, stock | 44101 | #. 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 |
718 | 44102 | ======= | ||
719 | 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 | ||
720 | 44104 | >>>>>>> MERGE-SOURCE | ||
721 | 44045 | #: field:account.invoice.line,product_code:0 | 44105 | #: field:account.invoice.line,product_code:0 |
722 | 44046 | #: code:addons/consumption_calculation/consumption_calculation.py:482 | 44106 | #: code:addons/consumption_calculation/consumption_calculation.py:482 |
723 | 44047 | #: report:addons/consumption_calculation/report/report_real_consumption_xls.mako:69 | 44107 | #: report:addons/consumption_calculation/report/report_real_consumption_xls.mako:69 |
724 | @@ -44106,9 +44166,13 @@ | |||
725 | 44106 | #: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:130 | 44166 | #: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:130 |
726 | 44107 | #: code:addons/sale/wizard/internal_request_import.py:43 | 44167 | #: code:addons/sale/wizard/internal_request_import.py:43 |
727 | 44108 | #: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:214 | 44168 | #: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:214 |
728 | 44169 | <<<<<<< TREE | ||
729 | 44109 | #: report:addons/specific_rules/report/report_stock_inventory_xls.mako:223 | 44170 | #: report:addons/specific_rules/report/report_stock_inventory_xls.mako:223 |
730 | 44110 | #: report:addons/stock/report/stock_reception_report_xls.mako:237 | 44171 | #: report:addons/stock/report/stock_reception_report_xls.mako:237 |
731 | 44111 | #: report:addons/stock/report/stock_expired_damaged_report_xls.mako:218 | 44172 | #: report:addons/stock/report/stock_expired_damaged_report_xls.mako:218 |
732 | 44173 | ======= | ||
733 | 44174 | #: report:addons/product/report/product_mass_update_export_xls.mako:113 | ||
734 | 44175 | >>>>>>> MERGE-SOURCE | ||
735 | 44112 | #, python-format | 44176 | #, python-format |
736 | 44113 | msgid "Product Code" | 44177 | msgid "Product Code" |
737 | 44114 | msgstr "Code Produit" | 44178 | msgstr "Code Produit" |
738 | @@ -44253,8 +44317,9 @@ | |||
739 | 44253 | msgid "Portrait" | 44317 | msgid "Portrait" |
740 | 44254 | msgstr "Portrait" | 44318 | msgstr "Portrait" |
741 | 44255 | 44319 | ||
743 | 44256 | #. module: consumption_calculation | 44320 | #. module: consumption_calculation, product |
744 | 44257 | #: help:product.product,procure_delay:0 | 44321 | #: help:product.product,procure_delay:0 |
745 | 44322 | #: help:product.mass.update,procure_delay:0 | ||
746 | 44258 | msgid "It's the default time to procure this product. This lead time will be used on the Order cycle procurement computation" | 44323 | msgid "It's the default time to procure this product. This lead time will be used on the Order cycle procurement computation" |
747 | 44259 | msgstr "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." | 44324 | msgstr "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." |
748 | 44260 | 44325 | ||
749 | @@ -44718,11 +44783,12 @@ | |||
750 | 44718 | 44783 | ||
751 | 44719 | #. module: msf_doc_import | 44784 | #. module: msf_doc_import |
752 | 44720 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:131 | 44785 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:131 |
753 | 44786 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:121 | ||
754 | 44721 | #, python-format | 44787 | #, python-format |
755 | 44722 | msgid "\n" | 44788 | msgid "\n" |
756 | 44723 | " Please check spelling on column '%s'." | 44789 | " Please check spelling on column '%s'." |
757 | 44724 | msgstr "\n" | 44790 | msgstr "\n" |
759 | 44725 | " Please check spelling on column '%s'." | 44791 | " Veuillez vérifier l'orthographe sur la colonne '%s'." |
760 | 44726 | 44792 | ||
761 | 44727 | #. module: sync_client | 44793 | #. module: sync_client |
762 | 44728 | #: view:sync.monitor:0 | 44794 | #: view:sync.monitor:0 |
763 | @@ -45688,6 +45754,7 @@ | |||
764 | 45688 | #: field:stock.location,stock_virtual_specific:0 | 45754 | #: field:stock.location,stock_virtual_specific:0 |
765 | 45689 | #: field:stock.location,stock_virtual:0 | 45755 | #: field:stock.location,stock_virtual:0 |
766 | 45690 | #: selection:product.price.type,field:0 | 45756 | #: selection:product.price.type,field:0 |
767 | 45757 | #: report:addons/product/report/product_mass_update_export_xls.mako:116 | ||
768 | 45691 | msgid "Virtual Stock" | 45758 | msgid "Virtual Stock" |
769 | 45692 | msgstr "Stock Virtuel" | 45759 | msgstr "Stock Virtuel" |
770 | 45693 | 45760 | ||
771 | @@ -46516,6 +46583,7 @@ | |||
772 | 46516 | 46583 | ||
773 | 46517 | #. module: msf_doc_import | 46584 | #. module: msf_doc_import |
774 | 46518 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:134 | 46585 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:134 |
775 | 46586 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:124 | ||
776 | 46519 | #, python-format | 46587 | #, python-format |
777 | 46520 | msgid "\n" | 46588 | msgid "\n" |
778 | 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" |
779 | @@ -47552,8 +47620,9 @@ | |||
780 | 47552 | msgid "RfQ Line Ref" | 47620 | msgid "RfQ Line Ref" |
781 | 47553 | msgstr "Réf. Ligne Demande de Devis" | 47621 | msgstr "Réf. Ligne Demande de Devis" |
782 | 47554 | 47622 | ||
784 | 47555 | #. module: product_expiry | 47623 | #. module: product_expiry, product |
785 | 47556 | #: field:product.product,alert_time:0 | 47624 | #: field:product.product,alert_time:0 |
786 | 47625 | #: field:product.mass.update,alert_time:0 | ||
787 | 47557 | msgid "Product Alert Time" | 47626 | msgid "Product Alert Time" |
788 | 47558 | msgstr "Produit - Période d'Alerte" | 47627 | msgstr "Produit - Période d'Alerte" |
789 | 47559 | 47628 | ||
790 | @@ -48746,7 +48815,7 @@ | |||
791 | 48746 | #: code:addons/msf_doc_import/wizard/wiz_common_import.py:108 | 48815 | #: code:addons/msf_doc_import/wizard/wiz_common_import.py:108 |
792 | 48747 | #, python-format | 48816 | #, python-format |
793 | 48748 | msgid "The column \"%s\" is not taken into account. Please correct it. The list of columns accepted is: %s" | 48817 | msgid "The column \"%s\" is not taken into account. Please correct it. The list of columns accepted is: %s" |
795 | 48749 | msgstr "La colone \"%s\" n'est pas prise en compte. Merci de corriger. La liste des colonnes acceptée est : %s" | 48818 | msgstr "La colonne \"%s\" n'est pas prise en compte. Merci de corriger. La liste des colonnes acceptée est : %s" |
796 | 48750 | 48819 | ||
797 | 48751 | #. module: msf_outgoing | 48820 | #. module: msf_outgoing |
798 | 48752 | #: report:picking.ticket:0 | 48821 | #: report:picking.ticket:0 |
799 | @@ -51280,7 +51349,7 @@ | |||
800 | 51280 | msgid "Indian/Mayotte" | 51349 | msgid "Indian/Mayotte" |
801 | 51281 | msgstr "Indien/Mayotte" | 51350 | msgstr "Indien/Mayotte" |
802 | 51282 | 51351 | ||
804 | 51283 | #. modules: purchase, register_accounting, supplier_catalogue, sale, account_override, msf_doc_import | 51352 | #. modules: purchase, register_accounting, supplier_catalogue, sale, account_override, msf_doc_import, product |
805 | 51284 | #: view:account.invoice:0 | 51353 | #: view:account.invoice:0 |
806 | 51285 | #: view:composition.kit:0 | 51354 | #: view:composition.kit:0 |
807 | 51286 | #: view:initial.stock.inventory:0 | 51355 | #: view:initial.stock.inventory:0 |
808 | @@ -51298,6 +51367,7 @@ | |||
809 | 51298 | #: view:account.invoice:0 | 51367 | #: view:account.invoice:0 |
810 | 51299 | #: view:sale.order:0 | 51368 | #: view:sale.order:0 |
811 | 51300 | #: view:supplier.catalogue:0 | 51369 | #: view:supplier.catalogue:0 |
812 | 51370 | #: view:product.mass.update:0 | ||
813 | 51301 | msgid " Import Lines " | 51371 | msgid " Import Lines " |
814 | 51302 | msgstr "Importer les Lignes" | 51372 | msgstr "Importer les Lignes" |
815 | 51303 | 51373 | ||
816 | @@ -52436,10 +52506,11 @@ | |||
817 | 52436 | msgid "Line Number" | 52506 | msgid "Line Number" |
818 | 52437 | msgstr "Numéro de Ligne" | 52507 | msgstr "Numéro de Ligne" |
819 | 52438 | 52508 | ||
821 | 52439 | #. module: product_nomenclature | 52509 | #. module: product_nomenclature, product |
822 | 52440 | #: help:product.category,active:0 | 52510 | #: help:product.category,active:0 |
823 | 52441 | #: help:product.nomenclature,active:0 | 52511 | #: help:product.nomenclature,active:0 |
824 | 52442 | #: help:product.uom.categ,active:0 | 52512 | #: help:product.uom.categ,active:0 |
825 | 52513 | #: help:product.mass.update,active_product:0 | ||
826 | 52443 | msgid "If the active field is set to False, it allows to hide the nomenclature without removing it." | 52514 | msgid "If the active field is set to False, it allows to hide the nomenclature without removing it." |
827 | 52444 | msgstr "Si ce champ actif est configuré sur Faux, cela permet de cacher la nomenclature sans la supprimer." | 52515 | msgstr "Si ce champ actif est configuré sur Faux, cela permet de cacher la nomenclature sans la supprimer." |
828 | 52445 | 52516 | ||
829 | @@ -54626,7 +54697,12 @@ | |||
830 | 54626 | msgid "Nb treated lines" | 54697 | msgid "Nb treated lines" |
831 | 54627 | msgstr "Nb lignes traitées" | 54698 | msgstr "Nb lignes traitées" |
832 | 54628 | 54699 | ||
834 | 54629 | #. module: product_attributes | 54700 | #. module: product_attributes, product |
835 | 54701 | #: selection:product.mass.update,dangerous_goods:0 | ||
836 | 54702 | #: selection:product.mass.update,heat_sensitive_item:0 | ||
837 | 54703 | #: selection:product.mass.update,short_shelf_life:0 | ||
838 | 54704 | #: selection:product.mass.update,single_use:0 | ||
839 | 54705 | #: selection:product.mass.update,sterilized:0 | ||
840 | 54630 | #: selection:product.product,dangerous_goods:0 | 54706 | #: selection:product.product,dangerous_goods:0 |
841 | 54631 | #: selection:product.product,short_shelf_life:0 | 54707 | #: selection:product.product,short_shelf_life:0 |
842 | 54632 | #: selection:product.product,single_use:0 | 54708 | #: selection:product.product,single_use:0 |
843 | @@ -57925,8 +58001,9 @@ | |||
844 | 57925 | msgid "FX rates by currency table" | 58001 | msgid "FX rates by currency table" |
845 | 57926 | msgstr "FX rates by currency table" | 58002 | msgstr "FX rates by currency table" |
846 | 57927 | 58003 | ||
848 | 57928 | #. module: product_attributes | 58004 | #. module: product_attributes, product |
849 | 57929 | #: field:product.product,sterilized:0 | 58005 | #: field:product.product,sterilized:0 |
850 | 58006 | #: field:product.mass.update,sterilized:0 | ||
851 | 57930 | msgid "Sterile" | 58007 | msgid "Sterile" |
852 | 57931 | msgstr "Stérile" | 58008 | msgstr "Stérile" |
853 | 57932 | 58009 | ||
854 | @@ -63884,8 +63961,9 @@ | |||
855 | 63884 | msgid "Sales Management" | 63961 | msgid "Sales Management" |
856 | 63885 | msgstr "Gestion des Commandes de Terrain" | 63962 | msgstr "Gestion des Commandes de Terrain" |
857 | 63886 | 63963 | ||
859 | 63887 | #. module: product_expiry | 63964 | #. module: product_expiry, product |
860 | 63888 | #: field:product.product,life_time:0 | 63965 | #: field:product.product,life_time:0 |
861 | 63966 | #: field:product.mass.update,life_time:0 | ||
862 | 63889 | msgid "Product Life Time" | 63967 | msgid "Product Life Time" |
863 | 63890 | msgstr "Durée de vie du produit" | 63968 | msgstr "Durée de vie du produit" |
864 | 63891 | 63969 | ||
865 | @@ -64402,10 +64480,11 @@ | |||
866 | 64402 | msgid "Accrual Account" | 64480 | msgid "Accrual Account" |
867 | 64403 | msgstr "Compte de Régularisation" | 64481 | msgstr "Compte de Régularisation" |
868 | 64404 | 64482 | ||
870 | 64405 | #. module: account | 64483 | #. module: account, product |
871 | 64406 | #: view:account.chart.template:0 | 64484 | #: view:account.chart.template:0 |
872 | 64407 | #: field:product.category,property_account_income_categ:0 | 64485 | #: field:product.category,property_account_income_categ:0 |
873 | 64408 | #: field:product.template,property_account_income:0 | 64486 | #: field:product.template,property_account_income:0 |
874 | 64487 | #: field:product.mass.update,property_account_income:0 | ||
875 | 64409 | msgid "Income Account" | 64488 | msgid "Income Account" |
876 | 64410 | msgstr "Compte de Produits " | 64489 | msgstr "Compte de Produits " |
877 | 64411 | 64490 | ||
878 | @@ -65943,8 +66022,9 @@ | |||
879 | 65943 | msgid "Proprietary instance:" | 66022 | msgid "Proprietary instance:" |
880 | 65944 | msgstr "Instance propriétaire :" | 66023 | msgstr "Instance propriétaire :" |
881 | 65945 | 66024 | ||
883 | 65946 | #. module: account | 66025 | #. module: account, product |
884 | 65947 | #: help:product.template,property_account_expense:0 | 66026 | #: help:product.template,property_account_expense:0 |
885 | 66027 | #: help:product.mass.update,property_account_expense:0 | ||
886 | 65948 | msgid "This account will be used for invoices instead of the default one to value expenses for the current product" | 66028 | msgid "This account will be used for invoices instead of the default one to value expenses for the current product" |
887 | 65949 | msgstr "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" | 66029 | msgstr "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" |
888 | 65950 | 66030 | ||
889 | @@ -66152,6 +66232,7 @@ | |||
890 | 66152 | 66232 | ||
891 | 66153 | #. module: msf_doc_import | 66233 | #. module: msf_doc_import |
892 | 66154 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:322 | 66234 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:322 |
893 | 66235 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:236 | ||
894 | 66155 | #, python-format | 66236 | #, python-format |
895 | 66156 | msgid "An unknow error occurred, please contact the support team. Error message: %s" | 66237 | msgid "An unknow error occurred, please contact the support team. Error message: %s" |
896 | 66157 | msgstr "Une erreur inconnue est survenue, veuillez contacter votre équipe support. Message d'erreur : %s" | 66238 | msgstr "Une erreur inconnue est survenue, veuillez contacter votre équipe support. Message d'erreur : %s" |
897 | @@ -68438,6 +68519,7 @@ | |||
898 | 68438 | #: view:stock.production.lot:0 | 68519 | #: view:stock.production.lot:0 |
899 | 68439 | #: field:stock.location,stock_real:0 | 68520 | #: field:stock.location,stock_real:0 |
900 | 68440 | #: field:stock.production.lot,stock_available:0 | 68521 | #: field:stock.production.lot,stock_available:0 |
901 | 68522 | #: report:addons/product/report/product_mass_update_export_xls.mako:115 | ||
902 | 68441 | msgid "Real Stock" | 68523 | msgid "Real Stock" |
903 | 68442 | msgstr "Stock Réel" | 68524 | msgstr "Stock Réel" |
904 | 68443 | 68525 | ||
905 | @@ -69686,6 +69768,7 @@ | |||
906 | 69686 | #: field:threshold.value,line_ids:0 | 69768 | #: field:threshold.value,line_ids:0 |
907 | 69687 | #: field:threshold.value,product_ids:0 | 69769 | #: field:threshold.value,product_ids:0 |
908 | 69688 | #: view:restrictive.country.setup:0 | 69770 | #: view:restrictive.country.setup:0 |
909 | 69771 | #: view:product.mass.update:0 | ||
910 | 69689 | #, python-format | 69772 | #, python-format |
911 | 69690 | msgid "Products" | 69773 | msgid "Products" |
912 | 69691 | msgstr "Produits" | 69774 | msgstr "Produits" |
913 | @@ -70267,6 +70350,7 @@ | |||
914 | 70267 | 70350 | ||
915 | 70268 | #. module: product | 70351 | #. module: product |
916 | 70269 | #: help:product.template,supply_method:0 | 70352 | #: help:product.template,supply_method:0 |
917 | 70353 | #: help:product.mass.update,supply_method:0 | ||
918 | 70270 | msgid "Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested." | 70354 | msgid "Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested." |
919 | 70271 | msgstr "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." | 70355 | msgstr "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." |
920 | 70272 | 70356 | ||
921 | @@ -71718,11 +71802,12 @@ | |||
922 | 71718 | msgid "Expected Ship Date" | 71802 | msgid "Expected Ship Date" |
923 | 71719 | msgstr "Date Prévue d'Expédition" | 71803 | msgstr "Date Prévue d'Expédition" |
924 | 71720 | 71804 | ||
926 | 71721 | #. modules: account, msf_accrual | 71805 | #. modules: account, msf_accrual, product |
927 | 71722 | #: view:account.chart.template:0 | 71806 | #: view:account.chart.template:0 |
928 | 71723 | #: field:product.category,property_account_expense_categ:0 | 71807 | #: field:product.category,property_account_expense_categ:0 |
929 | 71724 | #: field:product.template,property_account_expense:0 | 71808 | #: field:product.template,property_account_expense:0 |
930 | 71725 | #: field:msf.accrual.line,expense_account_id:0 | 71809 | #: field:msf.accrual.line,expense_account_id:0 |
931 | 71810 | #: field:product.mass.update,property_account_expense:0 | ||
932 | 71726 | msgid "Expense Account" | 71811 | msgid "Expense Account" |
933 | 71727 | msgstr "Compte de Charge" | 71812 | msgstr "Compte de Charge" |
934 | 71728 | 71813 | ||
935 | @@ -72845,6 +72930,7 @@ | |||
936 | 72845 | #: field:product.heat_sensitive,active:0 | 72930 | #: field:product.heat_sensitive,active:0 |
937 | 72846 | #: field:sync.client.message_rule,active:0 | 72931 | #: field:sync.client.message_rule,active:0 |
938 | 72847 | #: selection:sync.version.instance.monitor,instance_state:0 | 72932 | #: selection:sync.version.instance.monitor,instance_state:0 |
939 | 72933 | #: field:product.mass.update,active_product:0 | ||
940 | 72848 | #, python-format | 72934 | #, python-format |
941 | 72849 | msgid "Active" | 72935 | msgid "Active" |
942 | 72850 | msgstr "Actif" | 72936 | msgstr "Actif" |
943 | @@ -73532,7 +73618,7 @@ | |||
944 | 73532 | msgid "Expected Pack Date" | 73618 | msgid "Expected Pack Date" |
945 | 73533 | msgstr "Date Prévue de Colisage" | 73619 | msgstr "Date Prévue de Colisage" |
946 | 73534 | 73620 | ||
948 | 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_profile | 73621 | #. 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 |
949 | 73536 | #: code:addons/account/account.py:294 | 73622 | #: code:addons/account/account.py:294 |
950 | 73537 | #: code:addons/account/account.py:988 | 73623 | #: code:addons/account/account.py:988 |
951 | 73538 | #: code:addons/account/account.py:992 | 73624 | #: code:addons/account/account.py:992 |
952 | @@ -74643,6 +74729,12 @@ | |||
953 | 74643 | #: code:addons/sale/wizard/internal_request_import.py:166 | 74729 | #: code:addons/sale/wizard/internal_request_import.py:166 |
954 | 74644 | #: code:addons/msf_outgoing/wizard/create_picking_processor.py:55 | 74730 | #: code:addons/msf_outgoing/wizard/create_picking_processor.py:55 |
955 | 74645 | #: selection:internal.request.import,state:0 | 74731 | #: selection:internal.request.import,state:0 |
956 | 74732 | #: code:addons/product/wizard/product_mass_update.py:182 | ||
957 | 74733 | #: code:addons/product/wizard/product_mass_update.py:198 | ||
958 | 74734 | #: code:addons/product/wizard/product_mass_update.py:204 | ||
959 | 74735 | #: code:addons/product/wizard/product_mass_update.py:210 | ||
960 | 74736 | #: code:addons/product/wizard/product_mass_update.py:216 | ||
961 | 74737 | #: selection:product.mass.update,state:0 | ||
962 | 74646 | #, python-format, python-format | 74738 | #, python-format, python-format |
963 | 74647 | msgid "Error" | 74739 | msgid "Error" |
964 | 74648 | msgstr "Erreur" | 74740 | msgstr "Erreur" |
965 | @@ -74822,8 +74914,9 @@ | |||
966 | 74822 | #: view:purchase.order.confirm.wizard:0 | 74914 | #: view:purchase.order.confirm.wizard:0 |
967 | 74823 | #: view:purchase.order.cancel.wizard:0 | 74915 | #: view:purchase.order.cancel.wizard:0 |
968 | 74824 | #: view:tender.line.cancel.wizard:0 | 74916 | #: view:tender.line.cancel.wizard:0 |
969 | 74917 | #: view:wizard.import.product.line:0 | ||
970 | 74825 | msgid "Close window" | 74918 | msgid "Close window" |
972 | 74826 | msgstr "Ferme la fenêtre" | 74919 | msgstr "Fermer la fenêtre" |
973 | 74827 | 74920 | ||
974 | 74828 | #. module: msf_outgoing | 74921 | #. module: msf_outgoing |
975 | 74829 | #: code:addons/msf_outgoing/msf_outgoing.py:968 | 74922 | #: code:addons/msf_outgoing/msf_outgoing.py:968 |
976 | @@ -75544,6 +75637,7 @@ | |||
977 | 75544 | #: field:multiple.sourcing.wizard,type:0 | 75637 | #: field:multiple.sourcing.wizard,type:0 |
978 | 75545 | #: field:stock.forecast,procurement_method:0 | 75638 | #: field:stock.forecast,procurement_method:0 |
979 | 75546 | #: report:stock.forecast.report:0 | 75639 | #: report:stock.forecast.report:0 |
980 | 75640 | #: field:product.mass.update,procure_method:0 | ||
981 | 75547 | msgid "Procurement Method" | 75641 | msgid "Procurement Method" |
982 | 75548 | msgstr "Approvisionnement- Méthode" | 75642 | msgstr "Approvisionnement- Méthode" |
983 | 75549 | 75643 | ||
984 | @@ -76058,8 +76152,9 @@ | |||
985 | 76058 | msgid "To validate" | 76152 | msgid "To validate" |
986 | 76059 | msgstr "A valider" | 76153 | msgstr "A valider" |
987 | 76060 | 76154 | ||
989 | 76061 | #. module: account | 76155 | #. module: account, product |
990 | 76062 | #: help:product.template,property_account_income:0 | 76156 | #: help:product.template,property_account_income:0 |
991 | 76157 | #: help:product.mass.update,property_account_income:0 | ||
992 | 76063 | msgid "This account will be used for invoices instead of the default one to value sales for the current product" | 76158 | msgid "This account will be used for invoices instead of the default one to value sales for the current product" |
993 | 76064 | msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des ventes du produit actuel" | 76159 | msgstr "Ce compte sera utilisé pour les factures au lieu de celui utilisé par défaut lors de la valorisation des ventes du produit actuel" |
994 | 76065 | 76160 | ||
995 | @@ -77240,6 +77335,7 @@ | |||
996 | 77240 | #: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:196 | 77335 | #: code:addons/msf_doc_import/wizard/wizard_import_tender_line.py:196 |
997 | 77241 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:210 | 77336 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:210 |
998 | 77242 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:219 | 77337 | #: code:addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py:219 |
999 | 77338 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:200 | ||
1000 | 77243 | #, python-format | 77339 | #, python-format |
1001 | 77244 | msgid "Line %s in the Excel file: %s: %s\n" | 77340 | msgid "Line %s in the Excel file: %s: %s\n" |
1002 | 77245 | "" | 77341 | "" |
1003 | @@ -80311,6 +80407,7 @@ | |||
1004 | 80311 | #. modules: stock_forecast, product | 80407 | #. modules: stock_forecast, product |
1005 | 80312 | #: selection:product.template,supply_method:0 | 80408 | #: selection:product.template,supply_method:0 |
1006 | 80313 | #: selection:stock.forecast,supply_method:0 | 80409 | #: selection:stock.forecast,supply_method:0 |
1007 | 80410 | #: selection:product.mass.update,supply_method:0 | ||
1008 | 80314 | msgid "Buy" | 80411 | msgid "Buy" |
1009 | 80315 | msgstr "Acheter" | 80412 | msgstr "Acheter" |
1010 | 80316 | 80413 | ||
1011 | @@ -83036,7 +83133,11 @@ | |||
1012 | 83036 | #: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:89 | 83133 | #: report:addons/msf_supply_doc_export/report/internal_request_export_xls.mako:89 |
1013 | 83037 | #: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:173 | 83134 | #: report:addons/procurement_request/report/internal_request_import_overview_export_xls.mako:173 |
1014 | 83038 | #: field:internal.request.import,state:0 | 83135 | #: field:internal.request.import,state:0 |
1015 | 83136 | <<<<<<< TREE | ||
1016 | 83039 | #: field:wizard.import.ppl.to.create.ship,state:0 | 83137 | #: field:wizard.import.ppl.to.create.ship,state:0 |
1017 | 83138 | ======= | ||
1018 | 83139 | #: field:wizard.import.product.line,state:0 | ||
1019 | 83140 | >>>>>>> MERGE-SOURCE | ||
1020 | 83040 | #, python-format | 83141 | #, python-format |
1021 | 83041 | msgid "State" | 83142 | msgid "State" |
1022 | 83042 | msgstr "État" | 83143 | msgstr "État" |
1023 | @@ -83970,6 +84071,7 @@ | |||
1024 | 83970 | #: field:reserved.products.wizard,product_id:0 | 84071 | #: field:reserved.products.wizard,product_id:0 |
1025 | 83971 | #: field:internal.request.import.line,imp_product_id:0 | 84072 | #: field:internal.request.import.line,imp_product_id:0 |
1026 | 83972 | #: field:internal.request.import.line,in_product_id:0 | 84073 | #: field:internal.request.import.line,in_product_id:0 |
1027 | 84074 | #: field:product.mass.update.errors,product_id:0 | ||
1028 | 83973 | #, python-format | 84075 | #, python-format |
1029 | 83974 | msgid "Product" | 84076 | msgid "Product" |
1030 | 83975 | msgstr "Produit" | 84077 | msgstr "Produit" |
1031 | @@ -84073,7 +84175,7 @@ | |||
1032 | 84073 | msgid "Select a supplier" | 84175 | msgid "Select a supplier" |
1033 | 84074 | msgstr "Sélectionner un fournisseur" | 84176 | msgstr "Sélectionner un fournisseur" |
1034 | 84075 | 84177 | ||
1036 | 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, finance | 84178 | #. 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 |
1037 | 84077 | #: selection:account.invoice.report,state:0 | 84179 | #: selection:account.invoice.report,state:0 |
1038 | 84078 | #: selection:account.journal.period,state:0 | 84180 | #: selection:account.journal.period,state:0 |
1039 | 84079 | #: selection:account.subscription,state:0 | 84181 | #: selection:account.subscription,state:0 |
1040 | @@ -84139,7 +84241,12 @@ | |||
1041 | 84139 | #: code:addons/sale/sale_order.py:3207 | 84241 | #: code:addons/sale/sale_order.py:3207 |
1042 | 84140 | #: code:addons/sale/sale_order.py:3208 | 84242 | #: code:addons/sale/sale_order.py:3208 |
1043 | 84141 | #: selection:internal.request.import,state:0 | 84243 | #: selection:internal.request.import,state:0 |
1044 | 84244 | <<<<<<< TREE | ||
1045 | 84142 | #: selection:wizard.import.ppl.to.create.ship,state:0 | 84245 | #: selection:wizard.import.ppl.to.create.ship,state:0 |
1046 | 84246 | ======= | ||
1047 | 84247 | #: selection:wizard.import.product.line,state:0 | ||
1048 | 84248 | #: selection:product.mass.update,state:0 | ||
1049 | 84249 | >>>>>>> MERGE-SOURCE | ||
1050 | 84143 | #, python-format | 84250 | #, python-format |
1051 | 84144 | msgid "Done" | 84251 | msgid "Done" |
1052 | 84145 | msgstr "Terminé" | 84252 | msgstr "Terminé" |
1053 | @@ -84899,7 +85006,7 @@ | |||
1054 | 84899 | msgid "Sourced-n line" | 85006 | msgid "Sourced-n line" |
1055 | 84900 | msgstr "Ligne sourcée-n" | 85007 | msgstr "Ligne sourcée-n" |
1056 | 84901 | 85008 | ||
1058 | 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_import | 85009 | #. 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 |
1059 | 84903 | #: field:import.commitment.wizard,in_progress:0 | 85010 | #: field:import.commitment.wizard,in_progress:0 |
1060 | 84904 | #: view:product.history.consumption:0 | 85011 | #: view:product.history.consumption:0 |
1061 | 84905 | #: selection:product.history.consumption,fake_status:0 | 85012 | #: selection:product.history.consumption,fake_status:0 |
1062 | @@ -84938,7 +85045,12 @@ | |||
1063 | 84938 | #: selection:sale.followup.multi.wizard,state:0 | 85045 | #: selection:sale.followup.multi.wizard,state:0 |
1064 | 84939 | #: selection:export.report.stock.inventory,state:0 | 85046 | #: selection:export.report.stock.inventory,state:0 |
1065 | 84940 | #: selection:export.report.stock.move,state:0 | 85047 | #: selection:export.report.stock.move,state:0 |
1066 | 85048 | <<<<<<< TREE | ||
1067 | 84941 | #: selection:wizard.import.ppl.to.create.ship,state:0 | 85049 | #: selection:wizard.import.ppl.to.create.ship,state:0 |
1068 | 85050 | ======= | ||
1069 | 85051 | #: selection:wizard.import.product.line,state:0 | ||
1070 | 85052 | #: selection:product.mass.update,state:0 | ||
1071 | 85053 | >>>>>>> MERGE-SOURCE | ||
1072 | 84942 | #, python-format | 85054 | #, python-format |
1073 | 84943 | msgid "In Progress" | 85055 | msgid "In Progress" |
1074 | 84944 | msgstr "En cours" | 85056 | msgstr "En cours" |
1075 | @@ -85935,9 +86047,10 @@ | |||
1076 | 85935 | msgid "Asia/Harbin" | 86047 | msgid "Asia/Harbin" |
1077 | 85936 | msgstr "Asia/Harbin" | 86048 | msgstr "Asia/Harbin" |
1078 | 85937 | 86049 | ||
1080 | 85938 | #. module: stock_forecast | 86050 | #. module: stock_forecast, product |
1081 | 85939 | #: field:stock.forecast,dangerous_goods:0 | 86051 | #: field:stock.forecast,dangerous_goods:0 |
1082 | 85940 | #: report:stock.forecast.report:0 | 86052 | #: report:stock.forecast.report:0 |
1083 | 86053 | #: field:product.mass.update,dangerous_goods:0 | ||
1084 | 85941 | msgid "Dangerous Goods" | 86054 | msgid "Dangerous Goods" |
1085 | 85942 | msgstr "Marchandises Dangereuses" | 86055 | msgstr "Marchandises Dangereuses" |
1086 | 85943 | 86056 | ||
1087 | @@ -86411,6 +86524,7 @@ | |||
1088 | 86411 | #. modules: consumption_calculation, product | 86524 | #. modules: consumption_calculation, product |
1089 | 86412 | #: selection:product.price.type,field:0 | 86525 | #: selection:product.price.type,field:0 |
1090 | 86413 | #: field:product.product,procure_delay:0 | 86526 | #: field:product.product,procure_delay:0 |
1091 | 86527 | #: field:product.mass.update,procure_delay:0 | ||
1092 | 86414 | msgid "Procurement Lead Time" | 86528 | msgid "Procurement Lead Time" |
1093 | 86415 | msgstr "Délai d'approvisionnement" | 86529 | msgstr "Délai d'approvisionnement" |
1094 | 86416 | 86530 | ||
1095 | @@ -88148,10 +88262,11 @@ | |||
1096 | 88148 | msgid "Invisible expiry date" | 88262 | msgid "Invisible expiry date" |
1097 | 88149 | msgstr "Invisible expiry date" | 88263 | msgstr "Invisible expiry date" |
1098 | 88150 | 88264 | ||
1100 | 88151 | #. modules: stock_forecast, product_attributes | 88265 | #. modules: stock_forecast, product_attributes, product |
1101 | 88152 | #: field:product.product,short_shelf_life:0 | 88266 | #: field:product.product,short_shelf_life:0 |
1102 | 88153 | #: field:stock.forecast,short_shelf_life:0 | 88267 | #: field:stock.forecast,short_shelf_life:0 |
1103 | 88154 | #: report:stock.forecast.report:0 | 88268 | #: report:stock.forecast.report:0 |
1104 | 88269 | #: field:product.mass.update,short_shelf_life:0 | ||
1105 | 88155 | msgid "Short Shelf Life" | 88270 | msgid "Short Shelf Life" |
1106 | 88156 | msgstr "Durée de Conservation Limitée " | 88271 | msgstr "Durée de Conservation Limitée " |
1107 | 88157 | 88272 | ||
1108 | @@ -88534,6 +88649,8 @@ | |||
1109 | 88534 | #: field:physical.inventory,file_to_import2:0 | 88649 | #: field:physical.inventory,file_to_import2:0 |
1110 | 88535 | #: field:supplier.catalogue,file_to_import:0 | 88650 | #: field:supplier.catalogue,file_to_import:0 |
1111 | 88536 | #: field:internal.request.import,file_to_import:0 | 88651 | #: field:internal.request.import,file_to_import:0 |
1112 | 88652 | #: view:wizard.import.product.line:0 | ||
1113 | 88653 | #: field:wizard.import.product.line,file:0 | ||
1114 | 88537 | msgid "File to import" | 88654 | msgid "File to import" |
1115 | 88538 | msgstr "Fichier à importer" | 88655 | msgstr "Fichier à importer" |
1116 | 88539 | 88656 | ||
1117 | @@ -91514,6 +91631,7 @@ | |||
1118 | 91514 | #: model:process.node,name:procurement.process_node_serviceonorder0 | 91631 | #: model:process.node,name:procurement.process_node_serviceonorder0 |
1119 | 91515 | #: selection:product.template,procure_method:0 | 91632 | #: selection:product.template,procure_method:0 |
1120 | 91516 | #: selection:stock.forecast,procurement_method:0 | 91633 | #: selection:stock.forecast,procurement_method:0 |
1121 | 91634 | #: selection:product.mass.update,procure_method:0 | ||
1122 | 91517 | msgid "Make to Order" | 91635 | msgid "Make to Order" |
1123 | 91518 | msgstr "Production sur Commande" | 91636 | msgstr "Production sur Commande" |
1124 | 91519 | 91637 | ||
1125 | @@ -92913,6 +93031,7 @@ | |||
1126 | 92913 | #. modules: stock_forecast, product | 93031 | #. modules: stock_forecast, product |
1127 | 92914 | #: selection:product.template,supply_method:0 | 93032 | #: selection:product.template,supply_method:0 |
1128 | 92915 | #: selection:stock.forecast,supply_method:0 | 93033 | #: selection:stock.forecast,supply_method:0 |
1129 | 93034 | #: selection:product.mass.update,supply_method:0 | ||
1130 | 92916 | msgid "Produce" | 93035 | msgid "Produce" |
1131 | 92917 | msgstr "Produire" | 93036 | msgstr "Produire" |
1132 | 92918 | 93037 | ||
1133 | @@ -95866,9 +95985,10 @@ | |||
1134 | 95866 | msgid "This ISO code is the name of po files to use for translations" | 95985 | msgid "This ISO code is the name of po files to use for translations" |
1135 | 95867 | msgstr "Ce code ISO est le nom des fichiers po utilisés pour les traductions" | 95986 | msgstr "Ce code ISO est le nom des fichiers po utilisés pour les traductions" |
1136 | 95868 | 95987 | ||
1138 | 95869 | #. module: product_attributes, purchase | 95988 | #. module: product_attributes, purchase, product |
1139 | 95870 | #: field:product.product,heat_sensitive_item:0 | 95989 | #: field:product.product,heat_sensitive_item:0 |
1140 | 95871 | #: field:purchase.order.line,heat_sensitive_item:0 | 95990 | #: field:purchase.order.line,heat_sensitive_item:0 |
1141 | 95991 | #: field:product.mass.update,heat_sensitive_item:0 | ||
1142 | 95872 | msgid "Temperature sensitive item" | 95992 | msgid "Temperature sensitive item" |
1143 | 95873 | msgstr "Article sensible à la température" | 95993 | msgstr "Article sensible à la température" |
1144 | 95874 | 95994 | ||
1145 | @@ -97010,9 +97130,10 @@ | |||
1146 | 97010 | msgid "Last reviewed on (hidden)" | 97130 | msgid "Last reviewed on (hidden)" |
1147 | 97011 | msgstr "Revu la dernière fois le (caché)" | 97131 | msgstr "Revu la dernière fois le (caché)" |
1148 | 97012 | 97132 | ||
1150 | 97013 | #. module: stock_forecast | 97133 | #. module: stock_forecast, product |
1151 | 97014 | #: field:stock.forecast,supply_method:0 | 97134 | #: field:stock.forecast,supply_method:0 |
1152 | 97015 | #: report:stock.forecast.report:0 | 97135 | #: report:stock.forecast.report:0 |
1153 | 97136 | #: field:product.mass.update,supply_method:0 | ||
1154 | 97016 | msgid "Supply Method" | 97137 | msgid "Supply Method" |
1155 | 97017 | msgstr "Méthode d'Approvisionnement" | 97138 | msgstr "Méthode d'Approvisionnement" |
1156 | 97018 | 97139 | ||
1157 | @@ -98079,7 +98200,11 @@ | |||
1158 | 98079 | #: view:integrity.finance.wizard:0 | 98200 | #: view:integrity.finance.wizard:0 |
1159 | 98080 | #: view:stock.move.cancel.wizard:0 | 98201 | #: view:stock.move.cancel.wizard:0 |
1160 | 98081 | #: view:stock.picking.cancel.wizard:0 | 98202 | #: view:stock.picking.cancel.wizard:0 |
1161 | 98203 | <<<<<<< TREE | ||
1162 | 98082 | #: view:wizard.pick.import:0 | 98204 | #: view:wizard.pick.import:0 |
1163 | 98205 | ======= | ||
1164 | 98206 | #: view:wizard.import.product.line:0 | ||
1165 | 98207 | >>>>>>> MERGE-SOURCE | ||
1166 | 98083 | #, python-format | 98208 | #, python-format |
1167 | 98084 | msgid "Cancel" | 98209 | msgid "Cancel" |
1168 | 98085 | msgstr "Annuler" | 98210 | msgstr "Annuler" |
1169 | @@ -99636,8 +99761,9 @@ | |||
1170 | 99636 | msgid "Available Shipped" | 99761 | msgid "Available Shipped" |
1171 | 99637 | msgstr "Disponible expédié" | 99762 | msgstr "Disponible expédié" |
1172 | 99638 | 99763 | ||
1174 | 99639 | #. module: product_attributes | 99764 | #. module: product_attributes, product |
1175 | 99640 | #: selection:product.product,state_ud:0 | 99765 | #: selection:product.product,state_ud:0 |
1176 | 99766 | #: selection:product.mass.update,product_state:0 | ||
1177 | 99641 | msgid "Archived" | 99767 | msgid "Archived" |
1178 | 99642 | msgstr "Archivé" | 99768 | msgstr "Archivé" |
1179 | 99643 | 99769 | ||
1180 | @@ -101236,8 +101362,9 @@ | |||
1181 | 101236 | msgid "Page need to be refreshed - please press \"F5\"" | 101362 | msgid "Page need to be refreshed - please press \"F5\"" |
1182 | 101237 | msgstr "La page doit être rafraîchie, veuillez cliquer sur \"F5\"" | 101363 | msgstr "La page doit être rafraîchie, veuillez cliquer sur \"F5\"" |
1183 | 101238 | 101364 | ||
1185 | 101239 | #. module: product_expiry | 101365 | #. module: product_expiry, product |
1186 | 101240 | #: help:product.product,life_time:0 | 101366 | #: help:product.product,life_time:0 |
1187 | 101367 | #: help:product.mass.update,life_time:0 | ||
1188 | 101241 | msgid "The number of months before a production lot may become dangerous and should not be consumed." | 101368 | msgid "The number of months before a production lot may become dangerous and should not be consumed." |
1189 | 101242 | msgstr "Nombre de mois avant qu'un lot de production ne devienne dangereux et qu'il ne puisse plus être consommé." | 101369 | msgstr "Nombre de mois avant qu'un lot de production ne devienne dangereux et qu'il ne puisse plus être consommé." |
1190 | 101243 | 101370 | ||
1191 | @@ -103871,6 +103998,7 @@ | |||
1192 | 103871 | #, python-format | 103998 | #, python-format |
1193 | 103872 | msgid "Source Location %s is inactive" | 103999 | msgid "Source Location %s is inactive" |
1194 | 103873 | msgstr "La Zone Source %s est inactive" | 104000 | msgstr "La Zone Source %s est inactive" |
1195 | 104001 | <<<<<<< TREE | ||
1196 | 103874 | 104002 | ||
1197 | 103875 | #. module: sale | 104003 | #. module: sale |
1198 | 103876 | #: report:addons/sale/report/sale_donation_stock_moves_report_xls.mako:140 | 104004 | #: report:addons/sale/report/sale_donation_stock_moves_report_xls.mako:140 |
1199 | @@ -105388,3 +105516,301 @@ | |||
1200 | 105388 | #, python-format | 105516 | #, python-format |
1201 | 105389 | msgid "Product %s, BN: %s not enough stock to process quantity %s %s (stock level: %s)" | 105517 | msgid "Product %s, BN: %s not enough stock to process quantity %s %s (stock level: %s)" |
1202 | 105390 | msgstr "Produit %s, Lot: %s, pas assez de stock pour traiter la qantité %s %s (quantité en stock: %s)" | 105518 | msgstr "Produit %s, Lot: %s, pas assez de stock pour traiter la qantité %s %s (quantité en stock: %s)" |
1203 | 105519 | ======= | ||
1204 | 105520 | |||
1205 | 105521 | #. module: product | ||
1206 | 105522 | #: model:ir.ui.menu,name:product.parent_product_mass_update | ||
1207 | 105523 | msgid "Products Update" | ||
1208 | 105524 | msgstr "MÃ J de Produits" | ||
1209 | 105525 | |||
1210 | 105526 | #. module: product | ||
1211 | 105527 | #: field:product.product,expected_prod_creator:0 | ||
1212 | 105528 | msgid "Expected Product Creator for Product Mass Update" | ||
1213 | 105529 | msgstr "Créateur Produit attendu pour la Mà J de Produits en Masse" | ||
1214 | 105530 | |||
1215 | 105531 | #. module: product | ||
1216 | 105532 | #: model:ir.model,name:product.model_product_mass_update_progressbar | ||
1217 | 105533 | msgid "Product Mass Update Progress Bar" | ||
1218 | 105534 | msgstr "Barre de Progression de la MÃ J de Produits en Masse" | ||
1219 | 105535 | |||
1220 | 105536 | #. module: product | ||
1221 | 105537 | #: code:addons/product/wizard/product_mass_update.py:343 | ||
1222 | 105538 | #: model:ir.actions.report.xml,name:product.product_mass_update_export_xls | ||
1223 | 105539 | #: report:addons/product/report/product_mass_update_export_xls.mako:92 | ||
1224 | 105540 | #, python-format | ||
1225 | 105541 | msgid "Product Mass Update Errors" | ||
1226 | 105542 | msgstr "Erreurs de la MÃ J de Produits en Masse" | ||
1227 | 105543 | |||
1228 | 105544 | #. modules: msf_doc_import, product, product_attributes | ||
1229 | 105545 | #: field:wizard.import.product.line,product_mass_upd_id:0 | ||
1230 | 105546 | #: model:ir.actions.act_window,name:product.previous_mass_update_action | ||
1231 | 105547 | #: model:ir.model,name:product.model_product_mass_update | ||
1232 | 105548 | #: view:product.mass.update:0 | ||
1233 | 105549 | #: field:product.mass.update.progressbar,p_mass_upd_id:0 | ||
1234 | 105550 | #: model:ir.ui.menu,name:product_attributes.menu_import_request | ||
1235 | 105551 | msgid "Product Mass Update" | ||
1236 | 105552 | msgstr "MÃ J de Produits en Masse" | ||
1237 | 105553 | |||
1238 | 105554 | #. module: product | ||
1239 | 105555 | #: field:product.mass.update,date_done:0 | ||
1240 | 105556 | msgid "Date of the update" | ||
1241 | 105557 | msgstr "Date de la mise à jour" | ||
1242 | 105558 | |||
1243 | 105559 | #. module: product | ||
1244 | 105560 | #: field:product.mass.update,seller_id:0 | ||
1245 | 105561 | msgid "Default Partner" | ||
1246 | 105562 | msgstr "Partenaire par Défaut" | ||
1247 | 105563 | |||
1248 | 105564 | #. module: product | ||
1249 | 105565 | #: view:product.mass.update:0 | ||
1250 | 105566 | msgid " New Data " | ||
1251 | 105567 | msgstr " Nouvelles Données " | ||
1252 | 105568 | |||
1253 | 105569 | #. module: product | ||
1254 | 105570 | #: view:product.mass.update:0 | ||
1255 | 105571 | msgid "Delete Update" | ||
1256 | 105572 | msgstr "Supprimer la Mise à Jour" | ||
1257 | 105573 | |||
1258 | 105574 | #. module: product | ||
1259 | 105575 | #: view:product.mass.update:0 | ||
1260 | 105576 | msgid "Apply Update" | ||
1261 | 105577 | msgstr "Appliquer la Mise à Jour" | ||
1262 | 105578 | |||
1263 | 105579 | #. module: msf_doc_import | ||
1264 | 105580 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:219 | ||
1265 | 105581 | #, python-format | ||
1266 | 105582 | msgid "\n" | ||
1267 | 105583 | " Importation completed in %s!\n" | ||
1268 | 105584 | "# of imported lines : %s on %s lines\n" | ||
1269 | 105585 | "# of ignored lines: %s\n" | ||
1270 | 105586 | "# of lines to correct: %s\n" | ||
1271 | 105587 | " %s\n" | ||
1272 | 105588 | "\n" | ||
1273 | 105589 | " %s\n" | ||
1274 | 105590 | " " | ||
1275 | 105591 | msgstr "\n" | ||
1276 | 105592 | " Import terminé en %s!\n" | ||
1277 | 105593 | "# de lignes importées : %s sur %s lignes\n" | ||
1278 | 105594 | "# de lignes ignorées: %s\n" | ||
1279 | 105595 | "# de lignes à corriger: %s\n" | ||
1280 | 105596 | " %s\n" | ||
1281 | 105597 | "\n" | ||
1282 | 105598 | " %s\n" | ||
1283 | 105599 | " " | ||
1284 | 105600 | |||
1285 | 105601 | #. module: msf_doc_import | ||
1286 | 105602 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:177 | ||
1287 | 105603 | #, python-format | ||
1288 | 105604 | msgid "Product code %s doesn't exist in the DB. " | ||
1289 | 105605 | msgstr "Le Code Produit %s n'existe pas dans la BDD. " | ||
1290 | 105606 | |||
1291 | 105607 | #. module: msf_doc_import | ||
1292 | 105608 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:110 | ||
1293 | 105609 | #, python-format | ||
1294 | 105610 | msgid "\n" | ||
1295 | 105611 | " Number of columns is not equal to %s" | ||
1296 | 105612 | msgstr "\n" | ||
1297 | 105613 | " Le nombre de colonnes n'est pas égal à %s" | ||
1298 | 105614 | |||
1299 | 105615 | #. module: msf_doc_import | ||
1300 | 105616 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:169 | ||
1301 | 105617 | #, python-format | ||
1302 | 105618 | msgid "Product %s doesn't have the expected Product Creator \"HQ\". " | ||
1303 | 105619 | msgstr "Le Produit %s n'a pas le Créateur Produit attendu \"HQ\". " | ||
1304 | 105620 | |||
1305 | 105621 | #. module: msf_doc_import | ||
1306 | 105622 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:254 | ||
1307 | 105623 | #, python-format | ||
1308 | 105624 | msgid "Nothing to import" | ||
1309 | 105625 | msgstr "Rien à importer" | ||
1310 | 105626 | |||
1311 | 105627 | #. module: msf_doc_import | ||
1312 | 105628 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:183 | ||
1313 | 105629 | #, python-format | ||
1314 | 105630 | msgid "Line %s: " | ||
1315 | 105631 | msgstr "Ligne %s: " | ||
1316 | 105632 | |||
1317 | 105633 | #. module: msf_doc_import | ||
1318 | 105634 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:145 | ||
1319 | 105635 | #, python-format | ||
1320 | 105636 | msgid "Line %s in the Excel file: You should have exactly %s columns in this order: %s \n" | ||
1321 | 105637 | "" | ||
1322 | 105638 | msgstr "Ligne %s du fichier Excel: Vous devriez avoir exactement %s colonnes dans cet ordre: %s \n" | ||
1323 | 105639 | "" | ||
1324 | 105640 | |||
1325 | 105641 | #. module: msf_doc_import | ||
1326 | 105642 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:292 | ||
1327 | 105643 | #, python-format | ||
1328 | 105644 | msgid " Import in progress... \n" | ||
1329 | 105645 | " Please wait that the import is finished before editing." | ||
1330 | 105646 | msgstr " Import en cours... \n" | ||
1331 | 105647 | " Veuillez attendre que l'import soit terminer avant de faire des modifications." | ||
1332 | 105648 | |||
1333 | 105649 | #. module: msf_doc_import | ||
1334 | 105650 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:218 | ||
1335 | 105651 | #, python-format | ||
1336 | 105652 | msgid " second(s)" | ||
1337 | 105653 | msgstr " seconde(s)" | ||
1338 | 105654 | |||
1339 | 105655 | #. module: msf_doc_import | ||
1340 | 105656 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:172 | ||
1341 | 105657 | #, python-format | ||
1342 | 105658 | msgid "Product %s doesn't have the expected Product Creator \"Local\". " | ||
1343 | 105659 | msgstr "Le Produit %s n'a pas le Créateur Produit attendu \"Local\". " | ||
1344 | 105660 | |||
1345 | 105661 | #. module: msf_doc_import | ||
1346 | 105662 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:179 | ||
1347 | 105663 | #, python-format | ||
1348 | 105664 | msgid "Product code is mandatory. " | ||
1349 | 105665 | msgstr "Le Code Produit est obligatoire. " | ||
1350 | 105666 | |||
1351 | 105667 | #. module: msf_doc_import | ||
1352 | 105668 | #: code:addons/msf_doc_import/wizard/wizard_import_fo_line.py:136 | ||
1353 | 105669 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:126 | ||
1354 | 105670 | #, python-format | ||
1355 | 105671 | msgid "\n" | ||
1356 | 105672 | " Please ensure that all these columns are present and in this exact order." | ||
1357 | 105673 | msgstr "\n" | ||
1358 | 105674 | " Veuillez vous assurer que toutes les colonnes sont présentes et dans cet ordre." | ||
1359 | 105675 | |||
1360 | 105676 | #. module: msf_doc_import | ||
1361 | 105677 | #: model:ir.model,name:msf_doc_import.model_wizard_import_product_line | ||
1362 | 105678 | msgid "Import Products data from Excel sheet" | ||
1363 | 105679 | msgstr "Import des données de Produits depuis la feuille Excel" | ||
1364 | 105680 | |||
1365 | 105681 | #. module: msf_doc_import | ||
1366 | 105682 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:216 | ||
1367 | 105683 | #, python-format | ||
1368 | 105684 | msgid "Reported errors for ignored lines : \n" | ||
1369 | 105685 | "" | ||
1370 | 105686 | msgstr "Erreurs signalées pour les lignes ignorées : \n" | ||
1371 | 105687 | "" | ||
1372 | 105688 | |||
1373 | 105689 | #. module: msf_doc_import | ||
1374 | 105690 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:175 | ||
1375 | 105691 | #, python-format | ||
1376 | 105692 | msgid "You must be on Coordo or HQ instance to add products to the list. " | ||
1377 | 105693 | msgstr "Vous devez etre sur une instance Coordo ou HQ pour ajouter des produits à la liste. " | ||
1378 | 105694 | |||
1379 | 105695 | #. module: msf_doc_import | ||
1380 | 105696 | #: code:addons/msf_doc_import/wizard/wizard_import_product_line.py:273 | ||
1381 | 105697 | #, python-format | ||
1382 | 105698 | msgid "The file has no row, nothing to import" | ||
1383 | 105699 | msgstr "Le fichier n'a pas de ligne, il n'y a rien à importer" | ||
1384 | 105700 | |||
1385 | 105701 | #. module: product | ||
1386 | 105702 | #: selection:product.mass.update,product_state:0 | ||
1387 | 105703 | msgid "Status 1" | ||
1388 | 105704 | msgstr "Statut 1" | ||
1389 | 105705 | |||
1390 | 105706 | #. module: product | ||
1391 | 105707 | #: selection:product.mass.update,product_state:0 | ||
1392 | 105708 | msgid "Status 2" | ||
1393 | 105709 | msgstr "Statut 2" | ||
1394 | 105710 | |||
1395 | 105711 | #. module: product | ||
1396 | 105712 | #: code:addons/product/wizard/product_mass_update.py:210 | ||
1397 | 105713 | #, python-format | ||
1398 | 105714 | msgid "Use Time must be an integer." | ||
1399 | 105715 | msgstr "La Durée d'utilisation doit être un entier." | ||
1400 | 105716 | |||
1401 | 105717 | #. module: product | ||
1402 | 105718 | #: code:addons/product/wizard/product_mass_update.py:198 | ||
1403 | 105719 | #, python-format | ||
1404 | 105720 | msgid "Alert Time must be an integer." | ||
1405 | 105721 | msgstr "La Période d'Alerte doit être un entier." | ||
1406 | 105722 | |||
1407 | 105723 | #. module: product | ||
1408 | 105724 | #: code:addons/product/wizard/product_mass_update.py:204 | ||
1409 | 105725 | #, python-format | ||
1410 | 105726 | msgid "Life Time must be an integer." | ||
1411 | 105727 | msgstr "La Durée de Vie d'un produit doit être un entier." | ||
1412 | 105728 | |||
1413 | 105729 | #. module: product | ||
1414 | 105730 | #: code:addons/product/wizard/product_mass_update.py:216 | ||
1415 | 105731 | #, python-format | ||
1416 | 105732 | msgid "Procurement Lead Time must be a float." | ||
1417 | 105733 | msgstr "Le Délai d'approvisionnement doit être nombre à virgule." | ||
1418 | 105734 | |||
1419 | 105735 | #. module: product | ||
1420 | 105736 | #: code:addons/product/wizard/product_mass_update.py:237 | ||
1421 | 105737 | #, python-format | ||
1422 | 105738 | msgid "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." | ||
1423 | 105739 | msgstr "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." | ||
1424 | 105740 | |||
1425 | 105741 | #. module: product | ||
1426 | 105742 | #: view:product.mass.update:0 | ||
1427 | 105743 | msgid "Non-Deactivable Products" | ||
1428 | 105744 | msgstr "Produits Non-Désactivables" | ||
1429 | 105745 | |||
1430 | 105746 | #. module: product | ||
1431 | 105747 | #: view:product.mass.update:0 | ||
1432 | 105748 | msgid "Export Product List" | ||
1433 | 105749 | msgstr "Exporter la Liste des Produits" | ||
1434 | 105750 | |||
1435 | 105751 | #. module: product | ||
1436 | 105752 | #: report:addons/product/report/product_mass_update_export_xls.mako:104 | ||
1437 | 105753 | msgid "PRODUCT MASS UPDATE ERRORS" | ||
1438 | 105754 | msgstr "ERREURS DE LA MÀJ DE PRODUITS EN MASSE" | ||
1439 | 105755 | |||
1440 | 105756 | #. module: product | ||
1441 | 105757 | #: view:product.mass.update:0 | ||
1442 | 105758 | msgid "Reset Update" | ||
1443 | 105759 | msgstr "Réinitialiser la Mise à Jour" | ||
1444 | 105760 | |||
1445 | 105761 | #. module: product | ||
1446 | 105762 | #: code:addons/product/wizard/product_mass_update.py:182 | ||
1447 | 105763 | #, python-format | ||
1448 | 105764 | msgid "You can not apply an update on no products." | ||
1449 | 105765 | msgstr "Vous ne pouvez pas appliquer de mise à jour à aucun produits." | ||
1450 | 105766 | |||
1451 | 105767 | #. module: product | ||
1452 | 105768 | #: code:addons/product/wizard/product_mass_update.py:287 | ||
1453 | 105769 | msgid "Some products could not be deactivated. No product will be changed until all of them can be deactivated. Please check the corresponding tab." | ||
1454 | 105770 | msgstr "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é." | ||
1455 | 105771 | |||
1456 | 105772 | #. module: product | ||
1457 | 105773 | #: field:product.mass.update,name:0 | ||
1458 | 105774 | msgid "Update Reference" | ||
1459 | 105775 | msgstr "Référence de la Mà J" | ||
1460 | 105776 | |||
1461 | 105777 | #. module: product | ||
1462 | 105778 | #: field:product.mass.update.errors,stock_exist:0 | ||
1463 | 105779 | #: report:addons/product/report/product_mass_update_export_xls.mako:119 | ||
1464 | 105780 | msgid "Stock Exist" | ||
1465 | 105781 | msgstr "Stock Présent" | ||
1466 | 105782 | |||
1467 | 105783 | #. module: product | ||
1468 | 105784 | #: field:product.mass.update.errors,open_documents:0 | ||
1469 | 105785 | #: report:addons/product/report/product_mass_update_export_xls.mako:119 | ||
1470 | 105786 | msgid "Open Documents" | ||
1471 | 105787 | msgstr "Documents Ouverts" | ||
1472 | 105788 | |||
1473 | 105789 | #. module: product | ||
1474 | 105790 | #: code:addons/product/wizard/product_mass_update.py:323 | ||
1475 | 105791 | #, python-format | ||
1476 | 105792 | msgid "An error has occured during the update:\n" | ||
1477 | 105793 | "%s" | ||
1478 | 105794 | msgstr "Une erreur est survenue lors de la mise à jour:\n" | ||
1479 | 105795 | "%s" | ||
1480 | 105796 | |||
1481 | 105797 | #. module: product | ||
1482 | 105798 | #: field:product.mass.update,user_id:0 | ||
1483 | 105799 | msgid "User who Updated" | ||
1484 | 105800 | msgstr "Utilisateur qui a Mis à Jour" | ||
1485 | 105801 | |||
1486 | 105802 | #. module: product | ||
1487 | 105803 | #: field:product.mass.update,empty_exp_account:0 | ||
1488 | 105804 | msgid "Set Expense Account as empty" | ||
1489 | 105805 | msgstr "Mettre le Compte de Charge à vide" | ||
1490 | 105806 | |||
1491 | 105807 | #. module: product | ||
1492 | 105808 | #: field:product.mass.update,empty_inc_account:0 | ||
1493 | 105809 | msgid "Set Income Account as empty" | ||
1494 | 105810 | msgstr "Mettre le Compte de Produits à vide" | ||
1495 | 105811 | |||
1496 | 105812 | #. module: product | ||
1497 | 105813 | #: field:product.mass.update,empty_status:0 | ||
1498 | 105814 | msgid "Set Status as empty" | ||
1499 | 105815 | msgstr "Mettre le Statut à vide" | ||
1500 | 105816 | >>>>>>> MERGE-SOURCE | ||
1501 | 105391 | 105817 | ||
1502 | === modified file 'bin/addons/product/__openerp__.py' | |||
1503 | --- bin/addons/product/__openerp__.py 2017-09-28 14:05:02 +0000 | |||
1504 | +++ bin/addons/product/__openerp__.py 2019-04-15 13:13:32 +0000 | |||
1505 | @@ -54,7 +54,9 @@ | |||
1506 | 54 | 'product_report.xml', | 54 | 'product_report.xml', |
1507 | 55 | 'product_view.xml', | 55 | 'product_view.xml', |
1508 | 56 | 'pricelist_view.xml', | 56 | 'pricelist_view.xml', |
1510 | 57 | 'process/product_process.xml' | 57 | 'process/product_process.xml', |
1511 | 58 | 'wizard/product_mass_update_view.xml', | ||
1512 | 59 | 'report/product_mass_update_export_view.xml', | ||
1513 | 58 | ], | 60 | ], |
1514 | 59 | 'test':[], | 61 | 'test':[], |
1515 | 60 | 'installable': True, | 62 | 'installable': True, |
1516 | 61 | 63 | ||
1517 | === modified file 'bin/addons/product/product.py' | |||
1518 | --- bin/addons/product/product.py 2019-02-08 16:56:18 +0000 | |||
1519 | +++ bin/addons/product/product.py 2019-04-15 13:13:32 +0000 | |||
1520 | @@ -588,6 +588,34 @@ | |||
1521 | 588 | (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '') | 588 | (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '') |
1522 | 589 | return res | 589 | return res |
1523 | 590 | 590 | ||
1524 | 591 | def _get_expected_prod_creator(self, cr, uid, ids, field_names, arg, context=None): | ||
1525 | 592 | if context is None: | ||
1526 | 593 | context = {} | ||
1527 | 594 | |||
1528 | 595 | res = {} | ||
1529 | 596 | for id in ids: | ||
1530 | 597 | res[id] = False | ||
1531 | 598 | |||
1532 | 599 | return res | ||
1533 | 600 | |||
1534 | 601 | def _expected_prod_creator_search(self, cr, uid, obj, name, args, context=None): | ||
1535 | 602 | ''' | ||
1536 | 603 | Returns all documents according to the product creator | ||
1537 | 604 | ''' | ||
1538 | 605 | if context is None: | ||
1539 | 606 | context = {} | ||
1540 | 607 | |||
1541 | 608 | obj_data = self.pool.get('ir.model.data') | ||
1542 | 609 | instance_level = self.pool.get('res.users').browse(cr, uid, uid).company_id.instance_id.level | ||
1543 | 610 | prod_creator_id = False | ||
1544 | 611 | for arg in args: | ||
1545 | 612 | if arg[0] == 'expected_prod_creator': | ||
1546 | 613 | if instance_level == 'section': | ||
1547 | 614 | prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_3')[1] | ||
1548 | 615 | elif instance_level == 'coordo': | ||
1549 | 616 | prod_creator_id = obj_data.get_object_reference(cr, uid, 'product_attributes', 'int_4')[1] | ||
1550 | 617 | |||
1551 | 618 | return [('international_status', '=', prod_creator_id)] | ||
1552 | 591 | 619 | ||
1553 | 592 | _defaults = { | 620 | _defaults = { |
1554 | 593 | 'active': lambda *a: 1, | 621 | 'active': lambda *a: 1, |
1555 | @@ -619,9 +647,9 @@ | |||
1556 | 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')), |
1557 | 620 | 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'), | 648 | 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'), |
1558 | 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), |
1559 | 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'), | ||
1560 | 622 | } | 651 | } |
1561 | 623 | 652 | ||
1562 | 624 | |||
1563 | 625 | def unlink(self, cr, uid, ids, context=None): | 653 | def unlink(self, cr, uid, ids, context=None): |
1564 | 626 | unlink_ids = [] | 654 | unlink_ids = [] |
1565 | 627 | unlink_product_tmpl_ids = [] | 655 | unlink_product_tmpl_ids = [] |
1566 | 628 | 656 | ||
1567 | === modified file 'bin/addons/product/report/__init__.py' | |||
1568 | --- bin/addons/product/report/__init__.py 2011-01-14 00:11:01 +0000 | |||
1569 | +++ bin/addons/product/report/__init__.py 2019-04-15 13:13:32 +0000 | |||
1570 | @@ -19,6 +19,7 @@ | |||
1571 | 19 | # | 19 | # |
1572 | 20 | ############################################################################## | 20 | ############################################################################## |
1573 | 21 | import product_pricelist | 21 | import product_pricelist |
1574 | 22 | import product_mass_update_export | ||
1575 | 22 | 23 | ||
1576 | 23 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | 24 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
1577 | 24 | 25 | ||
1578 | 25 | 26 | ||
1579 | === added file 'bin/addons/product/report/product_mass_update_export.py' | |||
1580 | --- bin/addons/product/report/product_mass_update_export.py 1970-01-01 00:00:00 +0000 | |||
1581 | +++ bin/addons/product/report/product_mass_update_export.py 2019-04-15 13:13:32 +0000 | |||
1582 | @@ -0,0 +1,55 @@ | |||
1583 | 1 | # -*- coding: utf-8 -*- | ||
1584 | 2 | ############################################################################## | ||
1585 | 3 | # | ||
1586 | 4 | # OpenERP, Open Source Management Solution | ||
1587 | 5 | # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). | ||
1588 | 6 | # | ||
1589 | 7 | # This program is free software: you can redistribute it and/or modify | ||
1590 | 8 | # it under the terms of the GNU Affero General Public License as | ||
1591 | 9 | # published by the Free Software Foundation, either version 3 of the | ||
1592 | 10 | # License, or (at your option) any later version. | ||
1593 | 11 | # | ||
1594 | 12 | # This program is distributed in the hope that it will be useful, | ||
1595 | 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1596 | 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1597 | 15 | # GNU Affero General Public License for more details. | ||
1598 | 16 | # | ||
1599 | 17 | # You should have received a copy of the GNU Affero General Public License | ||
1600 | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
1601 | 19 | # | ||
1602 | 20 | ############################################################################## | ||
1603 | 21 | |||
1604 | 22 | from report import report_sxw | ||
1605 | 23 | from spreadsheet_xml.spreadsheet_xml_write import SpreadsheetReport | ||
1606 | 24 | from tools.translate import _ | ||
1607 | 25 | |||
1608 | 26 | |||
1609 | 27 | class product_mass_update_export_parser(report_sxw.rml_parse): | ||
1610 | 28 | |||
1611 | 29 | def __init__(self, cr, uid, name, context): | ||
1612 | 30 | super(product_mass_update_export_parser, self).__init__(cr, uid, name, context=context) | ||
1613 | 31 | self.counter = 0 | ||
1614 | 32 | self.localcontext.update({ | ||
1615 | 33 | 'getErrors': self.get_errors, | ||
1616 | 34 | }) | ||
1617 | 35 | |||
1618 | 36 | def get_errors(self): | ||
1619 | 37 | upd_errors = [] | ||
1620 | 38 | |||
1621 | 39 | if not self.ids: | ||
1622 | 40 | return upd_errors | ||
1623 | 41 | |||
1624 | 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: | ||
1625 | 43 | upd_errors.append({ | ||
1626 | 44 | 'default_code': upd_error.product_id.default_code, | ||
1627 | 45 | 'name': upd_error.product_id.name, | ||
1628 | 46 | 'stock_exist': upd_error.stock_exist, | ||
1629 | 47 | 'qty_available': upd_error.product_id.qty_available, | ||
1630 | 48 | 'virtual_available': upd_error.product_id.virtual_available, | ||
1631 | 49 | 'open_documents': upd_error.open_documents, | ||
1632 | 50 | }) | ||
1633 | 51 | |||
1634 | 52 | return upd_errors | ||
1635 | 53 | |||
1636 | 54 | |||
1637 | 55 | SpreadsheetReport('report.product_mass_update_export_xls', 'product.mass.update', 'addons/product/report/product_mass_update_export_xls.mako', parser=product_mass_update_export_parser) | ||
1638 | 0 | 56 | ||
1639 | === added file 'bin/addons/product/report/product_mass_update_export_view.xml' | |||
1640 | --- bin/addons/product/report/product_mass_update_export_view.xml 1970-01-01 00:00:00 +0000 | |||
1641 | +++ bin/addons/product/report/product_mass_update_export_view.xml 2019-04-15 13:13:32 +0000 | |||
1642 | @@ -0,0 +1,14 @@ | |||
1643 | 1 | <?xml version="1.0" encoding="utf-8" ?> | ||
1644 | 2 | <openerp> | ||
1645 | 3 | <data> | ||
1646 | 4 | <report | ||
1647 | 5 | id="product_mass_update_export_xls" | ||
1648 | 6 | string="Product Mass Update Errors" | ||
1649 | 7 | model="product.mass.update" | ||
1650 | 8 | name="product_mass_update_export_xls" | ||
1651 | 9 | file="product/report/product_mass_update_export_xls.mako" | ||
1652 | 10 | report_type="webkit" | ||
1653 | 11 | menu="False" | ||
1654 | 12 | /> | ||
1655 | 13 | </data> | ||
1656 | 14 | </openerp> | ||
1657 | 0 | \ No newline at end of file | 15 | \ No newline at end of file |
1658 | 1 | 16 | ||
1659 | === added file 'bin/addons/product/report/product_mass_update_export_xls.mako' | |||
1660 | --- bin/addons/product/report/product_mass_update_export_xls.mako 1970-01-01 00:00:00 +0000 | |||
1661 | +++ bin/addons/product/report/product_mass_update_export_xls.mako 2019-04-15 13:13:32 +0000 | |||
1662 | @@ -0,0 +1,146 @@ | |||
1663 | 1 | <?xml version="1.0"?> | ||
1664 | 2 | <?mso-application progid="Excel.Sheet"?> | ||
1665 | 3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
1666 | 4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
1667 | 5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
1668 | 6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
1669 | 7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
1670 | 8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
1671 | 9 | <Author>Unifield</Author> | ||
1672 | 10 | <LastAuthor>MSFUser</LastAuthor> | ||
1673 | 11 | <Created>2014-04-16T22:36:07Z</Created> | ||
1674 | 12 | <Company>Medecins Sans Frontieres</Company> | ||
1675 | 13 | <Version>11.9999</Version> | ||
1676 | 14 | </DocumentProperties> | ||
1677 | 15 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
1678 | 16 | <WindowHeight>11640</WindowHeight> | ||
1679 | 17 | <WindowWidth>15480</WindowWidth> | ||
1680 | 18 | <WindowTopX>120</WindowTopX> | ||
1681 | 19 | <WindowTopY>75</WindowTopY> | ||
1682 | 20 | <ProtectStructure>False</ProtectStructure> | ||
1683 | 21 | <ProtectWindows>False</ProtectWindows> | ||
1684 | 22 | </ExcelWorkbook> | ||
1685 | 23 | <Styles> | ||
1686 | 24 | <Style ss:ID="ssCell"> | ||
1687 | 25 | <Alignment ss:Vertical="Top" ss:WrapText="1"/> | ||
1688 | 26 | <Font ss:Bold="1" /> | ||
1689 | 27 | </Style> | ||
1690 | 28 | <Style ss:ID="ssCellBlue"> | ||
1691 | 29 | <Alignment ss:Vertical="Top" ss:WrapText="1"/> | ||
1692 | 30 | <Font ss:Color="#0000FF" /> | ||
1693 | 31 | </Style> | ||
1694 | 32 | |||
1695 | 33 | <!-- File header --> | ||
1696 | 34 | <Style ss:ID="big_header"> | ||
1697 | 35 | <Font x:Family="Swiss" ss:Size="14" ss:Bold="1"/> | ||
1698 | 36 | </Style> | ||
1699 | 37 | <Style ss:ID="file_header"> | ||
1700 | 38 | <Font ss:Size="10" /> | ||
1701 | 39 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
1702 | 40 | </Style> | ||
1703 | 41 | |||
1704 | 42 | <!-- Line header --> | ||
1705 | 43 | <Style ss:ID="line_header"> | ||
1706 | 44 | <Borders> | ||
1707 | 45 | <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1708 | 46 | <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1709 | 47 | <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1710 | 48 | <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1711 | 49 | </Borders> | ||
1712 | 50 | <Font x:Family="Swiss" ss:Size="10" ss:Bold="1"/> | ||
1713 | 51 | <Interior/> | ||
1714 | 52 | </Style> | ||
1715 | 53 | |||
1716 | 54 | <!-- Lines --> | ||
1717 | 55 | <Style ss:ID="line_left"> | ||
1718 | 56 | <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/> | ||
1719 | 57 | <Borders> | ||
1720 | 58 | <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1721 | 59 | <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1722 | 60 | <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1723 | 61 | <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1724 | 62 | </Borders> | ||
1725 | 63 | <Font ss:Size="10" /> | ||
1726 | 64 | <NumberFormat ss:Format="#0"/> | ||
1727 | 65 | </Style> | ||
1728 | 66 | <Style ss:ID="line_right"> | ||
1729 | 67 | <Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/> | ||
1730 | 68 | <Borders> | ||
1731 | 69 | <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1732 | 70 | <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1733 | 71 | <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1734 | 72 | <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1735 | 73 | </Borders> | ||
1736 | 74 | <Font ss:Size="10" /> | ||
1737 | 75 | <NumberFormat ss:Format="#0"/> | ||
1738 | 76 | </Style> | ||
1739 | 77 | <Style ss:ID="line_center"> | ||
1740 | 78 | <Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/> | ||
1741 | 79 | <Borders> | ||
1742 | 80 | <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1743 | 81 | <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1744 | 82 | <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1745 | 83 | <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/> | ||
1746 | 84 | </Borders> | ||
1747 | 85 | <Font ss:Size="10" /> | ||
1748 | 86 | <NumberFormat ss:Format="#0"/> | ||
1749 | 87 | </Style> | ||
1750 | 88 | </Styles> | ||
1751 | 89 | |||
1752 | 90 | |||
1753 | 91 | % for r in objects: | ||
1754 | 92 | <ss:Worksheet ss:Name="${_('Product Mass Update Errors')|x}"> | ||
1755 | 93 | <Table x:FullColumns="1" x:FullRows="1"> | ||
1756 | 94 | ## Product code | ||
1757 | 95 | <Column ss:AutoFitWidth="1" ss:Width="150.00" /> | ||
1758 | 96 | ## Product code | ||
1759 | 97 | <Column ss:AutoFitWidth="1" ss:Width="300.00" /> | ||
1760 | 98 | ## Stock Exist | ||
1761 | 99 | <Column ss:AutoFitWidth="1" ss:Width="70.00" /> | ||
1762 | 100 | ## Real Stock | ||
1763 | 101 | <Column ss:AutoFitWidth="1" ss:Width="80.00" /> | ||
1764 | 102 | ## Virtual Stock | ||
1765 | 103 | <Column ss:AutoFitWidth="1" ss:Width="80.00" /> | ||
1766 | 104 | ## Open Documents | ||
1767 | 105 | <Column ss:AutoFitWidth="1" ss:Width="500.00" /> | ||
1768 | 106 | |||
1769 | 107 | <Row ss:Height="18"> | ||
1770 | 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> | ||
1771 | 109 | </Row> | ||
1772 | 110 | |||
1773 | 111 | <Row></Row> | ||
1774 | 112 | |||
1775 | 113 | ## WORKSHEET HEADER | ||
1776 | 114 | |||
1777 | 115 | <% | ||
1778 | 116 | headers_list = [ | ||
1779 | 117 | _('Product Code'), | ||
1780 | 118 | _('Description'), | ||
1781 | 119 | _('Stock Exist'), | ||
1782 | 120 | _('Real Stock'), | ||
1783 | 121 | _('Virtual Stock'), | ||
1784 | 122 | _('Open Documents'), | ||
1785 | 123 | ] | ||
1786 | 124 | %> | ||
1787 | 125 | |||
1788 | 126 | <Row> | ||
1789 | 127 | % for h in headers_list: | ||
1790 | 128 | <Cell ss:StyleID="line_header"><Data ss:Type="String">${h|x}</Data></Cell> | ||
1791 | 129 | % endfor | ||
1792 | 130 | </Row> | ||
1793 | 131 | |||
1794 | 132 | % for upd_errors in getErrors(): | ||
1795 | 133 | <Row> | ||
1796 | 134 | <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('default_code', '')|x}</Data></Cell> | ||
1797 | 135 | <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('name', '')|x}</Data></Cell> | ||
1798 | 136 | <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('stock_exist', '') and _('Yes') or _('No')|x}</Data></Cell> | ||
1799 | 137 | <Cell ss:StyleID="line_right"><Data ss:Type="Number">${upd_errors.get('qty_available', 0)|x}</Data></Cell> | ||
1800 | 138 | <Cell ss:StyleID="line_right"><Data ss:Type="Number">${upd_errors.get('virtual_available', 0)|x}</Data></Cell> | ||
1801 | 139 | <Cell ss:StyleID="line_left"><Data ss:Type="String">${upd_errors.get('open_documents', '')|x}</Data></Cell> | ||
1802 | 140 | </Row> | ||
1803 | 141 | % endfor | ||
1804 | 142 | </Table> | ||
1805 | 143 | |||
1806 | 144 | </ss:Worksheet> | ||
1807 | 145 | % endfor | ||
1808 | 146 | </Workbook> | ||
1809 | 0 | 147 | ||
1810 | === modified file 'bin/addons/product/wizard/__init__.py' | |||
1811 | --- bin/addons/product/wizard/__init__.py 2011-01-14 00:11:01 +0000 | |||
1812 | +++ bin/addons/product/wizard/__init__.py 2019-04-15 13:13:32 +0000 | |||
1813 | @@ -19,6 +19,7 @@ | |||
1814 | 19 | # | 19 | # |
1815 | 20 | ############################################################################## | 20 | ############################################################################## |
1816 | 21 | import product_price | 21 | import product_price |
1817 | 22 | import product_mass_update | ||
1818 | 22 | 23 | ||
1819 | 23 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | 24 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
1820 | 24 | 25 | ||
1821 | 25 | 26 | ||
1822 | === added file 'bin/addons/product/wizard/product_mass_update.py' | |||
1823 | --- bin/addons/product/wizard/product_mass_update.py 1970-01-01 00:00:00 +0000 | |||
1824 | +++ bin/addons/product/wizard/product_mass_update.py 2019-04-15 13:13:32 +0000 | |||
1825 | @@ -0,0 +1,467 @@ | |||
1826 | 1 | # -*- coding: utf-8 -*- | ||
1827 | 2 | ############################################################################## | ||
1828 | 3 | # | ||
1829 | 4 | # OpenERP, Open Source Management Solution | ||
1830 | 5 | # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). | ||
1831 | 6 | # | ||
1832 | 7 | # This program is free software: you can redistribute it and/or modify | ||
1833 | 8 | # it under the terms of the GNU Affero General Public License as | ||
1834 | 9 | # published by the Free Software Foundation, either version 3 of the | ||
1835 | 10 | # License, or (at your option) any later version. | ||
1836 | 11 | # | ||
1837 | 12 | # This program is distributed in the hope that it will be useful, | ||
1838 | 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1839 | 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1840 | 15 | # GNU Affero General Public License for more details. | ||
1841 | 16 | # | ||
1842 | 17 | # You should have received a copy of the GNU Affero General Public License | ||
1843 | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
1844 | 19 | # | ||
1845 | 20 | ############################################################################## | ||
1846 | 21 | |||
1847 | 22 | from osv import osv, fields | ||
1848 | 23 | from tools.translate import _ | ||
1849 | 24 | import tools | ||
1850 | 25 | import time | ||
1851 | 26 | import base64 | ||
1852 | 27 | import threading | ||
1853 | 28 | import pooler | ||
1854 | 29 | from msf_doc_import import GENERIC_MESSAGE | ||
1855 | 30 | from spreadsheet_xml.spreadsheet_xml_write import SpreadsheetCreator | ||
1856 | 31 | from spreadsheet_xml.spreadsheet_xml import SpreadsheetXML | ||
1857 | 32 | from msf_doc_import.wizard import COLUMNS_HEADER_FOR_PRODUCT_LINE_IMPORT as columns_header_for_product_line_import | ||
1858 | 33 | from msf_doc_import.wizard import COLUMNS_FOR_PRODUCT_LINE_IMPORT as columns_for_product_line_import | ||
1859 | 34 | |||
1860 | 35 | |||
1861 | 36 | class product_mass_update(osv.osv): | ||
1862 | 37 | _name = 'product.mass.update' | ||
1863 | 38 | _description = 'Product Mass Update' | ||
1864 | 39 | |||
1865 | 40 | _order = 'id desc' | ||
1866 | 41 | |||
1867 | 42 | def _get_percent_completed(self, cr, uid, ids, field_names, arg, context=None): | ||
1868 | 43 | if context is None: | ||
1869 | 44 | context = {} | ||
1870 | 45 | |||
1871 | 46 | upd_progress_obj = self.pool.get('product.mass.update.progressbar') | ||
1872 | 47 | |||
1873 | 48 | res = {} | ||
1874 | 49 | for p_mass_upd in self.browse(cr, uid, ids, fields_to_fetch=['state'], context=context): | ||
1875 | 50 | if p_mass_upd.state == 'done': | ||
1876 | 51 | res[p_mass_upd.id] = 100 | ||
1877 | 52 | else: | ||
1878 | 53 | upd_progress_ids = upd_progress_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context) | ||
1879 | 54 | if upd_progress_ids: | ||
1880 | 55 | res[p_mass_upd.id] = round(upd_progress_obj.browse(cr, uid, upd_progress_ids[0], context=context).percent_completed, 0) or 0 | ||
1881 | 56 | |||
1882 | 57 | return res | ||
1883 | 58 | |||
1884 | 59 | _columns = { | ||
1885 | 60 | 'name': fields.char(size=64, string='Update Reference'), | ||
1886 | 61 | 'state': fields.selection(selection=[('draft', 'Draft'), ('in_progress', 'In Progress'), ('error', 'Error'), ('done', 'Done')], string='Status', readonly=True), | ||
1887 | 62 | 'date_done': fields.datetime(string='Date of the update'), | ||
1888 | 63 | 'user_id': fields.many2one('res.users', string='User who Updated', readonly=True), | ||
1889 | 64 | 'import_in_progress': fields.boolean(string='Import in progress'), | ||
1890 | 65 | 'percent_completed': fields.function(_get_percent_completed, method=True, string='% completed', type='integer', readonly=True), | ||
1891 | 66 | 'message': fields.text(string='Message', readonly=True), | ||
1892 | 67 | 'product_ids': fields.many2many('product.product', 'prod_mass_update_product_rel', 'product_id', | ||
1893 | 68 | 'prod_mass_update_id', string="Product selection", order_by="default_code", | ||
1894 | 69 | domain=[('expected_prod_creator', '=', 'True'), '|', ('active', '=', True), ('active', '=', False)]), | ||
1895 | 70 | 'not_deactivated_product_ids': fields.one2many('product.mass.update.errors', 'p_mass_upd_id', | ||
1896 | 71 | string="Product(s) that can not be deactivated"), | ||
1897 | 72 | 'has_not_deactivable': fields.boolean(string='Document has non-deactivable product(s)', readonly=True), | ||
1898 | 73 | # Fields | ||
1899 | 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."), | ||
1900 | 75 | 'dangerous_goods': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Dangerous Goods'), | ||
1901 | 76 | 'heat_sensitive_item': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Temperature sensitive item'), | ||
1902 | 77 | 'single_use': fields.selection(selection=[('no', 'No'), ('yes', 'Yes'), ('no_know', 'tbd')], string='Single Use'), | ||
1903 | 78 | 'short_shelf_life': fields.selection(selection=[('False', 'No'), ('True', 'Yes'), ('no_know', 'tbd')], string='Short Shelf Life'), | ||
1904 | 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."), | ||
1905 | 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.'), | ||
1906 | 81 | 'use_time': fields.char('Product Use Time', size=32, help='The number of months before a production lot starts deteriorating without becoming dangerous.'), | ||
1907 | 82 | 'procure_delay': fields.char(string='Procurement Lead Time', size=32, | ||
1908 | 83 | help='It\'s the default time to procure this product. This lead time will be used on the Order cycle procurement computation'), | ||
1909 | 84 | 'procure_method': fields.selection([('make_to_stock', 'Make to Stock'), ('make_to_order', 'Make to Order')], 'Procurement Method', | ||
1910 | 85 | help="If you encode manually a Procurement, you probably want to use a make to order method."), | ||
1911 | 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."), | ||
1912 | 87 | 'sterilized': fields.selection(selection=[('no', 'No'), ('yes', 'Yes'), ('no_know', 'tbd')], string='Sterile'), | ||
1913 | 88 | 'supply_method': fields.selection([('produce', 'Produce'), ('buy', 'Buy')], 'Supply Method', | ||
1914 | 89 | help="Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."), | ||
1915 | 90 | 'seller_id': fields.many2one('res.partner', 'Default Partner'), | ||
1916 | 91 | 'property_account_income': fields.many2one('account.account', string='Income Account', | ||
1917 | 92 | help='This account will be used for invoices instead of the default one to value sales for the current product'), | ||
1918 | 93 | 'property_account_expense': fields.many2one('account.account', string='Expense Account', | ||
1919 | 94 | help='This account will be used for invoices instead of the default one to value expenses for the current product'), | ||
1920 | 95 | 'empty_status': fields.boolean(string='Set Status as empty'), | ||
1921 | 96 | 'empty_inc_account': fields.boolean(string='Set Income Account as empty'), | ||
1922 | 97 | 'empty_exp_account': fields.boolean(string='Set Expense Account as empty'), | ||
1923 | 98 | } | ||
1924 | 99 | |||
1925 | 100 | _defaults = { | ||
1926 | 101 | 'state': 'draft', | ||
1927 | 102 | 'import_in_progress': False, | ||
1928 | 103 | 'message': '', | ||
1929 | 104 | 'active_product': '', | ||
1930 | 105 | 'dangerous_goods': '', | ||
1931 | 106 | 'heat_sensitive_item': '', | ||
1932 | 107 | 'single_use': '', | ||
1933 | 108 | 'short_shelf_life': '', | ||
1934 | 109 | 'procure_method': '', | ||
1935 | 110 | 'sterilized': '', | ||
1936 | 111 | 'supply_method': '', | ||
1937 | 112 | } | ||
1938 | 113 | |||
1939 | 114 | def write(self, cr, user, ids, vals, context=None): | ||
1940 | 115 | ''' | ||
1941 | 116 | override write method | ||
1942 | 117 | ''' | ||
1943 | 118 | if context is None: | ||
1944 | 119 | context = {} | ||
1945 | 120 | |||
1946 | 121 | if context.get('button') == 'dummy' and '__last_update' in context: | ||
1947 | 122 | del context['__last_update'] | ||
1948 | 123 | |||
1949 | 124 | if not ids: | ||
1950 | 125 | return True | ||
1951 | 126 | |||
1952 | 127 | if 'empty_status' in vals and vals['empty_status']: | ||
1953 | 128 | vals['product_state'] = '' | ||
1954 | 129 | if 'empty_inc_account' in vals and vals['empty_inc_account']: | ||
1955 | 130 | vals['property_account_income'] = False | ||
1956 | 131 | if 'empty_exp_account' in vals and vals['empty_exp_account']: | ||
1957 | 132 | vals['property_account_expense'] = False | ||
1958 | 133 | |||
1959 | 134 | return super(product_mass_update, self).write(cr, user, ids, vals, context) | ||
1960 | 135 | |||
1961 | 136 | def copy(self, cr, uid, id, default=None, context=None): | ||
1962 | 137 | if context is None: | ||
1963 | 138 | context = {} | ||
1964 | 139 | |||
1965 | 140 | if default is None: | ||
1966 | 141 | default = {} | ||
1967 | 142 | |||
1968 | 143 | default.update({ | ||
1969 | 144 | 'user_id': False, | ||
1970 | 145 | 'date_done': False, | ||
1971 | 146 | 'message': '', | ||
1972 | 147 | 'not_deactivated_product_ids': [(6, 0, [])], | ||
1973 | 148 | 'has_not_deactivable': False, | ||
1974 | 149 | 'empty_status': False, | ||
1975 | 150 | 'empty_inc_account': False, | ||
1976 | 151 | 'empty_exp_account': False, | ||
1977 | 152 | }) | ||
1978 | 153 | |||
1979 | 154 | return super(product_mass_update, self).copy(cr, uid, id, default=default, context=context) | ||
1980 | 155 | |||
1981 | 156 | def onchange_status_check(self, cr, uid, ids, empty_status): | ||
1982 | 157 | if empty_status: | ||
1983 | 158 | return {'value': {'product_state': ''}} | ||
1984 | 159 | return {'value': {}} | ||
1985 | 160 | |||
1986 | 161 | def onchange_inc_check(self, cr, uid, ids, empty_inc_account): | ||
1987 | 162 | if empty_inc_account: | ||
1988 | 163 | return {'value': {'property_account_income': False}} | ||
1989 | 164 | return {'value': {}} | ||
1990 | 165 | |||
1991 | 166 | def onchange_exp_check(self, cr, uid, ids, empty_exp_account): | ||
1992 | 167 | if empty_exp_account: | ||
1993 | 168 | return {'value': {'property_account_expense': False}} | ||
1994 | 169 | return {'value': {}} | ||
1995 | 170 | |||
1996 | 171 | def cancel_update(self, cr, uid, ids, context=None): | ||
1997 | 172 | ''' | ||
1998 | 173 | Delete the current Product Mass Update | ||
1999 | 174 | ''' | ||
2000 | 175 | if context is None: | ||
2001 | 176 | context = {} | ||
2002 | 177 | |||
2003 | 178 | self.unlink(cr, uid, ids, context=context) | ||
2004 | 179 | |||
2005 | 180 | return { | ||
2006 | 181 | 'type': 'ir.actions.act_window', | ||
2007 | 182 | 'res_model': 'product.mass.update', | ||
2008 | 183 | 'view_type': 'form', | ||
2009 | 184 | 'view_mode': 'tree,form', | ||
2010 | 185 | 'target': 'crush', | ||
2011 | 186 | } | ||
2012 | 187 | |||
2013 | 188 | def dummy(self, cr, uid, ids, context=None): | ||
2014 | 189 | """ | ||
2015 | 190 | This button is only for updating the view. | ||
2016 | 191 | """ | ||
2017 | 192 | if isinstance(ids, (int, long)): | ||
2018 | 193 | ids = [ids] | ||
2019 | 194 | |||
2020 | 195 | return True | ||
2021 | 196 | |||
2022 | 197 | def reset_update(self, cr, uid, ids, context=None): | ||
2023 | 198 | """ | ||
2024 | 199 | This button is only for resetting the update | ||
2025 | 200 | """ | ||
2026 | 201 | if context is None: | ||
2027 | 202 | context = {} | ||
2028 | 203 | |||
2029 | 204 | if isinstance(ids, (int, long)): | ||
2030 | 205 | ids = [ids] | ||
2031 | 206 | |||
2032 | 207 | # Unlink existing errors | ||
2033 | 208 | upd_errors_obj = self.pool.get('product.mass.update.errors') | ||
2034 | 209 | errors_ids = upd_errors_obj.search(cr, uid, [('p_mass_upd_id', 'in', ids)], context=context) | ||
2035 | 210 | upd_errors_obj.unlink(cr, uid, errors_ids, context=context) | ||
2036 | 211 | |||
2037 | 212 | vals = { | ||
2038 | 213 | 'state': 'draft', | ||
2039 | 214 | 'message': '', | ||
2040 | 215 | 'has_not_deactivable': False, | ||
2041 | 216 | } | ||
2042 | 217 | self.write(cr, uid, ids, vals, context=context) | ||
2043 | 218 | |||
2044 | 219 | return True | ||
2045 | 220 | |||
2046 | 221 | def launch_update(self, cr, uid, ids, context=None): | ||
2047 | 222 | ''' | ||
2048 | 223 | Launch a thread for update | ||
2049 | 224 | ''' | ||
2050 | 225 | if not ids: | ||
2051 | 226 | return True | ||
2052 | 227 | |||
2053 | 228 | data_obj = self.pool.get('ir.model.data') | ||
2054 | 229 | p_state_obj = self.pool.get('product.status') | ||
2055 | 230 | |||
2056 | 231 | p_mass_upd = self.browse(cr, uid, ids[0], context=context) | ||
2057 | 232 | if not p_mass_upd.product_ids: | ||
2058 | 233 | raise osv.except_osv(_('Error'), _('You can not apply an update on no products.')) | ||
2059 | 234 | |||
2060 | 235 | vals = {} | ||
2061 | 236 | if p_mass_upd.dangerous_goods: | ||
2062 | 237 | vals.update({'dangerous_goods': p_mass_upd.dangerous_goods}) | ||
2063 | 238 | if p_mass_upd.heat_sensitive_item: | ||
2064 | 239 | heat_attr = p_mass_upd.heat_sensitive_item == 'True' and 'heat_yes' or p_mass_upd.heat_sensitive_item == 'False' and 'heat_no' \ | ||
2065 | 240 | or p_mass_upd.heat_sensitive_item == 'tbd' and 'heat_no_know' or False | ||
2066 | 241 | heat_id = data_obj.get_object_reference(cr, uid, 'product_attributes', heat_attr)[1] | ||
2067 | 242 | if heat_id: | ||
2068 | 243 | vals.update({'heat_sensitive_item': heat_id}) | ||
2069 | 244 | if p_mass_upd.short_shelf_life: | ||
2070 | 245 | vals.update({'short_shelf_life': p_mass_upd.short_shelf_life}) | ||
2071 | 246 | if p_mass_upd.alert_time: | ||
2072 | 247 | try: | ||
2073 | 248 | alert_time = int(p_mass_upd.alert_time) | ||
2074 | 249 | vals.update({'alert_time': alert_time}) | ||
2075 | 250 | except ValueError: | ||
2076 | 251 | raise osv.except_osv(_('Error'), _('Alert Time must be an integer.')) | ||
2077 | 252 | if p_mass_upd.life_time: | ||
2078 | 253 | try: | ||
2079 | 254 | life_time = int(p_mass_upd.life_time) | ||
2080 | 255 | vals.update({'life_time': life_time}) | ||
2081 | 256 | except ValueError: | ||
2082 | 257 | raise osv.except_osv(_('Error'), _('Life Time must be an integer.')) | ||
2083 | 258 | if p_mass_upd.use_time: | ||
2084 | 259 | try: | ||
2085 | 260 | use_time = int(p_mass_upd.use_time) | ||
2086 | 261 | vals.update({'use_time': use_time}) | ||
2087 | 262 | except ValueError: | ||
2088 | 263 | raise osv.except_osv(_('Error'), _('Use Time must be an integer.')) | ||
2089 | 264 | if p_mass_upd.procure_delay: | ||
2090 | 265 | try: | ||
2091 | 266 | procure_delay = float(p_mass_upd.procure_delay) | ||
2092 | 267 | vals.update({'procure_delay': procure_delay}) | ||
2093 | 268 | except ValueError: | ||
2094 | 269 | raise osv.except_osv(_('Error'), _('Procurement Lead Time must be a float.')) | ||
2095 | 270 | if p_mass_upd.procure_method: | ||
2096 | 271 | vals.update({'procure_method': p_mass_upd.procure_method}) | ||
2097 | 272 | if p_mass_upd.single_use: | ||
2098 | 273 | vals.update({'single_use': p_mass_upd.single_use}) | ||
2099 | 274 | if p_mass_upd.product_state: | ||
2100 | 275 | p_state_ids = p_state_obj.search(cr, uid, [('code', '=', p_mass_upd.product_state)], context=context) | ||
2101 | 276 | if p_state_ids: | ||
2102 | 277 | vals.update({'state': p_state_ids[0]}) | ||
2103 | 278 | elif p_mass_upd.empty_status: | ||
2104 | 279 | vals.update({'state': False}) | ||
2105 | 280 | if p_mass_upd.sterilized: | ||
2106 | 281 | vals.update({'sterilized': p_mass_upd.sterilized}) | ||
2107 | 282 | if p_mass_upd.supply_method: | ||
2108 | 283 | vals.update({'supply_method': p_mass_upd.supply_method}) | ||
2109 | 284 | if p_mass_upd.property_account_income: | ||
2110 | 285 | vals.update({'property_account_income': p_mass_upd.property_account_income.id}) | ||
2111 | 286 | elif p_mass_upd.empty_inc_account: | ||
2112 | 287 | vals.update({'property_account_income': False}) | ||
2113 | 288 | if p_mass_upd.property_account_expense: | ||
2114 | 289 | vals.update({'property_account_expense': p_mass_upd.property_account_expense.id}) | ||
2115 | 290 | elif p_mass_upd.empty_exp_account: | ||
2116 | 291 | vals.update({'property_account_expense': False}) | ||
2117 | 292 | |||
2118 | 293 | thread = threading.Thread(target=self.apply_update, args=(cr, uid, ids, vals, context)) | ||
2119 | 294 | thread.start() | ||
2120 | 295 | |||
2121 | 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.") | ||
2122 | 297 | return self.write(cr, uid, ids, {'message': msg_to_return, 'state': 'in_progress'}, context=context) | ||
2123 | 298 | |||
2124 | 299 | def apply_update(self, cr, uid, ids, vals, context=None): | ||
2125 | 300 | ''' | ||
2126 | 301 | Apply the current Product Mass Update | ||
2127 | 302 | ''' | ||
2128 | 303 | if context is None: | ||
2129 | 304 | context = {} | ||
2130 | 305 | |||
2131 | 306 | # New cursor | ||
2132 | 307 | cr = pooler.get_db(cr.dbname).cursor() | ||
2133 | 308 | |||
2134 | 309 | prod_obj = self.pool.get('product.product') | ||
2135 | 310 | p_suppinfo_obj = self.pool.get('product.supplierinfo') | ||
2136 | 311 | upd_progress_obj = self.pool.get('product.mass.update.progressbar') | ||
2137 | 312 | upd_errors_obj = self.pool.get('product.mass.update.errors') | ||
2138 | 313 | |||
2139 | 314 | p_mass_upd = self.browse(cr, uid, ids[0], context=context) | ||
2140 | 315 | try: | ||
2141 | 316 | # For the progress bar | ||
2142 | 317 | upd_progress_ids = upd_progress_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context) | ||
2143 | 318 | if upd_progress_ids: | ||
2144 | 319 | upd_progress_id = upd_progress_ids[0] | ||
2145 | 320 | else: | ||
2146 | 321 | upd_progress_id = upd_progress_obj.create(cr, uid, {'p_mass_upd_id': p_mass_upd.id}, context=context) | ||
2147 | 322 | |||
2148 | 323 | num_prod = 0 | ||
2149 | 324 | not_deactivated = [] | ||
2150 | 325 | for prod in p_mass_upd.product_ids: | ||
2151 | 326 | # Check procurement method | ||
2152 | 327 | if p_mass_upd.procure_method and prod.type in ('consu', 'service', 'service_recep') and \ | ||
2153 | 328 | p_mass_upd.procure_method != 'make_to_order': | ||
2154 | 329 | raise osv.except_osv(_('Error'), _('You must select on order procurement method for %s products.') | ||
2155 | 330 | % (prod.type == 'consu' and 'Non-stockable' or 'Service')) | ||
2156 | 331 | # Deactivation | ||
2157 | 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): | ||
2158 | 333 | p_suppinfo_obj.create(cr, uid, {'product_id': prod.id, 'name': p_mass_upd.seller_id.id, 'sequence': 1}, context=context) | ||
2159 | 334 | if p_mass_upd.active_product: | ||
2160 | 335 | if not prod.active and p_mass_upd.active_product == 'yes': | ||
2161 | 336 | prod_obj.reactivate_product(cr, uid, [prod.id], context=context) | ||
2162 | 337 | elif prod.active and p_mass_upd.active_product == 'no': | ||
2163 | 338 | deactivated = prod_obj.deactivate_product(cr, uid, [prod.id], context=context) | ||
2164 | 339 | if deactivated != True: # If doesn't return True, the product has not been deactivated | ||
2165 | 340 | not_deactivated.append(deactivated.get('res_id')) | ||
2166 | 341 | num_prod += 1 | ||
2167 | 342 | percent_completed = float(num_prod) / float(len(p_mass_upd.product_ids)) * 100.0 | ||
2168 | 343 | upd_progress_obj.write(cr, uid, upd_progress_id, {'percent_completed': percent_completed}, context=context) | ||
2169 | 344 | |||
2170 | 345 | if not_deactivated: | ||
2171 | 346 | cr.rollback() # Rollback deactivation and product seller creation | ||
2172 | 347 | for wiz_prod_error in self.pool.get('product.deactivation.error').browse(cr, uid, not_deactivated): | ||
2173 | 348 | err_vals = { | ||
2174 | 349 | 'p_mass_upd_id': p_mass_upd.id, | ||
2175 | 350 | 'product_id': wiz_prod_error.product_id.id, | ||
2176 | 351 | 'stock_exist': wiz_prod_error.stock_exist, | ||
2177 | 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 '', | ||
2178 | 353 | } | ||
2179 | 354 | upd_errors_obj.create(cr, uid, err_vals, context=context) | ||
2180 | 355 | |||
2181 | 356 | p_mass_upd_vals = { | ||
2182 | 357 | 'has_not_deactivable': True, | ||
2183 | 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.'), | ||
2184 | 359 | 'state': 'error', | ||
2185 | 360 | } | ||
2186 | 361 | self.write(cr, uid, p_mass_upd.id, p_mass_upd_vals, context=context) | ||
2187 | 362 | else: | ||
2188 | 363 | prod_obj.write(cr, uid, [prod.id for prod in p_mass_upd.product_ids], vals, context=context) | ||
2189 | 364 | user_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).id | ||
2190 | 365 | |||
2191 | 366 | # Unlink existing errors | ||
2192 | 367 | errors_ids = upd_errors_obj.search(cr, uid, [('p_mass_upd_id', '=', p_mass_upd.id)], context=context) | ||
2193 | 368 | upd_errors_obj.unlink(cr, uid, errors_ids, context=context) | ||
2194 | 369 | |||
2195 | 370 | p_mass_upd_vals = { | ||
2196 | 371 | 'has_not_deactivable': False, | ||
2197 | 372 | 'date_done': time.strftime('%Y-%m-%d %H:%M'), | ||
2198 | 373 | 'user_id': user_id, | ||
2199 | 374 | 'state': 'done', | ||
2200 | 375 | } | ||
2201 | 376 | self.write(cr, uid, p_mass_upd.id, p_mass_upd_vals, context=context) | ||
2202 | 377 | except Exception as e: | ||
2203 | 378 | err = _('An error has occured during the update:\n%s') % tools.ustr(e.value or e) | ||
2204 | 379 | self.write(cr, uid, p_mass_upd.id, {'state': 'error', 'message': err}, context=context) | ||
2205 | 380 | finally: | ||
2206 | 381 | cr.commit() | ||
2207 | 382 | cr.close(True) | ||
2208 | 383 | |||
2209 | 384 | return True | ||
2210 | 385 | |||
2211 | 386 | def wizard_import_products(self, cr, uid, ids, context=None): | ||
2212 | 387 | ''' | ||
2213 | 388 | Launches the wizard to import lines from a file | ||
2214 | 389 | ''' | ||
2215 | 390 | if context is None: | ||
2216 | 391 | context = {} | ||
2217 | 392 | if isinstance(ids, (int, long)): | ||
2218 | 393 | ids = [ids] | ||
2219 | 394 | context.update({'active_id': ids[0]}) | ||
2220 | 395 | columns_header = [(_(f[0]), f[1]) for f in columns_header_for_product_line_import] | ||
2221 | 396 | default_template = SpreadsheetCreator('Template of import', columns_header, []) | ||
2222 | 397 | file = base64.encodestring(default_template.get_xml(default_filters=['decode.utf8'])) | ||
2223 | 398 | export_id = self.pool.get('wizard.import.product.line').create(cr, uid, { | ||
2224 | 399 | 'file': file, | ||
2225 | 400 | 'filename_template': 'template.xls', | ||
2226 | 401 | 'filename': 'Lines_Not_Imported.xls', | ||
2227 | 402 | 'message': """%s %s""" % (_(GENERIC_MESSAGE), ', '.join([_(f) for f in columns_for_product_line_import]), ), | ||
2228 | 403 | 'product_mass_upd_id': ids[0], | ||
2229 | 404 | 'state': 'draft', | ||
2230 | 405 | }, context) | ||
2231 | 406 | |||
2232 | 407 | return { | ||
2233 | 408 | 'type': 'ir.actions.act_window', | ||
2234 | 409 | 'res_model': 'wizard.import.product.line', | ||
2235 | 410 | 'res_id': export_id, | ||
2236 | 411 | 'view_type': 'form', | ||
2237 | 412 | 'view_mode': 'form', | ||
2238 | 413 | 'target': 'crush', | ||
2239 | 414 | 'context': context, | ||
2240 | 415 | } | ||
2241 | 416 | |||
2242 | 417 | def export_product_errors(self, cr, uid, ids, context=None): | ||
2243 | 418 | return { | ||
2244 | 419 | 'type': 'ir.actions.report.xml', | ||
2245 | 420 | 'report_name': 'product_mass_update_export_xls', | ||
2246 | 421 | 'datas': {'ids': ids, 'target_filename': _('Product Mass Update Errors')}, | ||
2247 | 422 | 'nodestroy': True, | ||
2248 | 423 | 'context': context, | ||
2249 | 424 | } | ||
2250 | 425 | |||
2251 | 426 | |||
2252 | 427 | product_mass_update() | ||
2253 | 428 | |||
2254 | 429 | |||
2255 | 430 | class product_mass_update_progressbar(osv.osv_memory): | ||
2256 | 431 | _name = 'product.mass.update.progressbar' | ||
2257 | 432 | _description = 'Product Mass Update Progress Bar' | ||
2258 | 433 | |||
2259 | 434 | _columns = { | ||
2260 | 435 | 'p_mass_upd_id': fields.many2one('product.mass.update', 'Product Mass Update'), | ||
2261 | 436 | 'percent_completed': fields.integer(string='% completed', readonly=True), | ||
2262 | 437 | } | ||
2263 | 438 | |||
2264 | 439 | _default = { | ||
2265 | 440 | 'p_mass_upd_id': False, | ||
2266 | 441 | 'percent_completed': 0, | ||
2267 | 442 | } | ||
2268 | 443 | |||
2269 | 444 | |||
2270 | 445 | product_mass_update_progressbar() | ||
2271 | 446 | |||
2272 | 447 | |||
2273 | 448 | class product_mass_update_errors(osv.osv): | ||
2274 | 449 | _name = 'product.mass.update.errors' | ||
2275 | 450 | _description = 'Product Mass Update Errors' | ||
2276 | 451 | |||
2277 | 452 | _order = 'product_id' | ||
2278 | 453 | |||
2279 | 454 | _columns = { | ||
2280 | 455 | 'p_mass_upd_id': fields.many2one('product.mass.update', 'Product Mass Update', ondelete='cascade'), | ||
2281 | 456 | 'product_id': fields.many2one('product.product', string='Product', required=True), | ||
2282 | 457 | 'stock_exist': fields.boolean(string='Stock Exist'), | ||
2283 | 458 | 'open_documents': fields.char(string='Open Documents', size=256), | ||
2284 | 459 | } | ||
2285 | 460 | |||
2286 | 461 | _default = { | ||
2287 | 462 | 'stock_exist': False, | ||
2288 | 463 | 'open_documents': '', | ||
2289 | 464 | } | ||
2290 | 465 | |||
2291 | 466 | |||
2292 | 467 | product_mass_update_errors() | ||
2293 | 0 | 468 | ||
2294 | === added file 'bin/addons/product/wizard/product_mass_update_view.xml' | |||
2295 | --- bin/addons/product/wizard/product_mass_update_view.xml 1970-01-01 00:00:00 +0000 | |||
2296 | +++ bin/addons/product/wizard/product_mass_update_view.xml 2019-04-15 13:13:32 +0000 | |||
2297 | @@ -0,0 +1,139 @@ | |||
2298 | 1 | <?xml version="1.0" encoding="utf-8"?> | ||
2299 | 2 | <openerp> | ||
2300 | 3 | <data> | ||
2301 | 4 | <!-- Views --> | ||
2302 | 5 | <record id="view_product_mass_update_form" model="ir.ui.view"> | ||
2303 | 6 | <field name="name">product.mass.update.form</field> | ||
2304 | 7 | <field name="model">product.mass.update</field> | ||
2305 | 8 | <field name="type">form</field> | ||
2306 | 9 | <field name="arch" type="xml"> | ||
2307 | 10 | <form string="Product Mass Update" hide_delete_button="1" > | ||
2308 | 11 | <field name="name" attrs="{'readonly': [('state', '!=', 'draft')]}" /> | ||
2309 | 12 | <group string=" New Data " colspan="4" attrs="{'readonly': [('state', '!=', 'draft')]}"> | ||
2310 | 13 | <field name="active_product" /> | ||
2311 | 14 | <field name="dangerous_goods" /> | ||
2312 | 15 | <field name="heat_sensitive_item" /> | ||
2313 | 16 | <field name="single_use" /> | ||
2314 | 17 | <field name="short_shelf_life" /> | ||
2315 | 18 | <field name="alert_time" /> | ||
2316 | 19 | <field name="life_time" /> | ||
2317 | 20 | <field name="use_time" /> | ||
2318 | 21 | <field name="procure_delay" /> | ||
2319 | 22 | <field name="procure_method" /> | ||
2320 | 23 | <group colspan="2"> | ||
2321 | 24 | <field name="product_state" attrs="{'readonly':['|', ('empty_status', '=', True), ('state', '!=', 'draft')]}" /> | ||
2322 | 25 | <field name="empty_status" on_change="onchange_status_check(empty_status)" /> | ||
2323 | 26 | </group> | ||
2324 | 27 | <field name="sterilized" /> | ||
2325 | 28 | <field name="supply_method" /> | ||
2326 | 29 | <field name="seller_id" /> | ||
2327 | 30 | <group colspan="2"> | ||
2328 | 31 | <field name="property_account_income" attrs="{'readonly':['|', ('empty_inc_account', '=', True), ('state', '!=', 'draft')]}" | ||
2329 | 32 | domain="[('type','<>','view'), ('type','<>','consolidation'), | ||
2330 | 33 | ('user_type_code', 'in', ['expense', 'income', 'asset']), | ||
2331 | 34 | ('user_type_name', '<>', 'Extra-accounting expenses')]"/> | ||
2332 | 35 | <field name="empty_inc_account" on_change="onchange_inc_check(empty_inc_account)" /> | ||
2333 | 36 | </group> | ||
2334 | 37 | <group colspan="2"> | ||
2335 | 38 | <field name="property_account_expense" attrs="{'readonly':['|', ('empty_exp_account', '=', True), ('state', '!=', 'draft')]}" | ||
2336 | 39 | domain="[('type','<>','view'), ('type','<>','consolidation'), | ||
2337 | 40 | ('user_type_code', 'in', ['expense', 'income', 'asset']), | ||
2338 | 41 | ('user_type_name', '<>', 'Extra-accounting expenses')]"/> | ||
2339 | 42 | <field name="empty_exp_account" on_change="onchange_exp_check(empty_exp_account)" /> | ||
2340 | 43 | </group> | ||
2341 | 44 | </group> | ||
2342 | 45 | <field name="has_not_deactivable" invisible="1" /> | ||
2343 | 46 | <group colspan="4" attrs="{'invisible':[('has_not_deactivable', '=', False), ('state', 'not in', ['in_progress', 'error'])]}"> | ||
2344 | 47 | <html> | ||
2345 | 48 | <style> | ||
2346 | 49 | #prod_mass_upd_error p, #prod_mass_upd_error span, #prod_mass_upd_error textarea { | ||
2347 | 50 | text-align: center; | ||
2348 | 51 | v-align: middle; | ||
2349 | 52 | color: red; | ||
2350 | 53 | font-weight: bold; | ||
2351 | 54 | font-size: 1.2em; | ||
2352 | 55 | resize: None; | ||
2353 | 56 | } | ||
2354 | 57 | </style> | ||
2355 | 58 | <div id="prod_mass_upd_error"> | ||
2356 | 59 | <field name="message" colspan="4" nolabel="1" /> | ||
2357 | 60 | </div> | ||
2358 | 61 | </html> | ||
2359 | 62 | </group> | ||
2360 | 63 | <group colspan="4"> | ||
2361 | 64 | <field name="percent_completed" widget="progressbar" colspan="2" attrs="{'invisible':[('state', 'not in', ['in_progress', 'done'])]}"/> | ||
2362 | 65 | <button name="dummy" string="Update" icon="gtk-execute" colspan="2" type="object" attrs="{'invisible':[('state', '!=', 'in_progress')]}"/> | ||
2363 | 66 | <button name="reset_update" string="Reset Update" icon="gtk-undo" colspan="2" type="object" attrs="{'invisible':[('state', '!=', 'error')]}"/> | ||
2364 | 67 | </group> | ||
2365 | 68 | <notebook> | ||
2366 | 69 | <page string="Products"> | ||
2367 | 70 | <group name="import" string=" Import Lines " colspan="4" attrs="{'invisible':[('state', '!=', 'draft')]}"> | ||
2368 | 71 | <button name="wizard_import_products" string="Import products" icon="gtk-dnd" colspan="2" type="object"/> | ||
2369 | 72 | </group> | ||
2370 | 73 | <field name="product_ids" colspan="4" nolabel="1" attrs="{'readonly': [('state', '!=', 'draft')]}" domain="[('active', 'in', ['t', 'f'])]"> | ||
2371 | 74 | <tree string="Products" hide_edit_button="1" colors="grey:active == False"> | ||
2372 | 75 | <field name="default_code" /> | ||
2373 | 76 | <field name="name" /> | ||
2374 | 77 | <field name="active" invisible="1" /> | ||
2375 | 78 | </tree> | ||
2376 | 79 | </field> | ||
2377 | 80 | </page> | ||
2378 | 81 | <page string="Non-Deactivable Products" attrs="{'invisible': [('has_not_deactivable', '=', False)]}"> | ||
2379 | 82 | <button name="export_product_errors" string="Export Product List" icon="gtk-execute" colspan="4" type="object" /> | ||
2380 | 83 | <field name="not_deactivated_product_ids" colspan="4" nolabel="1" readonly="1"> | ||
2381 | 84 | <tree string="Products" noteditable="1"> | ||
2382 | 85 | <field name="product_id" /> | ||
2383 | 86 | <field name="stock_exist" /> | ||
2384 | 87 | <field name="open_documents" /> | ||
2385 | 88 | </tree> | ||
2386 | 89 | </field> | ||
2387 | 90 | </page> | ||
2388 | 91 | </notebook> | ||
2389 | 92 | <group colspan="4"> | ||
2390 | 93 | <field name="state" colspan="2" /> | ||
2391 | 94 | <button name="cancel_update" string="Delete Update" icon="gtk-cancel" colspan="1" type="object" attrs="{'invisible':[('state', '!=', 'draft')]}"/> | ||
2392 | 95 | <button name="launch_update" string="Apply Update" icon="gtk-go-forward" colspan="1" type="object" attrs="{'invisible': [('state', '!=', 'draft')]}"/> | ||
2393 | 96 | </group> | ||
2394 | 97 | </form> | ||
2395 | 98 | </field> | ||
2396 | 99 | </record> | ||
2397 | 100 | |||
2398 | 101 | <record id="view_product_mass_update_tree" model="ir.ui.view"> | ||
2399 | 102 | <field name="name">product.mass.update.tree</field> | ||
2400 | 103 | <field name="model">product.mass.update</field> | ||
2401 | 104 | <field name="type">tree</field> | ||
2402 | 105 | <field name="arch" type="xml"> | ||
2403 | 106 | <tree string="Product Mass Update" noteditable="state!='draft'" hide_delete_button="1" colors="blue:state in ('draft');red:state in ('error')"> | ||
2404 | 107 | <field name="name"/> | ||
2405 | 108 | <field name="product_ids"/> | ||
2406 | 109 | <field name="date_done"/> | ||
2407 | 110 | <field name="user_id"/> | ||
2408 | 111 | <field name="state"/> | ||
2409 | 112 | </tree> | ||
2410 | 113 | </field> | ||
2411 | 114 | </record> | ||
2412 | 115 | |||
2413 | 116 | <record id="view_product_mass_update_search" model="ir.ui.view"> | ||
2414 | 117 | <field name="name">product.mass.update.search</field> | ||
2415 | 118 | <field name="model">product.mass.update</field> | ||
2416 | 119 | <field name="type">search</field> | ||
2417 | 120 | <field name="arch" type="xml"> | ||
2418 | 121 | <search string="Product Mass Update"> | ||
2419 | 122 | <field name="name"/> | ||
2420 | 123 | <field name="date_done"/> | ||
2421 | 124 | <field name="user_id"/> | ||
2422 | 125 | <field name="state"/> | ||
2423 | 126 | </search> | ||
2424 | 127 | </field> | ||
2425 | 128 | </record> | ||
2426 | 129 | |||
2427 | 130 | <!-- Menu --> | ||
2428 | 131 | <record id="previous_mass_update_action" model="ir.actions.act_window"> | ||
2429 | 132 | <field name="name">Product Mass Update</field> | ||
2430 | 133 | <field name="res_model">product.mass.update</field> | ||
2431 | 134 | <field name="view_type">form</field> | ||
2432 | 135 | <field name="view_id" ref="view_product_mass_update_tree"/> | ||
2433 | 136 | <field name="context">{}</field> | ||
2434 | 137 | </record> | ||
2435 | 138 | </data> | ||
2436 | 139 | </openerp> | ||
2437 | 0 | 140 | ||
2438 | === modified file 'bin/addons/product_attributes/product_attributes_view.xml' | |||
2439 | --- bin/addons/product_attributes/product_attributes_view.xml 2019-02-11 10:03:13 +0000 | |||
2440 | +++ bin/addons/product_attributes/product_attributes_view.xml 2019-04-15 13:13:32 +0000 | |||
2441 | @@ -11,7 +11,7 @@ | |||
2442 | 11 | <field name="arch" type="xml"> | 11 | <field name="arch" type="xml"> |
2443 | 12 | <data> | 12 | <data> |
2444 | 13 | <xpath expr="/tree" position="replace"> | 13 | <xpath expr="/tree" position="replace"> |
2446 | 14 | <tree colors="red:virtual_available<0;blue:virtual_available>=0 and state in ('draft', 'end', 'obsolete');black:virtual_available>=0 and state not in ('draft', 'end', 'obsolete')" string="Products"> | 14 | <tree colors="red:virtual_available<0;blue:virtual_available>=0 and state in ('draft', 'end', 'obsolete');grey:active == False" string="Products"> |
2447 | 15 | <field name="default_code" string="Code"/> | 15 | <field name="default_code" string="Code"/> |
2448 | 16 | <field name="name" string="Description"/> | 16 | <field name="name" string="Description"/> |
2449 | 17 | <field name="categ_id" invisible="1"/> | 17 | <field name="categ_id" invisible="1"/> |
2450 | @@ -28,6 +28,7 @@ | |||
2451 | 28 | <field name="international_status"/> | 28 | <field name="international_status"/> |
2452 | 29 | <field name="uf_create_date" string="Creation"/> | 29 | <field name="uf_create_date" string="Creation"/> |
2453 | 30 | <field name="uf_write_date" string="Modification"/> | 30 | <field name="uf_write_date" string="Modification"/> |
2454 | 31 | <field name="active" invisible="1"/> | ||
2455 | 31 | </tree> | 32 | </tree> |
2456 | 32 | </xpath> | 33 | </xpath> |
2457 | 33 | </data> | 34 | </data> |
2458 | @@ -821,5 +822,9 @@ | |||
2459 | 821 | </field> | 822 | </field> |
2460 | 822 | </record> | 823 | </record> |
2461 | 823 | 824 | ||
2462 | 825 | <!-- Product Mass Update Menu --> | ||
2463 | 826 | <menuitem id="product.parent_product_mass_update" parent="product_attributes.menu_main_product" name="Products Update" /> | ||
2464 | 827 | <menuitem action="product.previous_mass_update_action" id="menu_import_request" sequence="1" parent="product.parent_product_mass_update" /> | ||
2465 | 828 | |||
2466 | 824 | </data> | 829 | </data> |
2467 | 825 | </openerp> | 830 | </openerp> |