In Odoo v15 just run the server Actions Fix unreserved qty to solve the issue
18 答案
i had a similar problem, Odoo send me this fix:
ARM created a fix for this. In order to implement it you need to follow these steps:
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"
9."create contextual action"
10.refresh page
11.action/fix "fix unreserved qty"
12.wait for it to load
13."remove contextual action"
14.action/delete
______
It happens because the reserved quantity in your inventory does not reflect the one on your pickings. It's probably due to a small configuration change while some pickings where open.
An easy way to remove it is to create a server action that executes this code https://gist.github.com/amoyaux/20d50f3368ef2f552071f718dc65cad4
It should repair all the inconsistencies in your data.
This answer worked for me also, it took quite a long time to load though.
I also had to adjust permissions in 'Access rights' as @julia van orsouw suggested above before it would work. I enabled write, create and delete access to stock.quant manager and then changed it back to default after cancelling the record with the issue
Here is the code for the server action
# Available variables:
# - env: Odoo Environment on which the action is triggered
# - model: Odoo Model of the record on which the action is triggered; is a void recordset
# - record: record on which the action is triggered; may be void
# - records: recordset of all records on which the action is triggered in multi-mode; may be void
# - time, datetime, dateutil, timezone: useful Python libraries
# - log: log(message, level='info'): logging function to record debug information in ir.logging table
# - Warning: Warning Exception to use with raise
# To return an action, assign: action = {...}
# Available variables:
# - env: Odoo Environment on which the action is triggered
# - model: Odoo Model of the record on which the action is triggered; is a void recordset
# - record: record on which the action is triggered; may be void
# - records: recordset of all records on which the action is triggered in multi-mode; may be void
# - time, datetime, dateutil, timezone: useful Python libraries
# - log: log(message, level='info'): logging function to record debug information in ir.logging table
# - Warning: Warning Exception to use with raise
# To return an action, assign: action = {...}
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])
)
This server action has caused nothing but misery at our company. Our Pick/Pack/Out is all broken, our customers are upset, our wives are filing for divorce, our pickup trucks have broken down, and our dogs ran off.
We tried unreserving everything and running the scheduler and it seems to fix things, but we keep finding bizarre anomalies in that area. Our Odoo business analyst that is on site with us this weeks says that this action should not be run. It was removed from github.
This pull request fixes the issue
I was delighted to find a solution for the reservation issue. Some of our MO's are stuck. Unable to cancel or finish since one or more of the components cannot be "unreserved". We recently upgraded from version 7 to version 12.
Unfortunately running the proposed server action on V12 enterprise (odoo.sh) did not resolve our problem.
Odoo Enterprise support did identify the cause of the problem in our case.
The Decimal Accuracy/Product Unit of Measure the number of digits was set to 3, while the rounding precision of Unit of Measure (UOM) "kg" was 0.000001
[In general:
If Decimal Accuracy is 3 digits, UOMs should have rounding precision 0.01000 , 0.00100 but not 0.00010 or 0.00001
If Decimal Accuracy is 2 digits, your UOMs should have rounding precision 0.01000 but not 0.00100, 0.00010 or 0.00001]
Adjusting the rounding precision took care of some stuck MO's but not all of them. Support did correct historic transactions and all looks fine now.
So kudos to Odoo support for this one. Hope it may help someone else down the road.
Hi,
This code indeed solves the inconsistency in my database and let's my client continue workign.
However, it keeps happenning again and again. There are not any "configuration changes" in between the failures.
Do you have any hints on why could this be happenning?
Thanks
Hi,
If you have EE version I'd advise you to contact Odoo for support to find the cause of this. Else, it's advised to check for discrepancies in stock.quant / stock moves / product moves. I'm not a developer, but I think if this data is not aligned, the error may occur. it could even be a small change like a different unit of measure on a product. Last thing I can think of to check: if you have a scheduled action for the stock scheduler, does it run simultaneously to another process and does that interfere with one another?
Good luck!
I had an issue myself that didn't want to be fixed with the server action. It was caused by planning and processing a manufacturing order + work order eventhough there wasn't enough stock available/reserved for one of the raw material. the MO changed the reserved quantity to it's needs, but the stock.quant reserved quantity didn't change.
Maybe you're also suffering from planning mO's eventhough they don't have enough stock reserved? We've solved it by manually changing the reserved quantity directly in the database.
V15 FIX: I researched a fix using the code below, and Odoo internal informed me that since v11 (currently we're v15) this code fix sometimes works. Clicking 'update this app' from the Apps list also sometimes works. Your best bet is to submit a ticket to get this issue resolved.
Sorry,
I got until p.to 6.action to do: "execute python code"
and I got this in Phyton code
# Available variables:
# - env: Odoo Environment on which the action is triggered
# - model: Odoo Model of the record on which the action is triggered; is a void recordset
# - record: record on which the action is triggered; may be void
# - records: recordset of all records on which the action is triggered in multi-mode; may be void
# - time, datetime, dateutil, timezone: useful Python libraries
# - log: log(message, level='info'): logging function to record debug information in ir.logging table
# - Warning: Warning Exception to use with raise
# To return an action, assign: action = {...}
I have to copy the code that I find here https://gist.github.com/amoyaux/20d50f3368ef2f552071f718dc65cad4
I don't understand this part here, what I have to do?
Thank you for help
The way i did is in the fallowing video and it worked ..
you will endup having a component not consumed, but you can at least mark as done the MO
https://screencast-o-matic.com/watch/c3jZlDVTONK
I'm on V 14 community and the code provided is good as long as it works. At the beginning it took 5 minutes to run it, now it takes 40-60 minutes and quite often throws an error making it almost impossible to use. In our case we get this "unreserved" error when trying to validate the sale order delivery. The work around I found is to go to database and increase stock_quant.reserved_quantity to the quantity slightly higher than quantity reserved in that specific sale order delivery for a specified lot number of a product that produces the error (we use lots). Not sure if this lot is also reserved for other sale orders and that should be also taken into account.
Just wondering if that issue was ever resolved in the latest V14 versions?
To find if the lot is reserved to other outbound deliveries. Go to Delivery orders. Select statuses: Draft, Waiting, Ready. Search for product. Then check these deliveries if they are reserved. In case you find reservations - unreserve all. The go to the delivery you want to process and press Check Availability. Should solve the problem most of the time.
On version 14 and receiving the same issue. I can make this happen almost at will by continuing to issue product to a manufacturing order once it is "In-Process". Sometimes the above works, other times it does not. This is a BIG issue in that it is important for manufacturing to be able to issue additional product to the MO after the MO has began to be processed.
Hello
I did not get the steps
10.refresh page (means simply reloading ??)
11.action/fix "fix unreserved qty" (my action button on top has only delete or duplicate?)
thanks for help
Jan
ps. fixed my error! and fixed the Odoo error !!! Great thanks a lot!!!
Please anyone give me solution i am facing problem when i validate delivery order it shows error
It is not possible to unreserve more products of [VG1560080012] SPIN-ON FUEL FINE FILTER than you have in stock.
Does not validate stock in odoo 11 community
Hi,
Enable debug mode and navigate to server action menu under settings and see if there is a server action named: Correct inconsistencies for reservation
If found, click on Run button, which will solve the issue, if server action is not found, pull the latest source code of corresponding odoo version and upgrade the stock module.
Thanks
Wow. Thanks a lot! Worked like a charm
Thanks for the solution, worked like a charm.
Its excellent working fine and issue has been solved.... just add access right as mentioned above..
Thanks a lot
is it workable for v12
Hi.
It also worked for me in an Enterprise version, thanks so much @Julia van orsouw for sharing!!
Greetings from Spain.
Hello
I got anothor error when i do in step 11action/fix "fix unreserved qty",so odoo sent me a message " You are not allowed to modify 'Quants' (stock.quant) records.
No group currently allows this operation.
Contact your administrator to request access if necessary."
I don't know that reason about odoo version? because my odoo version is 14
That was really perfect as it immediately solved my problem.
The never ending story. V16. Manufacturing. MTO between semi finished product and top product. Operator made mistakes on confirm consumption on orders. Logistic responsible created extra transaction to the manufacturing order to correct this, but the consumed there lot numbers that was reserved to a new order. Reservations was not updated and the new order was blocked.
Solution: Update quant with qty on hand with the standard transaction for inventory. Then it was possible to delete the stock move line from the manufacturing order and the reservation was also deleted. 7 quants was involved.
Since this was MTO process, we also cancelled the manufacturing order and created a new independent.
Solved. But used about 6 hours to find the solution. Thanks to everybody that over the years has contributed on this tread.
Bedankt voor je mailtje. De rest van deze week ben ik vrij en zal ik dus niet reageren. Ik probeer je bericht komende maandag weer op te pakken. Bedankt voor het geduld en tot snel!