@@ -330,7 +330,9 @@ def test_gle_made_by_asset_sale(self):
330330
331331 post_depreciation_entries (date = add_months (purchase_date , 2 ))
332332
333- si = make_sales_invoice (asset = asset .name , item_code = "Macbook Pro" , company = "_Test Company" )
333+ si = make_sales_invoice (
334+ asset = asset .name , item_code = "Macbook Pro" , company = "_Test Company" , sell_qty = asset .asset_quantity
335+ )
334336 si .customer = "_Test Customer"
335337 si .due_date = date
336338 si .get ("items" )[0 ].rate = 25000
@@ -458,7 +460,9 @@ def test_asset_with_maintenance_required_status_after_sale(self):
458460
459461 post_depreciation_entries (date = "2021-01-01" )
460462
461- si = make_sales_invoice (asset = asset .name , item_code = "Macbook Pro" , company = "_Test Company" )
463+ si = make_sales_invoice (
464+ asset = asset .name , item_code = "Macbook Pro" , company = "_Test Company" , sell_qty = asset .asset_quantity
465+ )
462466 si .customer = "_Test Customer"
463467 si .due_date = nowdate ()
464468 si .get ("items" )[0 ].rate = 25000
@@ -698,6 +702,128 @@ def test_asset_cwip_toggling_cases(self):
698702 frappe .db .set_value ("Asset Category Account" , name , "capital_work_in_progress_account" , cwip_acc )
699703 frappe .db .get_value ("Company" , "_Test Company" , "capital_work_in_progress_account" , cwip_acc )
700704
705+ def test_partial_asset_sale (self ):
706+ date = nowdate ()
707+ purchase_date = add_months (get_first_day (date ), - 2 )
708+ depreciation_start_date = add_months (get_last_day (date ), - 2 )
709+
710+ # create an asset
711+ asset = create_asset (
712+ item_code = "Macbook Pro" ,
713+ is_existing_asset = 1 ,
714+ calculate_depreciation = 1 ,
715+ available_for_use_date = purchase_date ,
716+ purchase_date = purchase_date ,
717+ depreciation_start_date = depreciation_start_date ,
718+ net_purchase_amount = 1000000.0 ,
719+ purchase_amount = 1000000.0 ,
720+ asset_quantity = 10 ,
721+ total_number_of_depreciations = 12 ,
722+ frequency_of_depreciation = 1 ,
723+ submit = 1 ,
724+ )
725+ asset_depr_schedule_before_sale = get_asset_depr_schedule_doc (asset .name , "Active" )
726+ post_depreciation_entries (date )
727+ asset .reload ()
728+
729+ # check asset values before sale
730+ self .assertEqual (asset .asset_quantity , 10 )
731+ self .assertEqual (asset .net_purchase_amount , 1000000 )
732+ self .assertEqual (asset .status , "Partially Depreciated" )
733+ self .assertEqual (
734+ asset_depr_schedule_before_sale .depreciation_schedule [0 ].get ("depreciation_amount" ), 83333.33
735+ )
736+
737+ # make a partial sales against the asset
738+ si = make_sales_invoice (
739+ asset = asset .name , item_code = "Macbook Pro" , company = "_Test Company" , sell_qty = 5
740+ )
741+ si .customer = "_Test Customer"
742+ si .due_date = date
743+ si .get ("items" )[0 ].rate = 25000
744+ si .insert ()
745+ si .submit ()
746+
747+ asset .reload ()
748+ asset_depr_schedule_after_sale = get_asset_depr_schedule_doc (asset .name , "Active" )
749+
750+ # check asset values after sales
751+ self .assertEqual (asset .asset_quantity , 5 )
752+ self .assertEqual (asset .net_purchase_amount , 500000 )
753+ self .assertEqual (asset .status , "Sold" )
754+ self .assertEqual (
755+ asset_depr_schedule_after_sale .depreciation_schedule [0 ].get ("depreciation_amount" ), 41666.66
756+ )
757+
758+ def test_asset_splitting_for_non_existing_asset (self ):
759+ date = nowdate ()
760+ purchase_date = add_months (get_first_day (date ), - 2 )
761+ depreciation_start_date = add_months (get_last_day (date ), - 2 )
762+
763+ asset_qty = 10
764+ asset_rate = 100000.0
765+ asset_item = "Macbook Pro"
766+ asset_location = "Test Location"
767+
768+ frappe .db .set_value ("Item" , asset_item , "is_grouped_asset" , 1 )
769+
770+ # Inward asset via Purchase Receipt
771+ pr = make_purchase_receipt (
772+ item_code = "Macbook Pro" ,
773+ posting_date = purchase_date ,
774+ qty = asset_qty ,
775+ rate = asset_rate ,
776+ location = asset_location ,
777+ supplier = "_Test Supplier" ,
778+ )
779+
780+ asset = frappe .db .get_value ("Asset" , {"purchase_receipt" : pr .name , "docstatus" : 0 }, "name" )
781+ asset_doc = frappe .get_doc ("Asset" , asset )
782+ asset_doc .calculate_depreciation = 1
783+ asset_doc .available_for_use_date = purchase_date
784+ asset_doc .location = asset_location
785+ asset_doc .append (
786+ "finance_books" ,
787+ {
788+ "expected_value_after_useful_life" : 0 ,
789+ "depreciation_method" : "Straight Line" ,
790+ "total_number_of_depreciations" : 12 ,
791+ "frequency_of_depreciation" : 1 ,
792+ "depreciation_start_date" : depreciation_start_date ,
793+ },
794+ )
795+ asset_doc .submit ()
796+
797+ # check asset values before splitting
798+ asset_depr_schedule_before_splitting = get_asset_depr_schedule_doc (asset_doc .name , "Active" )
799+ self .assertEqual (asset_doc .asset_quantity , 10 )
800+ self .assertEqual (asset_doc .net_purchase_amount , 1000000 )
801+ self .assertEqual (
802+ asset_depr_schedule_before_splitting .depreciation_schedule [0 ].get ("depreciation_amount" ), 83333.33
803+ )
804+
805+ # initate asset split
806+ new_asset = split_asset (asset_doc .name , 5 )
807+ asset_doc .reload ()
808+ asset_depr_schedule_after_sale = get_asset_depr_schedule_doc (asset_doc .name , "Active" )
809+ new_asset_depr_schedule = get_asset_depr_schedule_doc (new_asset .name , "Active" )
810+
811+ # check asset values after splitting
812+ self .assertEqual (asset_doc .asset_quantity , 5 )
813+ self .assertEqual (asset_doc .net_purchase_amount , 500000 )
814+ self .assertEqual (
815+ asset_depr_schedule_after_sale .depreciation_schedule [0 ].get ("depreciation_amount" ), 41666.66
816+ )
817+
818+ # check new asset values after splitting
819+ self .assertEqual (new_asset .asset_quantity , 5 )
820+ self .assertEqual (new_asset .net_purchase_amount , 500000 )
821+ self .assertEqual (
822+ new_asset_depr_schedule .depreciation_schedule [0 ].get ("depreciation_amount" ), 41666.66
823+ )
824+
825+ frappe .db .set_value ("Item" , asset_item , "is_grouped_asset" , 0 )
826+
701827
702828class TestDepreciationMethods (AssetSetup ):
703829 def test_schedule_for_straight_line_method (self ):
0 commit comments