Browse Source

Jul 25 : [UPDT] Updated 'product_combo_pack'

pull/267/head
AjmalCybro 2 years ago
parent
commit
2b36fd5a38
  1. 20
      product_combo_pack/README.rst
  2. 10
      product_combo_pack/__init__.py
  3. 19
      product_combo_pack/__manifest__.py
  4. 9
      product_combo_pack/doc/RELEASE_NOTES.md
  5. 11
      product_combo_pack/models/__init__.py
  6. 50
      product_combo_pack/models/pack_products.py
  7. 89
      product_combo_pack/models/product_template.py
  8. 31
      product_combo_pack/models/sale_order.py
  9. 3
      product_combo_pack/security/ir.model.access.csv
  10. BIN
      product_combo_pack/static/description/assets/screenshots/1.png
  11. BIN
      product_combo_pack/static/description/assets/screenshots/2.png
  12. BIN
      product_combo_pack/static/description/assets/screenshots/3.png
  13. BIN
      product_combo_pack/static/description/assets/screenshots/4.png
  14. BIN
      product_combo_pack/static/description/assets/screenshots/5.png
  15. BIN
      product_combo_pack/static/description/assets/screenshots/6.png
  16. BIN
      product_combo_pack/static/description/assets/screenshots/7.png
  17. BIN
      product_combo_pack/static/description/assets/screenshots/hero.gif
  18. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-1.png
  19. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-10.png
  20. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-11.png
  21. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-12.png
  22. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-13.png
  23. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-14.png
  24. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-2.png
  25. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-3.png
  26. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-4.png
  27. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-5.png
  28. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-6.png
  29. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-7.png
  30. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-8.png
  31. BIN
      product_combo_pack/static/description/assets/screenshots/screenshot-9.png
  32. 507
      product_combo_pack/static/description/index.html
  33. 103
      product_combo_pack/views/product_form_view.xml
  34. 119
      product_combo_pack/views/product_form_views.xml
  35. 15
      product_combo_pack/views/sale_order_view.xml
  36. 16
      product_combo_pack/views/sale_order_views.xml
  37. 24
      product_combo_pack/wizard/__init__.py
  38. 58
      product_combo_pack/wizard/select_product_pack.py
  39. 32
      product_combo_pack/wizard/select_product_pack_view.xml

20
product_combo_pack/README.rst

@ -1,29 +1,34 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Product Pack Product Pack
============ ============
* Create product pack which is a great way to raise average sales price per product, to serve customers with products that make their lives easier, and to leverage current products into new and different ones. * Create product pack which is a great way to raise average sales price per product, to serve customers with products that make their lives easier, and to leverage current products into new and different ones.
Installation Installation
============ ============
- www.odoo.com/documentation/16.0/setup/install.html - www.odoo.com/documentation/13.0/setup/install.html
- Install our custom addon - Install our custom addon
License License
======= =======
GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3)
(http://www.gnu.org/licenses/agpl.html) (https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company Company
------- -------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__ * `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits Credits
------- -------
* Developer: * Developer: Jumana jabin MP @ Cybrosys,
Afras @ Cybrosys, Contact: afras@cybrosys.in * Contact: odoo@cybrosys.com
Contacts Contacts
-------- --------
* Mail Contact : odoo@cybrosys.com * Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker Bug Tracker
----------- -----------
@ -31,11 +36,12 @@ Bugs are tracked on GitHub Issues. In case of trouble, please check there if you
Maintainer Maintainer
========== ==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies. This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com For support and more information, please visit https://www.cybrosys.com
Further information Further information
=================== ===================
HTML Description: `<static/description/index.html>`__ HTML Description: `<static/description/index.html>`__

10
product_combo_pack/__init__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana Jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,7 +19,5 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
from . import models from . import models
from . import wizard

19
product_combo_pack/__manifest__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,11 +19,10 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
{ {
'name': 'Product Pack', 'name': 'Product Pack',
'version': '16.0.1.0.2', 'version': '16.0.1.0.3',
'summary': 'Manage Products as Pack', 'summary': 'Manage Products as Pack',
'description': 'Manage Products as Pack', 'description': 'Manage Products as Pack',
'category': 'Sales', 'category': 'Sales',
@ -34,12 +33,12 @@
'depends': ['base', 'sale_management', 'stock'], 'depends': ['base', 'sale_management', 'stock'],
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'views/product_form_view.xml', 'views/product_form_views.xml',
'wizard/select_product_pack_view.xml', 'views/sale_order_views.xml',
'views/sale_order_view.xml',
], ],
'images': ['static/description/banner.png'], 'images': ['static/description/banner.png'],
'installable': True,
'license': 'AGPL-3', 'license': 'AGPL-3',
'installable': True,
'auto_install': False, 'auto_install': False,
'application': True,
} }

9
product_combo_pack/doc/RELEASE_NOTES.md

@ -1,10 +1,5 @@
## Module <product_combo_pack> ## Module <product_combo_pack>
#### 23.08.2022 #### 14.07.2023
#### Version 16.0.1.0.0 #### Version 16.0.1.0.0
Initial Commit for product_combo_pack - Initial Commit for Product Pack
#### 01.12.2022
#### Version 16.0.1.0.1
#### UPDT
- Product pack duplication issue

11
product_combo_pack/models/__init__.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana Jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,8 +19,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
from . import product_form
from . import pack_products from . import pack_products
from . import product_template
from . import sale_order from . import sale_order

50
product_combo_pack/models/pack_products.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana Jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,33 +19,46 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError from odoo.exceptions import ValidationError
class PackProducts(models.Model): class PackProducts(models.Model):
"""Model for selecting pack products.This model allows users to select
and manage pack products. """
_name = 'pack.products' _name = 'pack.products'
_rec_name = 'product_tmpl_id' _rec_name = 'product_tmpl_id'
_description = 'Select Pack Products' _description = 'Select Pack Products'
product_id = fields.Many2one('product.product', string='Product', required=True, product_id = fields.Many2one('product.product', string='Product',
domain=[('is_pack', '=', False)]) required=True,
product_tmpl_id = fields.Many2one('product.template', string='Product') domain=[('is_pack', '=', False)],
price = fields.Float('Price', compute='compute_price', store=True) help='The specific product being referenced.')
quantity = fields.Integer('Quantity', default=1) product_tmpl_id = fields.Many2one('product.template', string='Product',
qty_available = fields.Float('Quantity Available', compute='compute_quantity_of_product', store=True, help='The template of the product.')
readonly=False) price = fields.Float('Price', compute='compute_price', store=True,
total_available_quantity = fields.Float('Total Quantity') help='The calculated price of the product.')
quantity = fields.Integer('Quantity', default=1,
help='The quantity of the product.')
qty_available = fields.Float('Quantity Available',
compute='compute_quantity_of_product',
store=True, readonly=False,
help='The available quantity of the product.')
total_available_quantity = fields.Float('Total Quantity',
help='The total available quantity.')
@api.depends('product_id', 'total_available_quantity', 'product_id.qty_available') @api.depends('product_id', 'total_available_quantity',
'product_id.qty_available')
def compute_quantity_of_product(self): def compute_quantity_of_product(self):
"""Compute the available quantity for each record based on the
product and location. """
for record in self: for record in self:
location_id = record.product_tmpl_id.pack_location_id location_id = record.product_tmpl_id.pack_location_id
if location_id: if location_id:
stock_quant = self.env['stock.quant'].search( stock_quant = self.env['stock.quant'].search(
[('product_id', '=', record.product_id.id), ('location_id', '=', location_id.id)]) [('product_id', '=', record.product_id.id),
('location_id', '=', location_id.id)])
if stock_quant: if stock_quant:
record.qty_available = stock_quant.quantity record.qty_available = stock_quant.quantity
else: else:
@ -55,14 +68,19 @@ class PackProducts(models.Model):
@api.depends('product_id', 'quantity') @api.depends('product_id', 'quantity')
def compute_price(self): def compute_price(self):
""" Compute the price for each record based on the product and quantity.
"""
for record in self: for record in self:
record.price = record.product_id.lst_price * record.quantity record.price = record.product_id.lst_price * record.quantity
@api.onchange('quantity') @api.onchange('quantity')
def set_price(self): def set_price(self):
""" Update the price field when the quantity changes."""
self.price = self.product_id.lst_price * self.quantity self.price = self.product_id.lst_price * self.quantity
@api.constrains('quantity') @api.constrains('quantity')
def _check_positive_qty(self): def _check_positive_qty(self):
"""Ensure that the quantity is always positive.Raises a validation
error if any of the records have a negative quantity."""
if any([ml.quantity < 0 for ml in self]): if any([ml.quantity < 0 for ml in self]):
raise ValidationError(_('You can not enter negative quantities.')) raise ValidationError(_('You can not enter negative quantities.'))

89
product_combo_pack/models/product_form.py → product_combo_pack/models/product_template.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,31 +19,46 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
from odoo import api, fields, models, _ from odoo import api, fields, models, _
from odoo.exceptions import UserError from odoo.exceptions import UserError
class ProductPack(models.Model): class ProductPack(models.Model):
"""Model for extending the product template to include
pack-related fields."""
_inherit = 'product.template' _inherit = 'product.template'
def default_pack_location(self): def default_pack_location(self):
""" Get the default pack location for the current company."""
company_user = self.env.company company_user = self.env.company
warehouse = self.env['stock.warehouse'].search([('company_id', '=', company_user.id)], limit=1) warehouse = self.env['stock.warehouse'].search([(
'company_id', '=', company_user.id)], limit=1)
if warehouse: if warehouse:
return warehouse.lot_stock_id.id return warehouse.lot_stock_id.id
is_pack = fields.Boolean('Is a Pack') is_pack = fields.Boolean('Is a Pack', help='Indicates whether the'
pack_price = fields.Integer(string="Pack Price", compute='set_pack_price', store=True) ' product is a pack or not.')
pack_products_ids = fields.One2many('pack.products', 'product_tmpl_id', string='Pack Products', copy=True) pack_price = fields.Integer(string="Pack Price", compute='set_pack_price',
pack_quantity = fields.Integer('Pack Quantity') store=True,
help='The calculated price of the pack.')
pack_products_ids = fields.One2many('pack.products', 'product_tmpl_id',
string='Pack Products', copy=True,
help='The list of products included '
'in the pack.')
pack_quantity = fields.Integer('Pack Quantity',
help='The quantity of the product'
' in the pack.')
pack_location_id = fields.Many2one('stock.location', pack_location_id = fields.Many2one('stock.location',
domain=[('usage', 'in', ['internal', 'transit'])], domain=[('usage', 'in',
default=default_pack_location) ['internal', 'transit'])],
default=default_pack_location,
string='Pack Location',
help='The default location for the pack.')
@api.depends('pack_products_ids', 'pack_products_ids.price') @api.depends('pack_products_ids', 'pack_products_ids.price')
def set_pack_price(self): def set_pack_price(self):
"""Compute the pack price based on the prices of the pack products."""
price = 0 price = 0
for record in self: for record in self:
for line in record.pack_products_ids: for line in record.pack_products_ids:
@ -52,30 +67,39 @@ class ProductPack(models.Model):
@api.model @api.model
def create(self, values): def create(self, values):
"""Override the create method to add validation for pack products."""
if values.get('is_pack', False): if values.get('is_pack', False):
if not values.get('pack_products_ids', []): if not values.get('pack_products_ids', []):
raise UserError(_( raise UserError(_(
'You need to add atleast one product in the Pack...!')) 'You need to add atleast one product in the Pack...!'))
if values.get('type', False) == 'service': if values.get('type', False) == 'service':
raise UserError(_('You cannot define a pack product as a service..!')) raise UserError(
_('You cannot define a pack product as a service..!'))
return super(ProductPack, self).create(values) return super(ProductPack, self).create(values)
def write(self, values): def write(self, values):
"""Override the write method to add validation for pack products."""
super(ProductPack, self).write(values) super(ProductPack, self).write(values)
if self.is_pack: for rec in self:
if not self.pack_products_ids: if rec.is_pack:
raise UserError(_( if not rec.pack_products_ids:
'You need to add atleast one product in the Pack...!')) raise UserError(_(
if self.type == 'service': 'You need to add at least one product in the Pack...!'))
raise UserError(_('You cannot define a pack product as a service..!')) if rec.type == 'service':
raise UserError(
_('You cannot define a pack product as a service..!'))
def update_price_product(self): def update_price_product(self):
"""Update the list price of the product with the pack price."""
self.list_price = self.pack_price self.list_price = self.pack_price
def get_quantity(self): def get_quantity(self):
"""Calculate the pack quantity based on the availability of
pack products."""
total_quantity = 1 total_quantity = 1
flag = 1 flag = 1
while flag: max_iterations = 1000
while flag and total_quantity < max_iterations:
for line in self.pack_products_ids: for line in self.pack_products_ids:
if line.qty_available >= line.quantity * total_quantity: if line.qty_available >= line.quantity * total_quantity:
continue continue
@ -85,30 +109,37 @@ class ProductPack(models.Model):
flag = 0 flag = 0
break break
if flag: if flag:
total_quantity = total_quantity + 1 total_quantity += 1
self.pack_quantity = total_quantity - 1 self.pack_quantity = total_quantity - 1
def update_quantity(self): def update_quantity(self):
"""Update the pack quantity in the specified pack location."""
company_user = self.env.company company_user = self.env.company
product_id = len(self.product_variant_ids) == 1 and self.product_variant_id.id product_id = len(
self.product_variant_ids) == 1 and self.product_variant_id.id
location_id = self.pack_location_id.id location_id = self.pack_location_id.id
if not location_id: if not location_id:
warehouse = self.env['stock.warehouse'].search([('company_id', '=', company_user.id)], limit=1) warehouse = self.env['stock.warehouse'].search([(
'company_id', '=', company_user.id)], limit=1)
location_id = warehouse.lot_stock_id.id location_id = warehouse.lot_stock_id.id
if not location_id: if not location_id:
raise UserError(_( raise UserError(_(
'You need to select the location to update the pack quantity...!')) 'You need to select the location to update the pack quantity...!'))
self.env['stock.quant'].with_context(inventory_mode=True).sudo().create({ self.env['stock.quant'].with_context(inventory_mode=True).sudo().create(
'product_id': product_id, {
'location_id': location_id, 'product_id': product_id,
'inventory_quantity': self.pack_quantity, 'location_id': location_id,
}) 'inventory_quantity': self.pack_quantity,
})
@api.onchange('pack_location_id') @api.onchange('pack_location_id')
def change_quantity_based_on_location(self): def change_quantity_based_on_location(self):
"""Update the total available quantity of pack products based
on the selected pack location."""
for line in self.pack_products_ids: for line in self.pack_products_ids:
stock_quant = self.env['stock.quant'].search( stock_quant = self.env['stock.quant'].search(
[('product_id', '=', line.product_id.id), ('location_id', '=', self.pack_location_id.id)]) [('product_id', '=', line.product_id.id), (
'location_id', '=', self.pack_location_id.id)])
if stock_quant: if stock_quant:
line.total_available_quantity = stock_quant.quantity line.total_available_quantity = stock_quant.quantity
else: else:

31
product_combo_pack/models/sale_order.py

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################### ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). # Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Afras Habis (odoo@cybrosys.com) # Author: Jumana Jabin MP (odoo@cybrosys.com)
# #
# This program is free software: you can modify # This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as # it under the terms of the GNU Affero General Public License (AGPL) as
@ -19,15 +19,36 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# #
################################################################################### ################################################################################
from odoo import api, fields, models from odoo import api, fields, models
class SalePack(models.Model): class SalePack(models.Model):
"""Model for extending the sale order to include a selection of packs."""
_inherit = 'sale.order' _inherit = 'sale.order'
product_pack_id = fields.Many2one('product.product', string='Select Pack',
domain=[('is_pack', '=', True)],
required=True,
help='The selected pack product for'
' the sale order.')
@api.onchange('product_pack_id')
def onchange_product_pack_id(self):
"""Perform actions when the selected pack product changes."""
if self.product_pack_id:
self.order_line = [(0, 0, {
'product_id': self.product_pack_id.id,
'name': self.product_pack_id.name,
'product_uom_qty': 1,
'price_unit': self.product_pack_id.list_price,
})]
elif not self.product_pack_id:
self.order_line = [(5, 0, 0)]
def action_confirm(self): def action_confirm(self):
"""Override the action_confirm method to create stock moves
for pack products."""
super(SalePack, self).action_confirm() super(SalePack, self).action_confirm()
for line in self.order_line: for line in self.order_line:
if line.product_id.is_pack: if line.product_id.is_pack:

3
product_combo_pack/security/ir.model.access.csv

@ -1,3 +1,2 @@
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_pack_products,access.pack.products,model_pack_products,base.group_user,1,1,1,1 access_pack_products,access.pack.products,model_pack_products,base.group_user,1,1,1,1
access_select_product_pack,access.select.product.pack,model_select_product_pack,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_pack_products access.pack.products model_pack_products base.group_user 1 1 1 1
access_select_product_pack access.select.product.pack model_select_product_pack base.group_user 1 1 1 1

BIN
product_combo_pack/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

BIN
product_combo_pack/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
product_combo_pack/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
product_combo_pack/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
product_combo_pack/static/description/assets/screenshots/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
product_combo_pack/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
product_combo_pack/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
product_combo_pack/static/description/assets/screenshots/hero.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

After

Width:  |  Height:  |  Size: 233 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-10.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-11.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-12.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-13.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-14.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-7.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-8.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

BIN
product_combo_pack/static/description/assets/screenshots/screenshot-9.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

507
product_combo_pack/static/description/index.html

@ -1,86 +1,91 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;"> <div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR --> <!-- TITLE BAR -->
<div <div
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;" /> <img src="assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div> <div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" <div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2"> class="mr-2">
<i class="fa fa-check mr-1"></i>Community <i class="fa fa-check mr-1"></i>Community
</div> </div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" <div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2"> class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise <i class="fa fa-check mr-1"></i>Enterprise
</div> </div>
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" <div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2"> class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh <i class="fa fa-check mr-1"></i>Odoo.sh
</div> </div>
</div> </div>
</div> </div>
<!-- END OF TITLE BAR --> <!-- END OF TITLE BAR -->
<!-- APP HERO --> <!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">Product Pack</h1> <h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Manage Products as Pack</p> Product Pack</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Manage Products as Pack</p>
<!-- END OF APP HERO --> <!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" <img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;" /> style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</div> </div>
<!-- NAVIGATION SECTION --> <!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png" /> <img src="assets/misc/compass.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Explore This
Module</h2> Module</h2>
</div> </div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> <div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3"> <div class="col-sm-12 col-md-6 my-3">
<a href="#overview"> <a href="#overview">
<div class="d-flex justify-content-between align-items-center" <div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div> <div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span <span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this more about this
module</span> module</span>
</div> </div>
<img src="assets/misc/right-arrow.png" width="36" height="36" /> <img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div> </div>
</a> </a>
</div> </div>
<div class="col-sm-12 col-md-6 my-3"> <div class="col-sm-12 col-md-6 my-3">
<a href="#features"> <a href="#features">
<div class="d-flex justify-content-between align-items-center" <div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div> <div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span <span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this features of this
module</span> module</span>
</div> </div>
<img src="assets/misc/right-arrow.png" width="36" height="36" /> <img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div> </div>
</a> </a>
</div> </div>
<div class="col-sm-12 col-md-6 my-3"> <div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots"> <a href="#screenshots">
<div class="d-flex justify-content-between align-items-center" <div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div> <div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> <span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span <span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this screenshots for this
module</span> module</span>
</div> </div>
<img src="assets/misc/right-arrow.png" width="36" height="36" /> <img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div> </div>
</a> </a>
</div> </div>
@ -88,67 +93,85 @@
<!-- END OF NAVIGATION SECTION --> <!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION --> <!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png" /> <img src="assets/misc/pie-chart.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Overview
</h2> </h2>
</div> </div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> <div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4"> <div class="col-sm-12 py-4">
Selling products in a pack is a great way to raise average sales price per product, to serve customers with products that make their lives easier, and to leverage current products into new and different ones. They are profitable for smaller businesses as well as large ones. Selling products in a pack is a great way to raise average sales price
per product, to serve customers with products that make their lives
easier, and to leverage current products into new and different ones.
They are profitable for smaller businesses as well as large ones.
</div> </div>
</div> </div>
<!-- END OF OVERVIEW SECTION --> <!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION --> <!-- FEATURES SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png" /> <img src="assets/misc/features.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Features
</h2> </h2>
</div> </div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> <div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create a Product Pack Easily. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create a Product Pack Easily.
</span> </span>
</div> </div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Manage the stock of the Product. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Manage the stock of the Product.
</span> </span>
</div> </div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Compute the Price of the Pack. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Compute the Price of the Pack.
</span> </span>
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Compute the Quantity of the Pack with <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Compute the Quantity of the Pack with
respect to the quantity of Pack items.</span> respect to the quantity of Pack items.</span>
</div> </div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Update the quantity of pack easily. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Update the quantity of pack easily.
</span> </span>
</div> </div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Adding Pack into Sale order Easily. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Adding Pack into Sale order Easily.
</span> </span>
</div> </div>
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center"
<img src="assets/misc/check-box.png" class="mr-2" /> style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter Pack from Products. <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter Pack from Products.
</span> </span>
</div> </div>
@ -157,122 +180,97 @@
<!-- END OF FEATURES SECTION --> <!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION --> <!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png" /> <img src="assets/misc/pictures.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Screenshots
</h2> </h2>
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<div style="display: block; margin: 30px auto;"> <div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Product Pack Menu. <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
</h3> Product Pack Menu.
</h3>
<img src="assets/screenshots/screenshot-1.png" class="img-thumbnail">
<img src="assets/screenshots/1.png"
class="img-thumbnail">
</div> </div>
<div style="display: block; margin: 30px auto;"> <div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Check if the product is a pack. <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
</h3> Check if the product is a pack.
</h3>
<img src="assets/screenshots/screenshot-2.png" class="img-thumbnail">
<img src="assets/screenshots/2.png"
class="img-thumbnail">
</div> </div>
<div style="display: block; margin: 30px auto;"> <div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Product Pack Page for Consumable(if not managing the stock of pack)</h3> <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product Pack Page for Consumable(if not managing the stock of
<img src="assets/screenshots/screenshot-3.png" class="img-thumbnail"> pack)</h3>
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Product Pack Page for Storable.
</h3>
<img src="assets/screenshots/screenshot-4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Adding products into the pack.
</h3>
<img src="assets/screenshots/screenshot-5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Computing the price with respect to
the product in the pack.</h3>
<img src="assets/screenshots/screenshot-6.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Update the price of the pack.
</h3>
<img src="assets/screenshots/screenshot-7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Get the quantity of pack with repect to the quantity of pack products.</h3>
<img src="assets/screenshots/screenshot-8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Update the quantity of pack directly with the computed quantity to the selected location.</h3>
<img src="assets/screenshots/screenshot-9.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Adding Pack to sale order.
</h3>
<img src="assets/screenshots/screenshot-10.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Select the Pack and Quantity and click on 'ADD' to add the pack into sale order.</h3>
</h3>
<img src="assets/screenshots/screenshot-11.png" class="img-thumbnail"> <img src="assets/screenshots/3.png"
</div> class="img-thumbnail">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Pack added to the sale order.
</h3>
<img src="assets/screenshots/screenshot-12.png" class="img-thumbnail">
</div> </div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Delivery of pack. <div style="display: block; margin: 30px auto;">
</h3> <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product Pack Page for Storable.
<img src="assets/screenshots/screenshot-13.png" class="img-thumbnail"> </h3>
</div>
<div style="display: block; margin: 30px auto;"> <img src="assets/screenshots/4.png"
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Stock reduced for both pack and pack products.</h3> class="img-thumbnail">
<img src="assets/screenshots/screenshot-14.png" class="img-thumbnail">
</div> </div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Adding products into the pack.
</h3>
<img src="assets/screenshots/5.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Adding Pack to sale order.
</h3>
<img src="assets/screenshots/6.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Delivery of pack.
</h3>
<img src="assets/screenshots/7.png"
class="img-thumbnail">
</div>
</div> </div>
</div> </div>
<!-- END OF SCREENSHOTS SECTION --> <!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS --> <!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" /> <img src="assets/misc/categories.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products Products
</h2> </h2>
</div> </div>
@ -282,52 +280,71 @@
<!-- The slideshow --> <!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;"> <div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;"> <div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/" target="_blank"> style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/1.png"> src="assets/modules/1.png">
</div> </div>
</a> </a>
</div> </div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank"> style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/2.png"> src="assets/modules/2.png">
</div> </div>
</a> </a>
</div> </div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/" target="_blank"> style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/3.png"> src="assets/modules/3.png">
</div> </div>
</a> </a>
</div> </div>
</div> </div>
<div class="carousel-item active" style="min-height: 198.656px;"> <div class="carousel-item active"
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> style="min-height: 198.656px;">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/" target="_blank"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/4.png"> src="assets/modules/4.png">
</div> </div>
</a> </a>
</div> </div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/" target="_blank"> style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/5.png"> src="assets/modules/5.png">
</div> </div>
</a> </a>
</div> </div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left"> <div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/" target="_blank"> style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/"
target="_blank">
<div style="border-radius:10px"> <div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;" <img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/6.png"> src="assets/modules/6.png">
</div> </div>
</a> </a>
@ -335,12 +352,17 @@
</div> </div>
</div> </div>
<!-- Left and right controls --> <!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span <a class="carousel-control-prev" href="#demo1" data-slide="prev"
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span> style="width:35px; color:#000"> <span
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000"> class="carousel-control-prev-icon"><i
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right" class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span> style="font-size:24px"></i></span>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
@ -348,12 +370,15 @@
<!-- OUR SERVICES --> <!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png" /> <img src="assets/misc/star.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2> </h2>
</div> </div>
@ -361,30 +386,36 @@
<div class="row"> <div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/cogs.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Customization</h6> Customization</h6>
</div> </div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/wrench.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Implementation</h6> Implementation</h6>
</div> </div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/lifebuoy.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Support</h6> Support</h6>
</div> </div>
@ -392,10 +423,12 @@
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/user.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire Hire
Odoo Odoo
Developer</h6> Developer</h6>
@ -403,20 +436,24 @@
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/puzzle.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Integration</h6> Integration</h6>
</div> </div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/update.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Migration</h6> Migration</h6>
</div> </div>
@ -424,30 +461,36 @@
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/consultation.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Consultancy</h6> Consultancy</h6>
</div> </div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/training.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Implementation</h6> Implementation</h6>
</div> </div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> <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" <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;"> 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"> <img src="assets/icons/license.png" class="img-responsive"
height="48px" width="48px">
</div> </div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> <h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Odoo
Licensing Consultancy</h6> Licensing Consultancy</h6>
</div> </div>
@ -455,16 +498,19 @@
</div> </div>
<!-- END OF END OF OUR SERVICES --> <!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES --> <!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png" /> <img src="assets/misc/corporate.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our
Industries Industries
</h2> </h2>
</div> </div>
@ -473,8 +519,9 @@
<div class="row"> <div class="row">
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/trading-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading Trading
</h5> </h5>
@ -487,8 +534,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/pos-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS POS
</h5> </h5>
@ -501,8 +549,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/education-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education Education
</h5> </h5>
@ -514,9 +563,10 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" <img src="assets/icons/manufacturing-black.png"
width="48px"> class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing Manufacturing
</h5> </h5>
@ -528,8 +578,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website E-commerce &amp; Website
</h5> </h5>
@ -542,8 +593,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/service-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management Service Management
</h5> </h5>
@ -555,8 +607,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant Restaurant
</h5> </h5>
@ -568,8 +621,9 @@
<div class="col-lg-3"> <div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center" <div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px"> <img src="assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> <h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management Hotel Management
</h5> </h5>
@ -582,15 +636,18 @@
</div> </div>
</div> </div>
<!-- END OF END OF OUR INDUSTRIES --> <!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT --> <!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> <div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2" <div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png" /> <img src="assets/misc/customer-support.png"/>
</div> </div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support <h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2> </h2>
</div> </div>
<div class="container mt-5"> <div class="container mt-5">
@ -598,12 +655,14 @@
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4" <div class="mr-4"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" /> <img src="assets/misc/support.png" height="48" width="48"
style="width: 42px; height: 42px;"/>
</div> </div>
<div> <div>
<h4>Need Help?</h4> <h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p> <p style="line-height: 100%;">Got questions or need help?
Get in touch.</p>
<a href="mailto:odoo@cybrosys.com"> <a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p> odoo@cybrosys.com</p>
@ -614,14 +673,16 @@
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> <div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4" <div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" /> <img src="assets/misc/whatsapp.png" height="52" width="52"
style="width: 52px; height: 52px;"/>
</div> </div>
<div> <div>
<h4>WhatsApp</h4> <h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p> <p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707"> <a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068 <p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
+91 86068
27707</p> 27707</p>
</a> </a>
</div> </div>
@ -631,7 +692,7 @@
<div class="row"> <div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> <div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31" <img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;" /> style="width:144px; height: 31px; margin-top: 40px;"/>
</div> </div>
</div> </div>
</div> </div>

103
product_combo_pack/views/product_form_view.xml

@ -1,103 +0,0 @@
<odoo>
<data>
<!-- Inherit Form View to Modify it -->
<record id="product_product_inherit_pack" model="ir.ui.view">
<field name="name">product.product.inherit.pack</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
</field>
</record>
<record id="product_template_inherit_pack" model="ir.ui.view">
<field name="name">product.template.inherit.pack</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
<xpath expr="//page[@name='variants']" position="attributes">
<attribute name="attrs">{'invisible': [('is_pack','=',True)]}</attribute>
</xpath>
<xpath expr="//page[@name='invoicing']" position="after">
<page string="Product Pack" name="product_pack" attrs="{'invisible' : [('is_pack','=',False)] }">
<group name="pack_properties">
<group string="Pack Price">
<label for="pack_price"/>
<div class="o_row">
<field name="pack_price"/>
<button name="update_price_product" type="object" string="Update Price"
class="oe_link oe_read_only pt-0"/>
</div>
</group>
<group string="Pack Quantity" attrs="{'invisible' : [('type','!=','product')]}">
<field name="pack_location_id" attrs="{'required':[('is_pack','=',True)]}"/>
<label for="pack_quantity"/>
<div class="o_row">
<field name="pack_quantity"/>
<button name="get_quantity" type="object" string="Get Quantity"
help='To get the quantity of Pack with respect to the quantity of pack products'/>
<button name="update_quantity" type="object" string="Update Quantity"
class="oe_link oe_read_only pt-0"/>
</div>
</group>
</group>
<field name="pack_products_ids" nolabel="1"
attrs="{'readonly':[('pack_location_id','=',False)]}">
<tree editable="botttom">
<field name="product_id" string="Product" options='{"no_open":True}'/>
<field name="quantity" string="Quantity"/>
<field name="price"/>
<field name="qty_available"/>
<field name="total_available_quantity" invisible="True"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
<record id="product_pack_action" model="ir.actions.act_window">
<field name="name">Product Pack</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,form</field>
<field name="domain">[('is_pack','=',True)]</field>
<field name="context">{'default_is_pack' : True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
There is no product pack to show...!
</p>
</field>
</record>
<record id="product_pack_filter" model="ir.ui.view">
<field name="name">product.template.search.inherit</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<filter string="Is a Pack" name="Is a Pack" domain="[('is_pack','=',True)]"/>
</xpath>
</field>
</record>
<menuitem id="pack_product_sale"
name="Product Pack"
parent="sale.product_menu_catalog"
sequence="3"
action="product_pack_action"/>
</data>
</odoo>

119
product_combo_pack/views/product_form_views.xml

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Modify product.product form view -->
<record id="product_normal_form_view" model="ir.ui.view">
<field name="name">
product.product.form.view.inherit.product.combo.pack
</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<!-- Add the 'is_pack' field to the 'options' div -->
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
</field>
</record>
<!-- Modify product.template form view -->
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">
product.template.form.view.inherit.product.combo.pack
</field>
<field name="model">product.template</field>
<field name="inherit_id"
ref="product.product_template_only_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='options']" position="inside">
<div modifiers="{}">
<field name="is_pack" modifiers="{}"/>
<label for="is_pack" modifiers="{}"/>
</div>
</xpath>
<xpath expr="//page[@name='variants']" position="attributes">
<attribute name="attrs">{'invisible':
[('is_pack','=',True)]}
</attribute>
</xpath>
<xpath expr="//page[@name='invoicing']" position="after">
<page string="Product Pack" name="product_pack"
attrs="{'invisible' : [('is_pack','=',False)] }">
<group name="pack_properties">
<group string="Pack Price">
<label for="pack_price"/>
<div class="o_row">
<field name="pack_price"/>
<button name="update_price_product"
type="object"
string="Update Price"/>
</div>
</group>
<group string="Pack Quantity"
attrs="{'invisible' : [('type','!=','product')]}">
<field name="pack_location_id"
attrs="{'required':[('is_pack','=',True)]}"/>
<label for="pack_quantity"/>
<div class="o_row">
<field name="pack_quantity"/>
<button name="get_quantity" type="object"
string="Get Quantity"
help='To get the quantity of Pack with respect to the quantity of pack products'/>
<button name="update_quantity" type="object"
string="Update Quantity"/>
</div>
</group>
</group>
<field name="pack_products_ids"
attrs="{'readonly':[('pack_location_id','=',False)]}">
<tree editable="botttom">
<field name="product_id" string="Product"
options='{"no_open":True}'/>
<field name="quantity" string="Quantity"/>
<field name="price"/>
<field name="qty_available"/>
<field name="total_available_quantity"
invisible="True"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
<!-- Define an action for the Product Pack menu item -->
<record id="product_pack_action" model="ir.actions.act_window">
<field name="name">Product Pack</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,form</field>
<field name="domain">[('is_pack','=',True)]</field>
<field name="context">{'default_is_pack' : True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
There is no product pack to show...!
</p>
</field>
</record>
<!-- Modify product.template search view -->
<record id="product_template_search_view" model="ir.ui.view">
<field name="name">
product.template.search.view.inherit.product.combo.pack
</field>
<field name="model">product.template</field>
<field name="inherit_id"
ref="product.product_template_search_view"/>
<field name="arch" type="xml">
<xpath expr="//search" position="inside">
<filter string="Is a Pack" name="Is a Pack"
domain="[('is_pack','=',True)]"/>
</xpath>
</field>
</record>
<!-- Add the Product Pack menu item -->
<menuitem id="pack_product_sale"
name="Product Pack"
parent="sale.product_menu_catalog"
sequence="3"
action="product_pack_action"/>
</odoo>

15
product_combo_pack/views/sale_order_view.xml

@ -1,15 +0,0 @@
<odoo>
<data>
<!-- Inherit Form View to Modify it -->
<record id="product_pack_sale_order" model="ir.ui.view">
<field name="name">Product Pack in sale order</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']" position="before">
<button name="%(action_product_pack_wizard)d" type="action" string="Add Product Pack" style="margin-bottom : 16px;"/>
</xpath>
</field>
</record>
</data>
</odoo>

16
product_combo_pack/views/sale_order_views.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Inherit Form View to Modify it -->
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.form.view.inherit.product.combo.pack
</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="sale_order_template_id" position="before">
<field name="product_pack_id" options="{'no_create': True}"
/>
</field>
</field>
</record>
</odoo>

24
product_combo_pack/wizard/__init__.py

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
###################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from . import select_product_pack

58
product_combo_pack/wizard/select_product_pack.py

@ -1,58 +0,0 @@
# -*- coding: utf-8 -*-
###################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
# Author: Afras Habis (odoo@cybrosys.com)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class SelectPack(models.TransientModel):
_name = 'select.product.pack'
_rec_name = 'product_id'
_description = 'Add product pack to sale order'
product_id = fields.Many2one('product.product', string='Select Pack', domain=[('is_pack', '=', True)],
required=True)
quantity = fields.Integer('Quantity', default=1, required=True)
def add_pack_order(self):
active_id = self._context.get('active_id')
if active_id:
sale_id = self.env['sale.order'].browse(active_id)
name = self.product_id.display_name
if self.product_id.description_sale:
name += '\n' + self.product_id.description_sale
self.env['sale.order.line'].create({
'product_id': self.product_id.id,
# 'price_unit': self.product_id.lst_price,
# 'pricelist_item_id': self.product_id.lst_price,
'product_uom': self.product_id.uom_id.id,
'product_uom_qty': self.quantity,
'order_id': sale_id.id,
'name': name,
'tax_id': self.product_id.taxes_id.ids
})
@api.constrains('quantity')
def _check_positive_qty(self):
if any([ml.quantity < 0 for ml in self]):
raise ValidationError(_('You can not enter negative quantities.'))

32
product_combo_pack/wizard/select_product_pack_view.xml

@ -1,32 +0,0 @@
<odoo>
<data>
<record id="action_product_pack_wizard" model="ir.actions.act_window">
<field name="name">Select Pack Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">select.product.pack</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="product_pack_product_form" model="ir.ui.view">
<field name="name">Product Pack</field>
<field name="model">select.product.pack</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="product_id"/>
</group>
<group>
<field name="quantity"/>
</group>
</group>
<footer>
<button name="add_pack_order" string="ADD" type="object"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
</data>
</odoo>
Loading…
Cancel
Save