odoo-addon-openupgrade-scripts 16.0.1.0.3.155__py3-none-any.whl → 16.0.1.0.3.162__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (16) hide show
  1. odoo/addons/openupgrade_scripts/scripts/hr_hourly_cost/16.0.1.0/upgrade_analysis_work.txt +15 -0
  2. odoo/addons/openupgrade_scripts/scripts/hr_timesheet/16.0.1.0/pre-migration.py +76 -0
  3. odoo/addons/openupgrade_scripts/scripts/hr_timesheet/16.0.1.0/upgrade_analysis_work.txt +76 -0
  4. odoo/addons/openupgrade_scripts/scripts/hr_timesheet_attendance/{16.0.1.0/upgrade_analysis.txt → 16.0.1.1/upgrade_analysis_work.txt} +1 -0
  5. odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py +18 -0
  6. odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py +170 -0
  7. odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/tests/__init__.py +1 -0
  8. odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/tests/test_project_migration.py +13 -0
  9. odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt +101 -0
  10. odoo/addons/openupgrade_scripts/scripts/sale_project/16.0.1.0/upgrade_analysis_work.txt +22 -0
  11. odoo/addons/openupgrade_scripts/scripts/sale_timesheet/16.0.1.0/pre-migration.py +36 -0
  12. odoo/addons/openupgrade_scripts/scripts/sale_timesheet/16.0.1.0/upgrade_analysis_work.txt +58 -0
  13. {odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info → odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info}/METADATA +1 -1
  14. {odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info → odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info}/RECORD +16 -5
  15. {odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info → odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info}/WHEEL +0 -0
  16. {odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info → odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,15 @@
1
+ ---Models in module 'hr_hourly_cost'---
2
+ ---Fields in module 'hr_hourly_cost'---
3
+ hr_hourly_cost / hr.employee / currency_id (many2one) : previously in module hr_timesheet
4
+
5
+ # NOTHING TO DO
6
+
7
+ hr_hourly_cost / hr.employee / hourly_cost (float) : NEW hasdefault: default
8
+
9
+ # NOTHING TO DO: This field renamed from timesheet_cost and it handled in hr_timsheet (because this module is split from hr_timsheet
10
+ to a new module so that can't put migration script in itself).
11
+
12
+ ---XML records in module 'hr_hourly_cost'---
13
+ NEW ir.ui.view: hr_hourly_cost.view_employee_form
14
+
15
+ #NOTHING TO DO
@@ -0,0 +1,76 @@
1
+ from openupgradelib import openupgrade
2
+
3
+
4
+ def update_rename_field(env):
5
+ openupgrade.logged_query(
6
+ env.cr,
7
+ """
8
+ ALTER TABLE hr_employee
9
+ ADD COLUMN IF NOT EXISTS hourly_cost numeric
10
+ """,
11
+ )
12
+
13
+ openupgrade.logged_query(
14
+ env.cr,
15
+ """
16
+ UPDATE hr_employee
17
+ SET hourly_cost = timesheet_cost
18
+ """,
19
+ )
20
+
21
+
22
+ def create_ancestor_task_id(env):
23
+ openupgrade.logged_query(
24
+ env.cr,
25
+ """
26
+ ALTER TABLE account_analytic_line
27
+ ADD COLUMN IF NOT EXISTS ancestor_task_id integer
28
+ """,
29
+ )
30
+
31
+ openupgrade.logged_query(
32
+ env.cr,
33
+ """
34
+ UPDATE account_analytic_line AS aal
35
+ SET ancestor_task_id = pt.ancestor_id
36
+ FROM project_task AS pt
37
+ WHERE pt.id = aal.task_id
38
+ """,
39
+ )
40
+
41
+
42
+ def create_manager_id(env):
43
+ openupgrade.logged_query(
44
+ env.cr,
45
+ """
46
+ ALTER TABLE account_analytic_line
47
+ ADD COLUMN IF NOT EXISTS manager_id integer
48
+ """,
49
+ )
50
+
51
+ openupgrade.logged_query(
52
+ env.cr,
53
+ """
54
+ UPDATE account_analytic_line AS aal
55
+ SET manager_id = he.parent_id
56
+ FROM hr_employee AS he
57
+ WHERE he.id = aal.employee_id
58
+ """,
59
+ )
60
+
61
+
62
+ def delete_constraint_project_task_create_timesheet_time_positive(env):
63
+ openupgrade.delete_sql_constraint_safely(
64
+ env,
65
+ "hr_timesheet",
66
+ "project_task",
67
+ "create_timesheet_time_positive",
68
+ )
69
+
70
+
71
+ @openupgrade.migrate()
72
+ def migrate(env, version):
73
+ update_rename_field(env)
74
+ create_ancestor_task_id(env)
75
+ create_manager_id(env)
76
+ delete_constraint_project_task_create_timesheet_time_positive(env)
@@ -0,0 +1,76 @@
1
+ ---Models in module 'hr_timesheet'---
2
+ obsolete model project.task.create.timesheet [transient]
3
+ new model timesheets.analysis.report [sql_view]
4
+
5
+ # NOTHING TO DO
6
+
7
+ ---Fields in module 'hr_timesheet'---
8
+ hr_timesheet / account.analytic.line / ancestor_task_id (many2one) : NEW relation: project.task, isrelated: related, stored
9
+ hr_timesheet / account.analytic.line / manager_id (many2one) : NEW relation: hr.employee, isrelated: related, stored
10
+
11
+ # DONE: create column and load data in pre-migration
12
+
13
+ hr_timesheet / account.analytic.line / partner_id (False) : module is now 'account' ('hr_timesheet')
14
+ hr_timesheet / hr.employee / currency_id (many2one) : module is now 'hr_hourly_cost' ('hr_timesheet')
15
+
16
+ # NOTHING TO DO
17
+
18
+ hr_timesheet / hr.employee / timesheet_cost (float) : DEL
19
+
20
+ # DONE: changed to hourly_cost field in pre-migration
21
+
22
+ hr_timesheet / project.project / allocated_hours (float) : NEW
23
+
24
+ # NOTHING TO DO: remove in master
25
+
26
+ hr_timesheet / project.project / timesheet_count (boolean) : type is now 'integer' ('boolean')
27
+
28
+ # NOTHING TO DO: field store = False
29
+
30
+ ---XML records in module 'hr_timesheet'---
31
+ NEW ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_line_by_project_view_form
32
+ NEW ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_line_by_project_view_graph
33
+ NEW ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_line_by_project_view_kanban
34
+ NEW ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_line_by_project_view_pivot
35
+ NEW ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_line_by_project_view_tree
36
+ DEL ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_report_form
37
+ DEL ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_report_kanban
38
+ DEL ir.actions.act_window.view: hr_timesheet.act_hr_timesheet_report_tree
39
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_project_form
40
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_project_kanban
41
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_project_tree
42
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_task_form
43
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_task_kanban
44
+ DEL ir.actions.act_window.view: hr_timesheet.timesheet_action_view_report_by_task_tree
45
+ NEW ir.actions.report: hr_timesheet.timesheet_report_task_timesheets
46
+ NEW ir.model.access: hr_timesheet.access_timesheets_analysis_report_manager
47
+ NEW ir.model.access: hr_timesheet.access_timesheets_analysis_report_user
48
+ DEL ir.model.access: hr_timesheet.access_project_task_create_timesheet
49
+
50
+ # NOTHING TO DO
51
+
52
+ DEL ir.model.constraint: hr_timesheet.constraint_project_task_create_timesheet_time_positive
53
+
54
+ # DONE : delete safely in pre-migration
55
+
56
+ NEW ir.rule: hr_timesheet.timesheets_analysis_report_comp_rule (noupdate)
57
+ NEW ir.ui.view: hr_timesheet.hr_timesheet_report_search
58
+ NEW ir.ui.view: hr_timesheet.project_project_view_tree_inherit_sale_project
59
+ NEW ir.ui.view: hr_timesheet.project_sharing_project_task_view_search_inherit_timesheet
60
+ NEW ir.ui.view: hr_timesheet.project_update_view_search_inherit
61
+ NEW ir.ui.view: hr_timesheet.rating_rating_view_search_project_inherited
62
+ NEW ir.ui.view: hr_timesheet.report_timesheet_task
63
+ NEW ir.ui.view: hr_timesheet.timesheet_project_task_page
64
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_graph_employee
65
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_graph_project
66
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_graph_task
67
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_pivot_employee
68
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_pivot_project
69
+ NEW ir.ui.view: hr_timesheet.timesheets_analysis_report_pivot_task
70
+ NEW ir.ui.view: hr_timesheet.view_hr_timesheet_line_graph_by_employee
71
+ NEW ir.ui.view: hr_timesheet.view_project_project_filter_inherit_timesheet
72
+ NEW ir.ui.view: hr_timesheet.view_task_search_form_hr_extended
73
+ DEL ir.ui.view: hr_timesheet.project_sharing_inherit_project_task_view_search
74
+ DEL ir.ui.view: hr_timesheet.project_task_create_timesheet_view_form
75
+
76
+ # NOTHING TO DO
@@ -5,3 +5,4 @@ NEW ir.actions.act_window.view: hr_timesheet_attendance.action_hr_timesheet_atte
5
5
  NEW ir.rule: hr_timesheet_attendance.hr_timesheet_attendance_report_rule_approver (noupdate)
6
6
  NEW ir.rule: hr_timesheet_attendance.hr_timesheet_attendance_report_rule_manager (noupdate)
7
7
  NEW ir.rule: hr_timesheet_attendance.hr_timesheet_attendance_report_rule_user (noupdate)
8
+ # NOTHING TO DO: Handled by ORM
@@ -0,0 +1,18 @@
1
+ # Copyright 2023 Trần Trường Sơn
2
+ # Copyright 2023 Rémy Taymans
3
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
+
5
+ from openupgradelib import openupgrade
6
+
7
+ _translations_to_delete = [
8
+ "mail_template_data_project_task",
9
+ "project_manager_all_project_tasks_rule",
10
+ "project_message_user_assigned",
11
+ "rating_project_request_email_template",
12
+ ]
13
+
14
+
15
+ @openupgrade.migrate()
16
+ def migrate(env, version):
17
+ openupgrade.load_data(env.cr, "project", "16.0.1.2/noupdate_changes.xml")
18
+ openupgrade.delete_record_translations(env.cr, "project", _translations_to_delete)
@@ -0,0 +1,170 @@
1
+ # Copyright 2023 Trần Trường Sơn
2
+ # Copyright 2023 Rémy Taymans
3
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
+
5
+ from openupgradelib import openupgrade
6
+
7
+ _new_fields = [
8
+ (
9
+ "is_closed", # Field name
10
+ "project.task", # Model name
11
+ "project_task", # Table name
12
+ "boolean", # Odoo Field type (in lower case)
13
+ False, # [Optional] SQL type (if custom fields)
14
+ "project", # Module name
15
+ False, # [Optional] Default value
16
+ ),
17
+ (
18
+ "ancestor_id", # Field name
19
+ "project.task", # Model name
20
+ "project_task", # Table name
21
+ "many2one", # Odoo Field type (in lower case)
22
+ False, # [Optional] SQL type (if custom fields)
23
+ "project", # Module name
24
+ False, # [Optional] Default value
25
+ ),
26
+ (
27
+ "is_analytic_account_id_changed", # Field name
28
+ "project.task", # Model name
29
+ "project_task", # Table name
30
+ "boolean", # Odoo Field type (in lower case)
31
+ False, # [Optional] SQL type (if custom fields)
32
+ "project", # Module name
33
+ False, # [Optional] Default value
34
+ ),
35
+ (
36
+ "allow_milestones", # Field name
37
+ "project.project", # Model name
38
+ "project_project", # Table name
39
+ "boolean", # Odoo Field type (in lower case)
40
+ False, # [Optional] SQL type (if custom fields)
41
+ "project", # Module name
42
+ False, # [Optional] Default value
43
+ ),
44
+ ]
45
+
46
+
47
+ def _set_task_type_fold_if_is_closed(env):
48
+ """Field `is_closed` on project.task.type is removed. The field
49
+ `fold` can be used instead.
50
+ """
51
+ openupgrade.logged_query(
52
+ env.cr,
53
+ """
54
+ UPDATE project_task_type
55
+ SET fold = TRUE
56
+ WHERE is_closed = TRUE;
57
+ """,
58
+ )
59
+
60
+
61
+ def _fill_project_task_is_closed(env):
62
+ """Field `is_closed` on project.task is now a stored field."""
63
+ openupgrade.logged_query(
64
+ env.cr,
65
+ """
66
+ UPDATE project_task task
67
+ SET is_closed = stage.fold
68
+ FROM project_task_type stage
69
+ WHERE task.stage_id = stage.id;
70
+ """,
71
+ )
72
+
73
+
74
+ def _fill_project_last_update_status_if_null(env):
75
+ """In some cases, the user can go to the DB and reset the
76
+ `last_update_status` field to NULL. In version 16.0 it is necessary
77
+ to reset it to `to_define` because it has a `required` attribute.
78
+ """
79
+ openupgrade.logged_query(
80
+ env.cr,
81
+ """
82
+ UPDATE project_project project
83
+ SET last_update_status = 'to_define'
84
+ WHERE last_update_status IS NULL;
85
+ """,
86
+ )
87
+
88
+
89
+ def _compute_project_task_ancestor_id(env):
90
+ """
91
+ New column at version 16.0. valid as the ancestor of the current task
92
+ """
93
+ openupgrade.logged_query(
94
+ env.cr,
95
+ """
96
+ WITH RECURSIVE task_ancestors AS (
97
+ SELECT id, parent_id, id AS ancestor_id
98
+ FROM project_task
99
+ WHERE parent_id IS NULL
100
+
101
+ UNION ALL
102
+
103
+ SELECT pt.id, pt.parent_id, ta.ancestor_id
104
+ FROM project_task pt
105
+ INNER JOIN task_ancestors ta ON pt.parent_id = ta.id
106
+ )
107
+ UPDATE project_task pt
108
+ SET ancestor_id = ta.ancestor_id
109
+ FROM task_ancestors ta
110
+ WHERE pt.id = ta.id;
111
+
112
+ UPDATE project_task pt
113
+ SET ancestor_id = NULL
114
+ WHERE id = ancestor_id;
115
+ """,
116
+ )
117
+
118
+
119
+ def _compute_project_task_is_analytic_account_id_changed(env):
120
+ """
121
+ `is_analytic_account_id_changed` is a new field at version 16.0.
122
+ It has a value of False if you have the same admin account as the project,
123
+ otherwise it will have a value of True
124
+ """
125
+ openupgrade.logged_query(
126
+ env.cr,
127
+ """
128
+ UPDATE project_task task
129
+ SET is_analytic_account_id_changed = CASE
130
+ WHEN project_id IS NOT NULL
131
+ AND task.project_id = project.id
132
+ AND task.analytic_account_id != project.analytic_account_id
133
+ THEN TRUE
134
+ ELSE FALSE
135
+ END
136
+ FROM project_project as project;
137
+ """,
138
+ )
139
+
140
+
141
+ def _fill_project_allow_milestones(env):
142
+ """New field allow_milestones on project.project depends on the
143
+ value of the configuration (based on a group)
144
+ project.group_project_milestone.
145
+ Previously, milestone where visible by default on a project. To keep
146
+ this behaviour with existing project, allow_milestones need to be
147
+ set to True.
148
+ """
149
+ openupgrade.logged_query(
150
+ env.cr,
151
+ """
152
+ UPDATE project_project project
153
+ SET allow_milestones = true
154
+ """,
155
+ )
156
+
157
+
158
+ @openupgrade.migrate()
159
+ def migrate(env, version):
160
+ openupgrade.add_fields(env, _new_fields)
161
+ _set_task_type_fold_if_is_closed(env)
162
+ _fill_project_task_is_closed(env)
163
+ _fill_project_last_update_status_if_null(env)
164
+ _compute_project_task_ancestor_id(env)
165
+ _compute_project_task_is_analytic_account_id_changed(env)
166
+
167
+ # Remove SQL view project_task_burndown_chart_report not used anymore in Odoo v16.0
168
+ openupgrade.logged_query(
169
+ env.cr, "DROP VIEW IF EXISTS project_task_burndown_chart_report CASCADE"
170
+ )
@@ -0,0 +1 @@
1
+ from . import test_project_migration
@@ -0,0 +1,13 @@
1
+ from odoo.tests import TransactionCase
2
+
3
+
4
+ class TestProjectMigration(TransactionCase):
5
+ def test_project_allow_milestones(self):
6
+ """Test that the allow_milestones field on a project is correctly set.
7
+ On a database with demo data, project.group_project_milestone
8
+ option is set to true. So allow_milestones should be true on
9
+ projects.
10
+ """
11
+ projects = self.env["project.project"].search([])
12
+ for project in projects:
13
+ self.assertTrue(project.allow_milestones)
@@ -0,0 +1,101 @@
1
+ ---Models in module 'project'---
2
+ obsolete model project.delete.wizard [transient]
3
+ # NOTHING TO DO: wizard removed
4
+
5
+ ---Fields in module 'project'---
6
+ project / account.analytic.tag / task_ids (many2many) : DEL relation: project.task
7
+ project / project.task / analytic_tag_ids (many2many) : DEL relation: account.analytic.tag
8
+ # NOTHING TO DO: lost feature
9
+
10
+ project / project.milestone / task_ids (one2many) : NEW relation: project.task
11
+ project / project.project / task_properties_definition (properties_definition): NEW
12
+ project / project.task / task_properties (properties) : NEW hasdefault: compute
13
+ project / res.company / analytic_plan_id (many2one) : NEW relation: account.analytic.plan, hasdefault: compute
14
+ # NOTHING TO DO: new features
15
+
16
+ project / project.tags / project_ids (many2many) : NEW relation: project.project
17
+ project / project.tags / task_ids (many2many) : NEW relation: project.task
18
+ # NOTHING TO DO: reverse relation that already exists on project.project and project.task
19
+
20
+ pad_project / project.project / description_pad (char) : DEL
21
+ pad_project / project.project / use_pads (boolean) : DEL
22
+ pad_project / project.task / description_pad (char) : DEL
23
+ # TODO: Module pad_project has been removed
24
+
25
+ project / project.project / allow_milestones (boolean) : NEW hasdefault: default
26
+ # DONE: pre-migration: create field and set default value.
27
+
28
+ project / project.project / last_update_status (selection): not a function anymore
29
+ project / project.project / last_update_status (selection): now required
30
+ project / project.project / last_update_status (selection): selection_keys is now '['at_risk', 'off_track', 'on_hold', 'on_track', 'to_define']' ('['at_risk', 'off_track', 'on_hold', 'on_track']')
31
+ # DONE: pre-migration: Set value of last_update_status to 'to_define' where field is empty
32
+
33
+ project / project.task.type / is_closed (boolean) : DEL
34
+ # DONE: pre-migration: Field removed, field 'fold' should be used instead. Moving values from 'is_closed' to 'fold'.
35
+
36
+ project / project.task / is_closed (boolean) : is now stored
37
+ # DONE: pre-migration: Add new column & set value for it
38
+
39
+ project / project.task / ancestor_id (many2one) : NEW relation: project.task, isfunction: function, stored
40
+ project / project.task / is_analytic_account_id_changed (boolean): NEW isfunction: function, stored
41
+ # DONE: pre-migration: pre-compute value for new computed fields
42
+
43
+ project / project.task / is_blocked (boolean) : NEW isfunction: function, stored
44
+ project / project.task / milestone_id (many2one) : NEW relation: project.milestone, hasdefault: compute
45
+ # TODO (speed improvement): pre-migration: pre-compute value for new computed fields
46
+
47
+
48
+ ---XML records in module 'project'---
49
+ NEW digest.tip: project.digest_tip_project_1
50
+ NEW ir.actions.act_window: project.action_send_mail_project_project
51
+ NEW ir.actions.act_window: project.action_send_mail_project_task
52
+ NEW ir.actions.act_window: project.action_view_task_from_milestone
53
+ NEW ir.actions.act_window: project.open_view_project_all_config_group_stage
54
+ NEW ir.actions.act_window: project.project_sharing_project_task_action_sub_task
55
+ NEW ir.actions.act_window: project.project_task_action_sub_task
56
+ DEL ir.actions.act_window: project.project_milestone_all
57
+ NEW ir.actions.act_window.view: project.open_view_all_task_list_calendar
58
+ NEW ir.actions.act_window.view: project.open_view_all_task_list_kanban
59
+ NEW ir.actions.act_window.view: project.open_view_all_task_list_tree
60
+ NEW ir.actions.act_window.view: project.open_view_project_all_config_group_stage_kanban_action_view
61
+ NEW ir.actions.act_window.view: project.open_view_project_all_config_group_stage_tree_action_view
62
+ NEW ir.actions.act_window.view: project.project_all_task_activity_action_view
63
+ NEW ir.actions.act_window.view: project.project_all_task_calendar_action_view
64
+ NEW ir.actions.act_window.view: project.project_all_task_graph_action_view
65
+ NEW ir.actions.act_window.view: project.project_all_task_pivot_action_view
66
+ NEW ir.actions.act_window.view: project.project_sharing_subtasks_form_action_view
67
+ NEW ir.actions.act_window.view: project.project_sharing_subtasks_kanban_action_view
68
+ NEW ir.actions.act_window.view: project.project_sharing_subtasks_tree_action_view
69
+ NEW ir.actions.act_window.view: project.project_task_form_action_view
70
+ NEW ir.actions.act_window.view: project.project_task_kanban_action_view
71
+ NEW ir.actions.act_window.view: project.project_task_tree_action_view
72
+ NEW ir.actions.act_window.view: project.rating_rating_action_task_kanban
73
+ NEW ir.actions.act_window.view: project.rating_rating_action_view_project_rating_kanban
74
+ DEL ir.actions.server: project.unlink_project_action
75
+ NEW ir.model.access: project.access_project_task_burndown_chart_report_user
76
+ NEW ir.model.access: project.access_report_project_task_user_project_user
77
+ DEL ir.model.access: project.access_project_delete_wizard
78
+ NEW ir.rule: project.burndown_chart_project_manager_rule (noupdate)
79
+ NEW ir.rule: project.burndown_chart_project_user_rule (noupdate)
80
+ NEW ir.rule: project.report_project_task_manager_rule (noupdate)
81
+ NEW ir.rule: project.report_project_task_user_rule (noupdate)
82
+ NEW ir.ui.menu: project.menu_projects_config_group_stage
83
+ NEW ir.ui.view: project.rating_rating_project_view_kanban
84
+ NEW ir.ui.view: project.task_type_tree_inherited
85
+ NEW ir.ui.view: project.view_project_calendar
86
+ NEW ir.ui.view: project.view_project_config_kanban
87
+ NEW ir.ui.view: project.view_project_task_pivot_inherit
88
+ NEW ir.ui.view: project.view_project_task_type_unarchive_wizard
89
+ NEW ir.ui.view: project.view_task_all_calendar
90
+ NEW ir.ui.view: project.view_task_kanban_inherit_my_task
91
+ DEL ir.ui.view: pad_project.project_project_view_form
92
+ DEL ir.ui.view: pad_project.res_config_settings_view_form
93
+ DEL ir.ui.view: pad_project.view_task_form2_inherit_pad_project
94
+ DEL ir.ui.view: project.project_collaborator_view_form
95
+ DEL ir.ui.view: project.project_delete_wizard_form
96
+ DEL ir.ui.view: project.project_task_burndown_chart_report_view_pivot
97
+ NEW mail.message.subtype: project.mt_project_update_create (noupdate)
98
+ NEW mail.message.subtype: project.mt_task_progress (noupdate)
99
+ NEW mail.message.subtype: project.mt_update_create (noupdate)
100
+ NEW res.groups: project.group_project_milestone
101
+ # NOTHING TO DO
@@ -0,0 +1,22 @@
1
+ ---Models in module 'sale_project'---
2
+ ---Fields in module 'sale_project'---
3
+ sale_project / product.product / service_policy (selection) : previously in module sale_timesheet
4
+ sale_project / product.template / service_policy (selection) : previously in module sale_timesheet
5
+ sale_project / project.project / allow_billable (boolean) : previously in module sale_timesheet
6
+ sale_project / project.project / invoice_count (integer) : previously in module account_sale_timesheet
7
+ sale_project / project.project / vendor_bill_count (integer) : previously in module sale_project_account
8
+ # NOTHING TO DO: Covered by ORM
9
+
10
+ sale_project / product.template / service_type (False) : NEW selection_keys: ['manual', 'milestones'], mode: modify
11
+ sale_project / project.milestone / quantity_percentage (float) : NEW
12
+ sale_project / project.milestone / sale_line_id (many2one) : NEW relation: sale.order.line
13
+ sale_project / sale.order.line / qty_delivered_method (False) : NEW selection_keys: ['analytic', 'manual', 'milestones', 'stock_move'], mode: modify
14
+ sale_project / sale.order.line / reached_milestones_ids (one2many): NEW relation: project.milestone
15
+ # NOTHING TO DO: New feature of billing by milestones.
16
+
17
+ ---XML records in module 'sale_project'---
18
+ NEW ir.ui.view: sale_project.project_milestone_view_form
19
+ NEW ir.ui.view: sale_project.project_milestone_view_tree
20
+ NEW ir.ui.view: sale_project.sale_project_milestone_view_tree
21
+ DEL ir.ui.view: sale_project.project_task_view_form_inherit_sale_line_editable
22
+ # NOTHING TO DO: noupdate="0" records
@@ -0,0 +1,36 @@
1
+ from openupgradelib import openupgrade
2
+
3
+
4
+ def _update_account_analytic_line_timesheet_invoice_type(env):
5
+ openupgrade.logged_query(
6
+ env.cr,
7
+ """
8
+ WITH timesheet_info as (
9
+ SELECT aal.id as id,
10
+ product_tmpl.service_type as service_type
11
+ FROM account_analytic_line aal
12
+ JOIN sale_order_line sol
13
+ ON sol.id = aal.so_line
14
+ JOIN product_product product
15
+ ON product.id = sol.product_id
16
+ JOIN product_template product_tmpl
17
+ ON product_tmpl.id = product.product_tmpl_id
18
+ WHERE product_tmpl.type = 'service'
19
+ AND product_tmpl.invoice_policy = 'delivery'
20
+ AND product_tmpl.service_type IN ('milestones', 'manual')
21
+ )
22
+ UPDATE account_analytic_line aal
23
+ SET timesheet_invoice_type = CONCAT('billable_', info.service_type)
24
+ FROM timesheet_info info
25
+ WHERE aal.id = info.id
26
+ """,
27
+ )
28
+
29
+
30
+ @openupgrade.migrate()
31
+ def migrate(env, version):
32
+ _update_account_analytic_line_timesheet_invoice_type(env)
33
+ # Remove SQL view project_profitability_report not used anymore in Odoo 16
34
+ openupgrade.logged_query(
35
+ env.cr, "DROP VIEW IF EXISTS project_profitability_report CASCADE"
36
+ )
@@ -0,0 +1,58 @@
1
+ ---Models in module 'sale_timesheet'---
2
+ obsolete model project.profitability.report [sql_view]
3
+ # NOTHING TO DO
4
+
5
+ ---Fields in module 'sale_timesheet'---
6
+ sale_timesheet / account.analytic.line / timesheet_invoice_type (selection): selection_keys is now '['billable_fixed', 'billable_manual', 'billable_milestones', 'billable_time', 'non_billable', 'other_costs', 'other_revenues', 'service_revenues', 'timesheet_revenues']' ('['billable_fixed', 'billable_time', 'non_billable', 'other_costs', 'other_revenues', 'service_revenues', 'timesheet_revenues']')
7
+ # DONE: pre-migration: update the value for timesheet_invoice_type.
8
+
9
+ sale_timesheet / product.product / service_policy (selection) : module is now 'sale_project' ('sale_timesheet')
10
+ sale_timesheet / product.template / service_policy (selection) : module is now 'sale_project' ('sale_timesheet')
11
+ sale_timesheet / project.project / allow_billable (boolean) : module is now 'sale_project' ('sale_timesheet')
12
+ # NOTHING TO DO: Module changes handled by ORM.
13
+
14
+ sale_timesheet / product.template / service_policy (selection) : selection_keys is now 'function' ('['delivered_manual', 'delivered_timesheet', 'ordered_timesheet']')
15
+ # NOTHING TO DO: store="False"
16
+
17
+ sale_timesheet / product.template / service_type (False) : selection_keys is now '['manual', 'milestones', 'timesheet']' ('['manual', 'timesheet']')
18
+ sale_timesheet / sale.order.line / qty_delivered_method (False) : selection_keys is now '['analytic', 'manual', 'milestones', 'stock_move', 'timesheet']' ('['analytic', 'manual', 'stock_move', 'timesheet']')
19
+ sale_timesheet / sale.order.line / timesheet_ids (one2many) : NEW relation: account.analytic.line
20
+ # NOTHING TO DO: New feature of invoicing by milestones.
21
+
22
+ sale_timesheet / project.project / allocated_hours (False) : NEW mode: modify, hasdefault: compute
23
+ # NOTHING TO DO
24
+
25
+ ---XML records in module 'sale_timesheet'---
26
+ NEW ir.actions.act_window: sale_timesheet.timesheet_action_from_sales_order_item
27
+ NEW ir.actions.act_window.view: sale_timesheet.timesheet_action_from_sales_order_item_form
28
+ NEW ir.actions.act_window.view: sale_timesheet.timesheet_action_from_sales_order_item_graph
29
+ NEW ir.actions.act_window.view: sale_timesheet.timesheet_action_from_sales_order_item_kanban
30
+ NEW ir.actions.act_window.view: sale_timesheet.timesheet_action_from_sales_order_item_pivot
31
+ NEW ir.actions.act_window.view: sale_timesheet.timesheet_action_from_sales_order_item_tree
32
+ DEL ir.actions.act_window.view: sale_timesheet.timesheet_action_view_report_by_billing_rate_form
33
+ DEL ir.actions.act_window.view: sale_timesheet.timesheet_action_view_report_by_billing_rate_kanban
34
+ DEL ir.actions.act_window.view: sale_timesheet.timesheet_action_view_report_by_billing_rate_tree
35
+ NEW ir.actions.report: sale_timesheet.timesheet_report_account_move
36
+ NEW ir.actions.report: sale_timesheet.timesheet_report_sale_order
37
+ DEL ir.filters: sale_timesheet.ir_filter_project_profitability_report_costs_and_revenues
38
+ DEL ir.model.access: sale_timesheet.access_project_profitability_report_analysis_manager
39
+ NEW ir.ui.view: sale_timesheet.hr_timesheet_report_search_sale_timesheet
40
+ NEW ir.ui.view: sale_timesheet.project_project_view_kanban_inherit_sale_timesheet_so_button
41
+ NEW ir.ui.view: sale_timesheet.project_sharing_inherit_project_task_view_tree_sale_timesheet
42
+ NEW ir.ui.view: sale_timesheet.report_timesheet_account_move
43
+ NEW ir.ui.view: sale_timesheet.report_timesheet_sale_order
44
+ NEW ir.ui.view: sale_timesheet.timesheet_sale_page
45
+ NEW ir.ui.view: sale_timesheet.timesheets_analysis_report_graph_inherit
46
+ NEW ir.ui.view: sale_timesheet.timesheets_analysis_report_graph_invoice_type
47
+ NEW ir.ui.view: sale_timesheet.timesheets_analysis_report_pivot_inherit
48
+ NEW ir.ui.view: sale_timesheet.timesheets_analysis_report_pivot_invoice_type
49
+ NEW ir.ui.view: sale_timesheet.view_hr_timesheet_line_graph_employee_per_date
50
+ NEW ir.ui.view: sale_timesheet.view_task_tree2_inherited
51
+ DEL ir.ui.view: sale_timesheet.project_profitability_report_view_graph
52
+ DEL ir.ui.view: sale_timesheet.project_profitability_report_view_pivot
53
+ DEL ir.ui.view: sale_timesheet.project_profitability_report_view_search
54
+ DEL ir.ui.view: sale_timesheet.project_profitability_report_view_tree
55
+ DEL ir.ui.view: sale_timesheet.project_project_view_form_salesman
56
+ DEL ir.ui.view: sale_timesheet.project_task_view_form_inherit_sale_timesheet_editable
57
+ DEL ir.ui.view: sale_timesheet.timesheet_view_pivot_revenue
58
+ # NOTHING TO DO: noupdate="0" records
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odoo-addon-openupgrade-scripts
3
- Version: 16.0.1.0.3.155
3
+ Version: 16.0.1.0.3.162
4
4
  Summary: Module that contains all the migrations analysis and scripts for migrate Odoo SA modules.
5
5
  Home-page: https://github.com/OCA/OpenUpgrade
6
6
  Author: Odoo Community Association (OCA)
@@ -157,6 +157,7 @@ odoo/addons/openupgrade_scripts/scripts/hr_holidays/16.0.1.5/upgrade_analysis_wo
157
157
  odoo/addons/openupgrade_scripts/scripts/hr_holidays_attendance/16.0.1.0/noupdate_changes.xml,sha256=OzxdaoxV1NybA2Xp2qjTU-nG7auZaqwmpHCYoSLZglk,168
158
158
  odoo/addons/openupgrade_scripts/scripts/hr_holidays_attendance/16.0.1.0/upgrade_analysis.txt,sha256=iIq0WvegXemuojBa9KNPlGlhwcCG_xMgIKgY9pLymmg,273
159
159
  odoo/addons/openupgrade_scripts/scripts/hr_hourly_cost/16.0.1.0/upgrade_analysis.txt,sha256=c8u8sEURXNF87Lt3UWDf9VyrxImSdSqG4OOnoCZDAB4,275
160
+ odoo/addons/openupgrade_scripts/scripts/hr_hourly_cost/16.0.1.0/upgrade_analysis_work.txt,sha256=j5moFtU6ZG_xFkqlg3_m8YxwdypufHoMKBda2CJclLw,617
160
161
  odoo/addons/openupgrade_scripts/scripts/hr_maintenance/16.0.1.0/upgrade_analysis.txt,sha256=yu4-K8VQ4jtiDZvIlVIyIZJuj8gnN_qT4qI5RcYzTZM,165
161
162
  odoo/addons/openupgrade_scripts/scripts/hr_maintenance/16.0.1.0/upgrade_analysis_work.txt,sha256=dM-2IlbkgeTl7Ey9Q651OaXYbMivlT2eCVp6x-IEnIg,182
162
163
  odoo/addons/openupgrade_scripts/scripts/hr_org_chart/16.0.1.0/upgrade_analysis.txt,sha256=Uky8qbUr2mAREwEQdj3oO497YPalkGe6-ZVRq_G08-g,159
@@ -174,9 +175,11 @@ odoo/addons/openupgrade_scripts/scripts/hr_skills/16.0.1.0/noupdate_changes.xml,
174
175
  odoo/addons/openupgrade_scripts/scripts/hr_skills/16.0.1.0/upgrade_analysis.txt,sha256=Oo6V5SlbCldLM72UmYstrO1HKjJbHDoxyG3cP5lLnFs,3033
175
176
  odoo/addons/openupgrade_scripts/scripts/hr_skills_slides/16.0.1.0/upgrade_analysis.txt,sha256=rrtYD2Z3hZU9o7NavHC6-NhEq9c4UT4rWYs1eVtVoxg,186
176
177
  odoo/addons/openupgrade_scripts/scripts/hr_skills_survey/16.0.1.0/upgrade_analysis.txt,sha256=GFhqA9h0mFrVP5SC5YpRLRJTLVwLN-1EPFhRL4y0gDg,171
178
+ odoo/addons/openupgrade_scripts/scripts/hr_timesheet/16.0.1.0/pre-migration.py,sha256=ZY9AHIY3YP_HVJg-Qsh_FB9olrnwLqg4BGd8AJHRpfE,1697
177
179
  odoo/addons/openupgrade_scripts/scripts/hr_timesheet/16.0.1.0/upgrade_analysis.txt,sha256=ej1Ej7foICLBjli5HqNAzGi4tyz6IQ8UW-nvqYItr7A,4076
178
- odoo/addons/openupgrade_scripts/scripts/hr_timesheet_attendance/16.0.1.0/upgrade_analysis.txt,sha256=Fhn3fJPxVqhA-bGTho--ynwvTGPsrAbdW-6g0Q2H990,526
180
+ odoo/addons/openupgrade_scripts/scripts/hr_timesheet/16.0.1.0/upgrade_analysis_work.txt,sha256=zzMuoclczyu1Y1BKo-6yfBvNhnaeM6qO6b-tuOsODf0,4176
179
181
  odoo/addons/openupgrade_scripts/scripts/hr_timesheet_attendance/16.0.1.1/upgrade_analysis.txt,sha256=Fhn3fJPxVqhA-bGTho--ynwvTGPsrAbdW-6g0Q2H990,526
182
+ odoo/addons/openupgrade_scripts/scripts/hr_timesheet_attendance/16.0.1.1/upgrade_analysis_work.txt,sha256=CWoHbjP9h8ae7-7q939Uh0ew8Sf0qqP72hIAKPbVp5M,558
180
183
  odoo/addons/openupgrade_scripts/scripts/hr_work_entry/16.0.1.0/upgrade_analysis.txt,sha256=cAbyDftyWWrH859s-9Iy18Oq5FrmvyKtmX8H5_V7ZHE,275
181
184
  odoo/addons/openupgrade_scripts/scripts/hr_work_entry_contract/16.0.1.0/upgrade_analysis.txt,sha256=H4xuArLCSzJ4blG0j_iWhlk1_aXLW3b5jZeaCZLp2JY,550
182
185
  odoo/addons/openupgrade_scripts/scripts/hr_work_entry_holidays/16.0.1.0/upgrade_analysis.txt,sha256=-wF9U3GWdsuzBlkc7Gz2XYElk4lAGOAmtBUwX8nwVKI,189
@@ -444,7 +447,12 @@ odoo/addons/openupgrade_scripts/scripts/product_images/16.0.1.0/upgrade_analysis
444
447
  odoo/addons/openupgrade_scripts/scripts/product_margin/16.0.1.0/upgrade_analysis.txt,sha256=4ttHOXP24HQX80aD5j6gIjzZBzhAD599KgvOxkR9wmM,165
445
448
  odoo/addons/openupgrade_scripts/scripts/product_margin/16.0.1.0/upgrade_analysis_work.txt,sha256=4ttHOXP24HQX80aD5j6gIjzZBzhAD599KgvOxkR9wmM,165
446
449
  odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/noupdate_changes.xml,sha256=0oH13jMbTYciRXhBd8s5W-ezK9BbpEBrVmAuJMOSdi8,5258
450
+ odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/post-migration.py,sha256=BT7aWbGKC_qA5kaMHQnVM61fDuBUBolWV-9yWzL8Jqo,594
451
+ odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/pre-migration.py,sha256=BGn_5Lsjqo_QgZtFxirM-G7HBHa7q5vY07ZRV25ubcc,5137
447
452
  odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis.txt,sha256=Ra_nPB2OUJ54l31epPuP04icLT8uJrcdGHXqlKrermw,5831
453
+ odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/upgrade_analysis_work.txt,sha256=i35lNMJQ6Ap1z6Nmd-JChXipDqts1akWGWFekAXv0wM,6559
454
+ odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/tests/__init__.py,sha256=7uKZNMbS-tJslQ3DoJoKyUeosa_RNRseB4khQIP8bfc,37
455
+ odoo/addons/openupgrade_scripts/scripts/project/16.0.1.2/tests/test_project_migration.py,sha256=DIN6z623Bx6XtH62I7xq40CHsmWIIbfOYaceSNxsYBc,524
448
456
  odoo/addons/openupgrade_scripts/scripts/project_hr_expense/16.0.1.0/upgrade_analysis.txt,sha256=skVoiLqMWdknfvsv53MZo2un62E7zQzjFaN4NL4PiZs,198
449
457
  odoo/addons/openupgrade_scripts/scripts/project_mrp/16.0.1.0/upgrade_analysis.txt,sha256=mrMSwqKMslVHJCrf0YpQSAL1NE31ZnY9vLW1ep9rjzI,180
450
458
  odoo/addons/openupgrade_scripts/scripts/project_purchase/16.0.1.0/upgrade_analysis.txt,sha256=1bGd47YlH5_3OHH33v-HGc1IES2Zw1vU0V9iNEcTVz8,200
@@ -494,12 +502,15 @@ odoo/addons/openupgrade_scripts/scripts/sale_mrp/16.0.1.0/upgrade_analysis.txt,s
494
502
  odoo/addons/openupgrade_scripts/scripts/sale_product_configurator/16.0.1.0/upgrade_analysis.txt,sha256=3wHhFk4rmZ3PurMy3ZlQ8vH8baRl0xNZ_9ofGp-3By4,455
495
503
  odoo/addons/openupgrade_scripts/scripts/sale_product_matrix/16.0.1.0/upgrade_analysis.txt,sha256=-_99R6PnRJKHWr1zvrruy5m0RYjMSSK-QIlU_CNEJjk,180
496
504
  odoo/addons/openupgrade_scripts/scripts/sale_project/16.0.1.0/upgrade_analysis.txt,sha256=3_MabDi3INHUQI9b0qYLPEAgQ-FiMBVyz6cf3eoldlU,1618
505
+ odoo/addons/openupgrade_scripts/scripts/sale_project/16.0.1.0/upgrade_analysis_work.txt,sha256=XzPdzthCMjGri6-BgxmrLPf1ctXo1i-k8VXdsc80xKg,1648
497
506
  odoo/addons/openupgrade_scripts/scripts/sale_project_stock/16.0.1.0/upgrade_analysis.txt,sha256=CvydNXFLRJ3UyF1j1fW0FMiIYjMGFaA-KI8t4nPXekM,221
498
507
  odoo/addons/openupgrade_scripts/scripts/sale_purchase/16.0.1.0/upgrade_analysis.txt,sha256=KICfQiqiyfFj1kfW0VXF0zyk8wnik_0APGVT0JdU9lY,361
499
508
  odoo/addons/openupgrade_scripts/scripts/sale_quotation_builder/16.0.1.0/noupdate_changes.xml,sha256=rgaGcEPiWrUftrz6BetgECgDqG3M3Nygj3XmTBVMvbo,3497
500
509
  odoo/addons/openupgrade_scripts/scripts/sale_quotation_builder/16.0.1.0/upgrade_analysis.txt,sha256=06ej-ps7VMDzYrQl7Hdd6uR_V_uhY2mtKQniOHUwmtA,351
501
510
  odoo/addons/openupgrade_scripts/scripts/sale_stock/16.0.1.0/upgrade_analysis.txt,sha256=2pgVDl2UDhrMPdfMl6Yts6AJbXt28_q7I1OuE45E4-U,819
511
+ odoo/addons/openupgrade_scripts/scripts/sale_timesheet/16.0.1.0/pre-migration.py,sha256=9xiwKatRFe6WrUE4jYhdS86LaN8EHslHJyiw2kUwJzw,1297
502
512
  odoo/addons/openupgrade_scripts/scripts/sale_timesheet/16.0.1.0/upgrade_analysis.txt,sha256=3ZAhGhCvAVd45pIpfNRtFbhbdv7dhcd6zdS4qhOCjUU,4247
513
+ odoo/addons/openupgrade_scripts/scripts/sale_timesheet/16.0.1.0/upgrade_analysis_work.txt,sha256=_294_KUpIOVVhbiq_HLCpjXqOX-gXd_5zAwL5jzmKK0,4527
503
514
  odoo/addons/openupgrade_scripts/scripts/sales_team/16.0.1.1/upgrade_analysis.txt,sha256=g4BtnBJtJ-XhWm5omP0T--l4R4D8w0H7X1hVZxhCmRI,243
504
515
  odoo/addons/openupgrade_scripts/scripts/sales_team/16.0.1.1/upgrade_analysis_work.txt,sha256=NZeP-iA5SSfLcMa2o9eFGoaZ4JM15eiBDOKDv4aLVOA,260
505
516
  odoo/addons/openupgrade_scripts/scripts/sms/16.0.2.4/upgrade_analysis.txt,sha256=_rqOOvN_wXpJmP-mMhO3SRQoPOD6UMEae_lZaMJGHYY,1513
@@ -624,7 +635,7 @@ odoo/addons/openupgrade_scripts/scripts/website_twitter/16.0.1.0/upgrade_analysi
624
635
  odoo/addons/openupgrade_scripts/static/description/banner.png,sha256=KTIBu4gfxeZVw9zjs_fivTgFEOeaAorlBxajmCA1p6k,26859
625
636
  odoo/addons/openupgrade_scripts/static/description/icon.png,sha256=6xBPJauaFOF0KDHfHgQopSc28kKvxMaeoQFQWZtfZDo,9455
626
637
  odoo/addons/openupgrade_scripts/static/description/index.html,sha256=IOWtZdzr_jN_Dja8HYIfzIxrO8NE5pFgazKJtPsLKw0,12678
627
- odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info/METADATA,sha256=9YkD_SZhpY8K7O5IrM86EbLONApbMaMNoqm1MJA7Wv0,3810
628
- odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
629
- odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
630
- odoo_addon_openupgrade_scripts-16.0.1.0.3.155.dist-info/RECORD,,
638
+ odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info/METADATA,sha256=mToTaIa8ClQEiWd4R-Qr5HGseR1Vt8uH9mA-ACzc9b4,3810
639
+ odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
640
+ odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info/top_level.txt,sha256=qBj40grFkGOfDZ2WDSw3y1RnDlgG0u8rP8pvGNdbz4w,5
641
+ odoo_addon_openupgrade_scripts-16.0.1.0.3.162.dist-info/RECORD,,