Browse Source

[ADD] Initial Commit 'advanced_pos_reports'

pull/192/merge
Ajmal Cybro 3 years ago
parent
commit
603dfd828f
  1. 2
      advanced_pos_reports/__init__.py
  2. 87
      advanced_pos_reports/__manifest__.py
  3. 8
      advanced_pos_reports/models/__init__.py
  4. 79
      advanced_pos_reports/models/pos_ongoing_session_report.py
  5. 129
      advanced_pos_reports/models/pos_order.py
  6. 84
      advanced_pos_reports/models/pos_posted_session_report.py
  7. 107
      advanced_pos_reports/models/pos_sale_report.py
  8. 34
      advanced_pos_reports/models/pos_top_selling_categories.py
  9. 31
      advanced_pos_reports/models/pos_top_selling_customers.py
  10. 35
      advanced_pos_reports/models/pos_top_selling_products.py
  11. 5
      advanced_pos_reports/security/ir.model.access.csv
  12. BIN
      advanced_pos_reports/static/description/assets/icons/check.png
  13. BIN
      advanced_pos_reports/static/description/assets/icons/chevron.png
  14. BIN
      advanced_pos_reports/static/description/assets/icons/cogs.png
  15. BIN
      advanced_pos_reports/static/description/assets/icons/consultation.png
  16. BIN
      advanced_pos_reports/static/description/assets/icons/ecom-black.png
  17. BIN
      advanced_pos_reports/static/description/assets/icons/education-black.png
  18. BIN
      advanced_pos_reports/static/description/assets/icons/hotel-black.png
  19. BIN
      advanced_pos_reports/static/description/assets/icons/license.png
  20. BIN
      advanced_pos_reports/static/description/assets/icons/lifebuoy.png
  21. BIN
      advanced_pos_reports/static/description/assets/icons/logo.png
  22. BIN
      advanced_pos_reports/static/description/assets/icons/manufacturing-black.png
  23. BIN
      advanced_pos_reports/static/description/assets/icons/pos-black.png
  24. BIN
      advanced_pos_reports/static/description/assets/icons/puzzle.png
  25. BIN
      advanced_pos_reports/static/description/assets/icons/restaurant-black.png
  26. BIN
      advanced_pos_reports/static/description/assets/icons/service-black.png
  27. BIN
      advanced_pos_reports/static/description/assets/icons/trading-black.png
  28. BIN
      advanced_pos_reports/static/description/assets/icons/training.png
  29. BIN
      advanced_pos_reports/static/description/assets/icons/update.png
  30. BIN
      advanced_pos_reports/static/description/assets/icons/user.png
  31. BIN
      advanced_pos_reports/static/description/assets/icons/wrench.png
  32. BIN
      advanced_pos_reports/static/description/assets/modules/budget_image.png
  33. BIN
      advanced_pos_reports/static/description/assets/modules/credit_image.png
  34. BIN
      advanced_pos_reports/static/description/assets/modules/employee_image.png
  35. BIN
      advanced_pos_reports/static/description/assets/modules/export_image.png
  36. BIN
      advanced_pos_reports/static/description/assets/modules/gantt_image.png
  37. BIN
      advanced_pos_reports/static/description/assets/modules/quotation_image.png
  38. BIN
      advanced_pos_reports/static/description/assets/screenshots/hero.gif
  39. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_1.png
  40. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_10.png
  41. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_11.png
  42. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_12.png
  43. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_13.png
  44. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_14.png
  45. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_14_1.png
  46. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_16.png
  47. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_17.png
  48. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_18.png
  49. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_19.png
  50. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_2.png
  51. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_20.png
  52. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_21.png
  53. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_22.png
  54. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_23.png
  55. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_24.png
  56. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_25.png
  57. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_26.png
  58. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_27.png
  59. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_28.png
  60. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_29.png
  61. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_3.png
  62. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_30.png
  63. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_31.png
  64. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_32.png
  65. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_33.png
  66. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_34.png
  67. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_35.png
  68. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_4.png
  69. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_5.png
  70. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_6.png
  71. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_7.png
  72. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_8.png
  73. BIN
      advanced_pos_reports/static/description/assets/screenshots/pos_report_9.png
  74. BIN
      advanced_pos_reports/static/description/banner.png
  75. BIN
      advanced_pos_reports/static/description/icon.png
  76. 850
      advanced_pos_reports/static/description/index.html
  77. 1
      advanced_pos_reports/static/src/css/advanced_report.css
  78. 30
      advanced_pos_reports/static/src/js/ControlButtons/CategorySummaryButton.js
  79. 35
      advanced_pos_reports/static/src/js/ControlButtons/LocationSummaryButton.js
  80. 37
      advanced_pos_reports/static/src/js/ControlButtons/OrderSummaryButton.js
  81. 30
      advanced_pos_reports/static/src/js/ControlButtons/PaymentSummaryButton.js
  82. 37
      advanced_pos_reports/static/src/js/ControlButtons/ProductSummaryButton.js
  83. 35
      advanced_pos_reports/static/src/js/ControlButtons/SessionSummaryButton.js
  84. 68
      advanced_pos_reports/static/src/js/Popups/CategorySummaryPopup.js
  85. 38
      advanced_pos_reports/static/src/js/Popups/LocationSummaryPopup.js
  86. 79
      advanced_pos_reports/static/src/js/Popups/OrderSummaryPopup.js
  87. 84
      advanced_pos_reports/static/src/js/Popups/PaymentSummaryPopup.js
  88. 69
      advanced_pos_reports/static/src/js/Popups/ProductSummaryPopup.js
  89. 39
      advanced_pos_reports/static/src/js/Popups/SessionSummaryPopup.js
  90. 32
      advanced_pos_reports/static/src/js/ReceiptScreen/CategorySummaryReceiptScreen.js
  91. 32
      advanced_pos_reports/static/src/js/ReceiptScreen/LocationSummaryReceiptScreen.js
  92. 32
      advanced_pos_reports/static/src/js/ReceiptScreen/OrderSummaryReceiptScreen.js
  93. 31
      advanced_pos_reports/static/src/js/ReceiptScreen/PaymentSummaryReceiptScreen.js
  94. 31
      advanced_pos_reports/static/src/js/ReceiptScreen/ProductSummaryReceiptScreen.js
  95. 31
      advanced_pos_reports/static/src/js/ReceiptScreen/SessionSummaryReceiptScreen.js
  96. 27
      advanced_pos_reports/static/src/js/Receipts/CategorySummaryReceipt.js
  97. 27
      advanced_pos_reports/static/src/js/Receipts/LocationSummaryReceipt.js
  98. 30
      advanced_pos_reports/static/src/js/Receipts/OrderSummaryReceipt.js
  99. 30
      advanced_pos_reports/static/src/js/Receipts/PaymentSummaryReceipt.js
  100. 27
      advanced_pos_reports/static/src/js/Receipts/ProductSummaryReceipt.js

2
advanced_pos_reports/__init__.py

@ -0,0 +1,2 @@
from . import wizard
from . import models

87
advanced_pos_reports/__manifest__.py

@ -0,0 +1,87 @@
# -*- coding: utf-8 -*-
######################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# This program is under the terms of the Odoo Proprietary License v1.0 (OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the Software
# or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
########################################################################################
{
'name': 'Advanced POS Reports',
'version': '15.0.1.0.0',
'summary': """Generates Various Reports From POS Screen and From Reporting Menu""",
'description': """Generates various reports like Sales summary, top selling products / categories /
customers report, ongoing sessions report, posted sessions report under reporting menu, """,
'category': 'Sale',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'depends': ['point_of_sale', 'pos_sale'],
'website': 'https://www.cybrosys.com',
'data': [
'security/ir.model.access.csv',
'wizard/pos_sale_details.xml',
'wizard/top_selling.xml',
'wizard/ongoing_session.xml',
'wizard/posted_session.xml',
'wizard/top_selling.xml',
'views/reports.xml',
'views/report_pos_saledetails.xml',
'views/report_pos_posted_session.xml',
'views/report_pos_ongoing_session.xml',
'views/report_pos_top_selling_products.xml',
'views/report_pos_top_selling_categories.xml',
'views/report_pos_top_selling_customers.xml',
],
'assets': {
'point_of_sale.assets': [
'advanced_pos_reports/static/src/js/ControlButtons/PaymentSummaryButton.js',
'advanced_pos_reports/static/src/js/ControlButtons/ProductSummaryButton.js',
'advanced_pos_reports/static/src/js/ControlButtons/CategorySummaryButton.js',
'advanced_pos_reports/static/src/js/ControlButtons/LocationSummaryButton.js',
'advanced_pos_reports/static/src/js/ControlButtons/OrderSummaryButton.js',
'advanced_pos_reports/static/src/js/ControlButtons/SessionSummaryButton.js',
'advanced_pos_reports/static/src/js/Popups/LocationSummaryPopup.js',
'advanced_pos_reports/static/src/js/Popups/CategorySummaryPopup.js',
'advanced_pos_reports/static/src/js/Popups/OrderSummaryPopup.js',
'advanced_pos_reports/static/src/js/Popups/PaymentSummaryPopup.js',
'advanced_pos_reports/static/src/js/Popups/ProductSummaryPopup.js',
'advanced_pos_reports/static/src/js/Popups/SessionSummaryPopup.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/LocationSummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/CategorySummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/OrderSummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/PaymentSummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/ProductSummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/ReceiptScreen/SessionSummaryReceiptScreen.js',
'advanced_pos_reports/static/src/js/Receipts/OrderSummaryReceipt.js',
'advanced_pos_reports/static/src/js/Receipts/PaymentSummaryReceipt.js',
'advanced_pos_reports/static/src/js/Receipts/ProductSummaryReceipt.js',
'advanced_pos_reports/static/src/js/Receipts/CategorySummaryReceipt.js',
'advanced_pos_reports/static/src/js/Receipts/SessionSummaryReceipt.js',
'advanced_pos_reports/static/src/js/Receipts/LocationSummaryReceipt.js',
'advanced_pos_reports/static/src/css/advanced_report.css',
],
'web.assets_qweb': [
'advanced_pos_reports/static/src/xml/**/*',
],
},
'images': ['static/description/banner.png'],
'license': 'OPL-1',
'installable': True,
'auto_install': False,
'application': False,
}

8
advanced_pos_reports/models/__init__.py

@ -0,0 +1,8 @@
from . import pos_sale_report
from . import pos_posted_session_report
from . import pos_ongoing_session_report
from . import pos_order
from . import pos_top_selling_products
from . import pos_top_selling_categories
from . import pos_top_selling_customers

79
advanced_pos_reports/models/pos_ongoing_session_report.py

@ -0,0 +1,79 @@
from odoo import api, fields, models
from odoo.osv.expression import AND
class ReportPosOngoing(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_ongoing_session'
def get_ongoing_sessions_details(self, session_ids=False):
domain = [('state', '=', 'opened')]
if session_ids:
domain = AND([domain, [('id', 'in', session_ids)]])
sessions = self.env['pos.session'].search(domain)
amount_total_without_tax = 0
amount_total_tax = 0
amount_total_return = 0
orders = []
for session in sessions:
for order in session.order_ids.filtered(lambda x:x.state in ['paid', 'done', 'invoiced']):
orders.append(order.id)
currency = order.pricelist_id.currency_id
amount_tax = currency.round(sum(order._amount_line_tax(line, order.fiscal_position_id) for line in order.lines))
amount_untaxed = currency.round(sum(line.price_subtotal for line in order.lines))
amount_return = sum(payment.amount < 0 and payment.amount or 0 for payment in order.payment_ids)
amount_total_without_tax += amount_untaxed
amount_total_tax += amount_tax
amount_total_return += amount_return
order_ids = self.env["pos.order"].search([('id', 'in', orders)])
user_currency = self.env.company.currency_id
total = 0.0
for order in order_ids:
if user_currency != order.pricelist_id.currency_id:
total += order.pricelist_id.currency_id._convert(
order.amount_total, user_currency, order.company_id, order.date_order or fields.Date.today())
else:
total += order.amount_total
currency = order.session_id.currency_id
categories = []
if order_ids:
self.env.cr.execute("""SELECT category.name,
sum(price_subtotal_incl) as amount FROM pos_order_line AS line,
pos_category AS category, product_product AS product INNER JOIN
product_template AS template ON product.product_tmpl_id = template.id WHERE line.product_id = product.id
AND template.pos_categ_id = category.id
AND line.order_id IN %s GROUP BY category.name """, (tuple(order_ids.ids),))
categories = self.env.cr.dictfetchall()
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', order_ids.ids)]).ids
if payment_ids:
self.env.cr.execute("""
SELECT method.name, sum(amount) total
FROM pos_payment AS payment,
pos_payment_method AS method
WHERE payment.payment_method_id = method.id
AND payment.id IN %s
GROUP BY method.name
""", (tuple(payment_ids),))
payments = self.env.cr.dictfetchall()
else:
payments = []
amount_total = amount_total_without_tax + amount_tax
return {
'sessions': sessions,
'categories': categories,
'today': fields.Datetime.now(),
'total_paid': user_currency.round(total),
'amount_total_without_tax': amount_total_without_tax,
'amount_total_tax': amount_total_tax,
'amount_return': amount_total_return,
'amount_total': total,
'payments': payments
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
data.update(self.get_ongoing_sessions_details(data['session_ids']))
return data

129
advanced_pos_reports/models/pos_order.py

@ -0,0 +1,129 @@
import logging
from odoo import models
_logger = logging.getLogger(__name__)
class PosOrder(models.Model):
_inherit = 'pos.order'
def get_category_summary(self, order_ids):
orders = self.env['pos.order'].search([('id', 'in', order_ids)])
categories = []
if orders:
self.env.cr.execute("""SELECT category.name, sum(price_subtotal_incl) as amount,
sum(qty) as qty FROM pos_order_line AS line INNER JOIN
product_product AS product ON line.product_id = product.id INNER JOIN
product_template AS template ON product.product_tmpl_id = template.id
INNER JOIN pos_category as category ON template.pos_categ_id = category.id
WHERE line.order_id IN %s GROUP BY category.name """, (tuple(orders.ids),))
categories = self.env.cr.dictfetchall()
return categories
def get_product_summary(self, order_ids):
orders = self.env['pos.order'].search([('id', 'in', order_ids)])
if orders:
self.env.cr.execute("""
SELECT product.id, template.name, product.default_code as code, sum(qty) as qty
FROM product_product AS product,
pos_order_line AS line, product_template AS template
WHERE product.id = line.product_id AND template.id = product.product_tmpl_id
AND line.order_id IN %s
GROUP BY product.id, template.name, template.default_code
""", (tuple(orders.ids),))
product_summary = self.env.cr.dictfetchall()
else:
product_summary = []
return product_summary
def get_order_summary(self, order_ids):
orders = self.env['pos.order'].search([('id', 'in', order_ids)])
order_summary = []
for order in orders:
order_summary.append(
{'order_name': order.name, 'state': dict(self._fields['state'].selection).get(order.state),
'date_order': order.date_order, 'amount_total': order.amount_total})
return order_summary
class PosPayment(models.Model):
_inherit = 'pos.payment'
def get_payment_summary(self, order_ids):
orders = self.env['pos.order'].search([('id', 'in', order_ids)])
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', orders.ids)]).ids
if payment_ids:
self.env.cr.execute("""
SELECT method.name, sum(amount) total
FROM pos_payment AS payment,
pos_payment_method AS method
WHERE payment.payment_method_id = method.id
AND payment.id IN %s
GROUP BY method.name
""", (tuple(payment_ids),))
payments_summary = self.env.cr.dictfetchall()
else:
payments_summary = []
return payments_summary
class PosSession(models.Model):
_inherit = 'pos.session'
def get_session_summary(self, session):
if session:
session = self.env['pos.session'].search([('id', '=', session)])
order_ids = session.order_ids
if order_ids:
self.env.cr.execute("""
SELECT product.id, template.name, product.default_code as code, sum(qty) as qty, sum(line.price_subtotal_incl) as total
FROM product_product AS product,
pos_order_line AS line, product_template AS template
WHERE product.id = line.product_id AND template.id = product.product_tmpl_id
AND line.order_id IN %s
GROUP BY product.id, template.name, template.default_code
""", (tuple(order_ids.ids),))
product_summary = self.env.cr.dictfetchall()
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', order_ids.ids)]).ids
if payment_ids:
self.env.cr.execute("""
SELECT method.name, sum(amount) total
FROM pos_payment AS payment,
pos_payment_method AS method
WHERE payment.payment_method_id = method.id
AND payment.id IN %s
GROUP BY method.name
""", (tuple(payment_ids),))
payments_summary = self.env.cr.dictfetchall()
else:
payments_summary = []
else:
product_summary = []
payments_summary = []
session_summary = {
'session_name': session.name,
'start_date': session.start_at,
'end_date': session.stop_at,
'opening_balance': session.cash_register_balance_start,
'closing_balance': session.cash_register_balance_end_real,
'product_summary': product_summary,
'payments_summary': payments_summary
}
return session_summary
class PosConfig(models.Model):
_inherit = 'pos.config'
def get_location_summary(self, location_id):
location_quant = self.env['stock.quant'].search(
[('location_id', '=', int(location_id))])
location_summary = []
for quant in location_quant.filtered(lambda x: x.product_id.available_in_pos):
values = {
'product_id': quant.product_id.id,
'product': quant.product_id.name,
'quantity': quant.available_quantity,
}
location_summary.append(values)
return location_summary

84
advanced_pos_reports/models/pos_posted_session_report.py

@ -0,0 +1,84 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, tools, _
from odoo.osv.expression import AND
class ReportPosPosted(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_posted_session'
def get_posted_sessions_details(self, session_ids=False):
domain = [('state', '=', 'closed')]
if session_ids:
domain = AND([domain, [('id', 'in', session_ids)]])
sessions = self.env['pos.session'].search(domain)
amount_total_without_tax = 0
amount_total_tax = 0
amount_total_return = 0
orders = []
for session in sessions:
for order in session.order_ids.filtered(lambda x: x.state in ['paid', 'done', 'invoiced']):
orders.append(order.id)
currency = order.pricelist_id.currency_id
amount_tax = currency.round(
sum(order._amount_line_tax(line, order.fiscal_position_id) for line in order.lines))
amount_untaxed = currency.round(sum(line.price_subtotal for line in order.lines))
amount_return = sum(payment.amount < 0 and payment.amount or 0 for payment in order.payment_ids)
amount_total_without_tax += amount_untaxed
amount_total_tax += amount_tax
amount_total_return += amount_return
order_ids = self.env["pos.order"].search([('id', 'in', orders)])
user_currency = self.env.company.currency_id
total = 0.0
for order in order_ids:
if user_currency != order.pricelist_id.currency_id:
total += order.pricelist_id.currency_id._convert(
order.amount_total, user_currency, order.company_id, order.date_order or fields.Date.today())
else:
total += order.amount_total
currency = order.session_id.currency_id
categories = []
if order_ids:
self.env.cr.execute("""SELECT category.name,
sum(price_subtotal_incl) as amount FROM pos_order_line AS line,
pos_category AS category, product_product AS product INNER JOIN
product_template AS template ON product.product_tmpl_id = template.id WHERE line.product_id = product.id
AND template.pos_categ_id = category.id
AND line.order_id IN %s GROUP BY category.name """, (tuple(order_ids.ids),))
categories = self.env.cr.dictfetchall()
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', order_ids.ids)]).ids
if payment_ids:
self.env.cr.execute("""
SELECT method.name, sum(amount) total
FROM pos_payment AS payment,
pos_payment_method AS method
WHERE payment.payment_method_id = method.id
AND payment.id IN %s
GROUP BY method.name
""", (tuple(payment_ids),))
payments = self.env.cr.dictfetchall()
else:
payments = []
return {
'sessions': sessions,
'categories': categories,
'today': fields.Datetime.now(),
'total_paid': user_currency.round(total),
'amount_total_without_tax': amount_total_without_tax,
'amount_total_tax': amount_total_tax,
'amount_return': amount_total_return,
'amount_total': total,
'payments': payments
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
data.update(self.get_posted_sessions_details(data['session_ids']))
return data

107
advanced_pos_reports/models/pos_sale_report.py

@ -0,0 +1,107 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from datetime import timedelta
from functools import partial
from itertools import groupby
import psycopg2
import pytz
import re
from odoo import api, fields, models, tools, _
from odoo.tools import float_is_zero, float_round, float_repr, float_compare
from odoo.exceptions import ValidationError, UserError
from odoo.http import request
from odoo.osv.expression import AND
import base64
_logger = logging.getLogger(__name__)
class ReportSaleDetails(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_saledetails'
_description = 'Point of Sale Details'
@api.model
def get_sale_details(self, date_start=False, date_stop=False, user_ids=False):
domain = [('state', 'in', ['paid', 'invoiced', 'done'])]
if date_start:
date_start = fields.Datetime.from_string(date_start)
else:
user_tz = pytz.timezone(self.env.context.get('tz') or self.env.user.tz or 'UTC')
today = user_tz.localize(fields.Datetime.from_string(fields.Date.context_today(self)))
date_start = today.astimezone(pytz.timezone('UTC'))
if date_stop:
date_stop = fields.Datetime.from_string(date_stop)
if (date_stop < date_start):
date_stop = date_start + timedelta(days=1, seconds=-1)
else:
date_stop = date_start + timedelta(days=1, seconds=-1)
domain = AND([domain,
[('date_order', '>=', fields.Datetime.to_string(date_start)),
('date_order', '<=', fields.Datetime.to_string(date_stop))]
])
orders = self.env['pos.order'].search(domain)
orders_summary = []
amount_total = 0
amount_tax = 0
for user in user_ids:
total_sales = 0
total_tax = 0
orders_list = []
payments = []
categories = []
for order in orders.filtered(lambda x:x.user_id.id == user.id):
total_sales += order.amount_total
total_tax += order.amount_tax
amount_total += order.amount_total
amount_tax += order.amount_tax
orders_list.append(order.id)
if orders_list:
payment_ids = self.env["pos.payment"].search([('pos_order_id', 'in', orders_list)]).ids
if payment_ids:
self.env.cr.execute("""
SELECT method.name, sum(amount) total
FROM pos_payment AS payment,
pos_payment_method AS method
WHERE payment.payment_method_id = method.id
AND payment.id IN %s
GROUP BY method.name
""", (tuple(payment_ids),))
payments = self.env.cr.dictfetchall()
else:
payments = []
categ = self.env.cr.execute("""SELECT category.name,
sum(price_subtotal_incl) as amount FROM pos_order_line AS line,
pos_category AS category, product_product AS product INNER JOIN
product_template AS template ON product.product_tmpl_id = template.id
WHERE line.product_id = product.id
AND template.pos_categ_id = category.id
AND line.order_id IN %s
GROUP BY category.name ORDER BY amount DESC
""", (tuple(orders_list),))
categories = self.env.cr.dictfetchall()
orders_summary.append({'user': user.name, 'total_sales': total_sales, 'tax': total_tax,
'gross_total': total_sales, 'payments': payments, 'categories': categories})
user_currency = self.env.company.currency_id
return {
'currency_precision': user_currency.decimal_places,
'order_summary': orders_summary,
'users': user_ids,
'company_name': self.env.company.name,
'amount_total_without_tax': amount_total - amount_tax,
'amount_tax': amount_tax
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
users = self.env['res.users'].browse(data['user_ids'])
data.update(self.get_sale_details(data['date_start'], data['date_stop'], users))
return data

34
advanced_pos_reports/models/pos_top_selling_categories.py

@ -0,0 +1,34 @@
from odoo import api, fields, models, tools, _
from odoo.osv.expression import AND
class ReportPosCategories(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_top_selling_categories'
def get_top_selling_categories_details(self, no_of_categories=False, start_date=False, end_date=False):
order_ids = self.env["pos.order"].search([('date_order', '>=', start_date),
('date_order', '<=', end_date), ('state', 'in', ['paid', 'done', 'invoiced'])])
user_currency = self.env.company.currency_id
if order_ids:
self.env.cr.execute("""SELECT category.name,
sum(price_subtotal_incl) as amount FROM pos_order_line AS line,
pos_category AS category, product_product AS product INNER JOIN
product_template AS template ON product.product_tmpl_id = template.id WHERE line.product_id = product.id
AND template.pos_categ_id = category.id
AND line.order_id IN %s
GROUP BY category.name ORDER BY amount DESC LIMIT %s
""", (tuple(order_ids.ids), no_of_categories))
categories = self.env.cr.dictfetchall()
return {
'categories': categories or [],
'today': fields.Datetime.now(),
'start_date': start_date,
'end_date': end_date
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
data.update(self.get_top_selling_categories_details(data['no_of_categories'], data['start_date'],
data['end_date']))
return data

31
advanced_pos_reports/models/pos_top_selling_customers.py

@ -0,0 +1,31 @@
from odoo import api, fields, models
class ReportPosCustomers(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_top_selling_customers'
def get_top_selling_customers_details(self, no_of_customers=False, start_date=False, end_date=False):
order_ids = self.env["pos.order"].search([('date_order', '>=', start_date),
('date_order', '<=', end_date),
('state', 'in', ['paid', 'done', 'invoiced'])])
user_currency = self.env.company.currency_id
if order_ids:
self.env.cr.execute("""SELECT partner.id, partner.name,
sum(amount_total) as amount FROM pos_order, res_partner AS partner
WHERE partner.id= pos_order.partner_id AND pos_order.id IN %s
GROUP BY partner.id, partner.name ORDER BY amount DESC LIMIT %s
""", (tuple(order_ids.ids), no_of_customers))
customers = self.env.cr.dictfetchall()
return {
'customers': customers or [],
'today': fields.Datetime.now(),
'start_date': start_date,
'end_date': end_date
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
data.update(self.get_top_selling_customers_details(data['no_of_customers'], data['start_date'],
data['end_date']))
return data

35
advanced_pos_reports/models/pos_top_selling_products.py

@ -0,0 +1,35 @@
from odoo import api, fields, models, tools, _
from odoo.osv.expression import AND
class ReportPosProducts(models.AbstractModel):
_name = 'report.advanced_pos_reports.report_pos_top_selling_products'
def get_top_selling_products_details(self, no_of_products=False, start_date=False, end_date=False):
order_ids = self.env["pos.order"].search([('date_order', '>=', start_date),
('date_order', '<=', end_date), ('state', 'in', ['paid', 'done', 'invoiced'])])
user_currency = self.env.company.currency_id
categories = []
if order_ids:
self.env.cr.execute("""
SELECT product.id, template.name, uom.name AS uom, product.default_code as code, sum(qty) as qty, sum(line.price_subtotal_incl) as total
FROM product_product AS product,
pos_order_line AS line, product_template AS template , uom_uom AS uom
WHERE product.id = line.product_id AND template.id = product.product_tmpl_id AND uom.id = template.uom_id
AND line.order_id IN %s
GROUP BY product.id, template.name, template.default_code, uom.name ORDER BY qty DESC LIMIT %s
""", (tuple(order_ids.ids), no_of_products))
product_summary = self.env.cr.dictfetchall()
return {
'products': product_summary,
'today': fields.Datetime.now(),
'start_date': start_date,
'end_date': end_date
}
@api.model
def _get_report_values(self, docids, data=None):
data = dict(data or {})
data.update(self.get_top_selling_products_details(data['no_of_products'], data['start_date'],
data['end_date']))
return data

5
advanced_pos_reports/security/ir.model.access.csv

@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_pos_sale_details_wizard,access.pos.sale.details.wizard,model_pos_sale_details_wizard,point_of_sale.group_pos_manager,1,1,1,0
access_pos_sale_top_selling_wizard,access.pos.sale.top.selling.wizard,model_pos_sale_top_selling,point_of_sale.group_pos_manager,1,1,1,0
access_pos_sale_ongoing,access.pos.sale.ongoing.wizard,model_pos_sale_ongoing_wizard,point_of_sale.group_pos_manager,1,1,1,0
access_pos_sale_posted,access.pos.sale.posted.wizard,model_pos_sale_posted_wizard,point_of_sale.group_pos_manager,1,1,1,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_pos_sale_details_wizard access.pos.sale.details.wizard model_pos_sale_details_wizard point_of_sale.group_pos_manager 1 1 1 0
3 access_pos_sale_top_selling_wizard access.pos.sale.top.selling.wizard model_pos_sale_top_selling point_of_sale.group_pos_manager 1 1 1 0
4 access_pos_sale_ongoing access.pos.sale.ongoing.wizard model_pos_sale_ongoing_wizard point_of_sale.group_pos_manager 1 1 1 0
5 access_pos_sale_posted access.pos.sale.posted.wizard model_pos_sale_posted_wizard point_of_sale.group_pos_manager 1 1 1 0

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
advanced_pos_reports/static/description/assets/icons/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_14_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_20.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_21.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_22.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_23.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_25.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_26.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_27.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_28.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_29.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_30.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_31.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_32.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_33.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_34.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_35.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
advanced_pos_reports/static/description/assets/screenshots/pos_report_9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
advanced_pos_reports/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
advanced_pos_reports/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

850
advanced_pos_reports/static/description/index.html

@ -0,0 +1,850 @@
<div class="container" style="padding: 1rem !important; margin-bottom: 1rem !important;">
<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="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;">
<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;">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
</div>
</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: 3.5rem !important; text-align: center !important;">
Advanced POS Reports</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;">
A Module for printing various POS Reports
</p>
<img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto" />
</div>
</div>
<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;">
<i class="fa fa-compass mr-2"></i>Explore this module
</h2>
<div class="row">
<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="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>
</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>
</div>
</div>
</a>
</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="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>
</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>
</div>
</div>
</a>
</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="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>
</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>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
<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;">
<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;">
In the Advanced POS Reports app, can print various reports like Location Summary, Session Summary, Category Summary,etc. from POS Screen. Sales summary, Top Selling products/ categories / customers report, Ongoing Sessions Report, Posted Sessions Report from the reporting menu.</p>
</div>
</p>
</div>
<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;">
<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;">
Sale Summary report prints user wise sales details</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;">
Ongoing session report gives a summary of ongoing sessions</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;">
Posted session report summarizes the posted sessions de
</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;">
Top selling Products / Categories / Customers Reports</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;">
Payment Summary from POS Screen to get payment details of current session/ All sessions within a period
</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;">
Order Summary from POS Screen to get all order details of current session/ All sessions within a period
</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;">
Category from POS Screen to get category wise sale details current session/ All sessions within a period
</h4>
</div>
</div>
</div>
<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;">
<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;">
Payment Summary from POS Screen</h4>
<img src="assets/screenshots/pos_report_16.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;">
Payment Summary of Selected dates</h4>
<img src="assets/screenshots/pos_report_17.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;">
Payment Summary of current session</h4>
<img src="assets/screenshots/pos_report_18.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_19.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;">
Category Summary from POS Screen</h4>
<img src="assets/screenshots/pos_report_20.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;">
Category Summary of Selected dates</h4>
<img src="assets/screenshots/pos_report_21.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;">
Category Summary of current session</h4>
<img src="assets/screenshots/pos_report_22.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_23.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;">
Reporting Menu</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
The list of custom reports</p>
<img src="assets/screenshots/pos_report_1.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;">
Sales summary</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User can print user wise sales summary within a period.
</p>
<img src="assets/screenshots/pos_report_2.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;">
Sales summary Report</h4>
<img src="assets/screenshots/pos_report_4.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_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;">
Top Selling Products</h4>
<img src="assets/screenshots/pos_report_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;">
Generated Report</h4>
<img src="assets/screenshots/pos_report_6.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;">
Top Selling Categories</h4>
<img src="assets/screenshots/pos_report_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;">
Generated Report</h4>
<img src="assets/screenshots/pos_report_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;">
Top Selling Customers</h4>
<img src="assets/screenshots/pos_report_9.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;">
Generated Report</h4>
<img src="assets/screenshots/pos_report_10.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;">
Ongoing Sessions Report</h4>
<img src="assets/screenshots/pos_report_11.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;">
Generated Ongoing Sessions report</h4>
<img src="assets/screenshots/pos_report_12.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;">
Posted Sessions report</h4>
<img src="assets/screenshots/pos_report_13.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;">
Generated Posted Sessions report</h4>
<img src="assets/screenshots/pos_report_14.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_14_1.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;">
Products Summary</h4>
<img src="assets/screenshots/pos_report_24.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;">
Products Summary of Selected dates</h4>
<img src="assets/screenshots/pos_report_25.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;">
Products Summary of current session</h4>
<img src="assets/screenshots/pos_report_26.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_27.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;">
Order Summary</h4>
<img src="assets/screenshots/pos_report_28.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;">
Order Summary of Selected dates</h4>
<img src="assets/screenshots/pos_report_29.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;">
Order Summary of current session</h4>
<img src="assets/screenshots/pos_report_30.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
<div class="col-lg-12 my-3">
<img src="assets/screenshots/pos_report_31.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;">
Location Summary</h4>
<img src="assets/screenshots/pos_report_32.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;">
Generated Location Summary</h4>
<img src="assets/screenshots/pos_report_33.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;">
Sessions Summary</h4>
<img src="assets/screenshots/pos_report_34.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;">
Generated Sessions Summary</h4>
<img src="assets/screenshots/pos_report_35.png" class="img-responsive img-thumbnail border" width="100%"
height="auto" />
</div>
</div>
<!-- SUGGESTED 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;">
<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;" />
<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">
<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">
</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">
<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">
</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">
<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">
</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">
<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">
</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">
<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">
</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">
<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">
</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>
</div>
</div>
</div>
<!-- END OF SUGGESTED 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;" />
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</section>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<section class="container" style="margin-top: 6rem !important;">
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 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;" />
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="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: 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;">
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: 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>
</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;">
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: 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;">
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: 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;">
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: 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>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 10px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="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>
</section>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- FOOTER -->
<!-- Footer Section -->
<section class="container" style="margin: 5rem auto 2rem;">
<div class="row" style="max-width:1540px;">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center">
<h2 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;" />
</div>
</div>
<!-- Contact Cards -->
<div class="row d-flex justify-content-center align-items-center"
style="max-width:1540px; margin: 0 auto 2rem auto;">
<div class="col-lg-12" style="padding: 0rem 3rem 2rem; border-radius: 10px; margin-right: 3rem; ">
<div class="row mt-4">
<div class="col-lg-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>
</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>+91 86068 27707</a>
</div>
</div>
</div>
</div>
<!-- End of Contact Cards -->
</section>
<!-- Footer -->
<section class="oe_container" style="padding: 2rem 3rem 1rem;">
<div class="row" style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
<!-- Logo -->
<div class="col-lg-12 d-flex justify-content-center align-items-center" style="margin-top: 3rem;">
<img src="https://www.cybrosys.com/images/logo.png" width="200px" height="auto" />
</div>
<!-- End of Logo -->
<div class="col-lg-12">
<hr
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<!-- End of Footer Section -->
</div>
</div>
</section>
<!-- END OF FOOTER -->
</div>

1
advanced_pos_reports/static/src/css/advanced_report.css

@ -0,0 +1 @@

30
advanced_pos_reports/static/src/js/ControlButtons/CategorySummaryButton.js

@ -0,0 +1,30 @@
odoo.define('advanced_pos_reports.CategorySummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class CategorySummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
_onClick() {
this.showPopup('CategorySummaryPopup', { title: 'Category Summary', });
}
}
CategorySummaryButton.template = 'advanced_pos_reports.CategorySummaryButton';
ProductScreen.addControlButton({
component: CategorySummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(CategorySummaryButton);
return CategorySummaryButton;
});

35
advanced_pos_reports/static/src/js/ControlButtons/LocationSummaryButton.js

@ -0,0 +1,35 @@
odoo.define('advanced_pos_reports.LocationSummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class LocationSummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
async _onClick() {
var locations = await this.rpc({
model: 'stock.location',
method: 'search_read',
args: [[['usage', '=', 'internal']]],
});
this.showPopup('LocationSummaryPopup', { title: 'Location Summary', locations: locations });
}
}
LocationSummaryButton.template = 'advanced_pos_reports.LocationSummaryButton';
ProductScreen.addControlButton({
component: LocationSummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(LocationSummaryButton);
return LocationSummaryButton;
});

37
advanced_pos_reports/static/src/js/ControlButtons/OrderSummaryButton.js

@ -0,0 +1,37 @@
odoo.define('advanced_pos_reports.OrderSummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class OrderSummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
_onClick() {
this.showPopup('OrderSummaryPopup', { title: 'Order Summary', });
// const customer = this.env.pos.get_order().get_client();
// const searchDetails = customer ? { fieldName: 'CUSTOMER', searchTerm: customer.name } : {};
// this.trigger('close-popup');
// this.showScreen('TicketScreen', {
// ui: { filter: 'SYNCED', searchDetails },
// destinationOrder: this.env.pos.get_order(),
// });
}
}
OrderSummaryButton.template = 'advanced_pos_reports.OrderSummaryButton';
ProductScreen.addControlButton({
component: OrderSummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(OrderSummaryButton);
return OrderSummaryButton;
});

30
advanced_pos_reports/static/src/js/ControlButtons/PaymentSummaryButton.js

@ -0,0 +1,30 @@
odoo.define('advanced_pos_reports.PaymentSummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class PaymentSummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
_onClick() {
this.showPopup('PaymentSummaryPopup', { title: 'Payment Summary', });
}
}
PaymentSummaryButton.template = 'advanced_pos_reports.PaymentSummaryButton';
ProductScreen.addControlButton({
component: PaymentSummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(PaymentSummaryButton);
return PaymentSummaryButton;
});

37
advanced_pos_reports/static/src/js/ControlButtons/ProductSummaryButton.js

@ -0,0 +1,37 @@
odoo.define('advanced_pos_reports.ProductSummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class ProductSummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
_onClick() {
this.showPopup('ProductSummaryPopup', { title: 'Product Summary', });
// const customer = this.env.pos.get_order().get_client();
// const searchDetails = customer ? { fieldName: 'CUSTOMER', searchTerm: customer.name } : {};
// this.trigger('close-popup');
// this.showScreen('TicketScreen', {
// ui: { filter: 'SYNCED', searchDetails },
// destinationOrder: this.env.pos.get_order(),
// });
}
}
ProductSummaryButton.template = 'advanced_pos_reports.ProductSummaryButton';
ProductScreen.addControlButton({
component: ProductSummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(ProductSummaryButton);
return ProductSummaryButton;
});

35
advanced_pos_reports/static/src/js/ControlButtons/SessionSummaryButton.js

@ -0,0 +1,35 @@
odoo.define('advanced_pos_reports.SessionSummaryButton', function (require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const ProductScreen = require('point_of_sale.ProductScreen');
const Registries = require('point_of_sale.Registries');
const { useListener } = require('web.custom_hooks');
class SessionSummaryButton extends PosComponent {
constructor() {
super(...arguments);
useListener('click', this._onClick);
}
async _onClick() {
var sessions = await this.rpc({
model: 'pos.session',
method: 'search_read',
args: [[]],
});
this.showPopup('SessionSummaryPopup', { title: 'Session Summary', sessions: sessions});
}
}
SessionSummaryButton.template = 'advanced_pos_reports.SessionSummaryButton';
ProductScreen.addControlButton({
component: SessionSummaryButton,
condition: function () {
return true;
},
});
Registries.Component.add(SessionSummaryButton);
return SessionSummaryButton;
});

68
advanced_pos_reports/static/src/js/Popups/CategorySummaryPopup.js

@ -0,0 +1,68 @@
odoo.define('advanced_pos_reports.CategorySummaryPopup', function(require) {
'use strict';
const { useState } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
class CategorySummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
current_session: false,
start_date: "",
end_date: "",
});
}
click_is_session(){
var is_session = $('#is_current_session').is(':checked');
if(is_session){
$("#date_section").hide();
}
else{
$("#date_section").show();
}
}
async confirm(event) {
var is_session = this.state.current_session;
var start_date = this.state.start_date || '';
var end_date = this.state.end_date || '';
var order = this.env.pos.get_order()['sequence_number']
var domain = []
if(is_session){
domain = [['session_id', '=', this.env.pos.pos_session.id]]
}
else{
domain = [['date_order', '>=', start_date + ' 00:00:00'], ['date_order', '<=', end_date + ' 23:59:59']]
}
var orders = await this.rpc({
model: 'pos.order',
method: 'search',
args: [domain],
});
var order_ids = []
$.each(orders,function(index,value){
order_ids.push(value)
});
var categories = await this.rpc({
model: 'pos.order',
method: 'get_category_summary',
args: [order, order_ids],
});
this.showScreen('CategorySummaryReceiptScreen', { categories: categories, start_date: start_date, end_date: end_date});
super.confirm();
}
}
CategorySummaryPopup.template = 'CategorySummaryPopup';
CategorySummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(CategorySummaryPopup);
return CategorySummaryPopup;
});

38
advanced_pos_reports/static/src/js/Popups/LocationSummaryPopup.js

@ -0,0 +1,38 @@
odoo.define('advanced_pos_reports.LocationSummaryPopup', function(require) {
'use strict';
const { useState } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
class LocationSummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
selected_value: ''
});
}
async confirm(event) {
var location = this.state.selected_value;
var locations = await this.rpc({
model: 'pos.config',
method: 'get_location_summary',
args: [this.config_id, location],
});
this.showScreen('LocationSummaryReceiptScreen', { locations: locations});
super.confirm();
}
}
LocationSummaryPopup.template = 'LocationSummaryPopup';
LocationSummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(LocationSummaryPopup);
return LocationSummaryPopup;
});

79
advanced_pos_reports/static/src/js/Popups/OrderSummaryPopup.js

@ -0,0 +1,79 @@
odoo.define('advanced_pos_reports.OrderSummaryPopup', function(require) {
'use strict';
const { useState, useRef } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
class OrderSummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
current_session: false,
start_date: "",
end_date: "",
status: '' || 'draft' || 'paid' || 'done' || 'invoiced' || 'cancel',
});
}
click_is_session(){
var is_session = $('#is_current_session').is(':checked');
if(is_session){
$("#date_section").hide();
}
else{
$("#date_section").show();
}
}
async confirm(event) {
var is_session = this.state.current_session;
var start_date = this.state.start_date || '';
var end_date = this.state.end_date || '';
var status = this.state.status;
var order = this.env.pos.get_order()['sequence_number']
var domain = []
if(is_session){
domain = [['session_id', '=', this.env.pos.pos_session.id]]
if(status){
domain = [['session_id', '=', this.env.pos.pos_session.id], ['state', '=', status]]
}
}
else{
domain = [['date_order', '>=', start_date + ' 00:00:00'],
['date_order', '<=', end_date + ' 23:59:59']]
if(status){
domain = [['date_order', '>=', start_date + ' 00:00:00'],
['date_order', '<=', end_date + ' 23:59:59'],
['state', '=', status]]
}
}
var orders_ids = await this.rpc({
model: 'pos.order',
method: 'search',
args: [domain],
});
var order_ids = []
$.each(orders_ids,function(index,value){
order_ids.push(value)
});
var orders = await this.rpc({
model: 'pos.order',
method: 'get_order_summary',
args: [order, order_ids],
});
this.showScreen('OrderSummaryReceiptScreen', { orders: orders, start_date: start_date, end_date: end_date});
super.confirm();
}
}
OrderSummaryPopup.template = 'OrderSummaryPopup';
OrderSummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(OrderSummaryPopup);
return OrderSummaryPopup;
});

84
advanced_pos_reports/static/src/js/Popups/PaymentSummaryPopup.js

@ -0,0 +1,84 @@
odoo.define('advanced_pos_reports.PaymentSummaryPopup', function(require) {
'use strict';
const { useState } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
class PaymentSummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
current_session: false,
start_date: "",
end_date: "",
summary: '' || 'sales_person' || 'journal',
});
}
click_is_session(){
var is_session = $('#is_current_session').is(':checked');
if(is_session){
$("#date_section").hide();
}
else{
$("#date_section").show();
}
}
async confirm(event) {
var is_session = this.state.current_session;
var start_date = this.state.start_date || '';
var end_date = this.state.end_date || '';
var summary_type = this.state.summary;
var order = this.env.pos.get_order()['sequence_number']
var is_user = false;
if(summary_type === 'sales_person'){
is_user = true
}
var domain = []
if(is_session){
domain = [['session_id', '=', this.env.pos.pos_session.id]]
if(summary_type == 'sales_person'){
domain = [['session_id', '=', this.env.pos.pos_session.id], ['user_id', '=', this.env.pos.user.id]]
}
}
else{
domain = [['date_order', '>=', start_date + ' 00:00:00'],
['date_order', '<=', end_date + ' 23:59:59']]
if(summary_type == 'sales_person'){
domain = [['date_order', '>=', start_date + ' 00:00:00'],
['date_order', '<=', end_date + ' 23:59:59'],
['user_id', '=', this.env.pos.user.id]]
}
}
var orders = await this.rpc({
model: 'pos.order',
method: 'search',
args: [domain],
});
var order_ids = []
$.each(orders,function(index,value){
order_ids.push(value)
});
var payment_summary = await this.rpc({
model: 'pos.payment',
method: 'get_payment_summary',
args: [order, order_ids],
});
this.showScreen('PaymentSummaryReceiptScreen', { payment_summary: payment_summary, start_date: start_date, end_date: end_date, is_user: is_user });
super.confirm();
}
}
PaymentSummaryPopup.template = 'PaymentSummaryPopup';
PaymentSummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(PaymentSummaryPopup);
return PaymentSummaryPopup;
});

69
advanced_pos_reports/static/src/js/Popups/ProductSummaryPopup.js

@ -0,0 +1,69 @@
odoo.define('advanced_pos_reports.ProductSummaryPopup', function(require) {
'use strict';
const { useState } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { _lt } = require('@web/core/l10n/translation');
class ProductSummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
current_session: false,
start_date: "",
end_date: ""
});
}
click_is_session(){
var is_session = $('#is_current_session').is(':checked');
if(is_session){
$("#date_section").hide();
}
else{
$("#date_section").show();
}
}
async confirm(event) {
var is_session = this.state.current_session;
var start_date = this.state.start_date || '';
var end_date = this.state.end_date || '';
var order = this.env.pos.get_order()['sequence_number']
var domain = []
if(is_session){
domain = [['session_id', '=', this.env.pos.pos_session.id]]
}
else{
domain = [['date_order', '>=', start_date + ' 00:00:00'],
['date_order', '<=', end_date + ' 23:59:59']]
}
var orders = await this.rpc({
model: 'pos.order',
method: 'search',
args: [domain],
});
var order_ids = []
$.each(orders,function(index,value){
order_ids.push(value)
});
var products = await this.rpc({
model: 'pos.order',
method: 'get_product_summary',
args: [order, order_ids],
});
this.showScreen('ProductSummaryReceiptScreen', { products: products, start_date: start_date, end_date: end_date});
super.confirm();
}
}
ProductSummaryPopup.template = 'ProductSummaryPopup';
ProductSummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(ProductSummaryPopup);
return ProductSummaryPopup;
});

39
advanced_pos_reports/static/src/js/Popups/SessionSummaryPopup.js

@ -0,0 +1,39 @@
odoo.define('advanced_pos_reports.SessionSummaryPopup', function(require) {
'use strict';
const { useState } = owl.hooks;
const AbstractAwaitablePopup = require('point_of_sale.AbstractAwaitablePopup');
const Registries = require('point_of_sale.Registries');
const { useAutoFocusToLast } = require('point_of_sale.custom_hooks');
const { _lt } = require('@web/core/l10n/translation');
class SessionSummaryPopup extends AbstractAwaitablePopup {
constructor() {
super(...arguments);
this.state = useState({
selected_value: ''
});
}
async confirm(event) {
var session = this.state.selected_value;
var session_summary = await this.rpc({
model: 'pos.session',
method: 'get_session_summary',
args: [this.env.pos.pos_session.id, session],
});
this.showScreen('SessionSummaryReceiptScreen', { session_summary: session_summary});
super.confirm();
}
}
SessionSummaryPopup.template = 'SessionSummaryPopup';
SessionSummaryPopup.defaultProps = {
confirmText: _lt('Print'),
cancelText: _lt('Cancel'),
array: [],
isSingleItem: false,
};
Registries.Component.add(SessionSummaryPopup);
return SessionSummaryPopup;
});

32
advanced_pos_reports/static/src/js/ReceiptScreen/CategorySummaryReceiptScreen.js

@ -0,0 +1,32 @@
odoo.define('advanced_pos_reports.CategorySummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const CategorySummaryReceiptScreen = (AbstractReceiptScreen) => {
class CategorySummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.categorySummary = useRef('category-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
CategorySummaryReceiptScreen.template = 'CategorySummaryReceiptScreen';
return CategorySummaryReceiptScreen;
};
Registries.Component.addByExtending(CategorySummaryReceiptScreen, AbstractReceiptScreen);
return CategorySummaryReceiptScreen;
});

32
advanced_pos_reports/static/src/js/ReceiptScreen/LocationSummaryReceiptScreen.js

@ -0,0 +1,32 @@
odoo.define('advanced_pos_reports.LocationSummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const LocationSummaryReceiptScreen = (AbstractReceiptScreen) => {
class LocationSummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.locationSummary = useRef('location-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
LocationSummaryReceiptScreen.template = 'LocationSummaryReceiptScreen';
return LocationSummaryReceiptScreen;
};
Registries.Component.addByExtending(LocationSummaryReceiptScreen, AbstractReceiptScreen);
return LocationSummaryReceiptScreen;
});

32
advanced_pos_reports/static/src/js/ReceiptScreen/OrderSummaryReceiptScreen.js

@ -0,0 +1,32 @@
odoo.define('advanced_pos_reports.OrderSummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const OrderSummaryReceiptScreen = (AbstractReceiptScreen) => {
class OrderSummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.orderSummary = useRef('order-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
OrderSummaryReceiptScreen.template = 'OrderSummaryReceiptScreen';
return OrderSummaryReceiptScreen;
};
Registries.Component.addByExtending(OrderSummaryReceiptScreen, AbstractReceiptScreen);
return OrderSummaryReceiptScreen;
});

31
advanced_pos_reports/static/src/js/ReceiptScreen/PaymentSummaryReceiptScreen.js

@ -0,0 +1,31 @@
odoo.define('advanced_pos_reports.PaymentSummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const PaymentSummaryReceiptScreen = (AbstractReceiptScreen) => {
class PaymentSummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.paymentSummary = useRef('payment-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
PaymentSummaryReceiptScreen.template = 'PaymentSummaryReceiptScreen';
return PaymentSummaryReceiptScreen;
};
Registries.Component.addByExtending(PaymentSummaryReceiptScreen, AbstractReceiptScreen);
return PaymentSummaryReceiptScreen;
});

31
advanced_pos_reports/static/src/js/ReceiptScreen/ProductSummaryReceiptScreen.js

@ -0,0 +1,31 @@
odoo.define('advanced_pos_reports.ProductSummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const ProductSummaryReceiptScreen = (AbstractReceiptScreen) => {
class ProductSummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.paymentSummary = useRef('product-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
ProductSummaryReceiptScreen.template = 'ProductSummaryReceiptScreen';
return ProductSummaryReceiptScreen;
};
Registries.Component.addByExtending(ProductSummaryReceiptScreen, AbstractReceiptScreen);
return ProductSummaryReceiptScreen;
});

31
advanced_pos_reports/static/src/js/ReceiptScreen/SessionSummaryReceiptScreen.js

@ -0,0 +1,31 @@
odoo.define('advanced_pos_reports.SessionSummaryReceiptScreen', function (require) {
'use strict';
const { Printer } = require('point_of_sale.Printer');
const { is_email } = require('web.utils');
const { useRef, useContext } = owl.hooks;
const { useErrorHandlers, onChangeOrder } = require('point_of_sale.custom_hooks');
const Registries = require('point_of_sale.Registries');
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
const SessionSummaryReceiptScreen = (AbstractReceiptScreen) => {
class SessionSummaryReceiptScreen extends AbstractReceiptScreen {
constructor() {
super(...arguments);
this.paymentSummary = useRef('product-summary');
}
confirm() {
this.showScreen('ProductScreen');
}
async printSummary() {
await this._printReceipt();
}
}
SessionSummaryReceiptScreen.template = 'SessionSummaryReceiptScreen';
return SessionSummaryReceiptScreen;
};
Registries.Component.addByExtending(SessionSummaryReceiptScreen, AbstractReceiptScreen);
return SessionSummaryReceiptScreen;
});

27
advanced_pos_reports/static/src/js/Receipts/CategorySummaryReceipt.js

@ -0,0 +1,27 @@
odoo.define('advanced_pos_reports.CategorySummaryReceipt', function(require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const Registries = require('point_of_sale.Registries');
class CategorySummaryReceipt extends PosComponent {
constructor() {
super(...arguments);
this._categorySummaryEnv = this.props.categories
}
get categories() {
return this._categorySummaryEnv;
}
get company() {
return this.env.pos.company;
}
get cashier() {
return this.env.pos.get_cashier();
}
}
CategorySummaryReceipt.template = 'CategorySummaryReceipt';
Registries.Component.add(CategorySummaryReceipt);
return CategorySummaryReceipt;
});

27
advanced_pos_reports/static/src/js/Receipts/LocationSummaryReceipt.js

@ -0,0 +1,27 @@
odoo.define('advanced_pos_reports.LocationSummaryReceipt', function(require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const Registries = require('point_of_sale.Registries');
class LocationSummaryReceipt extends PosComponent {
constructor() {
super(...arguments);
this._locationSummaryEnv = this.props.locations
}
get locations() {
return this._locationSummaryEnv;
}
get company() {
return this.env.pos.company;
}
get cashier() {
return this.env.pos.get_cashier();
}
}
LocationSummaryReceipt.template = 'LocationSummaryReceipt';
Registries.Component.add(LocationSummaryReceipt);
return LocationSummaryReceipt;
});

30
advanced_pos_reports/static/src/js/Receipts/OrderSummaryReceipt.js

@ -0,0 +1,30 @@
odoo.define('advanced_pos_reports.OrderSummaryReceipt', function(require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const Registries = require('point_of_sale.Registries');
class OrderSummaryReceipt extends PosComponent {
constructor() {
super(...arguments);
this._orderSummaryEnv = this.props.orders
}
get orders() {
return this._orderSummaryEnv;
}
get company() {
return this.env.pos.company;
}
get cashier() {
return this.env.pos.get_cashier();
}
getDate(order) {
return moment(order.date_order).format('MM-DD-YYYY');
}
}
OrderSummaryReceipt.template = 'OrderSummaryReceipt';
Registries.Component.add(OrderSummaryReceipt);
return OrderSummaryReceipt;
});

30
advanced_pos_reports/static/src/js/Receipts/PaymentSummaryReceipt.js

@ -0,0 +1,30 @@
odoo.define('advanced_pos_reports.PaymentSummaryReceipt', function(require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const Registries = require('point_of_sale.Registries');
class PaymentSummaryReceipt extends PosComponent {
constructor() {
super(...arguments);
this._paymentSummaryEnv = this.props.payment_summary
}
get payment_summary() {
return this._paymentSummaryEnv;
}
get company() {
return this.env.pos.company;
}
get cashier() {
return this.env.pos.get_cashier();
}
// getDate(order) {
// return moment(order.date_order).format('MM-DD-YYYY');
// }
}
PaymentSummaryReceipt.template = 'PaymentSummaryReceipt';
Registries.Component.add(PaymentSummaryReceipt);
return PaymentSummaryReceipt;
});

27
advanced_pos_reports/static/src/js/Receipts/ProductSummaryReceipt.js

@ -0,0 +1,27 @@
odoo.define('advanced_pos_reports.ProductSummaryReceipt', function(require) {
'use strict';
const PosComponent = require('point_of_sale.PosComponent');
const Registries = require('point_of_sale.Registries');
class ProductSummaryReceipt extends PosComponent {
constructor() {
super(...arguments);
this._productSummaryEnv = this.props.products
}
get products() {
return this._productSummaryEnv;
}
get company() {
return this.env.pos.company;
}
get cashier() {
return this.env.pos.get_cashier();
}
}
ProductSummaryReceipt.template = 'ProductSummaryReceipt';
Registries.Component.add(ProductSummaryReceipt);
return ProductSummaryReceipt;
});

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save