Vertical Lift Module management

stock_vlm_mgmt
REPOSITORY
REPOSITORYOCA/stock-logistics-warehouse
GIT
GIThttps://github.com/OCA/stock-logistics-warehouse.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-warehouse/tree/18.0/stock_vlm_mgmt
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYStock
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, christian-ramos-tecnativa
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module adds basic a management system for Vertical Lift Modules.
It's thought as a simpler alternative attemp to stock_vertical_lift and
all the dependencies that come with it.

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
svm_operation_picking_form_view stock.picking xpath Inherits stock.view_picking_form
view_location_form stock.location div Inherits stock.view_location_form
view_location_search stock.location separator Inherits stock.view_location_search
view_location_vlm_tray_form stock.location.vlm.tray form New
view_location_vlm_tray_tree stock.location.vlm.tray list New
view_stock_location_tray_type_form stock.location.vlm.tray.type form New
view_stock_location_tray_type_search stock.location.vlm.tray.type search New
view_stock_location_tray_type_tree stock.location.vlm.tray.type list New
view_stock_quant_inventory_tree stock.quant.vlm list Inherits view_stock_quant_vlm_tree
view_stock_quant_tree stock.quant field Inherits stock.view_stock_quant_tree
view_stock_quant_tree_editable stock.quant field Inherits stock.view_stock_quant_tree_editable
view_stock_quant_tree_inventory_editable stock.quant field Inherits stock.view_stock_quant_tree_inventory_editable
view_stock_quant_vlm_form stock.quant.vlm form New
view_stock_quant_vlm_tree stock.quant.vlm list New
view_vlm_task_form stock.vlm.task form New
view_vlm_task_tree stock.vlm.task list New
vlm_quant_search_view stock.quant.vlm search New
vlm_task_action_form_view stock.vlm.task.action form New
vlm_task_search_view stock.vlm.task search New
Models touched (10)

New fields (10)
  • is_vlm Boolean
  • vlm_address Char
    help='An VLM normally will be behind some propietary proxy that handles several VLMs at once, so we need to set which one corresponds to this location'
  • vlm_hostname Char
  • vlm_password Char
  • vlm_port Char
  • vlm_removal_strategy Selection
    default='fifo' selection=[('fifo', 'FIFO'), ('lifo', 'LIFO'), ('optimal', 'Less carrier movements')]
  • vlm_sequence_id Many2one → ir.sequence
    comodel_name='ir.sequence'
  • vlm_tray_ids One2many → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray' inverse_name='location_id'
  • vlm_user Char
  • vlm_vendor Selection
    selection=[('test', 'Test')]
Public methods (4)
  • action_release_vlm_trays(self)
    Send to the VLM a special command that releases all the trays
  • action_view_vlm_quants(self)
  • action_view_vlm_tray(self)
  • send_vlm_request(self, data: dict, **options) -> dict
    Send request to the vendor methods. The vendor connector should deal with the connection issues transforming the response into these standard codes: -1: Connection refused -2: The request is issued but the response is lost -3: Timeout in the request -4: VLM Hardware issues

New fields (5)
  • is_full Boolean
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=[('is_vlm', '=', True)]
  • name Char
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • tray_type_id Many2one → stock.location.vlm.tray.type
    comodel_name='stock.location.vlm.tray.type' required=True
Public methods (2)
  • action_tray_call(self)
    Send to the VLM a special command that calls this tray
  • action_tray_content(self, pos_x=None, pos_y=None)
    See the vlm quants belonging to the tray

New fields (11)
  • active Boolean
    default=True
  • code Char
    required=True
  • cols Integer
    required=True
  • depth Integer
    help='Depth of the tray in mm'
  • depth_per_cell Float
    compute='_compute_depth_per_cell'
  • height Integer
    help='Height of the tray in mm'
  • name Char
    required=True
  • rows Integer
    required=True
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • width Integer
    help='Width of the tray in mm'
  • width_per_cell Float
    compute='_compute_width_per_cell'
Public methods (0)

No public methods.

New fields (2)
  • has_vlm_operation Boolean
    compute='_compute_has_vlm_operation'
  • vlm_pending_quantity Float
    compute='_compute_vlm_pending_quantity' copy=False default=0.0 digits='Product Unit of Measure' help='Quantity pending on VLM Operations' readonly=False store=True
Public methods (0)

No public methods.

New fields (6)
  • has_pending_vlm_tasks Boolean
    compute='_compute_has_pending_vlm_tasks'
  • has_vlm_operations Boolean
    compute='_compute_has_vlm_operations'
  • has_vlm_pending_operations Boolean
    compute='_compute_has_vlm_pending_operations'
  • vlm_move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_vlm_move_line_ids'
  • vlm_pending_move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_vlm_move_line_ids'
  • vlm_task_ids Many2many → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_vlm_task_ids'
Public methods (2)
  • action_do_vlm_tasks(self)
    Perform the VLM pending tasks
  • action_open_vlm_task(self)

New fields (1)
  • vlm_quant_ids One2many → stock.quant.vlm
    comodel_name='stock.quant.vlm' inverse_name='quant_id'
Public methods (1)
  • action_view_in_vlm_structure(self)
    Open the VLM structure filtering by this product to locate it easily

New fields (6)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
  • quant_id Many2one → stock.quant
    comodel_name='stock.quant'
  • quantity Float
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_type_id Many2one
    related='tray_id.tray_type_id'
Public methods (4)
  • action_task_detail(self)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (15)
  • display_name Char
    compute='_compute_display_name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • product_id Many2one → product.product
    comodel_name='product.product'
  • quant_id Many2one → stock.quant
    comodel_name='stock.quant'
  • quantity_done Float
    digits='Product Unit of Measure'
  • quantity_pending Float
    digits='Product Unit of Measure'
  • reference Char
    default=''
  • skipped Boolean
  • splitted_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task'
  • state Selection
    selection=[('pending', 'Pending'), ('waiting', 'Waiting'), ('done', 'Done')]
  • task_type Selection
    selection=[('put', 'Put'), ('get', 'Get'), ('count', 'Count')]
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_type_id Many2one
    related='tray_id.tray_type_id'
  • vlm_quant_id Many2one → stock.quant.vlm
    comodel_name='stock.quant.vlm'
Public methods (3)
  • action_command_task(self)
    Send to the VLM then needed operations
  • action_command_task_threaded(self)
  • action_do_tasks(self)
    Perform the tasks sequentially

New fields (15)
  • image_512 Image
    related='vlm_task_id.product_id.image_512'
  • location_id Many2one → stock.location
    comodel_name='stock.location' related='vlm_task_id.location_id'
  • next_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_next_vlm_task_id'
  • previous_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_next_vlm_task_id'
  • quantity_done Float
  • quantity_pending Float
    readonly=True
  • splitted_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' related='vlm_task_id.splitted_vlm_task_id'
  • state Selection
    compute='_compute_state' selection=[('pending', 'Pending'), ('waiting', 'Waiting'), ('done', 'Done'), ('skipped', 'Skipped'), ('edit', 'Edit')]
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' required=True string='Selected task'
  • vlm_task_ids Many2many → stock.vlm.task
    comodel_name='stock.vlm.task'
  • vlm_tasks_partial Integer
    compute='_compute_vlm_tasks_total'
  • vlm_tasks_progress Integer
    compute='_compute_vlm_tasks_total'
  • vlm_tasks_total Integer
    compute='_compute_vlm_tasks_total'
  • warning Char
    readonly=True
Public methods (7)
  • action_command(self)
    Set task values from the wizard
  • action_go_to_task(self, go_to='current')
    Go to the next task
  • action_manual_set(self)
    Save the info directly to the task as if it was validated by the VLM
  • action_next_task(self)
  • action_previous_task(self)
  • action_skip_task(self)
    Skip task and go to the next one
  • default_get(self, fields)
    @api.model

New fields (7)
  • human_pos_x Integer
    compute='_compute_human_pos_x' inverse='_inverse_human_pos_x' readonly=False string='X'
  • human_pos_y Integer
    compute='_compute_human_pos_y' inverse='_inverse_human_pos_y' readonly=False string='Y'
  • pos_x Integer
    compute='_compute_pos' readonly=False store=True
  • pos_y Integer
    compute='_compute_pos' readonly=False store=True
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • tray_type_id Many2one → stock.location.vlm.tray.type
    comodel_name='stock.location.vlm.tray.type'
Public methods (1)
  • tray_cell_center_position(self, pos_x=None, pos_y=None)
    Center position in mm of a cell. Used to position the laser pointer. @return {tuple} millimeters from bottom-left corner (left, bottom)
REPOSITORY
REPOSITORYOCA/stock-logistics-warehouse
GIT
GIThttps://github.com/OCA/stock-logistics-warehouse.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/stock-logistics-warehouse/tree/16.0/stock_vlm_mgmt
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYStock
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, David, oca-ci, CristianoMafraJunior, ArnauCForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/stock-logistics-warehouse
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:45
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (19)
XML IDNameModelTypeStatus
svm_operation_picking_form_view stock.picking xpath Inherits stock.view_picking_form
view_location_form stock.location div Inherits stock.view_location_form
view_location_search stock.location separator Inherits stock.view_location_search
view_location_vlm_tray_form stock.location.vlm.tray form New
view_location_vlm_tray_tree stock.location.vlm.tray tree New
view_stock_location_tray_type_form stock.location.vlm.tray.type form New
view_stock_location_tray_type_search stock.location.vlm.tray.type search New
view_stock_location_tray_type_tree stock.location.vlm.tray.type tree New
view_stock_quant_inventory_tree stock.quant.vlm tree Inherits view_stock_quant_vlm_tree
view_stock_quant_tree stock.quant field Inherits stock.view_stock_quant_tree
view_stock_quant_tree_editable stock.quant field Inherits stock.view_stock_quant_tree_editable
view_stock_quant_tree_inventory_editable stock.quant field Inherits stock.view_stock_quant_tree_inventory_editable
view_stock_quant_vlm_form stock.quant.vlm form New
view_stock_quant_vlm_tree stock.quant.vlm tree New
view_vlm_task_form stock.vlm.task form New
view_vlm_task_tree stock.vlm.task tree New
vlm_quant_search_view stock.quant.vlm search New
vlm_task_action_form_view stock.vlm.task.action form New
vlm_task_search_view stock.vlm.task search New
Models touched (10)

New fields (10)
  • is_vlm Boolean
  • vlm_address Char
    help='An VLM normally will be behind some propietary proxy that handles several VLMs at once, so we need to set which one corresponds to this location'
  • vlm_hostname Char
  • vlm_password Char
  • vlm_port Char
  • vlm_removal_strategy Selection
    default='fifo' selection=[('fifo', 'FIFO'), ('lifo', 'LIFO'), ('optimal', 'Less carrier movements')]
  • vlm_sequence_id Many2one → ir.sequence
    comodel_name='ir.sequence'
  • vlm_tray_ids One2many → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray' inverse_name='location_id'
  • vlm_user Char
  • vlm_vendor Selection
    selection=[('test', 'Test')]
Public methods (4)
  • action_release_vlm_trays(self)
    Send to the VLM a special command that releases all the trays
  • action_view_vlm_quants(self)
  • action_view_vlm_tray(self)
  • send_vlm_request(self, data: dict, **options) -> dict
    Send request to the vendor methods. The vendor connector should deal with the connection issues transforming the response into these standard codes: -1: Connection refused -2: The request is issued but the response is lost -3: Timeout in the request -4: VLM Hardware issues

New fields (5)
  • is_full Boolean
  • location_id Many2one → stock.location
    comodel_name='stock.location' domain=[('is_vlm', '=', True)]
  • name Char
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • tray_type_id Many2one → stock.location.vlm.tray.type
    comodel_name='stock.location.vlm.tray.type' required=True
Public methods (2)
  • action_tray_call(self)
    Send to the VLM a special command that calls this tray
  • action_tray_content(self, pos_x=None, pos_y=None)
    See the vlm quants belonging to the tray

New fields (11)
  • active Boolean
    default=True
  • code Char
    required=True
  • cols Integer
    required=True
  • depth Integer
    help='Depth of the tray in mm'
  • depth_per_cell Float
    compute='_compute_depth_per_cell'
  • height Integer
    help='Height of the tray in mm'
  • name Char
    required=True
  • rows Integer
    required=True
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • width Integer
    help='Width of the tray in mm'
  • width_per_cell Float
    compute='_compute_width_per_cell'
Public methods (0)

No public methods.

New fields (2)
  • has_vlm_operation Boolean
    compute='_compute_has_vlm_operation'
  • vlm_pending_quantity Float
    compute='_compute_vlm_pending_quantity' copy=False default=0.0 digits='Product Unit of Measure' help='Quantity pending on VLM Operations' readonly=False store=True
Public methods (0)

No public methods.

New fields (6)
  • has_pending_vlm_tasks Boolean
    compute='_compute_has_pending_vlm_tasks'
  • has_vlm_operations Boolean
    compute='_compute_has_vlm_operations'
  • has_vlm_pending_operations Boolean
    compute='_compute_has_vlm_pending_operations'
  • vlm_move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_vlm_move_line_ids'
  • vlm_pending_move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line' compute='_compute_vlm_move_line_ids'
  • vlm_task_ids Many2many → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_vlm_task_ids'
Public methods (2)
  • action_do_vlm_tasks(self)
    Perform the VLM pending tasks
  • action_open_vlm_task(self)

New fields (1)
  • vlm_quant_ids One2many → stock.quant.vlm
    comodel_name='stock.quant.vlm' inverse_name='quant_id'
Public methods (1)
  • action_view_in_vlm_structure(self)
    Open the VLM structure filtering by this product to locate it easily

New fields (6)
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • product_id Many2one → product.product
    comodel_name='product.product' required=True
  • quant_id Many2one → stock.quant
    comodel_name='stock.quant'
  • quantity Float
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_type_id Many2one
    related='tray_id.tray_type_id'
Public methods (4)
  • action_task_detail(self)
  • create(self, vals)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (15)
  • display_name Char
    compute='_compute_display_name'
  • location_id Many2one → stock.location
    comodel_name='stock.location'
  • move_line_ids Many2many → stock.move.line
    comodel_name='stock.move.line'
  • product_id Many2one → product.product
    comodel_name='product.product'
  • quant_id Many2one → stock.quant
    comodel_name='stock.quant'
  • quantity_done Float
    digits='Product Unit of Measure'
  • quantity_pending Float
    digits='Product Unit of Measure'
  • reference Char
    default=''
  • skipped Boolean
  • splitted_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task'
  • state Selection
    selection=[('pending', 'Pending'), ('waiting', 'Waiting'), ('done', 'Done')]
  • task_type Selection
    selection=[('put', 'Put'), ('get', 'Get'), ('count', 'Count')]
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_type_id Many2one
    related='tray_id.tray_type_id'
  • vlm_quant_id Many2one → stock.quant.vlm
    comodel_name='stock.quant.vlm'
Public methods (3)
  • action_command_task(self)
    Send to the VLM then needed operations
  • action_command_task_threaded(self)
  • action_do_tasks(self)
    Perform the tasks sequentially

New fields (15)
  • image_512 Image
    related='vlm_task_id.product_id.image_512'
  • location_id Many2one → stock.location
    comodel_name='stock.location' related='vlm_task_id.location_id'
  • next_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_next_vlm_task_id'
  • previous_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' compute='_compute_next_vlm_task_id'
  • quantity_done Float
  • quantity_pending Float
    readonly=True
  • splitted_vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' related='vlm_task_id.splitted_vlm_task_id'
  • state Selection
    compute='_compute_state' selection=[('pending', 'Pending'), ('waiting', 'Waiting'), ('done', 'Done'), ('skipped', 'Skipped'), ('edit', 'Edit')]
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • vlm_task_id Many2one → stock.vlm.task
    comodel_name='stock.vlm.task' required=True string='Selected task'
  • vlm_task_ids Many2many → stock.vlm.task
    comodel_name='stock.vlm.task'
  • vlm_tasks_partial Integer
    compute='_compute_vlm_tasks_total'
  • vlm_tasks_progress Integer
    compute='_compute_vlm_tasks_total'
  • vlm_tasks_total Integer
    compute='_compute_vlm_tasks_total'
  • warning Char
    readonly=True
Public methods (7)
  • action_command(self)
    Set task values from the wizard
  • action_go_to_task(self, go_to='current')
    Go to the next task
  • action_manual_set(self)
    Save the info directly to the task as if it was validated by the VLM
  • action_next_task(self)
  • action_previous_task(self)
  • action_skip_task(self)
    Skip task and go to the next one
  • default_get(self, fields)
    @api.model

New fields (7)
  • human_pos_x Integer
    compute='_compute_human_pos_x' inverse='_inverse_human_pos_x' readonly=False string='X'
  • human_pos_y Integer
    compute='_compute_human_pos_y' inverse='_inverse_human_pos_y' readonly=False string='Y'
  • pos_x Integer
    compute='_compute_pos' readonly=False store=True
  • pos_y Integer
    compute='_compute_pos' readonly=False store=True
  • tray_id Many2one → stock.location.vlm.tray
    comodel_name='stock.location.vlm.tray'
  • tray_matrix Serialized
    compute='_compute_tray_matrix'
  • tray_type_id Many2one → stock.location.vlm.tray.type
    comodel_name='stock.location.vlm.tray.type'
Public methods (1)
  • tray_cell_center_position(self, pos_x=None, pos_y=None)
    Center position in mm of a cell. Used to position the laser pointer. @return {tuple} millimeters from bottom-left corner (left, bottom)