Skip to content

Commit

Permalink
[ADD] add rma_sale_lot
Browse files Browse the repository at this point in the history
  • Loading branch information
sbejaoui committed Aug 27, 2024
1 parent 8250585 commit ba6362d
Show file tree
Hide file tree
Showing 18 changed files with 754 additions and 0 deletions.
84 changes: 84 additions & 0 deletions rma_sale_lot/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
============
Rma Sale Lot
============

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:b78509745350922121af05dc007a0cbd04294051b18538e0e52ba5ce0eb984c4
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Frma-lightgray.png?logo=github
:target: https://github.com/OCA/rma/tree/16.0/rma_sale_lot
:alt: OCA/rma
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/rma-16-0/rma-16-0-rma_sale_lot
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/rma&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module extends the rma_lot module by integrating lot tracking into
the return wizard in the sales orders. It assists salespeople in
accurately recording returns by ensuring that customers are returning
the correct lot that was originally delivered.

This enhancement improves both tracking and inventory accuracy, leading
to more efficient and reliable return processing.

**Table of contents**

.. contents::
:local:

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/rma/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/rma/issues/new?body=module:%20rma_sale_lot%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* ACSONE SA/NV
* BCIM

Contributors
------------

- Jacques-Etienne Baudoux - BCIM [email protected]
- Souheil Bejaoui - ACSONE SA/NV [email protected]

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/rma <https://github.com/OCA/rma/tree/16.0/rma_sale_lot>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 2 additions & 0 deletions rma_sale_lot/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import wizards
from . import models
15 changes: 15 additions & 0 deletions rma_sale_lot/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copyright 2024 ACSONE SA/NV,BCIM
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

{
"name": "Rma Sale Lot",
"summary": """
Manage sale returns with lot.""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,BCIM,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/rma",
"depends": ["rma_lot", "rma_sale"],
"data": ["wizards/sale_order_rma_wizard.xml"],
"demo": [],
}
2 changes: 2 additions & 0 deletions rma_sale_lot/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import sale_order_line
from . import sale_order
14 changes: 14 additions & 0 deletions rma_sale_lot/models/sale_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import models


class SaleOrder(models.Model):

_inherit = "sale.order"

def _prepare_rma_wizard_line_vals(self, data):
vals = super()._prepare_rma_wizard_line_vals(data)
vals["lot_id"] = data.get("lot_id")
return vals
70 changes: 70 additions & 0 deletions rma_sale_lot/models/sale_order_line.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from collections import defaultdict

from odoo import models
from odoo.tools.float_utils import float_round


class SaleOrderLine(models.Model):

_inherit = "sale.order.line"

def _get_qty_done_by_product_lot(self, moves):
res = defaultdict(float)
for group in self.env["stock.move.line"].read_group(
[
("move_id", "in", moves.ids),
("state", "=", "done"),
("move_id.scrapped", "=", False),
],
["qty_done:sum"],
["product_id", "lot_id"],
lazy=False,
):
lot_id = group.get("lot_id")[0] if group.get("lot_id") else False
product_id = group.get("product_id")[0]
qty_done = group.get("qty_done")
res[(product_id, lot_id)] += qty_done
return res

def prepare_sale_rma_data(self):
self.ensure_one()
if self.product_id.type not in ["product", "consu"]:
return {}
moves = self.get_delivery_move()
data = []
qty_done_by_product_lot = self._get_qty_done_by_product_lot(moves)
for (__, lot_id), qty_done in qty_done_by_product_lot.items():
data.append(self._prepare_sale_rma_data_line(moves, lot_id, qty_done))
return data

def _prepare_sale_rma_data_line(self, moves, lot_id, qty_done):
moves = moves.move_line_ids.filtered(
lambda ml, l_id=lot_id: ml.lot_id.id == l_id
).move_id
quantity = qty_done
for returned_move in moves.returned_move_ids.filtered(
lambda r: r.state in ["partially_available", "assigned", "done"]
):
if (
returned_move.restrict_lot_id
and returned_move.restrict_lot_id.id == lot_id
or not lot_id
):
if returned_move.state in ("partially_available", "assigned"):
quantity -= sum(returned_move.move_line_ids.mapped("reserved_qty"))
elif returned_move.state == "done":
quantity -= returned_move.product_qty
quantity = float_round(
quantity, precision_rounding=moves.product_id.uom_id.rounding
)
return {
"product": moves.product_id,
"quantity": quantity,
"uom": moves.product_uom,
"picking": moves.picking_id,
"sale_line_id": self,
"lot_id": lot_id,
}
2 changes: 2 additions & 0 deletions rma_sale_lot/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Jacques-Etienne Baudoux - BCIM <[email protected]>
- Souheil Bejaoui - ACSONE SA/NV <[email protected]>
7 changes: 7 additions & 0 deletions rma_sale_lot/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
This module extends the rma_lot module by integrating lot tracking into the
return wizard in the sales orders. It assists salespeople in accurately
recording returns by ensuring that customers are returning the correct lot that
was originally delivered.

This enhancement improves both tracking and inventory accuracy, leading to
more efficient and reliable return processing.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit ba6362d

Please sign in to comment.