Tips and Tricks (internal only)

Welcome!

This community is for professionals and enthusiasts of our products and services. Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.

0

not possible to unreserve products/ Reserveringen verwijderen

Avatar
Maarten Bressers


--------

quants = env["stock.quant"].search([])

move_line_ids = []

warning = ""

for quant in quants:

    move_lines = env["stock.move.line"].search(

        [

            ("product_id", "=", quant.product_id.id),

            ("location_id", "=", quant.location_id.id),

            ("lot_id", "=", quant.lot_id.id),

            ("package_id", "=", quant.package_id.id),

            ("owner_id", "=", quant.owner_id.id),

            ("product_qty", "!=", 0),

        ]

    )

    move_line_ids += move_lines.ids

    reserved_on_move_lines = sum(move_lines.mapped("product_qty"))

    move_line_str = str.join(

        ", ", [str(move_line_id) for move_line_id in move_lines.ids]

    )

    if quant.location_id.should_bypass_reservation():

        # If a quant is in a location that should bypass the reservation, its `reserved_quantity` field

        # should be 0.

        if quant.reserved_quantity != 0:

            quant.write({"reserved_quantity": 0})

    else:

        # If a quant is in a reservable location, its `reserved_quantity` should be exactly the sum

        # of the `product_qty` of all the partially_available / assigned move lines with the same

        # characteristics.

        if quant.reserved_quantity == 0:

            if move_lines:

                move_lines.with_context(bypass_reservation_update=True).write(

                    {"product_uom_qty": 0}

                )

        elif quant.reserved_quantity < 0:

            quant.write({"reserved_quantity": 0})

            if move_lines:

                move_lines.with_context(bypass_reservation_update=True).write(

                    {"product_uom_qty": 0}

                )

        else:

            if reserved_on_move_lines != quant.reserved_quantity:

                move_lines.with_context(bypass_reservation_update=True).write(

                    {"product_uom_qty": 0}

                )

                quant.write({"reserved_quantity": 0})

            else:

                if any(move_line.product_qty < 0 for move_line in move_lines):

                    move_lines.with_context(bypass_reservation_update=True).write(

                        {"product_uom_qty": 0}

                    )

                    quant.write({"reserved_quantity": 0})

move_lines = env["stock.move.line"].search(

    [

        ("product_id.type", "=", "product"),

        ("product_qty", "!=", 0),

        ("id", "not in", move_line_ids),

    ]

)

move_lines_to_unreserve = []

for move_line in move_lines:

    if not move_line.location_id.should_bypass_reservation():

        move_lines_to_unreserve.append(move_line.id)

if len(move_lines_to_unreserve) > 1:

    env.cr.execute(

        """ 

            UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id in %s ;

        """

        % (tuple(move_lines_to_unreserve),)

    )

elif len(move_lines_to_unreserve) == 1:

    env.cr.execute(

        """ 

        UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id = %s ;

        """

        % (move_lines_to_unreserve[0])

    )

__________________________

Avatar
Negeren
1 Antwoord
0
Avatar
Maarten Bressers
Beste antwoord

https://www.odoo.com/nl_NL/forum/help-1/question/it-is-not-possible-to-unreserve-more-products-of-than-you-have-in-stock-138783#:~:text=It happens because the reserved

1.debug mode

2.technical/server actions

3.create

4.action name: e.g. fix unreserved qty

5.model: ir.actions.server

6.action to do: "execute python code"

7.copy/paste the fix underneath the pre-existing code

8."save" 


quants = env["stock.quant"].search([])


move_line_ids = []


warning = ""


for quant in quants:


    move_lines = env["stock.move.line"].search(


        [


            ("product_id", "=", quant.product_id.id),


            ("location_id", "=", quant.location_id.id),


            ("lot_id", "=", quant.lot_id.id),


            ("package_id", "=", quant.package_id.id),


            ("owner_id", "=", quant.owner_id.id),


            ("product_qty", "!=", 0),


        ]


    )


    move_line_ids += move_lines.ids


    reserved_on_move_lines = sum(move_lines.mapped("product_qty"))


    move_line_str = str.join(


        ", ", [str(move_line_id) for move_line_id in move_lines.ids]


    )




    if quant.location_id.should_bypass_reservation():


        # If a quant is in a location that should bypass the reservation, its `reserved_quantity` field


        # should be 0.


        if quant.reserved_quantity != 0:


            quant.write({"reserved_quantity": 0})


    else:


        # If a quant is in a reservable location, its `reserved_quantity` should be exactly the sum


        # of the `product_qty` of all the partially_available / assigned move lines with the same


        # characteristics.


        if quant.reserved_quantity == 0:


            if move_lines:


                move_lines.with_context(bypass_reservation_update=True).write(


                    {"product_uom_qty": 0}


                )


        elif quant.reserved_quantity < 0:


            quant.write({"reserved_quantity": 0})


            if move_lines:


                move_lines.with_context(bypass_reservation_update=True).write(


                    {"product_uom_qty": 0}


                )


        else:


            if reserved_on_move_lines != quant.reserved_quantity:


                move_lines.with_context(bypass_reservation_update=True).write(


                    {"product_uom_qty": 0}


                )


                quant.write({"reserved_quantity": 0})


            else:


                if any(move_line.product_qty < 0 for move_line in move_lines):


                    move_lines.with_context(bypass_reservation_update=True).write(


                        {"product_uom_qty": 0}


                    )


                    quant.write({"reserved_quantity": 0})




move_lines = env["stock.move.line"].search(


    [


        ("product_id.type", "=", "product"),


        ("product_qty", "!=", 0),


        ("id", "not in", move_line_ids),


    ]


)




move_lines_to_unreserve = []




for move_line in move_lines:


    if not move_line.location_id.should_bypass_reservation():


        move_lines_to_unreserve.append(move_line.id)




if len(move_lines_to_unreserve) > 1:


    env.cr.execute(


        """ 


            UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id in %s ;


        """


        % (tuple(move_lines_to_unreserve),)


    )


elif len(move_lines_to_unreserve) == 1:


    env.cr.execute(


        """ 


        UPDATE stock_move_line SET product_uom_qty = 0, product_qty = 0 WHERE id = %s ;


        """


        % (move_lines_to_unreserve[0])

    )



Avatar
Negeren