Initial commit: Odoo 18.0-20251222 extra-addons
This commit is contained in:
5
sale_automatic_workflow_stock/models/__init__.py
Executable file
5
sale_automatic_workflow_stock/models/__init__.py
Executable file
@@ -0,0 +1,5 @@
|
||||
from . import automatic_workflow_job
|
||||
from . import sale_order
|
||||
from . import sale_workflow_process
|
||||
from . import stock_move
|
||||
from . import stock_picking
|
||||
48
sale_automatic_workflow_stock/models/automatic_workflow_job.py
Executable file
48
sale_automatic_workflow_stock/models/automatic_workflow_job.py
Executable file
@@ -0,0 +1,48 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# Copyright 2013 Camptocamp SA (author: Guewen Baconnier)
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
import logging
|
||||
|
||||
from odoo import api, models
|
||||
from odoo.tools.safe_eval import safe_eval
|
||||
|
||||
from odoo.addons.sale_automatic_workflow.models.automatic_workflow_job import savepoint
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AutomaticWorkflowJob(models.Model):
|
||||
"""Extend to implement automatic work-flows for stock."""
|
||||
|
||||
_inherit = "automatic.workflow.job"
|
||||
|
||||
def _do_validate_picking(self, picking, domain_filter):
|
||||
"""Validate a stock.picking, filter ensure no duplication"""
|
||||
if not self.env["stock.picking"].search_count(
|
||||
[("id", "=", picking.id)] + domain_filter
|
||||
):
|
||||
return f"{picking.display_name} {picking} job bypassed"
|
||||
picking.validate_picking()
|
||||
return f"{picking.display_name} {picking} validate picking successfully"
|
||||
|
||||
@api.model
|
||||
def _validate_pickings(self, picking_filter):
|
||||
picking_obj = self.env["stock.picking"]
|
||||
pickings = picking_obj.search(picking_filter)
|
||||
_logger.debug("Pickings to validate: %s", pickings.ids)
|
||||
for picking in pickings:
|
||||
with savepoint(self.env.cr):
|
||||
self._do_validate_picking(picking, picking_filter)
|
||||
|
||||
# pylint: disable=W8110
|
||||
@api.model
|
||||
def _handle_pickings(self, sale_workflow):
|
||||
"""Override to add stock picking validation."""
|
||||
super()._handle_pickings(sale_workflow)
|
||||
workflow_domain = self._sale_workflow_domain(sale_workflow)
|
||||
if sale_workflow.validate_picking:
|
||||
self._validate_pickings(
|
||||
safe_eval(sale_workflow.picking_filter_id.domain) + workflow_domain
|
||||
)
|
||||
45
sale_automatic_workflow_stock/models/sale_order.py
Executable file
45
sale_automatic_workflow_stock/models/sale_order.py
Executable file
@@ -0,0 +1,45 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# Copyright 2013 Camptocamp SA (author: Guewen Baconnier)
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class SaleOrder(models.Model):
|
||||
"""Extend to add stock related workflow."""
|
||||
|
||||
_inherit = "sale.order"
|
||||
|
||||
picking_policy = fields.Selection(
|
||||
compute="_compute_picking_policy", store=True, readonly=False
|
||||
)
|
||||
|
||||
def _depends_picking_policy(self):
|
||||
depends = []
|
||||
if hasattr(super(), "_depends_picking_policy"):
|
||||
depends = super()._depends_picking_policy()
|
||||
depends.append("workflow_process_id")
|
||||
return depends
|
||||
|
||||
@api.depends("delivery_status")
|
||||
def _compute_all_qty_delivered(self):
|
||||
for order in self:
|
||||
order.all_qty_delivered = order.delivery_status == "full"
|
||||
|
||||
@api.onchange("workflow_process_id")
|
||||
def _onchange_workflow_process_id(self):
|
||||
if self.workflow_process_id.picking_policy:
|
||||
self.picking_policy = self.workflow_process_id.picking_policy
|
||||
return super()._onchange_workflow_process_id()
|
||||
|
||||
@api.depends(lambda self: self._depends_picking_policy())
|
||||
def _compute_picking_policy(self):
|
||||
res = None
|
||||
if hasattr(super(), "_compute_picking_policy"):
|
||||
res = super()._compute_picking_policy()
|
||||
for order in self.filtered("workflow_process_id"):
|
||||
order_workflow_process = order.workflow_process_id
|
||||
if order_workflow_process.picking_policy:
|
||||
order.picking_policy = order_workflow_process.picking_policy
|
||||
return res
|
||||
32
sale_automatic_workflow_stock/models/sale_workflow_process.py
Executable file
32
sale_automatic_workflow_stock/models/sale_workflow_process.py
Executable file
@@ -0,0 +1,32 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# Copyright 2013 Camptocamp SA (author: Guewen Baconnier)
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class SaleWorkflowProcess(models.Model):
|
||||
"""Extend to add stock related workflow process."""
|
||||
|
||||
_inherit = "sale.workflow.process"
|
||||
|
||||
picking_policy = fields.Selection(
|
||||
selection=[
|
||||
("direct", "Deliver each product when available"),
|
||||
("one", "Deliver all products at once"),
|
||||
],
|
||||
string="Shipping Policy",
|
||||
default="direct",
|
||||
)
|
||||
validate_picking = fields.Boolean(string="Confirm and Transfer Picking")
|
||||
picking_filter_domain = fields.Text(
|
||||
string="Picking Filter Domain", related="picking_filter_id.domain"
|
||||
)
|
||||
picking_filter_id = fields.Many2one(
|
||||
"ir.filters",
|
||||
string="Picking Filter",
|
||||
default=lambda self: self._default_filter(
|
||||
"sale_automatic_workflow_stock.automatic_workflow_picking_filter"
|
||||
),
|
||||
)
|
||||
17
sale_automatic_workflow_stock/models/stock_move.py
Executable file
17
sale_automatic_workflow_stock/models/stock_move.py
Executable file
@@ -0,0 +1,17 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# Copyright 2013 Camptocamp SA (author: Guewen Baconnier)
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class StockMove(models.Model):
|
||||
_inherit = "stock.move"
|
||||
|
||||
def _get_new_picking_values(self):
|
||||
values = super()._get_new_picking_values()
|
||||
sale = self.group_id.sale_id
|
||||
if sale:
|
||||
values["workflow_process_id"] = sale.workflow_process_id.id
|
||||
return values
|
||||
36
sale_automatic_workflow_stock/models/stock_picking.py
Executable file
36
sale_automatic_workflow_stock/models/stock_picking.py
Executable file
@@ -0,0 +1,36 @@
|
||||
# Copyright 2011 Akretion Sébastien BEAU <sebastien.beau@akretion.com>
|
||||
# Copyright 2013 Camptocamp SA (author: Guewen Baconnier)
|
||||
# Copyright 2016 Sodexis
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
from odoo.tools import float_compare
|
||||
|
||||
|
||||
class StockPicking(models.Model):
|
||||
_inherit = "stock.picking"
|
||||
|
||||
workflow_process_id = fields.Many2one(
|
||||
comodel_name="sale.workflow.process", string="Sale Workflow Process"
|
||||
)
|
||||
|
||||
def validate_picking(self):
|
||||
"""Set quantities automatically and validate the pickings."""
|
||||
for picking in self:
|
||||
picking.action_assign()
|
||||
for move in picking.move_ids.filtered(
|
||||
lambda m: m.picked and m.state not in ["done", "cancel"]
|
||||
):
|
||||
rounding = move.product_id.uom_id.rounding
|
||||
if (
|
||||
float_compare(
|
||||
move.quantity,
|
||||
move.product_qty,
|
||||
precision_rounding=rounding,
|
||||
)
|
||||
== -1
|
||||
):
|
||||
for move_line in move.move_line_ids:
|
||||
move_line.quantity = move_line.quantity_product_uom
|
||||
picking.with_context(skip_immediate=True, skip_sms=True).button_validate()
|
||||
return True
|
||||
Reference in New Issue
Block a user