@ -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:(V15) Mruthul Raj, 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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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,59 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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': '15.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', |
||||
|
|
||||
|
], 'web.assets_qweb': [ |
||||
|
'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.06.2024 |
||||
|
#### Version 15.0.1.0.0 |
||||
|
### ADD |
||||
|
|
||||
|
- Initial Commit for POS Partial Payment |
@ -0,0 +1,26 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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,131 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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", |
||||
|
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} |
||||
|
|
||||
|
@api.model_create_multi |
||||
|
def create(self, vals_list): |
||||
|
"""Super create function""" |
||||
|
if vals_list[0]['amount_paid'] < vals_list[0]['amount_total']: |
||||
|
vals_list[0]['is_partial_payment'] = True |
||||
|
return super(PosOrder, self).create(vals_list) |
@ -0,0 +1,54 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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 _pos_ui_models_to_load(self): |
||||
|
""" |
||||
|
Returns a list of models to load for the POS UI with 'res.users' |
||||
|
added to the list. |
||||
|
""" |
||||
|
result = super()._pos_ui_models_to_load() |
||||
|
result.append('res.partner') |
||||
|
return result |
||||
|
|
||||
|
def _loader_params_res_partner(self): |
||||
|
"""Load res.config.settings parameters""" |
||||
|
return { |
||||
|
'search_params': { |
||||
|
'fields': ['prevent_partial_payment'] |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
def _get_pos_ui_res_partner(self, params): |
||||
|
""" |
||||
|
Returns a list of dictionaries containing the names of all users in the |
||||
|
'res.users' model. |
||||
|
""" |
||||
|
return self.env['res.partner'].search_read(**params['search_params']) |
@ -0,0 +1,35 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Mruthul Raj(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: 57 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 1.8 MiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 58 KiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 288 KiB |
After Width: | Height: | Size: 234 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 8.9 KiB |
@ -0,0 +1,652 @@ |
|||||
|
<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/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 --> |
||||
|
|
||||
|
<!-- 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/pos_order_types/" |
||||
|
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/1.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
||||
|
style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/pos_product_addons/" |
||||
|
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/2.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
||||
|
style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/dashboard_pos/" |
||||
|
target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" |
||||
|
style="border-top-left-radius:10px; border-top-right-radius:10px" |
||||
|
src="./assets/modules/3.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="carousel-item" style="min-height:0px"> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
||||
|
style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/product_return_pos/" |
||||
|
target="_blank"> |
||||
|
<div style="border-radius:10px"> |
||||
|
<img class="img img-responsive center-block" |
||||
|
style="border-top-left-radius:10px; border-top-right-radius:10px" |
||||
|
src="./assets/modules/4.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
||||
|
style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/point_of_sale_logo" |
||||
|
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/5.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
||||
|
style="float:left"> |
||||
|
<a href="https://apps.odoo.com/apps/modules/15.0/pos_chatter/" |
||||
|
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/6.png"> |
||||
|
</div> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- Left and right controls --> |
||||
|
<a class="carousel-control-prev" href="#demo1" data-slide="prev" |
||||
|
style="left:-25px;width: 35px;color: #000;"> <span |
||||
|
class="carousel-control-prev-icon"><i |
||||
|
class="fa fa-chevron-left" |
||||
|
style="font-size:24px"></i></span> </a> <a |
||||
|
class="carousel-control-next" href="#demo1" |
||||
|
data-slide="next" |
||||
|
style="right:-25px;width: 35px;color: #000;"> |
||||
|
<span class="carousel-control-next-icon"><i |
||||
|
class="fa fa-chevron-right" |
||||
|
style="font-size:24px"></i></span> |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF SUGGESTED 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,5 @@ |
|||||
|
odoo.define('pos_partial_payment_odoo.models', function(require) { |
||||
|
var models = require('point_of_sale.models'); |
||||
|
models.load_fields('res.partner', ['prevent_partial_payment']); |
||||
|
models.load_fields('pos.order', ['is_partial_payment']) |
||||
|
}); |
@ -0,0 +1,85 @@ |
|||||
|
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.hooks; |
||||
|
// 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_client()){ |
||||
|
if (this.currentOrder.get_client().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(); |
||||
|
}else{ |
||||
|
this.showPopup('ErrorPopup', { |
||||
|
title: this.env._t('Choose Any Customer'), |
||||
|
body: this.env._t( |
||||
|
'Choose a customer for making partial payments.' |
||||
|
), |
||||
|
}); |
||||
|
return false; |
||||
|
} |
||||
|
await super.validateOrder(isForceValidate); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
}; |
||||
|
Registries.Component.extend(PaymentScreen, PartialPaymentButtonPaymentScreen); |
||||
|
return PartialPaymentButtonPaymentScreen; |
||||
|
}); |
@ -0,0 +1,90 @@ |
|||||
|
/** @odoo-module **/ |
||||
|
import { patch } from "@web/core/utils/patch"; |
||||
|
const { Order } = require('point_of_sale.models'); |
||||
|
import TicketScreen from 'point_of_sale.TicketScreen'; |
||||
|
const models = require('point_of_sale.models'); |
||||
|
|
||||
|
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(); |
||||
|
} |
||||
|
this.render(); |
||||
|
}, |
||||
|
//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] = new models.Order({}, { 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='iface_tipproduct']" 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> |