purchase_delivery_carrier: new module to add carriers to purchase orders and suppliers
This commit is contained in:
parent
35e04f678c
commit
056d438413
9 changed files with 174 additions and 0 deletions
1
purchase_delivery_carrier/__init__.py
Normal file
1
purchase_delivery_carrier/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from . import models
|
||||
36
purchase_delivery_carrier/__manifest__.py
Normal file
36
purchase_delivery_carrier/__manifest__.py
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
#
|
||||
# Bemade Inc.
|
||||
#
|
||||
# Copyright (C) 2023-June Bemade Inc. (<https://www.bemade.org>).
|
||||
# Author: Marc Durepos (Contact : marc@bemade.org)
|
||||
#
|
||||
# This program is under the terms of the GNU Lesser General Public License,
|
||||
# version 3.
|
||||
#
|
||||
# For full license details, see https://www.gnu.org/licenses/lgpl-3.0.en.html.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
{
|
||||
"name": "Purchase Delivery Carrier",
|
||||
"version": "18.0.1.0.0",
|
||||
"summary": "Adds delivery carrier information to vendors, purchase orders and receipts",
|
||||
"category": "Purchase",
|
||||
"author": "Bemade Inc.",
|
||||
"website": "http://www.bemade.org",
|
||||
"license": "LGPL-3",
|
||||
"depends": ["purchase", "delivery", "stock"],
|
||||
"data": [
|
||||
"views/purchase_order_views.xml",
|
||||
"views/res_partner_views.xml",
|
||||
],
|
||||
"assets": {},
|
||||
"installable": True,
|
||||
"auto_install": False,
|
||||
}
|
||||
2
purchase_delivery_carrier/models/__init__.py
Normal file
2
purchase_delivery_carrier/models/__init__.py
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
from . import res_partner
|
||||
from . import purchase_order
|
||||
26
purchase_delivery_carrier/models/purchase_order.py
Normal file
26
purchase_delivery_carrier/models/purchase_order.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class PurchaseOrder(models.Model):
|
||||
_inherit = "purchase.order"
|
||||
|
||||
delivery_carrier_id = fields.Many2one(
|
||||
comodel_name="delivery.carrier",
|
||||
string="Delivery Carrier",
|
||||
compute="_compute_delivery_carrier_id",
|
||||
inverse="_inverse_delivery_carrier_id",
|
||||
store=True,
|
||||
)
|
||||
|
||||
@api.depends("partner_id")
|
||||
def _compute_delivery_carrier_id(self):
|
||||
for rec in self:
|
||||
rec.delivery_carrier_id = rec.partner_id.delivery_carrier_id
|
||||
|
||||
def _inverse_delivery_carrier_id(self):
|
||||
pass
|
||||
|
||||
def _prepare_picking(self):
|
||||
res = super()._prepare_picking()
|
||||
res.update(carrier_id=self.delivery_carrier_id.id)
|
||||
return res
|
||||
10
purchase_delivery_carrier/models/res_partner.py
Normal file
10
purchase_delivery_carrier/models/res_partner.py
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_inherit = "res.partner"
|
||||
|
||||
delivery_carrier_id = fields.Many2one(
|
||||
comodel_name="delivery.carrier",
|
||||
string="Default Carrier",
|
||||
)
|
||||
1
purchase_delivery_carrier/tests/__init__.py
Normal file
1
purchase_delivery_carrier/tests/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
from . import test_purchase_delivery
|
||||
71
purchase_delivery_carrier/tests/test_purchase_delivery.py
Normal file
71
purchase_delivery_carrier/tests/test_purchase_delivery.py
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
from odoo.tests import TransactionCase, tagged
|
||||
from odoo import Command
|
||||
|
||||
|
||||
@tagged("post_install", "-at_install")
|
||||
class TestPurchaseDelivery(TransactionCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.carrier_1 = cls.env.ref("delivery.delivery_local_delivery")
|
||||
cls.carrier_2 = cls.env.ref("delivery.free_delivery_carrier")
|
||||
|
||||
cls.partner_1 = cls.env["res.partner"].create(
|
||||
{
|
||||
"name": "Test 1",
|
||||
"delivery_carrier_id": cls.carrier_1.id,
|
||||
}
|
||||
)
|
||||
cls.partner_2 = cls.env["res.partner"].create(
|
||||
{
|
||||
"name": "Test 2",
|
||||
}
|
||||
)
|
||||
cls.product = cls.env["product.product"].create(
|
||||
{
|
||||
"name": "Test product",
|
||||
"seller_ids": [
|
||||
Command.create(
|
||||
{
|
||||
"partner_id": cls.partner_1.id,
|
||||
"price": 100.0,
|
||||
}
|
||||
),
|
||||
Command.create(
|
||||
{
|
||||
"partner_id": cls.partner_2.id,
|
||||
"price": 200.0,
|
||||
}
|
||||
),
|
||||
],
|
||||
}
|
||||
)
|
||||
|
||||
def test_carrier_set_on_purchase_order_when_default_is_set(self):
|
||||
purchase_order = self.env["purchase.order"].create(
|
||||
{
|
||||
"partner_id": self.partner_1.id,
|
||||
"order_line": [Command.create({"product_id": self.product.id})],
|
||||
}
|
||||
)
|
||||
|
||||
self.assertEqual(purchase_order.delivery_carrier_id, self.carrier_1)
|
||||
|
||||
def test_carrier_not_set_on_purchase_order_when_default_is_not_set(self):
|
||||
purchase_order = self.env["purchase.order"].create(
|
||||
{
|
||||
"partner_id": self.partner_2.id,
|
||||
}
|
||||
)
|
||||
self.assertFalse(purchase_order.delivery_carrier_id)
|
||||
|
||||
def test_carrier_trickles_down_to_picking(self):
|
||||
purchase_order = self.env["purchase.order"].create(
|
||||
{
|
||||
"partner_id": self.partner_1.id,
|
||||
"order_line": [Command.create({"product_id": self.product.id})],
|
||||
}
|
||||
)
|
||||
purchase_order.button_confirm()
|
||||
picking = purchase_order.picking_ids
|
||||
self.assertEqual(picking.carrier_id, self.carrier_1)
|
||||
14
purchase_delivery_carrier/views/purchase_order_views.xml
Normal file
14
purchase_delivery_carrier/views/purchase_order_views.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="purchase_order_form_inherit" model="ir.ui.view">
|
||||
<field name="name">purchase.order.delivery.form.inherit</field>
|
||||
<field name="model">purchase.order</field>
|
||||
<field name="inherit_id" ref="purchase.purchase_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<group name="other_info">
|
||||
<field name="delivery_carrier_id"/>
|
||||
</group>
|
||||
</field>
|
||||
|
||||
</record>
|
||||
</odoo>
|
||||
13
purchase_delivery_carrier/views/res_partner_views.xml
Normal file
13
purchase_delivery_carrier/views/res_partner_views.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="view_partner_property_form_inherit" model="ir.ui.view">
|
||||
<field name="name">res.partner.carrier.property.form.inherit</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="purchase.view_partner_property_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<group name="purchase" position="inside">
|
||||
<field name="delivery_carrier_id"/>
|
||||
</group>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Loading…
Reference in a new issue