0

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?

1 Answers1

0

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>