You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
7.2 KiB
170 lines
7.2 KiB
"""This module handles the requests made by js files and returns the corresponding data."""
|
|
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (LGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
import math
|
|
from odoo import http
|
|
from odoo.http import request
|
|
|
|
|
|
class Stock3DView(http.Controller):
|
|
"""Class for handling the requests and responses"""
|
|
|
|
@http.route('/3Dstock/warehouse', type='json', auth='public')
|
|
def get_warehouse_data(self, company_id):
|
|
"""
|
|
This method is used to handle the request for warehouse data.
|
|
------------------------------------------------
|
|
@param self: object pointer.
|
|
@param company_id: current company id.
|
|
@return: a list of warehouses created under the active company.
|
|
"""
|
|
warehouse = request.env['stock.warehouse'].sudo().search([])
|
|
warehouse_list = []
|
|
warehouse_list.clear()
|
|
for rec in warehouse:
|
|
if rec.company_id.id == company_id:
|
|
warehouse_list.append((rec.id, rec.name))
|
|
return warehouse_list
|
|
|
|
@http.route('/3Dstock/data', type='json', auth='public')
|
|
def get_stock_data(self, company_id, wh_id):
|
|
"""
|
|
This method is used to handle the request for location data.
|
|
------------------------------------------------
|
|
@param self: object pointer
|
|
@param company_id: current company id.
|
|
@param wh_id: the selected warehouse id.
|
|
@return:a list of locations with their dimensions and positions of
|
|
selected warehouse.
|
|
"""
|
|
warehouse = request.env['stock.warehouse'].sudo().search(
|
|
[('id', '=', int(wh_id)), ('company_id', '=', int(company_id))])
|
|
locations = request.env['stock.location'].sudo().search(
|
|
[('company_id', '=', int(company_id)),
|
|
('active', '=', 'true'),
|
|
('usage', '=', 'internal')])
|
|
location_dict = {}
|
|
for loc in locations:
|
|
for wh in warehouse:
|
|
if loc.warehouse_id.id == warehouse.id:
|
|
if loc.id not in (
|
|
wh.lot_stock_id.id, wh.wh_input_stock_loc_id.id,
|
|
wh.wh_qc_stock_loc_id.id,
|
|
wh.wh_pack_stock_loc_id.id, wh.wh_output_stock_loc_id.id):
|
|
length = int(loc.length * 3.779 * 2)
|
|
width = int(loc.width * 3.779 * 2)
|
|
height = int(loc.height * 3.779 * 2)
|
|
location_dict.update(
|
|
{loc.unique_code: [loc.pos_x, loc.pos_y, loc.pos_z,
|
|
length, width, height]})
|
|
|
|
return location_dict
|
|
|
|
@http.route('/3Dstock/data/quantity', type='json', auth='public')
|
|
def get_stock_count_data(self, loc_code):
|
|
"""
|
|
This method is used to handle the request for location's current stock
|
|
quantity.
|
|
------------------------------------------------
|
|
@param self: object pointer.
|
|
@param loc_code: the selected location code.
|
|
@return: current quantity of selected location.
|
|
"""
|
|
quantity = request.env['stock.quant'].sudo().search(
|
|
[('location_id.unique_code', '=', loc_code)]).mapped(
|
|
'quantity')
|
|
capacity = request.env['stock.location'].sudo().search(
|
|
[('unique_code', '=', loc_code)]).max_capacity
|
|
count = math.fsum(quantity)
|
|
quant_data = (0, 0)
|
|
if capacity:
|
|
if capacity > 0:
|
|
load = int((count * 100) / capacity)
|
|
quant_data = (capacity, load)
|
|
else:
|
|
if count > 0:
|
|
quant_data = (0, -1)
|
|
return quant_data
|
|
|
|
@http.route('/3Dstock/data/product', type='json', auth='public')
|
|
def get_stock_product_data(self, loc_code):
|
|
"""
|
|
This method is used to handle the request for data of products of
|
|
selected location.
|
|
------------------------------------------------
|
|
@param self: object pointer.
|
|
@param loc_code: the selected location code.
|
|
@return: a dictionary including total capacity, current capacity and
|
|
products stored in selected location.
|
|
"""
|
|
products = request.env['stock.quant'].sudo().search(
|
|
[('location_id.unique_code', '=', loc_code)])
|
|
quantity_obj = request.env['stock.quant'].sudo().search(
|
|
[('location_id.unique_code', '=', loc_code)]).mapped(
|
|
'quantity')
|
|
capacity = request.env['stock.location'].sudo().search(
|
|
[('unique_code', '=', loc_code)]).max_capacity
|
|
product_list = []
|
|
product_list.clear()
|
|
if products:
|
|
for rec in products:
|
|
product_list.append((rec.product_id.display_name, rec.quantity))
|
|
load = math.fsum(quantity_obj)
|
|
if capacity > 0:
|
|
space = capacity - load
|
|
else:
|
|
space = 0
|
|
data = {
|
|
'capacity': capacity,
|
|
'space': space,
|
|
'product_list': product_list
|
|
}
|
|
return data
|
|
|
|
@http.route('/3Dstock/data/standalone', type='json', auth='public')
|
|
def get_standalone_stock_data(self, company_id, loc_id):
|
|
"""
|
|
This method is used to handle the request for individual location data.
|
|
------------------------------------------------
|
|
@param self: object pointer.
|
|
@param company_id: the current company id.
|
|
@param loc_id: the selected location code.
|
|
@return: a dictionary including of selected location's dimensions and
|
|
positions.
|
|
"""
|
|
warehouse = request.env['stock.location'].sudo().search(
|
|
[('company_id.id', '=', int(company_id)),
|
|
('id', '=', int(loc_id))]).mapped('warehouse_id')
|
|
locations = request.env['stock.location'].sudo().search(
|
|
[('company_id.id', '=', int(company_id)),
|
|
('active', '=', 'true'),
|
|
('usage', '=', 'internal')])
|
|
location_dict = {}
|
|
for loc in locations:
|
|
if loc.warehouse_id.id == warehouse.id:
|
|
length = int(loc.length * 3.779 * 2)
|
|
width = int(loc.width * 3.779 * 2)
|
|
height = int(loc.height * 3.779 * 2)
|
|
location_dict.update(
|
|
{loc.unique_code: [loc.pos_x, loc.pos_y, loc.pos_z,
|
|
length, width, height, loc.id]})
|
|
return location_dict
|
|
|