Browse Source

sep 14 : [ADD] Initial Commit 'website_sale_address_management'

pull/278/head
Shijin V 2 years ago
parent
commit
89dc1d7e66
  1. 47
      website_sale_address_management/README.rst
  2. 23
      website_sale_address_management/__init__.py
  3. 54
      website_sale_address_management/__manifest__.py
  4. 22
      website_sale_address_management/controllers/__init__.py
  5. 194
      website_sale_address_management/controllers/website_sale_address_management.py
  6. 6
      website_sale_address_management/doc/RELEASE_NOTES.md
  7. 22
      website_sale_address_management/models/__init__.py
  8. 145
      website_sale_address_management/models/res_config_settings.py
  9. BIN
      website_sale_address_management/static/description/assets/icons/check.png
  10. BIN
      website_sale_address_management/static/description/assets/icons/chevron.png
  11. BIN
      website_sale_address_management/static/description/assets/icons/cogs.png
  12. BIN
      website_sale_address_management/static/description/assets/icons/consultation.png
  13. BIN
      website_sale_address_management/static/description/assets/icons/ecom-black.png
  14. BIN
      website_sale_address_management/static/description/assets/icons/education-black.png
  15. BIN
      website_sale_address_management/static/description/assets/icons/hotel-black.png
  16. BIN
      website_sale_address_management/static/description/assets/icons/license.png
  17. BIN
      website_sale_address_management/static/description/assets/icons/lifebuoy.png
  18. BIN
      website_sale_address_management/static/description/assets/icons/manufacturing-black.png
  19. BIN
      website_sale_address_management/static/description/assets/icons/pos-black.png
  20. BIN
      website_sale_address_management/static/description/assets/icons/puzzle.png
  21. BIN
      website_sale_address_management/static/description/assets/icons/restaurant-black.png
  22. BIN
      website_sale_address_management/static/description/assets/icons/service-black.png
  23. BIN
      website_sale_address_management/static/description/assets/icons/trading-black.png
  24. BIN
      website_sale_address_management/static/description/assets/icons/training.png
  25. BIN
      website_sale_address_management/static/description/assets/icons/update.png
  26. BIN
      website_sale_address_management/static/description/assets/icons/user.png
  27. BIN
      website_sale_address_management/static/description/assets/icons/wrench.png
  28. BIN
      website_sale_address_management/static/description/assets/misc/categories.png
  29. BIN
      website_sale_address_management/static/description/assets/misc/check-box.png
  30. BIN
      website_sale_address_management/static/description/assets/misc/compass.png
  31. BIN
      website_sale_address_management/static/description/assets/misc/corporate.png
  32. BIN
      website_sale_address_management/static/description/assets/misc/customer-support.png
  33. BIN
      website_sale_address_management/static/description/assets/misc/cybrosys-logo.png
  34. BIN
      website_sale_address_management/static/description/assets/misc/features.png
  35. BIN
      website_sale_address_management/static/description/assets/misc/logo.png
  36. BIN
      website_sale_address_management/static/description/assets/misc/pictures.png
  37. BIN
      website_sale_address_management/static/description/assets/misc/pie-chart.png
  38. BIN
      website_sale_address_management/static/description/assets/misc/right-arrow.png
  39. BIN
      website_sale_address_management/static/description/assets/misc/star.png
  40. BIN
      website_sale_address_management/static/description/assets/misc/support.png
  41. BIN
      website_sale_address_management/static/description/assets/misc/whatsapp.png
  42. BIN
      website_sale_address_management/static/description/assets/modules/11.png
  43. BIN
      website_sale_address_management/static/description/assets/modules/12.png
  44. BIN
      website_sale_address_management/static/description/assets/modules/13.png
  45. BIN
      website_sale_address_management/static/description/assets/modules/14.png
  46. BIN
      website_sale_address_management/static/description/assets/modules/15.png
  47. BIN
      website_sale_address_management/static/description/assets/modules/16.png
  48. BIN
      website_sale_address_management/static/description/assets/screenshots/billing_address.png
  49. BIN
      website_sale_address_management/static/description/assets/screenshots/config_setting.png
  50. BIN
      website_sale_address_management/static/description/assets/screenshots/hero.gif
  51. BIN
      website_sale_address_management/static/description/assets/screenshots/payment_page.png
  52. BIN
      website_sale_address_management/static/description/assets/screenshots/shipping_address.png
  53. BIN
      website_sale_address_management/static/description/banner.jpg
  54. BIN
      website_sale_address_management/static/description/icon.png
  55. 646
      website_sale_address_management/static/description/index.html
  56. 16
      website_sale_address_management/static/src/css/address_management.css
  57. 131
      website_sale_address_management/views/res_config_settings_views.xml
  58. 363
      website_sale_address_management/views/website_sale_templates.xml

47
website_sale_address_management/README.rst

@ -0,0 +1,47 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Website Sale Address Management
=================================
This Module Helps You to Filter Fields in Address Form and Show or Hide Fields by Switching on/off Toggles.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
Affero General Public License, Version 3 (AGPL v3)
( https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Credits
-------
* Developers: (Version 16) Rahul Rajeev @cybrosys ,Jumana Jabin MP @cybrosys
Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

23
website_sale_address_management/__init__.py

@ -0,0 +1,23 @@
# -- coding: utf-8 --
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
################################################################################
from . import controllers
from . import models

54
website_sale_address_management/__manifest__.py

@ -0,0 +1,54 @@
# -- coding: utf-8 --
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': "Website Sale Address Management",
'version': '16.0.1.0.0',
'category': 'Website',
'summary': """This module helps you to show or hide fields by switching
on/off toggles,set fields as mandatory or not and set default country.""",
'description': """This module helps you to show or hide fields by switching
on/off toggles.You can set fields as mandatory or not and also set default
country.All of these features can be changed from configuration settings
of Website module.""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['base', 'website_sale'],
'data': [
'views/res_config_settings_views.xml',
'views/website_sale_templates.xml',
],
'assets': {
'web.assets_backend': [
'website_sale_address_management/static/src/css/'
'address_management.css',
],
},
'images': [
'static/description/banner.jpg',
],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

22
website_sale_address_management/controllers/__init__.py

@ -0,0 +1,22 @@
# -- coding: utf-8 --
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
################################################################################
from . import website_sale_address_management

194
website_sale_address_management/controllers/website_sale_address_management.py

@ -0,0 +1,194 @@
# -- coding: utf-8 --
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
################################################################################
from odoo import http, tools, _
from odoo.exceptions import ValidationError
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
class WebsiteSale(http.Controller):
"""class used to monkey patch functions in class WebsiteSale"""
def checkout_form_validate(self, mode, all_form_values, data):
"""function to monkey patch function checkout_form_validate and
remove not required fields from list required_fields"""
# mode: tuple ('new|edit', 'billing|shipping')
# all_form_values: all values before preprocess
# data: values after preprocess
error = dict()
error_message = []
if not data.get('country_id'):
default_country_id = request.env[
'ir.config_parameter'].sudo().get_param('default_country_id')
if default_country_id:
data['country_id'] = int(default_country_id)
# prevent name change if invoices exist
if data.get('partner_id'):
partner = request.env['res.partner'].browse(int(data['partner_id']))
if partner.exists() and partner.name and \
not partner.sudo().can_edit_vat() and 'name' in data and (
data['name'] or False) != (partner.name or False):
error['name'] = 'error'
error_message.append(
_('Changing your name is not allowed once invoices '
'have been issued for your account. Please contact us '
'directly for this operation.'))
# Required fields from form
required_fields = [f for f in
(all_form_values.get('field_required') or '').split(
',') if f]
# Required fields from mandatory field function
country_id = int(data.get('country_id', False))
required_fields += mode[
1] == 'shipping' and \
self._get_mandatory_fields_shipping(country_id) or \
self._get_mandatory_fields_billing(country_id)
if mode[1] == 'shipping':
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_phone_is_required'):
if 'phone' in required_fields:
required_fields.remove('phone')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_zip_code_is_required'):
if 'zip' in required_fields:
required_fields.remove('zip')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_street_is_required'):
if 'street' in required_fields:
required_fields.remove('street')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_city_is_required'):
if 'city' in required_fields:
required_fields.remove('city')
elif mode[1] == 'billing':
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_phone_is_required'):
if 'phone' in required_fields:
required_fields.remove('phone')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_zip_code_is_required'):
if 'zip' in required_fields:
required_fields.remove('zip')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_street_is_required'):
if 'street' in required_fields:
required_fields.remove('street')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_city_is_required'):
if 'city' in required_fields:
required_fields.remove('city')
# error message for empty required fields
for field_name in required_fields:
if not data.get(field_name):
error[field_name] = 'missing'
# email validation
if data.get('email') and not tools.single_email_re.match(
data.get('email')):
error["email"] = 'error'
error_message.append(
_('Invalid Email! Please enter a valid email address.'))
# vat validation
Partner = request.env['res.partner']
if data.get("vat") and hasattr(Partner, "check_vat"):
if country_id:
data["vat"] = Partner.fix_eu_vat_number(country_id,
data.get("vat"))
partner_dummy = Partner.new(self._get_vat_validation_fields(data))
try:
partner_dummy.check_vat()
except ValidationError as exception:
error["vat"] = 'error'
error_message.append(exception.args[0])
if [err for err in error.values() if err == 'missing']:
error_message.append(_('Some required fields are empty.'))
return error, error_message
def _get_mandatory_fields_billing(self, country_id=False):
"""function to monkey patch function _get_mandatory_fields_billing and
remove not required fields from list req"""
req = ["name", "email", "street", "city", "country_id", "phone"]
if country_id:
country = request.env['res.country'].browse(country_id)
if country.state_required:
req += ['state_id']
if country.zip_required:
req += ['zip']
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_phone_is_required'):
req.remove('phone')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_zip_code_is_required'):
if "zip" in req:
req.remove('zip')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_street_is_required'):
req.remove('street')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_billing_city_is_required'):
req.remove('city')
return req
def _get_mandatory_fields_shipping(self, country_id=False):
"""function to monkey patch function _get_mandatory_fields_shipping and
remove not required fields from list req"""
req = ["name", "street", "city", "country_id", "phone"]
if country_id:
country = request.env['res.country'].browse(country_id)
if country.state_required:
req += ['state_id']
if country.zip_required:
req += ['zip']
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_phone_is_required'):
req.remove('phone')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_zip_code_is_required'):
if "zip" in req:
req.remove('zip')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_street_is_required'):
req.remove('street')
if not request.env['ir.config_parameter'].sudo().get_param(
'website_sale_address_management.'
'is_shipping_city_is_required'):
req.remove('city')
return req
WebsiteSale.checkout_form_validate = checkout_form_validate
WebsiteSale._get_mandatory_fields_billing = _get_mandatory_fields_billing
WebsiteSale._get_mandatory_fields_shipping = _get_mandatory_fields_shipping

6
website_sale_address_management/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <website_sale_address_management>
#### 14.09.2023
#### Version 16.0.1.0.0
#### ADD
- Initial Commit for Website Sale Address Management

22
website_sale_address_management/models/__init__.py

@ -0,0 +1,22 @@
# -- coding: utf-8 --
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies (<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
from . import res_config_settings

145
website_sale_address_management/models/res_config_settings.py

@ -0,0 +1,145 @@
# -- coding: utf-8 --
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys (<https://www.cybrosys.com>)
#
# This program is free software: you can modify
# it under the terms of the GNU Affero General Public License (AGPL) as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class ResConfigSettings(models.TransientModel):
"""Inheriting ResConfigSettings Model.
This class extends the functionality of the 'res.config.settings'
model.It allows customizing and managing configuration settings
for the module """
_inherit = 'res.config.settings'
is_billing_phone = fields.Boolean(
string="Billing Phone",
config_parameter='website_sale_address_management.is_billing_phone',
help="Enable or disable the option for billing phone")
is_billing_phone_is_required = fields.Boolean(
string="Billing Phone Required",
config_parameter='website_sale_address_management'
'.is_billing_phone_is_required',
help="Specify whether billing phone is required")
is_billing_street = fields.Boolean(
string="Billing Street",
config_parameter='website_sale_address_management.is_billing_street',
help="Enable or disable the option for billing street")
is_billing_street_is_required = fields.Boolean(
string="Billing Street Is Required",
config_parameter='website_sale_address_management.'
'is_billing_street_is_required',
help="Specify whether billing street is required")
is_billing_street2 = fields.Boolean(
string="Billing Street 2",
config_parameter='website_sale_address_management.is_billing_street2',
help="Enable or disable the option for billing street 2")
is_billing_city = fields.Boolean(
string="Billing City",
config_parameter='website_sale_address_management.is_billing_city',
help="Enable or disable the option for billing city")
is_billing_city_is_required = fields.Boolean(
string="Billing City Is Required",
config_parameter='website_sale_address_management'
'.is_billing_city_is_required',
help="Specify whether billing city is required")
billing_country_id = fields.Many2one('res.country',
config_parameter='billing_country',
string="Default Billing Country",
help="Specify default billing country")
is_billing_zip_code = fields.Boolean(
string="Billing ZIP Code",
config_parameter='website_sale_address_management.is_billing_zip_code',
help="Enable or disable the option for billing ZIP code")
is_billing_zip_code_is_required = fields.Boolean(
string="Billing ZIP Code Is Required",
config_parameter='website_sale_address_management.'
'is_billing_zip_code_is_required',
help="Specify whether billing ZIP code is required")
is_shipping_phone = fields.Boolean(
string="Shipping Phone",
config_parameter='website_sale_address_management.is_shipping_phone',
help="Enable or disable the option for shipping phone")
is_shipping_phone_is_required = fields.Boolean(
string="Shipping Phone Is Required",
config_parameter='website_sale_address_management.'
'is_shipping_phone_is_required',
help="Specify whether shipping phone is required")
is_shipping_street = fields.Boolean(
string="Shipping Street",
config_parameter='website_sale_address_management.is_shipping_street',
help="Enable or disable the option for shipping street")
is_shipping_street_is_required = fields.Boolean(
string="Shipping Street Is Required",
config_parameter='website_sale_address_management.'
'is_shipping_street_is_required',
help="Specify whether shipping street is required")
is_shipping_street2 = fields.Boolean(
string="Shipping Street 2",
config_parameter='website_sale_address_management.is_shipping_street2',
help="Enable or disable the option for shipping street 2")
is_shipping_city = fields.Boolean(
string="Shipping City",
config_parameter='website_sale_address_management.is_shipping_city',
help="Enable or disable the option for shipping city")
is_shipping_city_is_required = fields.Boolean(
string="Shipping City Is Required",
config_parameter='website_sale_address_management.'
'is_shipping_city_is_required',
help="Specify whether shipping city is required")
shipping_country_id = fields.Many2one('res.country',
config_parameter='shipping_country',
string="Default Shipping Country",
help="Specify the default "
"shipping country")
is_shipping_zip_code = fields.Boolean(
string="Shipping ZIP Code",
config_parameter='website_sale_address_management.is_shipping_zip_code',
help="Enable or disable the option for shipping ZIP code")
is_shipping_zip_code_is_required = fields.Boolean(
string="Shipping ZIP Code Is Required",
config_parameter='website_sale_address_management.'
'is_shipping_zip_code_is_required',
help="Specify whether shipping ZIP code is required")
@api.onchange('is_billing_phone', 'is_billing_street', 'is_billing_city',
'is_billing_zip_code', 'is_shipping_phone',
'is_shipping_street', 'is_shipping_city',
'is_shipping_zip_code')
def _onchange_fields(self):
"""This method is triggered when any of the specified fields
are changed. It updates the corresponding required fields based on
the user's input."""
if not self.is_billing_phone:
self.is_billing_phone_is_required = False
if not self.is_billing_street:
self.is_billing_street_is_required = False
if not self.is_billing_city:
self.is_billing_city_is_required = False
if not self.is_billing_zip_code:
self.is_billing_zip_code_is_required = False
if not self.is_shipping_phone:
self.is_shipping_phone_is_required = False
if not self.is_shipping_street:
self.is_shipping_street_is_required = False
if not self.is_shipping_city:
self.is_shipping_city_is_required = False
if not self.is_shipping_zip_code:
self.is_shipping_zip_code_is_required = False

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_sale_address_management/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
website_sale_address_management/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_sale_address_management/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website_sale_address_management/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_sale_address_management/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website_sale_address_management/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
website_sale_address_management/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
website_sale_address_management/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
website_sale_address_management/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
website_sale_address_management/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
website_sale_address_management/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
website_sale_address_management/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
website_sale_address_management/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
website_sale_address_management/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
website_sale_address_management/static/description/assets/modules/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
website_sale_address_management/static/description/assets/modules/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
website_sale_address_management/static/description/assets/modules/13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
website_sale_address_management/static/description/assets/modules/14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
website_sale_address_management/static/description/assets/modules/15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
website_sale_address_management/static/description/assets/modules/16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
website_sale_address_management/static/description/assets/screenshots/billing_address.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

BIN
website_sale_address_management/static/description/assets/screenshots/config_setting.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
website_sale_address_management/static/description/assets/screenshots/payment_page.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
website_sale_address_management/static/description/assets/screenshots/shipping_address.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
website_sale_address_management/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
website_sale_address_management/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

646
website_sale_address_management/static/description/index.html

@ -0,0 +1,646 @@
<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: #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>Enterprise
</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>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;">
Website Sale Address Management</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
This Module Helps You to Show or Hide Fields by Switching
on/off Toggles,
Set Fields as Mandatory or not and Set Default Country.</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">
This Module Helps You to Show or Hide Fields by Switching on/off
Toggles,
Set Fields as Mandatory or not and Set Default Country.
</div>
</div>
<!-- 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="col-sm-12 col-md-6">
<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;">Show or Hide Fields by Switching on/off Toggles.</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 Default Country.</span>
</div>
</div>
<div class="col-sm-12 col-md-6">
<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 Fields as Mandatory or not.</span>
</div>
</div>
</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;">
From Configuration Settings Choose the Fields You Need and Also
Set Default Country.</h3>
<img src="assets/screenshots/config_setting.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;">
Then Go and Edit Billing Address .</h3>
<img src="assets/screenshots/billing_address.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;">
Also, Edit the Shipping Address</h3>
<img src="assets/screenshots/shipping_address.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;">
In Payment Page , You Can See the Edited Billing Address and
Shipping Address with Default Country</h3>
<img src="assets/screenshots/payment_page.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/odoo_website_helpdesk/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/11.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/website_product_attachments/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/12.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/insta_feed_snippet/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/13.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/customer_geolocation/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/14.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/product_visibility_website/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/15.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/website_hide_variants/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/16.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 &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 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>
<!-- END OF SUPPORT -->

16
website_sale_address_management/static/src/css/address_management.css

@ -0,0 +1,16 @@
@media (min-width: 768px){
.o_setting_right_pane .o_field_widget:not(.o_field_boolean) {
width: auto !important;
padding: 0px 8px !important;
}
}
.address_head{
margin-left: 30px;
margin-bottom: 22px;
}
#billing_country_id{
width: 58%;
}
#shipping_country_id{
width: 58%;
}

131
website_sale_address_management/views/res_config_settings_views.xml

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<!--
XML configuration for adding ECommerce Address settings to the
Odoo res.config.settings view form.This XML defines the layout and fields
for the ECommerce Address settings section in the res.config.settings view
form. It includes fields for both billing and shipping addresses.
-->
<field name="name">
res.config.settings.view.form.inherit.website_sale_address_management
</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="website.res_config_settings_view_form"/>
<field name="arch" type="xml">
<div id="website_info_settings" position="after">
<h2>ECommerce Address</h2>
<div class="row mt16 o_settings_container"
id="website_shop_address">
<div class="col-12 col-lg-6 o_setting_box">
<h4 class="address_head">Billing Address</h4>
<div class="o_setting_right_pane">
<label for="is_billing_phone" string="Phone"/>
<field name="is_billing_phone"
widget="boolean_toggle"/>
<label for="is_billing_phone_is_required"
string="required"/>
<field name="is_billing_phone_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_billing_street"
string="Street"/>
<field name="is_billing_street"
widget="boolean_toggle"/>
<label for="is_billing_street_is_required"
string="required"/>
<field name="is_billing_street_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_billing_street2"
string="Street2"/>
<field name="is_billing_street2"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_billing_city" string="City"/>
<field name="is_billing_city"
widget="boolean_toggle"/>
<label for="is_billing_city_is_required"
string="required"/>
<field name="is_billing_city_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="billing_country_id"
string="Default Country"/>
<field name="billing_country_id"
widget="selection"/>
</div>
<div class="o_setting_right_pane">
<label for="is_billing_zip_code"
string="ZIP Code"/>
<field name="is_billing_zip_code"
widget="boolean_toggle"/>
<label for="is_billing_zip_code_is_required"
string="required"/>
<field name="is_billing_zip_code_is_required"
widget="boolean_toggle"/>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box">
<h4 class="address_head">Shipping Address</h4>
<div class="o_setting_right_pane">
<label for="is_shipping_phone"
string="Phone"/>
<field name="is_shipping_phone"
widget="boolean_toggle"/>
<label for="is_shipping_phone_is_required"
string="required"/>
<field name="is_shipping_phone_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_shipping_street"
string="Street"/>
<field name="is_shipping_street"
widget="boolean_toggle"/>
<label for="is_shipping_street_is_required"
string="required"/>
<field name="is_shipping_street_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_shipping_street2"
string="Street2"/>
<field name="is_shipping_street2"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="is_shipping_city" string="City"/>
<field name="is_shipping_city"
widget="boolean_toggle"/>
<label for="is_shipping_city_is_required"
string="required"/>
<field name="is_shipping_city_is_required"
widget="boolean_toggle"/>
</div>
<div class="o_setting_right_pane">
<label for="shipping_country_id"
string="Default Country"/>
<field name="shipping_country_id"
widget="selection"/>
</div>
<div class="o_setting_right_pane">
<label for="is_shipping_zip_code"
string="ZIP Code"/>
<field name="is_shipping_zip_code"
widget="boolean_toggle"/>
<label for="is_shipping_zip_code_is_required"
string="required"/>
<field name="is_shipping_zip_code_is_required"
widget="boolean_toggle"/>
</div>
</div>
</div>
</div>
</field>
</record>
</odoo>

363
website_sale_address_management/views/website_sale_templates.xml

@ -0,0 +1,363 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="custom_address" name="Custom Address"
inherit_id="website_sale.address">
<!-- The template replaces the address form of website sale with "custom_address"-->
<!-- form and filter fields in form based on fields in 'res_config_settings'.-->
<xpath expr="//form[hasclass('checkout_autoformat')]"
position="replace">
<form t-if="account_on_checkout != 'mandatory' or not is_public_user"
action="/shop/address" method="post"
class="checkout_autoformat">
<div class="row">
<div t-attf-class="mb-3 #{error.get('name') and 'o_has_error' or ''} col-lg-12 div_name">
<label class="col-form-label"
for="name">Name
</label>
<input type="text" name="name"
t-attf-class="form-control #{error.get('name') and 'is-invalid' or ''}"
t-att-value="'name' in checkout and checkout['name']"/>
</div>
<div class="w-100"/>
<div t-attf-class="mb-3 #{error.get('email') and 'o_has_error' or ''} col-lg-6"
id="div_email">
<label t-attf-class="col-form-label #{mode[1] == 'shipping' and 'label-optional' or ''}"
for="email">Email
</label>
<input type="email" name="email"
t-attf-class="form-control #{error.get('email') and 'is-invalid' or ''}"
t-att-value="'email' in checkout and checkout['email']"/>
</div>
<t t-if="mode[1] == 'shipping'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_shipping_phone')">
<div t-attf-class="mb-3 #{error.get('phone') and 'o_has_error' or ''} col-lg-6"
id="div_phone">
<label class="col-form-label"
for="phone">Phone
</label>
<input type="tel" name="phone"
t-attf-class="form-control #{error.get('phone') and 'is-invalid' or ''}"
t-att-value="'phone' in checkout and checkout['phone']"/>
</div>
</t>
</t>
<t t-if="mode[1] == 'billing'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_billing_phone')">
<div t-attf-class="mb-3 #{error.get('phone') and 'o_has_error' or ''} col-lg-6"
id="div_phone">
<label class="col-form-label"
for="phone">Phone
</label>
<input type="tel" name="phone"
t-attf-class="form-control #{error.get('phone') and 'is-invalid' or ''}"
t-att-value="'phone' in checkout and checkout['phone']"/>
</div>
</t>
</t>
<t t-if="website._display_partner_b2b_fields()">
<div class="w-100"/>
<t t-set='vat_warning'
t-value="'vat' in checkout and checkout['vat'] and not can_edit_vat"/>
<t t-if="mode == ('new', 'billing') or (mode == ('edit', 'billing') and (can_edit_vat or 'vat' in checkout and checkout['vat']))">
<div t-attf-class="mb-3 #{error.get('company_name') and 'o_has_error' or ''} col-lg-6 mb-0">
<label class="col-form-label fw-normal label-optional"
for="company_name">
Company Name
</label>
<input type="text"
name="company_name"
t-attf-class="form-control #{error.get('company_name') and 'is-invalid' or ''}"
t-att-value="'commercial_company_name' in checkout and checkout['commercial_company_name'] or 'company_name' in checkout and checkout['company_name']"
t-att-readonly="'1' if vat_warning else None"/>
<small t-if="vat_warning"
class="form-text text-muted d-block d-lg-none">
Changing company name is
not allowed once
document(s) have been
issued for your account.
Please contact us
directly for this
operation.
</small>
</div>
<div t-attf-class="mb-3 #{error.get('vat') and 'o_has_error' or ''} col-lg-6 div_vat mb-0">
<label class="col-form-label fw-normal label-optional"
for="vat">TIN / VAT
</label>
<input type="text"
name="vat"
t-attf-class="form-control #{error.get('vat') and 'is-invalid' or ''}"
t-att-value="'vat' in checkout and checkout['vat']"
t-att-readonly="'1' if vat_warning else None"/>
<small t-if="vat_warning"
class="form-text text-muted d-block d-lg-none">
Changing VAT number is
not allowed once
document(s) have been
issued for your account.
Please contact us
directly for this
operation.
</small>
</div>
<div t-if="vat_warning"
class="col-12 d-none d-lg-block mb-1">
<small class="form-text text-muted">
Changing company name or
VAT number is not
allowed once document(s)
have been issued for
your account. Please
contact us directly for
this operation.
</small>
</div>
</t>
</t>
<div class="w-100"/>
<t t-if="mode[1] == 'shipping'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_shipping_street')">
<div t-attf-class="mb-3 #{error.get('street') and 'o_has_error' or ''} col-lg-12 div_street">
<label class="col-form-label"
for="street">Street
<span class="d-none d-md-inline">
and Number
</span>
</label>
<input type="text" name="street"
t-attf-class="form-control #{error.get('street') and 'is-invalid' or ''}"
t-att-value="'street' in checkout and checkout['street']"/>
</div>
</t>
</t>
<t t-if="mode[1] == 'billing'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_billing_street')">
<div t-attf-class="mb-3 #{error.get('street') and 'o_has_error' or ''} col-lg-12 div_street">
<label class="col-form-label"
for="street">Street
<span class="d-none d-md-inline">
and Number
</span>
</label>
<input type="text" name="street"
t-attf-class="form-control #{error.get('street') and 'is-invalid' or ''}"
t-att-value="'street' in checkout and checkout['street']"/>
</div>
</t>
</t>
<t t-if="mode[1] == 'billing'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_billing_street2')">
<div t-attf-class="mb-3 #{error.get('street2') and 'o_has_error' or ''} col-lg-12 div_street2">
<label class="col-form-label label-optional"
for="street2">Street 2
</label>
<input type="text" name="street2"
t-attf-class="form-control #{error.get('street2') and 'is-invalid' or ''}"
t-att-value="'street2' in checkout and checkout['street2']"/>
</div>
</t>
</t>
<t t-if="mode[1] == 'shipping'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_shipping_street2')">
<div t-attf-class="mb-3 #{error.get('street2') and 'o_has_error' or ''} col-lg-12 div_street2">
<label class="col-form-label label-optional"
for="street2">Street 2
</label>
<input type="text" name="street2"
t-attf-class="form-control #{error.get('street2') and 'is-invalid' or ''}"
t-att-value="'street2' in checkout and checkout['street2']"/>
</div>
</t>
</t>
<div class="w-100"/>
<t t-set='zip_city'
t-value='country and [x for x in country.get_address_fields() if x in ["zip", "city"]] or ["city", "zip"]'/>
<t t-if="mode[1] == 'shipping'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_shipping_zip_code')">
<t t-if="'zip' in zip_city and zip_city.index('zip') &lt; zip_city.index('city')">
<div t-attf-class="mb-3 #{error.get('zip') and 'o_has_error' or ''} col-md-4 div_zip">
<label class="col-form-label label-optional"
for="zip">Zip Code
</label>
<input type="text" name="zip"
t-attf-class="form-control #{error.get('zip') and 'is-invalid' or ''}"
t-att-value="'zip' in checkout and checkout['zip']"/>
</div>
</t>
<t t-if="'zip' in zip_city and zip_city.index('zip') &gt; zip_city.index('city')">
<div t-attf-class="mb-3 #{error.get('zip') and 'o_has_error' or ''} col-md-4 div_zip">
<label class="col-form-label label-optional"
for="zip">Zip Code
</label>
<input type="text" name="zip"
t-attf-class="form-control #{error.get('zip') and 'is-invalid' or ''}"
t-att-value="'zip' in checkout and checkout['zip']"/>
</div>
</t>
</t>
</t>
<t t-if="mode[1] == 'billing'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_billing_zip_code')">
<t t-if="'zip' in zip_city and zip_city.index('zip') &lt; zip_city.index('city')">
<div t-attf-class="mb-3 #{error.get('zip') and 'o_has_error' or ''} col-md-4 div_zip">
<label class="col-form-label label-optional"
for="zip">Zip Code
</label>
<input type="text" name="zip"
t-attf-class="form-control #{error.get('zip') and 'is-invalid' or ''}"
t-att-value="'zip' in checkout and checkout['zip']"/>
</div>
</t>
<t t-if="'zip' in zip_city and zip_city.index('zip') &gt; zip_city.index('city')">
<div t-attf-class="mb-3 #{error.get('zip') and 'o_has_error' or ''} col-md-4 div_zip">
<label class="col-form-label label-optional"
for="zip">Zip Code
</label>
<input type="text" name="zip"
t-attf-class="form-control #{error.get('zip') and 'is-invalid' or ''}"
t-att-value="'zip' in checkout and checkout['zip']"/>
</div>
</t>
</t>
</t>
<t t-if="mode[1] == 'billing'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_billing_city')">
<div t-attf-class="mb-3 #{error.get('city') and 'o_has_error' or ''} col-md-8 div_city">
<label class="col-form-label"
for="city">City
</label>
<input type="text" name="city"
t-attf-class="form-control #{error.get('city') and 'is-invalid' or ''}"
t-att-value="'city' in checkout and checkout['city']"/>
</div>
</t>
</t>
<t t-if="mode[1] == 'shipping'">
<t t-if="request.env['ir.config_parameter'].sudo().get_param('website_sale_address_management.is_shipping_city')">
<div t-attf-class="mb-3 #{error.get('city') and 'o_has_error' or ''} col-md-8 div_city">
<label class="col-form-label"
for="city">City
</label>
<input type="text" name="city"
t-attf-class="form-control #{error.get('city') and 'is-invalid' or ''}"
t-att-value="'city' in checkout and checkout['city']"/>
</div>
</t>
</t>
<div class="w-100"/>
<t t-if="mode[1] == 'billing'">
<div t-attf-class="mb-3 #{error.get('country_id') and 'o_has_error' or ''} col-lg-6 div_country">
<label class="col-form-label"
for="country_id">Country
</label>
<select id="country_id"
name="country_id"
t-attf-class="form-select #{error.get('country_id') and 'is-invalid' or ''}"
t-att-mode="mode[1]">
<option value="">Country...
</option>
<t t-foreach="countries"
t-as="c">
<option t-att-value="c.id"
t-att-selected="c.id == (country and int(request.env['ir.config_parameter'].sudo().get_param('billing_country')) or -1)">
<t t-esc="c.name"/>
</option>
</t>
</select>
</div>
</t>
<t t-if="mode[1] == 'shipping'">
<div t-attf-class="mb-3 #{error.get('country_id') and 'o_has_error' or ''} col-lg-6 div_country">
<label class="col-form-label"
for="country_id">Country
</label>
<select id="country_id"
name="country_id"
t-attf-class="form-select #{error.get('country_id') and 'is-invalid' or ''}"
t-att-mode="mode[1]">
<option value="">Country...
</option>
<t t-foreach="countries"
t-as="c">
<option t-att-value="c.id"
t-att-selected="c.id == (country and int(request.env['ir.config_parameter'].sudo().get_param('shipping_country')) or -1)">
<t t-esc="c.name"/>
</option>
</t>
</select>
</div>
</t>
<div t-attf-class="mb-3 #{error.get('state_id') and 'o_has_error' or ''} col-lg-6 div_state"
t-att-style="(not country or not country.state_ids) and 'display: none'">
<label class="col-form-label"
for="state_id">State /
Province
</label>
<select name="state_id"
t-attf-class="form-select #{error.get('state_id') and 'is-invalid' or ''}"
data-init="1">
<option value="">State /
Province...
</option>
<t t-foreach="country_states"
t-as="s">
<option t-att-value="s.id"
t-att-selected="s.id == ('state_id' in checkout and country and checkout['state_id'] != '' and int(checkout['state_id']))">
<t t-esc="s.name"/>
</option>
</t>
</select>
</div>
<div class="w-100"/>
<t t-if="mode == ('new', 'billing') and not only_services">
<div class="col-lg-12">
<div class="checkbox">
<label>
<input type="checkbox"
id='shipping_use_same'
class="mr8"
name='use_same'
value="1"
checked='checked'/>
Ship to the same address
<span class='ship_to_other text-muted'
style="display: none">
&amp;nbsp;(
<i>Your shipping
address will be
requested later)
</i>
</span>
</label>
</div>
</div>
</t>
</div>
<input type="hidden" name="csrf_token"
t-att-value="request.csrf_token()"/>
<input type="hidden" name="submitted"
value="1"/>
<input type="hidden" name="partner_id"
t-att-value="partner_id or '0'"/>
<input type="hidden" name="callback"
t-att-value="callback"/>
<!-- Example -->
<input type="hidden" name="field_required"
t-att-value="'phone,name'"/>
<div class="d-flex justify-content-between">
<a role="button"
t-att-href="mode == ('new', 'billing') and '/shop/cart' or '/shop/checkout'"
class="btn btn-secondary mb32">
<i class="fa fa-chevron-left"/>
<span>Back</span>
</a>
<a role="button" href="#"
class="btn btn-primary mb32 a-submit a-submit-disable a-submit-loading">
<span>Next</span>
<i class="fa fa-chevron-right"/>
</a>
</div>
</form>
</xpath>
</template>
</odoo>
Loading…
Cancel
Save