@ -0,0 +1,42 @@ |
|||
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg |
|||
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
|||
:alt: License: AGPL-3 |
|||
|
|||
POS Partial Payment |
|||
=================== |
|||
Simplify Payments with Partial Payment in Odoo POS |
|||
|
|||
License |
|||
------- |
|||
General Public License, Version 3 (AGPL v3). |
|||
(https://www.gnu.org/licenses/agpl-3.0-standalone.html) |
|||
|
|||
Company |
|||
------- |
|||
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
|||
|
|||
Credits |
|||
------- |
|||
Developer:(V16) Anfas Faisal K, 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>`__ |
@ -0,0 +1,22 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from . import models |
@ -0,0 +1,55 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
{ |
|||
'name': 'POS Partial Payment', |
|||
'version': '16.0.1.0.0', |
|||
'category': 'Point of Sale', |
|||
'summary': "Simplify Payments with Partial Payment in Odoo POS", |
|||
'description': "In Odoo POS, partial payments allow customers to pay for " |
|||
"their purchases in multiple installments, making it " |
|||
"easier for customers to split payments or pay later. This " |
|||
"feature is especially helpful for businesses dealing with " |
|||
"larger orders or customers who prefer flexibility in " |
|||
"their payment options.", |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': 'https://www.cybrosys.com', |
|||
'depends': ['base', 'point_of_sale'], |
|||
'data': [ |
|||
'views/pos_config_views.xml', |
|||
'views/pos_order_views.xml', |
|||
'views/res_partner_views.xml', |
|||
], |
|||
'assets': { |
|||
'point_of_sale.assets': [ |
|||
'pos_partial_payment_odoo/static/src/js/payment_screen.js', |
|||
'pos_partial_payment_odoo/static/src/js/models.js', |
|||
'pos_partial_payment_odoo/static/src/js/ticket_screen.js', |
|||
'pos_partial_payment_odoo/static/src/xml/payment_screen.xml', |
|||
]}, |
|||
'images': ['static/description/banner.jpg'], |
|||
'license': 'AGPL-3', |
|||
'installable': True, |
|||
'auto_install': False, |
|||
'application': False, |
|||
} |
@ -0,0 +1,7 @@ |
|||
## Module <pos_partial_payment_odoo> |
|||
|
|||
#### 19.12.2023 |
|||
#### Version 16.0.1.0.0 |
|||
### ADD |
|||
|
|||
- Initial Commit for POS Partial Payment |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from . import account_payment_register |
|||
from . import pos_config |
|||
from . import pos_order |
|||
from . import pos_session |
|||
from . import res_partner |
@ -0,0 +1,48 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from odoo import models |
|||
|
|||
|
|||
class AccountPaymentRegister(models.TransientModel): |
|||
""" |
|||
Model to inherit 'account.payment.register' for supering the Payment Button |
|||
to change functionality. |
|||
""" |
|||
_inherit = 'account.payment.register' |
|||
|
|||
def action_create_payments(self): |
|||
""" |
|||
Override the 'action_create_payments' method to set |
|||
'is_partial_payment' to False for the current order associated with |
|||
the active session. |
|||
""" |
|||
res = super(AccountPaymentRegister,self).action_create_payments() |
|||
active_session = self.env['pos.session'].search( |
|||
[('state', '=', 'opened'), |
|||
('user_id', '=', self.env.user.id)], limit=1) |
|||
if active_session: |
|||
current_order = self.env['pos.order'].search( |
|||
[('session_id', '=', active_session.id), |
|||
('state', '=', 'invoiced')], limit=1) |
|||
if current_order: |
|||
current_order.write({'is_partial_payment': False}) |
|||
return res |
@ -0,0 +1,37 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from odoo import models, fields |
|||
|
|||
|
|||
class PosConfig(models.Model): |
|||
""" |
|||
This class extends the 'pos.config' model to add the 'partial_payment' field |
|||
|
|||
The 'partial_payment' field allows configuring whether the Point of Sale |
|||
(POS) system should allow partial payments for orders. |
|||
""" |
|||
_inherit = 'pos.config' |
|||
|
|||
partial_payment = fields.Boolean(string='Allow Partial Payment', |
|||
default=True, |
|||
help="If enabled, the Point of Sale system" |
|||
"allows partial payments for orders.") |
@ -0,0 +1,125 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from odoo import api, models, fields, _ |
|||
from odoo.exceptions import UserError |
|||
from odoo.osv.expression import AND |
|||
from odoo.tools import float_round, float_is_zero |
|||
|
|||
|
|||
class PosOrder(models.Model): |
|||
""" |
|||
This class extends the 'pos.order' model to introduce additional |
|||
functionality related to partial payments and order management in the |
|||
Point of Sale (POS) system. |
|||
|
|||
It adds fields and methods for tracking partial payments, computing due |
|||
amounts, and marking orders as paid. The class also includes a method to |
|||
search for partial orders based on specified criteria. |
|||
|
|||
""" |
|||
_inherit = 'pos.order' |
|||
|
|||
is_partial_payment = fields.Boolean(string="Is Partial Payment", |
|||
default=False, |
|||
help="Flag indicating whether this POS " |
|||
"order is a partial payment.") |
|||
due_amount = fields.Float(string="Amount Due", |
|||
compute='_compute_due_amount', |
|||
store=True, |
|||
help="The amount remaining to be paid for this" |
|||
"POS order.") |
|||
|
|||
@api.depends('amount_total', 'amount_paid') |
|||
def _compute_due_amount(self): |
|||
""" |
|||
Compute the due amount for the POS order. |
|||
|
|||
This method computes the difference between the total amount and the amount paid |
|||
for the POS order and updates the 'due_amount' field accordingly. |
|||
""" |
|||
for record in self: |
|||
record.due_amount = record.amount_total - record.amount_paid |
|||
|
|||
def _order_fields(self, ui_order): |
|||
""" |
|||
Prepare dictionary for create method |
|||
|
|||
This method prepares a dictionary of order fields for creating a POS order based |
|||
on the data from the user interface (UI) order. |
|||
""" |
|||
result = super()._order_fields(ui_order) |
|||
result['is_partial_payment'] = ui_order.get('is_partial_payment') |
|||
return result |
|||
|
|||
def action_pos_order_paid(self): |
|||
""" |
|||
Mark the POS order as paid. This method marks the POS order as |
|||
paid and ensures that it is fully paid based on the partial |
|||
payment. |
|||
""" |
|||
self.ensure_one() |
|||
# TODO: add support for mix of cash and non-cash payments when both cash_rounding and only_round_cash_method are True |
|||
if not self.config_id.cash_rounding \ |
|||
or self.config_id.only_round_cash_method \ |
|||
and not any( |
|||
p.payment_method_id.is_cash_count for p in self.payment_ids): |
|||
total = self.amount_total |
|||
else: |
|||
total = float_round(self.amount_total, |
|||
precision_rounding=self.config_id.rounding_method.rounding, |
|||
rounding_method=self.config_id.rounding_method.rounding_method) |
|||
isPaid = float_is_zero(total - self.amount_paid, |
|||
precision_rounding=self.currency_id.rounding) |
|||
if not isPaid: |
|||
pos_config = self.env['pos.config'].search([]) |
|||
for shop in pos_config: |
|||
if shop.partial_payment: |
|||
isPaid = True |
|||
if not isPaid and not self.config_id.cash_rounding: |
|||
raise UserError(_("Order %s is not fully paid.", self.name)) |
|||
elif not isPaid and self.config_id.cash_rounding: |
|||
currency = self.currency_id |
|||
if self.config_id.rounding_method.rounding_method == "HALF-UP": |
|||
maxDiff = currency.round( |
|||
self.config_id.rounding_method.rounding / 2) |
|||
else: |
|||
maxDiff = currency.round( |
|||
self.config_id.rounding_method.rounding) |
|||
|
|||
diff = currency.round(self.amount_total - self.amount_paid) |
|||
if not abs(diff) <= maxDiff: |
|||
raise UserError(_("Order %s is not fully paid.", self.name)) |
|||
self.write({'state': 'paid'}) |
|||
return True |
|||
|
|||
@api.model |
|||
def search_partial_order_ids(self, config_id, domain, limit, offset): |
|||
"""Search for 'partial' orders that satisfy the given domain, |
|||
limit and offset.""" |
|||
default_domain = ['&', ('config_id', '=', config_id), |
|||
('is_partial_payment', '=', True), '!', '|', |
|||
('state', '=', 'draft'), ('state', '=', 'cancelled')] |
|||
real_domain = AND([domain, default_domain]) |
|||
ids = self.search(AND([domain, default_domain]), limit=limit, |
|||
offset=offset).ids |
|||
totalCount = self.search_count(real_domain) |
|||
return {'ids': ids, 'totalCount': totalCount} |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from odoo import models |
|||
|
|||
|
|||
class PosSession(models.Model): |
|||
""" |
|||
This class extends the 'pos.session' model to add functionality related to loading |
|||
parameters of the 'res.partner' model within the session |
|||
""" |
|||
_inherit = 'pos.session' |
|||
|
|||
def _loader_params_res_partner(self): |
|||
""" |
|||
This function loads the parameters of res.partner in the session. |
|||
---------------------------------------- |
|||
@param self: object pointer |
|||
@return result: params of res.partner model |
|||
""" |
|||
result = super(PosSession, self)._loader_params_res_partner() |
|||
result['search_params']['fields'].append('prevent_partial_payment') |
|||
return result |
@ -0,0 +1,35 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# Author: Anfas Faisal K (odoo@cybrosys.info) |
|||
# |
|||
# You can modify it under the terms of the GNU AFFERO |
|||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|||
# (AGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
from odoo import fields, models |
|||
|
|||
|
|||
class ResPartner(models.Model): |
|||
""" |
|||
This class extends the 'res.partner' model to introduce the 'prevent_partial_payment' |
|||
field. |
|||
""" |
|||
_inherit = 'res.partner' |
|||
|
|||
prevent_partial_payment = fields.Boolean( |
|||
string="Dont allow Partial Payment in POS", |
|||
help="If enabled, partial payments will be prevented for Point of Sale " |
|||
"orders associated with this partner.") |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
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 |
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 |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 180 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,656 @@ |
|||
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;"> |
|||
<!-- TITLE BAR --> |
|||
<div class="d-flex align-items-center justify-content-between" |
|||
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
|||
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" |
|||
style="width: 42px; height: 42px;"/> |
|||
<div> |
|||
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Community |
|||
</div> |
|||
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Enterprise |
|||
</div> |
|||
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
|||
class="mr-2"> |
|||
<i class="fa fa-check mr-1"></i>Odoo.sh |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF TITLE BAR --> |
|||
<div class="container"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-12 col-lg-12"> |
|||
<!-- APP HERO --> |
|||
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> |
|||
POS Partial Payment |
|||
</h1> |
|||
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> |
|||
A Module For Configuring Partial Payment In POS. |
|||
</p> |
|||
<!-- END OF APP HERO --> |
|||
<img src="assets/screenshots/v16-hero.gif" |
|||
class="img-responsive" |
|||
style="width: 100%; margin-left: auto; margin-right: auto;"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- NAVIGATION SECTION --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/compass.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Explore This |
|||
Module</h2> |
|||
</div> |
|||
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;"> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#overview"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn more about this module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#features"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View features of this module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6 my-3"> |
|||
<a href="#screenshots"> |
|||
<div class="d-flex justify-content-between align-items-center" |
|||
style="background-color: #f5f5f5; padding: 30px; width: 100%;"> |
|||
<div> |
|||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> |
|||
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View |
|||
screenshots for this |
|||
module</span> |
|||
</div> |
|||
<img src="assets/misc/right-arrow.png" width="36" height="36"/> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<!-- END OF NAVIGATION SECTION --> |
|||
|
|||
<!-- OVERVIEW SECTION --> |
|||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pie-chart.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Overview </h2> |
|||
</div> |
|||
<div class="row" |
|||
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="col-sm-12 py-4"> |
|||
The Odoo POS Partial Payment Module enables customers to make partial payments instead of paying the full amount at the point of sale . This feature offers flexibility in handling payments and allows for more convenient transaction processing. |
|||
<!-- END OF OVERVIEW SECTION --> |
|||
<!-- FEATURES SECTION --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" |
|||
id="features"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/features.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Features |
|||
</h2> |
|||
</div> |
|||
<div class="row" |
|||
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;"> |
|||
<div class="d-flex align-items-center" |
|||
style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Enables sellers to allow partial payment in POS for customers |
|||
</span> |
|||
</div> |
|||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Register payments for the invoice from Odoo backend</span> |
|||
</div> |
|||
|
|||
<div class="d-flex align-items-center" |
|||
style="margin-top: 30px; margin-bottom: 30px"> |
|||
<img src="assets/misc/check-box.png" class="mr-2"/> |
|||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Set partial payment option as per your wish |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6"> |
|||
</div> |
|||
<!-- END OF FEATURES SECTION --> |
|||
<!-- SCREENSHOTS SECTION --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" |
|||
id="screenshots"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/pictures.png"/> |
|||
</div> |
|||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots</h2> |
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<div class="col-sm-12"> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Allow Partial Payment In Pos Session |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|||
In the Pos Config Enable Partial Payment in POS to make Partial Payments in POS Session. |
|||
</p> |
|||
<img src="assets/screenshots/1.png" class="img-thumbnail"> |
|||
</div> |
|||
|
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Validating Partial Payment In POS |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|||
You have to enable Invoice and Partial Payment in Payment Screen to Allow Partial Payment in POS Screen. |
|||
</p> |
|||
<img src="assets/screenshots/2.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Click On The Validate Button To Make Partial Payment In POS |
|||
</h3> |
|||
<img src="assets/screenshots/3.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Once The Payment Is Done It Will Redirect Us To The Receipt Status Page |
|||
</h3> |
|||
<img src="assets/screenshots/4.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
POS Partial Payment View |
|||
</h3> |
|||
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
|||
Provide option to see POS partial payments from the POS screen. |
|||
</p> |
|||
<img src="assets/screenshots/8.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Partial Payment Saved In The Backend |
|||
</h3> |
|||
<img src="assets/screenshots/6.png" class="img-thumbnail"> |
|||
</div> |
|||
<div style="display: block; margin: 30px auto;"> |
|||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
|||
Make Rest Of the Payment In The POS Backend |
|||
</h3> |
|||
<img src="assets/screenshots/9.png" class="img-thumbnail"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF SCREENSHOTS SECTION --> |
|||
|
|||
<!-- RELATED PRODUCTS --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/categories.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Related |
|||
Products |
|||
</h2> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12"> |
|||
<div id="demo1" class="row carousel slide" data-ride="carousel"> |
|||
<!-- The slideshow --> |
|||
<div class="carousel-inner" style="padding: 30px;"> |
|||
<div class="carousel-item" |
|||
style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/carry_bag_pos/" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/1.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/custom_receipts_for_pos/#" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/2.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/login_pos_direct/#" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/3.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="carousel-item active" |
|||
style="min-height: 198.656px;"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/pos_report_generator/" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/4.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/pos_receipt_extend/" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/5.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float:left"> |
|||
<a href="https://apps.odoo.com/apps/modules/16.0/pos_product_creation/" |
|||
target="_blank"> |
|||
<div style="border-radius:10px"> |
|||
<img class="img img-responsive center-block" |
|||
style="border-radius: 0px;" |
|||
src="assets/modules/6.png"> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- Left and right controls --> |
|||
<a class="carousel-control-prev" href="#demo1" |
|||
data-slide="prev" style="width:35px; color:#000"> <span |
|||
class="carousel-control-prev-icon"><i |
|||
class="fa fa-chevron-left" |
|||
style="font-size:24px"></i></span> |
|||
</a> <a class="carousel-control-next" href="#demo1" |
|||
data-slide="next" style="width:35px; color:#000"> |
|||
<span class="carousel-control-next-icon"><i |
|||
class="fa fa-chevron-right" |
|||
style="font-size:24px"></i></span> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF RELATED PRODUCTS --> |
|||
<!-- OUR SERVICES --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/star.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Our Services |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/cogs.png" class="img-responsive" |
|||
height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Customization</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/wrench.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/lifebuoy.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Support</h6> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/user.png" class="img-responsive" |
|||
height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Hire Odoo Developer</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/puzzle.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Integration</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/update.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Migration</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/consultation.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Consultancy</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/training.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Implementation</h6> |
|||
</div> |
|||
|
|||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4"> |
|||
<div class="d-flex justify-content-center align-items-center mx-3 my-3" |
|||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;"> |
|||
<img src="assets/icons/license.png" |
|||
class="img-responsive" height="48px" width="48px"> |
|||
</div> |
|||
<h6 class="text-center" |
|||
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;"> |
|||
Odoo |
|||
Licensing Consultancy</h6> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<!-- END OF OUR SERVICES --> |
|||
|
|||
<!-- OUR INDUSTRIES --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/corporate.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Our |
|||
Industries |
|||
</h2> |
|||
</div> |
|||
|
|||
<div class="container my-5"> |
|||
<div class="row"> |
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/trading-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Trading |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easily procure |
|||
and |
|||
sell your products</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/pos-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
POS |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Easy |
|||
configuration |
|||
and convivial experience</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/education-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Education |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
A platform for |
|||
educational management</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/manufacturing-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Manufacturing |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Plan, track and |
|||
schedule your operations</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/ecom-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
E-commerce & Website |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Mobile |
|||
friendly, |
|||
awe-inspiring product pages</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/service-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Service Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Keep track of |
|||
services and invoice</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/restaurant-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Restaurant |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
Run your bar or |
|||
restaurant methodically</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-lg-3"> |
|||
<div class="my-4 d-flex flex-column justify-content-center" |
|||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;"> |
|||
<img src="assets/icons/hotel-black.png" |
|||
class="img-responsive mb-3" height="48px" |
|||
width="48px"> |
|||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;"> |
|||
Hotel Management |
|||
</h5> |
|||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;"> |
|||
An |
|||
all-inclusive |
|||
hotel management application</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- END OF OUR INDUSTRIES --> |
|||
|
|||
<!-- SUPPORT --> |
|||
<div class="d-flex align-items-center" |
|||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"> |
|||
<div class="d-flex justify-content-center align-items-center mr-2" |
|||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> |
|||
<img src="assets/misc/customer-support.png"/> |
|||
</div> |
|||
<h2 class="mt-2" |
|||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;"> |
|||
Support |
|||
</h2> |
|||
</div> |
|||
<div class="container mt-5"> |
|||
<div class="row"> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|||
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/support.png" height="48" |
|||
width="48" style="width: 42px; height: 42px;"/> |
|||
</div> |
|||
<div> |
|||
<h4>Need Help?</h4> |
|||
<p style="line-height: 100%;">Got questions or need |
|||
help? Get in touch.</p> |
|||
<a href="mailto:odoo@cybrosys.com"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|||
odoo@cybrosys.com</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-sm-12 col-md-6"> |
|||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;"> |
|||
<div class="mr-4 d-flex justify-content-center align-items-center" |
|||
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;"> |
|||
<img src="assets/misc/whatsapp.png" height="52" |
|||
width="52" style="width: 52px; height: 52px;"/> |
|||
</div> |
|||
<div> |
|||
<h4>WhatsApp</h4> |
|||
<p style="line-height: 100%;">Say hi to us on |
|||
WhatsApp!</p> |
|||
<a href="https://api.whatsapp.com/send?phone=918606827707"> |
|||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;"> |
|||
+91 86068 |
|||
27707</p> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center"> |
|||
<img src="assets/misc/logo.png" width="144" height="31" |
|||
style="width:144px; height: 31px; margin-top: 40px;"/> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- END OF SUPPORT --> |
@ -0,0 +1,26 @@ |
|||
/** @odoo-module **/ |
|||
import models from 'point_of_sale.models'; |
|||
import {Order} from 'point_of_sale.models'; |
|||
import Registries from "point_of_sale.Registries"; |
|||
// Define the Partial class
|
|||
const Partial = (Order) => class Partial extends Order { |
|||
constructor() { |
|||
super(...arguments); |
|||
this.partial_payment = false |
|||
this.is_partial_payment = this.is_partial_payment || false; |
|||
} |
|||
set_order_suggestion(suggestion){ |
|||
this.is_partial_payment = is_partial_payment |
|||
} |
|||
//send order data to send to the server
|
|||
export_as_JSON() { |
|||
const json = super.export_as_JSON(...arguments) |
|||
json.is_partial_payment = this.is_partial_payment ; |
|||
return json; |
|||
} |
|||
init_from_JSON(json) { |
|||
super.init_from_JSON(...arguments); |
|||
this.is_partial_payment = json.is_partial_payment; |
|||
} |
|||
}; |
|||
Registries.Model.extend(Order, Partial) |
@ -0,0 +1,76 @@ |
|||
odoo.define('pos_button.CustomButtonPaymentScreen', function (require) { |
|||
'use strict'; |
|||
const { Gui } = require('point_of_sale.Gui'); |
|||
const PosComponent = require('point_of_sale.PosComponent'); |
|||
const { identifyError } = require('point_of_sale.utils'); |
|||
const ProductScreen = require('point_of_sale.ProductScreen'); |
|||
const { useListener } = require("@web/core/utils/hooks"); |
|||
const Registries = require('point_of_sale.Registries'); |
|||
const PaymentScreen = require('point_of_sale.PaymentScreen'); |
|||
const Chrome = require('point_of_sale.Chrome'); |
|||
const { useRef } = owl; |
|||
|
|||
// Define the PartialPaymentButtonPaymentScreen class
|
|||
const PartialPaymentButtonPaymentScreen = (PaymentScreen) => |
|||
class extends PaymentScreen { |
|||
setup() { |
|||
super.setup(); |
|||
this.root = useRef('PartialPayment'); |
|||
} |
|||
//Partial Payment Button Functionality
|
|||
PartialPaymentButton() { |
|||
if (this.currentOrder.partial_payment === false) { |
|||
this.currentOrder.partial_payment = true; |
|||
var validate = this.root.el |
|||
$(validate).addClass('highlight'); |
|||
} else { |
|||
this.currentOrder.partial_payment = false; |
|||
var validate = this.root.el |
|||
$(validate).removeClass('highlight'); |
|||
} |
|||
} |
|||
//Validate Payment Button Functionality
|
|||
async validateOrder(isForceValidate) { |
|||
if (!this.currentOrder.partial_payment){ |
|||
await super.validateOrder(isForceValidate); |
|||
} |
|||
else{ |
|||
if (this.currentOrder.get_partner().prevent_partial_payment ) { |
|||
this.showPopup('ErrorPopup', { |
|||
title: this.env._t('Partial Payment Not Allowed'), |
|||
body: this.env._t( |
|||
'The Customer is not allowed to make Partial Payments.' |
|||
), |
|||
}); |
|||
return false; |
|||
}; |
|||
//If Invoice not Selected Show Error
|
|||
if(!this.currentOrder.to_invoice){ |
|||
this.showPopup('ErrorPopup', { |
|||
title: this.env._t('Cannot Validate This Order'), |
|||
body: this.env._t( |
|||
'You need to Set Invoice for Validating Partial Payments' |
|||
), |
|||
}); |
|||
return false; |
|||
}; |
|||
//If amount is fully paid show error
|
|||
if(!this.currentOrder.get_due()){ |
|||
this.showPopup('ErrorPopup', { |
|||
title: this.env._t('Cannot Validate This Order'), |
|||
body: this.env._t( |
|||
'The Amount is Fully Paid Disable Partial Payment to Validate this Order' |
|||
), |
|||
}); |
|||
return false; |
|||
}; |
|||
this.currentOrder.is_partial_payment = true |
|||
this._isOrderValid(isForceValidate) |
|||
await this._finalizeValidation(); |
|||
} |
|||
await super.validateOrder(isForceValidate); |
|||
} |
|||
}; |
|||
Registries.Component.extend(PaymentScreen, PartialPaymentButtonPaymentScreen); |
|||
return PartialPaymentButtonPaymentScreen; |
|||
}); |
@ -0,0 +1,79 @@ |
|||
/** @odoo-module **/ |
|||
import { patch } from "@web/core/utils/patch"; |
|||
const { Order } = require('point_of_sale.models'); |
|||
import TicketScreen from 'point_of_sale.TicketScreen'; |
|||
|
|||
patch(TicketScreen.prototype, 'TicketScreen', { |
|||
//Create a new filter in POS FRONT END
|
|||
_getFilterOptions() { |
|||
const orderStates = this._getOrderStates(); |
|||
orderStates.set('SYNCED', { text: this.env._t('Paid') }); |
|||
orderStates.set('PARTIAL', { text: this.env._t('Partial') }); |
|||
return orderStates; |
|||
}, |
|||
//When Selecting Partial Payment Filter Function Works
|
|||
async _onFilterSelected(event) { |
|||
this._state.ui.filter = event.detail.filter; |
|||
if (this._state.ui.filter == 'SYNCED') { |
|||
await this._fetchSyncedOrders(); |
|||
} |
|||
if (this._state.ui.filter == 'PARTIAL') { |
|||
await this._fetchPartialOrders(); |
|||
} |
|||
}, |
|||
//Search Function Overriding to add functionality Partial
|
|||
async _onSearch(event) { |
|||
Object.assign(this._state.ui.searchDetails, event.detail); |
|||
if (this._state.ui.filter == 'SYNCED') { |
|||
this._state.syncedOrders.currentPage = 1; |
|||
await this._fetchSyncedOrders(); |
|||
} |
|||
if (this._state.ui.filter == 'PARTIAL') { |
|||
this._state.syncedOrders.currentPage = 1; |
|||
await this._fetchPartialOrders(); |
|||
} |
|||
}, |
|||
//Fetching Partial Orders
|
|||
async _fetchPartialOrders() { |
|||
const domain = this._computeSyncedOrdersDomain(); |
|||
const limit = this._state.syncedOrders.nPerPage; |
|||
const offset = (this._state.syncedOrders.currentPage - 1) * this._state.syncedOrders.nPerPage; |
|||
const { ids, totalCount } = await this.rpc({ |
|||
model: 'pos.order', |
|||
method: 'search_partial_order_ids', |
|||
kwargs: { config_id: this.env.pos.config.id, domain, limit, offset }, |
|||
context: this.env.session.user_context, |
|||
}); |
|||
const idsNotInCache = ids.filter((id) => !(id in this._state.syncedOrders.cache)); |
|||
if (idsNotInCache.length > 0) { |
|||
const fetchedOrders = await this.rpc({ |
|||
model: 'pos.order', |
|||
method: 'export_for_ui', |
|||
args: [idsNotInCache], |
|||
context: this.env.session.user_context, |
|||
}); |
|||
// Check for missing products and partners and load them in the PoS
|
|||
await this.env.pos._loadMissingProducts(fetchedOrders); |
|||
await this.env.pos._loadMissingPartners(fetchedOrders); |
|||
// Cache these fetched orders so that next time, no need to fetch
|
|||
// them again, unless invalidated. See `_onInvoiceOrder`.
|
|||
fetchedOrders.forEach((order) => { |
|||
this._state.syncedOrders.cache[order.id] = Order.create({}, { pos: this.env.pos, json: order }); |
|||
}); |
|||
} |
|||
this._state.syncedOrders.totalCount = totalCount; |
|||
this._state.syncedOrders.toShow = ids.map((id) => this._state.syncedOrders.cache[id]); |
|||
}, |
|||
//Adding Functionality POS FILTER to Show in POS FRONTEND
|
|||
getFilteredOrderList() { |
|||
if (this._state.ui.filter == 'PARTIAL') return this._state.syncedOrders.toShow; |
|||
return this._super(...arguments); |
|||
}, |
|||
//Adding Functionality on Selecting Partial Order to be shown on POS FRONTEND
|
|||
getSelectedSyncedOrder() { |
|||
if (this._state.ui.filter == 'PARTIAL') { |
|||
return this._state.syncedOrders.cache[this._state.ui.selectedSyncedOrderId]; |
|||
} |
|||
return this._super(...arguments); |
|||
} |
|||
}) |
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<templates id="partial_button" xml:space="preserve"> |
|||
<t t-inherit="point_of_sale.PaymentScreen" t-inherit-mode="extension"> |
|||
<!--Adding the Partial Payment button in Payment Screen--> |
|||
<xpath expr="//div[hasclass('payment-controls')]" position="inside"> |
|||
<t t-if="env.pos.config.partial_payment"> |
|||
<div t-ref="partialPaymentRoot"> |
|||
<div class="button js_invoice" |
|||
t-ref="" |
|||
t-on-click="PartialPaymentButton" |
|||
t-att-class="{ highlight: currentOrder.partial_payment }"> |
|||
<i class="fa fa-file-text-o"/> |
|||
Partial Payment |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</xpath> |
|||
<!--Adding T-ref--> |
|||
<xpath expr="//div[hasclass('next')]" position="attributes"> |
|||
<attribute name="t-ref">PartialPayment</attribute> |
|||
</xpath> |
|||
</t> |
|||
</templates> |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Inherit the view of pos.config to add fields --> |
|||
<record id="pos_config_view_form" model="ir.ui.view"> |
|||
<field name="name">pos.config.view.form.inherit.pos.partial.payment.odoo</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='other_devices']" position="after"> |
|||
<div class="col-12 col-lg-6 o_setting_box"> |
|||
<div class="o_setting_left_pane"> |
|||
<field name="partial_payment"/> |
|||
</div> |
|||
<div class="o_setting_right_pane"> |
|||
<label for="partial_payment"/> |
|||
<div class="text-muted"> |
|||
Allow Partial Payments in Invoice |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,61 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- Inherit the view of pos.order to add ribbon and fields --> |
|||
<record id="view_pos_pos_form" model="ir.ui.view"> |
|||
<field name="name">pos.order.view.form.inherit.pos.partial.payment.odoo</field> |
|||
<field name="model">pos.order</field> |
|||
<field name="inherit_id" ref="point_of_sale.view_pos_pos_form"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//div[hasclass('oe_button_box')]" position="after"> |
|||
<widget name="web_ribbon" title="Partial" |
|||
bg_color="bg-success" |
|||
attrs="{'invisible': [('is_partial_payment', '=', False)]}"/> |
|||
</xpath> |
|||
<xpath expr="//group[@name='order_total']" position="replace"> |
|||
<group class="oe_subtotal_footer oe_right" colspan="2" |
|||
name="order_total"> |
|||
<field name="is_partial_payment" invisible="1"/> |
|||
<field name="amount_tax" |
|||
force_save="1" |
|||
widget="monetary"/> |
|||
<div class="oe_subtotal_footer_separator oe_inline o_td_label"> |
|||
<label for="amount_total"/> |
|||
<button name="button_dummy" |
|||
states="draft" string="(update)" |
|||
class="oe_edit_only oe_link"/> |
|||
</div> |
|||
<field name="amount_total" |
|||
force_save="1" |
|||
nolabel="1" |
|||
class="oe_subtotal_footer_separator" |
|||
widget="monetary"/> |
|||
<field name="amount_paid" |
|||
string="Total Paid (with rounding)" |
|||
class="oe_subtotal_footer_separator" |
|||
widget="monetary" |
|||
attrs="{'invisible': [('amount_paid','=', 'amount_total')]}"/> |
|||
<field name="due_amount" |
|||
string="Due Amount" |
|||
class="oe_subtotal_footer_separator" |
|||
widget="monetary" |
|||
attrs="{'invisible': [('is_partial_payment','=', False)]}"/> |
|||
<label for="margin"/> |
|||
<div class="text-nowrap"> |
|||
<field name="margin" class="oe_inline" |
|||
attrs="{'invisible': [('is_total_cost_computed','=', False)]}"/> |
|||
<span class="oe_inline" |
|||
attrs="{'invisible': [('is_total_cost_computed','=', False)]}"> |
|||
(<field name="margin_percent" nolabel="1" |
|||
class="oe_inline" widget="percentage"/>) |
|||
</span> |
|||
<span attrs="{'invisible': [('is_total_cost_computed','=', True)]}"> |
|||
TBD |
|||
</span> |
|||
</div> |
|||
<field name="is_total_cost_computed" invisible="1"/> |
|||
<field name="currency_id" invisible="1"/> |
|||
</group> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8" ?> |
|||
<odoo> |
|||
<!-- Inherit the view of res.partner to add fields --> |
|||
<record id="view_partner_form" model="ir.ui.view"> |
|||
<field name="name">res.partner.view.form.inherit.pos.partial.payment.odoo</field> |
|||
<field name="model">res.partner</field> |
|||
<field name="inherit_id" ref="base.view_partner_form" /> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='property_payment_term_id']" position="after"> |
|||
<field name="prevent_partial_payment" /> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |