Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/制造功能优化
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
|
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
|
||||||
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
|
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
|
||||||
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
|
<xpath expr="//div[@class='card-body']/div[last()]" position="replace"></xpath>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- 隐藏odoo版本信息 -->
|
<!-- 隐藏odoo版本信息 -->
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
from . import models
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
||||||
|
|
||||||
{
|
|
||||||
'name': '机企猫智能工厂 消息提醒',
|
|
||||||
'version': '1.0',
|
|
||||||
'summary': '智能工厂消息提醒模块',
|
|
||||||
'sequence': 1,
|
|
||||||
'description': """
|
|
||||||
|
|
||||||
""",
|
|
||||||
'category': 'sf',
|
|
||||||
'website': 'https://www.sf.jikimo.com',
|
|
||||||
'depends': ['jikimo_message_notify'],
|
|
||||||
'data': [
|
|
||||||
'security/ir.model.access.csv',
|
|
||||||
'data/bussiness_node.xml',
|
|
||||||
# 'views/sf_message_template_view.xml',
|
|
||||||
],
|
|
||||||
'test': [
|
|
||||||
],
|
|
||||||
'license': 'LGPL-3',
|
|
||||||
'installable': True,
|
|
||||||
'auto_install': False,
|
|
||||||
'application': False,
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" ?>
|
|
||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
<record id="bussiness_1" model="jikimo.message.bussiness.node">
|
|
||||||
<field name="name">订单确认</field>
|
|
||||||
<field name="model">sale.order</field>
|
|
||||||
</record>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
from . import jikimo_message_template
|
|
||||||
from . import sale_order
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
from odoo import models, fields, api
|
|
||||||
|
|
||||||
class JikimoMessageTemplate(models.Model):
|
|
||||||
_inherit = "jikimo.message.template"
|
|
||||||
|
|
||||||
def _get_message_model(self):
|
|
||||||
res = super(JikimoMessageTemplate, self)._get_message_model()
|
|
||||||
res.append("sale.order")
|
|
||||||
return res
|
|
||||||
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
from odoo import models, fields, api
|
|
||||||
|
|
||||||
|
|
||||||
class SaleOrder(models.Model):
|
|
||||||
_name = "sale.order"
|
|
||||||
_description = "销售订单"
|
|
||||||
_inherit = ["sale.order", "jikimo.message.dispatch"]
|
|
||||||
|
|
||||||
def create(self, vals_list):
|
|
||||||
res = super(SaleOrder, self).create(vals_list)
|
|
||||||
res.add_queue('订单确认')
|
|
||||||
return res
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,76 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- © <2016> <top hy>
|
|
||||||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
|
|
||||||
|
|
||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
|
|
||||||
<record id="sf_message_template_view_form" model="ir.ui.view">
|
|
||||||
<field name="name">sf.message.template.view.form</field>
|
|
||||||
<field name="model">message.template</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="消息模板">
|
|
||||||
<sheet>
|
|
||||||
<div class="oe_title">
|
|
||||||
<label for="name"/>
|
|
||||||
<h1>
|
|
||||||
<field name="name" class="w-100" required="1"/>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
<group>
|
|
||||||
<!-- <field name="type"/>-->
|
|
||||||
<field name="notify_model_id"/>
|
|
||||||
<field name="content" widget="html" class="oe-bordered-editor"
|
|
||||||
options="{'style-inline': true, 'codeview': true, 'dynamic_placeholder': true}"/>
|
|
||||||
<field name="description"/>
|
|
||||||
<field name="msgtype"/>
|
|
||||||
<field name="notification_department_id"/>
|
|
||||||
<field name="notification_employee_ids" widget="many2many_tags"/>
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="sf_message_template_view_tree" model="ir.ui.view">
|
|
||||||
<field name="name">sf.message.template.view.tree</field>
|
|
||||||
<field name="model">message.template</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree string="消息模板">
|
|
||||||
<field name="name"/>
|
|
||||||
<!-- <field name="type"/>-->
|
|
||||||
<field name="content"/>
|
|
||||||
<field name="msgtype"/>
|
|
||||||
<field name="notification_department_id"/>
|
|
||||||
<field name="notification_employee_ids" widget="many2many_tags"/>
|
|
||||||
<field name="description"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="sf_message_template_search_view" model="ir.ui.view">
|
|
||||||
<field name="name">sf.message.template.search.view</field>
|
|
||||||
<field name="model">message.template</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<search>
|
|
||||||
<field name="name" string="模糊搜索"
|
|
||||||
filter_domain="['|','|',('name','like',self),('description','like',self)]"/>
|
|
||||||
<field name="name"/>
|
|
||||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
|
||||||
</search>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!--定义单证类型视图动作-->
|
|
||||||
<record id="sf_message_template_action" model="ir.actions.act_window">
|
|
||||||
<field name="name">消息模板</field>
|
|
||||||
<field name="res_model">message.template</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
<field name="view_id" ref="sf_message_template_view_tree"/>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<menuitem id="msg_set_menu" name="消息设置" parent="base.menu_administration" sequence="1"/>
|
|
||||||
<menuitem id="sf_message_template_send_menu" name="消息模板" parent="msg_set_menu"
|
|
||||||
action="sf_message_template_action" sequence="1"/>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -159,9 +159,6 @@ td.o_required_modifier {
|
|||||||
display:inline;
|
display:inline;
|
||||||
}
|
}
|
||||||
.diameter{
|
.diameter{
|
||||||
display: flex !important;
|
|
||||||
justify-content: flex-start !important;
|
|
||||||
align-items: center !important;
|
|
||||||
}
|
}
|
||||||
.o_address_format {
|
.o_address_format {
|
||||||
display: flex !important;
|
display: flex !important;
|
||||||
|
|||||||
@@ -578,7 +578,7 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="ir.ui.view" id="view_cutting_tool_material_search">
|
<record model="ir.ui.view" id="view_cutting_tool_inventory_search">
|
||||||
<field name="name">sf.tool.inventory.search</field>
|
<field name="name">sf.tool.inventory.search</field>
|
||||||
<field name="model">sf.tool.inventory</field>
|
<field name="model">sf.tool.inventory</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ class StatusChange(models.Model):
|
|||||||
logging.info('接口已经执行=============')
|
logging.info('接口已经执行=============')
|
||||||
else:
|
else:
|
||||||
traceback_error = traceback.format_exc()
|
traceback_error = traceback.format_exc()
|
||||||
logging.error("bfm订单状态同步失败:%s request info %s" % traceback_error)
|
logging.error("bfm订单状态同步失败:%s" % traceback_error)
|
||||||
logging.error('/api/get/state/get_order 请求失败{}'.format(ret))
|
|
||||||
raise UserError('工厂加工同步订单状态到bfm失败')
|
raise UserError('工厂加工同步订单状态到bfm失败')
|
||||||
except UserError as e:
|
except UserError as e:
|
||||||
traceback_error = traceback.format_exc()
|
traceback_error = traceback.format_exc()
|
||||||
|
|||||||
@@ -156,17 +156,26 @@ class AgvScheduling(models.Model):
|
|||||||
if agv_site_state == '空闲':
|
if agv_site_state == '空闲':
|
||||||
# 查询终点接驳站为agv_site_id的AGV路线
|
# 查询终点接驳站为agv_site_id的AGV路线
|
||||||
task_routes = self.env['sf.agv.task.route'].sudo().search([('end_site_id', '=', agv_site_id)])
|
task_routes = self.env['sf.agv.task.route'].sudo().search([('end_site_id', '=', agv_site_id)])
|
||||||
agv_scheduling = self.env['sf.agv.scheduling'].sudo().search(
|
agv_schedulings = self.env['sf.agv.scheduling'].sudo().search(
|
||||||
[('state', '=', '待下发'), ('agv_route_type', 'in', task_routes.mapped('route_type'))],
|
[('state', '=', '待下发'), ('agv_route_type', 'in', task_routes.mapped('route_type'))],
|
||||||
order='id asc',
|
order='id asc',
|
||||||
limit=1
|
|
||||||
)
|
)
|
||||||
task_route = task_routes.filtered(
|
for agv_scheduling in agv_schedulings:
|
||||||
lambda r: r.start_site_id == agv_scheduling.start_site_id and r.start_site_id == agv_scheduling.start_site_id
|
# 找到所有起点接驳站匹配的路线
|
||||||
)
|
start_matched_task_routes = task_routes.filtered(
|
||||||
if task_route:
|
lambda r: r.start_site_id == agv_scheduling.start_site_id
|
||||||
# 下发AGV调度任务并修改接驳站状态为占用
|
)
|
||||||
agv_scheduling.dispatch_scheduling(task_route)
|
# 如果调度任务有终点接驳站,找到终点接驳站匹配的路线
|
||||||
|
if agv_scheduling.end_site_id:
|
||||||
|
matched_task_routes = start_matched_task_routes.filtered(
|
||||||
|
lambda r: r.end_site_id == agv_scheduling.end_site_id
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
matched_task_routes = start_matched_task_routes
|
||||||
|
if matched_task_routes:
|
||||||
|
# 下发AGV调度任务并修改接驳站状态为占用
|
||||||
|
agv_scheduling.dispatch_scheduling(matched_task_routes[0])
|
||||||
|
break;
|
||||||
|
|
||||||
def _delivery_avg(self):
|
def _delivery_avg(self):
|
||||||
config = self.env['res.config.settings'].get_values()
|
config = self.env['res.config.settings'].get_values()
|
||||||
|
|||||||
@@ -26,5 +26,13 @@
|
|||||||
<field name="name">坯料采购提醒</field>
|
<field name="name">坯料采购提醒</field>
|
||||||
<field name="model">purchase.order</field>
|
<field name="model">purchase.order</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record id="bussiness_material_picking_remind" model="jikimo.message.bussiness.node">
|
||||||
|
<field name="name">坯料发料提醒</field>
|
||||||
|
<field name="model">stock.picking</field>
|
||||||
|
</record>
|
||||||
|
<record id="bussiness_mrp_workorder_remind" model="jikimo.message.bussiness.node">
|
||||||
|
<field name="name">工单已下发通知</field>
|
||||||
|
<field name="model">mrp.workorder</field>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
@@ -9,10 +9,7 @@ class SFMessagefunctionalToolAssembly(models.Model):
|
|||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
result = super(SFMessagefunctionalToolAssembly, self).create(vals)
|
result = super(SFMessagefunctionalToolAssembly, self).create(vals)
|
||||||
is_cam = False
|
|
||||||
for obj in result:
|
for obj in result:
|
||||||
if obj.loading_task_source == '0' and obj.assemble_status == '0':
|
if obj.loading_task_source == '0' and obj.assemble_status == '0':
|
||||||
is_cam = True
|
obj.add_queue('功能刀具组装')
|
||||||
if is_cam:
|
|
||||||
self.add_queue('功能刀具组装')
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -9,10 +9,7 @@ class SFMessagefunctionalToolDismantle(models.Model):
|
|||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
result = super(SFMessagefunctionalToolDismantle, self).create(vals)
|
result = super(SFMessagefunctionalToolDismantle, self).create(vals)
|
||||||
is_dismantle = False
|
|
||||||
for obj in result:
|
for obj in result:
|
||||||
if obj.dismantle_cause in ['寿命到期报废', '崩刀报废']and obj.state=='待拆解':
|
if obj.dismantle_cause in ['寿命到期报废', '崩刀报废']and obj.state=='待拆解':
|
||||||
is_dismantle = True
|
obj.add_queue('功能刀具寿命到期')
|
||||||
if is_dismantle:
|
|
||||||
self.add_queue('功能刀具寿命到期')
|
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -28,12 +28,20 @@ class SFMessageSale(models.Model):
|
|||||||
# 继承并重写jikimo.message.dispatch的_get_message()
|
# 继承并重写jikimo.message.dispatch的_get_message()
|
||||||
def _get_message(self, message_queue_ids):
|
def _get_message(self, message_queue_ids):
|
||||||
res = super(SFMessageSale, self)._get_message(message_queue_ids)
|
res = super(SFMessageSale, self)._get_message(message_queue_ids)
|
||||||
if message_queue_ids.message_template_id.bussiness_node_id.name == '确认接单':
|
new_res = []
|
||||||
# sale_order = self.env['sale.order'].search([('id', '=', message_queue_ids.model.res_id)])
|
processed_messages = set() # 用于跟踪已经处理过的消息
|
||||||
sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(message_queue_ids.res_id))])
|
for item in message_queue_ids:
|
||||||
if len(sale_order_line) == 1:
|
if item.message_template_id.bussiness_node_id.name == '确认接单':
|
||||||
product = sale_order_line[0].product_id.name
|
sale_order_line = self.env['sale.order.line'].search([('order_id', '=', int(item.res_id))])
|
||||||
elif len(sale_order_line) > 1:
|
if len(sale_order_line) == 1:
|
||||||
product = '%s...' % sale_order_line[0].product_id.name
|
product = sale_order_line[0].product_id.name
|
||||||
res[0] = res[0].replace('{{product_id}}', product)
|
elif len(sale_order_line) > 1:
|
||||||
|
product = '%s...' % sale_order_line[0].product_id.name
|
||||||
|
for message in res:
|
||||||
|
message_text = message.replace('{{product_id}}', product)
|
||||||
|
if message_text not in processed_messages:
|
||||||
|
new_res.append(message_text)
|
||||||
|
processed_messages.add(message_text)
|
||||||
|
if new_res:
|
||||||
|
res = new_res
|
||||||
return res
|
return res
|
||||||
|
|||||||
@@ -1,13 +1,49 @@
|
|||||||
|
import re
|
||||||
from odoo import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
|
||||||
class SFMessageStockPicking(models.Model):
|
class SFMessageStockPicking(models.Model):
|
||||||
_name = 'stock.picking'
|
_name = 'stock.picking'
|
||||||
_description = "库存调拨"
|
_description = "库存调拨"
|
||||||
_inherit = ['stock.picking', 'jikimo.message.dispatch']
|
_inherit = ['stock.picking', 'jikimo.message.dispatch']
|
||||||
|
|
||||||
def button_validate(self):
|
def button_validate(self):
|
||||||
res = super(SFMessageStockPicking, self).button_validate()
|
res = super(SFMessageStockPicking, self).button_validate()
|
||||||
if self.location_id.name == '进货' and self.location_dest_id.name == '刀具房':
|
if self.location_id.name == 'Vendors' and self.location_dest_id.name == '进货':
|
||||||
self.add_queue('调拨入库')
|
self.add_queue('调拨入库')
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
@api.depends('move_type', 'immediate_transfer', 'move_ids.state', 'move_ids.picking_id')
|
||||||
|
def _compute_state(self):
|
||||||
|
super(SFMessageStockPicking, self)._compute_state()
|
||||||
|
for record in self:
|
||||||
|
if record.state == 'assigned' and record.check_in == 'PC':
|
||||||
|
record.add_queue('坯料发料提醒')
|
||||||
|
|
||||||
|
def _get_message(self, message_queue_ids):
|
||||||
|
contents = []
|
||||||
|
product_id = []
|
||||||
|
for message_queue_id in message_queue_ids:
|
||||||
|
i = 0
|
||||||
|
if message_queue_id.message_template_id.name == '坯料发料提醒':
|
||||||
|
content = message_queue_id.message_template_id.content
|
||||||
|
stock_picking_line = self.env['stock.picking'].search([('id', '=', int(message_queue_id.res_id))])
|
||||||
|
mrp_production_info = self.env['mrp.production'].search(
|
||||||
|
[('name', '=', stock_picking_line.origin)])
|
||||||
|
mrp_production_list = self.env['mrp.production'].search(
|
||||||
|
[('product_id', '=', mrp_production_info.product_id.id)])
|
||||||
|
for mrp_production_line in mrp_production_list:
|
||||||
|
picking_ids = mrp_production_line.picking_ids
|
||||||
|
for picking_id in picking_ids:
|
||||||
|
if picking_id.state == 'assigned' and picking_id.check_in == 'PC':
|
||||||
|
i += 1
|
||||||
|
if i > 0 and mrp_production_info.product_id.id not in product_id:
|
||||||
|
url = message_queue_id.message_template_id.get_url(int(message_queue_id.res_id))
|
||||||
|
content = content.replace('{{product_id}}', mrp_production_info.product_id.name).replace(
|
||||||
|
'{{number}}', str(i)).replace('{{request_url}}', url)
|
||||||
|
product_id.append(mrp_production_info.product_id.id)
|
||||||
|
contents.append(content)
|
||||||
|
else:
|
||||||
|
res = super(SFMessageStockPicking, self)._get_message(message_queue_id)
|
||||||
|
contents.append(res)
|
||||||
|
return contents
|
||||||
|
|||||||
@@ -13,4 +13,5 @@ class SfMessageTemplate(models.Model):
|
|||||||
res.append('sf.functional.tool.assembly')
|
res.append('sf.functional.tool.assembly')
|
||||||
res.append('sf.functional.tool.dismantle')
|
res.append('sf.functional.tool.dismantle')
|
||||||
res.append('purchase.order')
|
res.append('purchase.order')
|
||||||
|
res.append('mrp.workorder')
|
||||||
return res
|
return res
|
||||||
|
|||||||
@@ -3,4 +3,31 @@ from odoo import models, fields, api, _
|
|||||||
|
|
||||||
class SFMessageWork(models.Model):
|
class SFMessageWork(models.Model):
|
||||||
_name = 'mrp.workorder'
|
_name = 'mrp.workorder'
|
||||||
_inherit = ['mrp.workorder', 'jikimo.message.dispatch']
|
_inherit = ['mrp.workorder', 'jikimo.message.dispatch']
|
||||||
|
|
||||||
|
@api.depends('production_availability', 'blocked_by_workorder_ids.state')
|
||||||
|
def _compute_state(self):
|
||||||
|
super(SFMessageWork, self)._compute_state()
|
||||||
|
if self.state == 'ready' and self.routing_type == '装夹预调':
|
||||||
|
self.add_queue('工单已下发通知')
|
||||||
|
|
||||||
|
def _get_message(self, message_queue_ids):
|
||||||
|
contents = []
|
||||||
|
product_id = []
|
||||||
|
for message_queue_id in message_queue_ids:
|
||||||
|
if message_queue_id.message_template_id.name == '工单已下发通知':
|
||||||
|
content = message_queue_id.message_template_id.content
|
||||||
|
mrp_workorder_line = self.env['mrp.workorder'].search([('id', '=', int(message_queue_id.res_id))])
|
||||||
|
mrp_workorder_list = self.env['mrp.workorder'].search(
|
||||||
|
[('product_id', '=', mrp_workorder_line.product_id.id), ('state', '=', 'ready'),
|
||||||
|
('routing_type', '=', '装夹预调')])
|
||||||
|
if len(mrp_workorder_list) > 0 and mrp_workorder_line.product_id.id not in product_id:
|
||||||
|
url = message_queue_id.message_template_id.get_url(int(message_queue_id.res_id)) + "&active_id=1"
|
||||||
|
content = content.replace('{{product_id}}', mrp_workorder_line.product_id.name).replace(
|
||||||
|
'{{number}}', str(len(mrp_workorder_list))).replace(
|
||||||
|
'{{part_number}}',
|
||||||
|
mrp_workorder_line.part_number if mrp_workorder_line.part_number else "").replace(
|
||||||
|
'{{request_url}}', url)
|
||||||
|
product_id.append(mrp_workorder_line.product_id.id)
|
||||||
|
contents.append(content)
|
||||||
|
return contents
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ class ResConfigSettings(models.TransientModel):
|
|||||||
new_price = res_order_lines_map.get(str(index))
|
new_price = res_order_lines_map.get(str(index))
|
||||||
if order_line:
|
if order_line:
|
||||||
# 修改单价
|
# 修改单价
|
||||||
order_line.write({'remark': new_price*order_line.product_uom_qty})
|
order_line.write({'remark': round(new_price*order_line.product_uom_qty,2)})
|
||||||
order_price = self.env['order.price'].sudo().search([('sale_order_id', '=',need_change_sale_order.id )])
|
order_price = self.env['order.price'].sudo().search([('sale_order_id', '=',need_change_sale_order.id )])
|
||||||
if not order_price:
|
if not order_price:
|
||||||
self.env['order.price'].sudo().create({'sale_order_id':need_change_sale_order.id})
|
self.env['order.price'].sudo().create({'sale_order_id':need_change_sale_order.id})
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
access_sf_static_resource_datasync,sf_static_resource_datasync,model_sf_static_resource_datasync,base.group_user,1,1,1,1
|
access_sf_static_resource_datasync,sf_static_resource_datasync,model_sf_static_resource_datasync,base.group_user,1,1,1,1
|
||||||
|
|
||||||
access_order_price,order.price,model_order_price,base.group_user,1,1,1,1
|
access_order_price,order.price,model_order_price,sf_base.group_sale_director,1,1,1,1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
<menuitem sequence="22" name="销售订单bfm对比" id="menu_sale_order_bfm_price"
|
<menuitem sequence="22" name="销售订单bfm对比" id="menu_sale_order_bfm_price"
|
||||||
action="order_price_tree_act"
|
action="order_price_tree_act"
|
||||||
parent="sale.sale_order_menu"
|
parent="sale.sale_order_menu"
|
||||||
groups="base.group_user"
|
groups="sf_base.group_sale_director"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<record id="view_order_price_tree" model="ir.ui.view">
|
<record id="view_order_price_tree" model="ir.ui.view">
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
_description = 'CAM工单程序用刀计划'
|
_description = 'CAM工单程序用刀计划'
|
||||||
|
|
||||||
name = fields.Char('工单任务编号')
|
name = fields.Char('工单任务编号')
|
||||||
|
programming_no = fields.Char('编程单号')
|
||||||
cam_procedure_code = fields.Char('程序名')
|
cam_procedure_code = fields.Char('程序名')
|
||||||
filename = fields.Char('文件')
|
filename = fields.Char('文件')
|
||||||
cam_cutter_spacing_code = fields.Char('刀号')
|
cam_cutter_spacing_code = fields.Char('刀号')
|
||||||
@@ -317,23 +318,33 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
"""
|
"""
|
||||||
根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划
|
根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划
|
||||||
"""
|
"""
|
||||||
knife_plan = self.env['sf.cam.work.order.program.knife.plan'].sudo().create({
|
|
||||||
'name': cnc_processing.workorder_id.production_id.name,
|
# 获取编程单号
|
||||||
'cam_procedure_code': cnc_processing.program_name,
|
programming_no = cnc_processing.workorder_id.production_id.programming_no
|
||||||
'filename': cnc_processing.cnc_id.name,
|
logging.info(f'编程单号:{programming_no}')
|
||||||
'functional_tool_name': cnc_processing.cutting_tool_name,
|
cam_id = self.env['sf.cam.work.order.program.knife.plan'].sudo().search(
|
||||||
'cam_cutter_spacing_code': cnc_processing.cutting_tool_no,
|
[('programming_no', '=', programming_no),
|
||||||
'process_type': cnc_processing.processing_type,
|
('functional_tool_name', '=', cnc_processing.cutting_tool_name)])
|
||||||
'margin_x_y': float(cnc_processing.margin_x_y),
|
logging.info(f'CAM装刀计划:{cam_id}')
|
||||||
'margin_z': float(cnc_processing.margin_z),
|
if not cam_id:
|
||||||
'finish_depth': float(cnc_processing.depth_of_processing_z),
|
knife_plan = self.env['sf.cam.work.order.program.knife.plan'].sudo().create({
|
||||||
'extension_length': float(cnc_processing.cutting_tool_extension_length),
|
'name': cnc_processing.workorder_id.production_id.name,
|
||||||
'shank_model': cnc_processing.cutting_tool_handle_type,
|
'programming_no': programming_no,
|
||||||
'estimated_processing_time': cnc_processing.estimated_processing_time,
|
'cam_procedure_code': cnc_processing.program_name,
|
||||||
})
|
'filename': cnc_processing.cnc_id.name,
|
||||||
logging.info('CAM工单程序用刀计划创建成功!!!')
|
'functional_tool_name': cnc_processing.cutting_tool_name,
|
||||||
# 创建装刀请求
|
'cam_cutter_spacing_code': cnc_processing.cutting_tool_no,
|
||||||
knife_plan.apply_for_tooling()
|
'process_type': cnc_processing.processing_type,
|
||||||
|
'margin_x_y': float(cnc_processing.margin_x_y),
|
||||||
|
'margin_z': float(cnc_processing.margin_z),
|
||||||
|
'finish_depth': float(cnc_processing.depth_of_processing_z),
|
||||||
|
'extension_length': float(cnc_processing.cutting_tool_extension_length),
|
||||||
|
'shank_model': cnc_processing.cutting_tool_handle_type,
|
||||||
|
'estimated_processing_time': cnc_processing.estimated_processing_time,
|
||||||
|
})
|
||||||
|
logging.info('CAM工单程序用刀计划创建成功!!!')
|
||||||
|
# 创建装刀请求
|
||||||
|
knife_plan.apply_for_tooling()
|
||||||
|
|
||||||
def unlink_cam_plan(self, production):
|
def unlink_cam_plan(self, production):
|
||||||
for item in production:
|
for item in production:
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class jikimo_bom(models.Model):
|
|||||||
|
|
||||||
if option.name == '整体式刀具':
|
if option.name == '整体式刀具':
|
||||||
domain = ['&'] + domain + [
|
domain = ['&'] + domain + [
|
||||||
'|',
|
'&',
|
||||||
# 刀具直径
|
# 刀具直径
|
||||||
('cutting_tool_blade_diameter', '=', self.tool_inventory_id.diameter),
|
('cutting_tool_blade_diameter', '=', self.tool_inventory_id.diameter),
|
||||||
|
|
||||||
|
|||||||
@@ -283,21 +283,22 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree create="0">
|
<tree create="0">
|
||||||
<field name="name" string="工单编码"/>
|
<field name="name" string="工单编码"/>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="programming_no"/>
|
||||||
<field name="filename"/>
|
<field name="cam_procedure_code" optional="hide"/>
|
||||||
|
<field name="filename" optional="hide"/>
|
||||||
<field name="functional_tool_name" string="刀具名称"/>
|
<field name="functional_tool_name" string="刀具名称"/>
|
||||||
<field name="cam_cutter_spacing_code"/>
|
<field name="cam_cutter_spacing_code"/>
|
||||||
<field name="diameter" optional="hide"/>
|
<field name="diameter" optional="hide"/>
|
||||||
<field name="tool_included_angle" optional="hide"/>
|
<field name="tool_included_angle" optional="hide"/>
|
||||||
<field name="process_type"/>
|
<field name="process_type" optional="hide"/>
|
||||||
<field name="margin_x_y"/>
|
<field name="margin_x_y"/>
|
||||||
<field name="margin_z"/>
|
<field name="margin_z"/>
|
||||||
<field name="finish_depth"/>
|
<field name="finish_depth"/>
|
||||||
<field name="extension_length" string="刀具伸出长度(mm)"/>
|
<field name="extension_length" string="刀具伸出长度(mm)"/>
|
||||||
<field name="shank_model"/>
|
<field name="shank_model"/>
|
||||||
<field name="estimated_processing_time"/>
|
<field name="estimated_processing_time"/>
|
||||||
<field name="need_knife_time"/>
|
<field name="need_knife_time" optional="hide"/>
|
||||||
<field name="applicant_time"/>
|
<field name="applicant_time" optional="hide"/>
|
||||||
<field name="plan_execute_status"/>
|
<field name="plan_execute_status"/>
|
||||||
|
|
||||||
<field name="production_line_id" invisible="1"/>
|
<field name="production_line_id" invisible="1"/>
|
||||||
@@ -332,6 +333,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
|
<field name="programming_no"/>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="cam_procedure_code"/>
|
||||||
<field name="filename"/>
|
<field name="filename"/>
|
||||||
<field name="production_line_id"/>
|
<field name="production_line_id"/>
|
||||||
@@ -388,6 +390,7 @@
|
|||||||
<field name="model">sf.cam.work.order.program.knife.plan</field>
|
<field name="model">sf.cam.work.order.program.knife.plan</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search>
|
<search>
|
||||||
|
<field name="programming_no"/>
|
||||||
<field name="name" string="工单编码"/>
|
<field name="name" string="工单编码"/>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="cam_procedure_code"/>
|
||||||
<field name="filename"/>
|
<field name="filename"/>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<record id="view_tool_inventory_inherit_search" model="ir.ui.view">
|
<record id="view_tool_inventory_inherit_search" model="ir.ui.view">
|
||||||
<field name="name">sf.tool.inventory.inherit.search</field>
|
<field name="name">sf.tool.inventory.inherit.search</field>
|
||||||
<field name="model">sf.tool.inventory</field>
|
<field name="model">sf.tool.inventory</field>
|
||||||
<field name="inherit_id" ref="sf_base.view_cutting_tool_material_search"/>
|
<field name="inherit_id" ref="sf_base.view_cutting_tool_inventory_search"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='extension']" position="after">
|
<xpath expr="//field[@name='extension']" position="after">
|
||||||
<searchpanel>
|
<searchpanel>
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Cybrosys Technologies Pvt. Ltd.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2022-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/>.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
from .hooks import test_pre_init_hook, test_post_init_hook
|
|
||||||
from . import wizard
|
|
||||||
from . import models
|
|
||||||
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Cybrosys Technologies Pvt. Ltd.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2022-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/>.
|
|
||||||
#
|
|
||||||
#############################################################################
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "Vista Backend Theme V16",
|
|
||||||
"description": """Minimalist and elegant backend theme for Odoo 16, Backend Theme, Theme""",
|
|
||||||
"summary": "Vista Backend Theme V16 is an attractive theme for backend",
|
|
||||||
"category": "Themes/Backend",
|
|
||||||
"version": "16.0.1.0.0",
|
|
||||||
'author': 'Cybrosys Techno Solutions',
|
|
||||||
'company': 'Cybrosys Techno Solutions',
|
|
||||||
'maintainer': 'Cybrosys Techno Solutions',
|
|
||||||
'website': "https://www.cybrosys.com",
|
|
||||||
"depends": ['base', 'web', 'mail', 'base_setup'],
|
|
||||||
"data": [
|
|
||||||
'security/ir.model.access.csv',
|
|
||||||
'views/icons.xml',
|
|
||||||
'views/layout.xml',
|
|
||||||
'views/theme.xml',
|
|
||||||
'views/assets.xml',
|
|
||||||
'data/theme_data.xml',
|
|
||||||
'views/res_config.xml',
|
|
||||||
],
|
|
||||||
'assets': {
|
|
||||||
'web.assets_backend': {
|
|
||||||
'/vista_backend_theme/static/src/scss/theme.scss',
|
|
||||||
'/vista_backend_theme/static/src/js/systray.js',
|
|
||||||
'/vista_backend_theme/static/src/js/load.js',
|
|
||||||
'/vista_backend_theme/static/src/js/chrome/sidebar_menu.js',
|
|
||||||
'/vista_backend_theme/static/src/xml/systray.xml',
|
|
||||||
'/vista_backend_theme/static/src/xml/top_bar.xml',
|
|
||||||
'/vista_backend_theme/static/src/js/web_window_title.js',
|
|
||||||
},
|
|
||||||
'web.assets_frontend': {
|
|
||||||
'/vista_backend_theme/static/src/scss/login.scss',
|
|
||||||
'/vista_backend_theme/static/src/scss/login.scss',
|
|
||||||
|
|
||||||
},
|
|
||||||
},
|
|
||||||
'images': [
|
|
||||||
'static/description/banner.png',
|
|
||||||
'static/description/theme_screenshot.png',
|
|
||||||
'static/description/main_screenshot.png',
|
|
||||||
],
|
|
||||||
'license': 'LGPL-3',
|
|
||||||
'pre_init_hook': 'test_pre_init_hook',
|
|
||||||
'post_init_hook': 'test_post_init_hook',
|
|
||||||
'installable': True,
|
|
||||||
'application': False,
|
|
||||||
'auto_install': False,
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<openerp>
|
|
||||||
<data noupdate="1">
|
|
||||||
|
|
||||||
<record id="config_parameter_web_base_title_demo" model="ir.config_parameter">
|
|
||||||
<field name="key">web.base.title</field>
|
|
||||||
<field name="value">Demo</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</data>
|
|
||||||
</openerp>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
<data noupdate="1">
|
|
||||||
<record id="theme_data_stored" model="theme.data.stored">
|
|
||||||
<field name="name">default</field>
|
|
||||||
</record>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
#############################################################################
|
|
||||||
#
|
|
||||||
# Cybrosys Technologies Pvt. Ltd.
|
|
||||||
#
|
|
||||||
# Copyright (C) 2022-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 base64
|
|
||||||
|
|
||||||
from odoo import api, SUPERUSER_ID
|
|
||||||
from odoo.modules import get_module_resource
|
|
||||||
|
|
||||||
|
|
||||||
def test_pre_init_hook(cr):
|
|
||||||
"""pre init hook"""
|
|
||||||
|
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
||||||
menu_item = env['ir.ui.menu'].search([('parent_id', '=', False)])
|
|
||||||
|
|
||||||
for menu in menu_item:
|
|
||||||
if menu.name == 'Contacts':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'contacts.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Link Tracker':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'link-tracker.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Dashboards':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'dashboards.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Sales':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'sales.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Invoicing':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'accounting.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Inventory':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'inventory.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Purchase':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'purchase.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Calendar':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'calendar.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'CRM':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'crm.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Note':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'note.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Website':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'website.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Point of Sale':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'pos.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Manufacturing':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'manufacturing.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Repairs':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'repairs.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Email Marketing':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'email-marketing.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'SMS Marketing':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'sms-marketing.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Project':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'project.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Surveys':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'surveys.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Employees':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'employee.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Recruitment':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'recruitment.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Attendances':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'attendances.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Time Off':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'timeoff.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Expenses':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'expenses.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Maintenance':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'maintenance.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Live Chat':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'live-chat.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Lunch':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'lunch.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Fleet':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'fleet.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Timesheets':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'timesheets.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Events':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'events.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'eLearning':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'elearning.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
if menu.name == 'Members':
|
|
||||||
img_path = get_module_resource(
|
|
||||||
'vista_backend_theme', 'static', 'src', 'img', 'icons', 'members.png')
|
|
||||||
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
|
|
||||||
|
|
||||||
|
|
||||||
def test_post_init_hook(cr, registry):
|
|
||||||
"""post init hook"""
|
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
from . import ir_ui_view
|
|
||||||
from . import res_config
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from odoo import api, fields, models, _
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class View(models.Model):
|
|
||||||
_inherit = 'ir.ui.view'
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def _render_template(self, template, values=None):
|
|
||||||
if template in ['web.login', 'web.webclient_bootstrap']:
|
|
||||||
if not values:
|
|
||||||
values = {}
|
|
||||||
values["title"] = self.env['ir.config_parameter'].sudo().get_param("web.base.title", "")
|
|
||||||
return super(View, self)._render_template(template, values)
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from odoo import api, fields, models, _
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
CONFIG_PARAM_WEB_WINDOW_TITLE = "web.base.title"
|
|
||||||
|
|
||||||
class ResConfigSettings(models.TransientModel):
|
|
||||||
_inherit = 'res.config.settings'
|
|
||||||
|
|
||||||
web_window_title = fields.Char('Window Title')
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def get_values(self):
|
|
||||||
res = super(ResConfigSettings, self).get_values()
|
|
||||||
ir_config = self.env['ir.config_parameter'].sudo()
|
|
||||||
web_window_title = ir_config.get_param(CONFIG_PARAM_WEB_WINDOW_TITLE, default='')
|
|
||||||
res.update(
|
|
||||||
web_window_title=web_window_title
|
|
||||||
)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def set_values(self):
|
|
||||||
super(ResConfigSettings, self).set_values()
|
|
||||||
ir_config = self.env['ir.config_parameter'].sudo()
|
|
||||||
ir_config.set_param(CONFIG_PARAM_WEB_WINDOW_TITLE, self.web_window_title or "")
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
|
||||||
access_theme_data,access.theme.data,model_theme_data,,1,1,1,1
|
|
||||||
|
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 576 B |
|
Before Width: | Height: | Size: 733 B |
|
Before Width: | Height: | Size: 911 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 673 B |
|
Before Width: | Height: | Size: 878 B |
|
Before Width: | Height: | Size: 653 B |
|
Before Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 839 B |
|
Before Width: | Height: | Size: 427 B |
|
Before Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 988 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 333 KiB |
|
Before Width: | Height: | Size: 261 KiB |
|
Before Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 886 KiB |
|
Before Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 334 KiB |
|
Before Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 350 KiB |
@@ -1,444 +0,0 @@
|
|||||||
<!-- HERO SECTION -->
|
|
||||||
<div class="contianer">
|
|
||||||
<div class="row position-relative"
|
|
||||||
style="background-color: #2f3542 !important; height: 400px; margin-bottom: 6rem; border-radius: 1rem !important;">
|
|
||||||
<div class="col-lg-12 d-flex flex-column justify-content-start align-items-center">
|
|
||||||
<h1 class="display-1 text-white" style="padding-top: 5rem;">Vista Backend Theme V16</h1>
|
|
||||||
<p class="text-light small font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase;">Multi-Color
|
|
||||||
& Multi-Design Backend Theme for
|
|
||||||
Odoo 16</p>
|
|
||||||
</div>
|
|
||||||
<img src="./images/hero.gif" class="img img-fluid"
|
|
||||||
style="height: auto; width: 525px; top: 45%; left: 0; right: 0; margin-left: auto; margin-right: auto;"
|
|
||||||
height="auto" width="525px">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF HERO SECTION -->
|
|
||||||
<!-- SHORT DESCRIPTION -->
|
|
||||||
<div class="container">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-12 d-flex justify-content-center align-items-center">
|
|
||||||
<h6 class="text-muted text-center w-50" style="line-height: 22px;">The app enables a user friendly backend
|
|
||||||
theme for Odoo 16.0 community edition.</h6>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF SHORT DESCRIPTION -->
|
|
||||||
<!-- FEATURE ICONS -->
|
|
||||||
<div class="container w-50" style="margin: 3rem auto;">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-4 my-2 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<div
|
|
||||||
style="height: 100px; width: 100px; border: 8px solid #eaebec; border-radius: 50%; background-color: #e0e1e3; box-shadow: 0px 0px 0px 8px #f3f3f4;"
|
|
||||||
class="d-flex justify-content-center align-items-center">
|
|
||||||
<img height="60px" src="./images/icons/design.png">
|
|
||||||
</div>
|
|
||||||
<h6 class="my-4 text-center">Carefully Crafted</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 my-2 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<div
|
|
||||||
style="height: 100px; width: 100px; border: 8px solid #eaebec; border-radius: 50%; background-color: #e0e1e3; box-shadow: 0px 0px 0px 8px #f3f3f4;"
|
|
||||||
class="d-flex justify-content-center align-items-center">
|
|
||||||
<img height="60px" src="./images/icons/responsive.png">
|
|
||||||
</div>
|
|
||||||
<h6 class="my-4 text-center">Responsive Design</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 my-2 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<div
|
|
||||||
style="height: 100px; width: 100px; border: 8px solid #eaebec; border-radius: 50%; background-color: #e0e1e3; box-shadow: 0px 0px 0px 8px #f3f3f4;"
|
|
||||||
class="d-flex justify-content-center align-items-center">
|
|
||||||
<img height="60px" src="./images/icons/quality.png">
|
|
||||||
</div>
|
|
||||||
<h6 class="my-4 text-center">Quality Checked</h6>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF FEATURE ICONS -->
|
|
||||||
|
|
||||||
<!-- ONE COLUMN SECTION-->
|
|
||||||
<div class="container" style="margin: 3rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<h2 class="text-center mt-3 display-4 text-weight-bold">Kanban View</h2>
|
|
||||||
<p class="text-center lead text-muted mb-4">Kanban view with a clean layout and modified font.</p>
|
|
||||||
<img height="600px" width="auto" src="./images/kanban.png" class="img img-fluid deep-4 rounded">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF ONE COLUMN SECTION-->
|
|
||||||
|
|
||||||
<!-- TWO COLUMN SECTION-->
|
|
||||||
<div class="container" style="margin: 6rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-6 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Custom
|
|
||||||
Login</span>
|
|
||||||
<h2 class="mt-3">Minimal, Colorful Login Screen</h2>
|
|
||||||
<p class="lead text-muted mb-4">Customized minimal and colorful login screen.</p>
|
|
||||||
<img src="./images/login.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Colored UI
|
|
||||||
Elements</span>
|
|
||||||
<h2 class="mt-3">Discuss</h2>
|
|
||||||
<p class="lead text-muted mb-4">Discuss page with a different style.</p>
|
|
||||||
<img src="./images/discuss.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF TWO COLUMN SECTION-->
|
|
||||||
|
|
||||||
<!-- RESPONSIVE SECTION-->
|
|
||||||
<div class="container" style="margin: 6rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-5 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<img src="./images/responsive.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 d-flex flex-column justify-content-center">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Responsive
|
|
||||||
Layout</span>
|
|
||||||
<h2 class="mt-3">Truly Responsive</h2>
|
|
||||||
<p class="lead text-muted mb-4">Fully responsive layout which enables to view and manage everything from the
|
|
||||||
comfort of your mobile device.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- END OF RESPONSIVE SECTION-->
|
|
||||||
|
|
||||||
<!-- RESPONSIVE SECTION-->
|
|
||||||
<div class="container" style="margin: 6rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-7 d-flex flex-column justify-content-center">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Responsive
|
|
||||||
Layout</span>
|
|
||||||
<h2 class="mt-3">Modified App Drawer</h2>
|
|
||||||
<p class="lead text-muted mb-4">Modified app drawer which helps to navigate through different applications.</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-5 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<img src="./images/app_drawer.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF RESPONSIVE SECTION-->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- RESPONSIVE SECTION-->
|
|
||||||
<div class="container" style="margin: 6rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-5 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<img src="./images/custom_date.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-7 d-flex flex-column justify-content-center">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Colored UI
|
|
||||||
Elements</span>
|
|
||||||
<h2 class="mt-3">Custom Date Picker</h2>
|
|
||||||
<p class="lead text-muted mb-4">Customized date picker</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF RESPONSIVE SECTION-->
|
|
||||||
|
|
||||||
<!-- TWO COLUMN SECTION-->
|
|
||||||
<div class="container" style="margin: 6rem auto;">
|
|
||||||
<div class="row my-4">
|
|
||||||
<div class="col-lg-6 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Colored UI
|
|
||||||
Elements</span>
|
|
||||||
<h2 class="mt-3">Tree View</h2>
|
|
||||||
<p class="lead text-muted mb-4">Tree view with a clean layout and modified font.</p>
|
|
||||||
<img src="./images/tree_view.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 d-flex flex-column justify-content-center align-items-start">
|
|
||||||
<span class="font-weight-bold" style="letter-spacing: 2px; text-transform: uppercase; color: #444955">Colored UI
|
|
||||||
Elements</span>
|
|
||||||
<h2 class="mt-3">Form View</h2>
|
|
||||||
<p class="lead text-muted mb-4">Form view with a clean layout and modified font.</p>
|
|
||||||
<img src="./images/form_view.png" class="img img-fluid deep-2 rounded">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF TWO COLUMN SECTION-->
|
|
||||||
|
|
||||||
<!-- OUR SERVICES -->
|
|
||||||
<section class="container" style="margin-top: 6rem !important;">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<h2 class="text-center"
|
|
||||||
style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;">
|
|
||||||
Our Services</h2>
|
|
||||||
<p class="text-center"
|
|
||||||
style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;">
|
|
||||||
We provide following services</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Customization</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Implementation</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Support</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Hire
|
|
||||||
Odoo
|
|
||||||
Developer</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Integration</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Migration</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Consultancy</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Implementation</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">Odoo
|
|
||||||
Licensing Consultancy</h6>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
<!-- END OF END OF OUR SERVICES -->
|
|
||||||
|
|
||||||
<!-- OUR INDUSTRIES -->
|
|
||||||
<section class="container" style="margin-top: 6rem !important;">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<h2 class="text-center"
|
|
||||||
style="font-family: Montserrat, 'sans-serif'; color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;">
|
|
||||||
Our Industries</h2>
|
|
||||||
<p class="text-center"
|
|
||||||
style="font-family: Montserrat, 'sans-serif'; color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;">
|
|
||||||
Our industry specifics and process segments to solve your complex business barriers.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Trading
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Easily procure
|
|
||||||
and
|
|
||||||
sell your products</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
POS
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Easy
|
|
||||||
configuration
|
|
||||||
and convivial experience</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Education
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">A platform for
|
|
||||||
educational management</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Manufacturing
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Plan, track and
|
|
||||||
schedule your operations</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
E-commerce & Website
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Mobile
|
|
||||||
friendly,
|
|
||||||
awe-inspiring product pages</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Service Management
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Keep track of
|
|
||||||
services and invoice</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Restaurant
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">Run your bar or
|
|
||||||
restaurant methodically</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="color: #000 !important; font-weight: bold;">
|
|
||||||
Hotel Management
|
|
||||||
</h5>
|
|
||||||
<p style="font-size: 0.9rem !important;">An
|
|
||||||
all-inclusive
|
|
||||||
hotel management application</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- END OF END OF OUR INDUSTRIES -->
|
|
||||||
|
|
||||||
<!-- FOOTER -->
|
|
||||||
<!-- Footer Section -->
|
|
||||||
<section class="container" style="margin: 5rem auto 2rem;">
|
|
||||||
<div class="row" style="max-width:1540px;">
|
|
||||||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
|
|
||||||
<h2 class="text-center"
|
|
||||||
style="color: #000 !important; font-weight: 800 !important; font-size: 2rem !important; width: 80%;">
|
|
||||||
Need Help?</h2>
|
|
||||||
<p class="text-center"
|
|
||||||
style="color: #1a1a1a !important; font-weight: 300 !important; font-size: 1.3rem !important;">
|
|
||||||
Do you have any queries regarding our products & services? Let us know.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Contact Cards -->
|
|
||||||
<div class="row d-flex justify-content-center align-items-center" style="max-width:1540px; margin: 0 auto 2rem auto;">
|
|
||||||
|
|
||||||
<div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; ">
|
|
||||||
|
|
||||||
<div class="row mt-4">
|
|
||||||
<div class="col-lg-4">
|
|
||||||
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover"
|
|
||||||
style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;"><i
|
|
||||||
class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-4">
|
|
||||||
<a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank"
|
|
||||||
class="btn btn-block mb-2 deep_hover"
|
|
||||||
style="text-decoration: none; background-color: #25D366; color: #FFF; border-radius: 4px;"><i
|
|
||||||
class="fa fa-whatsapp mr-2"></i>WhatsApp</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-4">
|
|
||||||
<a href="skype:cybrosystechnologies?chat" target="_blank" class="btn btn-block deep_hover"
|
|
||||||
style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;"><i
|
|
||||||
class="fa fa-envelope mr-2"></i>cybrosystechnologies</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- End of Contact Cards -->
|
|
||||||
</section>
|
|
||||||
<!-- Footer -->
|
|
||||||
<section class="oe_container" style="padding: 2rem 3rem 1rem;">
|
|
||||||
<div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
|
|
||||||
<!-- Logo -->
|
|
||||||
<div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;">
|
|
||||||
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" />
|
|
||||||
</div>
|
|
||||||
<!-- End of Logo -->
|
|
||||||
<div class="col-lg-12">
|
|
||||||
<hr
|
|
||||||
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
|
|
||||||
<!-- End of Footer Section -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- END OF FOOTER -->
|
|
||||||
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 311 KiB |
|
Before Width: | Height: | Size: 899 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 527 B |
|
Before Width: | Height: | Size: 591 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 523 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 694 B |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 854 B |
|
Before Width: | Height: | Size: 649 B |
|
Before Width: | Height: | Size: 975 B |
|
Before Width: | Height: | Size: 707 B |
|
Before Width: | Height: | Size: 809 B |
|
Before Width: | Height: | Size: 792 B |
|
Before Width: | Height: | Size: 1.1 KiB |