Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions sale_stock_available_to_promise_release/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from . import sale_order
from . import sale_order_line
from . import stock_move
from . import stock_picking
from . import procurement_group
from . import product_product
from . import res_config_settings
from . import res_company

This file was deleted.

21 changes: 21 additions & 0 deletions sale_stock_available_to_promise_release/models/sale_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ class SaleOrder(models.Model):
move_need_release_count = fields.Integer(
string="Moves Need Release", compute="_compute_move_need_release_count"
)
is_ok_expected_delivery_date = fields.Boolean(
compute="_compute_is_ok_expected_delivery_date"
)

@api.depends("picking_ids.move_ids.need_release")
def _compute_move_need_release_count(self):
Expand All @@ -18,6 +21,24 @@ def _compute_move_need_release_count(self):
sale.picking_ids.move_ids.filtered("need_release")
)

@api.depends("expected_date", "order_line.availability_status")
def _compute_is_ok_expected_delivery_date(self):
for sale in self:
if not (sale.commitment_date or sale.expected_date):
sale.is_ok_expected_delivery_date = False
continue
for line in sale.order_line:
if (
not line.display_type
and not line.is_delivery
and not line.product_id.type == "service"
and line.availability_status in ("full", "partial", "on_order")
):
sale.is_ok_expected_delivery_date = True
break
else:
sale.is_ok_expected_delivery_date = False

def action_open_move_need_release(self):
self.ensure_one()
if not self.move_need_release_count:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def _get_availability_data(self):
availability_status = "partial"
delayed_qty = self.product_uom_qty - available_qty
# On order product
elif self.is_mto:
elif self._on_order_route():
availability_status = "on_order"
# No stock
elif float_is_zero(available_qty, precision_rounding=rounding):
Expand All @@ -97,3 +97,7 @@ def _get_availability_data(self):
"available_qty": available_qty,
"delayed_qty": delayed_qty,
}

def _on_order_route(self):
self.ensure_one()
return self.is_mto
3 changes: 0 additions & 3 deletions sale_stock_available_to_promise_release/models/stock_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,3 @@ class StockMove(models.Model):
_inherit = "stock.move"

carrier_id = fields.Many2one(related="picking_id.carrier_id", store="True")
sale_date_expected = fields.Date(
"Delivery Date", related="group_id.date_expected", store="True"
)
12 changes: 0 additions & 12 deletions sale_stock_available_to_promise_release/models/stock_picking.py

This file was deleted.

26 changes: 23 additions & 3 deletions sale_stock_available_to_promise_release/reports/sale_order.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,29 @@
t-elif="line.availability_status == 'no'"
name="availability_status_no"
>No</span>
</t>
</td>
</xpath>
</t>
</td>
</xpath>

<xpath expr="//div[@name='expiration_date']" position="after">
<div
t-if="doc.is_ok_expected_delivery_date"
class="col"
name="expected_delivery_date"
>
<strong>Expected delivery</strong>
<div
t-if="doc.commitment_date"
t-field="doc.commitment_date"
t-options="{'widget': 'date'}"
/>
<div
t-else=""
t-field="doc.expected_date"
t-options="{'widget': 'date'}"
/>
</div>
</xpath>
</template>

</odoo>
1 change: 1 addition & 0 deletions sale_stock_available_to_promise_release/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from . import test_sale_line_availability_status
from . import test_sale_ok_expected_date
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Copyright 2025 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)


from .common import Common


class TestSaleOkExpectedDate(Common):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.product_2 = cls.env["product.product"].create(
{
"name": "Test Storable Product Two",
"uom_id": cls.uom_unit.id,
"type": "product",
}
)
# Have a line on the order that will not activate the feature
cls.line_2 = cls.env["sale.order.line"].create(
{
"order_id": cls.sale.id,
"product_id": cls.product_2.id,
"product_uom_qty": 100,
"product_uom": cls.uom_unit.id,
},
)

def test_expected_date_ok(self):
self.sale.action_confirm()
self._set_stock(self.product, 100)
self.assertTrue(self.sale.is_ok_expected_delivery_date)

def test_no_availability(self):
self.sale.action_confirm()
self.assertFalse(self.sale.is_ok_expected_delivery_date)

def test_no_expected_date(self):
self.sale.action_confirm()
self.sale.expected_date = False
self.assertFalse(self.sale.commitment_date)
self.assertFalse(self.sale.is_ok_expected_delivery_date)

def test_no_expected_date_for_service(self):
self.line.unlink()
self.product_2.type = "service"
self.sale.action_confirm()
self.assertFalse(self.sale.is_ok_expected_delivery_date)
21 changes: 9 additions & 12 deletions sale_stock_available_to_promise_release/views/stock_move_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@
<field name="date" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="date" position="after">
<field name="sale_date_expected" />
</field>
</field>
</record>
<record id="view_move_release_form" model="ir.ui.view">
Expand All @@ -33,9 +30,9 @@
<field name="date" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="date" position="after">
<field name="sale_date_expected" />
</field>
<xpath expr="//div[hasclass('o_td_label')]" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
</field>
</record>
<record id="view_move_release_search" model="ir.ui.view">
Expand All @@ -50,26 +47,26 @@
<filter
string="Late Shipment"
name="late"
domain="[('sale_date_expected', '&lt;=', (context_today() + relativedelta(days=-1)).strftime('%Y-%m-%d'))]"
domain="[('date_deadline', '&lt;=', (context_today() + relativedelta(days=-1)).strftime('%Y-%m-%d'))]"
/>
<filter
string="Today Shipment"
name="today"
domain="['&amp;', ('sale_date_expected', '&gt;', (context_today() + relativedelta(days=-1)).strftime('%Y-%m-%d')),
('sale_date_expected', '&lt;', (context_today() + relativedelta(days=1)).strftime('%Y-%m-%d'))]"
domain="['&amp;', ('date_deadline', '&gt;', (context_today() + relativedelta(days=-1)).strftime('%Y-%m-%d')),
('date_deadline', '&lt;', (context_today() + relativedelta(days=1)).strftime('%Y-%m-%d'))]"
/>
<filter
string="Further Shipment"
name="further"
domain="[('sale_date_expected', '&gt;=', (context_today() + relativedelta(days=1)).strftime('%Y-%m-%d'))]"
domain="[('date_deadline', '&gt;=', (context_today() + relativedelta(days=1)).strftime('%Y-%m-%d'))]"
/>
</filter>
<filter name="groupby_date" position="after">
<filter
string="Delivery Date"
name="groupby_sale_date_expected"
name="groupby_date_deadline"
domain="[]"
context="{'group_by': 'sale_date_expected'}"
context="{'group_by': 'date_deadline'}"
/>
</filter>
</field>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_picking_release_tree" model="ir.ui.view">
<field name="name">stock.picking.release.tree</field>
<field name="model">stock.picking</field>
<field
name="inherit_id"
ref="stock_available_to_promise_release.view_picking_release_tree"
/>
<field name="arch" type="xml">
<field name="scheduled_date" position="after">
<field name="sale_date_expected" optional="show" />
</field>
</field>
</record>
<record id="view_picking_release_search" model="ir.ui.view">
<field name="name">stock.picking.release.search</field>
<field name="model">stock.picking</field>
Expand Down
Loading