Commit Graph
795 Commits
Author SHA1 Message Date
Christophe Simonis aba8c2b8fb [MERGE] forward port branch 11.0 up to 1b272a2050 2018-06-05 16:27:49 +02:00
Nicolas Martinelli 8dbaaf896e [FIX] stock: assign move
- Create a BOM for Product A, using Component B
  1 Unit of a is built with 1 Unit of B
- Update on hand quantity for B to 3.0
- Create a MO for 5 Units of A
- Update the quantity to produce to 3.0

The button 'Check Availability' never disappears.

The core of the problem is that the move remains "Partially Available".
Indeed, if there is no product available (`available_quantity <= 0`),
the stock move is skipped and its availability status is not updated.

We slightly change the logic by first checking if we need any quantity.
If not, the move can be considered as assigned.

opw-1850499
2018-06-04 08:32:39 +02:00
Arnold Moyaux 575b8f3764 [FIX] stock: Diplay return in tracability report
Since saas-11.2 stock_tracability refactoring do not use
level on moves orig/dest and filter on return is
not usefull anymore. It should display all return order
by date.

This commit remove the codition on the return inside the search
on move lines.
2018-05-28 15:46:10 +02:00
Jeremy Kersten 0179b4370b [FIX] stock: error during fwd-port 2bc6ea1b37 2018-05-24 10:01:57 +02:00
Christophe Simonis 2bc6ea1b37 [MERGE] forward port branch 11.0 up to 02ee3fd88e 2018-05-23 19:33:40 +02:00
Christophe Simonis a496ca981c [FIX] stock: move company initial setup logic in model
Followup of 4e71bd5caf
2018-05-23 17:07:28 +02:00
Josse Colpaert 73e213edef [FIX] stock: non-tracked products should follow FIFO removal strategy too
In a warehouse, mostly most of the products have no lot.  It stays
important however to avoid having old products in stock, certainly if
we can distinguish them by pack or location.

As now in stable, in_date is not put on the quant for non-tracked products,
databases might mix quants with and without in_date of the same product.
We should see those without in_date as the oldest.
That is why we need to be able to apply a ASC NULLS FIRST (ASC is NULLS LAST by default) for FIFO
or DESC NULLS LAST for LIFO.

In order to do that, we copied the code from the _search method of the ORM to
be able to do this special order as the orm itself is restrictive as it
supposes the order itself has no spaces.

We adapted and added some tests to check it handles the combination of NULL/NOT NULL well.
2018-05-23 14:38:13 +02:00
Nicolas Lempereur 076ececb57 [FIX] stock: no loop in traceability report
Depending on the situation, it is possible to have move with origines
and destinations that have a loop.

A simple example is a return of a return, the origin and destination of
the return of a return is the return itself.

opw-1845444
closes #24787
2018-05-22 12:50:20 +02:00
Josse Colpaert 4e71bd5caf [FIX] stock: customer/vendor location empty
When creating a new company, the fields customer/vendor location
were empty.

Now, these fields are set with the internal transit location for the company
of the partner and set with Partners Locations/Customers and Partners Locations/Vendors
for the other companies.

opw:1845753
2018-05-17 17:07:24 +02:00
Christophe Simonis 1655202924 [MERGE] forward port branch 11.0 up to 59a8a1cd8e 2018-05-17 13:19:49 +02:00
Christophe Simonis 9874adebb8 [MERGE] forward port branch saas-15 up to 40e74240e8 2018-05-16 17:48:37 +02:00
Christophe Simonis 40e74240e8 [MERGE] forward port branch saas-14 up to a1a03792b6 2018-05-16 17:11:39 +02:00
Christophe Simonis a1a03792b6 [MERGE] forward port branch 10.0 up to bcf20cfbec 2018-05-16 17:10:28 +02:00
Raphael Collet bcf20cfbec [FIX] stock: use timedelta instead of relativedelta
Suppose we have a delta between two datetimes:

    delta = dt1 - dt0

If delta is negative but less than a day, ``delta.days`` returns -1 (which is
compensated by positive seconds).  In order to avoid this surprising effect,
use ``delta.total_seconds()`` to compute the number of days.
2018-05-16 16:25:03 +02:00
Christophe Simonis eeae2b80ea [MERGE] forward port branch 11.0 up to b793e23ae5 2018-05-09 13:55:27 +02:00
Nicolas Martinelli b793e23ae5 [FIX] stock: incorrect PO sequence
- Create 2 companies A & B
- Create a sequence for PO in each company
- Set User A in Company A and Admin in Company B
- Create a MTO product with a 'Buy' route
- Create a SO with User A using the product, validate

The PO created uses the sequence for Company B instead of Company A.

The creation is done as `sudo`, and ultimately `next_by_code` will use
the company of the Admin.

opw-1839656
2018-05-09 11:25:39 +02:00
Christophe Simonis 013ce7f889 [MERGE] forward port branch 11.0 up to f2e105eeca 2018-05-08 19:08:18 +02:00
Christophe Simonis f2e105eeca [MERGE] forward port branch saas-15 up to d3a040cebe 2018-05-08 18:12:03 +02:00
Christophe Simonis d3a040cebe [MERGE] forward port branch saas-14 up to 1813f42dbc 2018-05-08 17:18:48 +02:00
Christophe Simonis 1813f42dbc [MERGE] forward port branch 10.0 up to 14f59f4b78 2018-05-08 16:23:54 +02:00
Denis Ledoux a8ab14a672 [FIX] stock: prevent to create the reception route over and over when deleted once
When the reception route of a warehouse company is deleted by the user
e.g. My company, Chicago Receipt in 1 step is deleted,
and then changing the given warehouse `Incoming Shipments`
multiple times
e.g. from `one_step` to `two_steps` multiple time,
the reception route is created again and again and again.

This is because the reception route which is created for the
warehouse is not being assigned to the warehouse
as the `reception_route_id` once newly created.

opw-1836544
2018-05-07 17:02:02 +02:00
Prakash Prajapati 7c7b099273 [FIX] stock: Quantity available according to the warehouse or location
The goal of this change is not to be able to search a location_id/warehouse_id
but to properly make these fields "dummy": only used to put some keys in context
from the search view in order to influence computed field.

Use case:
In function _compute_quantities_dict, the quantity available for a product is computed
according to the warehouse or the location. But to compute this quantity, the specific
warehouse or location must be in the context.

Steps to reproduce:

- In the tree view of product.product, write the name of a warehouse W
- Click on dropdown menu "Search warehouse"
- Click on W

Expected behavior: the quantities available for W are displayed.

NB: search=lambda operator, operand, vals: [] must be written to
ensure these fields to be searchable. Otherwise "Non-stored field
product.template.warehouse_id cannot be searched." was logged.

opw:1839961
2018-05-07 15:41:31 +02:00
Pierre Masereel 0ae3e5a8b4 [FIX] stock: change uom on product constraint
When we change the the uom of a product, a user error is triggered if
there are already moves created for this product. But if the product is
archived, the call to mapped('product_variant_ids') doesn't return any
product ids, so no moves are found and you can change the uom.

To fix this behaviour that can lead to bad configurations, because
quants and moves won't be in the same unit than the product's one.
2018-05-07 13:22:14 +02:00
Christophe Simonis 89819c6f42 [MERGE] forward port branch saas-14 up to 1f74b878f4 2018-05-07 12:21:05 +02:00
Christophe Simonis 1f74b878f4 [MERGE] forward port branch 10.0 up to 0aeb92ccbc 2018-05-07 11:54:15 +02:00
Christophe Simonis ac63dfc8f4 [MERGE] forward port branch 11.0 up to 8dade01e2c 2018-05-04 16:10:50 +02:00
Arnold Moyaux aab2ceefec [FIX] stock: prevent to create the reception route over and over when deleted once
When the reception route of a warehouse company is deleted by the user
e.g. My company, Chicago Receipt in 1 step is deleted,
and then changing the given warehouse `Incoming Shipments`
multiple times
e.g. from `one_step` to `two_steps` multiple time,
the reception route is created again and again and again.

This is because the reception route which is created for the
warehouse is not being assigned to the warehouse
as the `reception_route_id` once newly created.

_update_routes should work the same way than _create_routes,
it should return new value to write on the warehouse.

based on preliminary by Denis Ledoux

opw-1836544
2018-05-04 14:20:37 +02:00
Christophe Simonis 4e90a676da [MERGE] forward port branch 10.0 up to 4b7f4f32ea 2018-05-04 13:19:12 +02:00
Simon Lejeune 3d8c0df8bf [FIX] stock: quant: reserve and unreserve on duplicated quants
In a situation where there's a negative quant next to a positive one,
they should be merged when the scheduler runs or when the user open its
inventory view. However, if in the meantime the user reserves and
unreserves, there may be some issues.

The system will only reserve on positive quant ;
the system will unreserve on the first encountered quant (even negative)

The issue is the second part of the early break condition:
    float_is_zero(available_quantity, precision_rounding=rounding):

The issue here is `available_quantity`. In a reservation scenario, it
represents the maximum quantity we can reserve across quant. It is
useful so we do not lose time loopin over quants where nothing will be
available. In an unreserve scenario however, it represented the same
thing, which is wrong. In the case you reserved all the quantities,
`available_quantity` will be 0 we'll loop only on the first quant where
we won't do anything.

As the code doesn't check the success or failure of the unreserve, move
lines were unlinked while the reserved quantity on the quants were not
updated, resulting in the desynchronization of the move lines/ reserved
quantities.

This continues the work done at [1] to track down the "cannot unreserve
more than" errors.

[1] cce6030c0d
2018-05-04 11:52:36 +02:00
Simon Lejeune cce6030c0d [FIX] stock: symmetric reserve and unreserve
When an internal locations has its `scrapped` field set to True,
reserving will increment the quant's `reserved_quantity` while
unreserving will bypass the reservation mechanism (as in a supplier
location). This leads to a desynchronisation between the
partially_available/available move lines and the quant's
`reserved_quantity`, leading later on to "cannot unreserve more than
available" errors.

To prevent this kind of issues, there's a `should_bypass_reservation`
method set on the location that we *should* use everywhere, it was
implemented by [0]. Sadly, this line was not adapted since its
implementaton in [1].

Co-authored by len-odoo <len@odoo.com>

opw 1837900

[0] e1cea2640f
[1] 0469d2e712
2018-05-03 14:03:42 +02:00
Christophe Simonis ad802d0d55 [MERGE] forward port branch 11.0 up to c591e0de7d 2018-05-03 11:21:42 +02:00
Goffin Simon 7353405aa4 [FIX] stock: Scheduled date purchase order wrong
When running the scheduler for a reordering rule, the delivery lead time
of the seller was not taken into account.

opw:1837550
2018-05-03 10:29:14 +02:00
Nicolas Lempereur fd44ff38a3 [FIX] stock: reserved qty, typo expected singleton
In 4322985a at one point several stock.move could be selected when we
just wanted the first one.

opw-1840719
closes #24538
2018-05-03 10:14:11 +02:00
Christophe Simonis 87e21ccdc5 [MERGE] forward port branch 11.0 up to 521414b1c1 2018-05-02 19:36:16 +02:00
Simon Lejeune 518ed13602 [FIX] stock: backorder
Do not try to keep the reservation when creating a backorder for two
reasons:
    1) it doesn't make sense since the backordered move will only be
    confirmed while it got some reserved move lines
    2) with badly configured uom's rounding,  it is possible that the
    initial demand of the backorder is inferior to the now reserved
    quantity

We also fix another "cannot unreserve more than available" cause that
could happen in the second case ; let's imagine in the second case that
the backordered quantity is 0.999, `_update_reserved_qty` will reserve
0.999 on the quants but do not create a move line as range (0, 0.999)
will not return anything.

We remove `test_split_1` as it tested a behavior we removed and add a
new test showing a new flow with what we fixed.

Please note that setting the rounding of unit to 1.0 would have
prevented all the issues here.
2018-04-30 11:05:33 +02:00
Simon Lejeune 4322985a8a [FIX] stock: rounding issues
Followup of rev 383947646f

Let's say you have 6 units and you try to reserve a dozen while the
rounding of the dozen is 1.0. The previous commit correctly only allows
to reserve 12 units, and handle correctly forced quantities in other
compatible UOM, all that with extra moves/backoders.

But we missed an important issue: if now you have 12 units, you will
reserve them. If these 12 units are split across quants, i.e. some are
in another sublocations or are assigned a special lot_id, then we'll
again have rounding issue because the reservation was always expressed
in the move's uom while sometimes it is not possible to go back and
forth between the move uom and and the product's uom. In other word,
we'll reserve 12 times 0 dozen and get stuck at the next step.

This patch now only reserve a quantity if the quantity is expressible in
the rounding's UOM. If this quantity is split across multiple move
lines, we'll make the move line reserved in the UOM of the quants if
necessary. We also do not apply the rounding down -> halfup dance if
`_update_reserved_quantity` is called with the force argument set as
True (meaning, in an mto scenario). The change in
`_prepare_move_line_vals` will make the move lines in the uom of the
qants and everything should be good. With the last change, we need to
adapt the test added by the previous patch, else we won't  be able to
make a chain of 2 move moving producst tracked by serial number if the
rounding of the dozen is set at 1.0.

opw-1835186
opw-1835946
2018-04-30 11:05:33 +02:00
len-odoo 3acb4a5389 [FIX] stock: allow inventory user to validate delivery orders when moves have to be merged
When validating a delivery order, some stock moves might be merged by an
internal function, which thus might delete some stock moves.
Since an inventory user has no right to unlink stock moves,
the validation might fail.
We simply had a sudo when doing the unlink, since this is an external method.

opw 1836761
2018-04-27 13:08:05 +02:00
Arnold Moyaux 6fac0b0241 [FIX] stock: extra move incorrect qty
Usecase to reproduce:
- Create a product A with a qty on hand 5.5
- Create a delivery order with an initial demand of 5.5
- Validate it with a qty equals to 5.95
The initial demand is updated to 5.951 then reduced to 5.95
and a backorder is created with an initial demand of 0.001.
That should not happen since I process extra quantities.

It python 5.95 - 5.5 = 0.4500000000000002 and the float_compare
use a round UP method thus it returns 0.451 and the following
flow is based on a wrong value.
In this case a float compare is used before the float round, so an
HALF-UP rounding should be okay since a very small quantity diff should
be filter by the compare.

Fixes #24401
2018-04-25 15:43:21 +02:00
Simon Lejeune c812122d5e [FIX] stock: picking: do_unreserve
When a scrapped move is part of an open picking, it was not possible to
unreserve the picking. A scrapped move is done and scrapped ; this
combination should be allowed.

opw-1835186
2018-04-25 14:03:32 +02:00
Christophe Simonis e8bf128318 [MERGE] forward port branch 11.0 up to 3ab25b60bc 2018-04-23 18:15:25 +02:00
William Henrotin d8221eab30 [FIX] stock: update qty_done in move wizard
Scenario : Create a transfer on a product tracking by lot. Update the
operation type "Receipt" by unchecking the "show reserved" option.
Open the Register lots, pack, location wizard and set some lots with a
quantity done. The quantity done field is not updated in real time.

Issue :
The depends function on quantity_done is triggered only on move_line_ids
but "show reserverd" option replace move_line_ids by
move_line_nosuggest_ids in the wizard.
2018-04-20 16:02:12 +02:00
Simon Lejeune 383947646f [REF] stock: rounding issues
There's a certain configuration of UOM that is not correctly handled in
the v11 stock:
- create a move with an UOM having an higher factor than the product's
  UOM
- this higher UOM has a rounding of 1.0, meaning it doesn't allow
  partial reservation
- use the product's uom in this move and enter quantities that aren't
  expressible in the move's uom

A practical example is to set the rounding of dozen at 1.0, set the uom
of a product to units, create a move for a dozen and create a new move
line with 8 units.

The first issue is the `quantity_done` field, that uses an half-up
rounding on the `qty_done` field of each move line and sum them. When
applying this logic to the previous example, `quantity_done` field would
be 1.0, meaning we won't make a backorder for the missing 4 units. We
fix these issue by summing a non rounded qty_done and afterwards
rounding this value to the general products'UOM. This mean
`quantity_done` is technically not be expressible in the move's uom, but
keeping this value close to the reality will allow to handle the
backorders and extra moves correctly.

The second issue is that the backorder is always expressed in the move's
uom. In the previous example, this would mean creating a backorder of 0
dozen. In v10, an error was throwed, saying this operation is
impossible.

The `_prepare_move_split_vals` previously always received the quantity
of the backordered move in the uom of the original move. This is a
remnant of the v10 implementation where, if the quantity to backorder is
not expressible in the original move's UOM, an error was throwed. We now
pass the used uom via a context key to not update the method signature,
as it is probably legitimately overidden by custom modules. This way, in
the previous example, a backorder of 4 units is created.

The last issue is in `_action_assign`. Let's say you have 8 units in
stock and you want to reserve a dozen, the system will reserve 8 units
and then convert back 8 units in dozen, meaning a dozen was reserved.
This resulted in awkward situation where more items than available were
reserved, and the famous "cannot unreserve more than what's available in
stock" was throwed at almost each operation. To solve this, we convert
the not-yet reserved quantities back and forth in both uom. This
prevents partial reservation when not allowed, which is good. We had to
adapt some lines of `_action_assgn` that expected
`_update_reserved_quantity` always at least partially reserved the move.
It is now possible that it doesn't reserve anything.

We also normalize the quantity with a greater decimal precision when
deciding if we open the immediate transfer wizard or not (in the
original exemple, if you enter a single unit the immediate transfer
wizard would be openned because 0 was done in the UOM of the dozen). We
also prevent to enter `qty_done` on the move line if the value doesn't
honour the rounding of the UOM.

We introduce two tests, a simple  `_action_assign` in MTS and a more
complete MTO scenario with backorders, extra moves and invalid qty_done.

opw-1835186
opw-1835946
2018-04-20 11:26:17 +02:00
Nicolas Martinelli 9daf3f85a8 [FIX] stock: search on quantity
- Create a stockable Product A
- Get create an incoming picking at date D for A
- Go to Inventory > Report > Inventory, and search for the the inventory
  at date D-1.
- A should appear with a quantity on hand of 0.
- Filter on 'Available Products'

The product still appear in the list with a quantity on hand of zero.

The optimized method `_search_qty_available_new` is used, although it
doesn't take into account dates.

The original use case for this optimized method was to quickly get
products with stock on hand, i.e. products with quants without needed
information of stock moves.

opw-1833510
2018-04-20 10:22:58 +02:00
Christophe Simonis 5f2d080cf8 [MERGE] forward port branch 11.0 up to ad825b673b 2018-04-16 18:34:56 +02:00
Florent de Labarre b7e47be012 [FIX] stock: remove wrong decorator
Was probably introduced during a forward-port as was correctly changed at 8df0a2a98e

Closes #24238
2018-04-16 16:59:36 +02:00
Nicolas Martinelli 620a6f4557 [FIX] stock: change product on S/N
Do not allow to change the product on a serial/lot number for a product
which has existing stock moves. Doing so would screw up the traceability
report.

opw-1832452
2018-04-16 14:20:44 +02:00
Nicolas Martinelli 9353fa1ede [FIX] stock: trigger warning
Do not trigger warning if `qty_done` is not yet set, since it is
automatically set to 1.0 in `onchange_serial_number`.
2018-04-12 13:55:10 +02:00
Christophe Simonis 860dfb5586 [MERGE] forward port branch 11.0 up to d277adf4d5 2018-04-06 15:36:10 +02:00
Simon Lejeune 0cdfae0e25 [FIX] stock: _compute_show_operations
Using `break` when looping over a recordset in a compute method could
have side effects. Computed field are computed in batch, according to
the order of the recordset, the value may only be computed correctly for
some records

related to rev c493569866

opw-1833347
2018-04-05 10:18:22 +02:00
Nicolas Lempereur 471b7e3657 [FIX] stock: settings enable only op of active wh
The code in res config that enabled or disabled internal operation type
did not take into account that active_test is set to False inside this
type of code since c2e259d8.

Thus a picking type of an archived warehouse would possibly unexpectedly
be enabled after saving the settings.

opw-1826196
closes #23956
2018-03-30 14:36:28 +02:00