@@ -1141,3 +1141,146 @@ def test_task_recurrency_semester_force_month(self):
1141
1141
self .assertEqual (
1142
1142
task .date_deadline .date (), fields .Date .from_string ("2025-04-30" )
1143
1143
)
1144
+
1145
+ def test_service_tracking_onchange (self ):
1146
+ """Test the onchange behavior of service_tracking field for both
1147
+ product.template and product.product models"""
1148
+
1149
+ # Test product.template onchange
1150
+ template = self .service_task_recurrency .product_tmpl_id
1151
+ self .assertTrue (template .recurring_task )
1152
+
1153
+ # Test changing to 'no' service tracking
1154
+ template .service_tracking = "no"
1155
+ template ._onchange_service_tracking ()
1156
+ self .assertFalse (template .recurring_task )
1157
+
1158
+ # Test changing back to task_global_project
1159
+ template .service_tracking = "task_global_project"
1160
+ template ._onchange_service_tracking ()
1161
+ # Note: changing service_tracking doesn't automatically re-enable recurring_task
1162
+ self .assertFalse (template .recurring_task )
1163
+
1164
+ # Test changing to 'task_in_project'
1165
+ template .recurring_task = True
1166
+ template .service_tracking = "task_in_project"
1167
+ template ._onchange_service_tracking ()
1168
+ self .assertTrue (template .recurring_task )
1169
+
1170
+ # Test changing to 'project_only'
1171
+ template .service_tracking = "project_only"
1172
+ template ._onchange_service_tracking ()
1173
+ self .assertFalse (template .recurring_task )
1174
+
1175
+ # Test product.product onchange
1176
+ product = self .service_task_recurrency
1177
+ product .recurring_task = True
1178
+
1179
+ # Test changing to 'no' service tracking
1180
+ product .service_tracking = "no"
1181
+ product ._onchange_service_tracking ()
1182
+ self .assertFalse (product .recurring_task )
1183
+
1184
+ # Test changing back to task_global_project
1185
+ product .service_tracking = "task_global_project"
1186
+ product ._onchange_service_tracking ()
1187
+ # Note: changing service_tracking doesn't automatically re-enable recurring_task
1188
+ self .assertFalse (product .recurring_task )
1189
+
1190
+ # Test changing to 'task_in_project'
1191
+ product .recurring_task = True
1192
+ product .service_tracking = "task_in_project"
1193
+ product ._onchange_service_tracking ()
1194
+ self .assertTrue (product .recurring_task )
1195
+
1196
+ # Test changing to 'project_only'
1197
+ product .service_tracking = "project_only"
1198
+ product ._onchange_service_tracking ()
1199
+ self .assertFalse (product .recurring_task )
1200
+
1201
+ def test_service_tracking_create_variants (self ):
1202
+ # Create a product attribute and value
1203
+ attribute = self .env ["product.attribute" ].create (
1204
+ {
1205
+ "name" : "Test Attribute" ,
1206
+ }
1207
+ )
1208
+ val1 = self .env ["product.attribute.value" ].create (
1209
+ {"name" : "Value 1" , "attribute_id" : attribute .id }
1210
+ )
1211
+ val2 = self .env ["product.attribute.value" ].create (
1212
+ {"name" : "Value 2" , "attribute_id" : attribute .id }
1213
+ )
1214
+
1215
+ # Create a product template with the service tracking and recurring task
1216
+ template = self .env ["product.template" ].create (
1217
+ {
1218
+ "name" : "Test Service with Variants" ,
1219
+ "type" : "service" ,
1220
+ "service_tracking" : "task_global_project" ,
1221
+ "recurring_task" : True ,
1222
+ "attribute_line_ids" : [
1223
+ (
1224
+ 0 ,
1225
+ 0 ,
1226
+ {
1227
+ "attribute_id" : attribute .id ,
1228
+ "value_ids" : [(6 , 0 , [val1 .id , val2 .id ])],
1229
+ },
1230
+ )
1231
+ ],
1232
+ }
1233
+ )
1234
+
1235
+ # Create product variants
1236
+ variants = template .product_variant_ids
1237
+
1238
+ # Ensure recurring_task is set on variants
1239
+ for variant in variants :
1240
+ self .assertTrue (variant .recurring_task )
1241
+
1242
+ # Change service_tracking to task_in_project
1243
+ variant = variants [0 ] # Assuming the first variant
1244
+ variant .service_tracking = "task_in_project"
1245
+ variant ._onchange_service_tracking ()
1246
+
1247
+ # Assert that recurring_task is now True after service_tracking change
1248
+ self .assertTrue (variant .recurring_task )
1249
+
1250
+ def test_service_tracking_edge_cases (self ):
1251
+ """Test edge cases and special scenarios for service tracking"""
1252
+
1253
+ product = self .service_task_recurrency
1254
+
1255
+ # Test rapid changes in service tracking
1256
+ service_tracking_values = [
1257
+ "no" ,
1258
+ "task_global_project" ,
1259
+ "project_only" ,
1260
+ "task_in_project" ,
1261
+ ]
1262
+ for tracking in service_tracking_values :
1263
+ product .recurring_task = True
1264
+ product .service_tracking = tracking
1265
+ product ._onchange_service_tracking ()
1266
+ if tracking in ["task_global_project" , "task_in_project" ]:
1267
+ self .assertTrue (product .recurring_task )
1268
+ else :
1269
+ self .assertFalse (product .recurring_task )
1270
+
1271
+ # Test changing service tracking with recurring task enabled/disabled
1272
+ product .recurring_task = True
1273
+ product .service_tracking = "task_global_project"
1274
+ product ._onchange_service_tracking ()
1275
+ self .assertTrue (product .recurring_task )
1276
+
1277
+ # Test disabling service tracking
1278
+ product .service_tracking = "no"
1279
+ product ._onchange_service_tracking ()
1280
+ self .assertFalse (product .recurring_task )
1281
+
1282
+ # Test re-enabling service tracking
1283
+ # Note: It should not automatically re-enable recurring_task
1284
+ product .service_tracking = "task_global_project"
1285
+ product ._onchange_service_tracking ()
1286
+ self .assertFalse (product .recurring_task )
0 commit comments