@@ -252,18 +252,21 @@ def set_incoming_rate(self, parent=None, row=None, save=False, allow_negative_st
252
252
]:
253
253
return
254
254
255
- if return_aginst := self .get_return_aginst (parent = parent ):
256
- self .set_valuation_rate_for_return_entry (return_aginst , save )
255
+ if return_against := self .get_return_against (parent = parent ):
256
+ self .set_valuation_rate_for_return_entry (return_against , save )
257
257
elif self .type_of_transaction == "Outward" :
258
258
self .set_incoming_rate_for_outward_transaction (
259
259
row , save , allow_negative_stock = allow_negative_stock
260
260
)
261
261
else :
262
262
self .set_incoming_rate_for_inward_transaction (row , save )
263
263
264
- def set_valuation_rate_for_return_entry (self , return_aginst , save = False ):
265
- if valuation_details := self .get_valuation_rate_for_return_entry (return_aginst ):
264
+ def set_valuation_rate_for_return_entry (self , return_against , save = False ):
265
+ if valuation_details := self .get_valuation_rate_for_return_entry (return_against ):
266
266
for row in self .entries :
267
+ if valuation_details :
268
+ self .validate_returned_serial_batch_no (return_against , row , valuation_details )
269
+
267
270
if row .serial_no :
268
271
valuation_rate = valuation_details ["serial_nos" ].get (row .serial_no )
269
272
else :
@@ -280,7 +283,22 @@ def set_valuation_rate_for_return_entry(self, return_aginst, save=False):
280
283
}
281
284
)
282
285
283
- def get_valuation_rate_for_return_entry (self , return_aginst ):
286
+ def validate_returned_serial_batch_no (self , return_against , row , original_inv_details ):
287
+ if row .serial_no and row .serial_no not in original_inv_details ["serial_nos" ]:
288
+ self .throw_error_message (
289
+ _ (
290
+ "Serial No {0} is not present in the {1} {2}, hence you can't return it against the {1} {2}"
291
+ ).format (bold (row .serial_no ), self .voucher_type , bold (return_against ))
292
+ )
293
+
294
+ if row .batch_no and row .batch_no not in original_inv_details ["batches" ]:
295
+ self .throw_error_message (
296
+ _ (
297
+ "Batch No {0} is not present in the original {1} {2}, hence you can't return it against the {1} {2}"
298
+ ).format (bold (row .batch_no ), self .voucher_type , bold (return_against ))
299
+ )
300
+
301
+ def get_valuation_rate_for_return_entry (self , return_against ):
284
302
valuation_details = frappe ._dict (
285
303
{
286
304
"serial_nos" : defaultdict (float ),
@@ -296,7 +314,7 @@ def get_valuation_rate_for_return_entry(self, return_aginst):
296
314
"`tabSerial and Batch Entry`.`incoming_rate`" ,
297
315
],
298
316
filters = [
299
- ["Serial and Batch Bundle" , "voucher_no" , "=" , return_aginst ],
317
+ ["Serial and Batch Bundle" , "voucher_no" , "=" , return_against ],
300
318
["Serial and Batch Entry" , "docstatus" , "=" , 1 ],
301
319
["Serial and Batch Bundle" , "is_cancelled" , "=" , 0 ],
302
320
["Serial and Batch Bundle" , "item_code" , "=" , self .item_code ],
@@ -430,8 +448,8 @@ def get_sle_for_outward_transaction(self):
430
448
431
449
return sle
432
450
433
- def get_return_aginst (self , parent = None ):
434
- return_aginst = None
451
+ def get_return_against (self , parent = None ):
452
+ return_against = None
435
453
436
454
if parent and parent .get ("is_return" ) and parent .get ("return_against" ):
437
455
return parent .get ("return_against" )
@@ -455,7 +473,7 @@ def get_return_aginst(self, parent=None):
455
473
if voucher_details and voucher_details .get ("is_return" ) and voucher_details .get ("return_against" ):
456
474
return voucher_details .get ("return_against" )
457
475
458
- return return_aginst
476
+ return return_against
459
477
460
478
def set_incoming_rate_for_inward_transaction (self , row = None , save = False ):
461
479
valuation_field = "valuation_rate"
0 commit comments