Three related problems with Drop Shipping with Anglo Saxon Accounting.

One has been broken since #20080.

Another is caused by the same code.

The third - a fix from #12687 - is being bypassed by current code.



Impacted versions:

11.0, and 10.0 for at least some of this

Steps to reproduce:

Set up a product with
- real time valuation
- standard price
- Anglo Saxon accounting
- drop shipping turned on
- invoicing on delivered quantities

Create a product with a standard price of $40.

Current behavior:

_If I create a sales order and choose to ship from existing stock, then the invoice created after delivery is correct, and it has the correct Anglo Saxon account moves._

- Dr COGS $40
- Cr Output $40

If I create a sales order and choose to drop ship, I can then go to the RFQ, and change the RFQ price to $45, then receive the product, and generate the Vendor Bill.  Everything is correct at this point.  When I go back to the Sales Order and create and validate the invoice, it has the incorrect Anglo Saxon account moves:

- Dr Output $45
- Cr COGS $45

Expected behavior:

The accounting should be the same on the invoice.  The value is wrong, and the debits and credits are reversed.

Also, there should be an additional journal:

- Dr Output $40
- Cr Input $40

Th 3 problems are:

1. It is getting a -ve price unit from _compute_average_price because the stock move is not an outgoing move, but a supplier -> customer move!
2. It is getting the average price from those moves and using it, even if the product is using standard price.
3. The extra move that #12687 created is no longer being generated as the account moves are being bypassed entirely for dropshipping.  Somewhere in the process, we need to move the value from stock_input to stock_output.  This may be a v11 problem only.

Video/Screenshot link (optional):


vals = {}
            price_unit = self._get_price_unit()
            value = price_unit * (quantity or valued_quantity)
            vals = {
                'price_unit': price_unit,
                'value': value if quantity is None or not self.value else self.value,
                'remaining_value': value if quantity is None else self.remaining_value + value,
            }
            vals['remaining_qty'] = valued_quantity if quantity is None else self.remaining_qty + quantity
            if self.product_id.cost_method == 'standard':
                value = self.product_id.standard_price * (quantity or valued_quantity)
                vals.update({
                    'price_unit': self.product_id.standard_price,
                    'value': value if quantity is None or not self.value else self.value,
                })
            self.write(vals)
        elif self._is_out():
            valued_move_lines = self.move_line_ids.filtered(lambda ml: ml.location_id._should_be_valued() and not ml.location_dest_id._should_be_valued() and not ml.owner_id)
            valued_quantity = sum(valued_move_lines.mapped('qty_done'))
            self.env['stock.move']._run_fifo(self, quantity=quantity)
            if self.product_id.cost_method in ['standard', 'average']:
                curr_rounding = self.company_id.currency_id.rounding
                value = -float_round(self.product_id.standard_price * (valued_quantity if quantity is None else quantity), precision_rounding=curr_rounding)
                self.write({
                    'value': value if quantity is None else self.value + value,
                    'price_unit': value / valued_quantity,
                })
    def _action_done(self):
        self.product_price_update_before_done()
        res = super(StockMove, self)._action_done()