Browse Source

Nov 24 : [ADD] Initial Commit 'pos_multi_variant'

pull/295/head
RisvanaCybro 1 year ago
parent
commit
0bd965ed3b
  1. 44
      pos_multi_variant/README.rst
  2. 22
      pos_multi_variant/__init__.py
  3. 59
      pos_multi_variant/__manifest__.py
  4. 9
      pos_multi_variant/doc/RELEASE_NOTES.md
  5. 24
      pos_multi_variant/models/__init__.py
  6. 106
      pos_multi_variant/models/pos_session.py
  7. 33
      pos_multi_variant/models/product_template.py
  8. 45
      pos_multi_variant/models/variants_tree.py
  9. 2
      pos_multi_variant/security/ir.model.access.csv
  10. BIN
      pos_multi_variant/static/description/assets/icons/check.png
  11. BIN
      pos_multi_variant/static/description/assets/icons/chevron.png
  12. BIN
      pos_multi_variant/static/description/assets/icons/cogs.png
  13. BIN
      pos_multi_variant/static/description/assets/icons/consultation.png
  14. BIN
      pos_multi_variant/static/description/assets/icons/ecom-black.png
  15. BIN
      pos_multi_variant/static/description/assets/icons/education-black.png
  16. BIN
      pos_multi_variant/static/description/assets/icons/hotel-black.png
  17. BIN
      pos_multi_variant/static/description/assets/icons/license.png
  18. BIN
      pos_multi_variant/static/description/assets/icons/lifebuoy.png
  19. BIN
      pos_multi_variant/static/description/assets/icons/manufacturing-black.png
  20. BIN
      pos_multi_variant/static/description/assets/icons/pos-black.png
  21. BIN
      pos_multi_variant/static/description/assets/icons/puzzle.png
  22. BIN
      pos_multi_variant/static/description/assets/icons/restaurant-black.png
  23. BIN
      pos_multi_variant/static/description/assets/icons/service-black.png
  24. BIN
      pos_multi_variant/static/description/assets/icons/trading-black.png
  25. BIN
      pos_multi_variant/static/description/assets/icons/training.png
  26. BIN
      pos_multi_variant/static/description/assets/icons/update.png
  27. BIN
      pos_multi_variant/static/description/assets/icons/user.png
  28. BIN
      pos_multi_variant/static/description/assets/icons/wrench.png
  29. BIN
      pos_multi_variant/static/description/assets/misc/categories.png
  30. BIN
      pos_multi_variant/static/description/assets/misc/check-box.png
  31. BIN
      pos_multi_variant/static/description/assets/misc/compass.png
  32. BIN
      pos_multi_variant/static/description/assets/misc/corporate.png
  33. BIN
      pos_multi_variant/static/description/assets/misc/customer-support.png
  34. BIN
      pos_multi_variant/static/description/assets/misc/cybrosys-logo.png
  35. BIN
      pos_multi_variant/static/description/assets/misc/features.png
  36. BIN
      pos_multi_variant/static/description/assets/misc/logo.png
  37. BIN
      pos_multi_variant/static/description/assets/misc/pictures.png
  38. BIN
      pos_multi_variant/static/description/assets/misc/pie-chart.png
  39. BIN
      pos_multi_variant/static/description/assets/misc/right-arrow.png
  40. BIN
      pos_multi_variant/static/description/assets/misc/star.png
  41. BIN
      pos_multi_variant/static/description/assets/misc/support.png
  42. BIN
      pos_multi_variant/static/description/assets/misc/whatsapp.png
  43. BIN
      pos_multi_variant/static/description/assets/modules/1.png
  44. BIN
      pos_multi_variant/static/description/assets/modules/2.png
  45. BIN
      pos_multi_variant/static/description/assets/modules/3.png
  46. BIN
      pos_multi_variant/static/description/assets/modules/4.png
  47. BIN
      pos_multi_variant/static/description/assets/modules/5.png
  48. BIN
      pos_multi_variant/static/description/assets/modules/6.png
  49. BIN
      pos_multi_variant/static/description/assets/screenshots/hero.gif
  50. BIN
      pos_multi_variant/static/description/assets/screenshots/pm1.png
  51. BIN
      pos_multi_variant/static/description/assets/screenshots/pm2.png
  52. BIN
      pos_multi_variant/static/description/assets/screenshots/pm3.png
  53. BIN
      pos_multi_variant/static/description/assets/screenshots/pm4.png
  54. BIN
      pos_multi_variant/static/description/assets/screenshots/pm5.png
  55. BIN
      pos_multi_variant/static/description/assets/screenshots/pm6.png
  56. BIN
      pos_multi_variant/static/description/banner.png
  57. BIN
      pos_multi_variant/static/description/icon.png
  58. 566
      pos_multi_variant/static/description/index.html
  59. 67
      pos_multi_variant/static/src/css/label.css
  60. 75
      pos_multi_variant/static/src/js/ProductPopup.js
  61. 62
      pos_multi_variant/static/src/js/ProductScreen.js
  62. 21
      pos_multi_variant/static/src/js/models.js
  63. 34
      pos_multi_variant/static/src/js/product_variant_orderline.js
  64. 37
      pos_multi_variant/static/src/xml/label.xml
  65. 57
      pos_multi_variant/static/src/xml/popup.xml
  66. 35
      pos_multi_variant/views/product_template_views.xml

44
pos_multi_variant/README.rst

@ -0,0 +1,44 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
POS Product Multi variant
=========================
* Configure products having variants
Installation
============
- www.odoo.com/documentation/16.0/setup/install.html
- Install our custom addon
License
-------
GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer: (V16) Akhil Ashok, Contact : odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

22
pos_multi_variant/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import models

59
pos_multi_variant/__manifest__.py

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': "POS Product Multi variant",
'version': '16.0.1.0.0',
'category': 'Point of Sale',
'summary': """POS Multi-variant module is an advanced way for managing
product variants from the point of sale application""",
'description': """POS Multi-variant module is an advanced way for managing
product variants from the point of sale application. The module helps the
user to configure product variants straightfrom POS. User can set extra
price, also activate/inactivate the option for variants. As multi-variant
products are displayed with a label, it comes easy for the user to sort
which is multi-variant and which is not. User can confirm the variant type
to POS orders.""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['point_of_sale'],
'data': [
'security/ir.model.access.csv',
'views/product_template_views.xml'],
'assets': {
'point_of_sale.assets': [
'pos_multi_variant/static/src/css/label.css',
'pos_multi_variant/static/src/js/models.js',
'pos_multi_variant/static/src/js/product_variant_orderline.js',
'pos_multi_variant/static/src/js/ProductPopup.js',
'pos_multi_variant/static/src/js/ProductScreen.js',
'pos_multi_variant/static/src/xml/label.xml',
'pos_multi_variant/static/src/xml/popup.xml'
],
},
'images': ['static/description/banner.png'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

9
pos_multi_variant/doc/RELEASE_NOTES.md

@ -0,0 +1,9 @@
## Module <pos_multi_variant>
#### 12.10.2023
#### Version 16.0.1.0.0
##### ADD
- Initial commit for POS Product Multi variant

24
pos_multi_variant/models/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import product_template
from . import pos_session
from . import variants_tree

106
pos_multi_variant/models/pos_session.py

@ -0,0 +1,106 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models
class PosSession(models.Model):
"""Model Inherits to add Load models and fields"""
_inherit = 'pos.session'
def _pos_ui_models_to_load(self):
"""
Overrides the _pos_ui_models_to_load method to include additional models
required for the POS UI.
:return: A list of models to load for the POS UI.
:rtype: list[str]
"""
result = super()._pos_ui_models_to_load()
result.append('variants.tree')
result.append('product.attribute.value')
return result
def _loader_params_variants_tree(self):
"""
Returns the loader parameters for the 'variants.tree' model.
:return: The loader parameters.
:rtype: dict
"""
return {
'search_params': {
'fields': ["value_ids", "attribute_id", "variants_id",
"extra_price"],
},
}
def _loader_params_product_attribute_value(self):
"""
Returns the loader parameters for the 'product.attribute.value' model.
:return: The loader parameters.
:rtype: dict
"""
return {
'search_params': {
'fields': ["id", "name"],
},
}
def _get_pos_ui_variants_tree(self, params):
"""
Fetches and returns the records from the 'variants.tree'
model based on the specified search parameters.
:param params: The parameters for the search operation.
:type params: dict
:return: The fetched records.
:rtype: list
"""
return self.env['variants.tree'].search_read(**params['search_params'])
def _get_pos_ui_product_attribute_value(self, params):
"""
Fetches and returns the records from the 'product.attribute.value'
model based on the specified search parameters.
:param params: The parameters for the search operation.
:type params: dict
:return: The fetched records.
:rtype: list
"""
return self.env['product.attribute.value'].search_read(
**params['search_params'])
def _loader_params_product_product(self):
"""
Returns the parameters for loading the 'product.product' model.
Extends the base method to include additional fields 'pos_variants' and
'variant_line_ids' in the search parameters.
:return: The loader parameters.
:rtype: dict
"""
result = super()._loader_params_product_product()
result['search_params']['fields'].extend(
['is_pos_variants', 'variant_line_ids'])
return result

33
pos_multi_variant/models/product_template.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class ProductTemplate(models.Model):
"""To enable POS variants and configure different variants"""
_inherit = 'product.template'
is_pos_variants = fields.Boolean(string='Pos variants', default=False,
help="Enable Pos variants")
variant_line_ids = fields.One2many('variants.tree', 'variants_id',
string="Configure Variants",
help="Select pos product variants")

45
pos_multi_variant/models/variants_tree.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Akhil Ashok(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class VariantsTree(models.Model):
"""
Model representing a variants tree.
This model is used to define the different variants of a product
template based on attributes and their values.
Each variant is associated with a product template and has an attribute,
a set of values, an extra price, and an
active flag.
"""
_name = 'variants.tree'
_description = "Choose Attributes And Values"
variants_id = fields.Many2one('product.template', string="Variants",
help="Choose variants")
attribute_id = fields.Many2one('product.attribute', string='Attribute',
ondelete='restrict', required=True,
index=True, help="Choose Attribute")
value_ids = fields.Many2many('product.attribute.value', string='Values',
help="Choose value")
extra_price = fields.Float(string="Price Extra",
help="Add extra Price for variants")

2
pos_multi_variant/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_variants_tree, access.variants.tree,model_variants_tree,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_variants_tree access.variants.tree model_variants_tree base.group_user 1 1 1 1

BIN
pos_multi_variant/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
pos_multi_variant/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
pos_multi_variant/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
pos_multi_variant/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
pos_multi_variant/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
pos_multi_variant/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
pos_multi_variant/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
pos_multi_variant/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
pos_multi_variant/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
pos_multi_variant/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
pos_multi_variant/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
pos_multi_variant/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
pos_multi_variant/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
pos_multi_variant/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
pos_multi_variant/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
pos_multi_variant/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
pos_multi_variant/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
pos_multi_variant/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
pos_multi_variant/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
pos_multi_variant/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
pos_multi_variant/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
pos_multi_variant/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
pos_multi_variant/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
pos_multi_variant/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
pos_multi_variant/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
pos_multi_variant/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
pos_multi_variant/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
pos_multi_variant/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
pos_multi_variant/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
pos_multi_variant/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
pos_multi_variant/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
pos_multi_variant/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
pos_multi_variant/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
pos_multi_variant/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
pos_multi_variant/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
pos_multi_variant/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
pos_multi_variant/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
pos_multi_variant/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
pos_multi_variant/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

BIN
pos_multi_variant/static/description/assets/screenshots/pm6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
pos_multi_variant/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
pos_multi_variant/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

566
pos_multi_variant/static/description/index.html

@ -0,0 +1,566 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
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;" />
<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;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</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;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">POS Product Multi Variant</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> Configure Multi-Variant Products For POS.</p>
<!-- END OF APP HERO -->
<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;" />
</div>
</div>
</div>
</div>
<!-- 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 justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION 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 justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<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">
POS Multi-variant module is an advanced way for managing product variants from the point of sale application.
The module helps the user to configure product variants straight from POS. User can set extra price, also activate/inactivate the option for variants.
As multi-variant products are displayed with a label, it comes easy for the user to sort which is multi-variant and which is not.
User can confirm the variant type to POS orders.
</div>
<!-- END OF OVERVIEW 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 justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
</h2>
</div>
<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="d-flex align-items-center" 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;">Multi-variant option in product configuration.</span>
</div>
<div class="d-flex align-items-center" 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;">Option for activating/inactivating variant types in POS.</span>
</div>
<div class="d-flex align-items-center" 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;">Easy selection of variant type from wizard.</span>
</div>
<div class="d-flex align-items-center" 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;">Option for adding extra price for the variant.</span>
</div>
<div class="d-flex align-items-center" 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;">Notification for multi-variant products in POS.</span>
</div>
<div class="d-flex align-items-center" 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;">Displays variant details in order receipt and order.</span>
</div>
</div>
</div>
<!-- END OF FEATURES 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 justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Products -> Enable POS variants and Configure variants.</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> After installation, go to Products -> Enable POS variants option.
Here you have an option to configure different variants.</p>
<img src="assets/screenshots/pm1.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;">See multi-variant products</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Open the POS session, you can see the product with multi-variants.</p>
<img src="assets/screenshots/pm2.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;">Variant selection window pop-up</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Variant selection window pop-ups, upon selecting a product having multi-variants.</p>
<img src="assets/screenshots/pm3.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;">Choose desired variants</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">User can see invoice is validated automatically and sent message is linked with chatter which is sent to customer.</p>
<img src="assets/screenshots/pm4.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;">Confirmed variants get listed in the POS order list.</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">On confirming the variants, it gets listed in the order list of POS session.</p>
<img src="assets/screenshots/pm5.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;">Variant details in the order receipt</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">The order receipt will be shown as below.</p>
<img src="assets/screenshots/pm6.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<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"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<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">
<a href="https://apps.odoo.com/apps/modules/16.0/dashboard_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/pos_credit_limit/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/low_stocks_product_alert/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/multi_barcodes_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/product_multi_uom_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/pos_order_line_image/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i 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>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<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"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<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"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<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;">
<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;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-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;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<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;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<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"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
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;" />
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
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;" />
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<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"
style="width:144px; height: 31px; margin-top: 40px;" />
</div>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

67
pos_multi_variant/static/src/css/label.css

@ -0,0 +1,67 @@
.pos .product .variant {
position: absolute;
top: 50px;
left: 2px;
right: 2px;
vertical-align: top;
color: white;
line-height: 13px;
background: #0070F7;
padding: 2px 5px;
border-radius: 2px;
}
.variants{
position: absolute;
bottom: -11px;
left: 2px;
right: 2px;
vertical-align: top;
color: white;
line-height: 40px;
background: #1b9c99;
padding: 2px 5px;
border-radius: 2px;
}
.extra-price{
position: absolute;
top: 2px;
right: 2px;
vertical-align: top;
color: #000;
line-height: 13px;
background: #FFACAC;
padding: 7px 5px;
border-radius: 2px;
}
.tag{
background-color:#d7d7d7;
font-style: italic;
}
.variant-selected{
position: absolute;
bottom: 23px;
left: 2px;
right: 2px;
vertical-align: top;
color: white;
line-height: 13px;
font-size: 15px;
background: #0831b3;
padding: 2px 5px;
border-radius: 2px;
}
.custom-pos-label{
width: 100%;
position: absolute;
top: 45%;
left: 0;
background: #30E3DF;
height: 20px;
display: block;
line-height: 100%;
display: flex;
justify-content: center;
align-items: center;
color: #03001C;
}

75
pos_multi_variant/static/src/js/ProductPopup.js

@ -0,0 +1,75 @@
odoo.define('pos_multi_variant.ProductsPopup', function(require) {
'use strict';
/* This JavaScript code defines the ProductsPopup component, which extends
* the ProductItem class from the point_of_sale module. It represents a popup
* for selecting product variants.
*/
const Registries = require('point_of_sale.Registries');
const { useListener } = require("@web/core/utils/hooks");
const ProductItem = require('point_of_sale.ProductItem');
class ProductsPopup extends ProductItem {
setup() {
super.setup();
useListener('click','.confirm', this.click_confirm);
useListener('click','.product', this.select_variant);
useListener('click','.cancel', this.click_cancel);
}
select_variant(e) {
var order = this.env.pos.get_order()
var self = e.composedPath ? e.composedPath()[2] : e.path[2];
var action = $(self).find('.action').text();
var category = $(self).find('.action').data('category');
$('.product-img').find('.variant-selected').each(function ()
{ if($(this).data('category') == category)
{ $(this).text("").removeClass('variant-selected');
$(self).find('.action').text("Selected").addClass('variant-selected');
}
});
$(self).find('.action').text("Selected").addClass('variant-selected');
var add = $(self).find('.extra-price').text().substr(1).slice(0, -2);
var type = $(self).find('.variants').text();
$(self).find('.variant-selected').attr('data-price', add);
$(self).find('.variant-selected').attr('data-type', type);
}
click_confirm(e){
var price = 0.00
var order = this.env.pos.get_order()
var selected_orderline = order.get_selected_orderline()
var variants = []
this.env.pos.selectedOrder.selected_orderline.product_variants=variants
$('.product-img').find('.variant-selected').each(function ()
{
var add = this.previousSibling.innerHTML;
add = add.slice(3)
price += parseFloat(add)
if (order.selected_orderline.product.is_pos_variants){
variants.push({
'extra_price': add,
'type': $(this).data('type'),
})
};
})
selected_orderline.price_manually_set = true;
selected_orderline.price += price
this.env.posbus.trigger('close-popup', {
popupId: this.props.id
});
}
click_cancel(){
this.env.posbus.trigger('close-popup', {
popupId: this.props.id
});
}
imageUrl() {
return `/web/image?model=product.product&field=image_1920&id=${this.props.product_tmpl_id}&unique=1`;
}
async _clickProduct(event) {
}
}
ProductsPopup.template = 'ProductsPopUp';
ProductsPopup.defaultProps = {};
Registries.Component.add(ProductsPopup);
return ProductsPopup;
});

62
pos_multi_variant/static/src/js/ProductScreen.js

@ -0,0 +1,62 @@
odoo.define('pos_multi_variant.ProductScreen', function(require) {
'use strict';
/* This JavaScript code extends the ProductScreen class from the point_of_sale module.
* It adds functionality for handling product clicks and displaying the ProductsPopup
* for selecting variants.
*/
var ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const NumberBuffer = require('point_of_sale.NumberBuffer');
var rpc = require('web.rpc');
const ProductScreenExtend = (ProductScreen) =>
class extends ProductScreen {
constructor() {
super(...arguments);
}
async _clickProduct(event) {
await super._clickProduct(...arguments)
if (!this.currentOrder) {
this.env.pos.add_new_order();
}
const product = event.detail;
var variant_product = ''
await rpc.query({
model: 'variants.tree',
method: 'search_read',
fields: ['extra_price','attribute_id','value_ids', 'variants_id'],
args: [[['variants_id','=',event.detail.product_tmpl_id]]]
}).then(function (data) {
variant_product = data
});
var li=[]
for(var i=0; i<variant_product.length; ++i) {
variant_product[i].value_ids.forEach(function (field) {
li.push(field)
});
}
var variant_details = ''
await rpc.query({
model: 'product.attribute.value',
method: 'search_read',
fields: ['name'],
domain: [['id', 'in', li]],
}).then(function (result) {
variant_details = result
});
const options = await this._getAddProductOptions(product);
// Do not add product if options is undefined.
if (!options) return;
NumberBuffer.reset();
if(product.is_pos_variants){
this.showPopup('ProductsPopup',{
title: product.display_name,
products: variant_product,
product_tmpl_id: event.detail.id,
variant_details: variant_details,
});
}
}
};
Registries.Component.extend(ProductScreen, ProductScreenExtend);
return ProductScreen;
});

21
pos_multi_variant/static/src/js/models.js

@ -0,0 +1,21 @@
odoo.define('pos_multi_variant.model', function(require) {
'use strict';
/* This JavaScript code defines the VariantsPosGlobalState class
* extending the PosGlobalState class from the point_of_sale.models module.
* It adds additional functionality to process variants data.
*/
var {
PosGlobalState
} = require('point_of_sale.models');
const Registries = require('point_of_sale.Registries');
const VariantsPosGlobalState = (PosGlobalState) => class VariantsPosGlobalState extends PosGlobalState {
async _processData(loadedData) {
await super._processData(...arguments);
this.variants_tree = loadedData['variants.tree'];
this.product_attribute_value = loadedData['product.attribute.value'];
}
}
Registries.Model.extend(PosGlobalState, VariantsPosGlobalState);
});

34
pos_multi_variant/static/src/js/product_variant_orderline.js

@ -0,0 +1,34 @@
odoo.define('pos_order_question.Orderline', function(require) {
'use strict';
/* This JavaScript code defines the PosMultiVariantOrderline class
* extending the Orderline class from the point_of_sale.models module.
* It adds additional functionality related to product variants.
*/
var {
Orderline,
} = require('point_of_sale.models');
var utils = require('web.utils');
const Registries = require('point_of_sale.Registries');
const PosMultiVariantOrderline = (Orderline) => class PosMultiVariantOrderline extends Orderline {
constructor(obj, options) {
super(...arguments);
this.product_variants = this.product_variants || [];
}
export_as_JSON() {
const json = super.export_as_JSON(...arguments);
json.product_variants = this.product_variants || [];
return json;
}
export_for_printing() {
var line = super.export_for_printing(...arguments);
line.product_variants = this.product_variants;
return line;
}
}
Registries.Model.extend(Orderline, PosMultiVariantOrderline);
});

37
pos_multi_variant/static/src/xml/label.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates id="template" xml:space="preserve">
<!-- This XML snippet extends the point_of_sale.ProductItem template -->
<t t-inherit="point_of_sale.ProductItem" t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('product-img')]" position="inside">
<t t-if="props.product.is_pos_variants">
<span class="custom-pos-label">Multi-variant</span>
<link rel="stylesheet" type="text/scss" href="pos_multi_variant/static/src/css/label.css"/>
</t>
</xpath>
</t>
<!-- This XML snippet extends the point_of_sale.Orderline template -->
<t t-name="Orderline" t-inherit="point_of_sale.Orderline" t-inherit-mode="extension" owl="1">
<xpath expr="//li[@class='info']" position="inside">
<br></br>
<t t-foreach="props.line.product_variants" t-as="variant" t-key="variant_index">
<t t-esc="variant['type']"/>:
<t t-esc="env.pos.format_currency(variant['extra_price'])"/>
<br></br>
</t>
</xpath>
</t>
<!-- This XML snippet extends the point_of_sale.OrderLinesReceipt template -->
<t t-name="ComboProductOrderReceipt"
t-inherit="point_of_sale.OrderLinesReceipt"
t-inherit-mode="extension" owl="1">
<xpath expr="//t[@t-foreach='receipt.orderlines']" position="inside">
<t t-if="line.product_variants">
<div class="pos-receipt-right-padding">
<t t-foreach="line.product_variants" t-as="variant" t-key="variant_index">
<span>(<t t-esc="variant['type']"/>)</span>
</t>
</div>
</t>
</xpath>
</t>
</templates>

57
pos_multi_variant/static/src/xml/popup.xml

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<!-- This XML snippet defines the ProductsPopUp template -->
<t t-name="ProductsPopUp" owl="1">
<div role="dialog" class="modal-dialog">
<div class="popup popup-selection">
<header class="title">
<t t-esc="props.title || 'Product'" />
</header>
<div class="selection scrollable-y touch-scrollable">
<div id="notify"/></div>
<t t-foreach="props.products" t-as="product" t-key="product.id">
<div>
<h2>
<t t-esc="product['attribute_id'][1]"/>
</h2>
</div>
<t t-set="attribute" t-value="product['attribute_id'][1]"/>
<div class="row">
<div class="" style="display:flex; flex-wrap: wrap;justify-content:center; padding:0 1.5rem;">
<t t-foreach="props.variant_details" t-as="variant"
t-key="variant.id">
<t t-foreach="product['value_ids']" t-as="val" t-key="val">
<t t-if="variant['id'] == val">
<!-- Display the product variant -->
<article class='product' style="flex-grow: 1;">
<div class='product-img'>
<img t-att-src="imageUrl()"/>
<span class='extra-price'>+
<t
t-esc="env.pos.format_currency(product['extra_price'])"/>
</span>
<h2 class='action' data-price=''
data-type=''
t-att-data-category='attribute'/>
<span class='variants'>
<t t-esc="variant['name']"/>
</span>
</div>
</article>
</t>
</t>
</t>
</div>
</div>
<hr/>
</t>
<footer class="footer">
<div class="button confirm"> Confirm </div>
<div class="button cancel">
Cancel
</div>
</footer>
</div>
</div>
</t>
</templates>

35
pos_multi_variant/views/product_template_views.xml

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This XML snippet modifies the view of the product.template model.Inserts fields for managing POS variants inside the 'options' -->
<odoo>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">
product.template.view.form.inherit.pos.multi.variant
</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>
<field name="is_pos_variants"/>
<label for="is_pos_variants"/>
</div>
</xpath>
<xpath expr="//page[@name='general_information']" position="after">
<page string="Pos Variants" name="pos variants"
attrs="{'invisible': [('is_pos_variants','=',False)]}">
<field name="variant_line_ids">
<tree string="Pos Variants" editable="bottom">
<field name="attribute_id"/>
<field name="value_ids" widget="many2many_tags"
options="{'no_create_edit': True}"
domain="[('attribute_id', '=', attribute_id)]"
context="{'default_attribute_id': attribute_id}"/>
<field name="extra_price"/>
</tree>
</field>
</page>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save