'How to make 2 different deliveries from one odoo form? odoo-15
Create a sale order and add a couple of items. After clicking on the "Confirm" button the delivery "Delivery" will be created. All items from the sale order will be in delivery. You need to add the express delivery sign to the sale order (bool). Example: Add 5 items A B C(express delivery) D E(express delivery) to the sale order. After sale order confirmation two deliveries should be created: the first delivery should contain positions A, B and D; the second delivery (express delivery) should contain positions C and E.
I added the button. and now with the debugger I reached the function def _action_launch_stock_rule(self, previous_product_uom_qty=False) in odoo/addons/sale_stock/models/sale_order.py
I don't know what to do next. I can't understand at what stage (in which function) the data is thrown to delivery.
And there I need to write the logic. If we have Express delivery then I have to divide it into two deliveries.
sale.py
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
express_delivery = fields.Boolean(string='Express delivery')
sale.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='qty_delivered']" position="after">
<field name="express_delivery" />
</xpath>
</field>
</record>
</odoo>
Maybe someone can help me understand?
Solution 1:[1]
I found a solution to this problem
sale.py
class SaleOrderLine(models.Model):
_name = "sale.order.line"
_inherit = "sale.order.line"
express_delivery = fields.Boolean(string='Express delivery')
def _prepare_procurement_values(self, group_id=False):
res = super(SaleOrderLine, self)._prepare_procurement_values(group_id)
res.update({'express_delivery': self.express_delivery})
return res
stock_move.py
from odoo import models, fields
from itertools import groupby
class StockMoveInherit(models.Model):
_inherit = 'stock.move'
express_delivery = fields.Boolean()
def _search_picking_for_assignation(self):
self.ensure_one()
picking = self.env['stock.picking'].search([
('group_id', '=', self.group_id.id),
('location_id', '=', self.location_id.id),
('location_dest_id', '=', self.location_dest_id.id),
('picking_type_id', '=', self.picking_type_id.id),
('printed', '=', False),
('express_delivery', '=', self.express_delivery), # ???????? ????
('immediate_transfer', '=', False),
('state', 'in', ['draft', 'confirmed', 'waiting', 'partially_available', 'assigned'])], limit=1)
return picking
def _assign_picking(self):
Picking = self.env['stock.picking']
grouped_moves = groupby(sorted(self, key=lambda m: [f.id for f in m._key_assign_picking()]),
key=lambda m: [m._key_assign_picking(), m.express_delivery])
for group, moves in grouped_moves:
moves = self.env['stock.move'].concat(*list(moves))
new_picking = False
picking = moves[0]._search_picking_for_assignation()
if picking:
if any(picking.partner_id.id != m.partner_id.id or
picking.origin != m.origin for m in moves):
picking.write({
'partner_id': False,
'origin': False,
})
else:
new_picking = True
picking = Picking.create(moves._get_new_picking_values())
picking.write({'express_delivery': moves[0].express_delivery}) # ???????? ????
moves.write({'picking_id': picking.id})
moves._assign_picking_post_process(new=new_picking)
return True
stock_picking.py
from odoo import fields, models, api
class StockMoveInherit(models.Model):
_name = 'stock.picking'
_inherit = 'stock.picking'
express_delivery = fields.Boolean(default=False)
stock_rule.py
from odoo import api, fields, models
class StockRuleInh(models.Model):
_inherit = 'stock.rule'
def _get_stock_move_values(self, product_id, product_qty, product_uom, location_id, name, origin, company_id,
values):
res = super(StockRuleInh, self)._get_stock_move_values(product_id, product_qty, product_uom, location_id,
name, origin, company_id, values)
res['express_delivery'] = values.get('express_delivery', False)
return res
stock_picking_view.xml
<?xml version="1.0"?>
<odoo>
<record id="stock_picking_view_form_inherit" model="ir.ui.view">
<field name="name">stock.picking.view.form.inherit</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//group/field[@name='origin']" position="after">
<field name="express_delivery" attrs="{'readonly':[True]}" />
</xpath>
</field>
</record>
<record id="vpicktree_inherit" model="ir.ui.view">
<field name="name">stock.picking.tree</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.vpicktree"/>
<field name="arch" type="xml">
<xpath expr="//tree/field[@name='user_id']" position="after">
<field name="express_delivery"/>
</xpath>
</field>
</record>
</odoo>
sale.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree/field[@name='qty_delivered']" position="after">
<field name="express_delivery" />
</xpath>
</field>
</record>
</odoo>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Maks |
