Impacted versions: 9.0

Steps to reproduce:

* Create an MTO product with 
  * Product Type: Stockable Product
  * Routes: "Buy" and "Make to Order"
* Update Qty on Hand to any quantity (i.e, 2).
* Create a sales order with this product and a number <= to the one in the step before.
* Confirm the sales order.

Current behavior:

The created delivery picking appears in state "Reserved" and the current quantity on stock has been reserved, allowing you to transfer that stock.

Expected behavior:

The created delivery picking should be in "Waiting another operation", or at least in "Waiting availability" until the purchase order is confirmed (if you have defined a supplier for the product and the procurement creates the purchase order), which seems to be the current behavior when there's no stock available (is this also correct, as it allows to manually reserve?).
addons/stock/stock.py
self.move_quants_write(cr, uid, to_move_quants, move, location_to, dest_package_id, lot_id=lot_id, entire_pack=entire_pack, context=context)
            self.pool.get('stock.move').recalculate_move_state(cr, uid, to_recompute_move_ids, context=context)
        if location_to.usage == 'internal':
            
            cr.execute("""
                SELECT 0 FROM stock_quant, stock_location WHERE product_id = %s AND stock_location.id = stock_quant.location_id AND
                ((stock_location.parent_left >= %s AND stock_location.parent_left < %s) OR stock_location.id = %s) AND qty < 0.0 LIMIT 1
            """, (move.product_id.id, location_to.parent_left, location_to.parent_right, location_to.id))
            if cr.fetchone():
                for quant in quants_reconcile:
                    self._quant_reconcile_negative(cr, uid, quant, move, context=context)
        
        
        
        
        
        picking_type = move.picking_id and move.picking_id.picking_type_id or False
        if check_lot and lot_id and move.product_id.tracking == 'serial' and (not picking_type or (picking_type.use_create_lots or picking_type.use_existing_lots)):
            other_quants = self.search(cr, uid, [('product_id', '=', move.product_id.id), ('lot_id', '=', lot_id),
                                                 ('location_id.usage', '=', 'internal')], context=context)
            if other_quants:
                
                
                
                
                other_quants = self.browse(cr, uid, other_quants, context=context)
                if sum(other_quants.mapped('qty')) > 1.0 or len([q for q in other_quants.mapped('qty') if q < 0]) > 1:
                    lot_name = self.pool['stock.production.lot'].browse(cr, uid, lot_id, context=context).name
                    raise UserError(_('The serial number %s is already in stock.') % lot_name + _("Otherwise make sure the right stock/owner is set."))
    def move_quants_write(self, cr, uid, quants, move, location_dest_id, dest_package_id, lot_id = False, entire_pack=False, context=None):