@@ -31,6 +31,7 @@ def setUpClass(cls):
3131 "product_id" : cls .delivery_product .id ,
3232 "fixed_price" : 5.0 ,
3333 "fee_product_id" : cls .fee_product .id ,
34+ "fee_return_percentage" : 75 ,
3435 }
3536 )
3637 cls .carrier_without_fee = cls .env ["delivery.carrier" ].create (
@@ -69,30 +70,153 @@ def setUpClass(cls):
6970 ],
7071 }
7172 )
73+ # Defaults to `False`, but it's useful to declare it explicitly for local tests
74+ cls .env .company .one_delivery_fee_by_sale_order = False
7275
73- def test_delivery_fee_added_on_picking_validation (self ):
74- """Test that delivery fee is added when picking is validated"""
76+ def _validate_picking (self , picking ):
77+ picking .action_set_quantities_to_reservation ()
78+ picking ._action_done ()
79+
80+ def _picking_return (self , picking , qty = None ):
81+ stock_return_picking_form = Form (
82+ self .env ["stock.return.picking" ].with_context (
83+ active_ids = picking .ids ,
84+ active_id = picking .id ,
85+ active_model = "stock.picking" ,
86+ )
87+ )
88+ stock_return_picking = stock_return_picking_form .save ()
89+ if qty :
90+ stock_return_picking .product_return_moves .quantity = qty
91+ stock_return_picking_action = stock_return_picking .create_returns ()
92+ return_pick = self .env ["stock.picking" ].browse (
93+ stock_return_picking_action ["res_id" ]
94+ )
95+ self ._validate_picking (return_pick )
96+ return return_pick
97+
98+ def _add_line_to_sale_order (self , sale ):
99+ so_form = Form (self .sale_order )
100+ with so_form .order_line .new () as line :
101+ line .product_id = self .product
102+ so_form .save ()
103+
104+ def _test_regex_in_report (self , report , res_ids , expression , expected_in_html = True ):
105+ """Helper method to test whether or not a regular expression should be
106+ expected in the report resulting rendering"""
107+ html , _ = self .env ["ir.actions.report" ]._render_qweb_html (report , res_ids )
108+ assertion = self .assertRegex if expected_in_html else self .assertNotRegex
109+ assertion (str (html ), expression )
110+
111+ def _common_test_delivery_fee_added_on_picking_validation (self ):
75112 self .sale_order .carrier_id = self .carrier_with_fee
76113 self .sale_order .action_confirm ()
77114 picking = self .sale_order .picking_ids
78- picking .action_set_quantities_to_reservation ()
79- picking ._action_done ()
115+ self ._validate_picking (picking )
80116 fee_lines = self .sale_order .order_line .filtered ("is_delivery_fee" )
81117 self .assertEqual (len (fee_lines ), 1 )
82118 self .assertEqual (fee_lines .price_unit , 2.0 )
83- # TODO: test render
84- # TODO: test invoice
85- # TODO: test multiple fees
119+ # The fee text is printed
120+ self ._test_regex_in_report (
121+ "stock.report_deliveryslip" ,
122+ picking .ids ,
123+ r"Delivery fee charged per shipment.+2" ,
124+ )
125+
126+ def _common_fee_added_on_picking_validation_refund (self ):
127+ """"""
128+ picking_2 , picking_1 = self .sale_order .picking_ids
129+ return_pick_1 = self ._picking_return (picking_1 )
130+ # The fee shouldn't show up in returns
131+ self ._test_regex_in_report (
132+ "stock.report_deliveryslip" ,
133+ return_pick_1 .ids ,
134+ r"Delivery fee charged per shipment" ,
135+ expected_in_html = False ,
136+ )
137+ self .assertFalse (self .sale_order .all_fee_pickings_returned )
138+ picking_1_fee = self .sale_order .order_line .filtered (
139+ lambda x , pick = picking_1 : x .is_delivery_fee
140+ and x .delivery_fee_picking_id == pick
141+ )
142+ self .assertAlmostEqual (picking_1_fee .price_subtotal , 2 )
143+ self .assertAlmostEqual (picking_1_fee .product_uom_qty , 1 )
144+ return_pick_2 = self ._picking_return (picking_2 )
145+ self ._test_regex_in_report (
146+ "stock.report_deliveryslip" ,
147+ return_pick_2 .ids ,
148+ r"Delivery fee charged per shipment" ,
149+ expected_in_html = False ,
150+ )
151+ self .assertTrue (self .sale_order .all_fee_pickings_returned )
152+ self .assertAlmostEqual (picking_1_fee .price_subtotal , 0.50 )
153+ self .assertAlmostEqual (picking_1_fee .product_uom_qty , 0.25 )
154+
155+ def test_delivery_fee_added_on_picking_validation (self ):
156+ """Test that delivery fee is added when picking is validated"""
157+ self ._common_test_delivery_fee_added_on_picking_validation ()
158+ existing_picking = self .sale_order .picking_ids
159+ # Let's add a new picking
160+ self ._add_line_to_sale_order (self .sale_order )
161+ new_picking = self .sale_order .picking_ids - existing_picking
162+ self ._validate_picking (new_picking )
163+ fee_lines = self .sale_order .order_line .filtered ("is_delivery_fee" )
164+ self .assertEqual (len (fee_lines ), 2 )
165+ self ._test_regex_in_report (
166+ "stock.report_deliveryslip" ,
167+ new_picking .ids ,
168+ r"Delivery fee charged per shipment.+2" ,
169+ )
170+ # The fee is printed in the invoice report as well
171+ invoice = self .sale_order ._create_invoices ()
172+ self ._test_regex_in_report (
173+ "account.report_invoice" ,
174+ invoice .ids ,
175+ r"Delivery fee charged per shipment.+2" ,
176+ )
177+ self ._common_fee_added_on_picking_validation_refund ()
178+
179+ def test_delivery_fee_added_on_picking_validation_one_fee_per_order (self ):
180+ """Same tests as before, but now only one fee is added when the first
181+ picking is validated"""
182+ self .env .company .one_delivery_fee_by_sale_order = True
183+ self ._common_test_delivery_fee_added_on_picking_validation ()
184+ existing_picking = self .sale_order .picking_ids
185+ # Let's add a new picking
186+ self ._add_line_to_sale_order (self .sale_order )
187+ new_picking = self .sale_order .picking_ids - existing_picking
188+ self ._validate_picking (new_picking )
189+ fee_lines = self .sale_order .order_line .filtered ("is_delivery_fee" )
190+ self .assertEqual (len (fee_lines ), 1 , "The fee should be added just once!" )
191+ self ._test_regex_in_report (
192+ "stock.report_deliveryslip" ,
193+ new_picking .ids ,
194+ r"Delivery fee charged per shipment" ,
195+ expected_in_html = False ,
196+ )
197+ # The fee is printed in the invoice report as well
198+ invoice = self .sale_order ._create_invoices ()
199+ self ._test_regex_in_report (
200+ "account.report_invoice" ,
201+ invoice .ids ,
202+ r"Delivery fee charged per shipment.+2" ,
203+ )
204+ self ._common_fee_added_on_picking_validation_refund ()
86205
87206 def test_no_fee_for_carrier_without_fee_product (self ):
88207 """Test that no fee is added if carrier has no fee product"""
89208 self .sale_order .carrier_id = self .carrier_without_fee
90209 self .sale_order .action_confirm ()
91210 picking = self .sale_order .picking_ids
92- picking .move_ids .quantity_done = 1
93- picking ._action_done ()
211+ self ._validate_picking (picking )
94212 fee_lines = self .sale_order .order_line .filtered ("is_delivery_fee" )
95213 self .assertEqual (len (fee_lines ), 0 )
214+ self ._test_regex_in_report (
215+ "stock.report_deliveryslip" ,
216+ picking .ids ,
217+ r"Delivery fee charged per shipment" ,
218+ expected_in_html = False ,
219+ )
96220
97221 def test_exempt_customer_no_fee (self ):
98222 """Test that exempt customers don't get charged delivery fees"""
@@ -102,7 +226,12 @@ def test_exempt_customer_no_fee(self):
102226 self .sale_order .carrier_id = self .carrier_with_fee
103227 self .sale_order .action_confirm ()
104228 picking = self .sale_order .picking_ids
105- picking .move_ids .quantity_done = 1
106- picking ._action_done ()
229+ self ._validate_picking (picking )
107230 fee_lines = self .sale_order .order_line .filtered ("is_delivery_fee" )
108231 self .assertEqual (len (fee_lines ), 0 )
232+ self ._test_regex_in_report (
233+ "stock.report_deliveryslip" ,
234+ picking .ids ,
235+ r"Delivery fee charged per shipment" ,
236+ expected_in_html = False ,
237+ )
0 commit comments