Skip to content

Commit

Permalink
[UPD] delivery_package_fee: delivery fee by stock package type
Browse files Browse the repository at this point in the history
  • Loading branch information
nguyenminhchien committed Oct 4, 2023
1 parent 93cb9b1 commit a57e025
Show file tree
Hide file tree
Showing 5 changed files with 190 additions and 2 deletions.
2 changes: 1 addition & 1 deletion delivery_package_fee/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{
"name": "Delivery Package Fees",
"summary": "Add fees on delivered packages on shipping methods",
"version": "16.0.1.0.0",
"version": "16.0.1.1.0",
"category": "Delivery",
"website": "https://github.com/OCA/delivery-carrier",
"author": "Camptocamp, Odoo Community Association (OCA)",
Expand Down
3 changes: 3 additions & 0 deletions delivery_package_fee/models/delivery_package_fee.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ class DeliveryPackageFee(models.Model):
ondelete="restrict",
)
active = fields.Boolean(default=True)
package_type_id = fields.Many2one(
comodel_name="stock.package.type"
)
5 changes: 4 additions & 1 deletion delivery_package_fee/models/sale_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ def _get_fee_line_qty_from_out_package(self, package_fee, picking, package):
Return 1 by default.
"""
return 1
res = 1
if package_fee.package_type_id and package_fee.package_type_id != package.package_type_id:
res = 0
return res

def _package_fee_line_qty_and_price(self, package_fee, picking):
fee_product = package_fee.product_id
Expand Down
181 changes: 181 additions & 0 deletions delivery_package_fee/tests/test_package_fee.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ def setUpClass(cls):
cls.pack1 = cls.env["stock.quant.package"].create({})
cls.pack2 = cls.env["stock.quant.package"].create({})

cls.sptype1 = cls.env["stock.package.type"].create({"name": "SPType 1"})
cls.sptype2 = cls.env["stock.package.type"].create({"name": "SPType 2"})

@classmethod
def _update_qty_in_location(cls, location, product, quantity):
quants = cls.env["stock.quant"]._gather(product, location, strict=True)
Expand Down Expand Up @@ -394,3 +397,181 @@ def test_package_no_price(self):
},
],
)

def test_package_with_type_no_fee_line(self):
"""Assign all fee lines to a package type, no fee line added to SO"""
self.carrier.package_fee_ids.write({"package_type_id": self.sptype1.id})
picking = self.sale.picking_ids
self.assertEqual(picking.state, "assigned")
picking.move_line_ids[0].result_package_id = self.pack1
picking.move_line_ids[0].qty_done = 10.0
picking.move_line_ids[1].result_package_id = self.pack2
picking.move_line_ids[1].qty_done = 10.0
picking._action_done()
self.assertEqual(picking.state, "done")

self.assertRecordValues(
self.sale.order_line,
[
{
"product_id": self.product1.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 1",
},
{
"product_id": self.product2.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 2",
},
{
"product_id": self.carrier_product.id,
"product_uom_qty": 1.0,
"price_unit": 10.0,
"name": "Delivery",
},
],
)

def test_package_with_type_one_fee_line(self):
"""Assign all fee lines to a package type, but one fee line added to SO"""
self.carrier.package_fee_ids[0].package_type_id = self.sptype1
self.carrier.package_fee_ids[1].package_type_id = self.sptype2
self.pack1.package_type_id = self.sptype1
picking = self.sale.picking_ids
self.assertEqual(picking.state, "assigned")
picking.move_line_ids[0].result_package_id = self.pack1
picking.move_line_ids[0].qty_done = 10.0
picking.move_line_ids[1].result_package_id = self.pack2
picking.move_line_ids[1].qty_done = 10.0
picking._action_done()
self.assertEqual(picking.state, "done")

self.assertRecordValues(
self.sale.order_line,
[
{
"product_id": self.product1.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 1",
},
{
"product_id": self.product2.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 2",
},
{
"product_id": self.carrier_product.id,
"product_uom_qty": 1.0,
"price_unit": 10.0,
"name": "Delivery",
},
# additional package fee lines from here
{
"product_id": self.fee1.id,
"product_uom_qty": 1.0,
"price_unit": 3.0,
"name": "LSVA Fee ({})".format(picking.name),
}
],
)

def test_package_with_type_one_fee_line_qty(self):
"""Assign all fee lines to a package type, but one fee line added to SO, qty=2"""
self.carrier.package_fee_ids[0].package_type_id = self.sptype1
self.carrier.package_fee_ids[1].package_type_id = self.sptype2
self.pack1.package_type_id = self.sptype1
self.pack2.package_type_id = self.sptype1
picking = self.sale.picking_ids
self.assertEqual(picking.state, "assigned")
picking.move_line_ids[0].result_package_id = self.pack1
picking.move_line_ids[0].qty_done = 10.0
picking.move_line_ids[1].result_package_id = self.pack2
picking.move_line_ids[1].qty_done = 10.0
picking._action_done()
self.assertEqual(picking.state, "done")

self.assertRecordValues(
self.sale.order_line,
[
{
"product_id": self.product1.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 1",
},
{
"product_id": self.product2.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 2",
},
{
"product_id": self.carrier_product.id,
"product_uom_qty": 1.0,
"price_unit": 10.0,
"name": "Delivery",
},
# additional package fee lines from here
{
"product_id": self.fee1.id,
"product_uom_qty": 2.0,
"price_unit": 3.0,
"name": "LSVA Fee ({})".format(picking.name),
},
],
)
def test_package_with_type_two_fee_line_qty(self):
"""Assign all fee lines to a package type, 2 fee lines added to SO"""
self.carrier.package_fee_ids[0].package_type_id = self.sptype1
self.carrier.package_fee_ids[1].package_type_id = self.sptype2
self.pack1.package_type_id = self.sptype1
self.pack2.package_type_id = self.sptype2
picking = self.sale.picking_ids
self.assertEqual(picking.state, "assigned")
picking.move_line_ids[0].result_package_id = self.pack1
picking.move_line_ids[0].qty_done = 10.0
picking.move_line_ids[1].result_package_id = self.pack2
picking.move_line_ids[1].qty_done = 10.0
picking._action_done()
self.assertEqual(picking.state, "done")

self.assertRecordValues(
self.sale.order_line,
[
{
"product_id": self.product1.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 1",
},
{
"product_id": self.product2.id,
"product_uom_qty": 10.0,
"price_unit": 1.0,
"name": "Product 2",
},
{
"product_id": self.carrier_product.id,
"product_uom_qty": 1.0,
"price_unit": 10.0,
"name": "Delivery",
},
# additional package fee lines from here
{
"product_id": self.fee1.id,
"product_uom_qty": 1.0,
"price_unit": 3.0,
"name": "LSVA Fee ({})".format(picking.name),
},
{
"product_id": self.fee2.id,
"product_uom_qty": 1.0,
"price_unit": 4.0,
"name": "Service Fee ({})".format(picking.name),
},
],
)
1 change: 1 addition & 0 deletions delivery_package_fee/views/delivery_carrier_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
name="product_id"
context="{'default_type': 'service', 'default_sale_ok': False, 'default_purchase_ok': False}"
/>
<field name="package_type_id" />
<field name="active" />
</tree>
</field>
Expand Down

0 comments on commit a57e025

Please sign in to comment.