diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv
index 1490b9ef..7911552c 100644
--- a/sf_base/security/ir.model.access.csv
+++ b/sf_base/security/ir.model.access.csv
@@ -35,6 +35,41 @@ access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_us
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,base.group_user,1,1,1,1
+access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
+access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_sync_common,sf_sync_common,model_sf_sync_common,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_international_standards,sf_international_standards,model_sf_international_standards,sf_base.group_sf_mrp_user,1,0,0,0
+access_material_apply,material_apply,model_material_apply,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,sf_base.group_sf_mrp_user,1,0,0,0
+access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,sf_base.group_sf_mrp_user,1,0,0,0
+
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
diff --git a/sf_maintenance/__manifest__.py b/sf_maintenance/__manifest__.py
index e5a4f03b..595a5d25 100644
--- a/sf_maintenance/__manifest__.py
+++ b/sf_maintenance/__manifest__.py
@@ -12,6 +12,7 @@
'security/ir.model.access.csv',
'security/ir_rule_data.xml',
'views/maintenance_logs_views.xml',
+ 'views/maintenance_equipment_oee_views.xml',
'views/maintenance_views.xml',
'views/equipment_maintenance_standards_views.xml',
'views/maintenance_request_views.xml',
diff --git a/sf_maintenance/models/__init__.py b/sf_maintenance/models/__init__.py
index 0e06b132..b177eb3c 100644
--- a/sf_maintenance/models/__init__.py
+++ b/sf_maintenance/models/__init__.py
@@ -1,5 +1,6 @@
# -*-coding:utf-8-*-
from . import sf_maintenance
+from . import sf_maintenance_oee
from . import sf_maintenance_logs
from . import sf_equipment_maintenance_standards
from . import sf_maintenance_requests
diff --git a/sf_maintenance/models/sf_equipment_maintenance_standards.py b/sf_maintenance/models/sf_equipment_maintenance_standards.py
index 92a94c0e..388199da 100644
--- a/sf_maintenance/models/sf_equipment_maintenance_standards.py
+++ b/sf_maintenance/models/sf_equipment_maintenance_standards.py
@@ -86,7 +86,7 @@ class SfSaintenanceStandards(models.Model):
images = fields.One2many('maintenance.standard.image', 'standard_id', string='反馈图片')
maintenance_request_ids = fields.Many2many('maintenance.request', string='维保计划')
Period = fields.Integer('周期/频次(天)')
- remark = fields.Char('备注说明')
+ remark = fields.Char('维保记录')
class MaintenanceStandardImage(models.Model):
diff --git a/sf_maintenance/models/sf_maintenance_logs.py b/sf_maintenance/models/sf_maintenance_logs.py
index 791f66f8..2dc26f7e 100644
--- a/sf_maintenance/models/sf_maintenance_logs.py
+++ b/sf_maintenance/models/sf_maintenance_logs.py
@@ -11,6 +11,7 @@ class SfMaintenanceLogs(models.Model):
type = fields.Selection([('type1', '类型1'), ('type2', '类型2')], string='类型')
brand = fields.Many2one('sf.machine.brand', related='maintenance_equipment_id.brand_id', string='品牌')
maintenance_equipment_id = fields.Many2one('maintenance.equipment', string='设备')
+ maintenance_equipment_oee_id = fields.Many2one('maintenance.equipment.oee', string='设备oee')
code_location = fields.Char(string='编码位置')
fault_type = fields.Selection(
[('电气类', '电气类'), ('机械类', '机械类'), ('程序类', '程序类'), ('系统类', '系统类')], string='故障类型')
diff --git a/sf_maintenance/models/sf_maintenance_oee.py b/sf_maintenance/models/sf_maintenance_oee.py
new file mode 100644
index 00000000..71802fda
--- /dev/null
+++ b/sf_maintenance/models/sf_maintenance_oee.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+from odoo import api, fields, models, _
+
+
+class SfMaintenanceEquipmentOEE(models.Model):
+ _name = 'maintenance.equipment.oee'
+ _description = '设备OEE'
+
+ name = fields.Char('设备oee')
+ equipment_id = fields.Many2one('maintenance.equipment', '设备',
+ domain="[('category_id.equipment_type', '=', '机床'),('state_zc', '=', '已注册')]")
+ type_id = fields.Many2one('sf.machine_tool.type', '型号', related='equipment_id.type_id')
+ machine_tool_picture = fields.Binary('设备图片', related='equipment_id.machine_tool_picture')
+ state = fields.Selection(
+ [("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"),
+ ("封存(报废)", "封存(报废)")],
+ default='正常', string="机床状态", related='equipment_id.state')
+ run_time = fields.Float('正常运行总时长(h)')
+ equipment_time = fields.Float('总时长(h)')
+ done_nums = fields.Integer('累计加工总件数')
+ utilization_rate = fields.Char('开动率')
+ fault_time = fields.Float('故障停机总时长(h)')
+ fault_nums = fields.Integer('故障次数')
+ sf_maintenance_logs_ids = fields.One2many('sf.maintenance.logs', 'maintenance_equipment_oee_id', '设备故障日志',
+ related='equipment_id.sf_maintenance_logs_ids')
+
+ def name_get(self):
+ result = []
+ for parameter in self:
+ if parameter.equipment_id:
+ name = parameter.equipment_id.name
+ result.append((parameter.id, name))
+ return result
\ No newline at end of file
diff --git a/sf_maintenance/security/ir.model.access.csv b/sf_maintenance/security/ir.model.access.csv
index ca18d942..575afec5 100644
--- a/sf_maintenance/security/ir.model.access.csv
+++ b/sf_maintenance/security/ir.model.access.csv
@@ -4,6 +4,9 @@ access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_grou
access_sf_maintenance_logs,sf_maintenance_logs,model_sf_maintenance_logs,sf_group_equipment_manager,1,1,1,0
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_user,1,0,0,0
access_maintenance_equipment,maintenance_equipment,model_maintenance_equipment,sf_group_equipment_manager,1,1,1,0
+access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_user,1,0,0,0
+access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,sf_group_equipment_manager,1,1,1,0
+access_maintenance_equipment_oee,maintenance_equipment_oee,model_maintenance_equipment_oee,base.group_user,1,1,1,1
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_user,1,0,0,0
access_maintenance_standards,maintenance_standards,model_maintenance_standards,sf_group_equipment_manager,1,1,1,0
access_maintenance_standard_image,maintenance_standard_image,model_maintenance_standard_image,sf_group_equipment_user,1,0,0,0
diff --git a/sf_maintenance/views/maintenance_equipment_oee_views.xml b/sf_maintenance/views/maintenance_equipment_oee_views.xml
new file mode 100644
index 00000000..60055631
--- /dev/null
+++ b/sf_maintenance/views/maintenance_equipment_oee_views.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+ maintenance.oee.tree
+ maintenance.equipment.oee
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ maintenance.oee.form
+ maintenance.equipment.oee
+
+
+
+
+
+
+
+ maintenance.oee.search
+ maintenance.equipment.oee
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 设备OEE
+ ir.actions.act_window
+ maintenance.equipment.oee
+
+ tree,form
+
+
+
+ 设备OEE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sf_maintenance/views/maintenance_logs_views.xml b/sf_maintenance/views/maintenance_logs_views.xml
index b0d6af79..087f6ffb 100644
--- a/sf_maintenance/views/maintenance_logs_views.xml
+++ b/sf_maintenance/views/maintenance_logs_views.xml
@@ -8,7 +8,6 @@
-
diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py
index c4fd6b87..88bbe016 100644
--- a/sf_manufacturing/controllers/controllers.py
+++ b/sf_manufacturing/controllers/controllers.py
@@ -40,3 +40,111 @@ class Manufacturing_Connect(http.Controller):
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
logging.info('get_Work_Info error:%s' % e)
return json.JSONEncoder().encode(res)
+
+
+ @http.route('/AutoDeviceApi/FeedBackStart', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
+ cors="*")
+ def button_Work_START(self, **kw):
+ """
+ 工单任务开始
+ :param kw:
+ :return:
+ """
+ logging.info('get_Work_Info:%s' % kw)
+ try:
+ res = {'Succeed': True, 'Datas': []}
+ datas = request.httprequest.data
+ ret = json.loads(datas)
+ if not ret['BillId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
+ return json.JSONEncoder().encode(res)
+ if not ret['CraftId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
+ return json.JSONEncoder().encode(res)
+ if not ret['DeviceId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
+ return json.JSONEncoder().encode(res)
+ production_id = ret['BillId']
+ routing_type = ret['CraftId']
+ workorder = request.env['mrp.workorder'].sudo().search(
+ [('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
+ workorder.button_start()
+
+
+ except Exception as e:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
+ logging.info('get_Work_Info error:%s' % e)
+ return json.JSONEncoder().encode(res)
+
+ @http.route('/AutoDeviceApi/FeedBackEnd', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
+ cors="*")
+ def button_Work_End(self, **kw):
+ """
+ 工单任务结束
+ :param kw:
+ :return:
+ """
+ logging.info('get_Work_Info:%s' % kw)
+ try:
+ res = {'Succeed': True, 'Datas': []}
+ datas = request.httprequest.data
+ ret = json.loads(datas)
+ if not ret['BillId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
+ return json.JSONEncoder().encode(res)
+ if not ret['CraftId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
+ return json.JSONEncoder().encode(res)
+ if not ret['DeviceId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
+ return json.JSONEncoder().encode(res)
+ production_id = ret['BillId']
+ routing_type = ret['CraftId']
+ workorder = request.env['mrp.workorder'].sudo().search(
+ [('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
+ workorder.button_finish()
+
+
+ except Exception as e:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
+ logging.info('get_Work_Info error:%s' % e)
+ return json.JSONEncoder().encode(res)
+
+
+ @http.route('/AutoDeviceApi/QcCheck', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
+ cors="*")
+ def Workorder_QcCheck(self, **kw):
+ """
+ 零件质检
+ :param kw:
+ :return:
+ """
+ logging.info('get_Work_Info:%s' % kw)
+ try:
+ res = {'Succeed': True, 'Datas': []}
+ datas = request.httprequest.data
+ ret = json.loads(datas)
+ if not ret['BillId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传制造订单号'}
+ return json.JSONEncoder().encode(res)
+ if not ret['CraftId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传工序名称'}
+ return json.JSONEncoder().encode(res)
+ if not ret['DeviceId']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传设备号'}
+ return json.JSONEncoder().encode(res)
+ if not ret['Quality']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检测结果'}
+ return json.JSONEncoder().encode(res)
+ if not ret['ReportPaht']:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未传检查报告文件(地址)'}
+ return json.JSONEncoder().encode(res)
+ production_id = ret['BillId']
+ routing_type = ret['CraftId']
+ request.env['mrp.workorder'].sudo().search(
+ [('production_id', '=', production_id), ('routing_type', '=', routing_type)], limit=1)
+
+ except Exception as e:
+ res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
+ logging.info('get_Work_Info error:%s' % e)
+ return json.JSONEncoder().encode(res)
\ No newline at end of file
diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py
index cb326ee8..8eb17dfd 100644
--- a/sf_manufacturing/models/mrp_production.py
+++ b/sf_manufacturing/models/mrp_production.py
@@ -450,10 +450,10 @@ class MrpProduction(models.Model):
for route in routingworkcenter:
- if route.routing_type == '后置三元质量检测':
- workorders_values.append(
- self.env['mrp.workorder'].json_workorder_str1(k, production, route)
- )
+ # if route.routing_type == '后置三元质量检测':
+ # workorders_values.append(
+ # self.env['mrp.workorder'].json_workorder_str1(k, production, route)
+ # )
if route.routing_type == 'CNC加工':
workorders_values.append(
self.env['mrp.workorder'].json_workorder_str1(k, production, route))
diff --git a/sf_manufacturing/models/mrp_routing_workcenter.py b/sf_manufacturing/models/mrp_routing_workcenter.py
index 95c70533..8bb9733b 100644
--- a/sf_manufacturing/models/mrp_routing_workcenter.py
+++ b/sf_manufacturing/models/mrp_routing_workcenter.py
@@ -11,7 +11,7 @@ class ResMrpRoutingWorkcenter(models.Model):
('装夹预调', '装夹预调'),
# ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'),
- ('后置三元质量检测', '后置三元质量检测'),
+ # ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'),
('切割', '切割'),
('表面工艺', '表面工艺')
diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py
index ad54004e..1434078e 100644
--- a/sf_manufacturing/models/mrp_workorder.py
+++ b/sf_manufacturing/models/mrp_workorder.py
@@ -35,7 +35,7 @@ class ResMrpWorkOrder(models.Model):
('装夹预调', '装夹预调'),
# ('前置三元定位检测', '前置三元定位检测'),
('CNC加工', 'CNC加工'),
- ('后置三元质量检测', '后置三元质量检测'),
+ # ('后置三元质量检测', '后置三元质量检测'),
('解除装夹', '解除装夹'),
('切割', '切割'), ('表面工艺', '表面工艺')
], string="工序类型")
@@ -216,9 +216,9 @@ class ResMrpWorkOrder(models.Model):
elif route.routing_type == 'CNC加工':
duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
[('name', '=', 'CNC加工')]).time_cycle
- elif route.routing_type == '后置三元质量检测':
- duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
- [('name', '=', '后置三元质量检测')]).time_cycle
+ # elif route.routing_type == '后置三元质量检测':
+ # duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
+ # [('name', '=', '后置三元质量检测')]).time_cycle
elif route.routing_type == '解除装夹':
duration_expected = self.env['mrp.routing.workcenter'].sudo().search(
[('name', '=', '解除装夹')]).time_cycle
diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml
index 8a9214e9..d7c911fa 100644
--- a/sf_manufacturing/views/mrp_workorder_view.xml
+++ b/sf_manufacturing/views/mrp_workorder_view.xml
@@ -398,6 +398,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -423,20 +438,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sf_warehouse/views/shelf_location.xml b/sf_warehouse/views/shelf_location.xml
index e82fbc16..7ac4dcbc 100644
--- a/sf_warehouse/views/shelf_location.xml
+++ b/sf_warehouse/views/shelf_location.xml
@@ -9,12 +9,12 @@
-
-
+
+
+
+
+
+
diff --git a/sf_warehouse/views/view.xml b/sf_warehouse/views/view.xml
index 7f315363..585d8f65 100644
--- a/sf_warehouse/views/view.xml
+++ b/sf_warehouse/views/view.xml
@@ -175,17 +175,17 @@
-
- stock.location.tree.sf.inherit
- stock.location
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -206,17 +206,17 @@
-
- stock.warehouse.tree.sf.inherit
- stock.warehouse
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -238,17 +238,17 @@
-
- stock.route.tree.sf.inherit
- stock.route
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -269,17 +269,17 @@
-
- stock.rule.tree.sf.inherit
- stock.rule
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -300,18 +300,81 @@
-
- stock.picking.type.tree.sf.inherit
- stock.picking.type
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ product.category.form.sf.inherit
+ product.category
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ uom.category.form.sf.inherit
+ uom.category
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
barcode.nomenclature.form.sf.inherit
@@ -331,17 +394,17 @@
-
- barcode.nomenclature.tree.sf.inherit
- barcode.nomenclature
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -363,40 +426,40 @@
-
- stock.warehouse.orderpoint.tree.sf.inherit
- stock.warehouse.orderpoint
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- stock.quant.tree.sf.inherit
- stock.quant
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -418,17 +481,17 @@
-
- stock.scrap.tree.sf.inherit
- stock.scrap
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+