@@ -1574,6 +1574,65 @@ def test_so_create(self):
15741574 expected_code = 201 ,
15751575 )
15761576
1577+ def test_so_duplicate (self ):
1578+ """Test SalesOrder duplication via the API."""
1579+ from common .models import Parameter , ParameterTemplate
1580+
1581+ url = reverse ('api-so-list' )
1582+
1583+ self .assignRole ('sales_order.add' )
1584+
1585+ so = models .SalesOrder .objects .get (pk = 1 )
1586+ self .assertEqual (so .status , SalesOrderStatus .PENDING )
1587+
1588+ # Add some parameters to the sales order
1589+ for idx in range (5 ):
1590+ template = ParameterTemplate .objects .create (name = f'Template { idx } ' )
1591+
1592+ Parameter .objects .create (
1593+ template = template ,
1594+ model_type = so .get_content_type (),
1595+ model_id = so .pk ,
1596+ data = f'Value { idx } ' ,
1597+ )
1598+
1599+ self .assertEqual (so .parameters .count (), 5 )
1600+
1601+ # Create a duplicate of this sales order
1602+ # We explicitly specify "copy_parameters" as False, so the duplicated sales order should not have any parameters
1603+ response = self .post (
1604+ url ,
1605+ {
1606+ 'reference' : 'SO-12345' ,
1607+ 'customer' : so .customer .pk ,
1608+ 'duplicate' : {'order_id' : so .pk , 'copy_parameters' : False },
1609+ },
1610+ )
1611+
1612+ duplicate_id = response .data ['pk' ]
1613+ duplicate_so = models .SalesOrder .objects .get (pk = duplicate_id )
1614+
1615+ self .assertEqual (duplicate_so .reference , 'SO-12345' )
1616+ self .assertEqual (duplicate_so .customer , so .customer )
1617+ self .assertEqual (duplicate_so .parameters .count (), 0 )
1618+
1619+ # Duplicate again, with default values for the "duplicate" options (which should result in parameters being copied)
1620+ response = self .post (
1621+ url ,
1622+ {
1623+ 'reference' : 'SO-12346' ,
1624+ 'customer' : so .customer .pk ,
1625+ 'duplicate' : {'order_id' : so .pk },
1626+ },
1627+ )
1628+
1629+ duplicate_id = response .data ['pk' ]
1630+ duplicate_so = models .SalesOrder .objects .get (pk = duplicate_id )
1631+
1632+ self .assertEqual (duplicate_so .reference , 'SO-12346' )
1633+ self .assertEqual (duplicate_so .customer , so .customer )
1634+ self .assertEqual (duplicate_so .parameters .count (), 5 )
1635+
15771636 def test_so_cancel (self ):
15781637 """Test API endpoint for cancelling a SalesOrder."""
15791638 so = models .SalesOrder .objects .get (pk = 1 )
0 commit comments