Browse Source

APR 20: [ADD] Initial Commit 'website_subscription_package'

pull/278/merge
Shijin V 1 year ago
parent
commit
15bd7778ad
  1. 47
      website_pre_booking/controllers/pre_booking_portal.py
  2. 102
      website_pre_booking/controllers/website_pre_booking.py
  3. 13
      website_pre_booking/data/data.xml
  4. 6
      website_pre_booking/doc/RELEASE_NOTES.md
  5. 33
      website_pre_booking/models/product_template.py
  6. 86
      website_pre_booking/models/website_prebook.py
  7. 2
      website_pre_booking/security/ir.model.access.csv
  8. BIN
      website_pre_booking/static/description/assets/modules/1.png
  9. BIN
      website_pre_booking/static/description/assets/modules/2.png
  10. BIN
      website_pre_booking/static/description/assets/modules/3.png
  11. BIN
      website_pre_booking/static/description/assets/modules/4.png
  12. BIN
      website_pre_booking/static/description/assets/modules/5.png
  13. BIN
      website_pre_booking/static/description/assets/modules/6.png
  14. BIN
      website_pre_booking/static/description/assets/screenshots/1.png
  15. BIN
      website_pre_booking/static/description/assets/screenshots/2.png
  16. BIN
      website_pre_booking/static/description/assets/screenshots/3.png
  17. BIN
      website_pre_booking/static/description/assets/screenshots/4.png
  18. BIN
      website_pre_booking/static/description/assets/screenshots/5.png
  19. BIN
      website_pre_booking/static/description/assets/screenshots/6.png
  20. BIN
      website_pre_booking/static/description/assets/screenshots/7.png
  21. BIN
      website_pre_booking/static/description/assets/screenshots/8.png
  22. BIN
      website_pre_booking/static/description/assets/screenshots/9.png
  23. BIN
      website_pre_booking/static/description/assets/screenshots/hero.gif
  24. BIN
      website_pre_booking/static/description/banner.png
  25. BIN
      website_pre_booking/static/description/icon.png
  26. 564
      website_pre_booking/static/description/index.html
  27. 223
      website_pre_booking/static/src/css/prebooking.css
  28. 53
      website_pre_booking/views/portal_views.xml
  29. 116
      website_pre_booking/views/pre_booking_template.xml
  30. 66
      website_pre_booking/views/prebook_details_template.xml
  31. 24
      website_pre_booking/views/product_template_views.xml
  32. 87
      website_pre_booking/views/website_prebook_views.xml
  33. 17
      website_pre_booking/views/website_sale_inherit.xml
  34. 22
      website_subscription_package/README.rst
  35. 46
      website_subscription_package/__init__.py
  36. 109
      website_subscription_package/__manifest__.py
  37. 46
      website_subscription_package/controllers/__init__.py
  38. 98
      website_subscription_package/controllers/portal.py
  39. 107
      website_subscription_package/controllers/website_subscription_package.py
  40. 56
      website_subscription_package/data/mail_template_data.xml
  41. 6
      website_subscription_package/doc/RELEASE_NOTES.md
  42. 50
      website_subscription_package/models/__init__.py
  43. 46
      website_subscription_package/models/product_product.py
  44. 47
      website_subscription_package/models/product_template.py
  45. 36
      website_subscription_package/models/recurrence_period.py
  46. 68
      website_subscription_package/models/sale_order.py
  47. 36
      website_subscription_package/models/sale_order_line.py
  48. 121
      website_subscription_package/models/subscription_package.py
  49. 2
      website_subscription_package/security/ir.model.access.csv
  50. 0
      website_subscription_package/static/description/assets/icons/check.png
  51. 0
      website_subscription_package/static/description/assets/icons/chevron.png
  52. 0
      website_subscription_package/static/description/assets/icons/cogs.png
  53. 0
      website_subscription_package/static/description/assets/icons/consultation.png
  54. 0
      website_subscription_package/static/description/assets/icons/ecom-black.png
  55. 0
      website_subscription_package/static/description/assets/icons/education-black.png
  56. 0
      website_subscription_package/static/description/assets/icons/hotel-black.png
  57. 0
      website_subscription_package/static/description/assets/icons/license.png
  58. 0
      website_subscription_package/static/description/assets/icons/lifebuoy.png
  59. 0
      website_subscription_package/static/description/assets/icons/manufacturing-black.png
  60. 0
      website_subscription_package/static/description/assets/icons/pos-black.png
  61. 0
      website_subscription_package/static/description/assets/icons/puzzle.png
  62. 0
      website_subscription_package/static/description/assets/icons/restaurant-black.png
  63. 0
      website_subscription_package/static/description/assets/icons/service-black.png
  64. 0
      website_subscription_package/static/description/assets/icons/trading-black.png
  65. 0
      website_subscription_package/static/description/assets/icons/training.png
  66. 0
      website_subscription_package/static/description/assets/icons/update.png
  67. 0
      website_subscription_package/static/description/assets/icons/user.png
  68. 0
      website_subscription_package/static/description/assets/icons/wrench.png
  69. 0
      website_subscription_package/static/description/assets/misc/categories.png
  70. 0
      website_subscription_package/static/description/assets/misc/check-box.png
  71. 0
      website_subscription_package/static/description/assets/misc/compass.png
  72. 0
      website_subscription_package/static/description/assets/misc/corporate.png
  73. 0
      website_subscription_package/static/description/assets/misc/customer-support.png
  74. 0
      website_subscription_package/static/description/assets/misc/cybrosys-logo.png
  75. 0
      website_subscription_package/static/description/assets/misc/features.png
  76. 0
      website_subscription_package/static/description/assets/misc/logo.png
  77. 0
      website_subscription_package/static/description/assets/misc/pictures.png
  78. 0
      website_subscription_package/static/description/assets/misc/pie-chart.png
  79. 0
      website_subscription_package/static/description/assets/misc/right-arrow.png
  80. 0
      website_subscription_package/static/description/assets/misc/star.png
  81. 0
      website_subscription_package/static/description/assets/misc/support.png
  82. 0
      website_subscription_package/static/description/assets/misc/whatsapp.png
  83. BIN
      website_subscription_package/static/description/assets/modules/1.png
  84. BIN
      website_subscription_package/static/description/assets/modules/2.png
  85. BIN
      website_subscription_package/static/description/assets/modules/3.png
  86. BIN
      website_subscription_package/static/description/assets/modules/4.png
  87. BIN
      website_subscription_package/static/description/assets/modules/5.gif
  88. BIN
      website_subscription_package/static/description/assets/modules/5.png
  89. BIN
      website_subscription_package/static/description/assets/modules/6.png
  90. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot08.png
  91. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot1.png
  92. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot10.png
  93. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot11.png
  94. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot12.png
  95. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot13.png
  96. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot14.png
  97. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot15.png
  98. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot16.png
  99. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot17.png
  100. BIN
      website_subscription_package/static/description/assets/screenshots/Screenshot18.png

47
website_pre_booking/controllers/pre_booking_portal.py

@ -1,47 +0,0 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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 http, _
from odoo.http import request
from odoo.addons.portal.controllers import portal
class CustomerPortal(portal.CustomerPortal):
def _prepare_home_portal_values(self, counters):
"""super the function to add new button in the home portal"""
values = super()._prepare_home_portal_values(counters)
if 'pre_bookings_count' in counters:
current_user = request.env['res.users'].sudo().browse(
request.env.uid)
pre_bookings_count = request.env['website.prebook'].search_count([('partner_id', '=', current_user.partner_id.id)])
values['pre_bookings_count'] = pre_bookings_count
return values
@http.route(['/my/pre_bookings'], type='http', auth="user", website=True)
def portal_my_pre_bookings(self, **kwargs):
"""Function to view the logined user pre bookings in the account."""
current_user = request.env['res.users'].sudo().browse(request.env.uid)
pre_booking = request.env['website.prebook'].sudo().search(
[('partner_id', '=', current_user.partner_id.id)])
return request.render("website_pre_booking.portal_my_pre_bookings",
{'pre_bookings': pre_booking,
'page_name': 'pre_booking'})

102
website_pre_booking/controllers/website_pre_booking.py

@ -1,102 +0,0 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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, http, _
from odoo.http import request
class CustomerPortal(http.Controller):
@http.route(['/my/prebook_request/<model("product.template"):product>'],
type='http', auth="public", website=True)
def portal_my_employee_request(self, product, ):
"""Pre-book button to pre book the product"""
vals = {
'product': product.id,
}
current_user = request.env['res.users'].sudo().browse(request.session.uid)
partner = current_user.partner_id
if request.session.uid:
pre_booking = request.env['website.prebook'].sudo().create({
'partner_id': partner.id,
'booking_date': fields.datetime.today(),
'product_id': product.id,
'website_id': request.website.id,
})
if pre_booking:
max_quantity = product.pre_max_quantity
product.pre_max_quantity = max_quantity - 1
return request.render("website_pre_booking.pre_booking_done", {'ref': pre_booking.reference})
else:
return request.render("website_pre_booking.prebook_address", vals)
@http.route(['/prebook/address'], type='http', methods=['GET', 'POST'],
auth="public", website=True, sitemap=False)
def pre_address(self, **kw):
"""If not login create new user"""
product = request.env['product.template'].sudo().browse(int(kw.get('product')))
partner = request.env['res.partner'].sudo().create({
'name': kw.get('name'),
'email': kw.get('email'),
'phone': kw.get('phone'),
})
pre_booking = request.env['website.prebook'].sudo().create({
'partner_id': partner.id,
'booking_date': fields.datetime.today(),
'product_id': product.id})
if pre_booking:
max_quantity = product.pre_max_quantity
product.pre_max_quantity = max_quantity - 1
return request.render("website_pre_booking.pre_booking_done", {'ref': pre_booking.reference})
@http.route('/track/prebooking', website=True, auth='user', csrf=False)
def submit_booking(self, **kwargs):
"""For tracking the specific pre-orders using refernce code"""
bookings = request.env['website.prebook'].sudo().search([('reference', '=', kwargs.get('reference'))])
if bookings and bookings.sale_id:
if bookings.sale_id.state == 'draft':
state = 'Quotation'
elif bookings.sale_id.state == 'sent':
state = 'Quotation Sent'
elif bookings.sale_id.state == 'sale':
state = 'Sales Order'
elif bookings.sale_id.state == 'done':
state = 'Locked'
elif bookings.sale_id.state == 'cancel':
state = 'Cancelled'
vals = {
'reference': bookings.reference,
'product': bookings.product_id.name,
'status': state if bookings.sale_id else bookings.state,
'date': bookings.booking_date,
}
return request.render("website_pre_booking.my_booking_template", vals)
else:
return request.render("website_pre_booking.my_booking_template", {'vali': True})
@http.route(['/my/prebookings', '/my/prebookings/page/<int:page>'], type='http', auth="user", website=True)
def my_prebookings(self):
"""Can track the pre bookings from the website"""
value = []
values = {
'value': value
}
return request.render("website_pre_booking.my_booking_template", values)

13
website_pre_booking/data/data.xml

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Sequences for prebooking -->
<record id="seq_booking" model="ir.sequence">
<field name="name">Pre Booking</field>
<field name="code">prebook.sequence</field>
<field name="prefix">PB</field>
<field name="padding">4</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>

6
website_pre_booking/doc/RELEASE_NOTES.md

@ -1,6 +0,0 @@
## Module <website_pre_booking>
#### 20.03.2024
#### Version 16.0.1.0.0
##### ADD
- Initial commit for Website Pre Booking

33
website_pre_booking/models/product_template.py

@ -1,33 +0,0 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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 ProductTemplate(models.Model):
""" class for inheriting product.template model to adding new fields"""
_inherit = 'product.template'
pre_book = fields.Boolean(string='Pre Booking Available')
from_date = fields.Date(string='From Date')
to_date = fields.Date(string='To Date')
pre_max_quantity = fields.Integer(string="Pre Book Maximum Quantity")

86
website_pre_booking/models/website_prebook.py

@ -1,86 +0,0 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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, fields, models, _
class WebsitePrebook(models.Model):
""" class for defining website.prebook model"""
_name = 'website.prebook'
_rec_name = 'reference'
partner_id = fields.Many2one('res.partner', string="Customer",
help="Add the customer name")
booking_date = fields.Date('Booking Date', help="Pre booking date")
product_id = fields.Many2one('product.template', string="Product",
help="Add the product")
state = fields.Selection([
('draft', 'Draft'),
('confirm', 'Confirmed'),
], string='Status', default='draft', help="state of pre-booking"
)
website_id = fields.Many2one(
"website",
string="Website",
ondelete="restrict",
index=True,
readonly=True, help="name of the website"
)
reference = fields.Char(string='Reference', required=True, copy=False,
readonly=True,
default=lambda self: _('New'))
sale_id = fields.Many2one('sale.order', string='Sale order',
help="sale order")
@api.model
def create(self, vals):
"""Supering create function for creating sequence"""
if vals.get('reference', _('New')) == _('New'):
vals['reference'] = self.env['ir.sequence'].next_by_code('prebook.sequence') or _('New')
return super(WebsitePrebook, self).create(vals)
def action_confirm(self):
"""sale order creation while confirming the button"""
sale_order = self.env['sale.order'].create({
'partner_id': self.partner_id.id,
'website_id': self.website_id.id,
'order_line': [(0, 0, {
'product_template_id': self.product_id.id,
'product_id': self.product_id.product_variant_id.id,
'name': self.product_id.product_variant_id.name,
'product_uom_qty': 1,
})],
})
self.sale_id = sale_order.id
self.state = 'confirm'
def action_view_sale_order(self):
"""Smart button view function"""
return {
'name': 'Sale Order',
'view_mode': 'form',
'view_type': 'form',
'view_id': self.env.ref('sale.view_order_form').id,
'res_id': self.sale_id.id,
'res_model': 'sale.order',
'type': 'ir.actions.act_window',
}

2
website_pre_booking/security/ir.model.access.csv

@ -1,2 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_website_prebook,access.website.prebook,model_website_prebook,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_website_prebook access.website.prebook model_website_prebook 1 1 1 1

BIN
website_pre_booking/static/description/assets/modules/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

BIN
website_pre_booking/static/description/assets/modules/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

BIN
website_pre_booking/static/description/assets/modules/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

BIN
website_pre_booking/static/description/assets/modules/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

BIN
website_pre_booking/static/description/assets/modules/5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

BIN
website_pre_booking/static/description/assets/modules/6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

BIN
website_pre_booking/static/description/assets/screenshots/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

BIN
website_pre_booking/static/description/assets/screenshots/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

BIN
website_pre_booking/static/description/assets/screenshots/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 KiB

BIN
website_pre_booking/static/description/assets/screenshots/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

BIN
website_pre_booking/static/description/assets/screenshots/5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

BIN
website_pre_booking/static/description/assets/screenshots/6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

BIN
website_pre_booking/static/description/assets/screenshots/7.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

BIN
website_pre_booking/static/description/assets/screenshots/8.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

BIN
website_pre_booking/static/description/assets/screenshots/9.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

BIN
website_pre_booking/static/description/banner.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

BIN
website_pre_booking/static/description/icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

564
website_pre_booking/static/description/index.html

@ -1,564 +0,0 @@
<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: #875A7B; 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;">
Website Pre Booking</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
This module helps to pre book the products in website</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 to manage the pre booking orders in the website
</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: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2" />
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Community &amp;
Enterprise Support.</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;">
Products prebooking managing</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;">Prebook option in website.</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;">Book products for non existing customer.</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;">Track your Prebookings.</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;">Products Pre Booking managing
</h3><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;">Website product prebooking </h3>
<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;">Total Pre Bookings
</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;">Pre Bookings List</h3>
<img src="assets/screenshots/4.png" class="img-thumbnail">
<img src="assets/screenshots/5.png" class="img-thumbnail">
<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;">Pre Bookings Tracking
</h3>
<img src="assets/screenshots/7.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;">Pre Bookings in portal
</h3>
<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;">List of own Pre Bookings
</h3>
<img src="assets/screenshots/9.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="row">
<div class="col-sm-12 col-md-12-col-lg-2">
<h2 style="font-weight: bold; color: #3D3D4E;">Related Modules</h2>
<p style="color: #777783;">Explore our related modules</p>
<hr/>
</div>
<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/whatsapp_redirect/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_payroll_community/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/crm_dashboard/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/export_stockinfo_xls/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/sale_discount_total/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/fleet_rental/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF 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 the +</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 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 -->

223
website_pre_booking/static/src/css/prebooking.css

@ -1,223 +0,0 @@
/* CSS */
.button-40 {
background-color: #a31f2bbf;
border: 1px solid transparent;
box-sizing: border-box;
color: #FFFFFF;
cursor: pointer;
flex: 0 0 auto;
font-family: "Inter var",ui-sans-serif,system-ui,-apple-system,system-ui,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";
font-size: 1.125rem;
font-weight: 600;
line-height: 1.5rem;
padding: .75rem 1.2rem;
text-align: center;
text-decoration: none #6B7280 solid;
text-decoration-thickness: auto;
transition-duration: .2s;
transition-property: background-color,border-color,color,fill,stroke;
transition-timing-function: cubic-bezier(.4, 0, 0.2, 1);
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
width: auto;
}
.button-40:hover {
background-color: #374151;
}
.button-40:focus {
box-shadow: none;
outline: 2px solid transparent;
outline-offset: 2px;
}
@media (min-width: 768px) {
.button-40 {
padding: .75rem 1.5rem;
}
}
.leaderboard {
max-width: 490px;
width: 100%;
border-radius: 12px;
header {
--start: 15%;
height: 130px;
background-image: repeating-radial-gradient(circle at var(--start), transparent 0%, transparent 10%, rgba(54, 89, 219, .33) 10%, rgba(54, 89, 219, .33) 17%), linear-gradient(to right, #5b7cfa, #3659db);
color: #fff;
position: relative;
border-radius: 12px 12px 0 0;
overflow: hidden;
.leaderboard__title {
position: absolute;
z-index: 2;
top: 50%;
right: calc(var(--start) * .75);
transform: translateY(-50%);
text-transform: uppercase;
margin: 0;
span {
display: block;
}
&--top {
font-size: 24px;
font-weight: 700;
letter-spacing: 6.5px;
}
&--bottom {
font-size: 13px;
font-weight: 500;
letter-spacing: 3.55px;
opacity: .65;
transform: translateY(-2px);
}
}
.leaderboard__icon {
fill: #fff;
opacity: .35;
width: 50px;
position: absolute;
top: 50%;
left: var(--start);
transform: translate(-50%, -50%);
}
}
&__profiles {
background-color: #fff;
border-radius: 0 0 12px 12px;
padding: 15px 15px 20px;
display: grid;
row-gap: 8px;
}
&__profile {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
align-items: center;
padding: 10px 30px 10px 10px;
overflow: hidden;
border-radius: 10px;
box-shadow: 0 5px 7px -1px rgba(51, 51, 51, 0.23);
cursor: pointer;
transition: transform .25s cubic-bezier(.7,.98,.86,.98), box-shadow .25s cubic-bezier(.7,.98,.86,.98);
background-color: #fff;
&:hover {
transform: scale(1.2);
box-shadow: 0 9px 47px 11px rgba(51, 51, 51, 0.18);
}
}
&__picture {
max-width: 100%;
width: 60px;
border-radius: 50%;
box-shadow: 0 0 0 10px #ebeef3, 0 0 0 22px #f3f4f6;
}
&__name {
color: #979cb0;
font-weight: 600;
font-size: 20px;
letter-spacing: 0.64px;
margin-left: 12px;
}
&__value {
color: #35d8ac;
font-weight: 700;
font-size: 34px;
text-align: right;
& > span {
opacity: .8;
font-weight: 600;
font-size: 13px;
margin-left: 3px;
}
}
}
// bare minimuu styles
body {
margin: 0;
background-color: #eaeaea;
display: grid;
height: 100vh;
place-items: center;
font-family: 'Source Sans Pro', sans-serif;
}
.leaderboard {
box-shadow: 0 0 40px -10px rgba(0, 0, 0, .4);
}
.o_image {
height:122px;
width:81px;
}
body{
background: #f2f2f2;
font-family: 'Open Sans', sans-serif;
}
.search {
width: 100%;
position: relative;
display: flex;
}
.searchTerm {
width: 100%;
border: 3px solid #00B4CC;
border-right: none;
padding: 5px;
height: 36px;
border-radius: 5px 0 0 5px;
outline: none;
color: #9DBFAF;
}
.searchTerm:focus{
color: #00B4CC;
}
.searchButton {
width: 40px;
height: 36px;
border: 1px solid #00B4CC;
background: #00B4CC;
text-align: center;
color: #fff;
border-radius: 0 5px 5px 0;
cursor: pointer;
font-size: 20px;
}
/*Resize the wrap to see the search bar change!*/
.wrap{
width: 19%;
position: absolute;
top: 30%;
left: 50%;
transform: translate(-50%, -50%);
}

53
website_pre_booking/views/portal_views.xml

@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Template for adding the pre bookings in the portal my home-->
<template id="portal_my_home_pre_bookings"
name="portal_my_home_inherit_website_pre_booking"
inherit_id="portal.portal_my_home" customize_show="True" >
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">Pre Booking</t>
<t t-set="url" t-value="'/my/pre_bookings'"/>
<t t-set="placeholder_count" t-value="'pre_bookings_count'"/>
</t>
</xpath>
</template>
<!-- Template for the breadcrumbs for the pre booking-->
<template id="portal_my_home_menu_pre_bookings"
name="Portal layout : pre bookings menu entries"
inherit_id="portal.portal_breadcrumbs" priority="65">
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
<li t-if="page_name == 'pre_booking'"
class="breadcrumb-item active">
<span>Pre Booking</span>
</li>
</xpath>
</template>
<!-- List of pre bookings to show in the portal table-->
<template id="portal_my_pre_bookings" name="My Pre Bookings">
<t t-call="portal.portal_layout">
<t t-set="breadcrumbs_searchbar" t-value="True"/>
<t t-call="portal.portal_searchbar">
<t t-set="title">Pre Bookings</t>
</t>
<t t-if="pre_bookings" t-call="portal.portal_table">
<thead>
<tr class="active">
<th>Reference</th>
<th>Product</th>
<th>Booking Date</th>
<th>state</th>
</tr>
</thead>
<t t-foreach="pre_bookings" t-as="pre_booking">
<tr>
<td><span t-field="pre_booking.reference"/></td>
<td><span t-field="pre_booking.product_id.name"/></td>
<td><span t-field="pre_booking.booking_date"/></td>
<td><span t-field="pre_booking.state"/></td>
</tr>
</t>
</t>
</t>
</template>
</odoo>

116
website_pre_booking/views/pre_booking_template.xml

@ -1,116 +0,0 @@
<odoo>
<template id="prebook_address">
<t t-set="no_footer" t-value="1"/>
<t t-call="website.layout">
<div id="wrap">
<div class="container oe_website_sale py-2">
<div class="row">
<div class="col-12 col-xl order-xl-1 oe_cart">
<div>
<form action="/prebook/address" method="post" class="checkout_autoformat">
<div class="row">
<div t-attf-class="mb-3 #{'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 #{'is-invalid' or ''}"
t-att-value="'name'" required="required"/>
</div>
<div class="w-100"/>
<div t-attf-class="mb-3 #{'o_has_error' or ''} col-lg-6" id="div_email">
<label t-attf-class="col-form-label #{'label-optional' or ''}" for="email">
Email
</label>
<input type="email" name="email"
t-attf-class="form-control #{'is-invalid' or ''}"
t-att-value="'email'"/>
</div>
<div t-attf-class="mb-3 #{'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 #{'is-invalid' or ''}"
t-att-value="'phone'"/>
</div>
<t t-if="website._display_partner_b2b_fields()">
<div class="w-100"/>
<t t-set='vat_warning' t-value="'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 #{'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 #{'is-invalid' or ''}"
t-att-value="'commercial_company_name' or '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 #{'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 #{'is-invalid' or ''}"
t-att-value="'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"/>
</div>
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
<input type="hidden" name="submitted" value="1"/>
<input type="hidden" name="product" t-att-value="product"/>
<input type="hidden" name="partner_id" t-att-value="partner_id or '0'"/>
<input type="hidden" name="callback" t-att-value="callback"/>
<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" type="submit" 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>
</div>
</div>
</div>
</div>
</div>
</t>
</template>
<template id="pre_booking_done">
<t t-call="website.layout">
<h2 style="text-align: center; margin-top: 140px; font-style: normal;">
Prebooking (<t t-esc="ref"/>) successfully created...!
</h2>
<div class="text-center" style="padding-top:10mm; ">
<button class="button-40" style="background-color: #0f0c0dbf;">
<a role="menuitem" t-attf-href="/@/shop" style="color: #f8f9fa;">
Back
</a>
</button>
</div>
</t>
</template>
</odoo>

66
website_pre_booking/views/prebook_details_template.xml

@ -1,66 +0,0 @@
<odoo>
<record id="menu_service" model="website.menu">
<field name="name">Track PreBookings</field>
<field name="url">/my/prebookings</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">31</field>
</record>
<template id="my_booking_template">
<t t-call="portal.portal_layout">
<h4 style="text-align:center; margin-top:25mm;">TRACK YOUR BOOKING</h4>
<form action="/track/prebooking" enctype="multipart/form-data" method="post">
<div class="wrap">
<div class="search">
<input type="text" class="searchTerm" name="reference" required=""
placeholder="Enter your booking reference"/>
<button type="submit" class="searchButton">
<i class="fa fa-search"></i>
</button>
</div>
</div>
<div>
<t t-if="reference">
<table class="my_time_off_table" style="margin-top: 109px; width:100%; margin-left:20px;">
<thead style="display: table-row-group; background-color:#8DB2D7; border: 0.3rem solid #8DB2D7;
border-bottom: none;">
<tr>
<th class="" style="width: 20%; color: white;" scope="col">
Booking Reference
</th>
<th class="" style="width: 20%; color: white;" scope="col">
Product
</th>
<th class="" style="width: 20%; color: white;" scope="col">
Booking Date
</th>
<th class="" style="width: 20%; color: white;" scope="col">
Status
</th>
</tr>
</thead>
<body>
<td style="border: 0.15rem solid black; border-top: none;">
<t t-esc="reference"/>
</td>
<td style="border: 0.15rem solid black; border-top: none;">
<t t-esc="product"/>
</td>
<td style="border: 0.15rem solid black; border-top: none;">
<t t-esc="date"/>
</td>
<td style="border: 0.15rem solid black; border-top: none;">
<t t-esc="status"/>
</td>
</body>
</table>
</t>
<t t-if="vali">
<div style="margin-top:109px; color: red;">
<h5 style="text-align:center;">No bookings found...!</h5>
</div>
</t>
</div>
</form>
</t>
</template>
</odoo>

24
website_pre_booking/views/product_template_views.xml

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">product.template.view.form.inherit.website.pre.booking</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="model">product.template</field>
<field name="arch" type="xml">
<xpath expr="//page[@name='general_information']" position="after">
<page string="Prebooking" name="prebooking">
<group string="Booking Configuration">
<group>
<field name="pre_book"/>
</group>
<group>
<field name="pre_max_quantity" attrs="{'invisible':[('pre_book','!=', True)]}"/>
</group>
</group>
</page>
</xpath>
</field>
</record>
</data>
</odoo>

87
website_pre_booking/views/website_prebook_views.xml

@ -1,87 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="website_pre_book_form" model="ir.ui.view">
<field name="name">website.prebook.form</field>
<field name="model">website.prebook</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_confirm" data-hotkey="v" string="Confirm" type="object"
groups="base.group_user" attrs="{'invisible': [('state','!=', 'draft')]}"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_view_sale_order" type="object" class="oe_stat_button"
icon="fa-pencil-square-o"
attrs="{'invisible': [('state', '!=', 'confirm')]}">
<div class="o_stat_info">
<span class="o_stat_text">Sale Order</span>
</div>
</button>
</div>
<div class="oe_title">
<h1>
<field name="reference" readonly="1"/>
</h1>
</div>
<group>
<group>
<field name="partner_id"/>
</group>
<group>
<field name="booking_date"/>
</group>
<group>
<field name="product_id"/>
</group>
<group>
<field name="website_id"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="website_prebook_tree_view" model="ir.ui.view">
<field name="name">website.prebook.tree</field>
<field name="model">website.prebook</field>
<field name="arch" type="xml">
<tree default_order="reference desc">
<field name="reference"/>
<field name="partner_id"/>
<field name="product_id"/>
<field name="booking_date"/>
</tree>
</field>
</record>
<record id="action_pre_book_menu" model="ir.actions.act_window">
<field name="name">Pre Bookings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">website.prebook</field>
<field name="view_mode">tree,kanban,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create!
</p>
</field>
</record>
<record id="action_pre_book_main_menu" model="ir.actions.act_window">
<field name="name">Pre Bookings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">website.prebook</field>
<field name="view_mode">tree,kanban,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create!
</p>
</field>
</record>
<menuitem id="website_prebook_root"
name="Pre Bookings"
parent="website_sale.menu_ecommerce"
action="action_pre_book_menu"
sequence="10"/>
</odoo>

17
website_pre_booking/views/website_sale_inherit.xml

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="product_quantity" inherit_id="website_sale.product" name="Select Quantity">
<xpath expr="//div[@id='o_wsale_cta_wrapper']" position="after">
<div>
<t t-if="product.pre_book and product.pre_max_quantity > 0">
<a role="menuitem" t-att-href="keep('/my/prebook_request/%s' % slug(product))"
style="color: #f8f9fa;">
<button type="button" class="btn btn-primary pre_booking" t-att-data-id="product.id">
Pre Book
</button>
</a>
</t>
</div>
</xpath>
</template>
</odoo>

22
website_pre_booking/README.rst → website_subscription_package/README.rst

@ -1,27 +1,27 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Website pre booking V16
=======================
This module will help you to managing prebooking management in website.
Website Subscription Package Management
=======================================
This Module Create Subscription for A Product From Website.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
* No Additional configuration is needed.
License
-------
Affero General Public License v3.0 (AGPL v3)
(https://www.odoo.com/documentation/16.0/legal/licenses.html)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
Developer: (V16) Hari Krishnan @ Cybrosys
* Developer: (V16) Anagha S, Contact: odoo@cybrosys.com
Contacts
--------

46
website_pre_booking/__init__.py → website_subscription_package/__init__.py

@ -1,23 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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 controllers
from . import models
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 controllers
from . import models

109
website_pre_booking/__manifest__.py → website_subscription_package/__manifest__.py

@ -1,54 +1,55 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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': 'Website Pre Booking',
'version': '16.0.1.0.0',
'category': 'Website',
'summary': 'Allows pre booking option for website',
'description': """This module will help you to managing prebooking of
product management in website""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'license': 'AGPL-3',
'depends': ['portal', 'website_sale'],
'data': [
'security/ir.model.access.csv',
'data/data.xml',
'views/portal_views.xml',
'views/website_prebook_views.xml',
'views/website_sale_inherit.xml',
'views/prebook_details_template.xml',
'views/pre_booking_template.xml',
'views/product_template_views.xml',
],
'assets': {
'web.assets_frontend': [
'/website_pre_booking/static/src/css/prebooking.css'
],
},
'images': ['static/description/banner.png'],
'installable': True,
'auto_install': False,
'application': False,
}
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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': 'Website Subscription Package Management',
'version': '16.0.1.0.0',
'category': 'Sales, Website',
'summary': 'Subscription Package Management Through website',
'description': """This Module Create Subscription for A Product From
Website""",
'author': 'Cybrosys Techno solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['subscription_package', 'website_sale'],
'data': [
'data/mail_template_data.xml',
'security/ir.model.access.csv',
'views/recurrence_views.xml',
'views/subscription_package_views.xml',
'views/product_product_views.xml',
'views/product_template_views.xml',
'views/sale_order_views.xml',
'views/portal_templates.xml',
'views/website_product_subscription_template.xml',
],
'assets': {
'web.assets_frontend': [
'website_subscription_package/static/src/js/website_sale.js',
],
},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'application': False,
'auto_install': False,
}

46
website_pre_booking/models/__init__.py → website_subscription_package/controllers/__init__.py

@ -1,23 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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 product_template
from . import website_prebook
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 portal
from . import website_subscription_package

98
website_subscription_package/controllers/portal.py

@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 _, http
from odoo.exceptions import AccessError
from odoo.http import request
from odoo.addons.portal.controllers import portal
from odoo.addons.portal.controllers.portal import pager as portal_pager
class SubscriptionCustomerPortal(portal.CustomerPortal):
"""A class representing a subscription-based customer portal.
This class extends the functionality of the base CustomerPortal class to
provide features specific to subscription management and interactions."""
def _prepare_home_portal_values(self, counters):
"""Values for /my & /my/home routes template rendering.
Includes the record count for subscription order."""
values = super()._prepare_home_portal_values(counters)
if 'subscription_count' in counters:
subscription_count = request.env[
'subscription.package'].sudo().search_count(
[('partner_id', '=', request.env.user.partner_id.id),
('is_closed', '=', False)])
values['subscription_count'] = subscription_count
return values
@http.route('/my/subscription_order',
type='http', auth='user', website=True)
def portal_my_subscription_orders(self, page=1, sortby=None, filterby=None,
search=None, search_in='all',
groupby='none'):
"""Values for /my/subscription_order routes template rendering."""
values = self._prepare_portal_layout_values()
subscription = request.env['subscription.package'].sudo()
domain = [('partner_id', '=', request.env.user.partner_id.id),
('is_closed', '=', False)]
if not sortby:
sortby = 'start_date'
subscription_count = subscription.search_count(domain)
pager = portal_pager(
url="/my/subscription_order",
url_args={'sortby': sortby, 'search_in': search_in,
'search': search, 'groupby': groupby},
total=subscription_count, page=page, step=self._items_per_page)
subscription_order = subscription.search(
domain, limit=self._items_per_page, offset=pager['offset'])
grouped_subscriptions = False
values.update({
'subscriptions': subscription_order,
'grouped_subscriptions': grouped_subscriptions,
'page_name': 'Subscription',
'pager': pager,
'default_url': '/my/subscription_order',
'search_in': search_in,
'search': search,
'sortby': sortby,
'groupby': groupby,
'filterby': filterby})
return request.render(
"website_subscription_package.portal_my_subscriptions", values)
@http.route(
['/my/subscription_order/<int:subscription>',
'/my/subscription_order/id=<int:subscription>/state=<string:state>'],
type='http', auth="user", website=True)
def subscription_page(self, subscription=None, state=None):
"""Render subscription page."""
subscription = request.env['subscription.package'].sudo().browse(
subscription)
if state == 'Draft':
subscription.button_start_date()
try:
subscription.check_access_rights('read')
subscription.check_access_rule('read')
except AccessError:
return request.website.render("website.403")
return request.render(
"website_subscription_package.subscription_page", {
'subscription': subscription.sudo()})

107
website_subscription_package/controllers/website_subscription_package.py

@ -0,0 +1,107 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 http
from odoo.http import request
from odoo.addons.website.controllers.main import QueryURL
from odoo.addons.website_sale.controllers.main import WebsiteSale
class WebsiteSaleSubscription(WebsiteSale):
"""Inherited class of website sale."""
@http.route(['/shop/<model("product.template"):product>'],
type='http', auth="public", website=True)
def product(self, product, category='', search=''):
"""Add Subscription plan and recurrence period for subscription
Product in website."""
product_context = dict(request.env.context, active_id=product.id)
product_category = request.env['product.public.category']
if category:
category = product_category.browse(int(category)).exists()
attrib_list = request.httprequest.args.getlist('attrib')
attrib_values = [map(int, value.split("-")) for value in attrib_list if
value]
attrib_set = {value[1] for value in attrib_values}
keep = QueryURL('/shop', category=category and category.id,
search=search, attrib=attrib_list)
categories = product_category.search([('parent_id', '=', False)])
price_list = request.website.get_current_pricelist()
from_currency = request.env.user.company_id.currency_id
to_currency = price_list.currency_id
compute_currency = lambda price: from_currency.compute(price,
to_currency)
subscription_plan = []
recurrence_period = []
if not product_context.get('pricelist'):
product_context['pricelist'] = price_list.id
product = product.with_context(product_context)
if product.is_subscription:
subscription_product = request.env[
'product.template'].sudo().browse(product.id)
subscription_plan = subscription_product.subscription_plan_id
recurrence_period = (subscription_product.
subscription_recurrence_period_ids)
values = {
'search': search,
'category': category,
'pricelist': price_list,
'attrib_values': attrib_values,
'compute_currency': compute_currency,
'attrib_set': attrib_set,
'keep': keep,
'categories': categories,
'main_object': product,
'product': product,
'subscription_plan': subscription_plan,
'recurrence_period': recurrence_period
}
return request.render("website_sale.product", values)
@http.route()
def cart_update_json(self, *args, period=None, **kw):
"""Override to parse to recurrence period."""
recurrence_period = None
if period:
recurrence_period = request.env['recurrence.period'].browse(
int(period))
return super(WebsiteSaleSubscription, self).cart_update_json(
*args, period=recurrence_period, **kw)
@http.route()
def shop_payment_confirmation(self, **post):
"""Super controller in website sale and call send mail function."""
res = super(WebsiteSaleSubscription, self).shop_payment_confirmation(
**post)
order = res.qcontext['order']
subscription_order = request.env[
'subscription.package'].search(
[('sale_order', '=', order.id)])
recurrence = [
{order_line.product_id: order_line.subscription_interval_id}
for order_line in order.order_line]
for dictionary in recurrence:
if (subscription_order.product_line_ids.product_id in
dictionary.keys()):
subscription_order.update({'recurrence_period_id': dictionary[
subscription_order.product_line_ids.product_id]})
subscription_order.send_subscription_order_to_customer()
return res

56
website_subscription_package/data/mail_template_data.xml

@ -0,0 +1,56 @@
<?xml version="1.0"?>
<odoo>
<!-- Email Template: Email for renew subscription -->
<record id="mail_template_subscription_order" model="mail.template">
<field name="name">Subscription: Send Subscription Order From Website</field>
<field name="model_id" ref="website_subscription_package.model_subscription_package"/>
<field name="subject">{{ object.company_id.name }}: Subscription Order {{ object.name }}</field>
<field name="email_from">{{ object.company_id.email }}</field>
<field name="email_to">{{ object.partner_id.email }}</field>
<field name="description">Sent Subscription Order to customers.</field>
<field name="auto_delete" eval="True"/>
<field name="lang">{{ object.partner_id.lang }}</field>
<field name="body_html" type="html">
<div style="background:#F0F0F0;color:#515166;padding:10px 0px;font-family:Arial,Helvetica,sans-serif;font-size:14px;">
<table border="0" cellpadding="0" cellspacing="0"
style="padding-top: 16px; background-color: #F1F1F1; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;">
<tr>
<td align="center">
<table border="0" cellpadding="0" cellspacing="0"
width="590"
style="padding: 16px; background-color: white; color: #454748; border-collapse:separate;">
<tbody>
<!-- CONTENT -->
<tr>
<td align="center"
style="min-width: 590px;">
<table border="0" cellpadding="0"
cellspacing="0" width="590"
style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
<tr><td valign="top" style="font-size: 13px;">
<div>
Dear <t t-out="object.partner_id.name or ''">Marc Demo</t>,
<br/>
<br/>
Your subscription<span style="font-weight:bold; font-size: 15px;" t-out="object.name or ''">
SUB001
</span>
has been created for product
<span t-out="object.product_line_ids.product_id.name or ''">Product
</span>
<br/>Do not Hesitate to contact us.
</div>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
</div>
</field>
</record>
</odoo>

6
website_subscription_package/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <website_subscription_package>
#### 20.04.2024
#### Version 16.0.1.0.0
#### ADD
- Initial commit for Website Subscription Package Management

50
website_pre_booking/controllers/__init__.py → website_subscription_package/models/__init__.py

@ -1,23 +1,27 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU 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 pre_booking_portal
from . import website_pre_booking
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 product_product
from . import product_template
from . import recurrence_period
from . import sale_order
from . import sale_order_line
from . import subscription_package

46
website_subscription_package/models/product_product.py

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 ProductProduct(models.Model):
"""Adding a new field for discounts for variants of subscription products
second subscription."""
_inherit = "product.product"
subscription_discount = fields.Float(
string="Discount(%)", help="Discount for second subscription.")
def action_open_attribute_values_discount(self):
"""Set Discounts for variants of subscription products second
subscription."""
return {
'type': 'ir.actions.act_window',
'name': _("Product Variant Discount For 2nd subscription"),
'res_model': 'product.product',
'view_mode': 'tree',
'views': [(self.env.ref('website_subscription_package.'
'product_product_view_tree').id, 'list')],
'context': {
'search_default_product_tmpl_id': self.product_tmpl_id.id,
'default_product_tmpl_id': self.product_tmpl_id.id},
'target': 'current'}

47
website_subscription_package/models/product_template.py

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 ProductTemplate(models.Model):
"""Inherited product template model add new field to select recurrence
period for subscription product."""
_inherit = "product.template"
subscription_recurrence_period_ids = fields.Many2many(
comodel_name='recurrence.period', string='Recurrence period',
help="Select recurrence period (subscription interval) for the "
"product.")
def action_open_attribute_values_discount(self):
"""Set Discounts for variants of subscription products second
subscription."""
return {
'type': 'ir.actions.act_window',
'name': _("Product Variant Discount For 2nd subscription"),
'res_model': 'product.product',
'view_mode': 'tree',
'views': [(self.env.ref('website_subscription_package.'
'product_product_view_tree').id, 'list')],
'context': {'search_default_product_tmpl_id': self.id,
'default_product_tmpl_id': self.id},
'target': 'current'}

36
website_subscription_package/models/recurrence_period.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models, fields
class RecurrencePeriod(models.Model):
"""This class is used to create new model recurrence period"""
_name = "recurrence.period"
_description = "Recurrence Period "
name = fields.Char(string="Name", help="Name of recurrence period.")
duration = fields.Float(string="Duration", help="Duration of the "
"recurrence period")
unit = fields.Selection([('hours', 'hours'),
('days', 'Days'), ('weeks', 'Weeks'),
('months', 'Months'), ('years', 'Years')],
string='Unit', help='Unit measure for the duration')

68
website_subscription_package/models/sale_order.py

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 SaleOrder(models.Model):
"""Extends the Sale Order model to handle subscription orders."""
_inherit = 'sale.order'
def _prepare_order_line_values(self, product_id, quantity, period=None,
**kwargs):
"""Add Recurrence period in order lines."""
values = super()._prepare_order_line_values(product_id, quantity,
**kwargs)
product = self.env['product.product'].browse(product_id)
if product.is_subscription:
values.update({'subscription_interval_id': period.id})
return values
def _cart_update_order_line(self, product_id, quantity, order_line,
**kwargs):
"""Add corresponding recurrence period for subscription product in
sale order line."""
self.ensure_one()
period = kwargs.get('period')
if order_line and quantity <= 0: # Remove zero or negative lines
order_line.unlink()
order_line = self.env['sale.order.line']
elif order_line and period:
# Create a new line with a different recurrence period for the
# same subscription product.
for rec in order_line:
if (rec.product_id.id == product_id and
rec.subscription_interval_id.id != period.id):
order_line_values = self._prepare_order_line_values(
product_id, 1, **kwargs)
order_line = self.env['sale.order.line'].sudo().create(
order_line_values)
elif order_line and not period:
update_values = self._prepare_order_line_update_values(
order_line, quantity, **kwargs)
if update_values:
self._update_cart_line_values(order_line, update_values)
elif quantity >= 0:
order_line_values = self._prepare_order_line_values(
product_id, quantity, **kwargs)
order_line = self.env['sale.order.line'].sudo().create(
order_line_values)
return order_line

36
website_subscription_package/models/sale_order_line.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 SaleOrderLine(models.Model):
"""Add a new field to the sale order line for the subscription interval
for subscription product."""
_inherit = 'sale.order.line'
subscription_interval_id = fields.Many2one("recurrence.period",
string="Subscription Interval",
help="Recurrence period for "
"subscription product.")
is_product_subscription = fields.Boolean(
related='product_template_id.is_subscription',
string="Is Subscription", help="Is subscription product.")

121
website_subscription_package/models/subscription_package.py

@ -0,0 +1,121 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anagha S (odoo@cybrosys.com)
#
# 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 SubscriptionPackage(models.Model):
"""This class inherits from the 'subscription.package' model and extends
its functionality. It provides methods for sending subscription order
details to customers and managing subscription limits."""
_inherit = "subscription.package"
recurrence_period_id = fields.Many2one("recurrence.period",
string="Recurrence Period",
help="The period of the recurrence")
def send_subscription_order_to_customer(self):
"""Generates a mail and send to customer about the subscription order
details."""
template_id = self.env.ref(
'website_subscription_package.mail_template_subscription_order')
for rec in self:
email_vals = {'message_type': 'notification',
'is_notification': True,
"model": 'subscription.package',
"res_id": rec.id}
template_id.send_mail(
rec.id, force_send=True,
email_layout_xmlid=
"mail.mail_notification_layout_with_responsible_signature",
email_values=email_vals)
def close_limit_cron(self):
"""It Checks renew date, close date. It will send mail when renew
date and also generates invoices based on the plan.
It wil close the subscription automatically if renewal limit is
exceeded."""
pending_subscriptions = self.env['subscription.package'].search(
[('stage_category', '=', 'progress')])
today_date = fields.Date.today()
pending_subscription = False
for pending_subscription in pending_subscriptions:
get_dates = self.find_renew_date(
pending_subscription.next_invoice_date,
pending_subscription.date_started,
pending_subscription.plan_id.days_to_end)
renew_date = get_dates['renew_date']
end_date = get_dates['end_date']
pending_subscription.close_date = get_dates['close_date']
if today_date == pending_subscription.next_invoice_date:
if pending_subscription.plan_id.invoice_mode == 'draft_invoice':
this_products_line = []
for rec in pending_subscription.product_line_ids:
rec_list = [0, 0, {'product_id': rec.product_id.id,
'quantity': rec.product_qty,
'price_unit': rec.unit_price,
'discount': rec.product_id.subscription_discount,
'tax_ids': rec.tax_id
}]
this_products_line.append(rec_list)
self.env['account.move'].create(
{'move_type': 'out_invoice',
'invoice_date_due': today_date,
'invoice_payment_term_id': False,
'invoice_date': today_date,
'state': 'draft',
'subscription_id': pending_subscription.id,
'partner_id': pending_subscription.partner_invoice_id.id,
'currency_id': pending_subscription.partner_invoice_id.currency_id.id,
'invoice_line_ids': this_products_line
})
pending_subscription.write({
'to_renew': False,
'start_date': pending_subscription.next_invoice_date})
new_date = self.find_renew_date(
pending_subscription.next_invoice_date,
pending_subscription.date_started,
pending_subscription.plan_id.days_to_end)
pending_subscription.write(
{'close_date': new_date['close_date']})
self.send_renew_alert_mail(today_date,
new_date['renew_date'],
pending_subscription.id)
if (today_date == end_date) and (
pending_subscription.plan_id.limit_choice != 'manual'):
display_msg = ("<h5><i>The renewal limit has been exceeded "
"today for this subscription based on the "
"current subscription plan.</i></h5>")
pending_subscription.message_post(body=display_msg)
pending_subscription.is_closed = True
reason = (self.env['subscription.package.stop'].search([
('name', '=', 'Renewal Limit Exceeded')]).id)
pending_subscription.close_reason = reason
pending_subscription.closed_by = self.user_id
pending_subscription.close_date = fields.Date.today()
stage = (self.env['subscription.package.stage'].search([
('category', '=', 'closed')]).id)
values = {'stage_id': stage, 'to_renew': False,
'next_invoice_date': False}
pending_subscription.write(values)
self.send_renew_alert_mail(today_date, renew_date,
pending_subscription.id)
return dict(pending=pending_subscription)

2
website_subscription_package/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_recurrence_period_user,access.recurrence.period.user,model_recurrence_period,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_recurrence_period_user access.recurrence.period.user model_recurrence_period base.group_user 1 1 1 1

0
website_pre_booking/static/description/assets/icons/check.png → website_subscription_package/static/description/assets/icons/check.png

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

0
website_pre_booking/static/description/assets/icons/chevron.png → website_subscription_package/static/description/assets/icons/chevron.png

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 310 B

0
website_pre_booking/static/description/assets/icons/cogs.png → website_subscription_package/static/description/assets/icons/cogs.png

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

0
website_pre_booking/static/description/assets/icons/consultation.png → website_subscription_package/static/description/assets/icons/consultation.png

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

0
website_pre_booking/static/description/assets/icons/ecom-black.png → website_subscription_package/static/description/assets/icons/ecom-black.png

Before

Width:  |  Height:  |  Size: 576 B

After

Width:  |  Height:  |  Size: 576 B

0
website_pre_booking/static/description/assets/icons/education-black.png → website_subscription_package/static/description/assets/icons/education-black.png

Before

Width:  |  Height:  |  Size: 733 B

After

Width:  |  Height:  |  Size: 733 B

0
website_pre_booking/static/description/assets/icons/hotel-black.png → website_subscription_package/static/description/assets/icons/hotel-black.png

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 911 B

0
website_pre_booking/static/description/assets/icons/license.png → website_subscription_package/static/description/assets/icons/license.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
website_pre_booking/static/description/assets/icons/lifebuoy.png → website_subscription_package/static/description/assets/icons/lifebuoy.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
website_pre_booking/static/description/assets/icons/manufacturing-black.png → website_subscription_package/static/description/assets/icons/manufacturing-black.png

Before

Width:  |  Height:  |  Size: 673 B

After

Width:  |  Height:  |  Size: 673 B

0
website_pre_booking/static/description/assets/icons/pos-black.png → website_subscription_package/static/description/assets/icons/pos-black.png

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 878 B

0
website_pre_booking/static/description/assets/icons/puzzle.png → website_subscription_package/static/description/assets/icons/puzzle.png

Before

Width:  |  Height:  |  Size: 653 B

After

Width:  |  Height:  |  Size: 653 B

0
website_pre_booking/static/description/assets/icons/restaurant-black.png → website_subscription_package/static/description/assets/icons/restaurant-black.png

Before

Width:  |  Height:  |  Size: 905 B

After

Width:  |  Height:  |  Size: 905 B

0
website_pre_booking/static/description/assets/icons/service-black.png → website_subscription_package/static/description/assets/icons/service-black.png

Before

Width:  |  Height:  |  Size: 839 B

After

Width:  |  Height:  |  Size: 839 B

0
website_pre_booking/static/description/assets/icons/trading-black.png → website_subscription_package/static/description/assets/icons/trading-black.png

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 427 B

0
website_pre_booking/static/description/assets/icons/training.png → website_subscription_package/static/description/assets/icons/training.png

Before

Width:  |  Height:  |  Size: 627 B

After

Width:  |  Height:  |  Size: 627 B

0
website_pre_booking/static/description/assets/icons/update.png → website_subscription_package/static/description/assets/icons/update.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
website_pre_booking/static/description/assets/icons/user.png → website_subscription_package/static/description/assets/icons/user.png

Before

Width:  |  Height:  |  Size: 988 B

After

Width:  |  Height:  |  Size: 988 B

0
website_pre_booking/static/description/assets/icons/wrench.png → website_subscription_package/static/description/assets/icons/wrench.png

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

0
website_pre_booking/static/description/assets/misc/categories.png → website_subscription_package/static/description/assets/misc/categories.png

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
website_pre_booking/static/description/assets/misc/check-box.png → website_subscription_package/static/description/assets/misc/check-box.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
website_pre_booking/static/description/assets/misc/compass.png → website_subscription_package/static/description/assets/misc/compass.png

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

0
website_pre_booking/static/description/assets/misc/corporate.png → website_subscription_package/static/description/assets/misc/corporate.png

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
website_pre_booking/static/description/assets/misc/customer-support.png → website_subscription_package/static/description/assets/misc/customer-support.png

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

0
website_pre_booking/static/description/assets/misc/cybrosys-logo.png → website_subscription_package/static/description/assets/misc/cybrosys-logo.png

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

0
website_pre_booking/static/description/assets/misc/features.png → website_subscription_package/static/description/assets/misc/features.png

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 589 B

0
website_pre_booking/static/description/assets/misc/logo.png → website_subscription_package/static/description/assets/misc/logo.png

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

0
website_pre_booking/static/description/assets/misc/pictures.png → website_subscription_package/static/description/assets/misc/pictures.png

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

0
website_pre_booking/static/description/assets/misc/pie-chart.png → website_subscription_package/static/description/assets/misc/pie-chart.png

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

0
website_pre_booking/static/description/assets/misc/right-arrow.png → website_subscription_package/static/description/assets/misc/right-arrow.png

Before

Width:  |  Height:  |  Size: 967 B

After

Width:  |  Height:  |  Size: 967 B

0
website_pre_booking/static/description/assets/misc/star.png → website_subscription_package/static/description/assets/misc/star.png

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

0
website_pre_booking/static/description/assets/misc/support.png → website_subscription_package/static/description/assets/misc/support.png

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

0
website_pre_booking/static/description/assets/misc/whatsapp.png → website_subscription_package/static/description/assets/misc/whatsapp.png

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
website_subscription_package/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
website_subscription_package/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
website_subscription_package/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
website_subscription_package/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
website_subscription_package/static/description/assets/modules/5.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
website_subscription_package/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
website_subscription_package/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot08.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

BIN
website_subscription_package/static/description/assets/screenshots/Screenshot18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

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

Loading…
Cancel
Save