Browse Source

Oct 18 : [ADD] Initial Commit 'pos_traceability_validation'

pull/254/merge
AjmalCybro 2 years ago
parent
commit
aa00bd8b4e
  1. 55
      pos_traceability_validation/README.rst
  2. 14
      pos_traceability_validation/__init__.py
  3. 31
      pos_traceability_validation/__manifest__.py
  4. 8
      pos_traceability_validation/doc/RELEASE_NOTES.md
  5. 16
      pos_traceability_validation/models/__init__.py
  6. 73
      pos_traceability_validation/models/stock_production_lot.py
  7. 45
      pos_traceability_validation/models/traceability_validation.py
  8. BIN
      pos_traceability_validation/static/description/assets/modules/1.png
  9. BIN
      pos_traceability_validation/static/description/assets/modules/2.png
  10. BIN
      pos_traceability_validation/static/description/assets/modules/3.png
  11. BIN
      pos_traceability_validation/static/description/assets/modules/4.png
  12. BIN
      pos_traceability_validation/static/description/assets/modules/5.png
  13. BIN
      pos_traceability_validation/static/description/assets/modules/6.png
  14. BIN
      pos_traceability_validation/static/description/assets/modules/budget_image.png
  15. BIN
      pos_traceability_validation/static/description/assets/modules/credit_image.png
  16. BIN
      pos_traceability_validation/static/description/assets/modules/employee_image.png
  17. BIN
      pos_traceability_validation/static/description/assets/modules/export_image.png
  18. BIN
      pos_traceability_validation/static/description/assets/modules/gantt_image.png
  19. BIN
      pos_traceability_validation/static/description/assets/modules/quotation_image.png
  20. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos1.png
  21. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos2.png
  22. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_1.png
  23. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_10.png
  24. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_11.png
  25. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_2.png
  26. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_3.png
  27. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_4.png
  28. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_5.png
  29. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_6.png
  30. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_7.png
  31. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_8.png
  32. BIN
      pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_9.png
  33. 460
      pos_traceability_validation/static/description/index.html
  34. 74
      pos_traceability_validation/static/src/js/PoSEditListPopup.js
  35. 37
      pos_traceability_validation/static/src/js/PoSOrderWidget.js
  36. 90
      pos_traceability_validation/static/src/js/PoSProductScreen.js
  37. 74
      pos_traceability_validation/static/src/js/pos_models.js

55
pos_traceability_validation/README.rst

@ -1,15 +1,46 @@
POS Serial Number Validator v15
===============================
.. image:: https://img.shields.io/badge/licence-LGPL--3-green.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
Validate Serial number of a product by checking availability in stock
POS Serial Number Validator
===========================
Validate lot/ Serial number of a product by checking the availability in the stock and duplication of serial number
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html)
Credits
=======
Cybrosys Techno Solutions
Author
------
* Akhilesh N S <odoo@cybrosys.com>
* V13 Sreenath
* V14 Jibin James
* V15 Mily
-------
Developers: (V12) Akhilesh N S,
(V13) Sreenath
(V14) Jibin James
(V15) Mily Shajan, Abhishek E T
Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://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
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

14
pos_traceability_validation/__init__.py

@ -1,11 +1,12 @@
# -*- coding: utf-8 -*-
##############################################################################
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Akhilesh N S(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Abhishek E T (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
@ -14,9 +15,8 @@
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
###############################################################################
from . import models

31
pos_traceability_validation/__manifest__.py

@ -1,11 +1,12 @@
# -*- coding: utf-8 -*-
##############################################################################
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2020-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Akhilesh N S(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Abhishek E T (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
@ -14,29 +15,33 @@
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
###############################################################################
{
'name': 'POS Serial Number Validator',
'version': '15.0.1.0.0',
'version': '15.0.1.1.0.',
'category': 'Point of Sale',
'summary': 'Validate the lot/ serial number of products in PoS',
'description': """Validate the lot/ serial number of a product by checking the
availability in stock and duplication of serial number""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'category': 'Point of Sale',
'summary': """Validate Serial number of a product by checking availability in stock""",
'description': """Validate Serial number of a product by checking availability in stock""",
'depends': ['point_of_sale'],
'depends': ['point_of_sale', 'stock'],
'assets': {
'web.assets_backend': [
'pos_traceability_validation/static/src/js/pos_models.js',
'pos_traceability_validation/static/src/js/PoSEditListPopup.js',
'pos_traceability_validation/static/src/js/PoSOrderWidget.js',
'pos_traceability_validation/static/src/js/PoSProductScreen.js',
],
},
'images': ['static/description/banner.png'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
'application': False
}

8
pos_traceability_validation/doc/RELEASE_NOTES.md

@ -1,7 +1,11 @@
## Module <pos_traceability_validation>
#### 08.04.2021
#### 08.04.2022
#### Version 15.0.1.0.0
#### ADD
Initial Commit for POS Serial Number Validator
Initial Commit
#### 16.10.2023
#### Version 15.0.1.1.0
#### REF
Refactor the module and update the index

16
pos_traceability_validation/models/__init__.py

@ -1,11 +1,12 @@
# -*- coding: utf-8 -*-
##############################################################################
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Akhilesh N S(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Abhishek E T (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
@ -14,9 +15,8 @@
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import traceability_validation
###############################################################################
from . import stock_production_lot

73
pos_traceability_validation/models/stock_production_lot.py

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Abhishek E T (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, models
class StockProductionLot(models.Model):
"""
This class is inherited for adding a new function to validate the lots and
serial numbers.
Methods:
validate_lots(lots):
check and validate the lots and serial numbers for the product
based on the stock location.
"""
_inherit = 'stock.production.lot'
@api.model
def validate_lots(self, lots, product_id, picking_type_id):
""" To check
- the invalid lots/ serial numbers
- duplicate serial numbers
- insufficient stock for the lots or serial numbers.
All these cases are checked based on the product and the stock location
set for the active PoS.
Args:
lots (list[str,..., str]): the lots for validation.
product_id (int): id of the selected product.
picking_type_id (int): id of the operation type added for the PoS.
Returns:
list[str, str] or Bool: True if the lot is valid, else the list of
the string that indicates the exception: 'invalid', 'duplicate' or
'no_stock' with the lot/ serial number.
"""
processed = []
if not product_id:
return ['invalid', 'product']
for lot in lots:
stock_lots = self.sudo().search([
('name', '=', lot), ('product_id', '=', product_id)])
if not stock_lots:
return ['invalid', lot]
picking_type = self.env['stock.picking.type'].sudo().browse(
picking_type_id)
stock_quant = self.env['stock.quant'].sudo().search(
[('location_id', '=', picking_type.default_location_src_id.id),
('lot_id', 'in', stock_lots.ids)])
if (stock_quant and stock_quant.available_quantity > 0
and lot not in processed):
processed.append(lot)
else:
if lot in processed:
return ['duplicate', lot]
return ['no_stock', lot]
return True

45
pos_traceability_validation/models/traceability_validation.py

@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2019-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Akhilesh N S(<http://www.cybrosys.com>)
# you can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from odoo import models, api
class ValidateLotNumber(models.Model):
_name = 'serial_no.validation'
@api.model
def validate_lots(self, lots):
processed = []
LotObj = self.env['stock.production.lot']
for lot in lots:
lot_id = LotObj.search([('name', '=', lot)], limit=1)
try:
if lot_id.product_qty > 0 and lot not in processed:
processed.append(lot)
continue
else:
if lot in processed:
return ['duplicate', lot]
else:
return ['no_stock', lot]
except Exception:
return ['except', lot]
return True

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
pos_traceability_validation/static/description/assets/modules/budget_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

BIN
pos_traceability_validation/static/description/assets/modules/credit_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

BIN
pos_traceability_validation/static/description/assets/modules/employee_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

BIN
pos_traceability_validation/static/description/assets/modules/export_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

BIN
pos_traceability_validation/static/description/assets/modules/gantt_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

BIN
pos_traceability_validation/static/description/assets/modules/quotation_image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
pos_traceability_validation/static/description/assets/screenshots/pos_traceability_validation_9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

460
pos_traceability_validation/static/description/index.html

@ -1,58 +1,53 @@
<div class="container" style="padding: 1rem !important; margin-bottom: 1rem !important;">
<!-- TITLE BAR -->
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between"
style="border-bottom: 1px solid #d5d5d5;">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between" style="border-bottom: 1px solid #d5d5d5;">
<div class="my-3">
<img src="./assets/icons/logo.png" style="width: auto !important; height: 40px !important;">
</div>
<div class="my-3 d-flex align-items-center">
<div
style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<div style="background-color: #7C7BAD !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<i class="fa fa-check mr-1"></i>Community
</div>
<div
style="background-color: #875A7B !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<div style="background-color: #875A7B !important; color: #fff !important; font-weight: 600 !important; padding: 5px 15px 8px !important; margin: 0 5px !important;">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
</div>
<div class="container" style="padding: 0rem 1.5rem 4rem !important">
<div class="row" style="height: 900px !important;">
<div class="col-sm-12 col-md-12 col-lg-12"
style="padding: 4rem 1rem !important; background-color: #714B67 !important; height: 600px !important; border-radius: 20px !important;">
<h1
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #FFFFFF !important; font-size: 3rem !important; text-align: center !important;">
<div class="col-sm-12 col-md-12 col-lg-12" style="padding: 4rem 1rem !important; background-color: #714B67 !important; height: 600px !important; border-radius: 20px !important;">
<!-- APP HERO -->
<h1 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #FFFFFF !important; font-size: 3rem !important; text-align: center !important;">
POS Serial Number Validator</h1>
<p
style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #FFFFFF !important; font-size: 1.4rem !important; text-align: center !important;">
Validate the given Serial number of a product from stock
<p style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #FFFFFF !important; font-size: 1.4rem !important; text-align: center !important;">
This module helps to validate the given Lots/ Serial numbers of a product from PoS
</p>
<img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto" />
<!-- END OF APP HERO -->
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="row">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin-bottom: 2rem !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<h2 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-compass mr-2"></i>Explore this module
</h2>
</div>
<div class="col-md-6">
<a href="#overview" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="row" style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Overview</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
Learn more about this module</p>
<h3 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">Overview</h3>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
Learn more about this module
</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
@ -62,15 +57,12 @@
</div>
<div class="col-md-6">
<a href="#features" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="row" style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Features</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
View features of this module</p>
<h3 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">Features</h3>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
View features of this module
</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
@ -80,15 +72,12 @@
</div>
<div class="col-md-6">
<a href="#screenshots" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="row" style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Screenshots</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
See key screenshots of this module</p>
<h3 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">Screenshots</h3>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
See key screenshots of this module
</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
@ -97,45 +86,39 @@
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="row" id="overview">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<h2 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-pie-chart mr-2"></i>Overview
</h2>
</div>
<div class="col-mg-12 pl-3">
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important; line-height: 30px !important;">
Currently in Odoo, Serial number validation at POS not available. This module validates given serial number is available in stock and prevent duplicated entry for more than one quantity.
</p>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important; line-height: 30px !important;">
In Odoo, lots/ serial number validation is not available in the Point of Sale. This module checks whether the given lots/ serial numbers are available in stock or not, and prevents the duplicated entry.
</p>
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="row" id="features">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<h2 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-star mr-2"></i>Features
</h2>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Community &amp; Enterprise Support</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Available in Odoo 15.0 Community and Enterprise.</p>
<h4 style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Community &amp; Enterprise Support</h4>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Available in Odoo 15.0 Community and Enterprise.
</p>
</div>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
@ -143,379 +126,333 @@
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Validates given serial number is available in stock</h4>
<h4 style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Validates Given Lots/ Serial Number From PoS</h4>
</div>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Prevents duplicated entry for more than one quantity</h4>
<h4 style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Prevents Duplicated Entry Of Lots/ Serial Numbers</h4>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="row" id="screenshots">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<h2 style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-image mr-2"></i>Screenshots
</h2>
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Enable lots & serial numbers</h4>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
The user with Administration Settings access and Administrator access to inventory can enable the setting.
</p>
<img src="assets/screenshots/pos_traceability_validation_1.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Add the users to the group Manage Lots / Serial Numbers to use lots & serial numbers.
</p>
<img src="assets/screenshots/pos_traceability_validation_2.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Navigate to Inventory / Configuration / Settings and enable the setting Lots & Serial Numbers from the Traceability section.
</p>
<img src="assets/screenshots/pos_traceability_validation_3.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Enable tracking for the products</h4>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
The traceability of the products are managed in the product form view, under the Inventory tab. Check if the Tracking option is enabled and select the By Unique Serial Number Or By Lots option.
</p>
<img src="assets/screenshots/pos_traceability_validation_4.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Add lot or serial numbers for products in stock</h4>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Confirm that the product Lot/ Serial Number is added to the on-hand quantity in the location which is set as the source location for the PoS.
</p>
<img src="assets/screenshots/pos_traceability_validation_5.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">The Pop-up will be displayed to add the lot/ serial number on selecting the products with traceability.</h4>
<img src="assets/screenshots/pos_traceability_validation_6.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-2">
<h4 class="mt-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Warnings for invalid Serial Number</h4>
<img src="assets/screenshots/pos1.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
<h4 class="mt-2" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Warning for invalid lot/ serial number</h4>
<img src="assets/screenshots/pos_traceability_validation_7.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Warnings for Duplicate Serial Number</h4>
<img src="assets/screenshots/pos2.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Warning if the product is out of stock</h4>
<img src="assets/screenshots/pos_traceability_validation_8.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3" style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">Warning for duplicate serial number</h4>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
It is possible to add multiple serial numbers for the selected product from the order line.
</p>
<img src="assets/screenshots/pos_traceability_validation_9.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
A validation is added to avoid adding duplicate serial numbers.
</p>
<img src="assets/screenshots/pos_traceability_validation_10.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
A warning will be displayed in this case.
</p>
<img src="assets/screenshots/pos_traceability_validation_11.png" class="img-responsive img-thumbnail border" width="100%" height="auto" />
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- SUGGESTED PRODUCTS -->
<!-- RELATED PRODUCTS -->
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<div class="col-lg-12 d-flex flex-column justify-content-center" style="text-align: center; padding: 2.5rem 1rem !important;">
<h2 style="color: #212529 !important;">Suggested Products</h2>
<hr
style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<hr style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height:0px">
<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/export_stockinfo_xls/" target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/dashboard_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/export_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" 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/15.0/custom_gantt_view/" target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_report_generator/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/gantt_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" 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/15.0/sales_credit_limit/" target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_book_order/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/credit_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height:0px">
<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/base_account_budget/" target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_mrp_order/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/budget_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" 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/15.0/product_to_quotation/" target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_restrict/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/quotation_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" 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/15.0/employee_documents_expiry/"
target="_blank">
<a href="https://apps.odoo.com/apps/modules/15.0/product_multi_uom_pos/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/employee_image.png">
<img class="img img-responsive center-block" style="border-top-left-radius:10px; border-top-right-radius:10px" 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="left:-25px;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="right:-25px;width: 35px;color: #000;">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
style="font-size:24px"></i></span>
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="left:-25px;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="right:-25px;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 SUGGESTED PRODUCTS -->
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Services</h2>
<hr
style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<hr style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
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;">
<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>
Odoo Licensing Consultancy
</h6>
</div>
</div>
</section>
<!-- END OF END OF OUR SERVICES -->
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Our Industries</h2>
<hr
style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<hr style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="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
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
Easily procure and sell your products
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="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
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
Easy configuration and convivial experience
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="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>
A platform for educational management
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="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>
Plan, track and schedule your operations
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="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
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
Mobile friendly, awe-inspiring product pages
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="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
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
Keep track of services and invoice
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5
style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="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>
Run your bar or restaurant methodically
</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<div class="my-4 d-flex flex-column justify-content-center" style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5
style="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
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
An all-inclusive hotel management application
</p>
</div>
</div>
</div>
</section>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- END OF OUR INDUSTRIES -->
<!-- FOOTER -->
<!-- Footer Section -->
@ -523,32 +460,25 @@
<div class="row" style="max-width:1540px;">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 style="color: #212529 !important;">Need Help?</h2>
<hr
style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;" />
<hr style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
</div>
</div>
<!-- Contact Cards -->
<div class="row d-flex justify-content-center align-items-center"
style="max-width:1540px; margin: 0 auto 2rem auto;">
<div class="row d-flex justify-content-center align-items-center" style="max-width:1540px; margin: 0 auto 2rem auto;">
<div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; ">
<div class="row mt-4">
<div class="col-lg-6">
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;"><i
class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a>
<a href="mailto:odoo@cybrosys.com" target="_blank" class="btn btn-block mb-2 deep_hover" style="text-decoration: none; background-color: #4d4d4d; color: #FFF; border-radius: 4px;">
<i class="fa fa-envelope mr-2"></i>odoo@cybrosys.com
</a>
</div>
<div class="col-lg-6">
<a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank"
class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #25D366; color: #FFF; border-radius: 4px;"><i
class="fa fa-whatsapp mr-2"></i>WhatsApp</a>
<a href="https://api.whatsapp.com/send?phone=918606827707" target="_blank" class="btn btn-block mb-2 deep_hover" style="text-decoration: none; background-color: #25D366; color: #FFF; border-radius: 4px;">
<i class="fa fa-whatsapp mr-2"></i>WhatsApp
</a>
</div>
</div>
</div>
</div>
<!-- End of Contact Cards -->
</section>
@ -557,16 +487,14 @@
<div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
<!-- Logo -->
<div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;">
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" />
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto"/>
</div>
<!-- End of Logo -->
<div class="col-lg-12">
<hr
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<hr style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<!-- End of Footer Section -->
</div>
</div>
</section>
<!-- END OF FOOTER -->
</div>

74
pos_traceability_validation/static/src/js/PoSEditListPopup.js

@ -0,0 +1,74 @@
odoo.define('pos_traceability_validation.PoSEditListPopup', function (require) {
'use strict';
const EditListPopup = require('point_of_sale.EditListPopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
var rpc = require('web.rpc');
/**
* Extends EditListPopup for adding functionality for lot/ serial number
* validation
*/
const PoSEditListPopup = (EditListPopup) =>
class extends EditListPopup {
constructor() {
super(...arguments);
this.product = this.props.product;
}
/**
* On confirming from the popup after adding lots/ serial numbers,
* the values are passed to the function validate_lots() for the
* validation. The corresponding error messages will be displayed
* on the popup if the lot is invalid or duplicated, or there is
* no insufficient stock.
*/
async confirm() {
if (this.props.title == 'Lot/Serial Number(s) Required') {
var lot_string = this.state.array;
var lot_names = [];
for (var i = 0; i < lot_string.length; i++) {
if (lot_string[i].text != '') {
lot_names.push(lot_string[i].text);
}
}
const picking_type_id = this.env.pos.config && this.env.pos.config.picking_type_id && this.env.pos.config.picking_type_id[0]
const result = await rpc.query({
model: 'stock.production.lot',
method: 'validate_lots',
args: [lot_names, this.props.product, picking_type_id]
})
if (result != true) {
if(result[0] == 'no_stock') {
this.showPopup('ErrorPopup', {
'title': _lt('Out of stock'),
'body': _lt('The product is out of stock for ' + result[1] + '.')
});
} else if(result[0] == 'duplicate') {
this.showPopup('ErrorPopup', {
'title': _lt('Duplicate Serial Number'),
'body': _lt('Duplicate entry for ' + result[1] + '.')
});
} else if(result[0] == 'invalid') {
this.showPopup('ErrorPopup', {
'title': _lt('Invalid Lot/ Serial Number'),
'body': _lt('The Lot/ Serial Number ' + result[1] + ' is not available for this product.')
});
}
} else {
this.props.resolve({
confirmed: true,
payload: await this.getPayload()
});
this.trigger('close-popup');
}
} else {
this.props.resolve({
confirmed: true,
payload: await this.getPayload()
});
this.trigger('close-popup');
}
}
};
Registries.Component.extend(EditListPopup, PoSEditListPopup);
return EditListPopup;
});

37
pos_traceability_validation/static/src/js/PoSOrderWidget.js

@ -0,0 +1,37 @@
odoo.define('pos_traceability_validation.PoSOrderWidget', function (require) {
'use strict';
const OrderWidget = require('point_of_sale.OrderWidget');
const Registries = require('point_of_sale.Registries');
/**
* Extends OrderWidget for passing the product IDs to the EditListPopup
* validation
*/
const PoSOrderWidget = (OrderWidget) =>
class extends OrderWidget {
async _editPackLotLines(event) {
const orderline = event.detail.orderline;
const isAllowOnlyOneLot = orderline.product.isAllowOnlyOneLot();
const packLotLinesToEdit = orderline.getPackLotLinesToEdit(isAllowOnlyOneLot);
const { confirmed, payload } = await this.showPopup('EditListPopup', {
title: this.env._t('Lot/Serial Number(s) Required'),
isSingleItem: isAllowOnlyOneLot,
array: packLotLinesToEdit,
product: orderline.product.id
});
if (confirmed) {
// Segregate the old and new packlot lines
const modifiedPackLotLines = Object.fromEntries(
payload.newArray.filter(item => item.id).map(item => [item.id, item.text])
);
const newPackLotLines = payload.newArray
.filter(item => !item.id)
.map(item => ({ lot_name: item.text }));
orderline.setPackLotLines({ modifiedPackLotLines, newPackLotLines });
}
this.order.select_orderline(event.detail.orderline);
}
}
Registries.Component.extend(OrderWidget, PoSOrderWidget);
return OrderWidget;
});

90
pos_traceability_validation/static/src/js/PoSProductScreen.js

@ -0,0 +1,90 @@
odoo.define('pos_traceability_validation.PoSProductScreen', function (require) {
'use strict';
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
/**
* Extends ProductScreen for passing the product ID to the EditListPopup
* validation
*/
const PoSProductScreen = (ProductScreen) =>
class extends ProductScreen {
async _getAddProductOptions(product, base_code) {
let price_extra = 0.0;
let draftPackLotLines, weight, description, packLotLinesToEdit;
if (this.env.pos.config.product_configurator && _.some(product.attribute_line_ids, (id) => id in this.env.pos.attributes_by_ptal_id)) {
let attributes = _.map(product.attribute_line_ids, (id) => this.env.pos.attributes_by_ptal_id[id])
.filter((attr) => attr !== undefined);
let { confirmed, payload } = await this.showPopup('ProductConfiguratorPopup', {
product: product,
attributes: attributes,
});
if (confirmed) {
description = payload.selected_attributes.join(', ');
price_extra += payload.price_extra;
} else {
return;
}
}
// Gather lot information if required.
if (['serial', 'lot'].includes(product.tracking) && (this.env.pos.picking_type.use_create_lots || this.env.pos.picking_type.use_existing_lots)) {
const isAllowOnlyOneLot = product.isAllowOnlyOneLot();
if (isAllowOnlyOneLot) {
packLotLinesToEdit = [];
} else {
const orderline = this.currentOrder
.get_orderlines()
.filter(line => !line.get_discount())
.find(line => line.product.id === product.id);
if (orderline) {
packLotLinesToEdit = orderline.getPackLotLinesToEdit();
} else {
packLotLinesToEdit = [];
}
}
const { confirmed, payload } = await this.showPopup('EditListPopup', {
title: this.env._t('Lot/Serial Number(s) Required'),
isSingleItem: isAllowOnlyOneLot,
array: packLotLinesToEdit,
product: product.id
});
if (confirmed) {
// Segregate the old and new packlot lines
const modifiedPackLotLines = Object.fromEntries(
payload.newArray.filter(item => item.id).map(item => [item.id, item.text])
);
const newPackLotLines = payload.newArray
.filter(item => !item.id)
.map(item => ({ lot_name: item.text }));
draftPackLotLines = { modifiedPackLotLines, newPackLotLines };
} else {
// We don't proceed on adding product.
return;
}
}
// Take the weight if necessary.
if (product.to_weight && this.env.pos.config.iface_electronic_scale) {
// Show the ScaleScreen to weigh the product.
if (this.isScaleAvailable) {
const { confirmed, payload } = await this.showTempScreen('ScaleScreen', {
product,
});
if (confirmed) {
weight = payload.weight;
} else {
// do not add the product;
return;
}
} else {
await this._onScaleNotAvailable();
}
}
if (base_code && this.env.pos.db.product_packaging_by_barcode[base_code.code]) {
weight = this.env.pos.db.product_packaging_by_barcode[base_code.code].qty;
}
return { draftPackLotLines, quantity: weight, description, price_extra };
}
}
Registries.Component.extend(ProductScreen, PoSProductScreen);
return ProductScreen;
});

74
pos_traceability_validation/static/src/js/pos_models.js

@ -1,74 +0,0 @@
odoo.define('pos_traceability_validation.pos_models', function (require) {
"use strict";
const EditListPopup = require('point_of_sale.EditListPopup');
const Registries = require('point_of_sale.Registries');
var rpc = require('web.rpc');
const PosEditlistpopup = (EditListPopup) =>
class extends EditListPopup {
async confirm() {
if (this.props.title == 'Lot/Serial Number(s) Required'){
var lot_string = this.state.array
var lot_names = [];
for (var i = 0; i < lot_string.length; i++) {
if (lot_string[i].text != ""){
lot_names.push(lot_string[i].text);
}
}
const result = await rpc.query({
model: 'serial_no.validation',
method: 'validate_lots',
args: [lot_names]
})
if(result != true){
if(result[0] == 'no_stock'){
this.showPopup('ErrorPopup', {
'title': this.env._t('Insufficient stock'),
'body': this.env._t("Insufficient stock for " + result[1]),
});
}
else if(result[0] == 'duplicate'){
this.showPopup('ErrorPopup', {
'title': this.env._t('Duplicate entry'),
'body': this.env._t("Duplicate entry for " + result[1]),
});
}
else if(result[0] == 'except'){
alert("Exception occured with " + result[1])
this.showPopup('ErrorPopup', {
'title': this.env._t('Exception'),
'body': this.env._t("Exception occured with" + result[1]),
});
}
}
else{
this.props.resolve({ confirmed: true, payload: await this.getPayload() });
this.trigger('close-popup');
}
}
else{
this.props.resolve({ confirmed: true, payload: await this.getPayload() });
this.trigger('close-popup');
}
}
};
Registries.Component.extend(EditListPopup, PosEditlistpopup);
return EditListPopup;
});
Loading…
Cancel
Save