92 lines
3.3 KiB
Python
Executable File
92 lines
3.3 KiB
Python
Executable File
# Copyright 2017 Denis Leemann, Camptocamp SA
|
|
# Copyright 2021 Iván Todorovich, Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class ManualDelivery(models.TransientModel):
|
|
_name = "manual.delivery"
|
|
_description = "Manual Delivery"
|
|
_order = "create_date desc"
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
res = super().default_get(fields)
|
|
# Get lines from active_model if it's a sale.order / sale.order.line
|
|
sale_lines = self.env["sale.order.line"]
|
|
active_model = self.env.context["active_model"]
|
|
if active_model == "sale.order.line":
|
|
sale_ids = self.env.context["active_ids"] or []
|
|
sale_lines = self.env["sale.order.line"].browse(sale_ids)
|
|
elif active_model == "sale.order":
|
|
sale_ids = self.env.context["active_ids"] or []
|
|
sale_lines = self.env["sale.order"].browse(sale_ids).mapped("order_line")
|
|
if len(sale_lines.mapped("order_id.partner_id")) > 1:
|
|
raise UserError(_("Please select one partner at a time"))
|
|
if sale_lines:
|
|
# Get partner from those lines
|
|
partner = sale_lines.mapped("order_id.partner_id")
|
|
res["partner_id"] = partner.id
|
|
res["commercial_partner_id"] = partner.commercial_partner_id.id
|
|
# Convert to manual.delivery.lines
|
|
res["line_ids"] = [
|
|
(
|
|
0,
|
|
0,
|
|
{
|
|
"order_line_id": line.id,
|
|
"name": line.name,
|
|
"product_id": line.product_id.id,
|
|
"qty_ordered": line.product_uom_qty,
|
|
"qty_procured": line.qty_procured,
|
|
"quantity": line.qty_to_procure,
|
|
},
|
|
)
|
|
for line in sale_lines
|
|
if line.qty_to_procure and line.product_id.type != "service"
|
|
]
|
|
return res
|
|
|
|
commercial_partner_id = fields.Many2one(
|
|
"res.partner",
|
|
required=True,
|
|
readonly=True,
|
|
ondelete="cascade",
|
|
)
|
|
partner_id = fields.Many2one(
|
|
"res.partner",
|
|
string="Delivery Address",
|
|
domain="['|',"
|
|
"('id', '=', commercial_partner_id),"
|
|
"('parent_id', '=', commercial_partner_id)]",
|
|
ondelete="cascade",
|
|
)
|
|
carrier_id = fields.Many2one(
|
|
"delivery.carrier",
|
|
string="Delivery Method",
|
|
ondelete="cascade",
|
|
)
|
|
route_id = fields.Many2one(
|
|
"stock.route",
|
|
string="Use specific Route",
|
|
domain=[("sale_selectable", "=", True)],
|
|
ondelete="cascade",
|
|
help="Leave it blank to use the same route that is in the sale line",
|
|
)
|
|
line_ids = fields.One2many(
|
|
"manual.delivery.line",
|
|
"manual_delivery_id",
|
|
string="Lines to validate",
|
|
)
|
|
date_planned = fields.Datetime()
|
|
|
|
def confirm(self):
|
|
"""Creates the manual procurements"""
|
|
self.ensure_one()
|
|
sale_order_lines = self.line_ids.mapped("order_line_id")
|
|
sale_order_lines.with_context(
|
|
sale_manual_delivery=self
|
|
)._action_launch_stock_rule_manual()
|