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
3 changes: 1 addition & 2 deletions purchase_stock_ux/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ Several Improvements to purchases.

On purchase orders:

#. Add delivery status on purchases
#. Add a to filter by PO with billable returns.

On purchase lines:

#. Add delivery status on purchase lines
#. Add receipt status on purchase lines
#. Add button on purchase lines to allow cancelling of remaining qty to be received
#. Add return quantity when you return products with "To Refund" option.

Expand Down
30 changes: 9 additions & 21 deletions purchase_stock_ux/i18n/es.po
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,9 @@ msgstr ""
"de la moneda seteada en el producto."

#. module: purchase_stock_ux
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "Delivery Satus"
msgstr "Estado de la recepción"

#. module: purchase_stock_ux
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__delivery_status
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__delivery_status
msgid "Delivery Status"
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__receipt_status
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__receipt_status
msgid "Receipt Status"
msgstr "Estado de la recepción"

#. module: purchase_stock_ux
Expand Down Expand Up @@ -121,13 +116,6 @@ msgstr ""
msgid "Minimum Inventory Rule"
msgstr "Regla de inventario mínimo"

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__no
msgid "Not purchased"
msgstr "Nada para recibir"

#. module: purchase_stock_ux
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__qty_on_voucher
msgid "On Voucher"
Expand Down Expand Up @@ -188,12 +176,12 @@ msgid "Purchase orders with billable returns"
msgstr "Órdenes de compra con devoluciones facturables"

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__full
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__full
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__full
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "Received"
msgid "full"
msgstr "Recibido"

#. module: purchase_stock_ux
Expand Down Expand Up @@ -227,8 +215,8 @@ msgstr ""
"deshacer. ¿Estás seguro de continuar?"

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__to_receive
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "To Receive"
Expand Down
24 changes: 9 additions & 15 deletions purchase_stock_ux/i18n/purchase_stock_ux.pot
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,7 @@ msgstr ""

#. module: purchase_stock_ux
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "Delivery Satus"
msgstr ""

#. module: purchase_stock_ux
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order__delivery_status
#: model:ir.model.fields,field_description:purchase_stock_ux.field_purchase_order_line__delivery_status
msgid "Delivery Status"
msgid "Receipt Status"
msgstr ""

#. module: purchase_stock_ux
Expand Down Expand Up @@ -105,9 +99,9 @@ msgid "Minimum Inventory Rule"
msgstr ""

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__no
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__no
msgid "Not purchased"
msgstr ""

Expand Down Expand Up @@ -167,12 +161,12 @@ msgid "Purchase orders with billable returns"
msgstr ""

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__received
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__full
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__force_delivered_status__full
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__full
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "Received"
msgid "full"
msgstr ""

#. module: purchase_stock_ux
Expand Down Expand Up @@ -203,8 +197,8 @@ msgid ""
msgstr ""

#. module: purchase_stock_ux
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__delivery_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__delivery_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order__receipt_status__to_receive
#: model:ir.model.fields.selection,name:purchase_stock_ux.selection__purchase_order_line__receipt_status__to_receive
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.purchase_order_line_search
#: model_terms:ir.ui.view,arch_db:purchase_stock_ux.view_purchase_order_filter
msgid "To Receive"
Expand Down
51 changes: 7 additions & 44 deletions purchase_stock_ux/models/purchase_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,20 @@
##############################################################################
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools.float_utils import float_compare


class PurchaseOrder(models.Model):
_inherit = "purchase.order"

force_delivered_status = fields.Selection(
[
("no", "Not purchased"),
("received", "Received"),
("pending", "Not Received"),
("partial", "Partially Received"),
("full", "Fully Received"),
],
tracking=True,
copy=False,
)
delivery_status = fields.Selection(
[
("no", "Not purchased"),
("to receive", "To Receive"),
("received", "Received"),
],
compute="_compute_delivery_status",
store=True,
readonly=True,
copy=False,
default="no",
)

with_returns = fields.Boolean(
compute="_compute_with_returns",
Expand All @@ -44,39 +32,14 @@ def _compute_with_returns(self):
else:
order.with_returns = False

@api.depends(
"state",
"order_line.qty_received",
"order_line.qty_returned",
"order_line.product_qty",
"force_delivered_status",
)
def _compute_delivery_status(self):
precision = self.env["decimal.precision"].precision_get("Product Unit of Measure")
@api.depends("picking_ids", "picking_ids.state", "force_delivered_status")
def _compute_receipt_status(self):
super()._compute_receipt_status()
for order in self:
if order.state not in ("purchase", "done"):
order.delivery_status = "no"
continue

if order.force_delivered_status:
order.delivery_status = order.force_delivered_status
order.receipt_status = order.force_delivered_status
continue

if any(
float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision)
== -1
for line in order.order_line
):
order.delivery_status = "to receive"
elif all(
float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision)
>= 0
for line in order.order_line
):
order.delivery_status = "received"
else:
order.delivery_status = "no"

def write(self, values):
self = self.with_context(cancel_from_order=True)
self.check_force_delivered_status(values)
Expand Down
38 changes: 17 additions & 21 deletions purchase_stock_ux/models/purchase_order_line.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@
class PurchaseOrderLine(models.Model):
_inherit = "purchase.order.line"

delivery_status = fields.Selection(
receipt_status = fields.Selection(
[
("no", "Not purchased"),
("to receive", "To Receive"),
("received", "Received"),
("pending", "Not Received"),
("partial", "Partially Received"),
("full", "Fully Received"),
],
compute="_compute_delivery_status",
compute="_compute_receipt_status",
store=True,
readonly=True,
copy=False,
default="no",
)

vouchers = fields.Char(compute="_compute_vouchers")

qty_on_voucher = fields.Float(
Expand Down Expand Up @@ -111,27 +111,23 @@ def _compute_vouchers(self):
rec.vouchers = ", ".join(vouchers)

@api.depends("order_id.state", "qty_received", "qty_returned", "product_qty", "order_id.force_delivered_status")
def _compute_delivery_status(self):
def _compute_receipt_status(self):
precision = self.env["decimal.precision"].precision_get("Product Unit of Measure")
for line in self:
if line.state not in ("purchase", "done"):
line.delivery_status = "no"
line.receipt_status = False
continue
if line.order_id.force_delivered_status:
line.delivery_status = line.order_id.force_delivered_status
line.receipt_status = line.order_id.force_delivered_status
continue
if (
float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision)
== -1
):
line.delivery_status = "to receive"
elif (
float_compare((line.qty_received + line.qty_returned), line.product_qty, precision_digits=precision)
>= 0
):
line.delivery_status = "received"

qty_total = line.qty_received + line.qty_returned
if float_is_zero(qty_total, precision_digits=precision):
line.receipt_status = "pending"
elif float_compare(qty_total, line.product_qty, precision_digits=precision) >= 0:
line.receipt_status = "full"
else:
line.delivery_status = "no"
line.receipt_status = "partial"

@api.onchange("product_qty")
def _onchange_product_qty(self):
Expand Down Expand Up @@ -159,7 +155,7 @@ def _compute_qty_returned(self):
for move in line.move_ids.filtered(
lambda m: m.state == "done" and m.location_id.usage != "supplier" and m.to_refund
):
qty += move.product_uom._compute_quantity(move.product_uom_qty, line.product_uom)
qty += move.product_uom._compute_quantity(move.product_uom_qty, line.product_uom_id)
line.qty_returned = qty

# Overwrite the origin method to introduce the qty_on_voucher
Expand Down
4 changes: 2 additions & 2 deletions purchase_stock_ux/views/purchase_line_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
<field name="arch" type="xml">
<filter position="before">
<field name="vouchers" string="Vouchers" filter_domain="[('move_ids.picking_id.voucher_ids', 'like', self)]" context="{'voucher': self}"/>
<filter name="to_receive" string="To Receive" domain="[('delivery_status','=', 'to receive')]"/>
<filter name="received" string="Received" domain="[('delivery_status','=', 'received')]"/>
<filter name="not_received" string="Not Received" domain="[('receipt_status','=', 'pending')]"/>
<filter name="received" string="Received" domain="[('receipt_status','=', 'full')]"/>
<separator/>
</filter>
</field>
Expand Down
19 changes: 10 additions & 9 deletions purchase_stock_ux/views/purchase_order_views.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
</field>
<!-- agregamos boton de cancelar linea -->
<xpath expr="//field[@name='order_line']/list/field[@name='qty_received']" position="after">
<field name="delivery_status" optional="hidden"/>
<button name="button_cancel_remaining" type="object" title="Cancel remaining quanitity to be received. This will set line quantity equal to received qty and will cancel remaining moves" icon="fa-ban" confirm="This will set line quantity equal to received qty and will cancel remaining moves. This can not be undone. Are you sure you want to continue?" invisible="delivery_status != 'to receive'" groups="purchase.group_purchase_manager"/>
<field name="receipt_status" optional="hidden"/>
<button name="button_cancel_remaining" type="object" title="Cancel remaining quanitity to be received. This will set line quantity equal to received qty and will cancel remaining moves" icon="fa-ban" confirm="This will set line quantity equal to received qty and will cancel remaining moves. This can not be undone. Are you sure you want to continue?" invisible="receipt_status == 'full' or receipt_status == False" groups="purchase.group_purchase_manager"/>
<field name="qty_returned" string="Returned Quantity" column_invisible="parent.state not in ('purchase', 'done')" optional="show"/>
</xpath>
</field>
Expand All @@ -31,12 +31,13 @@
<separator/>
</filter>
<filter name="to_approve" position="before">
<filter name="to_receive" string="To Receive" domain="[('delivery_status','=', 'to receive')]" help="Purchase orders that include lines not received."/>
<filter name="received" string="Received" domain="[('delivery_status','=', 'received')]" help="Purchase orders with all lines received."/>
<filter name="not_received" string="Not Received" domain="[('receipt_status','=', 'pending')]" help="Purchase orders with no lines received."/>
<filter name="partial" string="Partially Received" domain="[('receipt_status','=', 'partial')]" help="Purchase orders that include lines partially received."/>
<filter name="received" string="Received" domain="[('receipt_status','=', 'full')]" help="Purchase orders with all lines received."/>
<separator/>
</filter>
<filter name="invoice_status" position="after">
<filter name="delivery_status" string="Delivery Satus" domain="[]" context="{'group_by':'delivery_status'}"/>
<filter name="receipt_status" string="Receipt Status" domain="[]" context="{'group_by':'receipt_status'}"/>
</filter>
</field>
</record>
Expand All @@ -47,10 +48,10 @@
<field name="inherit_id" ref="purchase.purchase_order_kpis_tree"/>
<field name="arch" type="xml">
<list>
<field name="delivery_status"
decoration-success="delivery_status == 'received'"
decoration-warning="delivery_status == 'to receive'"
decoration-info="delivery_status == 'no'"
<field name="receipt_status"
decoration-success="receipt_status == 'full'"
decoration-warning="receipt_status == 'partial'"
decoration-danger="receipt_status == 'pending'"
widget="badge" optional="show"/>
</list>
</field>
Expand Down