add pos addons from CybroAddons
38
custom_receipts_for_pos/README.rst
Normal file
|
@ -0,0 +1,38 @@
|
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||
:alt: License: AGPL-3
|
||||
|
||||
POS Receipt Designs
|
||||
===================
|
||||
POS Receipt Design
|
||||
|
||||
|
||||
Company
|
||||
-------
|
||||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
|
||||
|
||||
Credits
|
||||
-------
|
||||
Developer: Afra K @cybrosys, Contact: odoo@cybrosys.com
|
||||
|
||||
Contacts
|
||||
--------
|
||||
* Mail Contact : odoo@cybrosys.com
|
||||
* Website : https://cybrosys.com
|
||||
|
||||
Bug Tracker
|
||||
-----------
|
||||
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
|
||||
|
||||
Maintainer
|
||||
==========
|
||||
.. image:: https://cybrosys.com/images/logo.png
|
||||
:target: https://cybrosys.com
|
||||
|
||||
This module is maintained by Cybrosys Technologies.
|
||||
|
||||
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
|
||||
|
||||
Further information
|
||||
===================
|
||||
HTML Description: `<static/description/index.html>`__
|
23
custom_receipts_for_pos/__init__.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#############################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
||||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
|
||||
#
|
||||
# You can modify it under the terms of the GNU LESSER
|
||||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
||||
# (LGPL v3) along with this program.
|
||||
# If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
from . import models
|
52
custom_receipts_for_pos/__manifest__.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
{
|
||||
'name': 'POS Receipt Design',
|
||||
'version': '16.0.1.0.0',
|
||||
'summary': """Option to select the customised Receipts for each POS""",
|
||||
'description': "Option to select the customised Receipts for each POS",
|
||||
'category': 'Point of Sale',
|
||||
'author': 'Cybrosys Techno Solutions',
|
||||
'company': 'Cybrosys Techno Solutions',
|
||||
'maintainer': 'Cybrosys Techno Solutions',
|
||||
'website': "https://www.cybrosys.com",
|
||||
'depends': ['base', 'point_of_sale'],
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'views/point_of_sale_view.xml',
|
||||
'views/pos_receipt_views.xml',
|
||||
'views/res_config_settings_views.xml',
|
||||
],
|
||||
'demo':['demo/pos_receipt_views_demo.xml'],
|
||||
'assets': {
|
||||
'point_of_sale.assets': [
|
||||
'custom_receipts_for_pos/static/js/ReceiptScreen/order_receipt.js',
|
||||
],
|
||||
},
|
||||
'images': ['static/description/banner.png'],
|
||||
'license': 'AGPL-3',
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
'application': False,
|
||||
}
|
269
custom_receipts_for_pos/demo/pos_receipt_views_demo.xml
Normal file
|
@ -0,0 +1,269 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Sub Categories -->
|
||||
<record id="pos_receipt_design1_demo" model="pos.receipt">
|
||||
<field name="name">Design 1</field>
|
||||
<field name="design_receipt"><![CDATA[<div class="pos-receipt">
|
||||
<div class="pos-receipt-contact">
|
||||
<t t-if="receipt.company.contact_address">
|
||||
<div><t t-esc="receipt.company.contact_address" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.company.phone">
|
||||
<div>Tel:<t t-esc="receipt.company.phone" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.company.vat">
|
||||
<div><t t-esc="receipt.company.vat_label"/>:<t t-esc="receipt.company.vat" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.company.email">
|
||||
<div><t t-esc="receipt.company.email" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.company.website">
|
||||
<div><t t-esc="receipt.company.website" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.header_html">
|
||||
<t t-out="receipt.header_html" />
|
||||
</t>
|
||||
<t t-if="!receipt.header_html and receipt.header">
|
||||
<div style="white-space:pre-line"><t t-esc="receipt.header" /></div>
|
||||
</t>
|
||||
<t t-if="receipt.cashier">
|
||||
<div class="cashier">
|
||||
<div>--------------------------------</div>
|
||||
<div>Served by <t t-esc="receipt.cashier" /></div>
|
||||
</div>
|
||||
</t>
|
||||
</div>
|
||||
<br/>
|
||||
<t t-if="receipt.header">
|
||||
<div style='text-align:center; font-size:13px'>
|
||||
<t t-esc="receipt.header" />
|
||||
</div>
|
||||
<br />
|
||||
</t>
|
||||
<div>
|
||||
<table class='receipt-orderlines' style="font-size:15px; border-style: double;
|
||||
border-left: none;border-right: none;border-bottom: none;width: 100%;">
|
||||
<colgroup>
|
||||
<col width='40%' />
|
||||
<col width='30%' />
|
||||
<col width='30%' />
|
||||
</colgroup>
|
||||
<tr style="border-bottom: 1px dashed black;">
|
||||
<th style="text-align:left;">Product</th>
|
||||
<th style="text-align:center;">Qty</th>
|
||||
<th style="text-align:center;">Amount</th>
|
||||
</tr>
|
||||
<tr t-foreach="orderlines" t-as="orderline">
|
||||
<td style="padding-top: 1%;padding-bottom: 1%;">
|
||||
<t t-esc="orderline.get_product().display_name"/>
|
||||
<t t-if="orderline.get_discount() > 0">
|
||||
<div style="font-size: 12px;font-style: italic;color: #808080;">
|
||||
<t t-esc="orderline.get_discount()"/>% discount
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="orderline.customerNote">
|
||||
<div style="font-size: 14px;" t-esc="orderline.customerNote"/>
|
||||
</t>
|
||||
</td>
|
||||
<td class="pos-center-align">
|
||||
<t t-esc="orderline.get_quantity_str_with_unit()"/>
|
||||
</td>
|
||||
<td class="pos-center-align">
|
||||
<t t-esc="widget.pos.format_currency(orderline.get_display_price())"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div style="padding-top: 6px;">
|
||||
<!-- Subtotal -->
|
||||
<t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) <= 0.000001' />
|
||||
<t t-if='!taxincluded'>
|
||||
<br/>
|
||||
<div style="font-weight: 700; font-size: 14px; border-top:1px dashed;"><span style="margin-left: 40%;">Subtotal : </span><span t-esc='widget.pos.format_currency(receipt.subtotal)' class="pos-receipt-right-align"/></div>
|
||||
<t t-foreach='receipt.tax_details' t-as='tax'>
|
||||
<div style="font-weight: 700; font-size: 14px;">
|
||||
<span style="margin-left: 40%;"><t t-esc='tax.name' /></span>
|
||||
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
<!-- Total -->
|
||||
<br/>
|
||||
<div style="font-weight: 700; font-size: 14px;">
|
||||
<span style="margin-left: 40%;">TOTAL : </span>
|
||||
<span t-esc='widget.pos.format_currency(receipt.total_with_tax)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class='before-footer' />
|
||||
<br/>
|
||||
<br/>
|
||||
<!-- Footer -->
|
||||
<div class="pos-receipt-order-data">
|
||||
<div><t t-esc="receipt.name" /></div>
|
||||
<t t-if="receipt.date.localestring">
|
||||
<div><t t-esc="receipt.date.localestring" /></div>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<div><t t-esc="receipt.date.validation_date" /></div>
|
||||
</t>
|
||||
</div>
|
||||
|
||||
<br/><br/>
|
||||
<div style="font-size: 14px; text-align: center;">
|
||||
Thank You... Please Visit Again ...
|
||||
</div>
|
||||
</div>]]></field>
|
||||
</record>
|
||||
<record id="pos_receipt_design2_demo" model="pos.receipt">
|
||||
<field name="name">Design 2</field>
|
||||
<field name="design_receipt"><![CDATA[<div class="pos-receipt">
|
||||
<div style="font-size:13px; text-align: center;">
|
||||
<t t-esc="widget.pos.company.name"/><br />
|
||||
Phone: <t t-esc="widget.pos.company.phone || ''"/><br />
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<div style="font-size:13px; text-align: center;">
|
||||
Date :
|
||||
<t t-if="order.formatted_validation_date">
|
||||
<t t-esc="order.formatted_validation_date"/>
|
||||
</t>
|
||||
<t t-else="">
|
||||
<t t-esc="order.validation_date"/>
|
||||
</t>
|
||||
<br />
|
||||
Order : <t t-esc="order.name"/><br />
|
||||
</div>
|
||||
<br />
|
||||
<div style="font-size:13px; text-align: center;">
|
||||
Cashier : <t t-esc='receipt.cashier' /><br />
|
||||
<t t-if="receipt.partner.name">
|
||||
Customer : <t t-esc='receipt.partner.name' style="font-style: bold" />
|
||||
</t>
|
||||
<br />
|
||||
</div>
|
||||
<br/>
|
||||
<t t-if="receipt.header">
|
||||
<div style='text-align:center; font-size:13px'>
|
||||
<t t-esc="receipt.header" />
|
||||
</div>
|
||||
<br />
|
||||
</t>
|
||||
<div>
|
||||
<table class='receipt-orderlines' style="font-size:15px; border-style: double;
|
||||
border-left: none;border-right: none;border-bottom: none;width: 100%;">
|
||||
<colgroup>
|
||||
<col width='40%' />
|
||||
<col width='30%' />
|
||||
<col width='30%' />
|
||||
</colgroup>
|
||||
<tr style="border-bottom: 1px dashed black;">
|
||||
<th style="text-align:left;">Product</th>
|
||||
<th style="text-align:center;">Qty</th>
|
||||
<th style="text-align:center;">Amount</th>
|
||||
</tr>
|
||||
<tr t-foreach="orderlines" t-as="orderline">
|
||||
<td style="padding-top: 1%;padding-bottom: 1%;">
|
||||
<t t-esc="orderline.get_product().display_name"/>
|
||||
<t t-if="orderline.get_discount() > 0">
|
||||
<div style="font-size: 12px;font-style: italic;color: #808080;">
|
||||
<t t-esc="orderline.get_discount()"/>% discount
|
||||
</div>
|
||||
</t>
|
||||
<t t-if="orderline.customerNote">
|
||||
<div style="font-size: 14px;" t-esc="orderline.customerNote"/>
|
||||
</t>
|
||||
</td>
|
||||
<td class="pos-center-align">
|
||||
<t t-esc="orderline.get_quantity_str_with_unit()"/>
|
||||
</td>
|
||||
<td class="pos-center-align">
|
||||
<t t-esc="widget.pos.format_currency(orderline.get_display_price())"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<br />
|
||||
<div style="padding-top: 6px;">
|
||||
<!-- Subtotal -->
|
||||
<t t-set='taxincluded' t-value='Math.abs(receipt.subtotal - receipt.total_with_tax) <= 0.000001' />
|
||||
<t t-if='!taxincluded'>
|
||||
<br/>
|
||||
<div style="font-weight: 700; font-size: 14px; border-top:1px dashed;"><span style="margin-left: 40%;">Subtotal : </span><span t-esc='widget.pos.format_currency(receipt.subtotal)' class="pos-receipt-right-align"/></div>
|
||||
<t t-foreach='receipt.tax_details' t-as='tax'>
|
||||
<div style="font-weight: 700; font-size: 14px;">
|
||||
<span style="margin-left: 40%;"><t t-esc='tax.name' /></span>
|
||||
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
<!-- Total -->
|
||||
<br/>
|
||||
<div style="font-weight: 700; font-size: 14px;">
|
||||
<span style="margin-left: 40%;">TOTAL : </span>
|
||||
<span t-esc='widget.pos.format_currency(receipt.total_with_tax)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
<br/><br/>
|
||||
</div>
|
||||
<!-- Payment Lines -->
|
||||
<t t-foreach='paymentlines' t-as='line'>
|
||||
<div style="font-size: 14px;border-top:1px dashed;padding-top: 5px;">
|
||||
<span style="margin-left: 40%;"><t t-esc='line.name' /></span>
|
||||
<span t-esc='widget.pos.format_currency_no_symbol(line.get_amount())' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
<br/>
|
||||
<div class="receipt-change" style="font-size: 14px;">
|
||||
<span style="margin-left: 40%;">CHANGE : </span>
|
||||
<span t-esc='widget.pos.format_currency(receipt.change)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
<br/>
|
||||
<!-- Extra Payment Info -->
|
||||
<t t-if='receipt.total_discount'>
|
||||
<div style="font-size: 14px; border-top:1px dashed;padding-top: 5px;">
|
||||
<span style="margin-left: 40%;">Discounts : </span>
|
||||
<span t-esc='widget.pos.format_currency(receipt.total_discount)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
<t t-if='taxincluded'>
|
||||
<t t-foreach='receipt.tax_details' t-as='tax'>
|
||||
<div style="font-size: 14px;">
|
||||
<span style="margin-left: 40%;"><t t-esc='tax.name' /></span>
|
||||
<span t-esc='widget.pos.format_currency_no_symbol(tax.amount)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
<div style="font-size: 14px;">
|
||||
<span style="margin-left: 40%;">Total Taxes : </span>
|
||||
<span t-esc='widget.pos.format_currency(receipt.total_tax)' class="pos-receipt-right-align"/>
|
||||
</div>
|
||||
</t>
|
||||
<div class='before-footer' />
|
||||
<!-- Footer -->
|
||||
<div t-if='receipt.footer_html' style="text-align: center; font-size: 14px;">
|
||||
<t t-raw='receipt.footer_html'/>
|
||||
</div>
|
||||
<div t-if='!receipt.footer_html and receipt.footer' style="text-align: center;font-size: 14px;">
|
||||
<br/>
|
||||
<t t-esc='receipt.footer'/>
|
||||
<br/><br/>
|
||||
</div>
|
||||
<div class='after-footer' style="font-size: 14px;">
|
||||
<t t-foreach='paymentlines' t-as='line'>
|
||||
<t t-if='line.ticket'>
|
||||
<br />
|
||||
<div class="pos-payment-terminal-receipt">
|
||||
<t t-raw='line.ticket'/>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</div>
|
||||
<br/><br/>
|
||||
<div style="font-size: 14px; text-align: center;">
|
||||
Thank You... Please Visit Again ...
|
||||
</div>
|
||||
</div>]]></field>
|
||||
</record>
|
||||
</odoo>
|
8
custom_receipts_for_pos/doc/RELEASE_NOTES.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
## Module <custom_receipts_for_pos>
|
||||
|
||||
#### 21.11.2022
|
||||
#### Version 16.0.1.0.0
|
||||
#### ADD
|
||||
Initial Commit for POS Receipt Designs.
|
||||
|
||||
|
28
custom_receipts_for_pos/models/__init__.py
Normal file
|
@ -0,0 +1,28 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from .import pos_receipt
|
||||
from .import pos_config
|
||||
from .import res_config_settings
|
||||
from .import pos_session
|
||||
|
32
custom_receipts_for_pos/models/pos_config.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class PosConfig(models.Model):
|
||||
_inherit = "pos.config"
|
||||
|
||||
receipt_design = fields.Many2one('pos.receipt', string="Receipt Design", help="Choose any receipt design")
|
||||
design_receipt = fields.Text(related='receipt_design.design_receipt', string='Receipt XML')
|
||||
is_custom_receipt = fields.Boolean(string='Is Custom Receipt')
|
31
custom_receipts_for_pos/models/pos_receipt.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class PosReceipt(models.Model):
|
||||
_name = 'pos.receipt'
|
||||
|
||||
name = fields.Char(string='Name')
|
||||
design_receipt = fields.Text(string='Receipt XML', help='Add your customised receipts for pos')
|
63
custom_receipts_for_pos/models/pos_session.py
Normal file
|
@ -0,0 +1,63 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class PosSession(models.Model):
|
||||
_inherit = 'pos.session'
|
||||
|
||||
def _loader_params_product_product(self):
|
||||
result = super()._loader_params_product_product()
|
||||
result['search_params']['fields'].append('qty_available')
|
||||
return result
|
||||
|
||||
def _pos_ui_models_to_load(self):
|
||||
result = super()._pos_ui_models_to_load()
|
||||
result += [
|
||||
'res.config.settings',
|
||||
'pos.receipt',
|
||||
]
|
||||
return result
|
||||
|
||||
def _loader_params_pos_receipt(self):
|
||||
return {
|
||||
'search_params': {
|
||||
'fields': ['design_receipt', 'name'],
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
def _get_pos_ui_pos_receipt(self, params):
|
||||
return self.env['pos.receipt'].search_read(**params['search_params'])
|
||||
|
||||
def _loader_params_res_config_settings(self):
|
||||
return {
|
||||
'search_params': {
|
||||
'fields': ['pos_receipt_design'],
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
def _get_pos_ui_res_config_settings(self, params):
|
||||
return self.env['res.config.settings'].search_read(**params['search_params'])
|
42
custom_receipts_for_pos/models/res_config_settings.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
#
|
||||
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Afra K (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class ResConfigSettings(models.TransientModel):
|
||||
_inherit = 'res.config.settings'
|
||||
|
||||
pos_receipt_design = fields.Many2one(related='pos_config_id.receipt_design', string="Receipt Design",
|
||||
help="Choose any receipt design", compute='_compute_pos_is_custom_receipt',
|
||||
readonly=False, store=True)
|
||||
pos_design_receipt = fields.Text(related='pos_config_id.design_receipt', string='Receipt XML')
|
||||
pos_is_custom_receipt = fields.Boolean(related='pos_config_id.is_custom_receipt', readonly=False, store=True)
|
||||
|
||||
@api.depends('pos_is_custom_receipt', 'pos_config_id')
|
||||
def _compute_pos_is_custom_receipt(self):
|
||||
for res_config in self:
|
||||
if res_config.pos_is_custom_receipt:
|
||||
res_config.pos_receipt_design = res_config.pos_config_id.receipt_design
|
||||
else:
|
||||
res_config.pos_receipt_design = False
|
3
custom_receipts_for_pos/security/ir.model.access.csv
Normal file
|
@ -0,0 +1,3 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_pos_receipt,access_pos_receipt,model_pos_receipt,base.group_user,1,1,1,1
|
||||
|
|
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
BIN
custom_receipts_for_pos/static/description/assets/icons/cogs.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
BIN
custom_receipts_for_pos/static/description/assets/icons/logo.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
BIN
custom_receipts_for_pos/static/description/assets/icons/user.png
Normal file
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 263 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 117 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 172 KiB |
BIN
custom_receipts_for_pos/static/description/banner.png
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
custom_receipts_for_pos/static/description/cybro_logo.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
custom_receipts_for_pos/static/description/icon.png
Normal file
After Width: | Height: | Size: 24 KiB |
614
custom_receipts_for_pos/static/description/index.html
Normal file
|
@ -0,0 +1,614 @@
|
|||
<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;">
|
||||
POS Receipt Designs</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;">
|
||||
Option to select the customised Receipts for each POS.</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 this module POS Receipt Design user can add receipt designs from the backend, and we can choose the receipt designs for each POS,
|
||||
And we can view the different receipts for each POS.</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;">
|
||||
User can add the receipt designs from the backend in the menu Receipt Designs. </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;">
|
||||
User can choose whether the current pos needs custom receipt design</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;">
|
||||
We can see that chosen receipt in frontend of the POS .</h4>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 pl-3 py-3 d-flex">
|
||||
<div>
|
||||
<img src="assets/icons/check.png">
|
||||
</div>
|
||||
<div>
|
||||
<h4
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
|
||||
We can edit the receipt design from the backend of the POS.</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-2">
|
||||
<h4 class="mt-2"
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
|
||||
Default Receipt of POS</h4>
|
||||
<p
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
|
||||
This is the default receipt of POS.
|
||||
</p>
|
||||
<img src="assets/screenshots/screenshot1.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;">
|
||||
Receipt Designs</h4>
|
||||
<p
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
|
||||
We can add the Receipt designs from the backend in the menu 'Receipt Designs'.
|
||||
</p>
|
||||
<img src="assets/screenshots/screenshot2.png" class="img-responsive img-thumbnail border" width="100%"
|
||||
height="auto" />
|
||||
<img src="assets/screenshots/screenshot3.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;">
|
||||
Choose receipt design for POS.</h4>
|
||||
<p
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
|
||||
We can choose the receipt design for each POS from the backend of the pos.
|
||||
</p>
|
||||
<img src="assets/screenshots/screenshot4.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;">
|
||||
Edit receipt designs for POS.</h4>
|
||||
<p
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
|
||||
We can edit the receipt design from the backend of the POS.
|
||||
</p>
|
||||
<img src="assets/screenshots/screenshot7.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;">
|
||||
Chosen receipt in the frontend</h4>
|
||||
<p
|
||||
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
|
||||
We can see the chosen receipts for the POS in the frontend of the POS, It will vary as per we're choosing from the Backend for each POS.
|
||||
</p>
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-6 col-lg-6 d-flex justify-content-center align-items-center">
|
||||
<img src="assets/screenshots/screenshot5.png" class="img-responsive img-thumbnail border" width="50%"
|
||||
height="auto" />
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-6 col-lg-6 d-flex justify-content-center align-items-center">
|
||||
<img src="assets/screenshots/screenshot6.png" class="img-responsive img-thumbnail border" width="50%"
|
||||
height="auto" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</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/sale_discount_total/" 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/sales_discount.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 & 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>
|
|
@ -0,0 +1,53 @@
|
|||
odoo.define('custom_receipts_for_pos.receipt',function(require){
|
||||
"use strict"
|
||||
var models=require('point_of_sale.models');
|
||||
const Registries = require('point_of_sale.Registries');
|
||||
var PosDB = require("point_of_sale.DB");
|
||||
const OrderReceipt = require('point_of_sale.OrderReceipt');
|
||||
const AbstractReceiptScreen = require('point_of_sale.AbstractReceiptScreen');
|
||||
var SuperOrder = models.Order;
|
||||
const{onMounted}=owl;
|
||||
|
||||
PosDB.include({
|
||||
init:function(options)
|
||||
{
|
||||
var self=this;
|
||||
this._super(options);
|
||||
this.receipt_design=null;
|
||||
},
|
||||
})
|
||||
|
||||
const PosResOrderReceipt = OrderReceipt =>
|
||||
class extends OrderReceipt {
|
||||
setup(){
|
||||
super.setup();
|
||||
onMounted(()=>{
|
||||
var self=this;
|
||||
|
||||
if(self.env.pos.config.is_custom_receipt){
|
||||
var receipt_design=self.env.pos.config.design_receipt
|
||||
var order=self._receiptEnv.order;
|
||||
var data={
|
||||
widget:self.env,
|
||||
pos:order.pos,
|
||||
order:order,
|
||||
receipt:order.export_for_printing(),
|
||||
orderlines:order.get_orderlines(),
|
||||
paymentlines:order.get_paymentlines(),
|
||||
moment:moment,
|
||||
};
|
||||
var parser=new DOMParser();
|
||||
var xmlDoc=parser.parseFromString(receipt_design,"text/xml");
|
||||
var s=new XMLSerializer();
|
||||
var newXmlStr=s.serializeToString(xmlDoc);
|
||||
var qweb=new QWeb2.Engine();
|
||||
console.log('receipt', self._receiptEnv)
|
||||
qweb.add_template('<templates><t t-name="receipt_design">'+newXmlStr+'</t></templates>');
|
||||
var receipt=qweb.render('receipt_design',data);$('div.pos-receipt').replaceWith(receipt);
|
||||
console.log(receipt, 'ooooo')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Registries.Component.extend(OrderReceipt, PosResOrderReceipt)
|
||||
});
|
17
custom_receipts_for_pos/views/point_of_sale_view.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Top menu item -->
|
||||
<record id="action_pos_receipt" model="ir.actions.act_window">
|
||||
<field name="name">Receipt Designs</field>
|
||||
<field name="res_model">pos.receipt</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="target">current</field>
|
||||
</record>
|
||||
<menuitem
|
||||
id="menu_pos_receipt"
|
||||
|
||||
parent="point_of_sale.menu_point_config_product"
|
||||
action="action_pos_receipt"
|
||||
sequence="50"/>
|
||||
|
||||
</odoo>
|
27
custom_receipts_for_pos/views/pos_config_views.xml
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<odoo>
|
||||
|
||||
<record id="pos_config_receipt_view" model="ir.ui.view">
|
||||
<field name="name">pos.config.view</field>
|
||||
<field name="model">pos.config</field>
|
||||
<field name="inherit_id" ref="point_of_sale.pos_config_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@id='order_reference']" position="after">
|
||||
<div class="col-xs-12 col-md-6 o_setting_box">
|
||||
<div class="o_setting_left_pane">
|
||||
<field name="is_custom_receipt"/>
|
||||
</div>
|
||||
<div class="o_setting_right_pane">
|
||||
<label for="receipt_design"/>
|
||||
<div class="text-muted">
|
||||
Use Custom Receipt Design
|
||||
</div>
|
||||
<div class="content-group mt16">
|
||||
<field name="receipt_design" attrs="{'invisible': [('is_custom_receipt', '=', False)]}"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
26
custom_receipts_for_pos/views/pos_receipt_views.xml
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="pos_receipt_form" model="ir.ui.view">
|
||||
<field name="name">pos.receipt.form</field>
|
||||
<field name="model">pos.receipt</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Receipt Designs">
|
||||
<sheet>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="design_receipt" widget="ace" options="{'mode': 'xml'}"
|
||||
/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="pos_receipt_tree" model="ir.ui.view">
|
||||
<field name="model">pos.receipt</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Receipt Designs">
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
34
custom_receipts_for_pos/views/res_config_settings_views.xml
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="res_config_settings_view_form" model="ir.ui.view">
|
||||
<field name="name">res.config.settings.view.form.inherit.point_of_sale</field>
|
||||
<field name="model">res.config.settings</field>
|
||||
<field name="priority" eval="95"/>
|
||||
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@id='pos_bills_and_receipts_section']" position="after">
|
||||
<div class="row mt16 o_settings_container" id="pos_receipts_section">
|
||||
<div class="col-xs-12 col-md-6 o_setting_box">
|
||||
<div class="o_setting_left_pane">
|
||||
<field name="pos_is_custom_receipt"/>
|
||||
</div>
|
||||
<div class="o_setting_right_pane">
|
||||
<label for="pos_receipt_design"/>
|
||||
<div class="text-muted">
|
||||
Use Custom Receipt Design
|
||||
</div>
|
||||
<div class="content-group mt16">
|
||||
<field name="pos_receipt_design"
|
||||
attrs="{'invisible': [('pos_is_custom_receipt', '=', False)]}"/>
|
||||
</div>
|
||||
<div class="content-group mt16">
|
||||
<field name="pos_design_receipt"
|
||||
invisible="1"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</odoo>
|
21
dashboard_pos/README.rst
Normal file
|
@ -0,0 +1,21 @@
|
|||
POS Dashboard v16
|
||||
=================
|
||||
POS Dashboard
|
||||
|
||||
Installation
|
||||
============
|
||||
- www.odoo.com/documentation/14.0/setup/install.html
|
||||
- Install our custom addon
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
No additional configurations needed
|
||||
|
||||
Credits
|
||||
=======
|
||||
Developer: Irfan v13 @ cybrosys, Contact: odoo@cybrosys.com
|
||||
Jibin James V14 @ cybrosys, Contact: odoo@cybrosys.com
|
||||
Irfan V15 @ cybrosys, Contact: odoo@cybrosys.com
|
||||
Amaya Aravind EV V16 @ cybrosys, Contact: odoo@cybrosys.com
|
||||
|
23
dashboard_pos/__init__.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Irfan (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from . import models
|
51
dashboard_pos/__manifest__.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Irfan (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
{
|
||||
'name': "POS Dashboard",
|
||||
'version': '16.0.1.0.2',
|
||||
'summary': """POS Dashboard""",
|
||||
'description': """POS Dashboard""",
|
||||
'category': 'Point of Sale',
|
||||
'author': 'Cybrosys Techno Solutions',
|
||||
'company': 'Cybrosys Techno Solutions',
|
||||
'maintainer': 'Cybrosys Techno Solutions',
|
||||
'website': "https://www.cybrosys.com",
|
||||
'depends': ['hr', 'point_of_sale'],
|
||||
'external_dependencies': {
|
||||
'python': ['pandas'],
|
||||
},
|
||||
'data': [
|
||||
'views/dashboard_views.xml'
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'dashboard_pos/static/src/xml/pos_dashboard.xml',
|
||||
'dashboard_pos/static/src/js/pos_dashboard.js',
|
||||
'dashboard_pos/static/src/css/pos_dashboard.css',
|
||||
'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.js',
|
||||
],
|
||||
},
|
||||
'images': ['static/description/banner.png'],
|
||||
'license': "AGPL-3",
|
||||
'installable': True,
|
||||
'application': False,
|
||||
}
|
11
dashboard_pos/doc/RELEASE_NOTES.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
## Module <pos_dashboard>
|
||||
|
||||
#### 09.10.2021
|
||||
#### Version 16.0.1.0.0
|
||||
##### ADD
|
||||
-Initial Commit for pos_dashboard
|
||||
|
||||
#### 15.05.2023
|
||||
#### Version 16.0.2.0.1
|
||||
##### FIX
|
||||
-Error of increasing the font in the entire database removed
|
23
dashboard_pos/models/__init__.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Irfan (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
|
||||
from . import pos_dashboard
|
232
dashboard_pos/models/pos_dashboard.py
Normal file
|
@ -0,0 +1,232 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
###################################################################################
|
||||
#
|
||||
# Cybrosys Technologies Pvt. Ltd.
|
||||
# Copyright (C) 2022-TODAY Cybrosys Technologies (<https://www.cybrosys.com>).
|
||||
# Author: Irfan (<https://www.cybrosys.com>)
|
||||
#
|
||||
# This program is free software: you can modify
|
||||
# it under the terms of the GNU Affero General Public License (AGPL) as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
###################################################################################
|
||||
import pytz
|
||||
from odoo import models, fields, api
|
||||
from datetime import timedelta, datetime, date
|
||||
import json
|
||||
|
||||
|
||||
class PosDashboard(models.Model):
|
||||
_inherit = 'pos.order'
|
||||
|
||||
@api.model
|
||||
def get_department(self, option):
|
||||
|
||||
company_id = self.env.company.id
|
||||
if option == 'pos_hourly_sales':
|
||||
|
||||
user_tz = self.env.user.tz if self.env.user.tz else pytz.UTC
|
||||
query = '''select EXTRACT(hour FROM date_order at time zone 'utc' at time zone '{}')
|
||||
as date_month,sum(amount_total) from pos_order where
|
||||
EXTRACT(month FROM date_order::date) = EXTRACT(month FROM CURRENT_DATE)
|
||||
AND pos_order.company_id = ''' + str(
|
||||
company_id) + ''' group by date_month '''
|
||||
query = query.format(user_tz)
|
||||
label = 'HOURS'
|
||||
elif option == 'pos_monthly_sales':
|
||||
query = '''select date_order::date as date_month,sum(amount_total) from pos_order where
|
||||
EXTRACT(month FROM date_order::date) = EXTRACT(month FROM CURRENT_DATE) AND pos_order.company_id = ''' + str(
|
||||
company_id) + ''' group by date_month '''
|
||||
label = 'DAYS'
|
||||
else:
|
||||
query = '''select TO_CHAR(date_order,'MON')date_month,sum(amount_total) from pos_order where
|
||||
EXTRACT(year FROM date_order::date) = EXTRACT(year FROM CURRENT_DATE) AND pos_order.company_id = ''' + str(
|
||||
company_id) + ''' group by date_month'''
|
||||
label = 'MONTHS'
|
||||
self._cr.execute(query)
|
||||
docs = self._cr.dictfetchall()
|
||||
order = []
|
||||
for record in docs:
|
||||
order.append(record.get('sum'))
|
||||
today = []
|
||||
for record in docs:
|
||||
today.append(record.get('date_month'))
|
||||
final = [order, today, label]
|
||||
return final
|
||||
|
||||
@api.model
|
||||
def get_details(self):
|
||||
company_id = self.env.company.id
|
||||
cr = self._cr
|
||||
cr.execute(
|
||||
"""select pos_payment_method.name ->>'en_US',sum(amount) from pos_payment inner join pos_payment_method on
|
||||
pos_payment_method.id=pos_payment.payment_method_id group by pos_payment_method.name ORDER
|
||||
BY sum(amount) DESC; """)
|
||||
payment_details = cr.fetchall()
|
||||
cr.execute(
|
||||
'''select hr_employee.name,sum(pos_order.amount_paid) as total,count(pos_order.amount_paid) as orders
|
||||
from pos_order inner join hr_employee on pos_order.user_id = hr_employee.user_id
|
||||
where pos_order.company_id =''' + str(
|
||||
company_id) +" "+ '''GROUP BY hr_employee.name order by total DESC;''')
|
||||
salesperson = cr.fetchall()
|
||||
|
||||
total_sales = []
|
||||
for rec in salesperson:
|
||||
rec = list(rec)
|
||||
sym_id = rec[1]
|
||||
company = self.env.company
|
||||
if company.currency_id.position == 'after':
|
||||
rec[1] = "%s %s" % (sym_id, company.currency_id.symbol)
|
||||
else:
|
||||
rec[1] = "%s %s" % (company.currency_id.symbol, sym_id)
|
||||
rec = tuple(rec)
|
||||
total_sales.append(rec)
|
||||
cr.execute(
|
||||
'''select DISTINCT(product_template.name) as product_name,sum(qty) as total_quantity from
|
||||
pos_order_line inner join product_product on product_product.id=pos_order_line.product_id inner join
|
||||
product_template on product_product.product_tmpl_id = product_template.id where pos_order_line.company_id =''' + str(
|
||||
company_id) + ''' group by product_template.id ORDER
|
||||
BY total_quantity DESC Limit 10 ''')
|
||||
selling_product = cr.fetchall()
|
||||
sessions = self.env['pos.config'].search([])
|
||||
sessions_list = []
|
||||
dict = {
|
||||
'opened': 'Opened',
|
||||
'opening_control': "Opening Control"
|
||||
}
|
||||
for session in sessions:
|
||||
st = dict.get(session.pos_session_state)
|
||||
if st == None:
|
||||
sessions_list.append({
|
||||
'session': session.name,
|
||||
'status': 'Closed'
|
||||
})
|
||||
else:
|
||||
sessions_list.append({
|
||||
'session': session.name,
|
||||
'status': dict.get(session.pos_session_state)
|
||||
})
|
||||
|
||||
payments = []
|
||||
for rec in payment_details:
|
||||
rec = list(rec)
|
||||
sym_id = rec[1]
|
||||
company = self.env.company
|
||||
if company.currency_id.position == 'after':
|
||||
rec[1] = "%s %s" % (sym_id, company.currency_id.symbol)
|
||||
else:
|
||||
rec[1] = "%s %s" % (company.currency_id.symbol, sym_id)
|
||||
rec = tuple(rec)
|
||||
payments.append(rec)
|
||||
return {
|
||||
'payment_details': payments,
|
||||
'salesperson': total_sales,
|
||||
'selling_product': sessions_list,
|
||||
}
|
||||
|
||||
@api.model
|
||||
def get_refund_details(self):
|
||||
default_date = datetime.today().date()
|
||||
pos_order = self.env['pos.order'].search([])
|
||||
total = 0
|
||||
today_refund_total = 0
|
||||
total_order_count = 0
|
||||
total_refund_count = 0
|
||||
today_sale = 0
|
||||
a = 0
|
||||
for rec in pos_order:
|
||||
if rec.amount_total < 0.0 and rec.date_order.date() == default_date:
|
||||
today_refund_total = today_refund_total + 1
|
||||
total_sales = rec.amount_total
|
||||
total = total + total_sales
|
||||
total_order_count = total_order_count + 1
|
||||
if rec.date_order.date() == default_date:
|
||||
today_sale = today_sale + 1
|
||||
if rec.amount_total < 0.0:
|
||||
total_refund_count = total_refund_count + 1
|
||||
magnitude = 0
|
||||
while abs(total) >= 1000:
|
||||
magnitude += 1
|
||||
total /= 1000.0
|
||||
# add more suffixes if you need them
|
||||
val = '%.2f%s' % (total, ['', 'K', 'M', 'G', 'T', 'P'][magnitude])
|
||||
pos_session = self.env['pos.session'].search([])
|
||||
total_session = 0
|
||||
for record in pos_session:
|
||||
total_session = total_session + 1
|
||||
return {
|
||||
'total_sale': val,
|
||||
'total_order_count': total_order_count,
|
||||
'total_refund_count': total_refund_count,
|
||||
'total_session': total_session,
|
||||
'today_refund_total': today_refund_total,
|
||||
'today_sale': today_sale,
|
||||
}
|
||||
|
||||
@api.model
|
||||
def get_the_top_customer(self, ):
|
||||
company_id = self.env.company.id
|
||||
query = '''select res_partner.name as customer,pos_order.partner_id,sum(pos_order.amount_paid) as amount_total from pos_order
|
||||
inner join res_partner on res_partner.id = pos_order.partner_id where pos_order.company_id = ''' + str(
|
||||
company_id) + ''' GROUP BY pos_order.partner_id,
|
||||
res_partner.name ORDER BY amount_total DESC LIMIT 10;'''
|
||||
self._cr.execute(query)
|
||||
docs = self._cr.dictfetchall()
|
||||
|
||||
order = []
|
||||
for record in docs:
|
||||
order.append(record.get('amount_total'))
|
||||
day = []
|
||||
for record in docs:
|
||||
day.append(record.get('customer'))
|
||||
final = [order, day]
|
||||
return final
|
||||
|
||||
@api.model
|
||||
def get_the_top_products(self):
|
||||
company_id = self.env.company.id
|
||||
|
||||
query = '''select DISTINCT(product_template.name)->>'en_US' as product_name,sum(qty) as total_quantity from
|
||||
pos_order_line inner join product_product on product_product.id=pos_order_line.product_id inner join
|
||||
product_template on product_product.product_tmpl_id = product_template.id where pos_order_line.company_id = ''' + str(
|
||||
company_id) + ''' group by product_template.id ORDER
|
||||
BY total_quantity DESC Limit 10 '''
|
||||
|
||||
self._cr.execute(query)
|
||||
top_product = self._cr.dictfetchall()
|
||||
total_quantity = []
|
||||
for record in top_product:
|
||||
total_quantity.append(record.get('total_quantity'))
|
||||
product_name = []
|
||||
for record in top_product:
|
||||
product_name.append(record.get('product_name'))
|
||||
final = [total_quantity, product_name]
|
||||
return final
|
||||
|
||||
@api.model
|
||||
def get_the_top_categories(self):
|
||||
company_id = self.env.company.id
|
||||
query = '''select DISTINCT(product_category.complete_name) as product_category,sum(qty) as total_quantity
|
||||
from pos_order_line inner join product_product on product_product.id=pos_order_line.product_id inner join
|
||||
product_template on product_product.product_tmpl_id = product_template.id inner join product_category on
|
||||
product_category.id =product_template.categ_id where pos_order_line.company_id = ''' + str(
|
||||
company_id) + ''' group by product_category ORDER BY total_quantity DESC '''
|
||||
self._cr.execute(query)
|
||||
top_product = self._cr.dictfetchall()
|
||||
total_quantity = []
|
||||
for record in top_product:
|
||||
total_quantity.append(record.get('total_quantity'))
|
||||
product_categ = []
|
||||
for record in top_product:
|
||||
product_categ.append(record.get('product_category'))
|
||||
final = [total_quantity, product_categ]
|
||||
return final
|
BIN
dashboard_pos/static/description/assets/icons/check.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
dashboard_pos/static/description/assets/icons/chevron.png
Normal file
After Width: | Height: | Size: 310 B |
BIN
dashboard_pos/static/description/assets/icons/cogs.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
dashboard_pos/static/description/assets/icons/consultation.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
dashboard_pos/static/description/assets/icons/ecom-black.png
Normal file
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
BIN
dashboard_pos/static/description/assets/icons/hotel-black.png
Normal file
After Width: | Height: | Size: 911 B |
BIN
dashboard_pos/static/description/assets/icons/license.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
dashboard_pos/static/description/assets/icons/lifebuoy.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
BIN
dashboard_pos/static/description/assets/icons/pos-black.png
Normal file
After Width: | Height: | Size: 878 B |
BIN
dashboard_pos/static/description/assets/icons/puzzle.png
Normal file
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
BIN
dashboard_pos/static/description/assets/icons/service-black.png
Normal file
After Width: | Height: | Size: 839 B |
BIN
dashboard_pos/static/description/assets/icons/trading-black.png
Normal file
After Width: | Height: | Size: 427 B |
BIN
dashboard_pos/static/description/assets/icons/training.png
Normal file
After Width: | Height: | Size: 627 B |
BIN
dashboard_pos/static/description/assets/icons/update.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
dashboard_pos/static/description/assets/icons/user.png
Normal file
After Width: | Height: | Size: 988 B |
BIN
dashboard_pos/static/description/assets/icons/wrench.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
dashboard_pos/static/description/assets/misc/categories.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
dashboard_pos/static/description/assets/misc/check-box.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
dashboard_pos/static/description/assets/misc/compass.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
dashboard_pos/static/description/assets/misc/corporate.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
BIN
dashboard_pos/static/description/assets/misc/cybrosys-logo.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
dashboard_pos/static/description/assets/misc/features.png
Normal file
After Width: | Height: | Size: 589 B |
BIN
dashboard_pos/static/description/assets/misc/logo.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
dashboard_pos/static/description/assets/misc/pictures.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
dashboard_pos/static/description/assets/misc/pie-chart.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
dashboard_pos/static/description/assets/misc/right-arrow.png
Normal file
After Width: | Height: | Size: 967 B |
BIN
dashboard_pos/static/description/assets/misc/star.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
dashboard_pos/static/description/assets/misc/support.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
dashboard_pos/static/description/assets/misc/whatsapp.png
Normal file
After Width: | Height: | Size: 5 KiB |
BIN
dashboard_pos/static/description/assets/modules/1.png
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
dashboard_pos/static/description/assets/modules/2.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
dashboard_pos/static/description/assets/modules/3.png
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
dashboard_pos/static/description/assets/modules/4.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
dashboard_pos/static/description/assets/modules/5.gif
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
dashboard_pos/static/description/assets/modules/6.png
Normal file
After Width: | Height: | Size: 57 KiB |