Merge lp:~jfb-tempo-consulting/unifield-server/us7025-7039 into lp:~dorian-kemps/unifield-server/US-7025-7039

Proposed by jftempo
Status: Needs review
Proposed branch: lp:~jfb-tempo-consulting/unifield-server/us7025-7039
Merge into: lp:~dorian-kemps/unifield-server/US-7025-7039
Diff against target: 18564 lines (+9641/-3354)
160 files modified
bin/addons/account/account.py (+1/-1)
bin/addons/account/account_invoice_view.xml (+6/-2)
bin/addons/account/invoice.py (+2/-0)
bin/addons/account/report/account_balance_sheet.py (+24/-22)
bin/addons/account/report/account_general_ledger.py (+10/-6)
bin/addons/account/report/account_partner_ledger.py (+6/-6)
bin/addons/account/report/account_profit_loss.py (+26/-23)
bin/addons/account/wizard/account_invoice_refund.py (+1/-0)
bin/addons/account_corrections/account_analytic_line.py (+1/-1)
bin/addons/account_corrections/wizard/analytic_distribution_wizard.py (+12/-5)
bin/addons/account_override/account.py (+1/-1)
bin/addons/account_override/account_invoice_view.xml (+6/-1)
bin/addons/account_override/invoice.py (+24/-2)
bin/addons/analytic_distribution/account_move_line.py (+5/-3)
bin/addons/analytic_distribution/analytic_distribution_wizard_view.xml (+9/-2)
bin/addons/analytic_distribution/wizard/analytic_distribution_wizard.py (+2/-1)
bin/addons/analytic_override/analytic_line.py (+1/-1)
bin/addons/base/__openerp__.py (+1/-1)
bin/addons/base/ir/ir.xml (+2/-1)
bin/addons/base/ir/ir_actions.py (+1/-0)
bin/addons/base/ir/ir_cron.py (+4/-2)
bin/addons/base/ir/ir_sequence.py (+2/-2)
bin/addons/base/migrations/8.0.1.6/pre-replenishment.py (+10/-0)
bin/addons/base/module/instance_auto_creation.py (+17/-7)
bin/addons/base/res/res_currency.py (+2/-2)
bin/addons/base/res/res_user.py (+2/-0)
bin/addons/base/rng/view.rng (+4/-1)
bin/addons/consumption_calculation/consumption_calculation.py (+80/-49)
bin/addons/consumption_calculation/expiry_calculation.py (+112/-54)
bin/addons/consumption_calculation/expiry_calculation_view.xml (+2/-0)
bin/addons/consumption_calculation/history_consumption.py (+2/-1)
bin/addons/consumption_calculation/report/product_likely_expire.rml (+1/-1)
bin/addons/consumption_calculation/report/product_likely_expire_xls.mako (+1/-1)
bin/addons/delivery_mechanism/delivery_mechanism.py (+0/-155)
bin/addons/documents_done/documents_done.py (+1/-9)
bin/addons/finance/report/account_partner_balance_tree.py (+10/-6)
bin/addons/import_data/import_data.py (+1/-1)
bin/addons/kit/kit.py (+2/-3)
bin/addons/kit/kit_view.xml (+2/-1)
bin/addons/mission_stock/mission_stock.py (+19/-6)
bin/addons/msf_budget/msf_budget_line.py (+2/-2)
bin/addons/msf_cross_docking/cross_docking.py (+0/-38)
bin/addons/msf_custom_settings/__openerp__.py (+1/-2)
bin/addons/msf_doc_import/__init__.py (+0/-1)
bin/addons/msf_doc_import/__openerp__.py (+0/-5)
bin/addons/msf_doc_import/wizard/__init__.py (+0/-4)
bin/addons/msf_doc_import/wizard/wiz_common_import.py (+16/-219)
bin/addons/msf_doc_import/wizard/wiz_common_import_view.xml (+34/-20)
bin/addons/msf_doc_import/wizard/wizard_delete_lines.py (+0/-75)
bin/addons/msf_doc_import/wizard/wizard_delete_lines_view.xml (+0/-58)
bin/addons/msf_doc_import/wizard/wizard_po_simulation_screen.py (+74/-42)
bin/addons/msf_homere_interface/hr_payroll_wizard.xml (+1/-1)
bin/addons/msf_instance/data/instance_data.xml (+0/-13)
bin/addons/msf_instance/data/remote_backup.xml (+1/-0)
bin/addons/msf_instance/msf_instance.py (+14/-2)
bin/addons/msf_instance/res_company.py (+19/-8)
bin/addons/msf_order_date/order_dates.py (+1/-43)
bin/addons/msf_outgoing/msf_outgoing.py (+0/-26)
bin/addons/msf_outgoing/msf_outgoing_view.xml (+3/-3)
bin/addons/msf_processes/__openerp__.py (+2/-3)
bin/addons/msf_processes/process/sale_process.xml (+0/-216)
bin/addons/msf_profile/__openerp__.py (+1/-3)
bin/addons/msf_profile/data/patches.xml (+18/-1)
bin/addons/msf_profile/i18n/fr_MF.po (+2143/-72)
bin/addons/msf_profile/msf_profile.py (+74/-7)
bin/addons/msf_profile/user_rights/ir.model.access.csv (+0/-84)
bin/addons/msf_profile/user_rights/msf_button_access_rights.button_access_rule.csv (+0/-42)
bin/addons/msf_sync_data_server/data/sync_server.message_rule.csv (+2/-26)
bin/addons/msf_sync_data_server/data/sync_server.sync_rule.csv (+7/-116)
bin/addons/msf_tools/msf_tools.py (+11/-0)
bin/addons/msf_tools/report/report_stopped_products_xls.mako (+1/-2)
bin/addons/order_line_number/order_line_number.py (+0/-33)
bin/addons/out_step/out_step.py (+19/-11)
bin/addons/out_step/out_step_view.xml (+2/-2)
bin/addons/procurement/__init__.py (+1/-4)
bin/addons/procurement/__openerp__.py (+1/-12)
bin/addons/procurement_auto/__init__.py (+2/-4)
bin/addons/procurement_auto/__openerp__.py (+1/-4)
bin/addons/procurement_cycle/__init__.py (+4/-4)
bin/addons/procurement_cycle/__openerp__.py (+5/-10)
bin/addons/procurement_cycle/replenishment.py (+2255/-0)
bin/addons/procurement_cycle/replenishment_data.xml (+62/-0)
bin/addons/procurement_cycle/replenishment_report.xml (+54/-0)
bin/addons/procurement_cycle/replenishment_view.xml (+865/-0)
bin/addons/procurement_cycle/replenishment_wizard.xml (+35/-0)
bin/addons/procurement_cycle/report/__init__.py (+4/-0)
bin/addons/procurement_cycle/report/replenishment_inventory_review.mako (+1126/-0)
bin/addons/procurement_cycle/report/replenishment_inventory_review.py (+23/-0)
bin/addons/procurement_cycle/report/replenishment_order_calc.mako (+555/-0)
bin/addons/procurement_cycle/report/replenishment_order_calc.py (+24/-0)
bin/addons/procurement_cycle/report/replenishment_product_list.mako (+164/-0)
bin/addons/procurement_cycle/report/replenishment_product_list.py (+26/-0)
bin/addons/procurement_cycle/report/replenishment_segment.mako (+523/-0)
bin/addons/procurement_cycle/report/replenishment_segment.py (+11/-0)
bin/addons/procurement_request/__openerp__.py (+0/-1)
bin/addons/product/product.py (+0/-39)
bin/addons/product_attributes/product_attributes.py (+47/-49)
bin/addons/product_attributes/product_attributes_view.xml (+3/-1)
bin/addons/purchase/__init__.py (+0/-1)
bin/addons/purchase/purchase_order.py (+2/-1)
bin/addons/purchase/purchase_order_line.py (+17/-0)
bin/addons/purchase/purchase_view.xml (+0/-15)
bin/addons/purchase_msf/purchase_msf.py (+27/-29)
bin/addons/reason_types_moves/reason_type_view.xml (+1/-1)
bin/addons/register_accounting/account_bank_statement.py (+22/-0)
bin/addons/register_accounting/account_move_line.py (+1/-1)
bin/addons/register_accounting/account_view.xml (+8/-4)
bin/addons/register_accounting/wizard/import_cheque_on_bank_registers.py (+6/-0)
bin/addons/register_accounting/wizard/import_invoice_on_registers.py (+6/-0)
bin/addons/resource/wizard_template.py (+2/-2)
bin/addons/sale/sale_demo.xml (+0/-3)
bin/addons/sale/sale_order.py (+0/-27)
bin/addons/sale/sale_unit_test.xml (+0/-2)
bin/addons/sale/sale_view.xml (+0/-25)
bin/addons/sales_followup/report/ir_follow_up_location_report.py (+0/-88)
bin/addons/sourcing/__init__.py (+0/-1)
bin/addons/sourcing/sale_order_line.py (+0/-6)
bin/addons/sourcing/sourcing_view.xml (+0/-9)
bin/addons/specific_rules/specific_rules.py (+0/-339)
bin/addons/specific_rules/specific_rules_view.xml (+0/-41)
bin/addons/stock/product.py (+18/-2)
bin/addons/stock/report/stock_reception_report.py (+27/-3)
bin/addons/stock/stock.py (+130/-0)
bin/addons/stock/stock_move.py (+41/-12)
bin/addons/stock/stock_view.xml (+69/-0)
bin/addons/stock/wizard/physical_inventory_import.py (+14/-0)
bin/addons/stock/wizard/physical_inventory_import_view.xml (+20/-0)
bin/addons/stock_forecast/wizard/stock_forecast.py (+1/-20)
bin/addons/stock_override/__openerp__.py (+0/-1)
bin/addons/stock_override/stock.py (+0/-81)
bin/addons/stock_override/stock_view.xml (+3/-3)
bin/addons/stock_schedule/__openerp__.py (+1/-2)
bin/addons/stock_schedule/schedule.py (+115/-114)
bin/addons/stock_schedule/scheduler_view.xml (+1/-6)
bin/addons/sync_client/backup.py (+38/-10)
bin/addons/sync_client/backup_view.xml (+20/-18)
bin/addons/sync_client/data/cron.xml (+2/-1)
bin/addons/sync_client/message.py (+6/-3)
bin/addons/sync_client/orm.py (+3/-1)
bin/addons/sync_client/rpc.py (+9/-4)
bin/addons/sync_client/sync_client.py (+5/-2)
bin/addons/sync_client/timeout_transport.py (+5/-1)
bin/addons/sync_client/update.py (+2/-3)
bin/addons/sync_common/common.py (+6/-8)
bin/addons/sync_so/picking_rw.py (+213/-244)
bin/addons/sync_so/rw_special_view_handler.py (+0/-45)
bin/addons/sync_so/specific_xml_id.py (+2/-0)
bin/addons/tender_flow/tender_flow.py (+3/-304)
bin/addons/tender_flow/tender_flow_workflow.xml (+0/-113)
bin/addons/useability_dashboard_and_menu/dashboard/board_warehouse_view.xml (+0/-2)
bin/addons/useability_dashboard_and_menu/menu/warehouse_menu.xml (+0/-30)
bin/addons/vertical_integration/report/hq_report_ocb.py (+16/-6)
bin/osv/fields.py (+41/-9)
bin/osv/orm.py (+17/-6)
bin/release.py (+1/-1)
bin/service/web_services.py (+8/-1)
bin/tools/graph.py (+6/-7)
bin/tools/misc.py (+51/-7)
bin/tools/translate.py (+1/-1)
bin/unifield-version.txt (+2/-0)
To merge this branch: bzr merge lp:~jfb-tempo-consulting/unifield-server/us7025-7039
Reviewer Review Type Date Requested Status
Dorian Approve
Review via email: mp+380094@code.launchpad.net
To post a comment you must log in.
Dorian (dorian-kemps) :
review: Approve
5619. By jftempo on 2020-03-13

[MERGE] UF16.0

5620. By jftempo on 2020-03-13

Fix only IN impacted by (-s ship)

5621. By jftempo on 2020-03-16

US-7025: delete only IVO listed in the Jira ticket

Unmerged revisions

5621. By jftempo on 2020-03-16

US-7025: delete only IVO listed in the Jira ticket

5620. By jftempo on 2020-03-13

Fix only IN impacted by (-s ship)

5619. By jftempo on 2020-03-13

[MERGE] UF16.0

5618. By jftempo on 2020-03-02

US-7025 / US-7039: Data cleaning IVO add condition on create by sync, emtpy INs: condition on purchase_id / shipment_ref

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/addons/account/account.py'
2--- bin/addons/account/account.py 2020-02-04 13:51:57 +0000
3+++ bin/addons/account/account.py 2020-03-16 11:13:19 +0000
4@@ -1709,7 +1709,7 @@
5 _name = "account.move.reconcile"
6 _description = "Account Reconciliation"
7 _columns = {
8- 'name': fields.char('Name', size=64, required=True),
9+ 'name': fields.char('Name', size=64, required=True, select=1),
10 'type': fields.char('Type', size=16, required=True),
11 'line_id': fields.one2many('account.move.line', 'reconcile_id', 'Entry Lines'),
12 'line_partial_ids': fields.one2many('account.move.line', 'reconcile_partial_id', 'Partial Entry lines'),
13
14=== modified file 'bin/addons/account/account_invoice_view.xml'
15--- bin/addons/account/account_invoice_view.xml 2020-01-21 14:01:11 +0000
16+++ bin/addons/account/account_invoice_view.xml 2020-03-16 11:13:19 +0000
17@@ -283,9 +283,11 @@
18 ('state', '!=', 'draft'),
19 '&', '&', ('type', '=', 'in_invoice'), ('synced', '=', True), ('from_supply', '=', True)]}"/>
20 <newline/>
21+ <field name="refunded_invoice_id" invisible="1"/>
22 <field name="origin" groups="base.group_extended"
23- attrs="{'readonly': ['|',
24+ attrs="{'readonly': ['|', '|',
25 ('state', '!=', 'draft'),
26+ ('refunded_invoice_id', '!=', False),
27 '&amp;', ('type', '=', 'in_invoice'), ('from_supply', '=', True)]}"/>
28 <field domain="[('partner_id','=',partner_id)]" name="address_contact_id" groups="base.group_extended"/>
29 <field name="user_id"
30@@ -446,8 +448,10 @@
31 <newline/>
32 <field domain="[('partner_id.ref_companies', 'in', [company_id])]" name="partner_bank_id"
33 groups="base.group_extended"/>
34- <field name="origin" attrs="{'readonly': ['|',
35+ <field name="refunded_invoice_id" invisible="1"/>
36+ <field name="origin" attrs="{'readonly': ['|', '|',
37 ('state', '!=', 'draft'),
38+ ('refunded_invoice_id', '!=', False),
39 '&amp;', '&amp;',
40 ('type', '=', 'out_invoice'),
41 ('from_supply', '=', True),
42
43=== modified file 'bin/addons/account/invoice.py'
44--- bin/addons/account/invoice.py 2019-12-20 10:23:07 +0000
45+++ bin/addons/account/invoice.py 2020-03-16 11:13:19 +0000
46@@ -766,6 +766,7 @@
47 'synced': False,
48 'counterpart_inv_number': False,
49 'counterpart_inv_status': False,
50+ 'refunded_invoice_id': False,
51 })
52 if 'date_invoice' not in default:
53 default.update({
54@@ -1383,6 +1384,7 @@
55 obj_journal = self.pool.get('account.journal')
56 new_ids = []
57 for invoice in invoices:
58+ invoice.update({'refunded_invoice_id': invoice['id']})
59 del invoice['id']
60
61 if context.get('is_intermission', False):
62
63=== modified file 'bin/addons/account/report/account_balance_sheet.py'
64--- bin/addons/account/report/account_balance_sheet.py 2017-06-08 16:00:51 +0000
65+++ bin/addons/account/report/account_balance_sheet.py 2020-03-16 11:13:19 +0000
66@@ -242,38 +242,38 @@
67 if i < len(cal_list['liability']) and i < len(cal_list['asset']):
68 temp={
69 'code': cal_list['liability'][i]['code'],
70- 'name': cal_list['liability'][i]['name'],
71- 'level': cal_list['liability'][i]['level'],
72- 'balance':cal_list['liability'][i]['balance'],
73- 'code1': cal_list['asset'][i]['code'],
74- 'name1': cal_list['asset'][i]['name'],
75- 'level1': cal_list['asset'][i]['level'],
76- 'balance1':cal_list['asset'][i]['balance'],
77+ 'name': cal_list['liability'][i]['name'],
78+ 'level': cal_list['liability'][i]['level'],
79+ 'balance':cal_list['liability'][i]['balance'],
80+ 'code1': cal_list['asset'][i]['code'],
81+ 'name1': cal_list['asset'][i]['name'],
82+ 'level1': cal_list['asset'][i]['level'],
83+ 'balance1':cal_list['asset'][i]['balance'],
84 }
85 self.result_temp.append(temp)
86 else:
87 if i < len(cal_list['asset']):
88 temp={
89 'code': '',
90- 'name': '',
91- 'level': False,
92- 'balance':False,
93- 'code1': cal_list['asset'][i]['code'],
94- 'name1': cal_list['asset'][i]['name'],
95- 'level1': cal_list['asset'][i]['level'],
96- 'balance1':cal_list['asset'][i]['balance'],
97+ 'name': '',
98+ 'level': False,
99+ 'balance':False,
100+ 'code1': cal_list['asset'][i]['code'],
101+ 'name1': cal_list['asset'][i]['name'],
102+ 'level1': cal_list['asset'][i]['level'],
103+ 'balance1':cal_list['asset'][i]['balance'],
104 }
105 self.result_temp.append(temp)
106 if i < len(cal_list['liability']):
107 temp={
108 'code': cal_list['liability'][i]['code'],
109- 'name': cal_list['liability'][i]['name'],
110- 'level': cal_list['liability'][i]['level'],
111- 'balance':cal_list['liability'][i]['balance'],
112- 'code1': '',
113- 'name1': '',
114- 'level1': False,
115- 'balance1':False,
116+ 'name': cal_list['liability'][i]['name'],
117+ 'level': cal_list['liability'][i]['level'],
118+ 'balance':cal_list['liability'][i]['balance'],
119+ 'code1': '',
120+ 'name1': '',
121+ 'level1': False,
122+ 'balance1':False,
123 }
124 self.result_temp.append(temp)
125 return None
126@@ -285,6 +285,7 @@
127 return self.result.get(group, [])
128
129 def get_display_info(self, data):
130+ # reminder: in case other items are added in the "Display" col., truncate the text with the truncate_list method
131 info_data = []
132 all_str = _('All')
133
134@@ -325,6 +326,7 @@
135 return infos and ", \n".join(infos) or _('No Filter')
136
137 def get_prop_instances(self, data):
138+ data_tools_obj = self.pool.get('data.tools')
139 instances = []
140 if data.get('form', False):
141 if data['form'].get('instance_ids', False):
142@@ -335,7 +337,7 @@
143 # US-1166: mission only instances if none provided
144 instances = self._get_instances(get_code=True,
145 mission_filter=True)
146- return ', '.join(instances)
147+ return data_tools_obj.truncate_list(instances)
148
149 report_sxw.report_sxw('report.account.balancesheet.horizontal', 'account.account',
150 'addons/account/report/account_balance_sheet_horizontal.rml',parser=report_balancesheet_horizontal,
151
152=== modified file 'bin/addons/account/report/account_general_ledger.py'
153--- bin/addons/account/report/account_general_ledger.py 2019-07-31 15:26:10 +0000
154+++ bin/addons/account/report/account_general_ledger.py 2020-03-16 11:13:19 +0000
155@@ -495,15 +495,18 @@
156 return amount
157
158 def _get_prop_instances_str(self):
159- return ', '.join([ i.code \
160- for i in self.pool.get('msf.instance').browse(self.cr, self.uid, self.selected_instance_ids) \
161- if i.code ])
162+ data_tools_obj = self.pool.get('data.tools')
163+ inst_list = [ i.code \
164+ for i in self.pool.get('msf.instance').browse(self.cr, self.uid, self.selected_instance_ids) \
165+ if i.code ]
166+ return data_tools_obj.truncate_list(inst_list)
167
168 def _get_journals_str(self, data):
169+ data_tools_obj = self.pool.get('data.tools')
170 if 'all_journals' in data['form']:
171 return _('All Journals')
172- return ', '.join(list(set(self._get_journal(data,
173- instance_ids=self.selected_instance_ids))))
174+ journal_list = list(set(self._get_journal(data, instance_ids=self.selected_instance_ids)))
175+ return data_tools_obj.truncate_list(journal_list)
176
177 # internal filter functions
178 def _get_data_form(self, data, key, default=False):
179@@ -512,6 +515,7 @@
180 return data['form'].get(key, default)
181
182 def _get_display_info(self, data):
183+ data_tools_obj = self.pool.get('data.tools')
184 info_data = []
185 yes_str = _('Yes')
186 no_str = _('No')
187@@ -550,7 +554,7 @@
188 if a.type != 'view' ], )))
189
190 res = [ "%s: %s" % (label, val, ) for label, val in info_data ]
191- return ', \n'.join(res)
192+ return data_tools_obj.truncate_list(res, separator=', \n')
193
194 def _get_open_items_selection(self, data):
195 """
196
197=== modified file 'bin/addons/account/report/account_partner_ledger.py'
198--- bin/addons/account/report/account_partner_ledger.py 2018-08-20 09:13:59 +0000
199+++ bin/addons/account/report/account_partner_ledger.py 2020-03-16 11:13:19 +0000
200@@ -484,22 +484,22 @@
201 """
202 Returns the list of journals as a String (cut if > 300 characters)
203 """
204- journals_str = ', '.join([journal or '' for journal in self._get_journal(data)])
205- return (len(journals_str) <= 300) and journals_str or ("%s%s" % (journals_str[:297], '...'))
206+ data_tools_obj = self.pool.get('data.tools')
207+ return data_tools_obj.truncate_list(self._get_journal(data))
208
209 def _get_instances_str(self, data):
210 """
211 Returns the list of instances as a String (cut if > 300 characters)
212 """
213- instances_str = ', '.join([inst or '' for inst in self._get_instances_from_data(data)])
214- return (len(instances_str) <= 300) and instances_str or ("%s%s" % (instances_str[:297], '...'))
215+ data_tools_obj = self.pool.get('data.tools')
216+ return data_tools_obj.truncate_list(self._get_instances_from_data(data))
217
218 def _get_accounts_str(self, data):
219 """
220 Returns the list of accounts as a String (cut if > 300 characters)
221 """
222- accounts_str = ', '.join([acc or '' for acc in self._get_accounts(data)])
223- return (len(accounts_str) <= 300) and accounts_str or ("%s%s" % (accounts_str[:297], '...'))
224+ data_tools_obj = self.pool.get('data.tools')
225+ return data_tools_obj.truncate_list(self._get_accounts(data))
226
227 # PDF report with one partner per page
228 report_sxw.report_sxw('report.account.third_party_ledger', 'res.partner',
229
230=== modified file 'bin/addons/account/report/account_profit_loss.py'
231--- bin/addons/account/report/account_profit_loss.py 2017-04-19 12:44:30 +0000
232+++ bin/addons/account/report/account_profit_loss.py 2020-03-16 11:13:19 +0000
233@@ -111,7 +111,7 @@
234 ctx['date_from'] = data['form'].get('date_from', False)
235 ctx['date_to'] = data['form'].get('date_to', False)
236 if 'instance_ids' in data['form']:
237- ctx['instance_ids'] = data['form']['instance_ids']
238+ ctx['instance_ids'] = data['form']['instance_ids']
239
240 cal_list = {}
241 account_id = data['form'].get('chart_account_id', False)
242@@ -149,38 +149,38 @@
243 if i < len(cal_list['expense']) and i < len(cal_list['income']):
244 temp={
245 'code': cal_list['expense'][i].code,
246- 'name': cal_list['expense'][i].name,
247- 'level': cal_list['expense'][i].level,
248- 'balance':cal_list['expense'][i].balance,
249- 'code1': cal_list['income'][i].code,
250- 'name1': cal_list['income'][i].name,
251- 'level1': cal_list['income'][i].level,
252- 'balance1':cal_list['income'][i].balance,
253+ 'name': cal_list['expense'][i].name,
254+ 'level': cal_list['expense'][i].level,
255+ 'balance':cal_list['expense'][i].balance,
256+ 'code1': cal_list['income'][i].code,
257+ 'name1': cal_list['income'][i].name,
258+ 'level1': cal_list['income'][i].level,
259+ 'balance1':cal_list['income'][i].balance,
260 }
261 self.result_temp.append(temp)
262 else:
263 if i < len(cal_list['income']):
264 temp={
265 'code': '',
266- 'name': '',
267- 'level': False,
268- 'balance':False,
269- 'code1': cal_list['income'][i].code,
270- 'name1': cal_list['income'][i].name,
271- 'level1': cal_list['income'][i].level,
272- 'balance1':cal_list['income'][i].balance,
273+ 'name': '',
274+ 'level': False,
275+ 'balance':False,
276+ 'code1': cal_list['income'][i].code,
277+ 'name1': cal_list['income'][i].name,
278+ 'level1': cal_list['income'][i].level,
279+ 'balance1':cal_list['income'][i].balance,
280 }
281 self.result_temp.append(temp)
282 if i < len(cal_list['expense']):
283 temp={
284 'code': cal_list['expense'][i].code,
285- 'name': cal_list['expense'][i].name,
286- 'level': cal_list['expense'][i].level,
287- 'balance':cal_list['expense'][i].balance,
288- 'code1': '',
289- 'name1': '',
290- 'level1': False,
291- 'balance1':False,
292+ 'name': cal_list['expense'][i].name,
293+ 'level': cal_list['expense'][i].level,
294+ 'balance':cal_list['expense'][i].balance,
295+ 'code1': '',
296+ 'name1': '',
297+ 'level1': False,
298+ 'balance1':False,
299 }
300 self.result_temp.append(temp)
301 return None
302@@ -192,6 +192,7 @@
303 return self.result.get(group, [])
304
305 def get_display_info(self, data):
306+ # reminder: in case other items are added in the "Display" col., truncate the text with the truncate_list method
307 info_data = []
308 all_str = _('All')
309
310@@ -232,6 +233,7 @@
311 return infos and ", \n".join(infos) or _('No Filter')
312
313 def get_prop_instances(self, data):
314+ data_tools_obj = self.pool.get('data.tools')
315 instances = []
316 if data.get('form', False):
317 if data['form'].get('instance_ids', False):
318@@ -242,7 +244,8 @@
319 # US-1166: mission only instances if none provided
320 instances = self._get_instances(get_code=True,
321 mission_filter=True)
322- return ', '.join(instances)
323+ return data_tools_obj.truncate_list(instances)
324+
325
326 report_sxw.report_sxw('report.pl.account.horizontal', 'account.account',
327 'addons/account/report/account_profit_horizontal.rml',parser=report_pl_account_horizontal, header='internal landscape')
328
329=== modified file 'bin/addons/account/wizard/account_invoice_refund.py'
330--- bin/addons/account/wizard/account_invoice_refund.py 2019-09-17 09:58:58 +0000
331+++ bin/addons/account/wizard/account_invoice_refund.py 2020-03-16 11:13:19 +0000
332@@ -243,6 +243,7 @@
333 )
334 if mode == 'modify':
335 invoice = inv_obj.read(cr, uid, inv.id, self._hook_fields_for_modify_refund(cr, uid), context=context)
336+ invoice.update({'refunded_invoice_id': invoice['id']})
337 del invoice['id']
338 invoice_lines = inv_line_obj.read(cr, uid, invoice['invoice_line'], context=context)
339 invoice_lines = inv_obj._refund_cleanup_lines(cr, uid, invoice_lines, is_account_inv_line=True, context=context)
340
341=== modified file 'bin/addons/account_corrections/account_analytic_line.py'
342--- bin/addons/account_corrections/account_analytic_line.py 2016-08-02 08:06:19 +0000
343+++ bin/addons/account_corrections/account_analytic_line.py 2020-03-16 11:13:19 +0000
344@@ -46,7 +46,7 @@
345
346 _columns = {
347 'is_corrigible': fields.function(_is_aji_corrigible, method=True, string='Is corrigible?', type='boolean', readonly=True, store=False),
348- 'last_corrected_id': fields.many2one('account.analytic.line', string="Last corrected entry", readonly=True),
349+ 'last_corrected_id': fields.many2one('account.analytic.line', string="Last corrected entry", readonly=True, select=1),
350 }
351
352 def button_corrections(self, cr, uid, ids, context=None):
353
354=== modified file 'bin/addons/account_corrections/wizard/analytic_distribution_wizard.py'
355--- bin/addons/account_corrections/wizard/analytic_distribution_wizard.py 2020-01-28 11:28:56 +0000
356+++ bin/addons/account_corrections/wizard/analytic_distribution_wizard.py 2020-03-16 11:13:19 +0000
357@@ -313,13 +313,14 @@
358
359 old_line_ok.append(old_line.id)
360
361- to_reverse_ids = []
362+ reversed_lines_ids = [] # to store the ids corresponding to all the lines of which the AD has been either edited or deleted
363 for wiz_line in self.pool.get('funding.pool.distribution.line').browse(cr, uid, [x for x in old_line_ids if x not in old_line_ok]):
364 # distribution line deleted by user
365 if self.pool.get('account.analytic.account').is_blocked_by_a_contract(cr, uid, [wiz_line.analytic_id.id]):
366 raise osv.except_osv(_('Error'), _("Funding pool is on a soft/hard closed contract: %s")%(wiz_line.analytic_id.code))
367 to_reverse_ids = self._check_period_closed_on_fp_distrib_line(cr, uid, wiz_line.id, is_HQ_origin=is_HQ_origin)
368 if to_reverse_ids:
369+ reversed_lines_ids += to_reverse_ids
370 # reverse the line
371 #to_reverse_ids = ana_obj.search(cr, uid, [('distrib_line_id', '=', 'funding.pool.distribution.line,%d'%wiz_line.id)])
372 if period.state != 'draft':
373@@ -370,8 +371,7 @@
374 # create the ana line (pay attention to take original date as posting date as UF-2199 said it.
375 name = False
376 if period_closed or is_HQ_origin:
377- if period_closed or is_HQ_origin:
378- create_date = posting_date
379+ create_date = posting_date
380 name = ana_line_obj.join_without_redundancy(ml.name, 'COR')
381 if keep_seq_and_corrected:
382 create_date = keep_seq_and_corrected[2] # is_HQ_origin keep date too
383@@ -412,6 +412,7 @@
384 for line in to_reverse:
385 # reverse the line
386 to_reverse_ids = ana_line_obj.search(cr, uid, [('distrib_line_id', '=', 'funding.pool.distribution.line,%d'%line.distribution_line_id.id), ('is_reversal', '=', False), ('is_reallocated', '=', False)])
387+ reversed_lines_ids += to_reverse_ids
388
389 # get the original sequence
390 orig_line = ana_line_obj.browse(cr, uid, to_reverse_ids)[0]
391@@ -451,8 +452,14 @@
392 ana_line_obj.write(cr, uid, [ret[ret_id]], {'last_corrected_id': to_reverse_ids[0], 'journal_id': correction_journal_id, 'ref': orig_line.entry_sequence })
393 cr.execute('update account_analytic_line set entry_sequence = %s where id = %s', (get_entry_seq(entry_seq_data), ret[ret_id]) )
394 # UFTP-194: Set missing entry sequence for created analytic lines
395- if have_been_created and to_reverse_ids:
396- cr.execute('update account_analytic_line set entry_sequence = %s, last_corrected_id = %s where id in %s', (get_entry_seq(entry_seq_data), to_reverse_ids[0], tuple(have_been_created)))
397+ if have_been_created and reversed_lines_ids:
398+ reversed_line_id = max(reversed_lines_ids) # always consider that the line corrected is the most recent one
399+ corrected_aji = ana_line_obj.read(cr, uid, reversed_line_id, ['entry_sequence', 'name'], context=context)
400+ new_description = ana_line_obj.join_without_redundancy(corrected_aji['name'], 'COR')
401+ cr.execute('update account_analytic_line '
402+ 'set entry_sequence = %s, last_corrected_id = %s, ref = %s, name = %s '
403+ 'where id in %s;', (get_entry_seq(entry_seq_data), reversed_line_id,
404+ corrected_aji['entry_sequence'] or '', new_description, tuple(have_been_created)))
405
406 #####
407 ## FP: TO OVERRIDE
408
409=== modified file 'bin/addons/account_override/account.py'
410--- bin/addons/account_override/account.py 2019-12-09 10:00:19 +0000
411+++ bin/addons/account_override/account.py 2020-03-16 11:13:19 +0000
412@@ -1383,7 +1383,7 @@
413 return ''
414
415 _columns = {
416- 'name': fields.char('Entry Sequence', size=64, required=True),
417+ 'name': fields.char('Entry Sequence', size=64, required=True, select=1),
418 'statement_line_ids': fields.many2many('account.bank.statement.line', 'account_bank_statement_line_move_rel', 'statement_id', 'move_id',
419 string="Statement lines", help="This field give all statement lines linked to this move."),
420 }
421
422=== modified file 'bin/addons/account_override/account_invoice_view.xml'
423--- bin/addons/account_override/account_invoice_view.xml 2020-01-21 14:01:11 +0000
424+++ bin/addons/account_override/account_invoice_view.xml 2020-03-16 11:13:19 +0000
425@@ -661,7 +661,12 @@
426 '&amp;', ('type', '=', 'out_invoice'), ('from_supply', '=', True)]}"/>
427 <newline/>
428 <field domain="[('partner_id.ref_companies', 'in', [company_id])]" name="partner_bank_id" />
429- <field name="origin" attrs="{'readonly': ['|', ('state', '!=', 'draft'), ('from_supply', '=', True)]}"/>
430+ <field name="refunded_invoice_id" invisible="1"/>
431+ <field name="origin"
432+ attrs="{'readonly': ['|', '|',
433+ ('state', '!=', 'draft'),
434+ ('refunded_invoice_id', '!=', False),
435+ ('from_supply', '=', True)]}"/>
436 <field colspan="4" domain="[('partner_id','=',partner_id)]" name="address_contact_id" />
437 <field name="move_id" />
438 <separator colspan="4" string="Additional Information"/>
439
440=== modified file 'bin/addons/account_override/invoice.py'
441--- bin/addons/account_override/invoice.py 2020-01-08 16:03:24 +0000
442+++ bin/addons/account_override/invoice.py 2020-03-16 11:13:19 +0000
443@@ -255,6 +255,8 @@
444 'is_merged_by_account': fields.boolean("Is merged by account"),
445 'partner_type': fields.related('partner_id', 'partner_type', string='Partner Type', type='selection',
446 selection=PARTNER_TYPE, readonly=True, store=False),
447+ 'refunded_invoice_id': fields.many2one('account.invoice', string='Refunded Invoice', readonly=True,
448+ help='The refunded invoice which has generated this document'), # 2 inv types for Refund Modify
449 }
450
451 _defaults = {
452@@ -1476,6 +1478,7 @@
453 and [(6, 0, vals['invoice_line_tax_id'])] or False
454
455 # create merge line
456+ vals.update({'merged_line': True})
457 if not self.pool.get('account.invoice.line').create(cr, uid,
458 vals, context=context):
459 break
460@@ -1520,6 +1523,7 @@
461 ad_obj = self.pool.get('analytic.distribution')
462
463 # merging
464+ context.update({'from_merge': True})
465 for inv_br in self.browse(cr, uid, ids, context=context):
466 merge_invoice(inv_br)
467
468@@ -1707,12 +1711,14 @@
469 ('in_invoice', 'Supplier Invoice'),
470 ('out_refund', 'Customer Refund'),
471 ('in_refund', 'Supplier Refund')]),
472+ 'merged_line': fields.boolean(string='Merged Line', help='Line generated by the merging of other lines', readonly=True),
473 }
474
475 _defaults = {
476 'price_unit': lambda *a: 0.00,
477 'is_corrected': lambda *a: False,
478 'vat_ok': lambda obj, cr, uid, context: obj.pool.get('unifield.setup.configuration').get_config(cr, uid).vat_ok,
479+ 'merged_line': lambda *a: False,
480 }
481
482 _order = 'line_number'
483@@ -1847,11 +1853,13 @@
484 Copy an invoice line without its move lines,
485 without the link to a reversed invoice line,
486 and without link to PO/FO lines when the duplication is manual
487+ Reset the merged_line tag.
488 """
489 if default is None:
490 default = {}
491 default.update({'move_lines': False,
492 'reversed_invoice_line_id': False,
493+ 'merged_line': False,
494 })
495 # Manual duplication should generate a "manual document not created through the supply workflow"
496 # so we don't keep the link to PO/FO at line level
497@@ -1869,6 +1877,7 @@
498 - compute total amount (check_total field)
499 - write total to the register line
500 - Raise error msg if the related inv. has been generated via Sync. or by a Supply workflow (for Intermission/Intersection partners)
501+ (for SI from Supply: merging lines is always allowed, deleting lines is allowed only for manual lines not having been merged.)
502 """
503 if not context:
504 context = {}
505@@ -1881,10 +1890,23 @@
506 for invl in self.browse(cr, uid, ids):
507 if invl.invoice_id and invl.invoice_id.id not in invoice_ids:
508 invoice = invl.invoice_id
509- invoice_ids.append(invoice.id) # check each invoice only once
510 in_invoice = invoice.type == 'in_invoice' and not invoice.is_inkind_donation
511+ supp_inv = in_invoice and not invoice.is_intermission
512+ from_merge = context.get('from_merge')
513+ from_supply = invoice.from_supply
514 intermission_or_section = invoice.partner_type in ('intermission', 'section')
515- if (in_invoice and invoice.synced) or (invoice.from_supply and intermission_or_section):
516+ check_line_per_line = from_supply and supp_inv and not from_merge
517+ if not check_line_per_line:
518+ invoice_ids.append(invoice.id) # check each invoice only once
519+ deletion_allowed = True
520+ if in_invoice and invoice.synced:
521+ deletion_allowed = False
522+ elif from_supply:
523+ if intermission_or_section:
524+ deletion_allowed = False
525+ elif supp_inv and not from_merge and (invl.order_line_id or invl.merged_line):
526+ deletion_allowed = False
527+ if not deletion_allowed:
528 # will be displayed when trying to delete lines manually / merge lines / or split invoices
529 raise osv.except_osv(_('Error'), _("This document has been generated via a Supply workflow or via synchronization. "
530 "Existing lines can't be deleted."))
531
532=== modified file 'bin/addons/analytic_distribution/account_move_line.py'
533--- bin/addons/analytic_distribution/account_move_line.py 2020-01-22 14:24:47 +0000
534+++ bin/addons/analytic_distribution/account_move_line.py 2020-03-16 11:13:19 +0000
535@@ -168,9 +168,11 @@
536 line_distrib_id = (obj_line.get('analytic_distribution_id', False) and obj_line.get('analytic_distribution_id')[0]) or (move.get('analytic_distribution_id', False) and move.get('analytic_distribution_id')[0]) or False
537 # When you create a journal entry manually, we should not have analytic lines if ONE line is invalid!
538 other_lines_are_ok = True
539- result = self.search(cr, uid, [('move_id', '=', move.get('id', False)), ('move_id.status', '=', 'manu'), ('state', '!=', 'valid')], count=1)
540- if result and result > 0 and move.get('status', False) == 'manu':
541- other_lines_are_ok = False
542+ #result = self.search(cr, uid, [('move_id', '=', move.get('id', False)), ('move_id.status', '=', 'manu'), ('state', '!=', 'valid')], count=1)
543+ if move.get('status', False) == 'manu':
544+ result = self.search(cr, uid, [('move_id', '=', move.get('id', False)), ('state', '!=', 'valid')], count=1)
545+ if result and result > 0:
546+ other_lines_are_ok = False
547 # Check that line have analytic-a-holic account and have a distribution
548 if line_distrib_id and account.get('is_analytic_addicted', False) and other_lines_are_ok:
549 ana_state = self.pool.get('analytic.distribution')._get_distribution_state(cr, uid, line_distrib_id, {}, account.get('id'),
550
551=== modified file 'bin/addons/analytic_distribution/analytic_distribution_wizard_view.xml'
552--- bin/addons/analytic_distribution/analytic_distribution_wizard_view.xml 2020-01-21 13:02:38 +0000
553+++ bin/addons/analytic_distribution/analytic_distribution_wizard_view.xml 2020-03-16 11:13:19 +0000
554@@ -104,12 +104,19 @@
555 </group>
556 </group>
557 <field name="invalid_small_amount"/>
558- <group colspan="6" col="2" attrs="{'invisible': [('invalid_small_amount', '=', False)]}" >
559+ <group colspan="6" col="2">
560 <html>
561 <p id="label_invalid_small_amount"
562- style="text-align:center; color: red; font-weight: bold; font-size: 1.1em;">
563+ style="text-align:center; color: red; font-weight: bold; font-size: 1.1em;display:none">
564 <translate>Make sure that there is only one Analytic Distribution line for the entries having a booking amount inferior or equal to 1.</translate>
565 </p>
566+
567+ <script language="javascript">
568+ var invalid_small_amount = $('#invalid_small_amount').val() || $('invalid_small_amount').text();
569+ if (invalid_small_amount) {
570+ $('#label_invalid_small_amount').show();
571+ }
572+ </script>
573 </html>
574 </group>
575 <group colspan="4" col="2" attrs="{'invisible': [('state', '!=', 'cc')]}">
576
577=== modified file 'bin/addons/analytic_distribution/wizard/analytic_distribution_wizard.py'
578--- bin/addons/analytic_distribution/wizard/analytic_distribution_wizard.py 2020-01-30 17:08:29 +0000
579+++ bin/addons/analytic_distribution/wizard/analytic_distribution_wizard.py 2020-03-16 11:13:19 +0000
580@@ -769,7 +769,8 @@
581 obj = self.pool.get(obj_type).browse(cr, uid, vals[field_name], context=context)
582 if not line_field:
583 # AD at line level
584- invalid_small_amount = obj.analytic_distribution_state == 'invalid_small_amount' or False
585+ distrib_state = hasattr(obj, 'analytic_distribution_state') and getattr(obj, 'analytic_distribution_state') or ''
586+ invalid_small_amount = distrib_state == 'invalid_small_amount' or False
587 else:
588 # AD at header level
589 lines = hasattr(obj, line_field) and getattr(obj, line_field) or []
590
591=== modified file 'bin/addons/analytic_override/analytic_line.py'
592--- bin/addons/analytic_override/analytic_line.py 2019-10-30 16:33:21 +0000
593+++ bin/addons/analytic_override/analytic_line.py 2020-03-16 11:13:19 +0000
594@@ -113,7 +113,7 @@
595 'destination_id': fields.many2one('account.analytic.account', string="Destination", domain="[('category', '=', 'DEST'), ('type', '<>', 'view')]", ondelete='restrict'),
596 'distrib_line_id': fields.reference('Distribution Line ID', selection=[('funding.pool.distribution.line', 'FP'),('free.1.distribution.line', 'free1'), ('free.2.distribution.line', 'free2')], size=512),
597 'free_account': fields.function(_get_is_free, fnct_search=_search_is_free, method=True, type='boolean', string='Free account?', help="Does that line come from a Free 1 or Free 2 account?"),
598- 'reversal_origin': fields.many2one('account.analytic.line', string="Reversal origin", readonly=True, help="Line that have been reversed."),
599+ 'reversal_origin': fields.many2one('account.analytic.line', string="Reversal origin", readonly=True, help="Line that have been reversed.", select=1),
600 'reversal_origin_txt': fields.function(_get_reversal_origin_txt, string="Reversal origin", type='char', size=256,
601 store={
602 'account.analytic.line': (_get_analytic_reversal, ['name', 'reversal_origin'], 20),
603
604=== modified file 'bin/addons/base/__openerp__.py'
605--- bin/addons/base/__openerp__.py 2019-10-10 15:06:49 +0000
606+++ bin/addons/base/__openerp__.py 2020-03-16 11:13:19 +0000
607@@ -23,7 +23,7 @@
608
609 {
610 'name': 'Base',
611- 'version': '1.5',
612+ 'version': '1.6',
613 'category': 'Generic Modules/Base',
614 'description': """The kernel of OpenERP, needed for all installation.""",
615 'author': 'OpenERP SA',
616
617=== modified file 'bin/addons/base/ir/ir.xml'
618--- bin/addons/base/ir/ir.xml 2019-06-18 13:53:48 +0000
619+++ bin/addons/base/ir/ir.xml 2020-03-16 11:13:19 +0000
620@@ -1576,7 +1576,8 @@
621 <field name="arch" type="xml">
622 <form string="Scheduled Actions">
623 <field name="name"/>
624- <field name="active"/>
625+ <field name="active" attrs="{'readonly': [('manual_activation', '=', False)]}"/>
626+ <field name="manual_activation" invisible="1" />
627 <field name="user_id" />
628 <field name="priority" />
629 <notebook colspan="4">
630
631=== modified file 'bin/addons/base/ir/ir_actions.py'
632--- bin/addons/base/ir/ir_actions.py 2019-05-22 10:12:44 +0000
633+++ bin/addons/base/ir/ir_actions.py 2020-03-16 11:13:19 +0000
634@@ -338,6 +338,7 @@
635 'auto_search':lambda *a: True,
636 'multi': False,
637 'sidebar_open': lambda *a: False,
638+ 'name': '',
639 }
640
641 def for_xml_id(self, cr, uid, module, xml_id, context=None):
642
643=== modified file 'bin/addons/base/ir/ir_cron.py'
644--- bin/addons/base/ir/ir_cron.py 2019-07-19 07:33:28 +0000
645+++ bin/addons/base/ir/ir_cron.py 2020-03-16 11:13:19 +0000
646@@ -60,7 +60,8 @@
647 'model': fields.char('Object', size=64, help="Name of object whose function will be called when this scheduler will run. e.g. 'res.partener'"),
648 'function': fields.char('Function', size=64, help="Name of the method to be called on the object when this scheduler is executed."),
649 'args': fields.text('Arguments', help="Arguments to be passed to the method. e.g. (uid,)"),
650- 'priority': fields.integer('Priority', help='0=Very Urgent\n10=Not urgent')
651+ 'priority': fields.integer('Priority', help='0=Very Urgent\n10=Not urgent'),
652+ 'manual_activation': fields.boolean('Manual Activation', internal=1, readonly=1, help='Used to set active as RO'),
653 }
654
655 _defaults = {
656@@ -71,7 +72,8 @@
657 'interval_type' : lambda *a: 'months',
658 'numbercall' : lambda *a: 1,
659 'active' : lambda *a: 1,
660- 'doall' : lambda *a: 0
661+ 'doall' : lambda *a: 0,
662+ 'manual_activation': True
663 }
664
665 def _check_args(self, cr, uid, ids, context=None):
666
667=== modified file 'bin/addons/base/ir/ir_sequence.py'
668--- bin/addons/base/ir/ir_sequence.py 2019-03-26 15:54:24 +0000
669+++ bin/addons/base/ir/ir_sequence.py 2020-03-16 11:13:19 +0000
670@@ -28,7 +28,7 @@
671 _order = 'name'
672 _columns = {
673 'name': fields.char('Name',size=64, required=True),
674- 'code': fields.char('Code',size=32, required=True),
675+ 'code': fields.char('Code',size=32, required=True, select=1),
676 }
677 ir_sequence_type()
678
679@@ -83,7 +83,7 @@
680
681 _columns = {
682 'name': fields.char('Name',size=64, required=True),
683- 'code': fields.char('Code',size=64, required=True),
684+ 'code': fields.char('Code',size=64, required=True, select=1),
685 'active': fields.boolean('Active'),
686 'prefix': fields.char('Prefix',size=64, help="Prefix value of the record for the sequence"),
687 'suffix': fields.char('Suffix',size=64, help="Suffix value of the record for the sequence"),
688
689=== added directory 'bin/addons/base/migrations/8.0.1.6'
690=== added file 'bin/addons/base/migrations/8.0.1.6/pre-replenishment.py'
691--- bin/addons/base/migrations/8.0.1.6/pre-replenishment.py 1970-01-01 00:00:00 +0000
692+++ bin/addons/base/migrations/8.0.1.6/pre-replenishment.py 2020-03-16 11:13:19 +0000
693@@ -0,0 +1,10 @@
694+
695+def migrate(cr, version):
696+ if not cr.table_exists('ir_module_module'):
697+ return
698+
699+ cr.execute("update ir_module_module set state='uninstalled' where name in ('threshold_value', 'procurement_report')")
700+ if cr.column_exists('wkf_transition', 'sequence'):
701+ cr.execute("update wkf_transition set sequence = id where act_to in (select id from wkf_activity where wkf_id = (select id from wkf where name='procurement.order.basic'))")
702+ cr.execute("delete from ir_ui_menu where id in (select res_id from ir_model_data where module in ('threshold_value', 'procurement_report') and model='ir.ui.menu')")
703+ return True
704
705=== modified file 'bin/addons/base/module/instance_auto_creation.py'
706--- bin/addons/base/module/instance_auto_creation.py 2019-07-23 14:06:03 +0000
707+++ bin/addons/base/module/instance_auto_creation.py 2020-03-16 11:13:19 +0000
708@@ -63,7 +63,7 @@
709 ('end_init_sync', 'Init sync finished !'),
710 ('reconfigure', 'Do reconfigure...'),
711 ('reconfigure_done', 'Reconfigure done.'),
712- ('import_files', 'Start file imoprt...'),
713+ ('import_files', 'Start importing files ...'),
714 ('files_imported', 'Files import done.'),
715 ('partner_configuration', 'Start configuration of internal partner...'),
716 ('partner_configuration_done', 'Internal partner configuration done.'),
717@@ -361,6 +361,7 @@
718 self.write(cr, 1, creation_id,
719 {'state': 'waiting_for_validation'}, context=context)
720 except Exception as e:
721+ logging.getLogger('autoinstall').error('Auto creation error: %s' % tools.misc.get_traceback(e))
722 self.write(cr, 1, creation_id,
723 {'error': '%s' % e}, context=context)
724
725@@ -406,18 +407,18 @@
726 if sync_status == 'Syncing...':
727 # keep going
728 pass
729- elif sync_status == 'Connected' or sync_status.startswith('Last Sync: In Progress...'):
730+ elif sync_status.startswith('Last Sync: Ok'):
731+ self.write(cr, 1, creation_id,
732+ {'state': 'end_init_sync'}, context=context)
733+ elif sync_status == 'Connected' or sync_status.startswith('Last Sync:'):
734 # start/restart the init sync (very long)
735 self.write(cr, 1, creation_id,
736 {'state': 'start_init_sync'}, context=context)
737 entity_obj.sync(cr, uid)
738 self.write(cr, 1, creation_id,
739 {'state': 'end_init_sync'}, context=context)
740- elif sync_status.startswith('Last Sync: Ok'):
741- self.write(cr, 1, creation_id,
742- {'state': 'end_init_sync'}, context=context)
743 else:
744- raise 'Impossible to perform the sync. Sync status is \'%s\'.' % sync_status
745+ raise osv.except_osv(_("Error!"), 'Impossible to perform the sync. Sync status is \'%s\'.' % sync_status)
746
747 if not skip_backup_config:
748 self.write(cr, 1, creation_id,
749@@ -615,12 +616,15 @@
750 cr.rollback()
751 logging.getLogger('autoinstall').warn('Unable to set Silent Upgrade, please check the silent upgrade and auto sync times')
752
753+ cr.commit()
754 if not skip_import_files:
755 self.write(cr, 1, creation_id,
756 {'state': 'import_files'}, context=context)
757 import_path = os.path.join(tools.config['root_path'], '..', 'UFautoInstall', 'import')
758 file_to_import = []
759 for file_name in os.listdir(import_path):
760+ if file_name.endswith('.imported'):
761+ continue
762 if not '.csv' in file_name:
763 raise osv.except_osv(_("Error!"), 'Only CSV file can be imported. \'%s\' is not a CSV extension.' % file_name)
764 if file_name == 'account.analytic.journal.csv':
765@@ -630,7 +634,11 @@
766 for file_name in file_to_import:
767 model_to_import = file_name.split('.csv')[0]
768 model_obj = self.pool.get(model_to_import)
769- model_obj.import_data_from_csv(cr, uid, os.path.join(import_path, file_name))
770+ processed, rejected, headers = model_obj.import_data_from_csv(cr, uid, os.path.join(import_path, file_name), with_commit=False)
771+ if rejected:
772+ raise osv.except_osv(_("Error!"), "Import file %s\n %s" % (file_name, "\n".join(["Line: %s %s" % (x[0], x[2]) for x in rejected])))
773+ cr.commit()
774+ os.rename(os.path.join(import_path, file_name), os.path.join(import_path, '%s.imported' %file_name))
775 self.write(cr, 1, creation_id,
776 {'state': 'files_imported'}, context=context)
777
778@@ -723,6 +731,8 @@
779 shutil.move(config_file_path, "%s-%s" % (config_file_path, time.strftime('%Y%m%d-%H%M')))
780
781 except Exception as e:
782+ cr.rollback()
783+ logging.getLogger('autoinstall').error('Auto creation error: %s' % tools.misc.get_traceback(e))
784 self.write(cr, 1, creation_id,
785 {'error': '%s' % e}, context=context)
786
787
788=== modified file 'bin/addons/base/res/res_currency.py'
789--- bin/addons/base/res/res_currency.py 2019-10-31 14:53:19 +0000
790+++ bin/addons/base/res/res_currency.py 2020-03-16 11:13:19 +0000
791@@ -329,7 +329,7 @@
792 partner_list = ' / '.join(x.res_id.name for x in properties)
793 raise osv.except_osv(_('Error !'),
794 _('You cannot uncheck the ESC checkbox because this currency is used on these \'ESC\' partners : \
795- %s' % partner_list))
796+ %s') % partner_list)
797
798 if 'active' in values and not values.get('currency_table_id', False) and pricelist_obj:
799 if values['active'] == False:
800@@ -501,7 +501,7 @@
801 date = line[0]
802 elif line[0] != date:
803 raise osv.except_osv(_('Error'),
804- _("All dates should be equal for all lines in file %s." % file_to_import))
805+ _("All dates should be equal for all lines in file %s.") % file_to_import)
806 line_number += 1
807
808 # check that this date is a real date
809
810=== modified file 'bin/addons/base/res/res_user.py'
811--- bin/addons/base/res/res_user.py 2019-04-04 14:25:27 +0000
812+++ bin/addons/base/res/res_user.py 2020-03-16 11:13:19 +0000
813@@ -652,6 +652,8 @@
814 if values.get('login'):
815 values['login'] = tools.ustr(values['login']).lower()
816
817+ if 'name' not in values:
818+ values['name'] = values['login']
819 user_id = super(users, self).create(cr, uid, values, context)
820 if 'log_xmlrpc' in values:
821 # clear the cache of the list of uid to log
822
823=== modified file 'bin/addons/base/rng/view.rng'
824--- bin/addons/base/rng/view.rng 2019-08-23 14:56:06 +0000
825+++ bin/addons/base/rng/view.rng 2020-03-16 11:13:19 +0000
826@@ -374,8 +374,9 @@
827 <rng:optional><rng:attribute name="rowspan"/></rng:optional>
828 <rng:optional><rng:attribute name="string"/></rng:optional>
829 <rng:optional><rng:attribute name="col"/></rng:optional>
830- <rng:optional><rng:attribute name="attrs"/></rng:optional>
831+ <rng:optional><rng:attribute name="attrs"/></rng:optional>
832 <rng:optional><rng:attribute name="select"/></rng:optional>
833+ <rng:optional><rng:attribute name="invisible"/></rng:optional>
834 <rng:optional><rng:attribute name="orientation"/></rng:optional>
835 <rng:zeroOrMore>
836 <rng:choice>
837@@ -438,6 +439,7 @@
838 <rng:optional><rng:attribute name="editable"/></rng:optional>
839 <rng:optional><rng:attribute name="domain_filter"/></rng:optional>
840 <rng:optional><rng:attribute name="attrs"/></rng:optional>
841+ <rng:optional><rng:attribute name="class"/></rng:optional>
842 <rng:optional><rng:attribute name="string"/></rng:optional>
843 <rng:optional><rng:attribute name="completion"/></rng:optional>
844 <rng:optional><rng:attribute name="width"/></rng:optional>
845@@ -467,6 +469,7 @@
846 <rng:optional><rng:attribute name="nolabel"/></rng:optional>
847 <rng:optional><rng:attribute name="default"/></rng:optional>
848 <rng:optional><rng:attribute name="default_get"/></rng:optional>
849+ <rng:optional><rng:attribute name="scroll"/></rng:optional>
850 <rng:optional><rng:attribute name="required"/></rng:optional>
851 <rng:optional><rng:attribute name="readonly"/></rng:optional>
852 <rng:optional><rng:attribute name="view_mode"/></rng:optional>
853
854=== modified file 'bin/addons/consumption_calculation/consumption_calculation.py'
855--- bin/addons/consumption_calculation/consumption_calculation.py 2019-05-17 08:00:04 +0000
856+++ bin/addons/consumption_calculation/consumption_calculation.py 2020-03-16 11:13:19 +0000
857@@ -1292,20 +1292,22 @@
858 to_date = (DateFrom(amc_context.get('to_date')) + RelativeDateTime(months=1, day=1, days=-1)).strftime('%Y-%m-%d')
859 amc_context.update({'to_date': to_date})
860
861+
862+ # TODO TEST JFB
863+ prod_amc = self.pool.get('product.product').compute_amc(cr, uid, product_ids, context=amc_context)
864 for product in self.pool.get('product.product').browse(cr, uid, product_ids, context=context):
865 # Check if the product is not already on the report
866 if product.id not in products:
867 products.append(product.id)
868- amc = self.pool.get('product.product').compute_amc(cr, uid, product.id, context=amc_context)
869 last_fmc_reviewed = False
870 line_ids = line_obj.search(cr, uid, [('name', '=', product.id), ('valid_ok', '=', True)], order='valid_until desc, id desc', context=context)
871 if line_ids:
872 for line in line_obj.browse(cr, uid, [line_ids[0]], context=context):
873 last_fmc_reviewed = line.mrc_id.creation_date
874 self.pool.get('monthly.review.consumption.line').create(cr, uid, {'name': product.id,
875- 'amc': amc,
876- 'fmc': amc,
877- 'fmc2': amc,
878+ 'amc': prod_amc.get(product.id),
879+ 'fmc': prod_amc.get(product.id),
880+ 'fmc2': prod_amc.get(product.id),
881 'last_reviewed': last_fmc_reviewed,
882 'last_reviewed2': last_fmc_reviewed,
883 'mrc_id': report.id})
884@@ -1402,18 +1404,33 @@
885 ctx = {}
886 context = ctx.copy()
887 res = {}
888-
889+ # TODO TEST JFB
890+ prod_obj = self.pool.get('product.product')
891+ data_mrc_id = {}
892 for line in self.browse(cr, uid, ids, context=context):
893- context.update({'from_date': line.mrc_id.period_from, 'to_date': line.mrc_id.period_to})
894- if context.get('from_date', False):
895- from_date = (DateFrom(context.get('from_date')) + RelativeDateTime(day=1)).strftime('%Y-%m-%d')
896- context.update({'from_date': from_date})
897-
898- if context.get('to_date', False):
899- to_date = (DateFrom(context.get('to_date')) + RelativeDateTime(months=1, day=1, days=-1)).strftime('%Y-%m-%d')
900- context.update({'to_date': to_date})
901-
902- res[line.id] = self.pool.get('product.product').compute_amc(cr, uid, line.name.id, context=context)
903+ if line.mrc_id.id not in data_mrc_id:
904+ context = ctx.copy()
905+ context['from_date'] = line.mrc_id.period_from
906+ context['to_date'] = line.mrc_id.period_to
907+ if context.get('from_date', False):
908+ from_date = (DateFrom(context.get('from_date')) + RelativeDateTime(day=1)).strftime('%Y-%m-%d')
909+ context.update({'from_date': from_date})
910+
911+ if context.get('to_date', False):
912+ to_date = (DateFrom(context.get('to_date')) + RelativeDateTime(months=1, day=1, days=-1)).strftime('%Y-%m-%d')
913+ context.update({'to_date': to_date})
914+ data_mrc_id[line.mrc_id.id] = {
915+ 'context': context,
916+ 'prod_line': {}
917+ }
918+
919+ data_mrc_id[line.mrc_id.id]['prod_line'].setdefault(line.name.id, []).append(line.id)
920+
921+ for mrc_id in data_mrc_id:
922+ amc = prod_obj.compute_amc(cr, uid, data_mrc_id[mrc_id]['prod_line'].keys(), data_mrc_id[mrc_id]['context'])
923+ for prod_id in amc:
924+ for line_id in data_mrc_id[mrc_id]['prod_line'][prod_id]:
925+ res[line_id] = amc[prod_id]
926
927 return res
928
929@@ -1497,35 +1514,25 @@
930 return result
931
932 def _get_security_stock(self, cr, uid, ids, field_name, args, context=None):
933+ # TODO JFB RR
934 """
935 Get the security stock of the last created order cycle line with the same product
936 """
937 res = {}
938- ocl_obj = self.pool.get('stock.warehouse.order.cycle.line')
939
940 if isinstance(ids, (int, long)):
941 ids = [ids]
942-
943- for line in self.browse(cr, uid, ids, context=context):
944- ocl_ids = ocl_obj.search(cr, uid, [
945- ('product_id', '=', line.name.id),
946- ], order='id desc', context=context)
947- if not ocl_ids:
948- res[line.id] = 0.00
949- else:
950- res[line.id] = ocl_obj.browse(cr, uid, ocl_ids[0], context=context).safety_stock
951-
952+ for _id in ids:
953+ res[_id] = 0
954 return res
955
956 def _get_order_cycle_line(self, cr, uid, ids, context=None):
957 """
958- ids represents the ids of stock.warehouse.order.cycle.line objects
959 for which values have changed.
960
961 Return the list of ids of monthly.review.consumption.line which need
962 to get their fields updated.
963
964- self is stock.warehouse.order.cycle.line object
965 """
966 line_obj = self.pool.get('monthly.review.consumption.line')
967
968@@ -1562,7 +1569,6 @@
969 readonly=True,
970 store={
971 'monthly.review.consumption.line': (lambda self, cr, uid, ids, c=None: ids, ['name'], 10),
972- 'stock.warehouse.order.cycle.line': (_get_order_cycle_line, ['safety_stock'], 10),
973 },
974 ),
975 #'last_reviewed': fields.function(_get_last_fmc, method=True, type='date', string='Last reviewed on', readonly=True, store=True),
976@@ -1668,7 +1674,8 @@
977 to_date = (DateFrom(context.get('to_date')) + RelativeDateTime(months=1, day=1, days=-1)).strftime('%Y-%m-%d')
978 context.update({'to_date': to_date})
979
980- amc = product_obj.compute_amc(cr, uid, product_id, context=context)
981+ # TODO TEST JFB
982+ amc = product_obj.compute_amc(cr, uid, product_id, context=context)[product_id]
983 return {'value': {'amc': amc,
984 'fmc': amc,
985 'fmc2': amc,
986@@ -1796,8 +1803,8 @@
987
988 return res
989
990- def _get_domain_compute_amc(self, cr, uid, context=None):
991- # Get all reason types
992+ def _get_domain_compute_amc(self, cr, uid, context):
993+ # Get all reason types
994 get_object_reference = self.pool.get('ir.model.data').get_object_reference
995 loan_id = get_object_reference(cr, uid, 'reason_types_moves', 'reason_type_loan')[1]
996 donation_id = get_object_reference(cr, uid, 'reason_types_moves', 'reason_type_donation')[1]
997@@ -1809,11 +1816,27 @@
998 domain = [('state', '=', 'done'), ('reason_type_id', 'not in', (loan_id, donation_id, donation_exp_id, loss_id, discrepancy_id))]
999
1000 # Add locations filters in domain if locations are passed in context
1001- locations = self.pool.get('stock.location').search(cr, uid,
1002- [('usage', 'in', ('internal', 'customer'))], context=context,
1003- order='NO_ORDER')
1004- domain.append(('location_id', 'in', locations))
1005- domain.append(('location_dest_id', 'in', locations))
1006+ if context.get('amc_location_ids'):
1007+ locations = context['amc_location_ids']
1008+ out_locations = self.pool.get('stock.location').search(cr, uid, [('usage', '=', 'customer')], context=context, order='NO_ORDER')
1009+ # initial_location: to match Ship with src loc on Pick
1010+ domain += [ '&', '&', ('type', '=', 'out'), ('location_dest_id', 'in', out_locations), '|', ('location_id', 'in', locations), ('initial_location', 'in', locations)]
1011+
1012+ # TODO JFB RR
1013+ # get IN / INT
1014+ # move_dest_id
1015+ # return_id = get_object_reference(cr, uid, 'reason_types_moves', 'reason_type_return_from_unit')[1]
1016+ # return_good_id = get_object_reference(cr, uid, 'reason_types_moves', 'reason_type_goods_return')[1]
1017+ # replacement_id = get_object_reference(cr, uid, 'reason_types_moves', 'reason_type_goods_replacement')[1]
1018+ # ('type', '=', 'in'), ('reason_type_id', 'in', [return_id, return_good_id, replacement_id), ('location_id', 'in', out_locations), ('location_dest_id', 'in', locations)
1019+ # select p2.name from stock_move m1, stock_move m2, stock_picking p2 where m1.type='in' and m2.id = m1.move_dest_id and m2.picking_id=p2.id;
1020+
1021+ else:
1022+ locations = self.pool.get('stock.location').search(cr, uid,
1023+ [('usage', 'in', ('internal', 'customer'))], context=context,
1024+ order='NO_ORDER')
1025+ domain.append(('location_id', 'in', locations))
1026+ domain.append(('location_dest_id', 'in', locations))
1027
1028 return domain
1029
1030@@ -1834,7 +1857,10 @@
1031
1032 move_obj = self.pool.get('stock.move')
1033 uom_obj = self.pool.get('product.uom')
1034- res = 0.00
1035+ res = {}
1036+ for _id in ids:
1037+ res[_id] = 0
1038+
1039 from_date = False
1040 to_date = False
1041
1042@@ -1854,7 +1880,6 @@
1043 if from_date:
1044 domain.append(('date', '>=', from_date))
1045
1046-
1047 # Search all real consumption line included in the period
1048 # If no period found, take all stock moves
1049 if from_date and to_date:
1050@@ -1865,12 +1890,17 @@
1051 '|', '&', ('rac_id.period_from', '<=', to_date), ('rac_id.period_from', '>=', from_date),
1052 # All lines with a report started before the period and finished after the period
1053 '&', ('rac_id.period_from', '<=', from_date), ('rac_id.period_to', '>=', to_date)]
1054+
1055+ if context.get('amc_location_ids'):
1056+ rcr_domain = ['&', ('rac_id.cons_location_id', 'in', context.get('amc_location_ids'))] + rcr_domain
1057+
1058+
1059 racl_obj = self.pool.get('real.average.consumption.line')
1060 rcr_line_ids = racl_obj.search(cr, uid, rcr_domain, context=context, order='NO_ORDER')
1061 report_move_ids = []
1062 for line in racl_obj.browse(cr, uid, rcr_line_ids, context=context):
1063 report_move_ids.append(line.move_id.id)
1064- res += self._get_period_consumption(cr, uid, line, from_date, to_date, context=context)
1065+ res[line.product_id.id] += self._get_period_consumption(cr, uid, line, from_date, to_date, context=context)
1066 if report_move_ids:
1067 domain.append(('id', 'not in', report_move_ids))
1068
1069@@ -1904,9 +1934,9 @@
1070
1071 for move in move_result:
1072 if move['reason_type_id'][0] in (return_id, return_good_id, replacement_id) and location_dict[move['location_id'][0]]['usage'] == 'customer':
1073- res -= uom_obj._compute_qty(cr, uid, move['product_uom'][0], move['product_qty'], product_dict[move['product_id'][0]]['uom_id'][0])
1074+ res[move['product_id'][0]] -= uom_obj._compute_qty(cr, uid, move['product_uom'][0], move['product_qty'], product_dict[move['product_id'][0]]['uom_id'][0])
1075 elif location_dict[move['location_dest_id'][0]]['usage'] == 'customer':
1076- res += uom_obj._compute_qty(cr, uid, move['product_uom'][0], move['product_qty'], product_dict[move['product_id'][0]]['uom_id'][0])
1077+ res[move['product_id'][0]] = uom_obj._compute_qty(cr, uid, move['product_uom'][0], move['product_qty'], product_dict[move['product_id'][0]]['uom_id'][0])
1078
1079 # Update the limit in time
1080 if not context.get('from_date') and (not from_date or move['date'] < from_date):
1081@@ -1934,9 +1964,12 @@
1082 if not nb_months:
1083 nb_months = 1
1084
1085- uom_id = self.read(cr, uid, ids[0], ['uom_id'], context=context)['uom_id'][0]
1086- res = res/nb_months
1087- res = uom_obj._compute_qty(cr, uid, uom_id, res, uom_id)
1088+ for p_id in res:
1089+ if p_id in product_dict:
1090+ prod_uom = product_dict[p_id]['uom_id'][0]
1091+ res[p_id] = uom_obj._compute_qty(cr, uid, prod_uom, res[p_id]/nb_months, prod_uom)
1092+ else:
1093+ res[p_id] = res[p_id]/nb_months
1094
1095 return res
1096
1097@@ -1994,7 +2027,6 @@
1098 if ctx is None:
1099 ctx = {}
1100 context = ctx.copy()
1101- res = {}
1102
1103 if context.get('from_date', False):
1104 from_date = (DateFrom(context.get('from_date')) + RelativeDateTime(day=1)).strftime('%Y-%m-%d')
1105@@ -2010,10 +2042,9 @@
1106 'from_date': from_date,
1107 'to_date': to_date})
1108
1109- for product_id in ids:
1110- res[product_id] = self.compute_amc(cr, uid, product_id, context=context)
1111+ # TODO TEST JFB
1112+ return self.compute_amc(cr, uid, ids, context=context)
1113
1114- return res
1115
1116 def _get_period_consumption(self, cr, uid, line, from_date, to_date, context=None):
1117 '''
1118
1119=== modified file 'bin/addons/consumption_calculation/expiry_calculation.py'
1120--- bin/addons/consumption_calculation/expiry_calculation.py 2019-08-14 09:17:27 +0000
1121+++ bin/addons/consumption_calculation/expiry_calculation.py 2020-03-16 11:13:19 +0000
1122@@ -264,6 +264,7 @@
1123 'fake_status': fields.function(_get_status, method=True, type='selection', selection=LIKELY_EXPIRE_STATUS, readonly=True, string='Status'),
1124 'status': fields.selection(LIKELY_EXPIRE_STATUS, string='Status'),
1125 'amc_consumption_text': fields.function(_get_amc_consumption_text, method=True, type="char", string='Consumption'),
1126+ 'segment_id': fields.many2one('replenishment.segment', 'Segment'),
1127 }
1128
1129 _defaults = {
1130@@ -312,7 +313,8 @@
1131 if consumption_type == 'fmc':
1132 res = product_obj.browse(cr, uid, product_id, context=new_context).reviewed_consumption
1133 elif consumption_type == 'amc':
1134- res = product_obj.compute_amc(cr, uid, product_id, context=new_context)
1135+ # TODO TEST JFB
1136+ res = product_obj.compute_amc(cr, uid, product_id, context=new_context)[product_id]
1137 else:
1138 res = product_obj.browse(cr, uid, product_id, context=new_context).monthly_consumption
1139
1140@@ -363,7 +365,7 @@
1141
1142 return self.open_report(cr, uid, ids, context=context)
1143
1144- def _process_lines(self, cr, uid, ids, context=None):
1145+ def _process_lines(self, cr, uid, ids, context=None, create_cr=True):
1146 '''
1147 Creates all moves with expiry quantities for all
1148 lot life date
1149@@ -374,8 +376,11 @@
1150 ids = [ids]
1151
1152 # background cursor
1153- import pooler
1154- new_cr = pooler.get_db(cr.dbname).cursor()
1155+ if create_cr:
1156+ import pooler
1157+ new_cr = pooler.get_db(cr.dbname).cursor()
1158+ else:
1159+ new_cr = cr
1160
1161 move_obj = self.pool.get('stock.move')
1162 lot_obj = self.pool.get('stock.production.lot')
1163@@ -388,45 +393,71 @@
1164 view_id = self.pool.get('ir.model.data').get_object_reference(new_cr, uid, 'consumption_calculation', 'product_likely_expire_report_form_processed')[1]
1165 report = self.browse(new_cr, uid, ids[0], context=context)
1166
1167- if report.date_to <= report.date_from:
1168- raise osv.except_osv(_('Error'), _('You cannot have \'To date\' older than \'From date\''))
1169-
1170- if report.consumption_type in ('amc', 'rac') and report.consumption_from > report.consumption_to:
1171- raise osv.except_osv(_('Error'), _('You cannot have \'To date\' older than \'From date\''))
1172-
1173- if report.consumption_type in ('amc', 'rac'):
1174- context.update({'from': report.consumption_from, 'to': report.consumption_to})
1175- else:
1176- context.update({'from': report.date_from, 'to': report.date_to})
1177-
1178- location_ids = []
1179- not_loc_ids = []
1180+
1181+ segment_product_amc = {}
1182+ segment_product_fmc = {}
1183 only_product_ids = []
1184-
1185- if context.get('only_product_ids'):
1186- only_product_ids = context.get('only_product_ids')
1187-
1188- if report.input_output_ok:
1189- wh_ids = self.pool.get('stock.warehouse').search(new_cr, uid, [], context=context)
1190- for wh in self.pool.get('stock.warehouse').browse(new_cr, uid, wh_ids, context=context):
1191- not_loc_ids.extend(loc_obj.search(new_cr, uid, [('location_id', 'child_of', wh.lot_input_id.id)], context=context))
1192- not_loc_ids.extend(loc_obj.search(new_cr, uid, [('location_id', 'child_of', wh.lot_output_id.id)], context=context))
1193-
1194- if report.location_id:
1195- # Get all locations
1196- location_ids = loc_obj.search(new_cr, uid, [('location_id', 'child_of', report.location_id.id), ('quarantine_location', '=', False), ('id', 'not in', not_loc_ids)], order='location_id', context=context)
1197+ if report.segment_id:
1198+ from_segment = True
1199+ if report.segment_id.rule != 'cycle':
1200+ instance_id = self.pool.get('res.company')._get_instance_id(cr, uid)
1201+ cr.execute('select id, amc from replenishment_segment_line_amc where segment_line_id in %s and instance_id=%s', (tuple([line_id.id for line_id in report.segment_id.line_ids]) , instance_id))
1202+ local_amc = {}
1203+ for x in cr.fetchall():
1204+ local_amc[x[0]] = x[1] or 0
1205+
1206+ for segment_line in report.segment_id.line_ids:
1207+ if report.segment_id.rule != 'cycle':
1208+ segment_product_amc[segment_line.product_id.id] = local_amc.get(segment_line.id, 0)
1209+ else:
1210+ for x in xrange(1, 13):
1211+ fmc_from = getattr(segment_line, 'rr_fmc_from_%d'%x)
1212+ fmc_to = getattr(segment_line, 'rr_fmc_to_%d'%x)
1213+ fmc_value = getattr(segment_line, 'rr_fmc_%d'%x)
1214+ if fmc_from and fmc_to and fmc_value:
1215+ segment_product_fmc.setdefault(segment_line.product_id.id, []).append({'from': DateFrom(fmc_from), 'to': DateFrom(fmc_to), 'fmc': fmc_value})
1216+ only_product_ids.append(segment_line.product_id.id)
1217+ location_ids = [loc.id for loc in report.segment_id.location_config_id.local_location_ids]
1218 else:
1219- # Get all locations
1220- wh_location_ids = loc_obj.search(new_cr, uid, [('usage', '=', 'internal'), ('quarantine_location', '=', False), ('id', 'not in', not_loc_ids)], order='location_id', context=context)
1221-
1222- move_ids = move_obj.search(new_cr, uid, [('prodlot_id', '!=', False)], context=context)
1223- for move in move_obj.browse(new_cr, uid, move_ids, context=context):
1224- if move.location_id.id not in location_ids:
1225- if move.location_id.usage == 'internal' and not move.location_id.quarantine_location and move.location_id.id in wh_location_ids:
1226- location_ids.append(move.location_id.id)
1227- if move.location_dest_id.id not in location_ids and not move.location_dest_id.quarantine_location and move.location_dest_id.id in wh_location_ids:
1228- if move.location_dest_id.usage == 'internal':
1229- location_ids.append(move.location_dest_id.id)
1230+ from_segment = False
1231+ if report.date_to <= report.date_from:
1232+ raise osv.except_osv(_('Error'), _('You cannot have \'To date\' older than \'From date\''))
1233+
1234+ if report.consumption_type in ('amc', 'rac') and report.consumption_from > report.consumption_to:
1235+ raise osv.except_osv(_('Error'), _('You cannot have \'To date\' older than \'From date\''))
1236+
1237+ if report.consumption_type in ('amc', 'rac'):
1238+ context.update({'from': report.consumption_from, 'to': report.consumption_to})
1239+ else:
1240+ context.update({'from': report.date_from, 'to': report.date_to})
1241+
1242+ location_ids = []
1243+ not_loc_ids = []
1244+
1245+ if context.get('only_product_ids'):
1246+ only_product_ids = context.get('only_product_ids')
1247+
1248+ if report.input_output_ok:
1249+ wh_ids = self.pool.get('stock.warehouse').search(new_cr, uid, [], context=context)
1250+ for wh in self.pool.get('stock.warehouse').browse(new_cr, uid, wh_ids, context=context):
1251+ not_loc_ids.extend(loc_obj.search(new_cr, uid, [('location_id', 'child_of', wh.lot_input_id.id)], context=context))
1252+ not_loc_ids.extend(loc_obj.search(new_cr, uid, [('location_id', 'child_of', wh.lot_output_id.id)], context=context))
1253+
1254+ if report.location_id:
1255+ # Get all locations
1256+ location_ids = loc_obj.search(new_cr, uid, [('location_id', 'child_of', report.location_id.id), ('quarantine_location', '=', False), ('id', 'not in', not_loc_ids)], order='location_id', context=context)
1257+ else:
1258+ # Get all locations
1259+ wh_location_ids = loc_obj.search(new_cr, uid, [('usage', '=', 'internal'), ('quarantine_location', '=', False), ('id', 'not in', not_loc_ids)], order='location_id', context=context)
1260+
1261+ move_ids = move_obj.search(new_cr, uid, [('prodlot_id', '!=', False)], context=context)
1262+ for move in move_obj.browse(new_cr, uid, move_ids, context=context):
1263+ if move.location_id.id not in location_ids:
1264+ if move.location_id.usage == 'internal' and not move.location_id.quarantine_location and move.location_id.id in wh_location_ids:
1265+ location_ids.append(move.location_id.id)
1266+ if move.location_dest_id.id not in location_ids and not move.location_dest_id.quarantine_location and move.location_dest_id.id in wh_location_ids:
1267+ if move.location_dest_id.usage == 'internal':
1268+ location_ids.append(move.location_dest_id.id)
1269
1270 context.update({'location_id': location_ids, 'location': location_ids})
1271
1272@@ -450,11 +481,15 @@
1273 for lot in lot_obj.browse(new_cr, uid, lot_ids, context=context):
1274 if lot.product_id and lot.product_id.id not in products:
1275 products.update({lot.product_id.id: {}})
1276- consumption = self._get_average_consumption(new_cr, uid, lot.product_id.id,
1277- report.consumption_type,
1278- context.get('from', report.date_from),
1279- context.get('to', report.date_to),
1280- context=context)
1281+
1282+ if not from_segment:
1283+ consumption = self._get_average_consumption(new_cr, uid, lot.product_id.id,
1284+ report.consumption_type,
1285+ context.get('from', report.date_from),
1286+ context.get('to', report.date_to),
1287+ context=context)
1288+ else:
1289+ consumption = segment_product_amc.get(lot.product_id.id, 0)
1290
1291 current_line = line_obj.create(new_cr, uid, {'report_id': report.id,
1292 'product_id': lot.product_id.id,
1293@@ -496,16 +531,35 @@
1294 item_obj.write(new_cr, uid, [item_id], {'period_start': month.strftime('%Y-%m-%d')}, context=context)
1295 domain.append(('life_date', '<=', month.strftime('%Y-%m-01')))
1296
1297- start_month_flag = False
1298 product_lot_ids = lot_obj.search(new_cr, uid, domain, order='life_date', context=context)
1299
1300 # Create an item line for each lot and each location
1301 for product_lot in lot_obj.browse(new_cr, uid, product_lot_ids, context=context):
1302- lot_days = Age(DateFrom(product_lot.life_date), last_expiry_date)
1303- lot_coeff = (lot_days.years*365.0 + lot_days.months*30.0 + lot_days.days)/30.0
1304- if lot_coeff >= 0.00: last_expiry_date = DateFrom(product_lot.life_date)
1305- if lot_coeff < 0.00: lot_coeff = 0.00
1306- lot_cons = self.pool.get('product.uom')._compute_qty(new_cr, uid, lot.product_id.uom_id.id, round(lot_coeff*consumption,2), lot.product_id.uom_id.id) + rest
1307+ if from_segment and segment_product_fmc:
1308+ life_date = DateFrom(product_lot.life_date)
1309+ consum = 0
1310+ if life_date > last_expiry_date:
1311+ tmp_last_expiry_date = last_expiry_date
1312+ for fmc in segment_product_fmc.setdefault(lot.product_id.id, []):
1313+ if life_date >= fmc['from'] and tmp_last_expiry_date <= fmc['to']:
1314+ end_fmc = min(life_date, fmc['to'])
1315+ lot_days = Age(DateFrom(end_fmc), last_expiry_date)
1316+ consum += fmc['fmc'] * (lot_days.years*364.8 + lot_days.months*30.44 + lot_days.days)/30.44
1317+ if life_date <= fmc['to']:
1318+ break
1319+ else:
1320+ tmp_last_expiry_date = fmc['to']
1321+
1322+ else:
1323+ lot_days = Age(DateFrom(product_lot.life_date), last_expiry_date)
1324+ lot_coeff = (lot_days.years*365.0 + lot_days.months*30.0 + lot_days.days)/30.0
1325+ consum = 0
1326+ if lot_coeff >= 0.00:
1327+ consum = round(lot_coeff*consumption,2)
1328+
1329+ if consum > 0:
1330+ last_expiry_date = DateFrom(product_lot.life_date)
1331+ lot_cons = self.pool.get('product.uom')._compute_qty(new_cr, uid, lot.product_id.uom_id.id, consum, lot.product_id.uom_id.id) + rest
1332
1333 if lot_cons > 0.00:
1334 if lot_cons >= product_lot.stock_available:
1335@@ -548,6 +602,9 @@
1336 item_obj.write(new_cr, uid, [item_id], {'available_qty': available_qty,
1337 'expired_qty': expired_qty}, context=context)
1338 total_expired += expired_qty
1339+ if start_month_flag:
1340+ last_expiry_date = month
1341+ start_month_flag = False
1342
1343 if report.only_non_zero and total_expired <= 0.00:
1344 line_obj.unlink(new_cr, uid, [products[lot.product_id.id]['line_id']], context=context)
1345@@ -561,8 +618,9 @@
1346 context.update({'dates': new_date})
1347 self.write(new_cr, uid, ids, {'status': 'ready'}, context=context)
1348
1349- new_cr.commit()
1350- new_cr.close(True)
1351+ if create_cr:
1352+ new_cr.commit()
1353+ new_cr.close(True)
1354
1355 return {
1356 'type': 'ir.actions.act_window',
1357
1358=== modified file 'bin/addons/consumption_calculation/expiry_calculation_view.xml'
1359--- bin/addons/consumption_calculation/expiry_calculation_view.xml 2019-08-14 09:17:27 +0000
1360+++ bin/addons/consumption_calculation/expiry_calculation_view.xml 2020-03-16 11:13:19 +0000
1361@@ -159,6 +159,7 @@
1362 <field name="consumption_to" attrs="{'invisible': [('consumption_type', 'not in', ('amc','rac'))], 'required': [('consumption_type', 'in', ('amc','rac'))]}" on_change="period_change(consumption_from, consumption_to, consumption_type)" />
1363 <separator colspan="4" string="Location" />
1364 <field name="location_id" domain="[('usage', '=', 'internal')]" attrs="{'required': [('consumption_type', '=', 'rac')]}" />
1365+ <field name="segment_id" readonly="1" attrs="{'invisible': [('segment_id', '=', False)]}"/>
1366 <newline />
1367 <field name="input_output_ok" attrs="{'invisible': [('location_id', '!=', False)]}" />
1368 <separator colspan="4" string="Actions" />
1369@@ -178,6 +179,7 @@
1370 <separator colspan="4" string="Location" />
1371 <group colspan="2" col="2">
1372 <field name="location_id" readonly="1" attrs="{'invisible': [('location_id', '=', False)]}"/>
1373+ <field name="segment_id" readonly="1" attrs="{'invisible': [('segment_id', '=', False)]}"/>
1374 <field name="msf_instance" readonly="1" attrs="{'invisible': [('location_id', '!=', False)]}"/>
1375 </group>
1376 <field name="input_output_ok" readonly="1" />
1377
1378=== modified file 'bin/addons/consumption_calculation/history_consumption.py'
1379--- bin/addons/consumption_calculation/history_consumption.py 2019-07-22 12:08:20 +0000
1380+++ bin/addons/consumption_calculation/history_consumption.py 2020-03-16 11:13:19 +0000
1381@@ -590,7 +590,8 @@
1382 if cons_id:
1383 consumption = cons_prod_obj.browse(cr, uid, cons_id[0], context=context).value
1384 else:
1385- consumption = self.pool.get('product.product').compute_amc(cr, uid, r['id'], context=cons_context) or 0.00
1386+ # TODO TEST JFB
1387+ consumption = self.pool.get('product.product').compute_amc(cr, uid, r['id'], context=cons_context)[r['id']] or 0.00
1388 cons_prod_obj.create(cr, uid, {'name': field_name,
1389 'product_id': r['id'],
1390 'consumption_id': obj_id,
1391
1392=== modified file 'bin/addons/consumption_calculation/report/product_likely_expire.rml'
1393--- bin/addons/consumption_calculation/report/product_likely_expire.rml 2019-07-25 13:39:42 +0000
1394+++ bin/addons/consumption_calculation/report/product_likely_expire.rml 2020-03-16 11:13:19 +0000
1395@@ -87,7 +87,7 @@
1396 <para style="TextInfoBold">Location : </para>
1397 </td>
1398 <td>
1399- <para style="TextInfo">[[ objects[0].location_id and objects[0].location_id.name or '' ]]</para>
1400+ <para style="TextInfo">[[ objects[0].location_id and objects[0].location_id.name or (objects[0].segment_id and objects[0].segment_id.local_location_ids and ', '.join([x.name for x in objects[0].segment_id.local_location_ids])) or '' ]]</para>
1401 </td>
1402 <td>
1403 <para style="TextInfo"> </para>
1404
1405=== modified file 'bin/addons/consumption_calculation/report/product_likely_expire_xls.mako'
1406--- bin/addons/consumption_calculation/report/product_likely_expire_xls.mako 2019-02-12 10:53:16 +0000
1407+++ bin/addons/consumption_calculation/report/product_likely_expire_xls.mako 2020-03-16 11:13:19 +0000
1408@@ -95,7 +95,7 @@
1409 % endfor
1410 </Row>
1411 <Row>
1412-<Cell ss:StyleID="line" ><Data ss:Type="String">${(o.location_id and objects[0].location_id.name or '')|x}</Data></Cell>
1413+<Cell ss:StyleID="line" ><Data ss:Type="String">${(o.location_id and objects[0].location_id.name or (o.segment_id and o.segment_id.local_location_ids and ', '.join([x.name for x in o.segment_id.local_location_ids])) or '')|x}</Data></Cell>
1414 <Cell ss:StyleID="line" ><Data ss:Type="String">${(getReportPeriod(o) or '')|x}</Data></Cell>
1415 <Cell ss:StyleID="line" ss:MergeAcross="4"><Data ss:Type="String">${(getReportConsumptionType(o) or '')|x}</Data></Cell>
1416 % for n in range(cols):
1417
1418=== modified file 'bin/addons/delivery_mechanism/delivery_mechanism.py'
1419--- bin/addons/delivery_mechanism/delivery_mechanism.py 2019-10-30 16:33:21 +0000
1420+++ bin/addons/delivery_mechanism/delivery_mechanism.py 2020-03-16 11:13:19 +0000
1421@@ -1345,93 +1345,6 @@
1422 # open the selected wizard
1423 return wiz_obj.open_wizard(cr, uid, ids, name=name, model=model, step=step, context=dict(context, picking_id=ids[0]))
1424
1425- def cancel_and_update_out(self, cr, uid, ids, context=None):
1426- '''
1427- update corresponding out picking if exists and cancel the picking
1428- '''
1429- if context is None:
1430- context = {}
1431- if isinstance(ids, (int, long)):
1432- ids = [ids]
1433-
1434- # objects
1435- move_obj = self.pool.get('stock.move')
1436- purchase_obj = self.pool.get('purchase.order')
1437- # workflow
1438- wf_service = netsvc.LocalService("workflow")
1439-
1440- for obj in self.browse(cr, uid, ids, context=context):
1441- # corresponding sale ids to be manually corrected after purchase workflow trigger
1442- sale_ids = []
1443- for move in obj.move_lines:
1444- data_back = move_obj.create_data_back(move)
1445- diff_qty = -data_back['product_qty']
1446- # update corresponding out move - no move created, no need to handle line sequencing policy
1447- out_move_id = self._update_mirror_move(cr, uid, ids, data_back, diff_qty, out_move=False, context=context)
1448- # for out cancellation, two points:
1449- # - if pick/pack/ship: check that nothing is in progress
1450- # - if nothing in progress, and the out picking is canceled, trigger the so to correct the corresponding so manually
1451- if out_move_id:
1452- out_move = move_obj.browse(cr, uid, out_move_id, context=context)
1453- if out_move.picking_id.subtype in ('standard', 'picking') and out_move.picking_id.type == 'out' and not out_move.product_qty:
1454- move_id = False
1455- if out_move.picking_id and out_move.sale_line_id:
1456- # replace the stock move in the procurement order by the non cancelled stock move
1457- sale_id = out_move.picking_id.sale_id.id
1458- move_domain = [
1459- ('picking_id.type', '=', 'out'),
1460- ('picking_id.subtype', 'in', ('standard', 'picking')),
1461- #('picking_id.sale_id', '=', sale_id),
1462- ('sale_line_id', '=', out_move.sale_line_id.id),
1463- ('id', '!=', out_move_id),
1464- ('processed_stock_move', '=', True),
1465- ]
1466- move_domain_not_done = move_domain
1467- move_domain_not_cancel = move_domain
1468- move_domain_not_done.append(('state', 'not in', ['done', 'cancel']))
1469- move_domain_not_cancel.append(('state', '!=', 'cancel'))
1470-
1471- move_id = move_obj.search(cr, uid, move_domain_not_done, context=context)
1472- if not move_id:
1473- move_id = move_obj.search(cr, uid, move_domain_not_cancel, context=context)
1474-
1475- if move_id:
1476- proc_id = self.pool.get('procurement.order').search(cr, uid, [('move_id', '=', out_move_id)], context=context)
1477- self.pool.get('procurement.order').write(cr, uid, proc_id, {'move_id': move_id[0]}, context=context)
1478-
1479- # the corresponding move can be canceled - the OUT picking workflow is triggered automatically if needed
1480- move_obj.action_cancel(cr, uid, [out_move_id], context=context)
1481- # open points:
1482- # - when searching for open picking tickets - we should take into account the specific move (only product id ?)
1483- # - and also the state of the move not in (cancel done)
1484- # correct the corresponding so manually if exists - could be in shipping exception
1485- if out_move.picking_id and out_move.picking_id.sale_id:
1486- if out_move.picking_id.sale_id.id not in sale_ids:
1487- sale_ids.append(out_move.picking_id.sale_id.id)
1488-
1489- # UFTP-345: Check if all lines from the original pick are either closed or cancel and qty is 0, then close this PICK
1490- mirror_pick = out_move.picking_id
1491- if mirror_pick and mirror_pick.id:
1492- ptc = self.browse(cr, uid, mirror_pick.id, context=context)
1493- if all(m.product_qty == 0.00 and m.state in ('done', 'cancel') for m in ptc.move_lines):
1494- ptc.action_done(context=context)
1495- elif mirror_pick.subtype == 'picking' and ptc.state == 'draft':
1496- # If there are still some lines available with qty 0, then check if any in progress PICK, if all complete, then close the PICK
1497- self.validate(cr, uid, [mirror_pick.id], context=context)
1498-
1499- # correct the corresponding po manually if exists - should be in shipping exception
1500- if obj.purchase_id:
1501- wf_service.trg_validate(uid, 'purchase.order', obj.purchase_id.id, 'picking_ok', cr)
1502- msg_log = _('The Purchase Order %s is %s%% received.') % (obj.purchase_id.name, round(obj.purchase_id.shipped_rate, 2))
1503- purchase_obj.log(cr, uid, obj.purchase_id.id, msg_log)
1504-
1505- # correct the corresponding so
1506- for sale_id in sale_ids:
1507- wf_service.trg_write(uid, 'sale.order', sale_id, cr)
1508- wf_service.trg_validate(uid, 'sale.order', sale_id, 'ship_corrected', cr)
1509-
1510- return True
1511-
1512 def write(self, cr, uid, ids, vals, context=None):
1513 '''
1514 Return True in case of context contains "go_to_processing_wizard" because
1515@@ -1461,71 +1374,3 @@
1516
1517
1518 stock_picking()
1519-
1520-
1521-class purchase_order_line(osv.osv):
1522- '''
1523- add the link to procurement order
1524- '''
1525- _inherit = 'purchase.order.line'
1526- _columns = {
1527- 'procurement_id': fields.many2one(
1528- 'procurement.order',
1529- string='Procurement Reference',
1530- readonly=True,
1531- ),
1532- }
1533- _defaults = {'procurement_id': False, }
1534-
1535-purchase_order_line()
1536-
1537-
1538-class procurement_order(osv.osv):
1539- '''
1540- inherit po_values_hook
1541- '''
1542- _inherit = 'procurement.order'
1543-
1544- def po_line_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
1545- '''
1546- Please copy this to your module's method also.
1547- This hook belongs to the make_po method from purchase>purchase.py>procurement_order
1548-
1549- - allow to modify the data for purchase order line creation
1550- '''
1551- if isinstance(ids, (int, long)):
1552- ids = [ids]
1553- sale_obj = self.pool.get('sale.order.line')
1554- line = super(procurement_order, self).po_line_values_hook(cr, uid, ids, context=context, *args, **kwargs)
1555- # give the purchase order line a link to corresponding procurement
1556- procurement = kwargs['procurement']
1557- line.update({'procurement_id': procurement.id, })
1558-
1559- # for Internal Request (IR) on make_to_order we update PO line data according to the data of the IR (=sale_order)
1560- sale_order_line_ids = sale_obj.search(cr, uid, [('procurement_id', '=', procurement.id)], context=context)
1561- for sol in sale_obj.browse(cr, uid, sale_order_line_ids, context=context):
1562- if (sol.order_id.procurement_request or procurement.supplier.partner_type == 'esc') and not sol.product_id and sol.comment:
1563- line.update({'product_id': False,
1564- 'name': 'Description: %s' % sol.comment,
1565- 'comment': procurement.tender_line_id and procurement.tender_line_id.comment or sol.comment,
1566- 'product_qty': sol.product_uom_qty,
1567- 'price_unit': sol.price_unit,
1568- 'date_planned': sol.date_planned,
1569- 'product_uom': sol.product_uom.id,
1570- 'nomen_manda_0': sol.nomen_manda_0.id,
1571- 'nomen_manda_1': sol.nomen_manda_1.id or False,
1572- 'nomen_manda_2': sol.nomen_manda_2.id or False,
1573- 'nomen_manda_3': sol.nomen_manda_3.id or False,
1574- 'nomen_sub_0': sol.nomen_sub_0.id or False,
1575- 'nomen_sub_1': sol.nomen_sub_1.id or False,
1576- 'nomen_sub_2': sol.nomen_sub_2.id or False,
1577- 'nomen_sub_3': sol.nomen_sub_3.id or False,
1578- 'nomen_sub_4': sol.nomen_sub_4.id or False,
1579- 'nomen_sub_5': sol.nomen_sub_5.id or False})
1580-
1581- if procurement.tender_line_id and procurement.tender_line_id.purchase_order_line_id and procurement.tender_line_id.purchase_order_line_id.comment:
1582- line['comment'] = procurement.tender_line_id.purchase_order_line_id.comment
1583-
1584- return line
1585-
1586-procurement_order()
1587
1588=== modified file 'bin/addons/documents_done/documents_done.py'
1589--- bin/addons/documents_done/documents_done.py 2018-10-29 13:05:04 +0000
1590+++ bin/addons/documents_done/documents_done.py 2020-03-16 11:13:19 +0000
1591@@ -119,7 +119,7 @@
1592
1593 def _get_problem_sale_order(self, cr, uid, order, context=None):
1594 '''
1595- Check if all stock moves, all procurement orders, all purchase orders
1596+ Check if all stock moves, all purchase orders
1597 and all stock picking generated from the sale order is closed or canceled
1598 '''
1599 if not context:
1600@@ -330,14 +330,6 @@
1601 'doc_model': 'tender',
1602 'doc_id': tender.id,
1603 'doc_type': 'Tender'}, context=context)
1604- # Search all procurement orders attached to the sale order
1605- for proc in self.pool.get('procurement.order').browse(cr, uid, proc_ids, context=context):
1606- pb_line_obj.create(cr, uid, {'problem_id': pb_id,
1607- 'doc_name': proc.name,
1608- 'doc_state': proc.state,
1609- 'doc_model': 'procurement.order',
1610- 'doc_id': proc.id,
1611- 'doc_type': 'Procurement Order'}, context=context)
1612
1613 # Process all invoices
1614 for inv in self.pool.get('account.invoice').browse(cr, uid, invoice_ids, context=context):
1615
1616=== modified file 'bin/addons/finance/report/account_partner_balance_tree.py'
1617--- bin/addons/finance/report/account_partner_balance_tree.py 2018-08-09 08:19:38 +0000
1618+++ bin/addons/finance/report/account_partner_balance_tree.py 2020-03-16 11:13:19 +0000
1619@@ -192,8 +192,8 @@
1620 """
1621 Returns the list of accounts as a String (cut if > 300 characters)
1622 """
1623- accounts_str = ', '.join([acc or '' for acc in self._get_accounts(data)])
1624- return (len(accounts_str) <= 300) and accounts_str or ("%s%s" % (accounts_str[:297], '...'))
1625+ data_tools_obj = self.pool.get('data.tools')
1626+ return data_tools_obj.truncate_list(self._get_accounts(data))
1627
1628 def _get_filter(self, data):
1629 if data.get('form', False) and data['form'].get('filter', False):
1630@@ -229,8 +229,8 @@
1631 """
1632 Returns the list of journals as a String (cut if > 300 characters)
1633 """
1634- journals_str = ', '.join([journal or '' for journal in self._get_journal(data)])
1635- return (len(journals_str) <= 300) and journals_str or ("%s%s" % (journals_str[:297], '...'))
1636+ data_tools_obj = self.pool.get('data.tools')
1637+ return data_tools_obj.truncate_list(self._get_journal(data))
1638
1639 def _get_prop_instances(self, data):
1640 """
1641@@ -245,14 +245,18 @@
1642 """
1643 Returns the list of instances as a String (cut if > 300 characters)
1644 """
1645+ display_limit = 300
1646 if pdf:
1647 # in the PDF version instances are listed one below the other and instance names are cut if > 20 characters
1648 instances_str = ',\n'.join([(len(inst) <= 20) and inst or ("%s%s" % (inst[:17], '...'))
1649 for inst in self._get_prop_instances(data)])
1650+ if len(instances_str) > display_limit:
1651+ instances_str = "%s%s" % (instances_str[:display_limit-3], '...')
1652 else:
1653 # otherwise instances are simply separated by a comma
1654- instances_str = ', '.join([inst or '' for inst in self._get_prop_instances(data)])
1655- return (len(instances_str) <= 300) and instances_str or ("%s%s" % (instances_str[:297], '...'))
1656+ data_tools_obj = self.pool.get('data.tools')
1657+ instances_str = data_tools_obj.truncate_list(self._get_prop_instances(data), limit=display_limit)
1658+ return instances_str
1659
1660
1661 class account_partner_balance_tree_xls(SpreadsheetReport):
1662
1663=== modified file 'bin/addons/import_data/import_data.py'
1664--- bin/addons/import_data/import_data.py 2019-10-07 08:56:57 +0000
1665+++ bin/addons/import_data/import_data.py 2020-03-16 11:13:19 +0000
1666@@ -480,7 +480,7 @@
1667 for to_remove in ['standard_price', 'perishable', 'batch_management']:
1668 if to_remove in data:
1669 del data[to_remove]
1670- impobj.write(cr, uid, ids_to_update, data)
1671+ impobj.write(cr, uid, ids_to_update, data, context=context)
1672 nb_update_success += 1
1673 cr.commit()
1674 else:
1675
1676=== modified file 'bin/addons/kit/kit.py'
1677--- bin/addons/kit/kit.py 2020-02-06 11:13:37 +0000
1678+++ bin/addons/kit/kit.py 2020-03-16 11:13:19 +0000
1679@@ -550,13 +550,12 @@
1680 res = []
1681
1682 for obj in self.browse(cr, uid, ids, context=context):
1683+ version = obj.composition_version or 'no_version'
1684 if obj.composition_type == 'theoretical':
1685 date = datetime.strptime(obj.composition_creation_date, db_date_format)
1686- version = obj.composition_version or 'no_version'
1687 name = version + ' - ' + date.strftime(date_format)
1688 else:
1689- name = obj.composition_product_id and obj.composition_product_id.default_code + ' - ' + obj.composition_combined_ref_lot \
1690- or obj.composition_combined_ref_lot
1691+ name = obj.composition_product_id.default_code + ' - ' + version
1692
1693 res += [(obj.id, name)]
1694 return res
1695
1696=== modified file 'bin/addons/kit/kit_view.xml'
1697--- bin/addons/kit/kit_view.xml 2020-02-06 11:13:37 +0000
1698+++ bin/addons/kit/kit_view.xml 2020-03-16 11:13:19 +0000
1699@@ -151,7 +151,8 @@
1700 <field name="item_uom_id" on_change="onchange_uom_qty(item_uom_id, item_qty)" domain="[('uom_by_product', '=', item_product_id)]" />
1701 <field name="item_asset_id" context="{'product_id': item_product_id}" domain="[('product_id', '=', item_product_id)]"
1702 attrs="{'readonly': [('hidden_asset_mandatory', '=', False)]}" />
1703- <field name="item_lot"
1704+ <field name="comment" />
1705+ <field name="item_lot"
1706 on_change="on_lot_change(item_product_id, item_lot, context)"
1707 attrs="{'readonly': [('hidden_batch_management_mandatory', '=', False)]}" />
1708 <field name="item_exp" attrs="{'readonly': [('hidden_perishable_mandatory', '=', False)]}" />
1709
1710=== modified file 'bin/addons/mission_stock/mission_stock.py'
1711--- bin/addons/mission_stock/mission_stock.py 2019-07-22 12:08:20 +0000
1712+++ bin/addons/mission_stock/mission_stock.py 2020-03-16 11:13:19 +0000
1713@@ -40,7 +40,7 @@
1714 import tempfile
1715 import shutil
1716 from mx.DateTime import DateTime as mxdt
1717-
1718+import re
1719
1720 # the ';' delimiter is recognize by default on the Microsoft Excel version I tried
1721 STOCK_MISSION_REPORT_NAME_PATTERN = 'Mission_Stock_Report_%s_%s'
1722@@ -1317,13 +1317,13 @@
1723 }
1724
1725 instance_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.instance_id.id
1726- cr.execute('''select line.id, loc.name from stock_mission_report_line_location line, stock_location loc
1727+ cr.execute('''select line.id, loc.name, loc.id from stock_mission_report_line_location line, stock_location loc
1728 where line.location_id = loc.id and line.id in %s''', (tuple(ids), ))
1729
1730 for x in cr.fetchall():
1731 res[x[0]] = {
1732 'instance_id': instance_id,
1733- 'location_name': x[1],
1734+ 'location_name': '%s/%s' % (x[1], x[2]),
1735 }
1736
1737 return res
1738@@ -1331,7 +1331,19 @@
1739 def _set_instance_loc(self, cr, uid, id, name=None, value=None, fnct_inv_arg=None, context=None):
1740 # set instance and location name to process received updates
1741 assert name in ('instance_id', 'location_name'), 'Bad query'
1742- cr.execute('update stock_mission_report_line_location set remote_'+name+'=%s where id=%s', (value or 'NULL', id)) # not_a_user_entry
1743+ if name == 'instance_id':
1744+ cr.execute('update stock_mission_report_line_location set remote_instance_id=%s where id=%s', (value or 'NULL', id))
1745+ return True
1746+
1747+ loc_id = 0
1748+ loc_name = value
1749+ if value:
1750+ m = re.match('(.*)/([0-9]+)$', value)
1751+ if m:
1752+ loc_id = int(m.group(2))
1753+ loc_name = m.group(1)
1754+
1755+ cr.execute('update stock_mission_report_line_location set remote_location_name=%s, remote_location_id=%s where id=%s', (loc_name or 'NULL', loc_id, id))
1756 return True
1757
1758 _columns = {
1759@@ -1346,8 +1358,9 @@
1760
1761 'remote_instance_id': fields.many2one('msf.instance', 'Instance', select=1),
1762 'remote_location_name': fields.char('Location', size=128, select=1),
1763- # TODO
1764- # batch
1765+ 'remote_location_id': fields.integer('ID of remote location'),
1766+ # TODO JFB RR
1767+ # force sync ??
1768 }
1769
1770 _sql_constraints = [
1771
1772=== modified file 'bin/addons/msf_budget/msf_budget_line.py'
1773--- bin/addons/msf_budget/msf_budget_line.py 2019-10-30 16:33:21 +0000
1774+++ bin/addons/msf_budget/msf_budget_line.py 2020-03-16 11:13:19 +0000
1775@@ -376,9 +376,9 @@
1776 return res
1777
1778 _columns = {
1779- 'budget_id': fields.many2one('msf.budget', 'Budget', ondelete='cascade'),
1780+ 'budget_id': fields.many2one('msf.budget', 'Budget', ondelete='cascade', select=1),
1781 'account_id': fields.many2one('account.account', 'Account', required=True, domain=[('type', '!=', 'view')]),
1782- 'destination_id': fields.many2one('account.analytic.account', 'Destination', domain=[('category', '=', 'DEST')]),
1783+ 'destination_id': fields.many2one('account.analytic.account', 'Destination', domain=[('category', '=', 'DEST')], select=1),
1784 'name': fields.function(_get_name, method=True, store=False, string="Name", type="char", readonly="True", size=512),
1785 'month1': fields.float("Month 01"),
1786 'month2': fields.float("Month 02"),
1787
1788=== modified file 'bin/addons/msf_cross_docking/cross_docking.py'
1789--- bin/addons/msf_cross_docking/cross_docking.py 2019-09-18 14:06:52 +0000
1790+++ bin/addons/msf_cross_docking/cross_docking.py 2020-03-16 11:13:19 +0000
1791@@ -253,44 +253,6 @@
1792 purchase_order()
1793
1794
1795-class procurement_order(osv.osv):
1796-
1797- _inherit = 'procurement.order'
1798-
1799- def po_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
1800- '''
1801- When you run the scheduler and you have a sale order line with type = make_to_order,
1802- we modify the location_id to set 'cross docking' of the purchase order created in mirror
1803- But if the sale_order is an Internal Request we don't want "Cross docking" but "Input" as location_id (i.e. the location of the warehouse_id)
1804- '''
1805- if context is None:
1806- context = {}
1807- if isinstance(ids, (int, long)):
1808- ids = [ids]
1809- values = super(procurement_order, self).po_values_hook(cr, uid, ids, context=context, *args, **kwargs)
1810- stock_loc_obj = self.pool.get('stock.location')
1811- sol_obj = self.pool.get('sale.order.line')
1812- procurement = kwargs['procurement']
1813- setup = self.pool.get('unifield.setup.configuration').get_config(cr, uid)
1814- sol_ids = sol_obj.search(cr, uid, [('procurement_id', '=', procurement.id)], context=context)
1815- if (procurement.tender_line_id or procurement.rfq_line_id or len(sol_ids)) and setup.allocation_setup != 'unallocated':
1816- if sol_ids:
1817- browse_so = sol_obj.browse(cr, uid, sol_ids, context=context)[0].order_id
1818- elif procurement.tender_line_id and procurement.tender_line_id.tender_id and procurement.tender_line_id.tender_id.sale_order_id:
1819- browse_so = procurement.tender_line_id.tender_id.sale_order_id
1820- elif procurement.rfq_line_id and procurement.rfq_line_id.order_id and procurement.rfq_line_id.order_id.sale_order_id:
1821- browse_so = procurement.rfq_line_id.order_id.sale_order_id
1822-
1823- if browse_so:
1824- req_loc = browse_so.location_requestor_id
1825- if not (browse_so.procurement_request and req_loc and req_loc.usage != 'customer'):
1826- values.update({'cross_docking_ok': True, 'location_id': stock_loc_obj.get_cross_docking_location(cr, uid)})
1827- values.update({'priority': browse_so.priority, 'categ': browse_so.categ})
1828- return values
1829-
1830-procurement_order()
1831-
1832-
1833 class stock_picking(osv.osv):
1834 '''
1835 do_partial(=function which is originally called from delivery_mechanism) modification
1836
1837=== modified file 'bin/addons/msf_custom_settings/__openerp__.py'
1838--- bin/addons/msf_custom_settings/__openerp__.py 2017-10-04 06:36:54 +0000
1839+++ bin/addons/msf_custom_settings/__openerp__.py 2020-03-16 11:13:19 +0000
1840@@ -24,7 +24,7 @@
1841 'category': 'Stock',
1842 'author': 'MSF, TeMPO Consulting',
1843 'developer': 'Matthieu Choplin',
1844- 'depends': ['msf_outgoing',
1845+ 'depends': ['msf_outgoing',
1846 'delivery_mechanism',
1847 'sale',
1848 'purchase',
1849@@ -48,7 +48,6 @@
1850 'view/consumption_calculation_view.xml',
1851 'view/physical_inventories_view.xml',
1852 'view/last_product_invetories_view.xml',
1853- 'view/procurement_exception_view.xml',
1854 'view/warehouse_view.xml',
1855 'view/uom_categories_view.xml',
1856 'view/units_of_measure_view.xml',
1857
1858=== removed file 'bin/addons/msf_custom_settings/view/procurement_exception_view.xml'
1859=== modified file 'bin/addons/msf_doc_import/__init__.py'
1860--- bin/addons/msf_doc_import/__init__.py 2019-12-09 10:14:17 +0000
1861+++ bin/addons/msf_doc_import/__init__.py 2020-03-16 11:13:19 +0000
1862@@ -59,7 +59,6 @@
1863 import composition_kit
1864 import account
1865 import stock_picking
1866-import replenishment_rules
1867 import product_list
1868 import supplier_catalogue
1869 import report
1870
1871=== modified file 'bin/addons/msf_doc_import/__openerp__.py'
1872--- bin/addons/msf_doc_import/__openerp__.py 2019-05-03 13:44:52 +0000
1873+++ bin/addons/msf_doc_import/__openerp__.py 2020-03-16 11:13:19 +0000
1874@@ -48,7 +48,6 @@
1875 'view/product_list_view.xml',
1876 'view/account_view.xml',
1877 'view/stock_picking_import_lines_view.xml',
1878- 'view/replenishment_rules_view.xml',
1879 'view/supplier_catalogue_view.xml',
1880 'view/msf_import_export_view.xml',
1881 'wizard/wizard_import_po_line_view.xml',
1882@@ -56,10 +55,6 @@
1883 'wizard/wizard_import_tender_line.xml',
1884 'wizard/wizard_imprort_ir_line.xml',
1885 'wizard/wizard_import_picking_line.xml',
1886- 'wizard/wizard_import_auto_supply_line.xml',
1887- 'wizard/wizard_import_order_cycle_line.xml',
1888- 'wizard/wizard_import_threshold_value_line.xml',
1889- 'wizard/wizard_import_stock_warehouse_order_point_line.xml',
1890 'wizard/wizard_import_product_list.xml',
1891 'wizard/wizard_import_product_line_view.xml',
1892 'wizard/wizard_import_supplier_catalogue.xml',
1893
1894=== removed file 'bin/addons/msf_doc_import/replenishment_rules.py'
1895=== removed file 'bin/addons/msf_doc_import/view/replenishment_rules_view.xml'
1896=== modified file 'bin/addons/msf_doc_import/wizard/__init__.py'
1897--- bin/addons/msf_doc_import/wizard/__init__.py 2019-07-31 10:18:01 +0000
1898+++ bin/addons/msf_doc_import/wizard/__init__.py 2020-03-16 11:13:19 +0000
1899@@ -156,10 +156,6 @@
1900 import wiz_common_import
1901 import wizard_import_tender_line
1902 import wizard_delete_lines
1903-import wizard_import_auto_supply_line
1904-import wizard_import_order_cycle_line
1905-import wizard_import_threshold_value_line
1906-import wizard_import_stock_warehouse_order_point_line
1907 import wizard_import_product_list
1908 import wizard_import_product_line
1909 import wizard_import_supplier_catalogue
1910
1911=== modified file 'bin/addons/msf_doc_import/wizard/wiz_common_import.py'
1912--- bin/addons/msf_doc_import/wizard/wiz_common_import.py 2018-12-04 12:55:36 +0000
1913+++ bin/addons/msf_doc_import/wizard/wiz_common_import.py 2020-03-16 11:13:19 +0000
1914@@ -31,9 +31,7 @@
1915
1916 NO_QTY_MODELS = [
1917 'monthly.review.consumption',
1918- 'stock.warehouse.orderpoint',
1919- 'threshold.value',
1920- 'stock.warehouse.order.cycle',
1921+ 'replenishment.segment',
1922 ]
1923
1924
1925@@ -177,10 +175,14 @@
1926 'wiz_id', 'product_id', string='Products'),
1927 'search_default_not_restricted': fields.integer('Search default not restricted', invisible=True), # UFTP-15 (for context reinject in product_ids m2m for 'add multiple lines' button)
1928 'current_id': fields.function(_get_current_id, method=True, type='integer', string='ID'),
1929+ 'msg': fields.text('Msg'),
1930+ 'display_error': fields.boolean('Error'),
1931 }
1932
1933 _defaults = {
1934 'search_default_not_restricted': 0,
1935+ 'msg': '',
1936+ 'display_error': False,
1937 }
1938
1939 def add_products(self, cr, uid, ids, product_ids, context=None):
1940@@ -247,8 +249,15 @@
1941
1942 context['wizard_id'] = wiz['id']
1943
1944- line_obj.create_multiple_lines(cr, uid, parent_id, product_ids, context=context)
1945-
1946+ ret = line_obj.create_multiple_lines(cr, uid, parent_id, product_ids, context=context)
1947+
1948+ if isinstance(ret, dict) and ret.get('msg'):
1949+ self.write(cr, uid, wiz['id'], {'msg': ret['msg'], 'product_ids': [(6, 0, [])], 'display_error': True}, context=context)
1950+ return True
1951+
1952+ return {'type': 'ir.actions.act_window_close'}
1953+
1954+ def button_close(self, cr, uid, ids, conext=None):
1955 return {'type': 'ir.actions.act_window_close'}
1956
1957 wizard_common_import_line()
1958@@ -278,6 +287,8 @@
1959 _inherit = 'product.product'
1960
1961 def write(self, cr, uid, ids, vals, context=None):
1962+ if context is None:
1963+ context = {}
1964 import_product_qty = 'import_product_qty'
1965 if len(vals) == 1 and import_product_qty in vals:
1966 self._write_imp_product_qty(cr, uid, ids, field_name=import_product_qty, values=vals[import_product_qty], args=None, context=context)
1967@@ -770,220 +781,6 @@
1968 stock_picking()
1969
1970
1971-class stock_warehouse_orderpoint_line(osv.osv):
1972- _inherit = 'stock.warehouse.orderpoint.line'
1973-
1974- def create_multiple_lines(self, cr, uid, parent_id, product_ids,
1975- context=None):
1976- '''
1977- Create lines according to product in list
1978- '''
1979- p_obj = self.pool.get('product.product')
1980- swo_obj = self.pool.get('stock.warehouse.orderpoint')
1981-
1982- # get parent default vals
1983- parent_vals = {
1984- 'product_min_qty': 0.,
1985- 'product_max_qty': 0.,
1986- 'qty_multiple': 1.0,
1987- }
1988- if parent_id:
1989- parent_r = swo_obj.read(cr, uid, parent_id, parent_vals.keys(),
1990- context=context)
1991- if parent_r:
1992- for f in parent_vals.keys():
1993- parent_vals[f] = parent_r[f] or 0.
1994-
1995- # set line vals
1996- for p_data in p_obj.read(cr, uid, product_ids, ['uom_id', 'import_product_qty'],
1997- context=context):
1998- values = {
1999- 'product_id': p_data['id'],
2000- 'product_uom_id': p_data['uom_id'][0],
2001- 'supply_id': parent_id,
2002- }
2003- for k in parent_vals:
2004- values[k] = parent_vals[k]
2005-
2006- values.update(self.onchange_product_id(cr, uid, False,
2007- p_data['id'], p_data['uom_id'][0],
2008- values.get('product_min_qty', 0.),
2009- values.get('product_max_qty', 0.),
2010- context=context).get('value', {}))
2011-
2012- domain = [
2013- ('product_id', '=', p_data['id']),
2014- ('supply_id', '=', parent_id),
2015- ]
2016- if not self.search(cr, uid, domain, context=context):
2017- self.create(cr, uid, values,
2018- context=dict(context, noraise=True))
2019-
2020- return True
2021-
2022-stock_warehouse_orderpoint_line()
2023-
2024-
2025-class stock_warehouse_orderpoint(osv.osv):
2026- _inherit = 'stock.warehouse.orderpoint'
2027-
2028- def add_multiple_lines(self, cr, uid, ids, context=None):
2029- '''
2030- Open the wizard to open multiple lines
2031- '''
2032- if context is None:
2033- context = {}
2034- context.update({
2035- 'product_ids_domain': [('type','=','product')],
2036- 'add_multiple_line': True,
2037- })
2038-
2039- return self.pool.get('wizard.common.import.line').open_wizard(cr, uid,
2040- ids[0], 'stock.warehouse.orderpoint',
2041- 'stock.warehouse.orderpoint.line', context=context)
2042-
2043-stock_warehouse_orderpoint()
2044-
2045-
2046-class stock_warehouse_auto_supply_line(osv.osv):
2047- _inherit = 'stock.warehouse.automatic.supply.line'
2048-
2049- def create_multiple_lines(self, cr, uid, parent_id, product_ids, context=None):
2050- '''
2051- Create lines according to product in list
2052- '''
2053- p_obj = self.pool.get('product.product')
2054-
2055- for p_data in p_obj.read(cr, uid, product_ids, ['uom_id', 'import_product_qty'], context=context):
2056- values = {'product_id': p_data['id'],
2057- 'product_uom_id': p_data['uom_id'][0],
2058- 'supply_id': parent_id}
2059-
2060- values.update(self.onchange_product_id(cr, uid, False, p_data['id'], p_data['uom_id'][0], p_data['import_product_qty'], context=context).get('value', {}))
2061- # Set the quantity to 0.00
2062- values.update({'product_qty': p_data['import_product_qty']})
2063-
2064- if not self.search(cr, uid, [('product_id', '=', p_data['id']), ('supply_id', '=', parent_id)], context=context):
2065- self.create(cr, uid, values, context=dict(context, noraise=True))
2066-
2067- return True
2068-
2069-stock_warehouse_auto_supply_line()
2070-
2071-
2072-class stock_warehouse_auto_supply(osv.osv):
2073- _inherit = 'stock.warehouse.automatic.supply'
2074-
2075- def add_multiple_lines(self, cr, uid, ids, context=None):
2076- '''
2077- Open the wizard to open multiple lines
2078- '''
2079- context = context is None and {} or context
2080- context.update({'product_ids_domain': [('type', 'not in', ['consu', 'service', 'service_recep'])]})
2081-
2082- return self.pool.get('wizard.common.import.line').\
2083- open_wizard(cr, uid, ids[0], 'stock.warehouse.automatic.supply', 'stock.warehouse.automatic.supply.line', context=context)
2084-
2085-stock_warehouse_auto_supply()
2086-
2087-
2088-class stock_warehouse_order_cycle_line(osv.osv):
2089- _inherit = 'stock.warehouse.order.cycle.line'
2090-
2091- def create_multiple_lines(self, cr, uid, parent_id, product_ids, context=None):
2092- '''
2093- Create lines according to product in list
2094- '''
2095- p_obj = self.pool.get('product.product')
2096-
2097- for p_data in p_obj.read(cr, uid, product_ids, ['uom_id', 'import_product_qty'], context=context):
2098- values = {'product_id': p_data['id'],
2099- 'uom_id': p_data['uom_id'][0],
2100- 'order_cycle_id': parent_id}
2101-
2102- values.update(self.product_change(cr, uid, False, p_data['id'], context=context).get('value', {}))
2103- # Set the quantity to 0.00
2104- values.update({'safety_stock': p_data['import_product_qty']})
2105-
2106- if not self.search(cr, uid, [('product_id', '=', p_data['id']), ('order_cycle_id', '=', parent_id)], context=context):
2107- self.create(cr, uid, values, context=dict(context, noraise=True))
2108-
2109- return True
2110-
2111-stock_warehouse_order_cycle_line()
2112-
2113-
2114-class stock_warehouse_order_cycle(osv.osv):
2115- _inherit = 'stock.warehouse.order.cycle'
2116-
2117- def add_multiple_lines(self, cr, uid, ids, context=None):
2118- '''
2119- Open the wizard to open multiple lines
2120- '''
2121- context = context is None and {} or context
2122- context.update({'product_ids_domain': [('type', 'not in', ['consu', 'service', 'service_recep'])]})
2123-
2124- return self.pool.get('wizard.common.import.line').\
2125- open_wizard(cr, uid, ids[0], 'stock.warehouse.order.cycle', 'stock.warehouse.order.cycle.line', context=context)
2126-
2127-stock_warehouse_order_cycle()
2128-
2129-
2130-class threshold_value_line(osv.osv):
2131- _inherit = 'threshold.value.line'
2132-
2133- def create_multiple_lines(self, cr, uid, parent_id, product_ids, context=None):
2134- '''
2135- Create lines according to product in list
2136- '''
2137- p_obj = self.pool.get('product.product')
2138-
2139- t_data = self.pool.get('threshold.value').browse(cr, uid, parent_id, context=context)
2140-
2141- for p_data in p_obj.read(cr, uid, product_ids, ['uom_id', 'import_product_qty'], context=context):
2142- values = {'product_id': p_data['id'],
2143- 'product_uom_id': p_data['uom_id'],
2144- 'threshold_value_id': parent_id}
2145-
2146- values.update(self.onchange_product_id(cr,
2147- uid,
2148- False,
2149- p_data['id'],
2150- t_data.compute_method,
2151- t_data.consumption_method,
2152- t_data.consumption_period_from,
2153- t_data.consumption_period_to,
2154- t_data.frequency,
2155- t_data.safety_month,
2156- t_data.lead_time,
2157- t_data.supplier_lt,).get('value', {}))
2158- # Set the quantity to 0.00
2159- values.update({'fixed_product_qty': p_data['import_product_qty'], 'fixed_threshold_value': 0.00})
2160-
2161- if not self.search(cr, uid, [('product_id', '=', p_data['id']), ('threshold_value_id', '=', parent_id)], context=context):
2162- self.create(cr, uid, values, context=dict(context, noraise=True))
2163-
2164- return True
2165-
2166-threshold_value_line()
2167-
2168-
2169-class threshold_value(osv.osv):
2170- _inherit = 'threshold.value'
2171-
2172- def add_multiple_lines(self, cr, uid, ids, context=None):
2173- '''
2174- Open the wizard to open multiple lines
2175- '''
2176- context = context is None and {} or context
2177- context.update({'product_ids_domain': [('type', 'not in', ['consu', 'service', 'service_recep'])]})
2178-
2179- return self.pool.get('wizard.common.import.line').\
2180- open_wizard(cr, uid, ids[0], 'threshold.value', 'threshold.value.line', context=context)
2181-
2182-threshold_value()
2183-
2184-
2185 class stock_inventory_line(osv.osv):
2186 _inherit = 'stock.inventory.line'
2187 _description = "Physical Stock Inventory Line"
2188
2189=== modified file 'bin/addons/msf_doc_import/wizard/wiz_common_import_view.xml'
2190--- bin/addons/msf_doc_import/wizard/wiz_common_import_view.xml 2018-10-24 17:39:01 +0000
2191+++ bin/addons/msf_doc_import/wizard/wiz_common_import_view.xml 2020-03-16 11:13:19 +0000
2192@@ -12,17 +12,24 @@
2193 <field name="parent_model" invisible="1" />
2194 <field name="search_default_not_restricted" invisible="1" />
2195 <field name="current_id" invisible="1" />
2196- <field name="product_ids" nolabel="1" colspan="4" mode="tree" domain="context.get('product_ids_domain', [])" context="{'search_default_not_restricted': search_default_not_restricted, 'wizard_id': current_id}" on_change="add_products(product_ids)">
2197- <tree string="Products" editable="top">
2198- <field name="default_code" readonly="True" />
2199- <field name="name" readonly="True" />
2200- <field name="uom_id" invisible="1" />
2201- <field name="import_product_qty" on_change="on_change_import_product_qty(import_product_qty, context)" readonly="False" />
2202- </tree>
2203- </field>
2204- <separator colspan="4" string="Actions" />
2205- <button special="cancel" string="Cancel" icon="gtk-cancel" />
2206- <button name="fill_lines" string="Add products" icon="terp-check" colspan="3" type="object" />
2207+ <field name="display_error" invisible="1" />
2208+ <group colspan="4" attrs="{'invisible': [('display_error', '=', True)]}">
2209+ <field name="product_ids" nolabel="1" colspan="4" mode="tree" domain="context.get('product_ids_domain', [])" context="{'search_default_not_restricted': search_default_not_restricted, 'wizard_id': current_id}" on_change="add_products(product_ids)">
2210+ <tree string="Products" editable="top">
2211+ <field name="default_code" readonly="True" />
2212+ <field name="name" readonly="True" />
2213+ <field name="uom_id" invisible="1" />
2214+ <field name="import_product_qty" on_change="on_change_import_product_qty(import_product_qty, context)" readonly="False" />
2215+ </tree>
2216+ </field>
2217+ <separator colspan="4" string="Actions" />
2218+ <button special="cancel" string="Cancel" icon="gtk-cancel" />
2219+ <button name="fill_lines" string="Add products" icon="terp-check" colspan="3" type="object" />
2220+ </group>
2221+ <group colspan="4" attrs="{'invisible': [('display_error', '=', False)]}">
2222+ <field name="msg" readonly="1" colspan="4" widget="full_text" nolabel="1"/>
2223+ <button type="object" name="button_close" string="Ok" icon="terp-check" colspan="4"/>
2224+ </group>
2225 </form>
2226 </field>
2227 </record>
2228@@ -38,15 +45,22 @@
2229 <field name="parent_model" invisible="1" />
2230 <field name="search_default_not_restricted" invisible="1" />
2231 <field name="current_id" invisible="1" />
2232- <field name="product_ids" nolabel="1" colspan="4" mode="tree" domain="context.get('product_ids_domain', [])" context="{'search_default_not_restricted': search_default_not_restricted, 'wizard_id': current_id}">
2233- <tree string="Products" editable="top">
2234- <field name="default_code" readonly="True" />
2235- <field name="name" readonly="True" />
2236- </tree>
2237- </field>
2238- <separator colspan="4" string="Actions" />
2239- <button special="cancel" string="Cancel" icon="gtk-cancel" />
2240- <button name="fill_lines" string="Add products" icon="terp-check" colspan="3" type="object" />
2241+ <field name="display_error" invisible="1" />
2242+ <group colspan="4" attrs="{'invisible': [('display_error', '=', True)]}">
2243+ <field name="product_ids" nolabel="1" colspan="4" mode="tree" domain="context.get('product_ids_domain', [])" context="{'search_default_not_restricted': search_default_not_restricted, 'wizard_id': current_id}">
2244+ <tree string="Products" editable="top">
2245+ <field name="default_code" readonly="True" />
2246+ <field name="name" readonly="True" />
2247+ </tree>
2248+ </field>
2249+ <separator colspan="4" string="Actions" />
2250+ <button special="cancel" string="Cancel" icon="gtk-cancel" />
2251+ <button name="fill_lines" string="Add products" icon="terp-check" colspan="3" type="object" />
2252+ </group>
2253+ <group colspan="4" attrs="{'invisible': [('display_error', '=', False)]}">
2254+ <field name="msg" readonly="1" colspan="4" widget="full_text" nolabel="1"/>
2255+ <button type="object" name="button_close" string="Ok" icon="terp-check" colspan="4"/>
2256+ </group>
2257 </form>
2258 </field>
2259 </record>
2260
2261=== modified file 'bin/addons/msf_doc_import/wizard/wizard_delete_lines.py'
2262--- bin/addons/msf_doc_import/wizard/wizard_delete_lines.py 2018-09-18 12:25:20 +0000
2263+++ bin/addons/msf_doc_import/wizard/wizard_delete_lines.py 2020-03-16 11:13:19 +0000
2264@@ -52,10 +52,6 @@
2265 'sale.order': ('sale.order.line', 'order_id', 'order_line', 'product_uom_qty', ''),
2266 'supplier.catalogue': ('supplier.catalogue.line', 'catalogue_id', 'line_ids', 'min_qty', ''),
2267 'stock.picking': ('stock.move', 'picking_id', 'move_lines', 'product_qty', '(\'state\', \'=\', \'draft\')'),
2268- 'stock.warehouse.orderpoint': ('stock.warehouse.orderpoint.line', 'supply_id', 'line_ids', '', ''),
2269- 'stock.warehouse.automatic.supply': ('stock.warehouse.automatic.supply.line', 'supply_id', 'line_ids', 'product_qty', ''),
2270- 'stock.warehouse.order.cycle': ('stock.warehouse.order.cycle.line', 'order_cycle_id', 'product_ids', 'safety_stock', ''),
2271- 'threshold.value': ('threshold.value.line', 'threshold_value_id', 'line_ids', '', ''),
2272 'stock.inventory': ('stock.inventory.line', 'inventory_id', 'inventory_line_id', 'product_qty', ''),
2273 'initial.stock.inventory': ('initial.stock.inventory.line', 'inventory_id', 'inventory_line_id', 'product_qty', ''),
2274 'real.average.consumption': ('real.average.consumption.line', 'rac_id', 'line_ids', 'consumed_qty', ''),
2275@@ -186,43 +182,6 @@
2276 return brl(self, cr, uid, ids, context=context)
2277
2278
2279-class stock_warehouse_orderpoint(osv.osv):
2280- _name = 'stock.warehouse.orderpoint'
2281- _inherit = 'stock.warehouse.orderpoint'
2282-
2283- def button_remove_lines(self, cr, uid, ids, context=None):
2284- return brl(self, cr, uid, ids, context=context)
2285-
2286-
2287-class stock_warehouse_automatic_supply(osv.osv):
2288- _name = 'stock.warehouse.automatic.supply'
2289- _inherit = 'stock.warehouse.automatic.supply'
2290-
2291- def button_remove_lines(self, cr, uid, ids, context=None):
2292- return brl(self, cr, uid, ids, context=context)
2293-
2294-
2295-class stock_warehouse_order_cycle(osv.osv):
2296- _name = 'stock.warehouse.order.cycle'
2297- _inherit = 'stock.warehouse.order.cycle'
2298-
2299- def button_remove_lines(self, cr, uid, ids, context=None):
2300- return brl(self, cr, uid, ids, context=context)
2301-
2302-
2303-class threshold_value(osv.osv):
2304- _name = 'threshold.value'
2305- _inherit = 'threshold.value'
2306-
2307- def button_remove_lines(self, cr, uid, ids, context=None):
2308- ids = isinstance(ids, (int, long)) and [ids] or ids
2309- context = context is None and {} or context
2310-
2311- context.update({'compute_method': self.read(cr, uid, ids[0], ['compute_method'], context=context)['compute_method']})
2312-
2313- return brl(self, cr, uid, ids, context=context)
2314-
2315-
2316 class stock_inventory(osv.osv):
2317 _name = 'stock.inventory'
2318 _inherit = 'stock.inventory'
2319@@ -266,10 +225,6 @@
2320 sale_order()
2321 supplier_catalogue()
2322 stock_picking()
2323-stock_warehouse_orderpoint()
2324-stock_warehouse_automatic_supply()
2325-stock_warehouse_order_cycle()
2326-threshold_value()
2327 stock_inventory()
2328 initial_stock_inventory()
2329 real_average_consumption()
2330@@ -436,33 +391,6 @@
2331 return noteditable_fields_view_get(res, view_type, context)
2332
2333
2334-class stock_warehouse_automatic_supply_line(osv.osv):
2335- _inherit = 'stock.warehouse.automatic.supply.line'
2336-
2337- def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
2338- view_id = delete_fields_view_get(self, cr, uid, view_id, view_type, context=context)
2339- res = super(stock_warehouse_automatic_supply_line, self).fields_view_get(cr, uid, view_id, view_type, context=context, toolbar=toolbar, submenu=submenu)
2340- return noteditable_fields_view_get(res, view_type, context)
2341-
2342-
2343-class stock_warehouse_order_cycle_line(osv.osv):
2344- _inherit = 'stock.warehouse.order.cycle.line'
2345-
2346- def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
2347- view_id = delete_fields_view_get(self, cr, uid, view_id, view_type, context=context)
2348- res = super(stock_warehouse_order_cycle_line, self).fields_view_get(cr, uid, view_id, view_type, context=context, toolbar=toolbar, submenu=submenu)
2349- return noteditable_fields_view_get(res, view_type, context)
2350-
2351-
2352-class threshold_value_line(osv.osv):
2353- _inherit = 'threshold.value.line'
2354-
2355- def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
2356- view_id = delete_fields_view_get(self, cr, uid, view_id, view_type, context=context)
2357- res = super(threshold_value_line, self).fields_view_get(cr, uid, view_id, view_type, context=context, toolbar=toolbar, submenu=submenu)
2358- return noteditable_fields_view_get(res, view_type, context)
2359-
2360-
2361 class stock_inventory_line(osv.osv):
2362 _inherit = 'stock.inventory.line'
2363
2364@@ -507,9 +435,6 @@
2365 sale_order_line()
2366 supplier_catalogue_line()
2367 stock_move()
2368-stock_warehouse_automatic_supply_line()
2369-stock_warehouse_order_cycle_line()
2370-threshold_value_line()
2371 stock_inventory_line()
2372 initial_stock_inventory_line()
2373 real_average_consumption_line()
2374
2375=== modified file 'bin/addons/msf_doc_import/wizard/wizard_delete_lines_view.xml'
2376--- bin/addons/msf_doc_import/wizard/wizard_delete_lines_view.xml 2017-11-13 15:36:41 +0000
2377+++ bin/addons/msf_doc_import/wizard/wizard_delete_lines_view.xml 2020-03-16 11:13:19 +0000
2378@@ -136,64 +136,6 @@
2379 </field>
2380 </record>
2381
2382- <!-- Auto supply line delete tree/search views -->
2383- <record id="stock_warehouse_automatic_supply_line_tree_delete_view" model="ir.ui.view">
2384- <field name="name">stock.warehouse.automatic.supply.line.tree.delete.view</field>
2385- <field name="model">stock.warehouse.automatic.supply.line</field>
2386- <field name="type">tree</field>
2387- <field name="priority" eval="99" />
2388- <field name="arch" type="xml">
2389- <tree string="Automatic supply lines to remove" noteditable="True" >
2390- <field name="product_id" />
2391- <field name="product_qty" />
2392- <field name="product_uom_id" />
2393- </tree>
2394- </field>
2395- </record>
2396-
2397- <record id="stock_warehouse_automatic_supply_line_search_delete_view" model="ir.ui.view">
2398- <field name="name">stock.warehouse.automatic.supply.line.search.delete.view</field>
2399- <field name="model">stock.warehouse.automatic.supply.line</field>
2400- <field name="type">search</field>
2401- <field name="priority" eval="99" />
2402- <field name="arch" type="xml">
2403- <tree string="Automatic supply lines to remove" noteditable="True">
2404- <field name="product_id" />
2405- <field name="product_qty" />
2406- </tree>
2407- </field>
2408- </record>
2409-
2410- <!-- Threshold value line delete tree/search views -->
2411- <record id="threshold_value_line_tree_delete_view" model="ir.ui.view">
2412- <field name="name">threshold.value.line.tree.delete.view</field>
2413- <field name="model">threshold.value.line</field>
2414- <field name="type">tree</field>
2415- <field name="priority" eval="99" />
2416- <field name="arch" type="xml">
2417- <tree string="Threshold value lines to remove" noteditable="True">
2418- <field name="product_id" />
2419- <field name="product_uom_id" />
2420- <field name="fixed_threshold_value" invisible="context.get('compute_method') != 'fixed'" />
2421- <field name="fixed_product_qty" invisible="context.get('compute_method') != 'fixed'" />
2422- <field name="threshold_value" invisible="context.get('compute_method') != 'computed'" />
2423- </tree>
2424- </field>
2425- </record>
2426-
2427- <record id="threshold_value_line_search_delete_view" model="ir.ui.view">
2428- <field name="name">threshold.value.line.search.delete.view</field>
2429- <field name="model">threshold.value.line</field>
2430- <field name="type">search</field>
2431- <field name="priority" eval="99" />
2432- <field name="arch" type="xml">
2433- <search string="Threshold value lines to remove">
2434- <field name="product_id" />
2435- <field name="product_uom_id" />
2436- </search>
2437- </field>
2438- </record>
2439-
2440 <!-- Stock inventory line delete tree/search views -->
2441 <record id="stock_inventory_line_tree_delete_view" model="ir.ui.view">
2442 <field name="name">stock.inventory.line.tree.delete.view</field>
2443
2444=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_auto_supply_line.py'
2445=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_auto_supply_line.xml'
2446=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_order_cycle_line.py'
2447=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.py'
2448=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_stock_warehouse_order_point_line.xml'
2449=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_threshold_value_line.py'
2450=== removed file 'bin/addons/msf_doc_import/wizard/wizard_import_threshold_value_line.xml'
2451=== modified file 'bin/addons/msf_doc_import/wizard/wizard_po_simulation_screen.py'
2452--- bin/addons/msf_doc_import/wizard/wizard_po_simulation_screen.py 2019-10-28 14:42:19 +0000
2453+++ bin/addons/msf_doc_import/wizard/wizard_po_simulation_screen.py 2020-03-16 11:13:19 +0000
2454@@ -363,6 +363,7 @@
2455 'in_line_number': line.line_number,
2456 'in_ext_ref': line.external_ref,
2457 'simu_id': imp_id,
2458+ 'imp_origin': line.origin,
2459 }, context=context)
2460
2461 return True
2462@@ -701,6 +702,7 @@
2463 first_line_index += 2
2464
2465 for line in wiz.simu_line_ids:
2466+ # 1st step : simu_line_ids contain a copy of po line
2467 # Put data in cache
2468 if line.in_product_id:
2469 PRODUCT_CODE_ID.setdefault(line.in_product_id.default_code, line.in_product_id.id)
2470@@ -1045,38 +1047,37 @@
2471 file line and the simulation screen line.
2472 '''
2473 to_del = []
2474+
2475+ # file_lines is dict
2476+ # key is the excel line number
2477+ # values: import line_number fl[0], import product_id fl[1], import uom_id fl[2], import qty fl[3], import ext_ref, import AD
2478 for x, fl in sorted(file_lines.iteritems()):
2479- # Search lines with same product, same UoM and same qty
2480+ # Search lines with same line number, same product, same UoM and same qty
2481 matching_lines = SIMU_LINES.get(wiz.id, {}).get(fl[0], {})
2482 tmp_wl_ids = matching_lines.get(fl[1], {}).get(fl[2], {}).get(fl[3], [])
2483- no_match = True
2484 for l in tmp_wl_ids:
2485 if l not in file_po_lines:
2486 file_po_lines[l] = [(x, 'match', fl[0])]
2487 to_del.append(x)
2488- no_match = False
2489 break
2490- if tmp_wl_ids and no_match:
2491- file_po_lines[l].append((x, 'split', fl[0]))
2492- to_del.append(x)
2493+
2494 # Clear the dict
2495 for x in to_del:
2496 del file_lines[x]
2497 to_del = []
2498
2499-
2500 for x, fl in file_lines.iteritems():
2501- # Search lines with same product, same UoM
2502+ # Search lines with same line number, same product, same UoM
2503 matching_lines = SIMU_LINES.get(wiz.id, {}).get(fl[0], {})
2504 tmp_wl_ids = matching_lines.get(fl[1], {}).get(fl[2], {}).get('line_ids', [])
2505- no_match = True
2506+ match = False
2507 for l in tmp_wl_ids:
2508 if l not in file_po_lines:
2509 file_po_lines[l] = [(x, 'match', fl[0])]
2510 to_del.append(x)
2511- no_match = False
2512+ match = True
2513 break
2514- if tmp_wl_ids and no_match:
2515+ if tmp_wl_ids and not match:
2516 file_po_lines[l].append((x, 'split', fl[0]))
2517 to_del.append(x)
2518 # Clear the dict
2519@@ -1084,18 +1085,19 @@
2520 del file_lines[x]
2521 to_del = []
2522
2523+
2524 for x, fl in file_lines.iteritems():
2525- # Search lines with same product
2526+ # Search lines with same line_number, same product
2527 matching_lines = SIMU_LINES.get(wiz.id, {}).get(fl[0], {})
2528 tmp_wl_ids = matching_lines.get(fl[1], {}).get('line_ids', [])
2529- no_match = True
2530+ match = False
2531 for l in tmp_wl_ids:
2532 if l not in file_po_lines:
2533 file_po_lines[l] = [(x, 'match', fl[0])]
2534 to_del.append(x)
2535- no_match = False
2536+ match = True
2537 break
2538- if tmp_wl_ids and no_match:
2539+ if tmp_wl_ids and not match:
2540 file_po_lines[l].append((x, 'split', fl[0]))
2541 to_del.append(x)
2542 # Clear the dict
2543@@ -1107,14 +1109,14 @@
2544 # Search lines with same line number
2545 matching_lines = SIMU_LINES.get(wiz.id, {}).get(fl[0], {})
2546 tmp_wl_ids = matching_lines.get('line_ids', [])
2547- no_match = True
2548+ match = False
2549 for l in tmp_wl_ids:
2550 if l not in file_po_lines:
2551 file_po_lines[l] = [(x, 'match', fl[0])]
2552 to_del.append(x)
2553- no_match = False
2554+ match = True
2555 break
2556- if tmp_wl_ids and no_match:
2557+ if tmp_wl_ids and not match:
2558 file_po_lines[l].append((x, 'split', fl[0]))
2559 to_del.append(x)
2560 # Clear the dict
2561@@ -1122,17 +1124,22 @@
2562 del file_lines[x]
2563 to_del = []
2564
2565- # For file lines with no simu. screen lines with same line number,
2566- # create a new simu. screen line
2567+ # new line to create
2568 for x in file_lines.keys():
2569 new_po_lines.append(x)
2570
2571 # Split the simu. screen line or/and update the values according
2572 # to linked file line.
2573+ # file_po_lines is a dict
2574+ # key: simu_line_id
2575+ # values: [( excel line number, type: match or split, line_number )] : 1st item is the match line, other are split
2576+
2577 for po_line, file_lines in file_po_lines.iteritems():
2578 if po_line in SIMU_LINES[wiz.id]['line_ids']:
2579+ # to manage deletion
2580 index_po_line = SIMU_LINES[wiz.id]['line_ids'].index(po_line)
2581 SIMU_LINES[wiz.id]['line_ids'].pop(index_po_line)
2582+
2583 for file_line in file_lines:
2584 nb_treated_lines += 1
2585 percent_completed = int(float(nb_treated_lines) / float(nb_file_lines) * 100)
2586@@ -1140,7 +1147,7 @@
2587 'percent_completed': percent_completed}, context=context)
2588 vals = values.get(file_line[0], [])
2589 if file_line[1] == 'match':
2590- err_msg, warn_msg = wl_obj.import_line(cr, uid, po_line, vals, cc_cache, context=context)
2591+ err_msg, warn_msg = wl_obj.import_line(cr, uid, po_line, vals, cc_cache, 'match', context=context)
2592 if file_line[0] in not_ok_file_lines:
2593 wl_obj.write(cr, uid, [po_line], {'type_change': 'error', 'error_msg': not_ok_file_lines[file_line[0]]}, context=context)
2594 elif file_line[1] == 'split':
2595@@ -1149,8 +1156,10 @@
2596 'chg_text': _('Split\nQTY'),
2597 'parent_line_id': po_line,
2598 'imp_dcd': False,
2599+ 'error_msg': False,
2600+ 'info_msg': False,
2601 'po_line_id': False}, context=context)
2602- err_msg1, warn_msg1 = wl_obj.import_line(cr, uid, new_wl_id, vals, cc_cache, context=context)
2603+ err_msg1, warn_msg1 = wl_obj.import_line(cr, uid, new_wl_id, vals, cc_cache, 'split', context=context)
2604 err_msg += err_msg1
2605 warn_msg += warn_msg1
2606 if file_line[0] in not_ok_file_lines:
2607@@ -1181,7 +1190,7 @@
2608 'in_line_number': values.get(po_line, [])[0] and int(values.get(po_line, [])[0]) or False,
2609 'in_ext_ref': values.get(po_line, [])[1] or False,
2610 'simu_id': wiz.id}, context=context)
2611- err_msg, warn_msg = wl_obj.import_line(cr, uid, new_wl_id, vals, cc_cache, context=context)
2612+ err_msg, warn_msg = wl_obj.import_line(cr, uid, new_wl_id, vals, cc_cache, 'new', context=context)
2613 if po_line in not_ok_file_lines:
2614 wl_obj.write(cr, uid, [new_wl_id], {'type_change': 'error', 'error_msg': not_ok_file_lines[po_line]}, context=context)
2615
2616@@ -1297,13 +1306,16 @@
2617 if new_thread.isAlive():
2618 return self.go_to_simulation(cr, uid, ids, context=context)
2619 else:
2620- return {'type': 'ir.actions.act_window',
2621- 'res_model': 'purchase.order',
2622- 'res_id': active_wiz.order_id.id,
2623- 'view_type': 'form',
2624- 'view_mode': 'form, tree',
2625- 'target': 'crush',
2626- 'context': context}
2627+ state = self.read(cr, uid, ids[0], ['state'], context=context)
2628+ if state['state'] != 'error':
2629+ return {'type': 'ir.actions.act_window',
2630+ 'res_model': 'purchase.order',
2631+ 'res_id': active_wiz.order_id.id,
2632+ 'view_type': 'form',
2633+ 'view_mode': 'form, tree',
2634+ 'target': 'crush',
2635+ 'context': context}
2636+ return self.go_to_simulation(cr, uid, ids, context=context)
2637 else:
2638 self.run_import(cr.dbname, uid, ids, context)
2639 return True
2640@@ -1350,8 +1362,9 @@
2641 cr.commit()
2642 cr.close(True)
2643 except Exception, e:
2644+ cr.rollback()
2645 logging.getLogger('po.simulation.run').warn('Exception', exc_info=True)
2646- self.write(cr, uid, ids, {'message': e}, context=context)
2647+ self.write(cr, uid, ids, {'message': e, 'state': 'error'}, context=context)
2648 res = True
2649 cr.commit()
2650 cr.close(True)
2651@@ -1549,6 +1562,7 @@
2652 'change_ok': fields.function(_get_line_info, method=True, multi='line',
2653 type='boolean', string='Change', store=False),
2654 'error_msg': fields.text(string='Error message', readonly=True),
2655+ 'info_msg': fields.text(string='Message', readonly=True),
2656 'ad_error': fields.char(string='Display warning on line', size=12, readonly=True),
2657 'parent_line_id': fields.many2one('wizard.import.po.simulation.screen.line',
2658 string='Parent line id',
2659@@ -1575,7 +1589,7 @@
2660
2661 return True
2662
2663- def import_line(self, cr, uid, ids, values, cc_cache, context=None):
2664+ def import_line(self, cr, uid, ids, values, cc_cache, import_type=False, context=None):
2665 '''
2666 Write the line with the values
2667 '''
2668@@ -1592,6 +1606,7 @@
2669
2670 for line in self.browse(cr, uid, ids, context=context):
2671 write_vals = {}
2672+ info_msg = []
2673
2674 # Comment
2675 write_vals['imp_comment'] = values[15] and values[15].strip()
2676@@ -1736,13 +1751,17 @@
2677
2678 # Origin
2679 full_origin = values[8]
2680- if full_origin:
2681- instance_sync_order_ref = False
2682- if ':' in full_origin:
2683- origin = full_origin.split(':')[0]
2684- instance_sync_order_ref = full_origin.split(':')[-1]
2685- else:
2686- origin = full_origin
2687+ instance_sync_order_ref = False
2688+ if full_origin and ':' in full_origin:
2689+ origin = full_origin.split(':')[0]
2690+ instance_sync_order_ref = full_origin.split(':')[-1]
2691+ else:
2692+ origin = full_origin
2693+
2694+ if origin and import_type in ('match', 'split'):
2695+ if origin != line.imp_origin:
2696+ info_msg.append(_('Origin in the imported file does not match the origin on the PO line. Imported Origin ignored'))
2697+ elif origin:
2698 if line.simu_id.order_id.order_type not in ['loan', 'donation_exp', 'donation_st', 'in_kind']:
2699 so_ids = sale_obj.search(cr, uid, [('name', '=', origin), ('procurement_request', 'in', ['t', 'f'])],
2700 limit=1, context=context)
2701@@ -1779,9 +1798,11 @@
2702 err_msg = _('A PO with a Loan, Donation before expiry, Standard donation or In Kind Donation Order Type can\'t have an Source Document in its lines')
2703 errors.append(err_msg)
2704 write_vals['type_change'] = 'error'
2705- else:
2706- if line.simu_id.order_id.po_from_fo:
2707- err_msg = _('The Origin is mandatory for a PO coming from a FO')
2708+ elif line.simu_id.order_id.po_from_fo or line.simu_id.order_id.po_from_ir:
2709+ if import_type == 'split':
2710+ info_msg.append(_('Missing mandatory Origin. Origin of same number split line has been used.'))
2711+ elif import_type != 'match' or not line.imp_origin:
2712+ err_msg = _('The Origin is mandatory for a PO coming from an FO/IR')
2713 errors.append(err_msg)
2714 write_vals['type_change'] = 'error'
2715
2716@@ -1848,6 +1869,10 @@
2717 # Message ESC2
2718 write_vals['imp_esc2'] = values[19]
2719
2720+ write_vals['info_msg'] = False
2721+ if info_msg:
2722+ write_vals['info_msg'] = ' -'.join(info_msg)
2723+ warnings += info_msg
2724 if line.error_msg:
2725 write_vals['type_change'] = 'error'
2726
2727@@ -1900,6 +1925,13 @@
2728 })
2729 context['job_comment'] = job_comment
2730 continue
2731+ elif line.info_msg:
2732+ # if we have a message that does not block the import of the line
2733+ context.setdefault('job_comment', []).append({
2734+ 'res_model': 'purchase.order',
2735+ 'res_id': line.simu_id.order_id.id,
2736+ 'msg': _('%s: info on line %s %s') % (line.simu_id.order_id.name, line.in_line_number or line.imp_external_ref, line.info_msg),
2737+ })
2738
2739 if line.type_change == 'del' and line.po_line_id:
2740 wf_service.trg_validate(uid, 'purchase.order.line', line.po_line_id.id, 'cancel', cr)
2741
2742=== modified file 'bin/addons/msf_homere_interface/hr_payroll_wizard.xml'
2743--- bin/addons/msf_homere_interface/hr_payroll_wizard.xml 2019-08-02 14:08:40 +0000
2744+++ bin/addons/msf_homere_interface/hr_payroll_wizard.xml 2020-03-16 11:13:19 +0000
2745@@ -204,7 +204,7 @@
2746 <field name="type">form</field>
2747 <field name="arch" type="xml">
2748 <form string="Import Expats">
2749- <label string="This wizard will import an Expat employees file in XML Spreadsheet 2003 format. To generate this file, create a Speadsheet with 3 columns: 'Name' , 'Code' and 'Active'." colspan="4"/>
2750+ <label string="This wizard will import an Expat employees file in XML Spreadsheet 2003 format. To generate this file, create a Spreadsheet with 4 columns: 'Name' , 'Code', 'Status' and 'Contract End Date' (optional)." colspan="4"/>
2751 <newline/>
2752 <field name="file" filename="filename"/>
2753 <field name="filename" invisible="1"/>
2754
2755=== modified file 'bin/addons/msf_instance/data/instance_data.xml'
2756--- bin/addons/msf_instance/data/instance_data.xml 2018-02-22 14:23:17 +0000
2757+++ bin/addons/msf_instance/data/instance_data.xml 2020-03-16 11:13:19 +0000
2758@@ -15,18 +15,5 @@
2759 <field name="instance_id" ref="instance_section" />
2760 </record>
2761
2762- <record id="ir_cron_remote_backup" model="ir.cron" forcecreate="1">
2763- <field name="function">send_backup</field>
2764- <field name="user_id">1</field>
2765- <field name="name">Send Remote Backup</field>
2766- <field name="interval_type">days</field>
2767- <field eval="-1" name="numbercall"/>
2768- <field eval="5" name="priority"/>
2769- <field eval="0" name="doall"/>
2770- <field eval="0" name="active"/>
2771- <field eval="1" name="interval_number"/>
2772- <field name="model">msf.instance</field>
2773- </record>
2774-
2775 </data>
2776 </openerp>
2777
2778=== modified file 'bin/addons/msf_instance/data/remote_backup.xml'
2779--- bin/addons/msf_instance/data/remote_backup.xml 2019-07-19 07:33:28 +0000
2780+++ bin/addons/msf_instance/data/remote_backup.xml 2020-03-16 11:13:19 +0000
2781@@ -12,6 +12,7 @@
2782 <field eval="0" name="active"/>
2783 <field eval="1" name="interval_number"/>
2784 <field name="model">msf.instance.cloud</field>
2785+ <field name="manual_activation" eval="False" />
2786 </record>
2787
2788 </data>
2789
2790=== modified file 'bin/addons/msf_instance/msf_instance.py'
2791--- bin/addons/msf_instance/msf_instance.py 2019-07-30 10:04:51 +0000
2792+++ bin/addons/msf_instance/msf_instance.py 2020-03-16 11:13:19 +0000
2793@@ -680,7 +680,8 @@
2794 to_write['active'] = False
2795 elif to_activate:
2796 if not cron_data.active:
2797- to_write['active'] = True
2798+ if self.pool.get('backup.config').search(cr, uid, [('backup_type', '=', 'sharepoint')]):
2799+ to_write['active'] = True
2800
2801 next_cron = DateTime.strptime(cron_data.nextcall, '%Y-%m-%d %H:%M:%S')
2802 if not cron_data.active or abs(round(next_cron.hour + next_cron.minute/60.,2) - round(myself['cloud_schedule_time'],2)) > 0.001:
2803@@ -707,6 +708,17 @@
2804 return now_dt >= start_dt or now_dt <= end_dt
2805
2806 def send_backup_bg(self, cr, uid, progress=False, context=None):
2807+ if not self.pool.get('backup.config').search(cr, uid, [('backup_type', '=', 'sharepoint')]):
2808+ self._logger.warn('SharePoint push: the cron task is active but the backup configuration is set to Cont. Backup')
2809+ return True
2810+ local_instance = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.instance_id
2811+ if not local_instance:
2812+ return True
2813+ info = self._get_cloud_info(cr, uid, local_instance.id)
2814+ for data in ['url', 'login', 'password']:
2815+ if not info[data]:
2816+ self.pool.get('sync.version.instance.monitor').create(cr, uid, {'cloud_error': 'SharePoint indentifiers not set.'}, context=context)
2817+ return True
2818 thread = threading.Thread(target=self.send_backup_run, args=(cr.dbname, uid, progress, context))
2819 thread.start()
2820 return True
2821@@ -739,7 +751,7 @@
2822 progress_obj = False
2823
2824 try:
2825- if not config.get('send_to_onedrive') and not misc.use_prod_sync(cr):
2826+ if not config.get('send_to_onedrive') and not misc.use_prod_sync(cr, uid, self.pool):
2827 raise osv.except_osv(_('Warning'), _('Only production instances are allowed !'))
2828
2829 if not local_instance:
2830
2831=== modified file 'bin/addons/msf_instance/res_company.py'
2832--- bin/addons/msf_instance/res_company.py 2016-08-18 08:32:03 +0000
2833+++ bin/addons/msf_instance/res_company.py 2020-03-16 11:13:19 +0000
2834@@ -24,12 +24,11 @@
2835 from tools.translate import _
2836 import logging
2837 import tools
2838-from os import path
2839
2840 class res_company(osv.osv):
2841 _name = 'res.company'
2842 _inherit = 'res.company'
2843-
2844+
2845 def init(self, cr):
2846 """
2847 Create a instance for yml test
2848@@ -51,12 +50,12 @@
2849 tools.convert_xml_import(cr, current_module, file, {}, mode='init', noupdate=False)
2850
2851 _columns = {
2852- 'instance_id': fields.many2one('msf.instance', string="Proprietary Instance",
2853- help="Representation of the current instance"),
2854+ 'instance_id': fields.many2one('msf.instance', string="Proprietary Instance",
2855+ help="Representation of the current instance"),
2856 'second_time': fields.boolean('Config. Wizard launched for the second time'),
2857 'company_second_time': fields.boolean('Company Config. Wizard launched for the second time'),
2858 }
2859-
2860+
2861 _defaults = {
2862 'second_time': lambda *a: False,
2863 'company_second_time': lambda *a: False,
2864@@ -73,7 +72,7 @@
2865 {'instance_id': new_instance_id},
2866 context=context)
2867 return
2868-
2869+
2870 def copy_data(self, cr, uid, id, default=None, context=None):
2871 '''
2872 Erase some unused data copied from the original object, which sometime could become dangerous, as in UF-1631/1632,
2873@@ -93,7 +92,7 @@
2874 if ftd in res:
2875 del(res[ftd])
2876 return res
2877-
2878+
2879 def write(self, cr, uid, ids, vals, context=None):
2880 if not ids:
2881 return True
2882@@ -137,6 +136,18 @@
2883 for object in ['account.analytic.journal', 'account.journal', 'account.analytic.line', 'account.move', 'account.move.line', 'account.bank.statement']:
2884 self._refresh_objects(cr, uid, object, old_instance_id, vals['instance_id'], context=context)
2885 return super(res_company, self).write(cr, uid, ids, vals, context=context)
2886-
2887+
2888+ def _get_instance_level(self, cr, uid):
2889+ instance = self._get_instance_record(cr, uid)
2890+ return instance and instance.level
2891+
2892+ def _get_instance_id(self, cr, uid):
2893+ instance = self._get_instance_record(cr, uid)
2894+ return instance and instance.id
2895+
2896+ def _get_instance_record(self, cr, uid):
2897+ user = self.pool.get('res.users').browse(cr, uid, uid, fields_to_fetch=['company_id'])
2898+ return user.company_id and user.company_id.instance_id
2899+
2900 res_company()
2901 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
2902
2903=== modified file 'bin/addons/msf_order_date/order_dates.py'
2904--- bin/addons/msf_order_date/order_dates.py 2019-09-18 14:06:52 +0000
2905+++ bin/addons/msf_order_date/order_dates.py 2020-03-16 11:13:19 +0000
2906@@ -818,48 +818,6 @@
2907 sale_order_line()
2908
2909
2910-class procurement_order(osv.osv):
2911- '''
2912- date modifications
2913- '''
2914- _inherit = 'procurement.order'
2915-
2916- def po_line_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
2917- '''
2918- Please copy this to your module's method also.
2919- This hook belongs to the make_po method from purchase>purchase.py>procurement_order
2920-
2921- - allow to modify the data for purchase order line creation
2922- '''
2923- if context is None:
2924- context = {}
2925- line = super(procurement_order, self).po_line_values_hook(cr, uid, ids, context=context, *args, **kwargs)
2926- procurement = kwargs['procurement']
2927- # date_planned (requested date) = date_planned from procurement order (rts - prepartion lead time)
2928- # confirmed_delivery_date (confirmed date) = False
2929- line.update({'date_planned': procurement.date_planned, 'confirmed_delivery_date': False, })
2930- return line
2931-
2932- def po_values_hook(self, cr, uid, ids, context=None, *args, **kwargs):
2933- '''
2934- Please copy this to your module's method also.
2935- This hook belongs to the make_po method from purchase>purchase.py>procurement_order
2936-
2937- - allow to modify the data for purchase order creation
2938- '''
2939- if context is None:
2940- context = {}
2941- values = super(procurement_order, self).po_values_hook(cr, uid, ids, context=context, *args, **kwargs)
2942- line = kwargs['line']
2943- # date_planned (requested date) = date_planned from procurement order (rts - prepartion lead time)
2944- # confirmed_delivery_date (confirmed date) = False
2945- # both values are taken from line
2946- values.update({'delivery_requested_date': line['date_planned'], 'delivery_confirmed_date': line['confirmed_delivery_date'], })
2947- return values
2948-
2949-procurement_order()
2950-
2951-
2952 class stock_picking(osv.osv):
2953 _name = 'stock.picking'
2954 _inherit = 'stock.picking'
2955@@ -911,7 +869,7 @@
2956 if isinstance(ids, (int, long)):
2957 ids = [ids]
2958
2959- self.write(cr, uid, ids, {'manual_min_date_stock_picking': value}, context=context)
2960+ cr.execute("update stock_picking set manual_min_date_stock_picking=%s where id in %s", (value, tuple(ids)))
2961 return True
2962
2963 _columns = {'date': fields.datetime('Creation Date', help="Date of Order", select=True),
2964
2965=== modified file 'bin/addons/msf_outgoing/msf_outgoing.py'
2966--- bin/addons/msf_outgoing/msf_outgoing.py 2020-02-04 13:40:28 +0000
2967+++ bin/addons/msf_outgoing/msf_outgoing.py 2020-03-16 11:13:19 +0000
2968@@ -2741,8 +2741,6 @@
2969 moves_states = {}
2970 pick_to_check = set()
2971
2972- wf_service = netsvc.LocalService("workflow")
2973-
2974 for obj in self.browse(cr, uid, ids, context=context):
2975 if obj.subtype == 'standard':
2976 raise osv.except_osv(
2977@@ -2849,9 +2847,6 @@
2978 ], order='NO_ORDER', limit=1, context=context)
2979 if other_linked_moves:
2980 move_obj.update_linked_documents(cr, uid, move.id, other_linked_moves[0], context=context)
2981- proc_ids = self.pool.get('procurement.order').search(cr, uid, [('move_id', '=', other_linked_moves[0])], context=context)
2982- for proc_id in proc_ids:
2983- wf_service.trg_write(uid, 'procurement.order', proc_id, cr)
2984 move.unlink(force=True)
2985 # move.action_done(context=context)
2986 elif move.product_qty != 0.00:
2987@@ -4613,27 +4608,6 @@
2988 pack_family_memory()
2989
2990
2991-class procurement_order(osv.osv):
2992- '''
2993- procurement order workflow
2994- '''
2995- _inherit = 'procurement.order'
2996-
2997- def _hook_check_mts_on_message(self, cr, uid, context=None, *args, **kwargs):
2998- '''
2999- Please copy this to your module's method also.
3000- This hook belongs to the _check_make_to_stock_product method from procurement>procurement.py>procurement.order
3001-
3002- - allow to modify the message written back to procurement order
3003- '''
3004- message = super(procurement_order, self)._hook_check_mts_on_message(cr, uid, context=context, *args, **kwargs)
3005- procurement = kwargs['procurement']
3006- if procurement.move_id.picking_id.state == 'draft' and procurement.move_id.picking_id.subtype == 'picking':
3007- message = _("Shipment Process in Progress.")
3008- return message
3009-
3010-procurement_order()
3011-
3012 class stock_reserved_products(osv.osv):
3013 _auto = False
3014 _name ='stock.reserved.products'
3015
3016=== modified file 'bin/addons/msf_outgoing/msf_outgoing_view.xml'
3017--- bin/addons/msf_outgoing/msf_outgoing_view.xml 2020-02-04 13:40:28 +0000
3018+++ bin/addons/msf_outgoing/msf_outgoing_view.xml 2020-03-16 11:13:19 +0000
3019@@ -1434,11 +1434,11 @@
3020 <button name="do_create_shipment_bg" states="draft" string="Create Shipment" type="object" icon="gtk-add" context="{'from_button': True}" />
3021 <button name="return_packs_from_shipment" states="shipped" string="Return Packs from Shipment..." type="object" icon="gtk-undo" context="{'from_button': True}" />
3022 <button name="validate_bg" states="shipped" string="Validate" type="object" icon="gtk-apply" context="{'from_button': True}" />
3023- <button name="set_delivered" icon="gtk-apply" type="object" string="Validate Delivery"
3024+ <button name="set_delivered" icon="gtk-apply" type="object" string="Confirm Reception"
3025 attrs="{'invisible': ['|','|', '&amp;', ('is_company', '=', False), ('partner_type', 'in', ['internal', 'intermission', 'section']), ('state', '!=', 'done'), ('num_of_packs', '=', 0)]}" />
3026- <button name="set_delivered" icon="gtk-apply" type="object" string="Validate Delivery"
3027+ <button name="set_delivered" icon="gtk-apply" type="object" string="Confirm Reception"
3028 attrs="{'invisible': ['|','|', '|', ('num_of_packs', '=', 0), ('is_company', '=', True), ('partner_type', 'not in', ['internal', 'intermission', 'section']), ('state', '!=', 'done')]}"
3029- confirm="Synchronization engine should confirm the delivery at the project reception, are you sure?"/>
3030+ confirm="Synchronization engine should confirm the reception once recorded on the receiving instance, do you want to continue?"/>
3031 </group>
3032 </form>
3033 </field>
3034
3035=== modified file 'bin/addons/msf_processes/__openerp__.py'
3036--- bin/addons/msf_processes/__openerp__.py 2012-07-05 14:39:47 +0000
3037+++ bin/addons/msf_processes/__openerp__.py 2020-03-16 11:13:19 +0000
3038@@ -16,7 +16,7 @@
3039 #
3040 # You should have received a copy of the GNU Affero General Public License
3041 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3042-#
3043+#
3044 ##############################################################################
3045 {
3046 "name" : "MSF Processes",
3047@@ -48,9 +48,8 @@
3048 "process/supplier_invoice_process.xml", #8
3049 "process/purchase_process.xml", #9
3050 "process/tender_process.xml", #10
3051- "process/procurement_process.xml", #11
3052 "process/sale_process.xml", #12
3053- ],
3054+ ],
3055 "demo_xml": [],
3056 "test": [],
3057 "installable": True,
3058
3059=== removed file 'bin/addons/msf_processes/process/procurement_process.xml'
3060=== modified file 'bin/addons/msf_processes/process/sale_process.xml'
3061--- bin/addons/msf_processes/process/sale_process.xml 2017-05-04 12:24:30 +0000
3062+++ bin/addons/msf_processes/process/sale_process.xml 2020-03-16 11:13:19 +0000
3063@@ -60,18 +60,6 @@
3064 <field eval="0" name="flow_start"/>
3065 </record>
3066
3067- <record id="sale.process_node_saleprocurement0" model="process.node">
3068- <field name="menu_id" ref="procurement.menu_stock_procurement_action"/>
3069- <!-- <field name="model_id" ref="procurement.model_procurement_order"/> -->
3070- <field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
3071- <field eval="&quot;&quot;&quot;Sourcing&quot;&quot;&quot;" name="name"/>
3072- <field eval="&quot;&quot;&quot;Sourcing subflow.&quot;&quot;&quot;" name="note"/>
3073- <field name="process_id" ref="sale.process_process_salesprocess0"/>
3074- <field name="subflow_id" ref="procurement.process_process_procurementprocess0"/>
3075- <!-- <field eval="&quot;&quot;&quot;object.state == 'confirmed'&quot;&quot;&quot;" name="model_states"/> -->
3076- <field eval="0" name="flow_start"/>
3077- </record>
3078-
3079 <record id="sale.process_node_sale_tender" model="process.node">
3080 <field name="menu_id" ref="tender_flow.menu_tender"/>
3081 <!-- <field name="model_id" ref="tender_flow.model_tender"/> -->
3082@@ -86,7 +74,6 @@
3083
3084 <record id="sale.process_node_sale_po" model="process.node">
3085 <field name="menu_id" ref="purchase.menu_purchase_form_action"/>
3086- <!-- <field name="model_id" ref="procurement.model_procurement_order"/> -->
3087 <field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
3088 <field eval="&quot;&quot;&quot;Purchase Order&quot;&quot;&quot;" name="name"/>
3089 <field eval="&quot;&quot;&quot;Purchase Order subflow.&quot;&quot;&quot;" name="note"/>
3090@@ -119,58 +106,6 @@
3091 <!-- <field eval="&quot;&quot;&quot;object.state in ('done', 'assigned')&quot;&quot;&quot;" name="model_states"/> -->
3092 <field eval="0" name="flow_start"/>
3093 </record>
3094-<!--
3095- <record id="sale.process_node_invoice0" model="process.node">
3096- <field name="menu_id" ref="account.menu_action_invoice_tree1"/>
3097- <field name="model_id" ref="account.model_account_invoice"/>
3098- <field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
3099- <field eval="&quot;&quot;&quot;Invoice&quot;&quot;&quot;" name="name"/>
3100- <field eval="&quot;&quot;&quot;To be reviewed by the accountant.&quot;&quot;&quot;" name="note"/>
3101- <field name="process_id" ref="sale.process_process_salesprocess0"/>
3102- <field name="subflow_id" ref="account.process_process_invoiceprocess0"/>
3103- <field eval="&quot;&quot;&quot;object.state=='draft'&quot;&quot;&quot;" name="model_states"/>
3104- <field eval="0" name="flow_start"/>
3105- </record>
3106- -->
3107-<!--
3108- <record id="sale.process_node_invoiceafterdelivery0" model="process.node">
3109- <field name="menu_id" ref="account.menu_action_invoice_tree1"/>
3110- <field name="model_id" ref="account.model_account_invoice"/>
3111- <field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
3112- <field eval="&quot;&quot;&quot;Invoice&quot;&quot;&quot;" name="name"/>
3113- <field eval="&quot;&quot;&quot;Based on the shipped or on the ordered quantities.&quot;&quot;&quot;" name="note"/>
3114- <field name="process_id" ref="sale.process_process_salesprocess0"/>
3115- <field name="subflow_id" ref="account.process_process_invoiceprocess0"/>
3116- <field eval="&quot;&quot;&quot;object.state=='draft'&quot;&quot;&quot;" name="model_states"/>
3117- <field eval="0" name="flow_start"/>
3118- </record>
3119- -->
3120-
3121- <!--
3122- Back Node in procurement process
3123- -->
3124-<!--
3125- <record id="sale.process_node_saleorderprocurement0" model="process.node">
3126- <field name="menu_id" ref="sale.menu_sale_order"/>
3127- <field name="model_id" ref="sale.model_sale_order"/>
3128- <field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
3129- <field eval="&quot;&quot;&quot;Field Order&quot;&quot;&quot;" name="name"/>
3130- <field eval="&quot;&quot;&quot;Drives procurement orders for every sales order line.&quot;&quot;&quot;" name="note"/>
3131- <field name="subflow_id" ref="sale.process_process_salesprocess0"/>
3132- <field name="process_id" ref="procurement.process_process_procurementprocess0"/>
3133- <field eval="&quot;&quot;&quot;object.state != False&quot;&quot;&quot;" name="model_states"/>
3134- <field eval="1" name="flow_start"/>
3135- </record>
3136- -->
3137- <!--
3138- <record id="sale.process_transition_saleorderprocurement0" model="process.transition">
3139- <field eval="[(6,0,[])]" name="transition_ids"/>
3140- <field eval="&quot;&quot;&quot;Procurement of sold material&quot;&quot;&quot;" name="name"/>
3141- <field eval="&quot;&quot;&quot;For every sales order line, a procurement order is created to supply the sold product.&quot;&quot;&quot;" name="note"/>
3142- <field model="process.node" name="target_node_id" ref="procurement.process_node_procureproducts0"/>
3143- <field model="process.node" name="source_node_id" ref="sale.process_node_saleorderprocurement0"/>
3144- </record>
3145- -->
3146
3147 <!--
3148 Back Node in account process
3149@@ -199,52 +134,6 @@
3150 <!--
3151 Process Condition
3152 -->
3153-<!--
3154- <record id="sale.process_condition_conditionafterdelivery0" model="process.condition">
3155- <field name="model_id" ref="sale.model_sale_order"/>
3156- <field name="node_id" ref="sale.process_node_invoiceafterdelivery0"/>
3157- <field eval="&quot;&quot;&quot;object.order_policy=='postpaid'&quot;&quot;&quot;" name="model_states"/>
3158- <field eval="&quot;&quot;&quot;condition_after_delivery&quot;&quot;&quot;" name="name"/>
3159- </record>
3160- -->
3161- <!--
3162- Process Transition
3163- -->
3164-<!--
3165- <record id="sale.process_transition_validatequotation0" model="process.transition">
3166- <field eval="[(6,0,[])]" name="transition_ids"/>
3167- <field eval="&quot;&quot;&quot;Confirm Field Order&quot;&quot;&quot;" name="name"/>
3168- <field eval="&quot;&quot;&quot;The salesman confirms the field order.&quot;&quot;&quot;" name="note"/>
3169- <field model="process.node" name="source_node_id" ref="sale.process_node_quotation0"/>
3170- <field model="process.node" name="target_node_id" ref="sale.process_node_saleorder0"/>
3171- <field eval="[(6,0,[ref('sale.trans_draft_router')])]" name="transition_ids"/>
3172- </record>
3173-
3174- <record id="sale.process_transition_confirmquotation0" model="process.transition">
3175- <field eval="[(6,0,[])]" name="transition_ids"/>
3176- <field eval="&quot;&quot;&quot;Validate Field Order&quot;&quot;&quot;" name="name"/>
3177- <field eval="&quot;&quot;&quot;The salesman validates the field order.&quot;&quot;&quot;" name="note"/>
3178- <field model="process.node" name="source_node_id" ref="sale.process_node_saleorder0"/>
3179- <field model="process.node" name="target_node_id" ref="sale.process_node_saleorder_confirm"/>
3180- <field eval="[(6,0,[ref('sale.trans_draft_router')])]" name="transition_ids"/>
3181- </record>
3182-
3183- <record id="sale.process_transition_so_confirm_done" model="process.transition">
3184- <field eval="[(6,0,[])]" name="transition_ids"/>
3185- <field eval="&quot;&quot;&quot;Close Field Order.&quot;&quot;&quot;" name="name"/>
3186- <field eval="&quot;&quot;&quot;Close Field Order.&quot;&quot;&quot;" name="note"/>
3187- <field model="process.node" name="source_node_id" ref="sale.process_node_saleorder_confirm"/>
3188- <field model="process.node" name="target_node_id" ref="sale.process_node_saleorder_done"/>
3189- <field eval="[(6,0,[ref('sale.trans_draft_router')])]" name="transition_ids"/>
3190- </record>
3191--->
3192- <record id="sale.process_transition_saleprocurement0" model="process.transition">
3193- <field eval="[(6,0,[])]" name="transition_ids"/>
3194- <field eval="&quot;&quot;&quot;Create Procurement Order&quot;&quot;&quot;" name="name"/>
3195- <field eval="&quot;&quot;&quot;A procurement order is automatically created as soon as a sales order is confirmed or as the invoice is paid. It drives the purchasing and the production of products regarding to the rules and to the sales order's parameters. &quot;&quot;&quot;" name="note"/>
3196- <field model="process.node" name="source_node_id" ref="sale.process_node_saleorder_confirm"/>
3197- <field model="process.node" name="target_node_id" ref="sale.process_node_saleprocurement0"/>
3198- </record>
3199
3200 <record id="sale.process_transition_packing0" model="process.transition">
3201 <field eval="[(6,0,[])]" name="transition_ids"/>
3202@@ -262,13 +151,6 @@
3203 <field model="process.node" name="target_node_id" ref="sale.process_node_deliveryorder0"/>
3204 </record>
3205
3206- <record id="sale.process_transition_sale_proc_tender" model="process.transition">
3207- <field eval="[(6,0,[])]" name="transition_ids"/>
3208- <field eval="&quot;&quot;&quot;From procurement to tender.&quot;&quot;&quot;" name="name"/>
3209- <field eval="&quot;&quot;&quot;From procurement to tender.&quot;&quot;&quot;" name="note"/>
3210- <field model="process.node" name="source_node_id" ref="sale.process_node_saleprocurement0"/>
3211- <field model="process.node" name="target_node_id" ref="sale.process_node_sale_tender"/>
3212- </record>
3213
3214 <record id="sale.process_transition_sale_tender_po" model="process.transition">
3215 <field eval="[(6,0,[])]" name="transition_ids"/>
3216@@ -278,108 +160,10 @@
3217 <field model="process.node" name="target_node_id" ref="sale.process_node_sale_po"/>
3218 </record>
3219
3220- <record id="sale.process_transition_sale_proc_po" model="process.transition">
3221- <field eval="[(6,0,[])]" name="transition_ids"/>
3222- <field eval="&quot;&quot;&quot;From procurement to po.&quot;&quot;&quot;" name="name"/>
3223- <field eval="&quot;&quot;&quot;From procurement to po.&quot;&quot;&quot;" name="note"/>
3224- <field model="process.node" name="source_node_id" ref="sale.process_node_saleprocurement0"/>
3225- <field model="process.node" name="target_node_id" ref="sale.process_node_sale_po"/>
3226- </record>
3227-<!--
3228- <record id="sale.process_transition_invoice0" model="process.transition">
3229- <field eval="[(6,0,[])]" name="transition_ids"/>
3230- <field eval="&quot;&quot;&quot;Create Invoice&quot;&quot;&quot;" name="name"/>
3231- <field eval="&quot;&quot;&quot;The Salesman creates an invoice manually, if the sales order shipping policy is 'Shipping and Manual in Progress'. The invoice is created automatically if the shipping policy is 'Payment before Delivery'.&quot;&quot;&quot;" name="note"/>
3232- <field model="process.node" name="source_node_id" ref="sale.process_node_saleorder_confirm"/>
3233- <field model="process.node" name="target_node_id" ref="sale.process_node_invoice0"/>
3234- <field eval="[(6,0,[ref('sale.trans_wait_invoice_invoice_manual')])]" name="transition_ids"/>
3235- </record>
3236- -->
3237-<!--
3238- <record id="sale.process_transition_invoiceafterdelivery0" model="process.transition">
3239- <field eval="[(6,0,[])]" name="transition_ids"/>
3240- <field eval="&quot;&quot;&quot;Create Invoice&quot;&quot;&quot;" name="name"/>
3241- <field eval="&quot;&quot;&quot;The invoice is created automatically if the shipping policy is 'Invoice from pick' or 'Invoice on order after delivery'.&quot;&quot;&quot;" name="note"/>
3242- <field model="process.node" name="source_node_id" ref="sale.process_node_packinglist0"/>
3243- <field model="process.node" name="target_node_id" ref="sale.process_node_invoiceafterdelivery0"/>
3244- </record>
3245- -->
3246
3247 <!--
3248 Process Action
3249 -->
3250-<!--
3251- <record id="sale.process_transition_action_confirm0" model="process.transition.action">
3252- <field eval="&quot;&quot;&quot;action_wait&quot;&quot;&quot;" name="action"/>
3253- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3254- <field eval="&quot;&quot;&quot;Confirm&quot;&quot;&quot;" name="name"/>
3255- <field name="transition_id" ref="sale.process_transition_confirmquotation0"/>
3256- </record>
3257-
3258- <record id="sale.process_transition_action_cancel0" model="process.transition.action">
3259- <field eval="&quot;&quot;&quot;action_cancel&quot;&quot;&quot;" name="action"/>
3260- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3261- <field eval="&quot;&quot;&quot;Cancel&quot;&quot;&quot;" name="name"/>
3262- <field name="transition_id" ref="sale.process_transition_confirmquotation0"/>
3263- </record>
3264-
3265- <record id="sale.process_transition_action_assign0" model="process.transition.action">
3266- <field eval="&quot;&quot;&quot;action_assign&quot;&quot;&quot;" name="action"/>
3267- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3268- <field eval="&quot;&quot;&quot;Assign&quot;&quot;&quot;" name="name"/>
3269- <field name="transition_id" ref="sale.process_transition_packing0"/>
3270- </record>
3271-
3272- <record id="sale.process_transition_action_forceassignation0" model="process.transition.action">
3273- <field eval="&quot;&quot;&quot;force_assign&quot;&quot;&quot;" name="action"/>
3274- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3275- <field eval="&quot;&quot;&quot;Force Assignation&quot;&quot;&quot;" name="name"/>
3276- <field name="transition_id" ref="sale.process_transition_packing0"/>
3277- </record>
3278-
3279- <record id="sale.process_transition_action_cancel1" model="process.transition.action">
3280- <field eval="&quot;&quot;&quot;action_cancel&quot;&quot;&quot;" name="action"/>
3281- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3282- <field eval="&quot;&quot;&quot;Cancel&quot;&quot;&quot;" name="name"/>
3283- <field name="transition_id" ref="sale.process_transition_packing0"/>
3284- </record>
3285-
3286- <record id="sale.process_transition_action_cancelassignation0" model="process.transition.action">
3287- <field eval="&quot;&quot;&quot;cancel_assign&quot;&quot;&quot;" name="action"/>
3288- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3289- <field eval="&quot;&quot;&quot;Cancel Assignation&quot;&quot;&quot;" name="name"/>
3290- <field name="transition_id" ref="sale.process_transition_deliver0"/>
3291- </record>
3292-
3293- <record id="sale.process_transition_action_validate0" model="process.transition.action">
3294- <field eval="&quot;&quot;&quot;test_finished&quot;&quot;&quot;" name="action"/>
3295- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3296- <field eval="&quot;&quot;&quot;Validate&quot;&quot;&quot;" name="name"/>
3297- <field name="transition_id" ref="sale.process_transition_deliver0"/>
3298- </record>
3299-
3300- <record id="sale.process_transition_action_cancel2" model="process.transition.action">
3301- <field eval="&quot;&quot;&quot;action_cancel&quot;&quot;&quot;" name="action"/>
3302- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3303- <field eval="&quot;&quot;&quot;Cancel&quot;&quot;&quot;" name="name"/>
3304- <field name="transition_id" ref="sale.process_transition_deliver0"/>
3305- </record>
3306-
3307- <record id="sale.process_transition_action_createinvoice0" model="process.transition.action">
3308- <field eval="&quot;&quot;&quot;action_invoice_create&quot;&quot;&quot;" name="action"/>
3309- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3310- <field eval="&quot;&quot;&quot;Create Invoice&quot;&quot;&quot;" name="name"/>
3311- <field name="transition_id" ref="sale.process_transition_invoice0"/>
3312- </record>
3313- -->
3314-<!--
3315- <record id="sale.process_transition_action_cancelorder0" model="process.transition.action">
3316- <field eval="&quot;&quot;&quot;action_cancel&quot;&quot;&quot;" name="action"/>
3317- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>
3318- <field eval="&quot;&quot;&quot;Cancel Order&quot;&quot;&quot;" name="name"/>
3319- <field name="transition_id" ref="sale.process_transition_invoice0"/>
3320- </record>
3321- -->
3322
3323 </data>
3324 </openerp>
3325
3326=== modified file 'bin/addons/msf_profile/__openerp__.py'
3327--- bin/addons/msf_profile/__openerp__.py 2017-09-28 14:05:02 +0000
3328+++ bin/addons/msf_profile/__openerp__.py 2020-03-16 11:13:19 +0000
3329@@ -16,7 +16,7 @@
3330 #
3331 # You should have received a copy of the GNU Affero General Public License
3332 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3333-#
3334+#
3335 ##############################################################################
3336 {
3337 "name" : "MSF Modules",
3338@@ -59,7 +59,6 @@
3339 "procurement_auto",
3340 "product_list",
3341 "product_attributes",
3342- "procurement_report",
3343 "msf_printed_documents",
3344 "procurement_request",
3345 "import_data",
3346@@ -75,7 +74,6 @@
3347 "msf_outgoing", # doit être installé après specific_rules
3348 "tender_flow",
3349 "consumption_calculation",
3350- "threshold_value",
3351 "account_hq_entries",
3352 "msf_config_locations",
3353 "service_purchasing",
3354
3355=== modified file 'bin/addons/msf_profile/data/patches.xml'
3356--- bin/addons/msf_profile/data/patches.xml 2020-02-14 16:19:08 +0000
3357+++ bin/addons/msf_profile/data/patches.xml 2020-03-16 11:13:19 +0000
3358@@ -491,12 +491,29 @@
3359 <field name="method">rec_entries_uf14_1_uf15</field>
3360 </record>
3361
3362+ <!-- UF15.3 -->
3363+ <record id="us_7147_reset_duplicate_proj_fxa" model="patch.scripts">
3364+ <field name="method">us_7147_reset_duplicate_proj_fxa</field>
3365+ </record>
3366+
3367 <!-- UF16.0 -->
3368 <record id="us_6692_new_od_journals" model="patch.scripts">
3369 <field name="method">us_6692_new_od_journals</field>
3370 </record>
3371
3372- <!-- UF17.0 -->
3373+ <record id="us_6684_push_backup" model="patch.scripts">
3374+ <field name="method">us_6684_push_backup</field>
3375+ </record>
3376+
3377+ <record id="us_7024_update_standard" model="patch.scripts">
3378+ <field name="method">us_7024_update_standard</field>
3379+ </record>
3380+
3381+ <record id="us_7181_add_oc_subscrpition_to_unidata_products" model="patch.scripts">
3382+ <field name="method">us_7181_add_oc_subscrpition_to_unidata_products</field>
3383+ </record>
3384+
3385+ <!-- UF16.1 -->
3386 <record id="us_7025_7039_fix_nr_empty_ins" model="patch.scripts">
3387 <field name="method">us_7025_7039_fix_nr_empty_ins</field>
3388 </record>
3389
3390=== modified file 'bin/addons/msf_profile/i18n/fr_MF.po'
3391--- bin/addons/msf_profile/i18n/fr_MF.po 2020-02-06 11:13:37 +0000
3392+++ bin/addons/msf_profile/i18n/fr_MF.po 2020-03-16 11:13:19 +0000
3393@@ -1234,7 +1234,7 @@
3394 msgid "msf.budget.line"
3395 msgstr "msf.budget.line"
3396
3397-#. modules: register_accounting, procurement_request, account_hq_entries, kit, specific_rules, msf_tools, msf_doc_import, return_claim, analytic_distribution, stock
3398+#. modules: register_accounting, procurement_request, account_hq_entries, kit, specific_rules, msf_tools, msf_doc_import, return_claim, analytic_distribution, stock, procurement_cycle
3399 #: field:hq.entries.split.lines,state_info:0
3400 #: report:addons/analytic_distribution/report/report_account_analytic_chart_export.mako:67
3401 #: code:addons/kit/wizard/substitute.py:666
3402@@ -1256,6 +1256,7 @@
3403 #: code:addons/specific_rules/wizard/stock_partial_move.py:164
3404 #: code:addons/stock/stock.py:2358
3405 #: code:addons/stock/stock.py:2360
3406+#: code:addons/procurement_cycle/replenishment.py:218
3407 #, python-format
3408 msgid "Info"
3409 msgstr "Info"
3410@@ -1712,8 +1713,11 @@
3411 msgid "Europe/Sarajevo"
3412 msgstr "Europe/Sarajevo"
3413
3414-#. module: procurement_report
3415+#. module: procurement_report, procurement_cycle
3416 #: field:procurement.rules.report,min_max_ok:0
3417+#: selection:replenishment.inventory.review.line,rule:0
3418+#: selection:replenishment.order_calc,rule:0
3419+#: selection:replenishment.segment,rule:0
3420 msgid "Min/Max"
3421 msgstr "Min/Max"
3422
3423@@ -3551,7 +3555,7 @@
3424 msgid "You cannot validate a PO line with 0.0 as price unit !"
3425 msgstr "You cannot validate a PO line with 0.0 as price unit !"
3426
3427-#. modules: mission_stock, product_attributes, consumption_calculation, procurement_report, stock
3428+#. modules: mission_stock, product_attributes, consumption_calculation, procurement_report, stock, procurement_cycle
3429 #: field:monthly.review.consumption.line,amc:0
3430 #: field:stock.mission.report.line,product_amc:0
3431 #: field:auto.supply.rules.report,amc:0
3432@@ -3569,6 +3573,7 @@
3433 #: code:addons/mission_stock/mission_stock.py:524
3434 #: report:addons/consumption_calculation/report/weekly_forecast_report_xls.mako:104
3435 #: report:addons/stock/report/products_situation_report_xls.mako:226
3436+#: field:replenishment.segment.line.amc,amc:0
3437 #, python-format
3438 msgid "AMC"
3439 msgstr "CMM"
3440@@ -5789,7 +5794,7 @@
3441 msgid "Search Real Kit Composition Item"
3442 msgstr "Rechercher l'Article de la Composition Réelle du Kit"
3443
3444-#. modules: process, financing_contract, account_hq_entries, account_override, product_attributes, base_report_designer, msf_accrual, return_claim, account_mcdb, stock_override, analytic, purchase_followup, msf_doc_import, stock, product, finance, msf_homere_interface, hr, register_accounting, base, product_list, msf_tools, procurement_report, purchase, account, msf_outgoing, vertical_integration, sale, sales_followup, procurement, sourcing, msf_audittrail, msf_supply_doc_export, consumption_calculation, specific_rules
3445+#. modules: process, financing_contract, account_hq_entries, account_override, product_attributes, base_report_designer, msf_accrual, return_claim, account_mcdb, stock_override, analytic, purchase_followup, msf_doc_import, stock, product, finance, msf_homere_interface, hr, register_accounting, base, product_list, msf_tools, procurement_report, purchase, account, msf_outgoing, vertical_integration, sale, sales_followup, procurement, sourcing, msf_audittrail, msf_supply_doc_export, consumption_calculation, specific_rules, procurement_cycle
3446 #: view:account.account.type:0
3447 #: field:account.account.type,note:0
3448 #: view:account.analytic.account:0
3449@@ -5912,6 +5917,17 @@
3450 #: report:addons/specific_rules/report/unconsistent_stock_report_xls.mako:93
3451 #: report:addons/msf_tools/report/report_stopped_products_xls.mako:80
3452 #: field:products.situation.report,p_desc:0
3453+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:366
3454+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:409
3455+#: report:addons/procurement_cycle/report/replenishment_segment.mako:330
3456+#: report:addons/procurement_cycle/report/replenishment_segment.mako:369
3457+#: field:replenishment.inventory.review.line,product_description:0
3458+#: field:replenishment.location.config,description:0
3459+#: field:replenishment.order_calc,description_seg:0
3460+#: field:replenishment.order_calc,location_config_description:0
3461+#: field:replenishment.order_calc.line,product_description:0
3462+#: field:replenishment.segment,description_seg:0
3463+#: field:replenishment.segment.line,product_description:0
3464 #, python-format
3465 msgid "Description"
3466 msgstr "Description"
3467@@ -8072,8 +8088,8 @@
3468 #. modules: msf_outgoing, stock
3469 #: view:shipment:0
3470 #: view:stock.picking:0
3471-msgid "Synchronization engine should confirm the delivery at the project reception, are you sure?"
3472-msgstr "Le moteur de synchro devrait Valider la livraison lors de la réception au projet, voulez-vous continuer ?"
3473+msgid "Synchronization engine should confirm the reception once recorded on the receiving instance, do you want to continue?"
3474+msgstr "Le moteur de synchronisation devrait confirmer la réception une fois enregistrée sur l'instance recevante, voulez-vous continuer ?"
3475
3476 #. module: account, base
3477 #: selection:res.partner.bank,state:0
3478@@ -8424,7 +8440,7 @@
3479 msgid "Either there are no moves linked to the picking or Accounting Journals are misconfigured!"
3480 msgstr "Soit les Journaux Comptables sont mal configurés, soit il n'y a pas de mouvement connexe à ce prélèvement !"
3481
3482-#. modules: tender_flow, financing_contract, msf_tools, 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, 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
3483+#. modules: tender_flow, financing_contract, msf_tools, 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, 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, procurement_cycle
3484 #: code:addons/msf_supply_doc_export/wizard/po_follow_up.py:106
3485 #: selection:msf.instance.cloud,state:0
3486 #: field:ppl.processor,draft_step2:0
3487@@ -8591,6 +8607,10 @@
3488 #: selection:wizard.account.invoice,counterpart_inv_status:0
3489 #: code:addons/stock_override/report/delivery_order.py:59
3490 #: view:res.request:0
3491+#: view:replenishment.order_calc:0
3492+#: selection:replenishment.order_calc,state:0
3493+#: view:replenishment.segment:0
3494+#: selection:replenishment.segment,state:0
3495 #, python-format
3496 msgid "Draft"
3497 msgstr "Brouillon"
3498@@ -9259,11 +9279,6 @@
3499 msgid "Advanced Reporting"
3500 msgstr "Rapports Avancés"
3501
3502-#. module: msf_outgoing
3503-#: view:shipment:0
3504-msgid "Validate Delivery"
3505-msgstr "Valider Livraison"
3506-
3507 #. module: stock
3508 #: help:stock.picking,date_done:0
3509 msgid "Date of Completion"
3510@@ -11389,7 +11404,7 @@
3511 msgid "Creation Month"
3512 msgstr "Creation Month"
3513
3514-#. modules: resource, finance, supplier_catalogue, msf_field_access_rights, msf_instance, msf_button_access_rights, msf_tools, analytic_distribution, financing_contract, sync_client, hr,res_currency_functional,msf_profile
3515+#. modules: resource, finance, supplier_catalogue, msf_field_access_rights, msf_instance, msf_button_access_rights, msf_tools, analytic_distribution, financing_contract, sync_client, hr,res_currency_functional,msf_profile, procurement_cycle
3516 #: view:financing.contract.donor:0
3517 #: view:msf.instance:0
3518 #: selection:msf.instance.cloud,state:0
3519@@ -11410,6 +11425,7 @@
3520 #: view:res.currency:0
3521 #: view:product.product:0
3522 #: view:res.request:0
3523+#: view:replenishment.location.config:0
3524 msgid "Inactive"
3525 msgstr "Inactif"
3526
3527@@ -13334,10 +13350,15 @@
3528 msgid "Please fix issue on red lines before confirm the inventory."
3529 msgstr "Please fix issue on red lines before confirm the inventory."
3530
3531-#. module: msf_doc_import
3532+#. module: msf_doc_import, procurement_cycle
3533 #: selection:wizard.import.in.line.simulation.screen,type_change:0
3534 #: selection:wizard.import.po.simulation.screen.line,type_change:0
3535 #: selection:wizard.simu.import.po.line,change_type:0
3536+#: code:addons/procurement_cycle/replenishment.py:920
3537+#: report:addons/procurement_cycle/report/replenishment_segment.mako:494
3538+#: selection:replenishment.inventory.review.line,status:0
3539+#: selection:replenishment.order_calc.line,status:0
3540+#: selection:replenishment.segment.line,status:0
3541 msgid "New"
3542 msgstr "Nouveau"
3543
3544@@ -15225,7 +15246,7 @@
3545 msgid "Other information"
3546 msgstr "Autre information"
3547
3548-#. modules: msf_outgoing, consumption_calculation, specific_rules, kit, msf_doc_import, return_claim
3549+#. modules: msf_outgoing, consumption_calculation, specific_rules, kit, msf_doc_import, return_claim, procurement_cycle
3550 #: view:real.average.consumption:0
3551 #: field:composition.item,hidden_perishable_mandatory:0
3552 #: field:kit.creation.to.consume,expiry_check_kit_creation_to_consume:0
3553@@ -15243,6 +15264,8 @@
3554 #: view:initial.stock.inventory:0
3555 #: field:stock.move.memory.in,exp_check:0
3556 #: field:stock.move.memory.out,exp_check:0
3557+#: field:replenishment.inventory.review.line.exp,exp_qty:0
3558+#: field:replenishment.inventory.review.line.exp.nocons,exp_qty:0
3559 msgid "Exp"
3560 msgstr "Exp"
3561
3562@@ -16578,6 +16601,10 @@
3563 #: code:addons/stock_override/report/report_stock_move.py:747
3564 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:160
3565 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:161
3566+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:945
3567+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:991
3568+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:439
3569+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:461
3570 #, python-format
3571 msgid "No"
3572 msgstr "Non"
3573@@ -24809,6 +24836,10 @@
3574 #: code:addons/stock_override/report/report_stock_move.py:747
3575 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:160
3576 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:161
3577+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:945
3578+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:991
3579+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:439
3580+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:461
3581 #, python-format
3582 msgid "Yes"
3583 msgstr "Oui"
3584@@ -26973,7 +27004,7 @@
3585 msgid "Total Volume[dm³]"
3586 msgstr "Volume Total [dm³]"
3587
3588-#. modules: purchase, account, msf_outgoing, sales_followup, procurement_auto, sale, product, specific_rules, kit, account_override, purchase_allocation_report, sourcing, order_types, stock_override, tender_flow, return_claim, purchase_followup, msf_doc_import, purchase_followup, purchase_compare_rfq, kit, stock_move_tracking, stock
3589+#. modules: purchase, account, msf_outgoing, sales_followup, procurement_auto, sale, product, specific_rules, kit, account_override, purchase_allocation_report, sourcing, order_types, stock_override, tender_flow, return_claim, purchase_followup, msf_doc_import, purchase_followup, purchase_compare_rfq, kit, stock_move_tracking, stock, procurement_cycle
3590 #: view:account.invoice.report:0
3591 #: field:account.invoice.report,product_qty:0
3592 #: field:wizard.split.invoice.lines,quantity:0
3593@@ -27030,6 +27061,7 @@
3594 #: report:addons/stock/report/stock_expired_damaged_report_xls.mako:221
3595 #: report:tracking.move.report:0
3596 #: report:addons/stock/report/stock_delivery_report_xls.mako:219
3597+#: field:replenishment.segment.line.amc.month_exp,quantity:0
3598 #, python-format
3599 msgid "Qty"
3600 msgstr "Qté"
3601@@ -28406,12 +28438,13 @@
3602 msgid "Included Fields"
3603 msgstr "Champs Inclus"
3604
3605-#. module: msf_outgoing
3606+#. module: msf_outgoing, procurement_cycle
3607 #: field:internal.move.processor,exp_check:0
3608 #: field:outgoing.delivery.move.processor,exp_check:0
3609 #: field:return.ppl.move.processor,exp_check:0
3610 #: field:stock.move.in.processor,exp_check:0
3611 #: field:stock.move.processor,exp_check:0
3612+#: field:replenishment.inventory.review.line,detail_exp_nocons:0
3613 msgid "Exp."
3614 msgstr "Exp."
3615
3616@@ -29161,6 +29194,8 @@
3617 #: field:auto.supply.rules.report,frequency_id:0
3618 #: field:order.cycle.rules.report,frequency_id:0
3619 #: field:threshold.value.rules.report,frequency_id:0
3620+#: field:replenishment.location.config,frequence_id:0
3621+#: field:replenishment.location.config,frequence_name:0
3622 msgid "Frequency"
3623 msgstr "Fréquence"
3624
3625@@ -29673,7 +29708,7 @@
3626 msgid "Certificate attached ?"
3627 msgstr "Certificat attaché ?"
3628
3629-#. modules: msf_supply_doc_export, sourcing, consumption_calculation, sale, sales_followup, msf_supply_doc_export, purchase, account_override, account, register_accounting, stock_override, purchase_override, tender_flow, base
3630+#. modules: msf_supply_doc_export, sourcing, consumption_calculation, sale, sales_followup, msf_supply_doc_export, purchase, account_override, account, register_accounting, stock_override, purchase_override, tender_flow, base, procurement_cycle
3631 #: field:po.follow.up,closed_ok:0
3632 #: selection:real.average.consumption,state:0
3633 #: selection:po.follow.up,state:0
3634@@ -29691,6 +29726,8 @@
3635 #: code:addons/stock_override/report/delivery_order.py:64
3636 #: view:res.request:0
3637 #: view:account.period:0
3638+#: view:replenishment.order_calc:0
3639+#: selection:replenishment.order_calc,state:0
3640 msgid "Closed"
3641 msgstr "Fermé"
3642
3643@@ -33149,8 +33186,8 @@
3644 #. module: msf_doc_import
3645 #: code:addons/msf_doc_import/wizard/wizard_po_simulation_screen.py:1492
3646 #, python-format
3647-msgid "The Origin is mandatory for a PO coming from a FO"
3648-msgstr "The Origin is mandatory for a PO coming from a FO"
3649+msgid "The Origin is mandatory for a PO coming from an FO/IR"
3650+msgstr "Le champ Origine est obligatoire pour BC venant d'une CdT/DI"
3651
3652 #. module: kit
3653 #: code:addons/kit/kit.py:807
3654@@ -33893,7 +33930,7 @@
3655 msgid "Asia/Hebron"
3656 msgstr "Asia/Hebron"
3657
3658-#. modules: purchase, account, msf_outgoing, account_mcdb, msf_homere_interface, res_currency_tables, sync_client, procurement_request, account_hq_entries, kit, account_override, base, msf_currency_revaluation, specific_rules, register_accounting, stock, sale, analytic_distribution
3659+#. modules: purchase, account, msf_outgoing, account_mcdb, msf_homere_interface, res_currency_tables, sync_client, procurement_request, account_hq_entries, kit, account_override, base, msf_currency_revaluation, specific_rules, register_accounting, stock, sale, analytic_distribution, procurement_cycle
3660 #: view:account.invoice:0
3661 #: view:hq.analytic.reallocation:0
3662 #: view:hq.entries.unsplit:0
3663@@ -33925,6 +33962,7 @@
3664 #: view:stock.cost.reevaluation:0
3665 #: view:physical.inventory.import.wizard:0
3666 #: view:sync.client.child_entity:0
3667+#: view:replenishment.order_calc:0
3668 msgid "Validate"
3669 msgstr "Valider"
3670
3671@@ -35108,13 +35146,16 @@
3672 msgid "Created by split PO"
3673 msgstr "Créé à partir du fractionnement du BC"
3674
3675-#. modules: purchase, sales_followup, msf_outgoing
3676+#. modules: purchase, sales_followup, msf_outgoing, out_step
3677 #: view:shipment:0
3678 #: selection:shipment,state:0
3679 #: field:purchase.order,shipped:0
3680 #: field:purchase.order,shipped_rate:0
3681 #: report:addons/sales_followup/report/ir_follow_up_location_report_xls.mako:283
3682 #: report:addons/sales_followup/report/sale_follow_up_multi_report_xls.mako:282
3683+#: code:addons/out_step/out_step.py:42
3684+#: selection:stock.picking,state_hidden:0
3685+#: view:stock.picking:0
3686 msgid "Received"
3687 msgstr "Reçu"
3688
3689@@ -37077,7 +37118,7 @@
3690 msgid "On Multiple Doc."
3691 msgstr "Sur Plusieurs Documents"
3692
3693-#. modules: tender_flow, financing_contract, product_asset, account_corrections, product_attributes, msf_accrual, analytic_override, sync_client, account_mcdb, res_currency_tables, procurement_request, stock_forecast, board, stock_override, msf_doc_import, stock, finance, msf_homere_interface, base, kit, stock_schedule, account, msf_outgoing, resource, msf_audittrail, stock_move_tracking, msf_supply_doc_export
3694+#. modules: tender_flow, financing_contract, product_asset, account_corrections, product_attributes, msf_accrual, analytic_override, sync_client, account_mcdb, res_currency_tables, procurement_request, stock_forecast, board, stock_override, msf_doc_import, stock, finance, msf_homere_interface, base, kit, stock_schedule, account, msf_outgoing, resource, msf_audittrail, stock_move_tracking, msf_supply_doc_export, procurement_cycle
3695 #: selection:account.aged.trial.balance,filter:0
3696 #: report:account.analytic.account.journal:0
3697 #: field:account.bank.statement,date:0
3698@@ -37189,6 +37230,8 @@
3699 #: report:addons/msf_audittrail/report/log_line_xls.mako:72
3700 #: report:tracking.move.report:0
3701 #: code:addons/msf_doc_import/wizard/wizard_import_ppl_to_create_ship.py:71
3702+#: field:replenishment.inventory.review.line.exp,date:0
3703+#: field:replenishment.inventory.review.line.pas,date:0
3704 #, python-format
3705 msgid "Date"
3706 msgstr "Date"
3707@@ -37293,7 +37336,7 @@
3708 msgid "Do reconfigure..."
3709 msgstr "Do reconfigure..."
3710
3711-#. modules: account, stock_override, supplier_catalogue, consumption_calculation, purchase_override, base, register_accounting, stock, analytic_distribution
3712+#. modules: account, stock_override, supplier_catalogue, consumption_calculation, purchase_override, base, register_accounting, stock, analytic_distribution, procurement_cycle
3713 #: field:account.analytic.chart,from_date:0
3714 #: field:account.chart,period_from:0
3715 #: field:project.account.analytic.line,from_date:0
3716@@ -37315,6 +37358,7 @@
3717 #: field:supplier.historical.catalogue,from_date:0
3718 #: field:stock.expired.damaged.report,date_from:0
3719 #: report:addons/stock_override/report/stock_card_report_xls.mako:112
3720+#: view:replenishment.segment:0
3721 msgid "From"
3722 msgstr "De"
3723
3724@@ -38095,7 +38139,7 @@
3725 msgid "The related entries feature can only be used with one Analytic Line."
3726 msgstr "La fonctionnalité des écritures associées ne peut être utilisée qu'avec une seule Ligne Analytique."
3727
3728-#. modules: purchase, account, finance, consumption_calculation, sale, account_override, base, board, stock
3729+#. modules: purchase, account, finance, consumption_calculation, sale, account_override, base, board, stock, procurement_cycle
3730 #: field:account.entries.report,month:0
3731 #: view:account.invoice.report:0
3732 #: field:account.invoice.report,month:0
3733@@ -38118,6 +38162,7 @@
3734 #: view:report.stock.move:0
3735 #: field:report.stock.move,month:0
3736 #: code:addons/consumption_calculation/weekly_forecast_report.py:418
3737+#: field:replenishment.segment.line.amc.month_exp,month:0
3738 msgid "Month"
3739 msgstr "Mois"
3740
3741@@ -40276,6 +40321,9 @@
3742 #: report:addons/stock/report/products_situation_report_xls.mako:218
3743 #: code:addons/stock_override/report/report_stock_move.py:759
3744 #: report:addons/stock/report/stock_delivery_report_xls.mako:218
3745+#: field:replenishment.inventory.review.line,uom_id:0
3746+#: field:replenishment.order_calc.line,uom_id:0
3747+#: field:replenishment.segment.line,uom_id:0
3748 #, python-format
3749 msgid "UoM"
3750 msgstr "UdM"
3751@@ -42486,10 +42534,11 @@
3752 msgid "Scrap Products"
3753 msgstr "Produits Rebut"
3754
3755-#. module: stock
3756+#. module: stock, msf_outgoing
3757 #: view:stock.picking:0
3758-msgid "Confirm Delivery"
3759-msgstr "Confirmer livraison"
3760+#: view:shipment:0
3761+msgid "Confirm Reception"
3762+msgstr "Confirmer la Réception"
3763
3764 #. module: base
3765 #: model:ir.model,name:base.model_ir_actions_server
3766@@ -43262,7 +43311,7 @@
3767 msgid "Contains Dangerous goods"
3768 msgstr "Contient des Produits Dangereux"
3769
3770-#. 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, product
3771+#. 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, product, procurement_cycle
3772 #: field:account.invoice.line,product_code:0
3773 #: code:addons/consumption_calculation/consumption_calculation.py:482
3774 #: report:addons/consumption_calculation/report/report_real_consumption_xls.mako:69
3775@@ -43339,6 +43388,11 @@
3776 #: code:addons/stock_override/report/report_stock_move.py:759
3777 #: report:addons/stock/report/stock_delivery_report_xls.mako:216
3778 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:143
3779+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:824
3780+#: field:replenishment.inventory.review.line,product_id:0
3781+#: field:replenishment.order_calc.line,product_id:0
3782+#: field:replenishment.product.list,default_code:0
3783+#: field:replenishment.segment.line,product_id:0
3784 #, python-format
3785 msgid "Product Code"
3786 msgstr "Code Produit"
3787@@ -44271,7 +44325,7 @@
3788 msgid "Sync order line DB ID"
3789 msgstr "Sync order line DB ID"
3790
3791-#. modules: msf_budget, msf_order_date, sync_client, stock_forecast, msf_homere_interface, procurement_request, consumption_calculation, purchase_override, account_hq_entries, sale, sales_followup, purchase_allocation_report, sourcing, purchase, specific_rules, msf_supply_doc_export, stock, analytic_distribution, document_done
3792+#. modules: msf_budget, msf_order_date, sync_client, stock_forecast, msf_homere_interface, procurement_request, consumption_calculation, purchase_override, account_hq_entries, sale, sales_followup, purchase_allocation_report, sourcing, purchase, specific_rules, msf_supply_doc_export, stock, analytic_distribution, document_done, procurement_cycle
3793 #: view:hq.entries:0
3794 #: view:account.commitment:0
3795 #: selection:account.commitment,state:0
3796@@ -44316,6 +44370,8 @@
3797 #: selection:sale.order.line,state_to_display:0
3798 #: selection:purchase.order.line,state_to_display:0
3799 #: field:po.follow.up,validated_ok:0
3800+#: view:replenishment.order_calc:0
3801+#: selection:replenishment.order_calc,state:0
3802 #, python-format
3803 msgid "Validated"
3804 msgstr "Validé"
3805@@ -47622,10 +47678,13 @@
3806 msgid "TVA :"
3807 msgstr "TVA :"
3808
3809-#. modules: sourcing, sale, product_attributes
3810+#. modules: sourcing, sale, product_attributes, procurement_cycle
3811 #: field:sale.report,product_code:0
3812 #: field:sale.order.line,product_code:0
3813 #: report:addons/product_attributes/report/standard_price_track_changes.mako:69
3814+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:408
3815+#: report:addons/procurement_cycle/report/replenishment_product_list.mako:124
3816+#: report:addons/procurement_cycle/report/replenishment_segment.mako:368
3817 msgid "Product code"
3818 msgstr "Code Produit"
3819
3820@@ -47994,7 +48053,7 @@
3821 msgid "B/S Move to 0 accounts"
3822 msgstr "Comptes de bilan à 0"
3823
3824-#. modules: product_attributes, consumption_calculation, procurement_report, mission_stock, stock
3825+#. modules: product_attributes, consumption_calculation, procurement_report, mission_stock, stock, procurement_cycle
3826 #: field:monthly.review.consumption.line,fmc:0
3827 #: field:wizard.export.fmc,fmc_id:0
3828 #: field:wizard.export.rac,rac_id:0
3829@@ -48014,6 +48073,7 @@
3830 #: code:addons/mission_stock/mission_stock.py:525
3831 #: report:addons/consumption_calculation/report/weekly_forecast_report_xls.mako:104
3832 #: report:addons/stock/report/products_situation_report_xls.mako:227
3833+#: view:replenishment.segment:0
3834 #, python-format
3835 msgid "FMC"
3836 msgstr "PCM"
3837@@ -49676,7 +49736,7 @@
3838 msgid "Code/Date"
3839 msgstr "Code/Date"
3840
3841-#. modules: procurement_auto, msf_doc_import, sync_so, specific_rules
3842+#. modules: procurement_auto, msf_doc_import, sync_so, specific_rules, procurement_cycle
3843 #: model:ir.model,name:msf_doc_import.model_stock_warehouse_automatic_supply
3844 #: model:ir.actions.act_window,name:procurement_auto.action_automatic_supply_tree
3845 #: model:ir.model,name:procurement_auto.model_stock_warehouse_automatic_supply
3846@@ -49684,6 +49744,9 @@
3847 #: view:stock.warehouse.automatic.supply:0
3848 #: model:ir.model,name:specific_rules.model_stock_warehouse_automatic_supply
3849 #: model:ir.model,name:sync_so.model_stock_warehouse_automatic_supply
3850+#: selection:replenishment.inventory.review.line,rule:0
3851+#: selection:replenishment.order_calc,rule:0
3852+#: selection:replenishment.segment,rule:0
3853 msgid "Automatic Supply"
3854 msgstr "Approvisionnement Automatique "
3855
3856@@ -53032,7 +53095,7 @@
3857 msgid "Ignore Exception"
3858 msgstr "Ignorer l'Exception"
3859
3860-#. modules: account, finance, msf_instance, register_accounting, sale, base, msf_tools, mission_stock, sync_client
3861+#. modules: account, finance, msf_instance, register_accounting, sale, base, msf_tools, mission_stock, sync_client, procurement_cycle
3862 #: view:account.bank.statement:0
3863 #: report:addons/account/report/account_liquidity_balance.mako:156
3864 #: field:workflow.workitem,inst_id:0
3865@@ -53058,6 +53121,12 @@
3866 #: field:operations.event,instance:0
3867 #: field:sync.monitor,instance_id:0
3868 #: field:sync.version.instance.monitor,instance_id:0
3869+#: field:replenishment.inventory.review.line.exp,instance_id:0
3870+#: field:replenishment.inventory.review.line.exp.nocons,instance_id:0
3871+#: field:replenishment.inventory.review.line.stock,instance_id:0
3872+#: field:replenishment.order_calc,instance_id:0
3873+#: field:replenishment.segment.date.generation,instance_id:0
3874+#: field:replenishment.segment.line.amc,instance_id:0
3875 msgid "Instance"
3876 msgstr "Instance"
3877
3878@@ -57813,7 +57882,7 @@
3879 msgid "Write-Off Journal"
3880 msgstr "Journal Ajustement"
3881
3882-#. modules: analytic_distribution_supply, financing_contract, account_hq_entries, account_override, product_attributes, account_journal, register_accounting, msf_accrual, sync_client, account_mcdb, supplier_catalogue, stock_schedule, procurement_request, unifield_setup, order_types, stock_override, msf_doc_import, analytic_distribution, msf_order_date, msf_cross_docking, msf_homere_interface, account_reconciliation, msf_instance, purchase_override, base, account_period_closing_level, msf_currency_revaluation, account_subscription, threshold_value, res_currency_functional, msf_budget, account_corrections, account, msf_outgoing, vertical_integration, sale, sales_followup, sourcing, purchase, product_list, consumption_calculation, stock, msf_profile, msf_config_locations, tender_flow, msf_partner, res_currency_tables, product, msf_tools
3883+#. modules: analytic_distribution_supply, financing_contract, account_hq_entries, account_override, product_attributes, account_journal, register_accounting, msf_accrual, sync_client, account_mcdb, supplier_catalogue, stock_schedule, procurement_request, unifield_setup, order_types, stock_override, msf_doc_import, analytic_distribution, msf_order_date, msf_cross_docking, msf_homere_interface, account_reconciliation, msf_instance, purchase_override, base, account_period_closing_level, msf_currency_revaluation, account_subscription, threshold_value, res_currency_functional, msf_budget, account_corrections, account, msf_outgoing, vertical_integration, sale, sales_followup, sourcing, purchase, product_list, consumption_calculation, stock, msf_profile, msf_config_locations, tender_flow, msf_partner, res_currency_tables, product, msf_tools, procurement_cycle
3884 #: code:addons/msf_doc_import/account.py:206
3885 #: code:addons/msf_doc_import/account.py:220
3886 #: code:addons/msf_doc_import/account.py:477
3887@@ -58208,6 +58277,9 @@
3888 #: code:addons/stock_override/wizard/change_dest_location.py:118
3889 #: selection:wizard.import.po.simulation.screen.line,type_change:0
3890 #: code:addons/sale/wizard/internal_request_import.py:731
3891+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:429
3892+#: field:replenishment.inventory.review.line,warning:0
3893+#: field:replenishment.order_calc.line,warning:0
3894 #, python-format
3895 msgid "Warning"
3896 msgstr "Avertissement"
3897@@ -58644,7 +58716,7 @@
3898 msgid "Scrap"
3899 msgstr "Rebuts"
3900
3901-#. modules: supplier_catalogue, procurement, base, procurement_report, msf_config_locations, stock
3902+#. modules: supplier_catalogue, procurement, base, procurement_report, msf_config_locations, stock, procurement_cycle
3903 #: view:ir.property:0
3904 #: model:ir.ui.menu,name:base.next_id_15
3905 #: view:stock.remove.location.wizard:0
3906@@ -58653,6 +58725,8 @@
3907 #: view:procurement.batch.cron:0
3908 #: view:supplier.historical.catalogue:0
3909 #: view:products.situation.report:0
3910+#: view:replenishment.order_calc:0
3911+#: view:replenishment.segment:0
3912 msgid "Parameters"
3913 msgstr "Paramètres"
3914
3915@@ -61378,6 +61452,12 @@
3916 #: code:addons/mission_stock/mission_stock.py:91
3917 #: code:addons/mission_stock/mission_stock.py:510
3918 #: report:addons/stock/report/stock_delivery_report_xls.mako:207
3919+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:336
3920+#: report:addons/procurement_cycle/report/replenishment_segment.mako:304
3921+#: field:replenishment.location.config,name:0
3922+#: field:replenishment.order_calc,name:0
3923+#: field:replenishment.product.list,name_seg:0
3924+#: field:replenishment.segment,name_seg:0
3925 #, python-format
3926 msgid "Reference"
3927 msgstr "Référence"
3928@@ -63520,11 +63600,12 @@
3929 msgid "Linked Supplier Info line"
3930 msgstr "Ligne d'Info sur Fournisseur Connexe"
3931
3932-#. modules: stock, msf_doc_import, product_attributes
3933+#. modules: stock, msf_doc_import, product_attributes, procurement_cycle
3934 #: field:physical.inventory.select.products,product_list:0
3935 #: field:msf.import.export,product_list_id:0
3936 #: code:addons/product_attributes/product_attributes.py:1580
3937 #: field:products.situation.report,product_list_id:0
3938+#: field:wizard.export.replenishment.product.list,list_id:0
3939 msgid "Product List"
3940 msgstr "Liste de Produits"
3941
3942@@ -66603,8 +66684,10 @@
3943 msgid "Nothing to reallocate"
3944 msgstr "Nothing to reallocate"
3945
3946-#. module: account
3947+#. module: account, procurement_cycle
3948 #: selection:account.subscription,period_type:0
3949+#: selection:replenishment.inventory.review,time_unit:0
3950+#: selection:replenishment.location.config,time_unit:0
3951 msgid "days"
3952 msgstr "jours"
3953
3954@@ -67257,7 +67340,7 @@
3955 msgid "Currency %s not found."
3956 msgstr "Devise %s non trouvée."
3957
3958-#. modules: product, consumption_calculation, sourcing, specific_rules, stock
3959+#. modules: product, consumption_calculation, sourcing, specific_rules, stock, procurement_cycle
3960 #: view:expiry.quantity.report:0
3961 #: selection:product.price.type,field:0
3962 #: field:product.product,qty_available:0
3963@@ -67268,6 +67351,11 @@
3964 #: field:stock.production.lot,stock_available:0
3965 #: report:addons/product/report/product_mass_update_export_xls.mako:115
3966 #: report:addons/stock/report/products_situation_report_xls.mako:223
3967+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:411
3968+#: report:addons/procurement_cycle/report/replenishment_segment.mako:380
3969+#: field:replenishment.inventory.review.line,real_stock:0
3970+#: field:replenishment.order_calc.line,real_stock:0
3971+#: field:replenishment.segment.line,real_stock:0
3972 msgid "Real Stock"
3973 msgstr "Stock Réel"
3974
3975@@ -68468,6 +68556,10 @@
3976 #: view:restrictive.country.setup:0
3977 #: view:product.mass.update:0
3978 #: field:products.situation.report,prod_ids:0
3979+#: field:replenishment.inventory.review,line_ids:0
3980+#: field:replenishment.order_calc,order_calc_line_ids:0
3981+#: view:replenishment.segment:0
3982+#: field:replenishment.segment,line_ids:0
3983 #, python-format
3984 msgid "Products"
3985 msgstr "Produits"
3986@@ -68736,7 +68828,7 @@
3987 msgid "No date at the first day of this month."
3988 msgstr "No date at the first day of this month."
3989
3990-#. modules: specific_rules, stock
3991+#. modules: specific_rules, stock, procurement_cycle
3992 #: field:unconsistent.stock.report.line,prodlot_id:0
3993 #: field:unconsistent.stock.report.line,prodlot_name:0
3994 #: view:physical.inventory:0
3995@@ -68746,6 +68838,7 @@
3996 #: field:stock.move,lot_check:0
3997 #: field:stock.production.lot,lot_check:0
3998 #: report:addons/specific_rules/report/unconsistent_stock_report_xls.mako:96
3999+#: field:replenishment.inventory.review.line.exp.nocons,batch_number:0
4000 msgid "BN"
4001 msgstr "NL"
4002
4003@@ -69401,6 +69494,9 @@
4004 #: field:procurement.rules.report,order_cycle_ok:0
4005 #: model:ir.model,name:specific_rules.model_stock_warehouse_order_cycle
4006 #: model:ir.model,name:sync_so.model_stock_warehouse_order_cycle
4007+#: selection:replenishment.inventory.review.line,rule:0
4008+#: selection:replenishment.order_calc,rule:0
4009+#: selection:replenishment.segment,rule:0
4010 msgid "Order Cycle"
4011 msgstr "Cycle de Commande"
4012
4013@@ -71551,6 +71647,13 @@
4014 #: view:res.users:0
4015 #: view:product.product:0
4016 #: view:res.request:0
4017+#: code:addons/procurement_cycle/replenishment.py:919
4018+#: report:addons/procurement_cycle/report/replenishment_segment.mako:494
4019+#: selection:replenishment.inventory.review.line,status:0
4020+#: view:replenishment.location.config:0
4021+#: field:replenishment.location.config,active:0
4022+#: selection:replenishment.order_calc.line,status:0
4023+#: selection:replenishment.segment.line,status:0
4024 #, python-format
4025 msgid "Active"
4026 msgstr "Actif"
4027@@ -75509,7 +75612,7 @@
4028 msgid "Kind of Node"
4029 msgstr "Sorte de Node"
4030
4031-#. modules: product, stock_override, order_nomenclature, consumption_calculation, product_asset, specific_rules, kit, stock_forecast, supplier_catalogue, product_list, tender_flow, msf_supply_doc_export, msf_doc_import, purchase_compare_rfq, sale, procurement_request, stock
4032+#. modules: product, stock_override, order_nomenclature, consumption_calculation, product_asset, specific_rules, kit, stock_forecast, supplier_catalogue, product_list, tender_flow, msf_supply_doc_export, msf_doc_import, purchase_compare_rfq, sale, procurement_request, stock, procurement_cycle
4033 #: code:addons/consumption_calculation/wizard/wizard_export_fmc_rac.py:39
4034 #: field:old.product.list.line,desc:0
4035 #: field:product.list.line,desc:0
4036@@ -75579,6 +75682,9 @@
4037 #: code:addons/stock_override/report/report_stock_move.py:759
4038 #: report:addons/stock/report/stock_delivery_report_xls.mako:217
4039 #: report:addons/product/report/product_ed_bn_mass_update_export_xls.mako:144
4040+#: report:addons/procurement_cycle/report/replenishment_product_list.mako:125
4041+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:825
4042+#: field:replenishment.product.list,product_description:0
4043 #, python-format
4044 msgid "Product Description"
4045 msgstr "Description Produit"
4046@@ -76904,7 +77010,7 @@
4047 msgid "Indicative Total Value"
4048 msgstr "Valeur totale"
4049
4050-#. modules: tender_flow, account_override, purchase_allocation_report, register_accounting, msf_accrual, stock_forecast, analytic, msf_supply_doc_export, stock, msf_order_date, sales_followup, consumption_calculation, purchase_override, specific_rules, kit, out_step, base, purchase, account, msf_outgoing, sale, procurement, sourcing, stock_override
4051+#. modules: tender_flow, account_override, purchase_allocation_report, register_accounting, msf_accrual, stock_forecast, analytic, msf_supply_doc_export, stock, msf_order_date, sales_followup, consumption_calculation, purchase_override, specific_rules, kit, out_step, base, purchase, account, msf_outgoing, sale, procurement, sourcing, stock_override, procurement_cycle
4052 #: selection:account.invoice,state:0
4053 #: selection:account.invoice.report,state:0
4054 #: selection:report.invoice.created,state:0
4055@@ -76975,6 +77081,10 @@
4056 #: view:shipment:0
4057 #: view:stock.picking:0
4058 #: view:sale.order:0
4059+#: view:replenishment.order_calc:0
4060+#: selection:replenishment.order_calc,state:0
4061+#: view:replenishment.segment:0
4062+#: selection:replenishment.segment,state:0
4063 #, python-format
4064 msgid "Cancelled"
4065 msgstr "Annulé"
4066@@ -80377,6 +80487,7 @@
4067 #. modules: procurement_auto, procurement_cycle
4068 #: view:stock.warehouse.automatic.supply:0
4069 #: view:stock.warehouse.order.cycle:0
4070+#: view:replenishment.location.config:0
4071 msgid "Change/Choose Frequency"
4072 msgstr "Changer/Choisir une Fréquence"
4073
4074@@ -80493,7 +80604,7 @@
4075 msgid "Donation Payable Account"
4076 msgstr "Compte Fournisseur Donation "
4077
4078-#. modules: account_override, vertical_integration, register_accounting, msf_tools, analytic_distribution, object_query, stock_forecast, base
4079+#. modules: account_override, vertical_integration, register_accounting, msf_tools, analytic_distribution, object_query, stock_forecast, base, procurement_cycle
4080 #: field:ir.exports.line,export_id:0
4081 #: field:object.query,export_id:0
4082 #: view:stock.forecast:0
4083@@ -80509,6 +80620,7 @@
4084 #: view:ocp.matching.export.wizard:0
4085 #: view:wizard.hq.report.oca:0
4086 #: view:wizard.hq.report.ocg:0
4087+#: view:wizard.export.replenishment.product.list:0
4088 msgid "Export"
4089 msgstr "Exporter"
4090
4091@@ -80569,8 +80681,9 @@
4092 msgid "A statement with manual entries becomes a draft statement."
4093 msgstr "Un relevé avec des écritures manuelles devient un relevé à l'état brouillon"
4094
4095-#. module: product_list
4096+#. module: product_list, procurement_cycle
4097 #: field:product.product,list_ids:0
4098+#: field:replenishment.product.list,list_ids:0
4099 msgid "Lists"
4100 msgstr "Listes"
4101
4102@@ -80725,8 +80838,8 @@
4103
4104 #. module: msf_homere_interface
4105 #: view:hr.expat.employee.import:0
4106-msgid "This wizard will import an Expat employees file in XML Spreadsheet 2003 format. To generate this file, create a Speadsheet with 3 columns: 'Name' , 'Code' and 'Active'."
4107-msgstr "This wizard will import an Expat employees file in XML Spreadsheet 2003 format. To generate this file, create a Speadsheet with 3 columns: 'Name' , 'Code' and 'Active'."
4108+msgid "This wizard will import an Expat employees file in XML Spreadsheet 2003 format. To generate this file, create a Spreadsheet with 4 columns: 'Name' , 'Code', 'Status' and 'Contract End Date' (optional)."
4109+msgstr "Cet assistant importera un fichier d'employés expatriés au format Tableur XML 2003. Pour générer ce fichier, créez une feuille de calcul avec 4 colonnes : 'Nom' , 'Code', 'Statut' et 'Date de Fin de Contrat' (optionnel)."
4110
4111 #. module: msf_outgoing
4112 #: model:ir.model,name:msf_outgoing.model_stock_move_memory_shipment_create
4113@@ -81379,7 +81492,7 @@
4114 msgid "Confirm the selected invoices"
4115 msgstr "Confirmer les factures sélectionnées"
4116
4117-#. modules: purchase, res_currency_tables,tender_flow, sync_client, account_mcdb, sales_followup, supplier_catalogue, sale, account, stock_forecast, export_import_lang, purchase_followup, msf_supply_doc_export, specific_rules, analytic_distribution, useability_dashboard_and_menu, procurement_request, out_step, consumption_calculation, stock_override, process, account_reconciliation, msf_instance, purchase_override, account_hq_entries, purchase_allocation_report, msf_tools, vertical_integration, msf_outgoing, register_accounting, documents_done, transport_mgmt, analytic, msf_audittrail, msf_doc_import, stock, msf_budget, msf_homere_interface, kit, hr, finance, financing_contract, update_client, account_override, base, return_claim, procurement
4118+#. modules: purchase, res_currency_tables,tender_flow, sync_client, account_mcdb, sales_followup, supplier_catalogue, sale, account, stock_forecast, export_import_lang, purchase_followup, msf_supply_doc_export, specific_rules, analytic_distribution, useability_dashboard_and_menu, procurement_request, out_step, consumption_calculation, stock_override, process, account_reconciliation, msf_instance, purchase_override, account_hq_entries, purchase_allocation_report, msf_tools, vertical_integration, msf_outgoing, register_accounting, documents_done, transport_mgmt, analytic, msf_audittrail, msf_doc_import, stock, msf_budget, msf_homere_interface, kit, hr, finance, financing_contract, update_client, account_override, base, return_claim, procurement, procurement_cycle
4119 #: view:account.bank.statement:0
4120 #: field:account.bank.statement,state:0
4121 #: field:account.entries.report,move_state:0
4122@@ -81585,6 +81698,9 @@
4123 #: report:addons/msf_supply_doc_export/report/report_purchase_order_xls.mako:83
4124 #: report:addons/msf_supply_doc_export/report/report_sale_order_xls.mako:82
4125 #: field:purchase.order.line,rfq_line_state_to_display:0
4126+#: field:replenishment.inventory.review,state:0
4127+#: field:replenishment.order_calc,state:0
4128+#: field:replenishment.segment,state:0
4129 #, python-format
4130 msgid "State"
4131 msgstr "Statut"
4132@@ -82148,7 +82264,7 @@
4133 " Si la 'Catégorie d'ordre' est 'Service' ou 'Transport', vous ne pouvez avoir un autre lieu que 'Service'\n"
4134 " "
4135
4136-#. modules: msf_field_access_rights, sync_client, msf_audittrail, msf_doc_import
4137+#. modules: msf_field_access_rights, sync_client, msf_audittrail, msf_doc_import, procurement_cycle
4138 #: field:audittrail.log.line,rule_id:0
4139 #: view:msf_field_access_rights.field_access_rule_line:0
4140 #: view:sync.client.update_to_send:0
4141@@ -82156,6 +82272,7 @@
4142 #: field:wizard.import.order.cycle.line,rule_id:0
4143 #: field:wizard.import.stock.warehouse.orderpoint.line,rule_id:0
4144 #: field:wizard.import.threshold.value.line,rule_id:0
4145+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:376
4146 msgid "Rule"
4147 msgstr "Règle"
4148
4149@@ -82512,6 +82629,7 @@
4150 #: field:internal.request.import.line,in_product:0
4151 #: field:product.mass.update.errors,product_id:0
4152 #: view:products.situation.report:0
4153+#: field:replenishment.product.list,product_id:0
4154 #, python-format
4155 msgid "Product"
4156 msgstr "Produit"
4157@@ -83057,10 +83175,11 @@
4158 msgid "The line must have either the line number or the external ref. set"
4159 msgstr "La ligne doit au minimum avoir le numéro de ligne ou la ref. externe"
4160
4161-#. modules: stock, mission_stock
4162+#. modules: stock, mission_stock, procurement_cycle
4163 #: field:stock.mission.report.line.location,location_name:0
4164 #: field:stock.location,complete_name:0
4165 #: field:stock.location,name:0
4166+#: view:replenishment.location.config:0
4167 msgid "Location Name"
4168 msgstr "Zone - Nom"
4169
4170@@ -83669,10 +83788,11 @@
4171 msgid "monthly.budget.wizard"
4172 msgstr "monthly.budget.wizard"
4173
4174-#. module: kit
4175+#. module: kit, procurement_cycle
4176 #: selection:composition.item,state:0
4177 #: view:composition.kit:0
4178 #: selection:composition.kit,state:0
4179+#: view:replenishment.segment:0
4180 msgid "Completed"
4181 msgstr "Terminé"
4182
4183@@ -86886,7 +87006,7 @@
4184 msgid "Contract ' starting date"
4185 msgstr "Date - Début de Contrat"
4186
4187-#. modules: procurement_request, supplier_catalogue, consumption_calculation, kit, msf_tools, msf_doc_import, stock, msf_profile
4188+#. modules: procurement_request, supplier_catalogue, consumption_calculation, kit, msf_tools, msf_doc_import, stock, msf_profile, procurement_cycle
4189 #: view:wizard.import.fmc:0
4190 #: field:wizard.import.fmc,file:0
4191 #: view:wizard.import.rac:0
4192@@ -86936,6 +87056,8 @@
4193 #: field:internal.request.import,file_to_import:0
4194 #: view:wizard.import.product.line:0
4195 #: field:wizard.import.product.line,file:0
4196+#: field:replenishment.order_calc,file_to_import:0
4197+#: field:replenishment.segment,file_to_import:0
4198 msgid "File to import"
4199 msgstr "Fichier à importer"
4200
4201@@ -87007,7 +87129,7 @@
4202 msgid "TbD"
4203 msgstr "À déf."
4204
4205-#. modules: account, stock_override, supplier_catalogue, consumption_calculation, register_accounting, base, stock, analytic_distribution, msf_supply_doc_export
4206+#. modules: account, stock_override, supplier_catalogue, consumption_calculation, register_accounting, base, stock, analytic_distribution, msf_supply_doc_export, procurement_cycle
4207 #: field:account.analytic.chart,to_date:0
4208 #: field:project.account.analytic.line,to_date:0
4209 #: field:partner.sms.send,mobile_to:0
4210@@ -87029,6 +87151,7 @@
4211 #: report:addons/msf_supply_doc_export/report/supplier_performance_report_xls.mako:215
4212 #: field:supplier.performance.wizard,date_to:0
4213 #: code:addons/stock_override/report/report_stock_move.py:740
4214+#: view:replenishment.segment:0
4215 msgid "To"
4216 msgstr "Au"
4217
4218@@ -88733,12 +88856,14 @@
4219 msgid "res.request"
4220 msgstr "res.request"
4221
4222-#. modules: msf_doc_import, msf_outgoing, product_list
4223+#. modules: msf_doc_import, msf_outgoing, product_list, procurement_cycle
4224 #: view:product.list:0
4225 #: view:stock.picking:0
4226 #: view:supplier.catalogue:0
4227 #: view:stock.incoming.processor:0
4228 #: view:product.list:0
4229+#: view:replenishment.order_calc:0
4230+#: view:replenishment.segment:0
4231 msgid "Import Lines"
4232 msgstr "Importer des Lignes"
4233
4234@@ -93810,12 +93935,13 @@
4235 msgid "Opening Cashbox"
4236 msgstr "Solde de Caisse à l'ouverture"
4237
4238-#. module: msf_instance, stock
4239+#. module: msf_instance, stock, procurement_cycle
4240 #: field:account.analytic.journal,is_current_instance:0
4241 #: field:account.analytic.journal.fake,is_current_instance:0
4242 #: field:account.journal,is_current_instance:0
4243 #: field:account.journal.fake,is_current_instance:0
4244 #: field:products.situation.report,instance_id:0
4245+#: view:replenishment.segment:0
4246 msgid "Current Instance"
4247 msgstr "Instance actuelle"
4248
4249@@ -94796,13 +94922,14 @@
4250 msgstr "%s from instance %s.\n"
4251 ""
4252
4253-#. modules: msf_doc_import, product_list, base
4254+#. modules: msf_doc_import, product_list, base, procurement_cycle
4255 #: view:wizard.add.users.synchronized:0
4256 #: view:product.list:0
4257 #: view:supplier.catalogue:0
4258 #: view:wizard.common.import.line:0
4259 #: model:ir.actions.act_window,name:product_list.action_add_product_in_list
4260 #: view:product.list:0
4261+#: view:replenishment.segment:0
4262 msgid "Add multiple products"
4263 msgstr "Ajouter plusieurs produits"
4264
4265@@ -95822,7 +95949,7 @@
4266 msgid "An error occurs during the reading of the file. Please contact an administrator and give him the import file and this error: %s"
4267 msgstr "An error occurs during the reading of the file. Please contact an administrator and give him the import file and this error: %s"
4268
4269-#. modules: sale, specific_rules, stock
4270+#. modules: sale, specific_rules, stock, procurement_cycle
4271 #: report:msf.report_reception_in:0
4272 #: field:unconsistent.stock.report.line,expiry_date:0
4273 #: view:physical.inventory:0
4274@@ -95832,6 +95959,7 @@
4275 #: field:stock.move,exp_check:0
4276 #: field:stock.production.lot,exp_check:0
4277 #: report:addons/specific_rules/report/unconsistent_stock_report_xls.mako:97
4278+#: field:replenishment.inventory.review.line.exp.nocons,life_date:0
4279 msgid "ED"
4280 msgstr "DE"
4281
4282@@ -96122,6 +96250,7 @@
4283 #. modules: procurement_cycle, procurement_report
4284 #: field:stock.warehouse.order.cycle,order_coverage:0
4285 #: field:order.cycle.rules.report,order_coverage:0
4286+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:837
4287 msgid "Order coverage"
4288 msgstr "Couverture de la Commande"
4289
4290@@ -96362,6 +96491,8 @@
4291 #: view:wizard.import.product.line:0
4292 #: view:hr.employee.activation:0
4293 #: selection:export.report.stock.move,state:0
4294+#: view:replenishment.order_calc:0
4295+#: view:replenishment.segment:0
4296 #, python-format
4297 msgid "Cancel"
4298 msgstr "Annuler"
4299@@ -97886,10 +98017,12 @@
4300 msgid "Available Shipped"
4301 msgstr "Disponible expédié"
4302
4303-#. module: product_attributes, product
4304+#. module: product_attributes, product, procurement_cycle
4305 #: selection:product.product,state_ud:0
4306 #: model:product.status,name:product_attributes.status_4
4307 #: selection:product.mass.update,product_state:0
4308+#: view:replenishment.segment:0
4309+#: selection:replenishment.segment,state:0
4310 msgid "Archived"
4311 msgstr "Archivé"
4312
4313@@ -102210,9 +102343,13 @@
4314 msgid "Number of"
4315 msgstr "Nombre de"
4316
4317-#. module: consumption_calculation, msf_tools
4318+#. module: consumption_calculation, msf_tools, procurement_cycle
4319 #: code:addons/consumption_calculation/weekly_forecast_report.py:510
4320 #: report:addons/msf_tools/report/report_stopped_products_xls.mako:100
4321+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:844
4322+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:412
4323+#: field:replenishment.inventory.review.line,pipeline_qty:0
4324+#: field:replenishment.order_calc.line,pipeline_qty:0
4325 #, python-format
4326 msgid "Pipeline Qty"
4327 msgstr "Qté en attente"
4328@@ -103422,9 +103559,12 @@
4329 msgid "Ready to ship"
4330 msgstr "Prêt à être Expédié"
4331
4332-#. module: msf_outgoing
4333+#. module: msf_outgoing, out_step, reason_types_moves
4334 #: view:shipment:0
4335 #: selection:shipment,state:0
4336+#: code:addons/out_step/out_step.py:38
4337+#: selection:stock.picking,state_hidden:0
4338+#: view:stock.picking:0
4339 msgid "Dispatched"
4340 msgstr "Expédié"
4341
4342@@ -103619,8 +103759,10 @@
4343 msgid "from now"
4344 msgstr "depuis aujourd'hui"
4345
4346-#. module: consumption_calculation
4347+#. module: consumption_calculation, procurement_cycle
4348 #: report:addons/consumption_calculation/report/weekly_forecast_report_xls.mako:98
4349+#: selection:replenishment.inventory.review,time_unit:0
4350+#: selection:replenishment.location.config,time_unit:0
4351 msgid "months"
4352 msgstr "mois"
4353
4354@@ -103635,8 +103777,10 @@
4355 msgid "requested"
4356 msgstr "souhaitée"
4357
4358-#. module: consumption_calculation
4359+#. module: consumption_calculation, procurement_cycle
4360 #: report:addons/consumption_calculation/report/weekly_forecast_report_xls.mako:98
4361+#: selection:replenishment.inventory.review,time_unit:0
4362+#: selection:replenishment.location.config,time_unit:0
4363 msgid "weeks"
4364 msgstr "semaines"
4365
4366@@ -105203,8 +105347,9 @@
4367 msgid "Non-Deactivable Products"
4368 msgstr "Produits Non-Désactivables"
4369
4370-#. module: product
4371+#. module: product, procurement_cycle
4372 #: view:product.mass.update:0
4373+#: model:ir.actions.act_window,name:procurement_cycle.action_replenishment_product_list
4374 msgid "Export Product List"
4375 msgstr "Exporter la Liste des Produits"
4376
4377@@ -106353,17 +106498,13 @@
4378 msgstr "%s non trouvé"
4379
4380 #. module: sync_client
4381-#: field:backup.config,continuous_backup_enabled:0
4382-msgid "Activate continuous backup"
4383-msgstr "Activer la sauvegarde continue"
4384-
4385-#. module: sync_client
4386 #: field:backup.config,basebackup_error:0
4387 msgid "Base backup error"
4388 msgstr "Erreur Sauvegarde Base"
4389
4390 #. module: sync_client
4391 #: view:backup.config:0
4392+#: selection:backup.config,backup_type:0
4393 msgid "Continuous Backup"
4394 msgstr "Sauvegarde Continue"
4395
4396@@ -106452,11 +106593,8 @@
4397
4398 #. module: sync_client
4399 #: view:backup.config:0
4400-msgid ""
4401-"Replace the 3 occurences of \"C:\\\\WAL\\\\\" with the path to the local WAL"
4402-" Archive directory."
4403-msgstr "Remplacer les 3 occurrences de \"C:\\\\WAL\\\\\" par votre répertoire local"
4404-" des archives WAL"
4405+msgid "Replace the 3 occurences of \"C:\\\\WAL\\\\\" with the path to the local WAL Archive directory."
4406+msgstr "Remplacer les 3 occurrences de \"C:\\\\WAL\\\\\" par votre répertoire local des archives WAL"
4407
4408 #. module: sync_client
4409 #: view:backup.config:0
4410@@ -106914,3 +107052,1936 @@
4411 #: field:composition.item,item_kit_name:0
4412 msgid "Kit Product Code"
4413 msgstr "Code Produit du Kit"
4414+
4415+#. module: sync_client
4416+#: field:backup.config,backup_type:0
4417+msgid "Backup Type"
4418+msgstr "Type de Sauvegarde"
4419+
4420+#. module: sync_client
4421+#: selection:backup.config,backup_type:0
4422+msgid "Direct push to Sharepoint"
4423+msgstr "Envoi direct sur Sharepoint"
4424+
4425+#. module: sync_client
4426+#: field:sync.client.entity,previous_hw:0
4427+msgid "Last HW successfully used"
4428+msgstr "Dernier HW validé"
4429+
4430+#. module: base
4431+#: field:ir.cron,manual_activation:0
4432+msgid "Manual Activation"
4433+msgstr "Activation Manuelle"
4434+
4435+#. module: sync_client
4436+#: view:backup.config:0
4437+msgid "Type of Backup"
4438+msgstr "Type de Sauvegarde"
4439+
4440+#. module: base
4441+#: help:ir.cron,manual_activation:0
4442+msgid "Used to set active as RO"
4443+msgstr "Utilisé pour passer le champ Actif en lecture seule"
4444+
4445+#. module: procurement_cycle
4446+#: code:addons/procurement_cycle/replenishment.py:1030
4447+#, python-format
4448+msgid "%d line(s) created, %d line(s) updated"
4449+msgstr "%d ligne(s) créée(s), %d ligne(s) mise(s) à jour"
4450+
4451+#. module: procurement_cycle
4452+#: code:addons/procurement_cycle/replenishment.py:1027
4453+#, python-format
4454+msgid "%d line(s) created, %d line(s) updated, %d line(s) in error"
4455+msgstr "%d ligne(s) créée(s), %d ligne(s) mise(s) à jour, %d ligne(s) en erreur"
4456+
4457+#. module: procurement_cycle
4458+#: code:addons/procurement_cycle/replenishment.py:1764
4459+#, python-format
4460+msgid "%d line(s) updated"
4461+msgstr "%d ligne(s) mise(s) à jour"
4462+
4463+#. module: procurement_cycle
4464+#: code:addons/procurement_cycle/replenishment.py:1761
4465+#, python-format
4466+msgid "%d line(s) updated, %d line(s) in error"
4467+msgstr "%d ligne(s) mise(s) à jour, %d ligne(s) en erreur"
4468+
4469+#. module: procurement_cycle
4470+#: code:addons/procurement_cycle/replenishment.py:158
4471+#, python-format
4472+msgid "%s : location %s already used in %s"
4473+msgstr "%s : zone %s déjà utilisée dans %s"
4474+
4475+#. module: procurement_cycle
4476+#: code:addons/procurement_cycle/replenishment.py:1796
4477+#, python-format
4478+msgid "%s created from %s"
4479+msgstr "%s créé depuis %s"
4480+
4481+#. module: procurement_cycle
4482+#: code:addons/procurement_cycle/replenishment.py:1309
4483+#, python-format
4484+msgid "%s, FMC FROM %d is not set, you can't have gap in FMC (%s is set)"
4485+msgstr "%s, PCM DE %s n'est pas renseigné, les périodes doivent être continues (%s renseigné)"
4486+
4487+#. module: procurement_cycle
4488+#: code:addons/procurement_cycle/replenishment.py:1328
4489+#, python-format
4490+msgid "%s, FMC FROM %d must be a day after FMC TO %d"
4491+msgstr "%s, PCM DE %d doit être le jour d'après PCM TO %d"
4492+
4493+#. module: procurement_cycle
4494+#: code:addons/procurement_cycle/replenishment.py:1330
4495+#, python-format
4496+msgid "%s, FMC FROM %d must be later than FMC TO %d"
4497+msgstr "%s, PCM DE %s doit être après PCM À %s"
4498+
4499+#. module: procurement_cycle
4500+#: code:addons/procurement_cycle/replenishment.py:1313
4501+#, python-format
4502+msgid "%s, FMC FROM %d must start the 1st day of the month"
4503+msgstr "%s, PCM DE %s doit être le 1er jour du mois"
4504+
4505+#. module: procurement_cycle
4506+#: code:addons/procurement_cycle/replenishment.py:1318
4507+#, python-format
4508+msgid "%s, FMC TO %d can't be empty if FMC from is set"
4509+msgstr "%s, PCM À %d ne peut pas être vide si PCM DE est renseigné"
4510+
4511+#. module: procurement_cycle
4512+#: code:addons/procurement_cycle/replenishment.py:1324
4513+#, python-format
4514+msgid "%s, FMC TO %d must be later than FMC FROM"
4515+msgstr "%s, PCM À %d doit être plus tard que PCM DE"
4516+
4517+#. module: procurement_cycle
4518+#: code:addons/procurement_cycle/replenishment.py:1322
4519+#, python-format
4520+msgid "%s, FMC TO %d must be the last day of the month"
4521+msgstr "%s, PCM DE %d doit être le dernier jour du mois"
4522+
4523+#. module: procurement_cycle
4524+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:847
4525+msgid "(RR-AMC) Projected stock"
4526+msgstr "(RR-CMM) Stock Projeté"
4527+
4528+#. module: procurement_cycle
4529+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:846
4530+msgid "(RR-FMC)Projected stock Qty"
4531+msgstr "(RR-PCM) Qté projetée du stock"
4532+
4533+#. module: procurement_cycle
4534+#: constraint:replenishment.segment.line:0
4535+msgid "A product in a location may only belong to one segment."
4536+msgstr "Un produit dans une zone ne peut appartenir qu'à un seul segment."
4537+
4538+#. module: procurement_cycle
4539+#: view:replenishment.segment:0
4540+msgid "AMC Locations"
4541+msgstr "Zones CMM"
4542+
4543+#. module: procurement_cycle
4544+#: field:replenishment.segment,amc_location_txt:0
4545+msgid "AMC locations"
4546+msgstr "Zones CMM"
4547+
4548+#. module: procurement_cycle
4549+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:427
4550+#: field:replenishment.order_calc.line,agreed_order_qty:0
4551+msgid "Agreed Order Qty"
4552+msgstr "Qté de Commande Convenue"
4553+
4554+#. module: procurement_cycle
4555+#: code:addons/procurement_cycle/replenishment.py:1804
4556+#, python-format
4557+msgid "Agreed Order Qty can't be blank, fix the following:\n"
4558+"%s"
4559+msgstr "Qté Convenue ne peut pas être vide, corrigez les lignes:\n"
4560+"%s"
4561+
4562+#. module: procurement_cycle
4563+#: code:addons/procurement_cycle/replenishment.py:760
4564+#, python-format
4565+msgid "Alert: \"inventory <= Min\""
4566+msgstr "Alerte: \"inventaire <= Min\""
4567+
4568+#. module: procurement_cycle
4569+#: code:addons/procurement_cycle/replenishment.py:758
4570+#, python-format
4571+msgid "Alert: \"inventory – batches expiring before ETA <= Min\""
4572+msgstr "Alerte: \"inventaire - lots expirants avant TAE <= Min\""
4573+
4574+#. module: procurement_cycle
4575+#: view:replenishment.segment:0
4576+msgid "Archive"
4577+msgstr "Archiver"
4578+
4579+#. module: procurement_cycle
4580+#: report:addons/procurement_cycle/report/replenishment_segment.mako:378
4581+msgid "Auto Supply Qty"
4582+msgstr "Qté Réappro Auto"
4583+
4584+#. module: procurement_cycle
4585+#: field:replenishment.inventory.review.line,auto_qty:0
4586+#: field:replenishment.segment.line,auto_qty:0
4587+msgid "Auto. Supply Qty"
4588+msgstr "Qté réappro. auto"
4589+
4590+#. module: procurement_cycle
4591+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:833
4592+msgid "Automatic Supply order qty"
4593+msgstr "Qté d'appro auto"
4594+
4595+#. module: procurement_cycle
4596+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:839
4597+msgid "Buffer (Qty)"
4598+msgstr "Tampon (Qté)"
4599+
4600+#. module: procurement_cycle
4601+#: report:addons/procurement_cycle/report/replenishment_segment.mako:373
4602+#: field:replenishment.inventory.review.line,buffer_qty:0
4603+#: field:replenishment.segment.line,buffer_qty:0
4604+msgid "Buffer Qty"
4605+msgstr "Qté Tampon"
4606+
4607+#. module: procurement_cycle
4608+#: help:replenishment.segment,date_next_order_received:0
4609+msgid "Calculated according to last order RDDate + OC."
4610+msgstr "Calculé en fonction du DLS de la dernière commande + CC"
4611+
4612+#. module: procurement_cycle
4613+#: view:replenishment.segment:0
4614+msgid "Cancel Segment and Order Calc."
4615+msgstr "Annuler Segment et Calculs"
4616+
4617+#. module: procurement_cycle
4618+#: view:replenishment.segment:0
4619+msgid "Chronogram"
4620+msgstr "Chronogramme"
4621+
4622+#. module: procurement_cycle
4623+#: field:replenishment.order_calc,comments:0
4624+msgid "Comments"
4625+msgstr "Commantaires"
4626+
4627+#. module: procurement_cycle
4628+#: selection:replenishment.inventory.review,state:0
4629+#: view:replenishment.segment:0
4630+#: selection:replenishment.segment,state:0
4631+msgid "Complete"
4632+msgstr "Complet"
4633+
4634+#. module: procurement_cycle
4635+#: view:replenishment.segment:0
4636+msgid "Compute Data"
4637+msgstr "Calcul des données"
4638+
4639+#. module: procurement_cycle
4640+#: field:replenishment.segment.date.generation,amc_date:0
4641+msgid "Date AMC/Stock Data"
4642+msgstr "Date calcul CMM/Stock"
4643+
4644+#. module: procurement_cycle
4645+#: field:replenishment.segment.date.generation,full_date:0
4646+msgid "Date Full Data (exp.)"
4647+msgstr "Date données complètes (exp.)"
4648+
4649+#. module: procurement_cycle
4650+#: field:replenishment.order_calc,new_order_reception_date:0
4651+msgid "Date new order reception date"
4652+msgstr "Date Réception de la nouvelle commande"
4653+
4654+#. module: procurement_cycle
4655+#: field:replenishment.order_calc,next_generation_date:0
4656+msgid "Date next order to be generated by"
4657+msgstr "Date à laquelle la prochaine commande doit être générée"
4658+
4659+#. module: procurement_cycle
4660+#: field:replenishment.segment,date_next_order_validated:0
4661+msgid "Date next order to be validated by"
4662+msgstr "Date de validation de la prochaine commande"
4663+
4664+#. module: procurement_cycle
4665+#: field:replenishment.order_calc,ir_generation_date:0
4666+msgid "Date of IR generation"
4667+msgstr "Date de génération DI"
4668+
4669+#. module: procurement_cycle
4670+#: field:replenishment.segment.line.amc,name:0
4671+msgid "Date of last Generation"
4672+msgstr "Date de dernière génération"
4673+
4674+#. module: procurement_cycle
4675+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:857
4676+msgid "Date to start preparing the next order"
4677+msgstr "Date de début de préparation de la prochaine commande"
4678+
4679+#. module: procurement_cycle
4680+#: field:replenishment.segment,date_preparing:0
4681+msgid "Date to start preparing the order"
4682+msgstr "Date de début de préparation de la commande"
4683+
4684+#. module: procurement_cycle
4685+#: field:replenishment.inventory.review.line,unit_of_supply_amc:0
4686+msgid "Days/weeks/months of supply (RR-AMC)"
4687+msgstr "Jours/Semaines/Mois d'appro (RR-CMM)"
4688+
4689+#. module: procurement_cycle
4690+#: field:replenishment.inventory.review.line,unit_of_supply_fmc:0
4691+msgid "Days/weeks/months of supply (RR-FMC)"
4692+msgstr "Jours/semaines/mois d'appro (RR-PCM)"
4693+
4694+#. module: procurement_cycle
4695+#: field:replenishment.location.config,is_current_instance:0
4696+msgid "Defined in the instance"
4697+msgstr "Définie dans l'instance"
4698+
4699+#. module: procurement_cycle
4700+#: sql_constraint:replenishment.location.config:0
4701+msgid "Description must be unique"
4702+msgstr "La Description doit être unique"
4703+
4704+#. module: procurement_cycle
4705+#: view:replenishment.location.config:0
4706+msgid "Display Inventory Review"
4707+msgstr "Afficher la Revue d'Inventaire"
4708+
4709+#. module: procurement_cycle
4710+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:715
4711+msgid "Display durations in"
4712+msgstr "Afficher les durées en"
4713+
4714+#. module: procurement_cycle
4715+#: field:replenishment.inventory.review,time_unit:0
4716+msgid "Display variable durations in"
4717+msgstr "Afficher les durées en"
4718+
4719+#. module: procurement_cycle
4720+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:856
4721+msgid "ETA date of next incoming delivery"
4722+msgstr "TAE du prochain arrivage"
4723+
4724+#. module: procurement_cycle
4725+#: field:replenishment.inventory.review.line,eta_for_next_pipeline:0
4726+#: field:replenishment.order_calc.line,eta_for_next_pipeline:0
4727+msgid "ETA for Next Pipeline"
4728+msgstr "TAE du prochain pipeline"
4729+
4730+#. module: procurement_cycle
4731+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:413
4732+msgid "Eta For next Pipeline"
4733+msgstr "TAE du prochain arrivage"
4734+
4735+#. module: procurement_cycle
4736+#: view:replenishment.inventory.review:0
4737+msgid "Exp before ETA"
4738+msgstr "Exp. avant TAE"
4739+
4740+#. module: procurement_cycle
4741+#: field:replenishment.inventory.review.line,detail_ids:0
4742+msgid "Exp by month"
4743+msgstr "Exp. par mois"
4744+
4745+#. module: procurement_cycle
4746+#: model:ir.model,name:procurement_cycle.model_replenishment_inventory_review_line_exp
4747+#: model:ir.model,name:procurement_cycle.model_replenishment_inventory_review_line_exp_nocons
4748+msgid "Exp by month / instance"
4749+msgstr "Exp. par mois / instance"
4750+
4751+#. module: procurement_cycle
4752+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:422
4753+msgid "Expired Qty Before Cons"
4754+msgstr "Qté expirées avant conso"
4755+
4756+#. module: procurement_cycle
4757+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:424
4758+msgid "Expired Qty Before ETA"
4759+msgstr "Qté Expirées avant TAE"
4760+
4761+#. module: procurement_cycle
4762+#: field:replenishment.order_calc.line,expired_qty_before_eta:0
4763+msgid "Expired Qty before ETA"
4764+msgstr "Qtés Expirées avant TAE"
4765+
4766+#. module: procurement_cycle
4767+#: field:replenishment.segment.line.amc,expired_before_rdd:0
4768+msgid "Expired Qty before RDD"
4769+msgstr "Qté Expirées avant DLS"
4770+
4771+#. module: procurement_cycle
4772+#: field:replenishment.inventory.review.line,expired_qty_before_cons:0
4773+#: field:replenishment.order_calc.line,expired_qty_before_cons:0
4774+msgid "Expired Qty before cons."
4775+msgstr "Qté expirées avant conso."
4776+
4777+#. module: procurement_cycle
4778+#: field:replenishment.segment.line.amc,expired_between_rdd_oc:0
4779+msgid "Expired Qty between RDD and OC"
4780+msgstr "Qté expirées entre DLS et CC"
4781+
4782+#. module: procurement_cycle
4783+#: field:replenishment.inventory.review.line.exp,expiry_line_id:0
4784+#: field:replenishment.segment.line.amc.month_exp,expiry_line_id:0
4785+msgid "Expiry Line"
4786+msgstr "Ligne d'expirées"
4787+
4788+#. module: procurement_cycle
4789+#: view:wizard.export.replenishment.product.list:0
4790+msgid "Export Product List Consistency Report"
4791+msgstr "Rapport de cohérence de la liste des produits"
4792+
4793+#. module: procurement_cycle
4794+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:835
4795+msgid "External LT (days)"
4796+msgstr "Délai Externe (jours)"
4797+
4798+#. module: procurement_cycle
4799+#: field:replenishment.inventory.review.line,external_lt:0
4800+msgid "External LT)"
4801+msgstr "Délai Externe"
4802+
4803+#. module: procurement_cycle
4804+#: field:replenishment.segment,external_lt:0
4805+msgid "External Lead Time (days)"
4806+msgstr "Délai Externe (jours)"
4807+
4808+#. module: procurement_cycle
4809+#: code:addons/procurement_cycle/replenishment.py:1383
4810+#, python-format
4811+msgid "FMC FROM %s must be the first day of the month"
4812+msgstr "PCM DE %s doit être le 1er jour du mois"
4813+
4814+#. module: procurement_cycle
4815+#: code:addons/procurement_cycle/replenishment.py:1386
4816+#, python-format
4817+msgid "FMC TO %s must be the last day of the month"
4818+msgstr "PCM A %s doit être le dernier jour du mois"
4819+
4820+#. module: procurement_cycle
4821+#: constraint:replenishment.segment.line:0
4822+msgid "FMC is invalid"
4823+msgstr "PCM invalide"
4824+
4825+#. module: procurement_cycle
4826+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:636
4827+#: field:replenishment.inventory.review,final_date_projection:0
4828+msgid "Final day of projection"
4829+msgstr "Denier jour de la projection"
4830+
4831+#. module: procurement_cycle
4832+#: report:addons/procurement_cycle/report/replenishment_segment.mako:388
4833+msgid "From %d"
4834+msgstr "De %d"
4835+
4836+#. module: procurement_cycle
4837+#: field:replenishment.segment.line,rr_fmc_from_1:0
4838+msgid "From 1"
4839+msgstr "De 1"
4840+
4841+#. module: procurement_cycle
4842+#: field:replenishment.segment.line,rr_fmc_from_10:0
4843+msgid "From 10"
4844+msgstr "De 10"
4845+
4846+#. module: procurement_cycle
4847+#: field:replenishment.segment.line,rr_fmc_from_11:0
4848+msgid "From 11"
4849+msgstr "De 11"
4850+
4851+#. module: procurement_cycle
4852+#: field:replenishment.segment.line,rr_fmc_from_12:0
4853+msgid "From 12"
4854+msgstr "De 12"
4855+
4856+#. module: procurement_cycle
4857+#: field:replenishment.segment.line,rr_fmc_from_2:0
4858+msgid "From 2"
4859+msgstr "De 2"
4860+
4861+#. module: procurement_cycle
4862+#: field:replenishment.segment.line,rr_fmc_from_3:0
4863+msgid "From 3"
4864+msgstr "De 3"
4865+
4866+#. module: procurement_cycle
4867+#: field:replenishment.segment.line,rr_fmc_from_4:0
4868+msgid "From 4"
4869+msgstr "De 4"
4870+
4871+#. module: procurement_cycle
4872+#: field:replenishment.segment.line,rr_fmc_from_5:0
4873+msgid "From 5"
4874+msgstr "De 5"
4875+
4876+#. module: procurement_cycle
4877+#: field:replenishment.segment.line,rr_fmc_from_6:0
4878+msgid "From 6"
4879+msgstr "De 6"
4880+
4881+#. module: procurement_cycle
4882+#: field:replenishment.segment.line,rr_fmc_from_7:0
4883+msgid "From 7"
4884+msgstr "De 7"
4885+
4886+#. module: procurement_cycle
4887+#: field:replenishment.segment.line,rr_fmc_from_8:0
4888+msgid "From 8"
4889+msgstr "De 8"
4890+
4891+#. module: procurement_cycle
4892+#: field:replenishment.segment.line,rr_fmc_from_9:0
4893+msgid "From 9"
4894+msgstr "De 9"
4895+
4896+#. module: procurement_cycle
4897+#: view:replenishment.location.config:0
4898+msgid "Generate Inventory Review"
4899+msgstr "Générer la Revue d'Inventaire"
4900+
4901+#. module: procurement_cycle
4902+#: view:replenishment.segment:0
4903+msgid "Generate Order Calc"
4904+msgstr "Générer Calcul de Commande"
4905+
4906+#. module: procurement_cycle
4907+#: view:replenishment.order_calc:0
4908+msgid "Generate Requisition & Close"
4909+msgstr "Générer la Demande et Fermer"
4910+
4911+#. module: procurement_cycle
4912+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:470
4913+#: field:replenishment.inventory.review,generation_date:0
4914+msgid "Generated"
4915+msgstr "Généré"
4916+
4917+#. module: procurement_cycle
4918+#: field:replenishment.order_calc,ir_id:0
4919+msgid "Generated IR"
4920+msgstr "DI Généréé"
4921+
4922+#. module: procurement_cycle
4923+#: help:replenishment.segment,previous_order_rdd:0
4924+msgid "Generated according to latest IR's RDD (from most recent Order calc which is now closed)."
4925+msgstr "Généré en fonction de la DLS du dernier DI (depuis le plus récent Calcul de commande fermé)."
4926+
4927+#. module: procurement_cycle
4928+#: view:replenishment.segment:0
4929+#: field:replenishment.segment,last_generation:0
4930+msgid "Generation Date"
4931+msgstr "Date Génération"
4932+
4933+#. module: procurement_cycle
4934+#: field:replenishment.segment,handling_lt:0
4935+msgid "Handling Lead Time (days)"
4936+msgstr "Délai de traitement (jours)"
4937+
4938+#. module: procurement_cycle
4939+#: field:replenishment.segment,has_inprogress_cal:0
4940+msgid "Has in-progess Order Calc."
4941+msgstr "A des Calculs en cours"
4942+
4943+#. module: procurement_cycle
4944+#: field:replenishment.segment,ir_requesting_location:0
4945+#: field:replenishment.segment,ir_requesting_location_rdo:0
4946+msgid "IR Requesting Location"
4947+msgstr "Zone Requérente de la DI"
4948+
4949+#. module: procurement_cycle
4950+#: code:addons/procurement_cycle/replenishment.py:1030
4951+#: code:addons/procurement_cycle/replenishment.py:1764
4952+#, python-format
4953+msgid "Importation Done"
4954+msgstr "Importation complète"
4955+
4956+#. module: procurement_cycle
4957+#: selection:replenishment.inventory.review,state:0
4958+msgid "In Progress"
4959+msgstr "En Cours"
4960+
4961+#. module: procurement_cycle
4962+#: report:addons/procurement_cycle/report/replenishment_order_calc.mako:410
4963+#: report:addons/procurement_cycle/report/replenishment_segment.mako:370
4964+msgid "In prod. list"
4965+msgstr "Dans liste prod."
4966+
4967+#. module: procurement_cycle
4968+#: field:replenishment.inventory.review.line,internal_lt:0
4969+msgid "Internal LT"
4970+msgstr "Délai Interne"
4971+
4972+#. module: procurement_cycle
4973+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:834
4974+msgid "Internal LT (days)"
4975+msgstr "Délai interne (jours)"
4976+
4977+#. module: procurement_cycle
4978+#: field:replenishment.segment,internal_lt:0
4979+msgid "Internal Lead Time (days)"
4980+msgstr "Délai Interne (jours)"
4981+
4982+#. module: procurement_cycle
4983+#: code:addons/procurement_cycle/replenishment.py:765
4984+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:1018
4985+#, python-format
4986+msgid "Invalid FMC"
4987+msgstr "PCM Invalide"
4988+
4989+#. module: procurement_cycle
4990+#: report:addons/procurement_cycle/report/replenishment_inventory_review.mako:328
4991+#: model:ir.actions.act_window,name:procurement_cycle.replenishment_inventory_review_action
4992+#: model:ir.model,name:procurement_cycle.model_replenishment_inventory_review
4993+#: model:ir.ui.menu,name:procurement_cycle.replenishment_inventory_review_menu
4994+#: view:replenishment.inventory.review:0
4995+msgid "Inventory Review"
4996+msgstr "Revue d'Inventaire"
4997+
4998+#. module: procurement_cycle
4999+#: model:ir.actions.act_window,name:procurement_cycle.replenishment_review_config_action
5000+#: model:ir.ui.menu,name:procurement_cycle.replenishment_review_config_menu
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: