Browse Source

Apr 25: [ADD] Initial Commit 'sales_contract_and_recurring_invoices'

pull/254/merge
RisvanaCybro 1 year ago
parent
commit
a42565e22a
  1. 53
      sales_contract_and_recurring_invoices/README.rst
  2. 23
      sales_contract_and_recurring_invoices/__init__.py
  3. 49
      sales_contract_and_recurring_invoices/__manifest__.py
  4. 21
      sales_contract_and_recurring_invoices/controllers/__init__.py
  5. 78
      sales_contract_and_recurring_invoices/controllers/sales_contract_and_recurring_invoices.py
  6. 18
      sales_contract_and_recurring_invoices/data/ir_cron_data.xml
  7. 5
      sales_contract_and_recurring_invoices/doc/RELEASE_NOTES.md
  8. 25
      sales_contract_and_recurring_invoices/models/__init__.py
  9. 30
      sales_contract_and_recurring_invoices/models/account_move.py
  10. 30
      sales_contract_and_recurring_invoices/models/sale_order_line.py
  11. 92
      sales_contract_and_recurring_invoices/models/subscription_contract_line.py
  12. 250
      sales_contract_and_recurring_invoices/models/subscription_contracts.py
  13. 21
      sales_contract_and_recurring_invoices/report/__init__.py
  14. 14
      sales_contract_and_recurring_invoices/report/subscription_contract_reports.xml
  15. 187
      sales_contract_and_recurring_invoices/report/subscription_contract_templates.xml
  16. 35
      sales_contract_and_recurring_invoices/report/subscription_contracts_report.py
  17. 3
      sales_contract_and_recurring_invoices/security/ir.model.access.csv
  18. 11
      sales_contract_and_recurring_invoices/security/subscription_contracts_security.xml
  19. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/check.png
  20. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/chevron.png
  21. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/cogs.png
  22. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/consultation.png
  23. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/ecom-black.png
  24. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/education-black.png
  25. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/hotel-black.png
  26. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/license.png
  27. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/lifebuoy.png
  28. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/manufacturing-black.png
  29. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/pos-black.png
  30. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/puzzle.png
  31. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/restaurant-black.png
  32. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/service-black.png
  33. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/trading-black.png
  34. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/training.png
  35. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/update.png
  36. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/user.png
  37. BIN
      sales_contract_and_recurring_invoices/static/description/assets/icons/wrench.png
  38. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/categories.png
  39. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/check-box.png
  40. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/compass.png
  41. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/corporate.png
  42. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/customer-support.png
  43. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/cybrosys-logo.png
  44. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/features.png
  45. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/logo.png
  46. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/pictures.png
  47. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/pie-chart.png
  48. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/right-arrow.png
  49. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/star.png
  50. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/support.png
  51. BIN
      sales_contract_and_recurring_invoices/static/description/assets/misc/whatsapp.png
  52. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/1.png
  53. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/2.png
  54. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/3.png
  55. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/4.png
  56. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/5.png
  57. BIN
      sales_contract_and_recurring_invoices/static/description/assets/modules/6.png
  58. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_01.png
  59. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_02.png
  60. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_03.png
  61. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_04.png
  62. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_05.png
  63. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_06.png
  64. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_07.png
  65. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_08.png
  66. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_09.png
  67. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_10.png
  68. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_11.png
  69. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_12.png
  70. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_13.png
  71. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_14.png
  72. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_15.png
  73. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_16.png
  74. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_17.png
  75. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_18.png
  76. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_19.png
  77. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_20.png
  78. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_21.png
  79. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_22.png
  80. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_23.png
  81. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_24.png
  82. BIN
      sales_contract_and_recurring_invoices/static/description/assets/screenshots/hero.gif
  83. BIN
      sales_contract_and_recurring_invoices/static/description/banner.jpg
  84. BIN
      sales_contract_and_recurring_invoices/static/description/icon.png
  85. 810
      sales_contract_and_recurring_invoices/static/description/index.html
  86. 17
      sales_contract_and_recurring_invoices/views/account_move_views.xml
  87. 196
      sales_contract_and_recurring_invoices/views/subscription_contracts_templates.xml
  88. 169
      sales_contract_and_recurring_invoices/views/subscription_contracts_views.xml

53
sales_contract_and_recurring_invoices/README.rst

@ -0,0 +1,53 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Sales Contract and Recurring Invoices
=====================================
* Sales Contract and Recurring Invoices module helps to create sale contracts and recurring invoices
Installation
============
- www.odoo.com/documentation/16.0/setup/install.html
- Install our custom addon
Configuration
=============
*No Additional configuration is needed.
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
General Public License, Version 3 (AGPL v3).
(https://www.odoo.com/documentation/user/16.0/legal/licenses/licenses.html)
Credits
-------
* Developer:(V15) Ranjith R,
(V16) Vishnu P,
Contact : odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

23
sales_contract_and_recurring_invoices/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from . import controllers
from . import models
from . import report

49
sales_contract_and_recurring_invoices/__manifest__.py

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
{
'name': 'Sales Contract and Recurring Invoices',
'version': '15.0.1.0.0',
'category': 'Sales,Accounting',
'summary': """Module helps to create sale contracts and recurring
invoices""",
'description': """This module helps to create sale contracts with recurring
invoices and we can access all your sale contracts from website portal""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['sale_management', 'website'],
'data': [
'security/subscription_contracts_security.xml',
'security/ir.model.access.csv',
'data/ir_cron_data.xml',
'report/subscription_contract_reports.xml',
'views/subscription_contracts_views.xml',
'views/account_move_views.xml',
'views/subscription_contracts_templates.xml',
'report/subscription_contract_templates.xml',
],
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

21
sales_contract_and_recurring_invoices/controllers/__init__.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from . import sales_contract_and_recurring_invoices

78
sales_contract_and_recurring_invoices/controllers/sales_contract_and_recurring_invoices.py

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal
class PortalAccount(CustomerPortal):
""" Super customer portal and get count """
def _prepare_home_portal_values(self, counters):
""" Function to get count of contracts """
values = super()._prepare_home_portal_values(counters)
partner = request.env.user.partner_id.id
contract_count = request.env['subscription.contracts'].search([
('partner_id', '=', partner)])
values['contract_count'] = len(contract_count)
return values
class ContractsController(http.Controller):
""" Sale contract in customer portal controller"""
@http.route(['/my/contracts'], type='http', auth='user', csrf=False,
website=True)
def portal_my_quotes(self):
""" Customer portal my contracts """
partner = request.env.user.partner_id.id
values = {
'records': request.env['subscription.contracts'].search(
[('partner_id', '=', partner)]),
}
return request.render(
'sales_contract_and_recurring_invoices.tmp_contract_details',
values)
@http.route(['/contracts/<int:contract_id>/'], type='http',
auth='user',
csrf=False, website=True)
def portal_manufacture(self, contract_id):
""" Customer portal subscription contract """
values = {
'records': request.env['subscription.contracts'].browse(
contract_id),
}
return request.render(
'sales_contract_and_recurring_invoices.contract_details',
values)
@http.route(['/report/pdf/<int:contract_id>/'], type='http',
auth='public',
csrf=False, website=True)
def action_print_report(self, contract_id):
""" Print subscription contract report """
report = request.env.ref(
'sales_contract_and_recurring_invoices.action_report_contracts')
pdf = report.sudo()._render_qweb_pdf([contract_id])[0]
pdfhttpheaders = [('Content-Type', 'application/pdf'),
('Content-Length', len(pdf))]
return request.make_response(pdf, headers=pdfhttpheaders)

18
sales_contract_and_recurring_invoices/data/ir_cron_data.xml

@ -0,0 +1,18 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<!-- Cron Job for automatic state change of contract-->
<data noupdate="1">
<record id="ir_cron_scheduler_recurring_action" model="ir.cron">
<field name="name">Subscription Contract State Change</field>
<field name="model_id" ref="model_subscription_contracts"/>
<field name="state">code</field>
<field name="code">model.subscription_contract_state_change()
</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="doall">1</field>
</record>
</data>
</odoo>

5
sales_contract_and_recurring_invoices/doc/RELEASE_NOTES.md

@ -0,0 +1,5 @@
## Module <sales_contract_and_recurring_invoices>
#### 28.03.2024
#### Version 15.0.1.0.0
#### ADD
- Initial commit for Sales Contract and Recurring Invoices

25
sales_contract_and_recurring_invoices/models/__init__.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from . import account_move
from . import sale_order_line
from . import subscription_contracts
from . import subscription_contract_line

30
sales_contract_and_recurring_invoices/models/account_move.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import fields, models
class AccountMove(models.Model):
""" Add contract_origin in account move"""
_inherit = 'account.move'
contract_origin = fields.Integer(string='Subscription Contract',
help='to add Subscription Contract'
'id in account move')

30
sales_contract_and_recurring_invoices/models/sale_order_line.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import fields, models
class SaleOrderLine(models.Model):
""" Add contract reference in sale order line"""
_inherit = 'sale.order.line'
contract_id = fields.Many2one(
'subscription.contracts', string='Contracts',
help='For adding Contracts in sale order line')

92
sales_contract_and_recurring_invoices/models/subscription_contract_line.py

@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import api, fields, models
class SubscriptionContractLines(models.Model):
""" Add subscription contract line"""
_name = 'subscription.contracts.line'
_description = 'Subscription Contracts Line'
subscription_contract_id = fields.Many2one(
'subscription.contracts', string='Subscription Contracts',
help='To add Subscription')
product_id = fields.Many2one(
'product.product', string='Products',
help='To add products')
currency_id = fields.Many2one(
related='subscription_contract_id.currency_id',
depends=['subscription_contract_id.currency_id'],
help='To get the currency',
string='Currency')
description = fields.Text(
string="Description", compute='_compute_description', store=True,
readonly=False, precompute=True, help='To get the product description')
qty_ordered = fields.Float(
string="Quantity", digits='Product Unit of Measure', default=1.0,
help='To add ordered Quantity')
product_uom_id = fields.Many2one(
'uom.uom', string='Unit of Measure',
compute='_compute_product_uom',
store=True, help='To get product unit of measure')
price_unit = fields.Float(string="Unit Price", help='to get unit price',
compute='_compute_price_unit',
digits='Product Price',
store=True, readonly=False, precompute=True, )
tax_ids = fields.Many2many(comodel_name='account.tax', string="Taxes",
context={'active_test': False},
help='To Add taxes')
discount = fields.Float(string="Discount (%)", digits='Discount',
store=True, readonly=False, help='To add discount')
sub_total = fields.Monetary(
string="Total", compute='_compute_amount', store=True, precompute=True,
help='Sub Total')
@api.depends('product_id')
def _compute_description(self):
""" Compute product description """
for option in self:
if not option.product_id:
continue
product_lang = option.product_id.with_context(
lang=self.subscription_contract_id.partner_id.lang)
option.description =\
product_lang.get_product_multiline_description_sale()
@api.depends('product_id')
def _compute_product_uom(self):
""" Compute product uom """
for rec in self:
rec.product_uom_id = rec.product_id.uom_id
@api.depends('product_id')
def _compute_price_unit(self):
""" Compute unit price"""
for rec in self:
rec.price_unit = rec.product_id.lst_price
@api.depends('product_id', 'qty_ordered', 'discount', 'price_unit')
def _compute_amount(self):
""" Compute total amount """
for rec in self:
total = rec.price_unit * rec.qty_ordered
discount = total * rec.discount / 100
rec.sub_total = total - discount

250
sales_contract_and_recurring_invoices/models/subscription_contracts.py

@ -0,0 +1,250 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import api, fields, models
from odoo.tools import date_utils
from odoo.tools.safe_eval import datetime
class SubscriptionContracts(models.Model):
""" Model for subscription contracts """
_name = 'subscription.contracts'
_description = 'Subscription Contracts'
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string='Contract Name', required=True,
help='To add contract name')
reference = fields.Char(string='Reference', help='To add contract reference'
)
partner_id = fields.Many2one('res.partner', string="Customer",
help='To add Customer')
recurring_period = fields.Integer(string='Recurring Period',
help='To add recurring period of '
'subscription contract')
recurring_period_interval = fields.Selection([
('Days', 'Days'),
('Weeks', 'Weeks'),
('Months', 'Months'),
('Years', 'Years'),
], help='To add recurring interval of subscription contract')
contract_reminder = fields.Integer(
string='Contract Expiration Reminder (Days)',
help='Add expiry reminder of subscription contract in days.')
recurring_invoice = fields.Integer(
string='Recurring Invoice Interval (Days)',
help='Add recurring invoice interval in days')
next_invoice_date = fields.Date(string='Next Invoice Date', store=True,
compute='_compute_next_invoice_date',
help='Add date of next invoice')
company_id = fields.Many2one('res.company', string='Company',
default=lambda self: self.env.company,
help='To get company')
currency_id = fields.Many2one('res.currency', string='Currency',
help='To get currency', required=True,
default=lambda
self: self.env.company.currency_id)
date_start = fields.Date(string='Start Date', default=fields.Date.today(),
help='To Add subscription contract start date')
invoice_count = fields.Integer(store=True,
compute='_compute_invoice_count',
string='Invoice count',
help='To get subscription contract end date')
date_end = fields.Date(string='End Date', help='Subscription End Date')
current_reference = fields.Integer(compute='_compute_sale_order_lines',
string='Current Subscription Id',
help='To add current Subscription id')
lock = fields.Boolean(string='Lock', default=False,
help='To lock subscription contract')
state = fields.Selection([
('New', 'New'),
('Ongoing', 'Ongoing'),
('Expire Soon', 'Expire Soon'),
('Expired', 'Expired'),
('Cancelled', 'Cancelled'),
], string='Stage', default='New', copy=False, tracking=True,
readonly=True, help='Status of subscription contract')
contract_line_ids = fields.One2many(
'subscription.contracts.line',
'subscription_contract_id',
help='To Add Subscription Contract', string='Contract lines')
amount_total = fields.Monetary(string="Total", store=True,
compute='_compute_amount_total', tracking=4,
help='To get total amount')
sale_order_line_ids = fields.One2many('sale.order.line',
'contract_id',
help='Sale Order Lines',
string='To add order lines')
note = fields.Html(string="Terms and conditions",
help='To add terms and conditions', translate=True)
invoices_active = fields.Boolean('Invoice active', default=False,
help='To active invoices smart button',
compute='_compute_invoice_active')
def action_to_confirm(self):
""" Button to confirm """
self.write({'state': 'Ongoing'})
def action_to_cancel(self):
""" Button to cancel """
self.write({'state': 'Cancelled'})
def action_generate_invoice(self):
""" Button to generate invoice """
self.env['account.move'].create(
{
'move_type': 'out_invoice',
'partner_id': self.partner_id.id,
'invoice_date': fields.date.today(),
'contract_origin': self.id,
'invoice_line_ids': [(0, 0, {
'product_id': line.product_id.id,
'name': line.description,
'quantity': line.qty_ordered,
'price_unit': line.price_unit,
'tax_ids': line.tax_ids,
'discount': line.discount,
}) for line in self.contract_line_ids]
})
self.invoice_count = self.env['account.move'].search_count([
('contract_origin', '=', self.id)])
def action_lock(self):
""" Button to lock subscription contract """
self.lock = True
def action_to_unlock(self):
""" Button to unlock subscription contract """
self.lock = False
def action_get_invoice(self):
""" Invoices smart button """
self.ensure_one()
return {
'type': 'ir.actions.act_window',
'name': 'Invoices',
'view_mode': 'tree,form',
'res_model': 'account.move',
'domain': [('contract_origin', '=', self.id)],
}
@api.depends('contract_line_ids.sub_total')
def _compute_amount_total(self):
""" Compute total amount """
for order in self:
order_lines = order.contract_line_ids
order.amount_total = sum(order_lines.mapped('sub_total'))
@api.depends('partner_id')
def _compute_invoice_count(self):
""" Compute invoice count """
self.invoice_count = self.env['account.move'].search_count([
('contract_origin', '=', self.id)
])
@api.depends('invoices_active')
def _compute_invoice_active(self):
""" Check invoice count to show the invoice smart button """
invoice_count = self.env['account.move'].search_count([
('contract_origin', '=', self.id)
])
if invoice_count != 0:
self.invoices_active = True
else:
self.invoices_active = False
@api.depends('date_start', 'recurring_invoice', 'recurring_period',
'recurring_period_interval')
def _compute_next_invoice_date(self):
""" Compute next invoice date """
self.next_invoice_date = fields.Date.today()
start_date = self.date_start
interval = self.recurring_invoice
recurring_period = self.recurring_period
recurring_period_interval = self.recurring_period_interval
self.next_invoice_date = date_utils.add(start_date,
days=int(interval))
if recurring_period_interval == 'Days':
next_schedule = date_utils.add(start_date,
days=int(recurring_period))
self.date_end = next_schedule
elif recurring_period_interval == 'Weeks':
next_schedule = date_utils.add(start_date,
weeks=int(recurring_period))
self.date_end = next_schedule
elif recurring_period_interval == 'Months':
next_schedule = date_utils.add(start_date,
months=int(recurring_period))
self.date_end = next_schedule
else:
next_schedule = date_utils.add(start_date,
years=int(recurring_period))
self.date_end = next_schedule
@api.model
def subscription_contract_state_change(self):
""" Automatic state change and create invoice """
records = self.env['subscription.contracts'].search([])
for rec in records:
end_date = rec.date_end
expiry_reminder = rec.contract_reminder
expiry_warning_date = date_utils.subtract(end_date,
days=int(
expiry_reminder))
current_date = fields.Date.today()
next_invoice_date = rec.next_invoice_date
if expiry_warning_date <= current_date <= end_date:
rec.write({'state': 'Expire Soon'})
if end_date < current_date:
rec.write({'state': 'Expired'})
if next_invoice_date == current_date and rec.state != 'Cancelled':
data = rec.env['account.move'].create([
{
'move_type': 'out_invoice',
'partner_id': rec.partner_id.id,
'invoice_date': fields.date.today(),
'contract_origin': rec.id,
}])
for line in rec.contract_line_ids:
data.write({
'invoice_line_ids': [(0, 0, {
'product_id': line.product_id.id,
'name': line.description,
'quantity': line.qty_ordered,
'price_unit': line.price_unit,
'tax_ids': line.tax_ids,
'discount': line.discount,
})],
})
rec.invoice_count = rec.env['account.move'].search_count([
('contract_origin', '=', rec.id)])
@api.depends('current_reference')
def _compute_sale_order_lines(self):
""" Get sale order line"""
self.current_reference = self.id
product_id = self.contract_line_ids.mapped('product_id')
sale_order_line = self.env['sale.order.line'].search([
('order_partner_id', '=', self.partner_id.id)
])
for rec in sale_order_line:
if self.date_start <= datetime.datetime.date(
rec.create_date) <= self.date_end:
if rec.product_id in product_id:
rec.contract_id = self.id

21
sales_contract_and_recurring_invoices/report/__init__.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from . import subscription_contracts_report

14
sales_contract_and_recurring_invoices/report/subscription_contract_reports.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Subscription contracts report action-->
<record id="action_report_contracts"
model="ir.actions.report">
<field name="name">Subscription Contract Report</field>
<field name="model">subscription.contracts</field>
<field name="report_type">qweb-pdf</field>
<field name="binding_model_id" ref="model_subscription_contracts"/>
<field name="report_name">sales_contract_and_recurring_invoices.report_contracts</field>
<field name="report_file">sales_contract_and_recurring_invoices.report_contracts</field>
<field name="print_report_name">'Subscription Contracts Report - %s' %(object.name)</field>
</record>
</odoo>

187
sales_contract_and_recurring_invoices/report/subscription_contract_templates.xml

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Template for Subscription contracts report-->
<template id="report_contracts"
name="Subscription contracts details">
<t t-call="web.html_container">
<div class="container">
<t t-call="web.external_layout">
<div class="page">
<h2>
<t t-esc='records.name'/>
</h2>
</div>
<table class="table table-striped">
<tr>
<th>Customer:</th>
<td>
<t t-if="records.partner_id.name">
<t t-esc="records.partner_id.name"/>
</t>
</td>
<th>Reference:</th>
<td>
<t t-if="records.reference">
<t t-esc="records.reference"/>
</t>
</td>
</tr>
<tr>
<th>Recurring Period:</th>
<td>
<t t-if="records.recurring_period">
<t t-esc="records.recurring_period"/>
<t t-esc="records.recurring_period_interval"/>
</t>
</td>
<th>Company:</th>
<td>
<t t-if="records.company_id">
<t t-esc="records.company_id.name"/>
</t>
</td>
</tr>
<tr>
<th>Start Date:</th>
<td>
<t t-if="records.date_start">
<t t-esc="records.date_start"/>
</t>
</td>
<th>End Date:</th>
<td>
<t t-if="records.date_end">
<t t-esc="records.date_end"/>
</t>
</td>
</tr>
<tr>
<th>Stage:</th>
<td>
<t t-if="records.state">
<t t-esc="records.state"/>
</t>
</td>
<th>Date of Next Invoice:</th>
<td>
<t t-if="records.next_invoice_date">
<t t-esc="records.next_invoice_date"/>
</t>
</td>
</tr>
</table>
<H2>Contract Lines</H2>
<table class="table table-bordered">
<thead>
<tr>
<h2>
<th scope="col">Product</th>
</h2>
<h2>
<th scope="col">Description</th>
</h2>
<h2>
<th scope="col">Ordered Qty</th>
</h2>
<h2>
<th scope="col">Unit Price</th>
</h2>
<h2>
<th scope="col">Discount (%)</th>
</h2>
<h2>
<th scope="col">Subtotal</th>
</h2>
</tr>
</thead>
<tbody>
<t t-foreach="records.contract_line_ids"
t-as='res'>
<tr>
<td>
<t t-esc="res.product_id.name"/>
</td>
<td>
<t t-esc="res.description"/>
</td>
<td>
<t t-esc="res.qty_ordered"/>
<t t-esc='res.product_uom_id.name'/>
</td>
<td>
<t t-esc="res.price_unit"
t-options="{'widget': 'monetary', 'display_currency': res.currency_id}"/>
</td>
<td>
<t t-if="res.discount">
<t t-esc="res.discount"/>
</t>
</td>
<td>
<t t-esc="res.sub_total"
t-options="{'widget': 'monetary', 'display_currency': res.currency_id}"/>
</td>
</tr>
</t>
</tbody>
</table>
<H2>Sale Order Lines</H2>
<table class="table table-bordered">
<thead>
<tr>
<h2>
<th scope="col">Product</th>
</h2>
<h2>
<th scope="col">Description</th>
</h2>
<h2>
<th scope="col">Ordered Qty</th>
</h2>
<h2>
<th scope="col">Unit Price</th>
</h2>
<h2>
<th scope="col">Discount (%)</th>
</h2>
<h2>
<th scope="col">Subtotal</th>
</h2>
</tr>
</thead>
<tbody>
<t t-foreach="records.sale_order_line_ids"
t-as='rec'>
<tr>
<td>
<t t-esc="rec.product_id.name"/>
</td>
<td>
<t t-esc="rec.name"/>
</td>
<td>
<t t-esc="rec.product_uom_qty"/>
<t t-esc='rec.product_uom.name'/>
</td>
<td>
<t t-esc="rec.price_unit"
t-options="{'widget': 'monetary', 'display_currency': rec.currency_id}"/>
</td>
<td>
<t t-if="rec.discount">
<t t-esc="rec.discount"/>
</t>
</td>
<td>
<t t-esc="rec.price_subtotal"
t-options="{'widget': 'monetary', 'display_currency': rec.currency_id}"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
</div>
</t>
</template>
</odoo>

35
sales_contract_and_recurring_invoices/report/subscription_contracts_report.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Ranjith R(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.
###############################################################################
from odoo import api, models
class SubscriptionContractsReport(models.AbstractModel):
"""Class to print form view"""
_name = 'report.sales_contract_and_recurring_invoices.report_contracts'
_description = "Contract report"
@api.model
def _get_report_values(self, docids, data=None):
"""Function to print report """
records = self.env['subscription.contracts'].browse(docids)
return {
'records': records,
}

3
sales_contract_and_recurring_invoices/security/ir.model.access.csv

@ -0,0 +1,3 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_subscription_contracts_user,access.subscription.contracts.user,model_subscription_contracts,base.group_user,1,1,1,1
access_subscription_contracts_line_user,access.subscription.contracts.user.line,model_subscription_contracts_line,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_subscription_contracts_user access.subscription.contracts.user model_subscription_contracts base.group_user 1 1 1 1
3 access_subscription_contracts_line_user access.subscription.contracts.user.line model_subscription_contracts_line base.group_user 1 1 1 1

11
sales_contract_and_recurring_invoices/security/subscription_contracts_security.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Record rules-->
<data noupdate="1">
<record id="subscription_contract_company_rule" model="ir.rule">
<field name="name">Subscription Contract Company Rule</field>
<field ref="model_subscription_contracts" name="model_id"/>
<field name="domain_force">[('company_id', '=', company_id)]</field>
</record>
</data>
</odoo>

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_05.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_06.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_07.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_08.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_09.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_20.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_21.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_22.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_23.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
sales_contract_and_recurring_invoices/static/description/assets/screenshots/Subscription_contract_24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

BIN
sales_contract_and_recurring_invoices/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
sales_contract_and_recurring_invoices/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

810
sales_contract_and_recurring_invoices/static/description/index.html

@ -0,0 +1,810 @@
<div style="background-color: #714B67; min-height: 600px; 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 -->
<!-- APP HERO -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Sales Contract and Recurring Invoices </h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Access All Sales Contacts from Portal My Account.</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; 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 your customer to access all your sales contract from
Website Customer Portal.
</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-12">
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Allow your customers to access all sales contracts from Portal My Account.</span>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 12px;"></span>
</div>
</div>
<div class="d-flex align-items-start"
style="margin-top: 30px; margin-bottom: 30px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Allow your customer to download the contract subscription report.</span>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;"></span>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="./assets/misc/check-box.png" class="mr-2"/>
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Automatically generate recurring invoice for subscription contracts.
</span>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;"></span>
</div>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<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;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In Sales -> Configuration -> Contracts, can see all
subscription contracts. </p>
<img src="./assets/screenshots/Subscription_contract_01.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
We can create new subscription contracts using CREATE button.
</p>
<img src="./assets/screenshots/Subscription_contract_02.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
The created Contract in 'New' stage has option to select the
contract lines and have button to confirm the contract.</p>
<img src="./assets/screenshots/Subscription_contract_03.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click 'Confirm' button the subscription contract is
changed to
'Ongoing' stage.</p>
<img src="./assets/screenshots/Subscription_contract_04.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
There have button to Generate Invoice for contract lines.</p>
<img src="./assets/screenshots/Subscription_contract_05.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click 'Generate Invoice' button, it creates invoice for
contract lines and shows the count in smart tab. </p>
<img src="./assets/screenshots/Subscription_contract_06.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click the Smart tab can see all created invoices for
this subscription contract. </p>
<img src="./assets/screenshots/Subscription_contract_07.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
There has 'LOCK' button to lock the subscription contract. When
we click this button we do not modify the subscription
contract. </p>
<img src="./assets/screenshots/Subscription_contract_08.png"
class="img-thumbnail">
<img src="./assets/screenshots/Subscription_contract_09.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
There has a 'UNLOCK' Button to Unlock the Subscription
Contract. When we click Unlock button we can modify the
Subscription Contract.</p>
<img src="./assets/screenshots/Subscription_contract_10.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When contract reaches 'Next Invoice Date' it
automatically
generate invoice for this subscription contract and shows the
invoice count in smart tab, when we click the smart tab can see
all created invoice for this subscription contract.</p>
<img src="./assets/screenshots/Subscription_contract_11.png"
class="img-thumbnail">
<img src="./assets/screenshots/Subscription_contract_12.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When contract reaches 'Contract Expiration Reminder Period' it
automatically
change the stage of this subscription contract into 'Expire
Soon'. </p>
<img src="./assets/screenshots/Subscription_contract_13.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When contract reaches 'Contract End Date' it automatically
change the stage Of this subscription contract into
'Expired'. </p>
<img src="./assets/screenshots/Subscription_contract_14.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
There has 'CANCEL' button to cancel the subscription
contract. </p>
<img src="./assets/screenshots/Subscription_contract_15.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click cancel button, the subscription contract changes
into 'Cancelled' state. </p>
<img src="./assets/screenshots/Subscription_contract_16.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Under 'Sale Order Lines' tab can see all sale order lines of
this
subscription contract.</p>
<img src="./assets/screenshots/Subscription_contract_17.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In Website -> My Account can see My Contracts option.</p>
<img src="./assets/screenshots/Subscription_contract_18.png"
class="img-thumbnail">
<img src="./assets/screenshots/Subscription_contract_19.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click "My Contracts" can see all subscription
Contract.</p>
<img src="./assets/screenshots/Subscription_contract_20.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
When we click Contract Name, possible to access the
Subscription Contract. </p>
<img src="./assets/screenshots/Subscription_contract_21.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
In website customer portal there has option to Print the
subscription contract PDF report. </p>
<img src="./assets/screenshots/Subscription_contract_22.png"
class="img-thumbnail">
<img src="./assets/screenshots/Subscription_contract_24.png"
class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-lg-12 d-flex flex-column justify-content-center"
style="text-align: center; padding: 2.5rem 1rem !important;">
<hr style="border: 3px solid #714B67 !important; background-color: #714B67 !important; width: 80px !important; margin-bottom: 2rem !important;"/>
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_product_addons/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/pos_credit_limit/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/product_arabic/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/calculator_in_pos/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dashboard_pos/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/product_return_pos/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="left:-25px;width: 35px;color: #000;">
<span class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span> </a>
<a class="carousel-control-next" href="#demo1" data-slide="next"
style="right:-25px;width: 35px;color: #000;">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right" style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/star.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png"
class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/corporate.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/trading-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/pos-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/education-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/manufacturing-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/service-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
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"
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 -->

17
sales_contract_and_recurring_invoices/views/account_move_views.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Inherited form view of account move-->
<record id="view_move_form" model="ir.ui.view">
<field name="name">
account.move.view.form.inherit.sales.contract.recurring.invoice
</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']"
position="after">
<field name="contract_origin" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

196
sales_contract_and_recurring_invoices/views/subscription_contracts_templates.xml

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Template for my contracts menu in portal-->
<template id="portal_my_home_contracts" name="My Contracts"
customize_show="True" inherit_id="portal.portal_my_home">
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
<t t-call="portal.portal_docs_entry">
<t t-set="title">My Contracts</t>
<t t-set="url" t-value="'/my/contracts'"/>
<t t-set="placeholder_count" t-value="'contract_count'"/>
</t>
</xpath>
</template>
<!-- Template for my contracts-->
<template id="tmp_contract_details" name="My Contracts">
<t t-call="website.layout">
<div class="oe_structure">
<br/>
<center>
<h3>My Contracts</h3>
</center>
<br/>
<table class="table-striped table"
style="margin-right: 180px; margin-left: 5px;">
<thead style="font-size: 23px;">
<tr>
<h6>
<b>
<th>Contract Name</th>
<th>Customer Name</th>
<th>Start Date</th>
<th>End Date</th>
<th>Date of Next Invoice</th>
<th>Stage</th>
<th>Print</th>
</b>
</h6>
</tr>
</thead>
<tbody>
<t t-foreach="records" t-as="order">
<tr>
<td>
<a t-attf-href='/contracts/{{order.id}}/'
t-esc="order.name"/>
</td>
<td>
<span t-esc="order.partner_id.name"/>
</td>
<td>
<span t-esc="order.date_start"/>
</td>
<td>
<span t-esc="order.date_end"/>
</td>
<td>
<span t-esc="order.next_invoice_date"/>
</td>
<td>
<span t-esc="order.state"/>
</td>
<td>
<a t-attf-class='btn btn-success'
t-attf-href='/report/pdf/{{order.id}}'>
Report
</a>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</t>
</template>
<!-- Template for Subscription contract details -->
<template id="contract_details" name="Subscription contract details">
<t t-call="website.layout">
<div class="container">
<t t-call="web.external_layout">
<div class="page">
<h2>
<t t-esc='records.name'/>
</h2>
</div>
<table class="table table-striped">
<tr>
<th>Customer:</th>
<td>
<t t-if="records.partner_id.name">
<t t-esc="records.partner_id.name"/>
</t>
</td>
<th>Reference:</th>
<td>
<t t-if="records.reference">
<t t-esc="records.reference"/>
</t>
</td>
</tr>
<tr>
<th>Recurring Period:</th>
<td>
<t t-if="records.recurring_period">
<t t-esc="records.recurring_period"/>
<t t-esc="records.recurring_period_interval"/>
</t>
</td>
<th>Company:</th>
<td>
<t t-if="records.company_id">
<t t-esc="records.company_id.name"/>
</t>
</td>
</tr>
<tr>
<th>Start Date:</th>
<td>
<t t-if="records.date_start">
<t t-esc="records.date_start"/>
</t>
</td>
<th>End Date:</th>
<td>
<t t-if="records.date_end">
<t t-esc="records.date_end"/>
</t>
</td>
</tr>
<tr>
<th>Stage:</th>
<td>
<t t-if="records.state">
<t t-esc="records.state"/>
</t>
</td>
<th>Date of Next Invoice:</th>
<td>
<t t-if="records.next_invoice_date">
<t t-esc="records.next_invoice_date"/>
</t>
</td>
</tr>
</table>
<h2>Contract Lines</h2>
<table class="table table-bordered">
<thead>
<tr>
<h2>
<th scope="col">Product</th>
</h2>
<h2>
<th scope="col">Description</th>
</h2>
<h2>
<th scope="col">Order Qty</th>
</h2>
<h2>
<th scope="col">Unit Price</th>
</h2>
<h2>
<th scope="col">Subtotal</th>
</h2>
</tr>
</thead>
<tbody>
<t t-foreach="records.contract_line_ids"
t-as='res'>
<tr>
<td>
<t t-esc="res.product_id.name"/>
</td>
<td>
<t t-esc="res.description"/>
</td>
<td>
<t t-esc="res.qty_ordered"/>
<t t-esc='res.product_uom_id.name'/>
</td>
<td>
<t t-esc="res.price_unit"
t-options="{'widget': 'monetary', 'display_currency': res.currency_id}"/>
</td>
<td>
<t t-esc="res.sub_total"
t-options="{'widget': 'monetary', 'display_currency': res.currency_id}"/>
</td>
</tr>
</t>
</tbody>
</table>
</t>
</div>
</t>
</template>
</odoo>

169
sales_contract_and_recurring_invoices/views/subscription_contracts_views.xml

@ -0,0 +1,169 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- Action subscription contracts-->
<record id="subscription_contracts_action" model="ir.actions.act_window">
<field name="name">Contracts</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">subscription.contracts</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new record!
</p>
</field>
</record>
<!-- Contracts menu-->
<menuitem id="subscription_contract_menu_action"
name="Contracts"
parent="sale.menu_sale_config"
action="subscription_contracts_action"/>
<!-- Subscription contract form view-->
<record id="subscription_contracts_view_form" model="ir.ui.view">
<field name="name">subscription.contracts.view.form</field>
<field name="model">subscription.contracts</field>
<field name="arch" type="xml">
<form>
<header>
<field name="state" widget='statusbar'
statusbar_visible='New,Ongoing,Expire Soon,Expired'/>
<button name="action_to_confirm" class="oe_highlight"
states="New" string="Confirm" type="object"
help="Confirm your Subscription Contracts"/>
<button name="action_generate_invoice"
class="oe_highlight"
states="Ongoing,Expire Soon,"
string="Generate Invoice"
type="object"
help="Generate Invoices for your Contracts"/>
<button name="action_lock" class="oe_highlight"
string="Lock" type="object"
help="Lock your Subscription Contracts"
attrs="{'invisible':['|',('lock', '=', True),('state','!=','Ongoing')]}"
/>
<button name="action_to_unlock" class="oe_highlight"
string="Unlock" type="object"
help="Unlock your Subscription Contracts"
attrs="{'invisible':['|',('lock', '=', False),('state','!=','Ongoing')]}"
/>
<button name="action_to_cancel" class="oe_highlight"
string="Cancel" type="object"
help="Cancel; your Subscription Contracts"
states="Ongoing,Expire Soon"
/>
</header>
<sheet>
<div class="oe_button_box" name="button_box" attrs="{'invisible':[('invoices_active','=',False)]}">
<button class="oe_stat_button" type="object"
name="action_get_invoice"
icon="fa-pencil-square-o"
states="Ongoing,Expire Soon,Expired"
>
<field string="Invoices"
name="invoice_count" widget="statinfo"
/>
</button>
</div>
<div class="oe_title">
<h1>
<field name="name" placeholder="Contracts"
attrs="{'readonly': [('lock', '=', True)]}"/>
</h1>
</div>
<group>
<group>
<field name="reference"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="partner_id" options="{'no_create': True}"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="recurring_period"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="recurring_period_interval"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="recurring_invoice"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="next_invoice_date"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="current_reference" invisible="1"/>
<field name="invoices_active" invisible="1"/>
</group>
<group>
<field name="contract_reminder"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="company_id"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="currency_id"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="lock" invisible="1"/>
<field name="date_start"
attrs="{'readonly': [('lock', '=', True)]}"/>
<field name="date_end"
attrs="{'readonly': [('lock', '=', True)]}"/>
</group>
</group>
<notebook>
<page string="Contract Lines">
<field name="contract_line_ids"
attrs="{'readonly': [('lock', '=', True)]}"/>
<h2 class="oe_subtotal_footer oe_right">
<group>
<field name="amount_total"/>
</group>
</h2>
</page>
<page string="Sale Order Lines">
<field name="sale_order_line_ids"
attrs="{'readonly': [('lock', '=', True)]}"/>
</page>
<page string="Terms and Conditions">
<field name="note"
placeholder="Terms and Conditions"
attrs="{'readonly': [('lock', '=', True)]}"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<!-- Subscription contract tree view-->
<record id="subscription_contracts_view_tree" model="ir.ui.view">
<field name="name">subscription.contracts.view.tree</field>
<field name="model">subscription.contracts</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="partner_id"/>
<field name="next_invoice_date"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="state" widget="badge"
decoration-success="state == 'Ongoing'"
decoration-warning="state =='Expire Soon'"
decoration-info="state =='New'"
decoration-danger="state in('Cancelled','Expired')"/>
<field name="amount_total"/>
</tree>
</field>
</record>
<!-- Contract line tree view-->
<record id="subscription_contracts_line_view_tree" model="ir.ui.view">
<field name="name">subscription.contracts.line.view.tree</field>
<field name="model">subscription.contracts.line</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="product_id"/>
<field name="description"/>
<field name="qty_ordered"/>
<field name="product_uom_id"/>
<field name="price_unit"/>
<field name="tax_ids"/>
<field name="discount"/>
<field name="sub_total"/>
</tree>
</field>
</record>
</odoo>
Loading…
Cancel
Save