Browse Source

Feb 23 : [UPDT] Updated 'subscription_package'

pull/243/head
AjmalCybro 2 years ago
parent
commit
284ff6ac49
  1. 3
      subscription_package/README.md
  2. 1
      subscription_package/__manifest__.py
  3. 2
      subscription_package/data/cron.xml
  4. 2
      subscription_package/data/mail_template.xml
  5. 6
      subscription_package/doc/RELEASE_NOTES.md
  6. 1
      subscription_package/models/__init__.py
  7. 2
      subscription_package/models/recurrence_period.py
  8. 8
      subscription_package/models/res_partner.py
  9. 83
      subscription_package/models/sale_order.py
  10. 75
      subscription_package/models/subscription_package.py
  11. 5
      subscription_package/models/subscription_plan.py
  12. 8
      subscription_package/models/subscription_products.py
  13. 18
      subscription_package/models/subscription_renew.py
  14. 14
      subscription_package/static/description/index.html
  15. 6
      subscription_package/views/res_partner.xml
  16. 18
      subscription_package/views/sale_order_inherit.xml
  17. 15
      subscription_package/views/subscription_package.xml
  18. 1
      subscription_package/views/subscription_plan.xml

3
subscription_package/README.md

@ -19,8 +19,7 @@ Contacts
Credits Credits
-------- --------
* Developer: Amal Prasad @ Cybrosys, * Developer: Amal Prasad @ Cybrosys,
Alakananda @ Cybrosys Archana V @ Cybrosys
V16 Archana V @ Cybrosys
Bug Tracker Bug Tracker
----------- -----------

1
subscription_package/__manifest__.py

@ -48,6 +48,7 @@
'views/mail_activity_views.xml', 'views/mail_activity_views.xml',
'views/res_partner.xml', 'views/res_partner.xml',
'views/recurrence_views.xml', 'views/recurrence_views.xml',
'views/sale_order_inherit.xml',
'report/subscription_report_view.xml', 'report/subscription_report_view.xml',
], ],
'images': ['static/description/banner.png'], 'images': ['static/description/banner.png'],

2
subscription_package/data/cron.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<!-- Cron Jobs --> <!-- Cron Job: To check close date -->
<record id="close_limit_cron" model="ir.cron"> <record id="close_limit_cron" model="ir.cron">
<field name="name">Check Close Limit</field> <field name="name">Check Close Limit</field>
<field name="model_id" ref="model_subscription_package"/> <field name="model_id" ref="model_subscription_package"/>

2
subscription_package/data/mail_template.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<!-- Email Templates --> <!-- Email Template: Email for renew subscription -->
<record id="mail_template_subscription_renew" model="mail.template"> <record id="mail_template_subscription_renew" model="mail.template">
<field name="name">Subscription: Email Renew Alert</field> <field name="name">Subscription: Email Renew Alert</field>
<field name="model_id" ref="subscription_package.model_subscription_package"/> <field name="model_id" ref="subscription_package.model_subscription_package"/>

6
subscription_package/doc/RELEASE_NOTES.md

@ -1,6 +0,0 @@
## Module <subscription_packages>
#### 01.10.2022
#### Version 16.0.1.0.0
#### ADD
- Initial commit for subscription_packages odoo

1
subscription_package/models/__init__.py

@ -28,3 +28,4 @@ from . import subscription_close
from . import subscription_renew from . import subscription_renew
from . import res_partner from . import res_partner
from.import recurrence_period from.import recurrence_period
from . import sale_order

2
subscription_package/models/recurrence_period.py

@ -24,6 +24,7 @@ from odoo import models, fields
class RecurrencePeriod(models.Model): class RecurrencePeriod(models.Model):
"""This class is used to create new model recurrence period"""
_name = "recurrence.period" _name = "recurrence.period"
_description = "Recurrence Period " _description = "Recurrence Period "
@ -36,6 +37,7 @@ class RecurrencePeriod(models.Model):
class SubPackages(models.Model): class SubPackages(models.Model):
""" This function is used to inherit subscription packages"""
_inherit = 'subscription.package' _inherit = 'subscription.package'
recurrence_period_id = fields.Many2one("recurrence.period" , string= "Recurrence Period") recurrence_period_id = fields.Many2one("recurrence.period" , string= "Recurrence Period")

8
subscription_package/models/res_partner.py

@ -24,11 +24,11 @@ from odoo import fields, models
class Partner(models.Model): class Partner(models.Model):
"""Inherited res partner model"""
_inherit = 'res.partner' _inherit = 'res.partner'
active_subscription = fields.Boolean(string="Active Subscription", active_subscription = fields.Boolean(string="Active Subscription",
default=False) default=False)
subscription_product_line_ids = fields.One2many('subscription.package.product.line', subscription_product_line_ids = fields.One2many(
'res_partner_id', 'subscription.package.product.line', 'res_partner_id',
ondelete='restrict', ondelete='restrict', string='Products Line')
string='Products Line')

83
subscription_package/models/sale_order.py

@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2022-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 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 fields, models, api
class SaleOrder(models.Model):
""" This class is used to inherit sale order"""
_inherit = 'sale.order'
subscription_count = fields.Integer(string='Subscriptions',
compute='_compute_subscription_count')
@api.depends('subscription_count')
def _compute_subscription_count(self):
subscription_count = self.env['subscription.package'].search_count(
[('sale_order', '=', self.id)])
if subscription_count > 0:
self.subscription_count = subscription_count
else:
self.subscription_count = 0
def button_subscription(self):
return {
'name': 'Subscription',
'sale_order': False,
'domain': [('sale_order', '=', self.id)],
'view_type': 'form',
'res_model': 'subscription.package',
'view_mode': 'tree,form',
'type': 'ir.actions.act_window',
'context': {
"create": False
}
}
def _action_confirm(self):
if self.subscription_count != 1:
if self.order_line:
for line in self.order_line:
if line.product_id.is_subscription:
this_products_line = []
rec_list = [0, 0, {'product_id': line.product_id.id,
'product_qty': line.product_uom_qty,
'unit_price': line.price_unit}]
this_products_line.append(rec_list)
self.env['subscription.package'].create(
{
'sale_order': self.id,
'reference_code': self.env['ir.sequence'].next_by_code('sequence.reference.code'),
'start_date': fields.Date.today(),
'stage_id': self.env.ref('subscription_package.draft_stage').id,
'partner_id': self.partner_id.id,
'plan_id': line.product_id.subscription_plan_id.id,
'product_line_ids': this_products_line
})
return super()._action_confirm()
class SubscriptionInherit(models.Model):
""" This class is used to inherit subscription packages"""
_inherit = 'subscription.package'
sale_order_count = fields.Integer()

75
subscription_package/models/subscription_package.py

@ -20,13 +20,14 @@
# #
############################################################################# #############################################################################
from odoo import _, api, models, fields, SUPERUSER_ID
import datetime import datetime
from odoo.exceptions import UserError
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo import _, api, models, fields, SUPERUSER_ID
from odoo.exceptions import UserError
class SubscriptionPackageProductLine(models.Model): class SubscriptionPackageProductLine(models.Model):
"""Subscription Package Product Line Model"""
_name = 'subscription.package.product.line' _name = 'subscription.package.product.line'
_description = 'Subscription Product Lines' _description = 'Subscription Product Lines'
@ -69,13 +70,12 @@ class SubscriptionPackageProductLine(models.Model):
class SubscriptionPackage(models.Model): class SubscriptionPackage(models.Model):
"""Subscription Package Model"""
_name = 'subscription.package' _name = 'subscription.package'
_description = 'Subscription Package' _description = 'Subscription Package'
_rec_name = 'name' _rec_name = 'name'
_inherit = ['mail.thread', 'mail.activity.mixin'] _inherit = ['mail.thread', 'mail.activity.mixin']
@api.model @api.model
def _read_group_stage_ids(self, categories, domain, order): def _read_group_stage_ids(self, categories, domain, order):
""" Read all the stages and display it in the kanban view, """ Read all the stages and display it in the kanban view,
@ -111,7 +111,7 @@ class SubscriptionPackage(models.Model):
default=lambda self: self.env.company, default=lambda self: self.env.company,
required=True) required=True)
user_id = fields.Many2one('res.users', string='Sales Person', user_id = fields.Many2one('res.users', string='Sales Person',
default=lambda self: self.env.uid) default=lambda self: self.env.user)
sale_order = fields.Many2one('sale.order', string="Sale Order") sale_order = fields.Many2one('sale.order', string="Sale Order")
to_renew = fields.Boolean(string='To Renew', default=False) to_renew = fields.Boolean(string='To Renew', default=False)
tag_ids = fields.Many2many('account.account.tag', string='Tags') tag_ids = fields.Many2many('account.account.tag', string='Tags')
@ -129,8 +129,7 @@ class SubscriptionPackage(models.Model):
'subscription_id', ondelete='restrict', 'subscription_id', ondelete='restrict',
string='Products Line') string='Products Line')
currency_id = fields.Many2one('res.currency', string='Currency', currency_id = fields.Many2one('res.currency', string='Currency',
readonly=True, readonly=True, default=lambda
default=lambda
self: self.env.company.currency_id) self: self.env.company.currency_id)
current_stage = fields.Char(string='Current Stage', default='Draft', current_stage = fields.Char(string='Current Stage', default='Draft',
store=True, compute='_compute_current_stage') store=True, compute='_compute_current_stage')
@ -146,9 +145,15 @@ class SubscriptionPackage(models.Model):
compute='_compute_total_recurring_price', compute='_compute_total_recurring_price',
store=True) store=True)
""" Calculate Invoice count based on subscription package """
@api.depends('invoice_count') @api.depends('invoice_count')
def _compute_invoice_count(self): def _compute_invoice_count(self):
""" Calculate Invoice count based on subscription package """ sale_id = self.env['sale.order'].search(
[('id', '=', self.sale_order.id)])
invoices = sale_id.order_line.invoice_lines.move_id.filtered(
lambda r: r.move_type in ('out_invoice', 'out_refund'))
invoices.write({'subscription_id': self.id})
invoice_count = self.env['account.move'].search_count( invoice_count = self.env['account.move'].search_count(
[('subscription_id', '=', self.id)]) [('subscription_id', '=', self.id)])
if invoice_count > 0: if invoice_count > 0:
@ -160,7 +165,7 @@ class SubscriptionPackage(models.Model):
def _compute_sale_count(self): def _compute_sale_count(self):
""" Calculate sale order count based on subscription package """ """ Calculate sale order count based on subscription package """
self.so_count = self.env['sale.order'].search_count( self.so_count = self.env['sale.order'].search_count(
[('subscription_id', '=', self.id)]) [('id', '=', self.sale_order.id)])
@api.depends('stage_id') @api.depends('stage_id')
def _compute_current_stage(self): def _compute_current_stage(self):
@ -196,7 +201,7 @@ class SubscriptionPackage(models.Model):
""" It displays sale order based on subscription package """ """ It displays sale order based on subscription package """
return { return {
'name': 'Products', 'name': 'Products',
'domain': [('subscription_id', '=', self.id)], 'domain': [('id', '=', self.sale_order.id)],
'view_type': 'form', 'view_type': 'form',
'res_model': 'sale.order', 'res_model': 'sale.order',
'view_mode': 'tree,form', 'view_mode': 'tree,form',
@ -224,8 +229,10 @@ class SubscriptionPackage(models.Model):
rec_list = [0, 0, {'product_id': rec.product_id.id, rec_list = [0, 0, {'product_id': rec.product_id.id,
'quantity': rec.product_qty}] 'quantity': rec.product_qty}]
this_products_line.append(rec_list) this_products_line.append(rec_list)
invoices = self.env['account.move'].search([('subscription_id', '=', self.id), ('state', '=', 'draft')]) invoices = self.env['account.move'].search(
orders = self.env['sale.order'].search([('subscription_id', '=', self.id), ('invoice_status', '=', 'no')]) [('subscription_id', '=', self.id), ('state', '=', 'draft')])
orders = self.env['sale.order'].search(
[('subscription_id', '=', self.id), ('invoice_status', '=', 'no')])
if invoices: if invoices:
for invoice in invoices: for invoice in invoices:
invoice.action_post() invoice.action_post()
@ -257,39 +264,38 @@ class SubscriptionPackage(models.Model):
def button_start_date(self): def button_start_date(self):
"""Button to start subscription package""" """Button to start subscription package"""
print("kkkkkkkkkkkkkkkkkkkkkkkkkkkk")
if not self.start_date: if not self.start_date:
self.start_date = datetime.date.today() self.start_date = datetime.date.today()
for rec in self: for rec in self:
print((rec.env['subscription.package.stage'].search([ if len(rec.env['subscription.package.stage'].search(
('category', '=', 'draft')]).id)) [('category', '=', 'draft')])) > 1:
if len(rec.env['subscription.package.stage'].search([('category', '=', 'draft')])) > 1:
raise UserError( raise UserError(
_('More than one stage is having category "Draft". ' _('More than one stage is having category "Draft". '
'Please change category of stage to "In Progress", ' 'Please change category of stage to "In Progress", '
'only one stage is allowed to have category "Draft"')) 'only one stage is allowed to have category "Draft"'))
else: else:
print( (rec.env['subscription.package.stage'].search([
('category', '=', 'draft')]).id) )
rec.write( rec.write(
{'stage_id': (rec.env['subscription.package.stage'].search([ {'stage_id': (rec.env[
'subscription.package.stage'].search(
[
('category', '=', 'draft')]).id) + 1}) ('category', '=', 'draft')]).id) + 1})
def button_sale_order(self): def button_sale_order(self):
"""Button to create sale order""" """Button to create sale order"""
this_products_line = [] this_products_line = []
for rec in self.product_line_ids: for rec in self.product_line_ids:
rec_list = [0, 0, {'product_id': rec.product_id.id, rec_list = [0, 0, {'product_id': rec.product_id.id,
'product_uom_qty': rec.product_qty}] 'product_uom_qty': rec.product_qty}]
this_products_line.append(rec_list) this_products_line.append(rec_list)
# for order in self.sale_order: orders = self.env['sale.order'].search(
orders = self.env['sale.order'].search([('subscription_id', '=', self.id), ('invoice_status', '=', 'no')]) [('id', '=', self.sale_order_count),
('invoice_status', '=', 'no')])
if orders: if orders:
for order in orders: for order in orders:
order.action_confirm() order.action_confirm()
so_id = self.env['sale.order'].create({ so_id = self.env['sale.order'].create({
'id': self.sale_order_count,
'partner_id': self.partner_id.id, 'partner_id': self.partner_id.id,
'partner_invoice_id': self.partner_id.id, 'partner_invoice_id': self.partner_id.id,
'partner_shipping_id': self.partner_id.id, 'partner_shipping_id': self.partner_id.id,
@ -315,17 +321,18 @@ class SubscriptionPackage(models.Model):
if vals.get('reference_code', 'New') is False: if vals.get('reference_code', 'New') is False:
vals['reference_code'] = self.env['ir.sequence'].next_by_code( vals['reference_code'] = self.env['ir.sequence'].next_by_code(
'sequence.reference.code') or 'New' 'sequence.reference.code') or 'New'
create_id = super(SubscriptionPackage, self).create(vals) create_id = super().create(vals)
return create_id return create_id
@api.depends('reference_code') @api.depends('reference_code')
def _compute_name(self): def _compute_name(self):
"""It displays record name as combination of short code, reference """It displays record name as combination of short code, reference
code and partner name """ code and partner name """
for rec in self:
plan_id = self.env['subscription.package.plan'].search( plan_id = self.env['subscription.package.plan'].search(
[('id', '=', self.plan_id.id)]) [('id', '=', rec.plan_id.id)])
if plan_id.short_code and self.reference_code: if plan_id.short_code and rec.reference_code:
self.name = plan_id.short_code + '/' + self.reference_code + '-' + self.partner_id.name rec.name = plan_id.short_code + '/' + rec.reference_code + '-' + rec.partner_id.name
def set_close(self): def set_close(self):
""" Button to close subscription package """ """ Button to close subscription package """
@ -344,26 +351,28 @@ class SubscriptionPackage(models.Model):
pending_subscription = False pending_subscription = False
close_subscription = False close_subscription = False
for pending_subscription in pending_subscriptions: for pending_subscription in pending_subscriptions:
if pending_subscription.start_date:
pending_subscription.close_date = pending_subscription.start_date + relativedelta( pending_subscription.close_date = pending_subscription.start_date + relativedelta(
days=pending_subscription.plan_id.days_to_end) days=pending_subscription.plan_id.days_to_end)
difference = ( difference = (pending_subscription.close_date -
pending_subscription.close_date - pending_subscription.start_date).days / 10 pending_subscription.start_date).days / 10
renew_date = pending_subscription.close_date - relativedelta( renew_date = pending_subscription.close_date - relativedelta(days=difference)
days=difference)
if today_date == renew_date: if today_date == renew_date:
pending_subscription.to_renew = True
self.env.ref( self.env.ref(
'subscription_package.mail_template_subscription_renew').send_mail( 'subscription_package.mail_template_subscription_renew').send_mail(
pending_subscription.id, force_send=True) pending_subscription.id, force_send=True)
pending_subscription.write({'to_renew': True})
if pending_subscription.plan_id.invoice_mode == 'draft_invoice': if pending_subscription.plan_id.invoice_mode == 'draft_invoice':
this_products_line = [] this_products_line = []
for rec in pending_subscription.product_line_ids: for rec in pending_subscription.product_line_ids:
rec_list = [0, 0, {'product_id': rec.product_id.id, rec_list = [0, 0, {'product_id': rec.product_id.id,
'quantity': rec.product_qty}] 'quantity': rec.product_qty}]
this_products_line.append(rec_list) this_products_line.append(rec_list)
self.env['account.move'].create( b = self.env['account.move'].create(
{ {
'move_type': 'out_invoice', 'move_type': 'out_invoice',
'subscription_id': pending_subscription.id,
'date': fields.Date.today(), 'date': fields.Date.today(),
'invoice_date': fields.Date.today(), 'invoice_date': fields.Date.today(),
'state': 'draft', 'state': 'draft',

5
subscription_package/models/subscription_plan.py

@ -103,11 +103,14 @@ class SubscriptionPlan(models.Model):
""" It displays products based on subscription plan """ """ It displays products based on subscription plan """
return { return {
'name': 'Products', 'name': 'Products',
'res_model': 'product.product',
'domain': [('subscription_plan_id', '=', self.id)], 'domain': [('subscription_plan_id', '=', self.id)],
'view_type': 'form', 'view_type': 'form',
'res_model': 'product.product',
'view_mode': 'tree,form', 'view_mode': 'tree,form',
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'context': {
'default_is_subscription': True,
},
} }
def button_sub_count(self): def button_sub_count(self):

8
subscription_package/models/subscription_products.py

@ -23,7 +23,8 @@
from odoo import api, models, fields from odoo import api, models, fields
class SubscriptionInvoice(models.Model): class AccountMove(models.Model):
"""Inherited sale order model"""
_inherit = "account.move" _inherit = "account.move"
is_subscription = fields.Boolean(string='Is Subscription', default=False) is_subscription = fields.Boolean(string='Is Subscription', default=False)
@ -40,10 +41,11 @@ class SubscriptionInvoice(models.Model):
new_vals_list = [{'is_subscription': True, new_vals_list = [{'is_subscription': True,
'subscription_id': so_id.subscription_id}] 'subscription_id': so_id.subscription_id}]
vals_list[0].update(new_vals_list[0]) vals_list[0].update(new_vals_list[0])
return super(SubscriptionInvoice, self).create(vals_list) return super().create(vals_list)
class SubscriptionProduct(models.Model): class Product(models.Model):
"""Inherited product template model"""
_inherit = "product.template" _inherit = "product.template"
is_subscription = fields.Boolean(string='Is Subscription', default=False) is_subscription = fields.Boolean(string='Is Subscription', default=False)

18
subscription_package/models/subscription_renew.py

@ -20,11 +20,12 @@
# #
############################################################################# #############################################################################
from odoo import api, models, fields
import datetime import datetime
from odoo import api, models, fields
class SubscriptionSaleOrder(models.Model): class SaleOrder(models.Model):
"""Inherited sale order model"""
_inherit = "sale.order" _inherit = "sale.order"
is_subscription = fields.Boolean(string='Is Subscription', default=False) is_subscription = fields.Boolean(string='Is Subscription', default=False)
@ -36,15 +37,12 @@ class SubscriptionSaleOrder(models.Model):
@api.model @api.model
def create(self, vals): def create(self, vals):
""" It displays subscription in sale order """ """ It displays subscription in sale order """
if vals.get('is_subscription') is True: if vals.get('is_subscription'):
new_vals = [{ vals.update({
'is_subscription': True, 'is_subscription': True,
'subscription_id': vals.get('subscription_id'), 'subscription_id': vals.get('subscription_id'),
}] })
vals.update(new_vals[0]) return super().create(vals)
return super(SubscriptionSaleOrder, self).create(vals)
else:
return super(SubscriptionSaleOrder, self).create(vals)
@api.depends('subscription_id') @api.depends('subscription_id')
def _compute_reference_code(self): def _compute_reference_code(self):
@ -56,7 +54,7 @@ class SubscriptionSaleOrder(models.Model):
""" It Changed the stage, to renew, start date for subscription """ It Changed the stage, to renew, start date for subscription
package based on sale order confirm """ package based on sale order confirm """
res = super(SubscriptionSaleOrder, self).action_confirm() res = super().action_confirm()
sale_order = self.subscription_id.sale_order sale_order = self.subscription_id.sale_order
so_state = self.search([('id', '=', sale_order.id)]).state so_state = self.search([('id', '=', sale_order.id)]).state
if so_state in ['sale', 'done']: if so_state in ['sale', 'done']:

14
subscription_package/static/description/index.html

@ -23,10 +23,7 @@
<!-- APP HERO --> <!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> <h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Subscription Package</h1> Subscription Package</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Print Subscription
Package
</p>
<img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto"/> <img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto"/>
<!-- END OF APP HERO --> <!-- END OF APP HERO -->
@ -123,12 +120,12 @@
<img src="assets/misc/check-box.png" class="mr-2"/> <img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Enterprise and Community compatible.</span> <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Enterprise and Community compatible.</span>
</div> </div>
</div>
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/> <img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Available in Odoo 15.0 Community and Enterprise.</span> <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Available in Odoo 16.0 Community and Enterprise.</span>
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
@ -138,7 +135,6 @@
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px"> <div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/> <img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Subscription Renewable</span> <span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Subscription Renewable</span>
@ -282,7 +278,7 @@
<img src="assets/screenshots/SUB9.png" class="img-thumbnail"> <img src="assets/screenshots/SUB9.png" class="img-thumbnail">
</div> </div>
<div style="display: block; margin: 30px auto;"> <div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> CSubscription Report <h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Subscription Report
</h3> </h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> <p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
<ul> <ul>
@ -326,7 +322,7 @@
<img src="assets/screenshots/SUB14.png" class="img-thumbnail"> <img src="assets/screenshots/SUB14.png" class="img-thumbnail">
</div> </div>
</div> </div>
</div> </div>
<!-- END OF SCREENSHOTS SECTION --> <!-- END OF SCREENSHOTS SECTION -->

6
subscription_package/views/res_partner.xml

@ -8,9 +8,9 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<page name="sales_purchases" position="after"> <page name="sales_purchases" position="after">
<page string="Subscription"> <page string="Subscription">
<seperator string='Subscriptions'/>
<field name="subscription_product_line_ids" > <field name="subscription_product_line_ids" nolabel="1">
<tree editable="bottom"> <tree editable="bottom" create="false" delete="false" clickable="0">
<field name="product_id"/> <field name="product_id"/>
<field name="uom_catg_id"/> <field name="uom_catg_id"/>
<field name="product_uom_id"/> <field name="product_uom_id"/>

18
subscription_package/views/sale_order_inherit.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="subscription_smart_button" model="ir.ui.view">
<field name="name">subscriptions.view.buttons</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button class="oe_stat_button" type="object" name="button_subscription"
icon="fa-usd" attrs="{'invisible': [('subscription_count','=',0)]}">
<field name="subscription_count" widget="statinfo"/>
</button>
</div>
</field>
</record>
</data>
</odoo>

15
subscription_package/views/subscription_package.xml

@ -72,22 +72,23 @@
<field name="current_stage" invisible="1"/> <field name="current_stage" invisible="1"/>
<field name="is_closed" invisible="1"/> <field name="is_closed" invisible="1"/>
<button name="button_start_date" string="START" <button name="button_start_date" string="START"
type="object" class="btn-primary" attrs="{'invisible': [('stage_category','!=', 'draft')]}"/> type="object" class="btn-primary oe_read_only" attrs="{'invisible': [('stage_category','!=', 'draft')]}"/>
<button name="button_sale_order" string="Create Sale Order" <button name="button_sale_order" string="Create Sale Order"
type="object" class="btn-primary" attrs="{'invisible': [('stage_category','!=', 'progress')]}"/> type="object" class="btn-primary oe_read_only" attrs="{'invisible': [('so_count','>',0)]}"/>
<button name="button_payment" string="Invoice" <button name="button_payment" string="Invoice"
type="object" class="btn-primary" type="object" class="btn-primary oe_read_only"
attrs="{'invisible': [('stage_category','!=', 'progress')]}"/> attrs="{'invisible': [('so_count', '=', 0)]}"
invisible="1"/>
<button name="button_close" string="Close Subscription" <button name="button_close" string="Close Subscription"
type="object" class="btn-primary" type="object" class="btn-primary oe_read_only"
attrs="{'invisible': [('stage_category', '!=', 'progress')]}"/> attrs="{'invisible': [('stage_category', 'in', ['draft', 'closed'])]}"/>
<button name="action_renew" string="Renew" type="object" class="btn-primary oe_read_only" attrs="{'invisible': [('so_count', '=', 0)]}"/> <button name="action_renew" string="Renew" type="object" class="btn-primary oe_read_only" attrs="{'invisible': [('so_count', '=', 0)]}"/>
<field name="stage_id" widget="statusbar" options="{'clickable' :0}"/> <field name="stage_id" widget="statusbar" options="{'clickable' :0}"/>
</header> </header>
<sheet> <sheet>
<div class="oe_button_box" name="button_box"> <div class="oe_button_box" name="button_box">
<button name="button_sale_count" type="object" class="oe_stat_button" <button name="button_sale_count" type="object" class="oe_stat_button"
icon="fa-credit-card" attrs="{'invisible': [('sale_order', '=', False)]}"> icon="fa-credit-card" attrs="{'invisible': [('so_count', '=', 0)]}">
<div class="o_field_widget o_stat_info"> <div class="o_field_widget o_stat_info">
<span class="o_stat_value"> <span class="o_stat_value">
<field name="so_count"/> <field name="so_count"/>

1
subscription_package/views/subscription_plan.xml

@ -105,5 +105,4 @@
action="subscription_package.action_conf_subscription_plan" action="subscription_package.action_conf_subscription_plan"
sequence="23" groups="group_subscription_manager"/> sequence="23" groups="group_subscription_manager"/>
</odoo> </odoo>

Loading…
Cancel
Save