Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][ADD] stock_split_picking_dimension: Split picking based on dimension #1741

Open
wants to merge 1 commit into
base: 16.0
Choose a base branch
from
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
6 changes: 6 additions & 0 deletions setup/stock_split_picking_dimension/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
45 changes: 45 additions & 0 deletions stock_split_picking/tests/common.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Copyright 2017 Tecnativa - Vicent Cubells <[email protected]>
# Copyright 2018 Camptocamp SA - Julien Coux
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.tests.common import TransactionCase

from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT


class TestStockSplitPickingCase(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT))
cls.src_location = cls.env.ref("stock.stock_location_stock")
cls.dest_location = cls.env.ref("stock.stock_location_customers")
cls.product = cls.env["product.product"].create({"name": "Test product"})
cls.product_2 = cls.env["product.product"].create({"name": "Test product 2"})
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
cls.picking = cls.env["stock.picking"].create(
{
"partner_id": cls.partner.id,
"picking_type_id": cls.env.ref("stock.picking_type_out").id,
"location_id": cls.src_location.id,
"location_dest_id": cls.dest_location.id,
}
)

cls.move = cls._create_stock_move(cls.product)
cls.move_2 = cls._create_stock_move(cls.product_2)

@classmethod
def _create_stock_move(cls, product):
return cls.env["stock.move"].create(
{
"name": "/",
"picking_id": cls.picking.id,
"product_id": product.id,
"product_uom_qty": 10,
"product_uom": product.uom_id.id,
"location_id": cls.src_location.id,
"location_dest_id": cls.dest_location.id,
}
)
37 changes: 2 additions & 35 deletions stock_split_picking/tests/test_stock_split_picking.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase

from .common import TestStockSplitPickingCase

class TestStockSplitPicking(TransactionCase):
@classmethod
def setUpClass(cls):
super(TestStockSplitPicking, cls).setUpClass()

cls.src_location = cls.env.ref("stock.stock_location_stock")
cls.dest_location = cls.env.ref("stock.stock_location_customers")
cls.product = cls.env["product.product"].create({"name": "Test product"})
cls.product_2 = cls.env["product.product"].create({"name": "Test product 2"})
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
cls.picking = cls.env["stock.picking"].create(
{
"partner_id": cls.partner.id,
"picking_type_id": cls.env.ref("stock.picking_type_out").id,
"location_id": cls.src_location.id,
"location_dest_id": cls.dest_location.id,
}
)

def _create_stock_move(product):
return cls.env["stock.move"].create(
{
"name": "/",
"picking_id": cls.picking.id,
"product_id": product.id,
"product_uom_qty": 10,
"product_uom": product.uom_id.id,
"location_id": cls.src_location.id,
"location_dest_id": cls.dest_location.id,
}
)

cls.move = _create_stock_move(cls.product)
cls.move_2 = _create_stock_move(cls.product_2)

class TestStockSplitPicking(TestStockSplitPickingCase):
def test_stock_split_picking(self):
# Picking state is draft
self.assertEqual(self.picking.state, "draft")
Expand Down
135 changes: 135 additions & 0 deletions stock_split_picking_dimension/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
=============================
Stock Split Picking Dimension
=============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:76c19f7b2d6580b5686d3333c41d0b31c1cf1cad9bafdf00460524a0b6a44d84
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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%2Fstock--logistics--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-workflow/tree/16.0/stock_split_picking_dimension
:alt: OCA/stock-logistics-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-workflow-16-0/stock-logistics-workflow-16-0-stock_split_picking_dimension
: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/stock-logistics-workflow&target_branch=16.0
:alt: Try me on Runboat

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

This module extends the functionality of the stock_split_picking module
to allow the user to split the picking by dimensions to ensure that the
contents of the picking to process will not exceed a certain volume
and/or weight and/or number of lines.

**Table of contents**

.. contents::
:local:

Use Cases / Context
===================

When dealing with large quantities of products, it could be useful to be
able to split the picking into multiple pickings to simplify the picking
process and improve the efficiency of the warehouse. Some times, the
picking you would like to process is too large to be picked in one go or
too heavy to be carried by one person or contains too many different
products to be picked in one go.

Usage
=====

#. Go to **Inventory** dashboard and open any picking.

#. If picking state is **available** you can see an split button.

#. If you click on **Split** button, a wizard will open.

#. The wizard will let you choose the way you want to split the picking.

#. To split by dimension, select **By Dimension** option.

#. Enter the values for **Volume**, **Weight** and **Number of Lines**.
(You can leave any of the fields empty if you don't want to split by
that dimension).

#. Click on **Split** button.

#. The current picking will be split into two different pickings. The
first picking will contain the lines that fit the dimensions you
entered. The second picking will contain the remaining lines.

Known issues / Roadmap
======================

- The split by dimension only split at the move level. In other words,
if a move has 10 units of a product with a weight of 1kg, the wizard
will not split the move in different pickings even if a weight of 5kg
is requested as max weight by picking.

Changelog
=========

16.0.1.0.0
----------

- Initial version

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

Bugs are tracked on `GitHub Issues <https://github.com/OCA/stock-logistics-workflow/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/stock-logistics-workflow/issues/new?body=module:%20stock_split_picking_dimension%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

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

- Laurent Mignon [email protected] (https://www.acsone.eu)

Other credits
-------------

The development of this module has been financially supported by:

- ALCYON Benelux

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/stock-logistics-workflow <https://github.com/OCA/stock-logistics-workflow/tree/16.0/stock_split_picking_dimension>`_ project on GitHub.

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

{
"name": "Stock Split Picking Dimension",
"summary": """Split a picking in two not transferred pickings to ensure that the """
"""first one doesn't exceed given dimensions (nbr lines, volume, weight)""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "ACSONE SA/NV,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-workflow",
"depends": [
"delivery", # weight on picking
"stock_picking_volume", # OCA/stock-logistics-warehouse
"stock_split_picking", # OCA/stock-logistics-worflow
],
"data": [
"wizards/stock_split_picking.xml",
],
"demo": [],
}
20 changes: 20 additions & 0 deletions stock_split_picking_dimension/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2024 ACSONE SA/NV
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import _
from odoo.exceptions import ValidationError


class DimensionRequiredError(ValidationError):
def __init__(self, env):
self.env = env
super().__init__(_("At least one dimension must be set"))


class DimensionMustBePositiveError(ValidationError):
def __init__(self, env, field):
self.env = env
field_label = field._description_string(self.env)
super().__init__(
_("Value of '%(field_label)s' must be positive", field_label=field_label)
)
5 changes: 5 additions & 0 deletions stock_split_picking_dimension/readme/CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
When dealing with large quantities of products, it could be useful to be able to split
the picking into multiple pickings to simplify the picking process and improve the
efficiency of the warehouse. Some times, the picking you would like to process is too
large to be picked in one go or too heavy to be carried by one person or contains too
many different products to be picked in one go.
1 change: 1 addition & 0 deletions stock_split_picking_dimension/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Laurent Mignon <[email protected]> (https://www.acsone.eu)
3 changes: 3 additions & 0 deletions stock_split_picking_dimension/readme/CREDITS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
The development of this module has been financially supported by:

- ALCYON Benelux
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- ALCYON Benelux
- ALCYON Belux

3 changes: 3 additions & 0 deletions stock_split_picking_dimension/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This module extends the functionality of the stock_split_picking module to allow the
user to split the picking by dimensions to ensure that the contents of the picking to
process will not exceed a certain volume and/or weight and/or number of lines.
3 changes: 3 additions & 0 deletions stock_split_picking_dimension/readme/HISTORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 16.0.1.0.0

- Initial version
3 changes: 3 additions & 0 deletions stock_split_picking_dimension/readme/ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- The split by dimension only split at the move level. In other words, if a move has 10
units of a product with a weight of 1kg, the wizard will not split the move in
different pickings even if a weight of 5kg is requested as max weight by picking.
18 changes: 18 additions & 0 deletions stock_split_picking_dimension/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#. Go to **Inventory** dashboard and open any picking.

#. If picking state is **available** you can see an split button.

#. If you click on **Split** button, a wizard will open.

#. The wizard will let you choose the way you want to split the picking.

#. To split by dimension, select **By Dimension** option.

#. Enter the values for **Volume**, **Weight** and **Number of Lines**. (You can leave
any of the fields empty if you don't want to split by that dimension).

#. Click on **Split** button.

#. The current picking will be split into two different pickings. The first picking will
contain the lines that fit the dimensions you entered. The second picking will contain
the remaining lines.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading