Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View 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

View 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
)

View 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

View 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"
),
)

View 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

View 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