Browse Source

[ADD] Initial Commit 'support_package'

pull/168/head
Ajmal Cybro 4 years ago
parent
commit
2ff0ff7461
  1. 41
      support_package/README.rst
  2. 2
      support_package/__init__.py
  3. 48
      support_package/__manifest__.py
  4. 6
      support_package/doc/RELEASE_NOTES.md
  5. 3
      support_package/models/__init__.py
  6. 45
      support_package/models/package_template.py
  7. 228
      support_package/models/support_client.py
  8. 89
      support_package/models/support_package.py
  9. 1
      support_package/report/__init__.py
  10. 14
      support_package/report/support_report.py
  11. 39
      support_package/report/support_report_views.xml
  12. 2
      support_package/security/ir.model.access.csv
  13. BIN
      support_package/static/description/assets/arrows-transparent.png
  14. BIN
      support_package/static/description/assets/icons/ecom.png
  15. BIN
      support_package/static/description/assets/icons/education.png
  16. BIN
      support_package/static/description/assets/icons/hotel.png
  17. BIN
      support_package/static/description/assets/icons/manufacturing.png
  18. BIN
      support_package/static/description/assets/icons/pos.png
  19. BIN
      support_package/static/description/assets/icons/restaurant.png
  20. BIN
      support_package/static/description/assets/icons/service.png
  21. BIN
      support_package/static/description/assets/icons/trading.png
  22. BIN
      support_package/static/description/assets/trophy.png
  23. BIN
      support_package/static/description/banner.png
  24. BIN
      support_package/static/description/icon.png
  25. BIN
      support_package/static/description/images/support_1.png
  26. BIN
      support_package/static/description/images/support_2.png
  27. BIN
      support_package/static/description/images/support_3.png
  28. BIN
      support_package/static/description/images/support_4.png
  29. BIN
      support_package/static/description/images/support_5.png
  30. BIN
      support_package/static/description/images/support_6.png
  31. 708
      support_package/static/description/index .html
  32. 78
      support_package/views/package_template.xml
  33. 152
      support_package/views/support_client.xml
  34. 206
      support_package/views/support_package.xml

41
support_package/README.rst

@ -0,0 +1,41 @@
Support Package Management
==========================
* Support package management module for Odoo 14 community editions
Installation
============
- www.odoo.com/documentation/14.0/setup/install.html
- Install our custom addon
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.odoo.com/documentation/user/13.0/legal/licenses/licenses.html)
Company
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:
(v14) Amal @ Cybrosys
Contacts
--------
* Mail Contact : odoo@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
==========
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>`__

2
support_package/__init__.py

@ -0,0 +1,2 @@
from . import models
from . import report

48
support_package/__manifest__.py

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2021-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/>.
#
#############################################################################
{
'name': 'Support Package Management',
'summary': 'Support Service and Package Management Module',
'description': """Support Module is an easy-to-use Support Management app.
It enables users to create, manage, optimize, and monitor
the entire service request from a centralized application.
""",
'author': "Cybrosys Techno Solutions",
'website': "https://www.cybrosys.com",
'company': "Cybrosys Techno Solutions",
'maintainer': "Cybrosys Techno Solutions",
'category': 'Project',
'Version': '14.0.1.0.0',
'depends': ['base', 'project', 'sale_management', 'hr_timesheet'],
'data': [
'security/ir.model.access.csv',
'views/support_package.xml',
'views/support_client.xml',
'views/package_template.xml',
'report/support_report_views.xml',
],
'license': 'LGPL-3',
'images': ['static/description/banner.png'],
'installable': True,
'auto_install': False,
'application': True,
}

6
support_package/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <customize_settings>
#### 17.05.2021
#### Version 14.0.1.0.0
#### ADD
Initial Commit

3
support_package/models/__init__.py

@ -0,0 +1,3 @@
from . import support_package
from . import support_client
from . import package_template

45
support_package/models/package_template.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, models, fields
class ProjectTemplate(models.Model):
_name = 'support.package.template'
_description = 'Support Package Template'
_rec_name = 'name'
name = fields.Char(string="Name of Package")
count = fields.Char(string='Number of Tickets', readonly=False)
duration = fields.Float(
string='Ticket Duration', readonly=False,
help="Maximum allowed duration for a single ticket in hours")
validity_number = fields.Char(string='Support Package Validity',
readonly=False)
validity_rule = fields.Selection([
('days', 'Day(s)'),
('months', 'Month(s)'),
('years', 'Year(s)')], readonly=False, default='months')
package_validity = fields.Integer(string='Package Validity', store=True,
readonly=False,
compute='_compute_package_validity')
@api.depends('validity_number', 'validity_rule')
def _compute_package_validity(self):
"""Find package validity in days"""
for rec in self:
if rec.validity_rule == 'days':
rec.package_validity = int(rec.validity_number)
elif rec.validity_rule == 'months':
rec.package_validity = int(rec.validity_number) * 30
elif rec.validity_rule == 'years':
rec.package_validity = int(rec.validity_number) * 365
def button_create_package(self):
"""Button to convert template to project"""
return {
'type': 'ir.actions.act_window',
'name': 'Project Support Package',
'view_mode': 'form',
'res_model': 'project.project'
}

228
support_package/models/support_client.py

@ -0,0 +1,228 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import datetime
import math
from odoo import api, models, fields, _
from odoo.exceptions import ValidationError
class SupportClientTimesheet(models.Model):
_inherit = 'account.analytic.line'
support_count = fields.Integer(string='Ticket Count', store=True,
help="Effective hour of each record",
compute="_compute_support_count")
@api.depends('unit_amount')
def _compute_support_count(self):
"""Find count of support in each record"""
for task in self:
try:
task.support_count = math.ceil(task.unit_amount /
task.project_id.support_duration)
except ZeroDivisionError:
task.support_count = 0
class SupportClient(models.Model):
_inherit = 'project.task'
is_support_package = fields.Boolean(string='Support Package')
support_count = fields.Integer(string='Number of Tickets')
count_used = fields.Integer(string='Used Tickets')
count_remaining = fields.Integer(string='Remaining Tickets')
support_duration = fields.Float(string='Support Duration', default=1.0)
package_validity = fields.Integer(string='Support Package Validity',
default=1)
start_date = fields.Date(string='Start Date')
end_date = fields.Date(string='End Date')
reminder_date = fields.Date(string='Reminder Date')
this_effective_hours = fields.Float(help="Effective hour in this module",
default=0.0, store=True,
compute_sudo=True,
compute="_compute_this_effective_hours")
to_renew = fields.Boolean(string="To Renew", default=False)
@api.model_create_multi
def create(self, vals_list):
"""update input values with values of this module"""
for rec in vals_list:
this_project_id = rec.get('project_id')
project_id = self.env['project.project'].search([
('id', '=', this_project_id)])
if project_id.is_support_package:
new_vals_list = [{
'is_support_package': project_id.is_support_package,
'support_count': project_id.support_count,
'support_duration': project_id.support_duration,
'planned_hours': (float(project_id.support_count) *
float(project_id.support_duration)),
'count_used': 0,
'date_deadline': datetime.date.today() + datetime.timedelta(
days=project_id.package_validity),
'count_remaining': project_id.support_count,
'package_validity': project_id.package_validity,
'start_date': datetime.date.today(),
'end_date': datetime.date.today() + datetime.timedelta(
days=project_id.package_validity),
}]
vals_list[0].update(new_vals_list[0])
return super(SupportClient, self).create(vals_list)
else:
return super(SupportClient, self).create(vals_list)
@api.onchange('company_id')
def _onchange_company_id(self):
"""Function predefines some fields"""
this_project_id = self.env.context.get('default_project_id')
project_id = self.env['project.project']. \
search([('id', '=', this_project_id)])
if project_id.is_support_package:
self.count_used = 0
self.name = project_id.name
self.start_date = datetime.date.today()
self.support_duration = project_id.support_duration
self.package_validity = project_id.package_validity
self.is_support_package = project_id.is_support_package
self.end_date = datetime.date.today() + datetime. \
timedelta(days=project_id.package_validity)
self.date_deadline = datetime.date.today() + datetime. \
timedelta(days=project_id.package_validity)
self.planned_hours = (self.support_count * self.support_duration)
self.support_count = self.count_remaining = project_id.support_count
else:
self.is_support_package = False
@api.onchange('start_date')
def _onchange_start_date(self):
if self.is_support_package:
self.end_date = self.start_date + datetime.timedelta(
days=self.package_validity)
self.date_deadline = self.end_date
@api.onchange('count_remaining')
def _onchange_count_remaining(self):
if self.is_support_package:
days_left = self.end_date - self.start_date
for rec in self:
if rec.count_remaining == 0 or days_left.days <= 0:
self.sale_order_id.order_line.qty_delivered = 1
if not rec.sale_line_id:
rec.to_renew = True
raise ValidationError(
"You cannot add customer from here or because update a"
" timesheet without sale order ID ! \n\n You can go to "
"sales module to create a sale order and the package"
" will be generated automatically.")
if days_left.days < 0:
rec.to_renew = True
raise ValidationError(
"Package Expired !!! \n\nThis package validity is"
" expired, you can create a new sale order to continue"
" with the service.")
if rec.count_remaining < 0:
rec.to_renew = True
raise ValidationError(
"Ticket Limit Exceeded !!! \n\n You can create a new"
" sale order to continue with the service.")
@api.onchange('count_used')
def _onchange_count_used(self):
if self.is_support_package:
days_left = self.end_date - self.start_date
for rec in self:
if rec.count_used > rec.support_count:
raise ValidationError("Supports Limit Exceeded!")
if days_left.days <= (int(0.1 * rec.package_validity)) and \
rec.count_remaining < (int(0.1 * rec.support_count)):
rec.to_renew = True
return {'warning': {
'title': _("Warning"),
'message': _(
"%s is having only %d days and %d ticket(s) left"
" with this package. Kindly inform the customer to "
"renew the package to avail the service without"
" break.\n\nThank You !!!",
self.partner_id.name, days_left.days,
rec.count_remaining),
}}
if days_left.days <= (int(0.1 * rec.package_validity)):
rec.to_renew = True
return {'warning': {
'title': _("Warning"),
'message': _(
"%s is having only %d days left with this package."
" Kindly inform the customer to renew the package"
" to avail the service without break."
"\n\nThank You !!!",
self.partner_id.name, days_left.days),
}}
if rec.count_remaining < (int(0.1 * rec.support_count)):
rec.to_renew = True
return {'warning': {
'title': _("Warning"),
'message': _(
"%s is having only %d ticket(s) left with this"
" package. Kindly inform the customer to renew the"
" package to avail the service without break."
"\n\nThank You !!!",
self.partner_id.name, rec.count_remaining)
}}
def action_renew(self):
"""Button for renewal"""
product = self.sale_line_id
product_id = self.env['product.product'].search(
[('name', '=', product.name)])
so_id = self.env['sale.order'].create({
'partner_id': self.partner_id.id,
'partner_invoice_id': self.partner_id.id,
'partner_shipping_id': self.partner_id.id,
'order_line': [(0, 0, {'name': product_id.name,
'product_id': product_id.id,
'product_uom_qty': 1,
'product_uom': product_id.uom_id.id,
'price_unit': product.price_unit,
'tax_id': product_id.taxes_id
})]})
return {
'name': _('Sales Orders'),
'type': 'ir.actions.act_window',
'res_model': 'sale.order',
'domain': [('id', '=', so_id.id)],
'view_type': 'form',
'view_mode': 'tree,form',
}
@api.depends('timesheet_ids.unit_amount')
def _compute_this_effective_hours(self):
"""find effective hours with respect to support duration"""
for task in self:
sigma_ciel = 0
for rec in task.timesheet_ids.mapped('unit_amount'):
try:
ciel_timesheet_ids = math.ceil(rec / task.support_duration)
except ZeroDivisionError:
ciel_timesheet_ids = 0
sigma_ciel = sigma_ciel + ciel_timesheet_ids
task.this_effective_hours = round(
sigma_ciel * task.support_duration, 2)
@api.depends('effective_hours', 'subtask_effective_hours', 'planned_hours')
def _compute_remaining_hours(self):
for task in self:
if task.is_support_package is False:
task.remaining_hours = task.planned_hours - \
task.effective_hours - \
task.subtask_effective_hours
else:
task.remaining_hours = task.planned_hours - \
task.this_effective_hours - \
task.subtask_effective_hours
temp_count = 0
for rec in task.timesheet_ids:
temp_count += rec.support_count
task.count_used = temp_count
task.count_remaining = task.support_count - task.count_used

89
support_package/models/support_package.py

@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, models, fields
class SupportPackageProduct(models.Model):
_inherit = "product.template"
is_support = fields.Boolean(string='Is Support Package', default=False)
class SupportPackage(models.Model):
_inherit = 'project.project'
is_support_package = fields.Boolean(string='Support Package', default=False)
support_count = fields.Char(string='Number of Tickets')
support_duration = fields.Float(string='Maximum Duration')
support_validity_number = fields.Char(string='Package Validity')
validity_rule = fields.Selection([
('days', 'Day(s)'),
('months', 'Month(s)'),
('years', 'Year(s)')], default='months')
package_validity = fields.Integer(string='Validity',
store=True, readonly=False,
compute='_compute_package_validity')
privacy_visibility_support = fields.Selection([
('followers', 'Invited internal users'),
('employees', 'All internal users')], string='Visibility',
required=True, default='employees')
allowed_internal_user_support_ids = fields.Many2many(
'res.users',
default=lambda self: self.env.user,
string="Allowed Internal Users",
domain=[('share', '=', False)])
@api.model
def create(self, vals):
"""Create service product of the project"""
package = super(SupportPackage, self).create(vals)
if package.is_support_package:
package.privacy_visibility = 'employees'
package.label_tasks = 'Customers'
categ = self.env['product.category'].search(
[('name', '=', 'Services')])
project = {
'name': vals.get('name'),
'sale_ok': True,
'purchase_ok': True,
'is_support': True,
'type': 'service',
'categ_id': int(categ.id),
'service_policy': 'delivered_manual',
}
product_id = self.env['product.template'].create(project)
product_id.service_tracking = 'task_global_project'
product_id.project_id = package.id
return package
@api.onchange('privacy_visibility_support')
def _onchange_privacy_visibility_support(self):
if self.is_support_package:
self.privacy_visibility = self.privacy_visibility_support
@api.onchange('allowed_internal_user_ids_support')
def _onchange_allowed_internal_user_ids_support(self):
if self.is_support_package:
self.allowed_internal_user_ids = self.allowed_internal_user_ids_support
@api.onchange('is_support_package')
def _onchange_is_support_package(self):
if self.is_support_package:
self.label_tasks = 'Customers'
self.allow_billable = True
else:
self.label_tasks = 'Tasks'
@api.depends('support_validity_number', 'validity_rule')
def _compute_package_validity(self):
"""Find package_validity in days"""
for rec in self:
if rec.is_support_package:
if rec.validity_rule == 'days':
rec.package_validity = int(rec.support_validity_number)
elif rec.validity_rule == 'months':
rec.package_validity = int(rec.support_validity_number) * 30
elif rec.validity_rule == 'years':
rec.package_validity = int(
rec.support_validity_number) * 365

1
support_package/report/__init__.py

@ -0,0 +1 @@
from . import support_report

14
support_package/report/support_report.py

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ReportSupportUser(models.Model):
_inherit = "report.project.task.user"
is_support_package = fields.Boolean(string='Support Package', readonly=True)
def _select(self):
return super(ReportSupportUser, self)._select() + """,
t.is_support_package"""

39
support_package/report/support_report_views.xml

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_support_project_user_pivot" model="ir.ui.view">
<field name="name">Report Project Support User Pivot</field>
<field name="model">report.project.task.user</field>
<field name="inherit_id" ref="project.view_task_project_user_pivot"/>
<field name="arch" type="xml">
<pivot string="Tasks Analysis" display_quantity="true" disable_linking="True" sample="1">
<field name="project_id" position="after">
<field name="remaining_hours" type="row" widget="timesheet_uom"/>
</field>
</pivot>
</field>
</record>
</data>
<record id="action_project_support_user_tree" model="ir.actions.act_window">
<field name="name">Reports</field>
<field name="res_model">report.project.task.user</field>
<field name="view_mode">pivot</field>
<field name="search_view_id" ref="project.view_task_project_user_search"/>
<field name="domain">[('is_support_package', '=', True)]</field>
<field name="context">{'group_by_no_leaf':1,'group_by':[]}</field>
</record>
<menuitem id="support_menu_reporting"
name="Reporting"
parent="support_package.support_menu_root"
sequence="15"/>
<menuitem id="support_menu_reporting_submenu"
name="Package Reports"
parent="support_package.support_menu_reporting"
action="support_package.action_project_support_user_tree"
sequence="16"/>
</odoo>

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

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_support_package_template,support.package.template,model_support_package_template,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_support_package_template support.package.template model_support_package_template base.group_user 1 1 1 1

BIN
support_package/static/description/assets/arrows-transparent.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
support_package/static/description/assets/icons/ecom.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
support_package/static/description/assets/icons/education.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
support_package/static/description/assets/icons/hotel.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
support_package/static/description/assets/icons/manufacturing.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
support_package/static/description/assets/icons/pos.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
support_package/static/description/assets/icons/restaurant.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
support_package/static/description/assets/icons/service.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
support_package/static/description/assets/icons/trading.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
support_package/static/description/assets/trophy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 KiB

BIN
support_package/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
support_package/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
support_package/static/description/images/support_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
support_package/static/description/images/support_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
support_package/static/description/images/support_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
support_package/static/description/images/support_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
support_package/static/description/images/support_5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
support_package/static/description/images/support_6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

708
support_package/static/description/index .html

@ -0,0 +1,708 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Support Package</title>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css"
integrity="sha512-P5MgMn1jBN01asBgU0z60Qk4QxiXo86+wlFahKrsQf37c9cro517WzVSPPV1tDKzhku2iJ2FVgL67wG03SGnNA=="
crossorigin="anonymous"/>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous"/>
</head>
<!-- COLORS
red-bg: #FFECEF;
green-bg: #E4FEEE;
blue-bg: #F4F4FF;
tab-title-bg: #edf2f7
jumbotron-bg: #192a56
brand-color: #b22126
yellow-pill: #f6b93b
red-text: #F66170;
green-text: #51A26E;
blue-text: #2765FC;
grey-text: #757575;
tab-title-text: #162635;
-->
<body>
<div class="oe_styling_v8">
<section class="oe_container"
style="font-family: Roboto, 'sans-serif'; padding:2rem 3rem 1rem">
<div class="row shadow-lg"
style="max-width:1540px; margin:0 auto; border-radius: 10px;">
<!-- LEFT HERO -->
<div class="col-lg-7"
style="margin-top: 0rem; padding: 3rem 2.5rem; ">
<div style="width: 200px;">
<img src="https://www.cybrosys.com/images/logo.png"
width="150px" height="auto"/>
</div>
<h1 class="mt-4"
style="font-family: Montserrat, 'sans-serif' ; font-weight: bold;">
Support Package Management</h1>
<p class="lead"
style="font-weight: 500; line-height: 1.5; color: #757575">
Support Service and Package Management Module.
</p>
<span class="badge px-3 py-2 depth-1"
style="background-color: #FFECEF; color: #F66170; font-weight: bold; border-radius: 1rem;"><i
class="fa fa-star mr-2"></i>Key Highlights</span>
<!-- FEATURES -->
<hr class="mt-4"
style="background: linear-gradient(to right, #e5e5e5, transparent); height: 2px; border-style: none;">
<div class="row">
<!-- FEATURE COLUMN LEFT -->
<ul style="list-style: none; padding: 0; font-weight: 500; line-height: 2;">
<li><i class="fa fa-check-circle mr-2"
style="color: #1abc9c;"></i>Easy to create, monitor and manage support service.
</li>
<li><i class="fa fa-check-circle mr-2"
style="color: #1abc9c;"></i>Management of customers are similar to project management.
</li>
<li><i class="fa fa-check-circle mr-2"
style="color: #1abc9c;"></i>Can reuse packages with the help of templates.
</li>
<li><i class="fa fa-check-circle mr-2"
style="color: #1abc9c;"></i>Renewal badge appears ones end date is closer or number of
tickets remaining is very less.
</li>
</ul>
</div>
<hr class="mt-4"
style="background: linear-gradient(to right, #e5e5e5, transparent); height: 2px; border-style: none;">
<!-- END OF FEATURES -->
</div>
<!-- END OF LEFT HERO -->
<!-- RIGHT HERO -->
<div class="col-lg-5 d-flex align-items-center"
style="border-radius: 0px 10px 10px 0px; background-image: url('images/res_branch.png'); background-repeat: no-repeat; background-size: cover;">
</div>
<!-- END OF RIGHT HERO -->
</div>
<section class="oe_container" style="margin-top: 4rem;">
<div class="row"
style="max-width:1540px; margin:0 auto; padding-bottom:64px;">
<div class="col-lg-12">
<!-- TAB LIST -->
<ul class="nav nav-tabs d-flex justify-content-center"
role="tablist"
style="background-color:unset; margin:0 auto;">
<li class="nav-item">
<a class="nav-link active" style="color: #000;"
data-toggle="tab" href="#tabs-1"
role="tab"><i class="fa fa-pie-chart mr-2"></i>Overview</a>
</li>
<li class="nav-item">
<a class="nav-link" style="color: #000;"
data-toggle="tab" href="#tabs-3" role="tab"><i
class="fa fa-star mr-2"></i>Features</a>
</li>
<li class="nav-item">
<a class="nav-link" style="color: #000;"
data-toggle="tab" href="#tabs-4" role="tab"><i
class="fa fa-picture-o mr-2"></i>Screenshots</a>
</li>
</ul>
</div>
<div class="col-lg-12">
<!-- Tab panes -->
<div class="tab-content" style="padding: 2rem;">
<div class="tab-pane active" id="tabs-1"
role="tabpanel">
<h3 class="text-center rounded px-3 py-2 mb-4"
style="background-color:#edf2f7; color: #162635; font-family: Roboto, 'sans-serif'; font-weight: bold;">
Overview</h3>
<p class="text-justify">Support package module is a
support management app. It enables users to
create, manage, optimize, and monitor the
entire service request from a centralized
application.</p>
</div>
<div class="tab-pane" id="tabs-3" role="tabpanel">
<h3 class="text-center rounded px-3 py-2 mb-4"
style="background-color:#edf2f7; color: #162635; font-family: Roboto, 'sans-serif'; font-weight: bold;">
Features</h3>
<ul style="max-width: 1200px;">
<li>
<h5 style="font-family: Roboto, 'sans-serif';">
Easy to create, monitor and manage support service.
</h5>
</li>
<li>
<h5 style="font-family: Roboto, 'sans-serif';">
Management of customers are similar to project management.
</h5>
</li>
<li>
<h5 style="font-family: Roboto, 'sans-serif';">
Can reuse packages with the help of templates.
</h5>
</li>
<li>
<h5 style="font-family: Roboto, 'sans-serif';">
Renewal badge appears ones end date is closer or number of tickets remaining is
very less.
</h5>
</li>
<li>
<h5 style="font-family: Roboto, 'sans-serif';">
Shows all the necessary information about a customer in kanban view inside
each support package which makes it easy to monitor bulk amount of customers.
</h5>
</li>
</ul>
</div>
<div class="tab-pane" id="tabs-4" role="tabpanel">
<h3 class="text-center rounded px-3 py-2 mb-4"
style="background-color:#edf2f7; color: #162635; font-family: Roboto, 'sans-serif'; font-weight: bold;">
Screenshots</h3>
<!-- CAROUSEL -->
<div id="slider" class="carousel slide"
data-ride="carousel">
<div class="carousel-inner">
<!-- Slide Items -->
<div class="carousel-item active">
<img src="images/support_1.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
<h3>Creating support packages</h3>
<p>Creating support packages with information like maximum number of
tickets,
maximum duration of each ticket, validity of package, this will
automatically
create this package as a product</p>
</div>
</div>
<div class="carousel-item">
<img src="images/support_2.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
<h3>Creating sale order</h3>
<p>Create sale order to customer with required package as product, then the
customer
will be created in support packages</p>
</div>
</div>
<div class="carousel-item">
<img src="images/support_3.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
</div>
</div>
<div class="carousel-item">
<img src="images/support_4.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
<h3>Information shown customer kanban view</h3>
</div>
</div>
<div class="carousel-item">
<img src="images/support_5.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
<h3>Report</h3>
</div>
</div>
<div class="carousel-item">
<img src="images/support_6.png"
alt="App Screenshot" width="1100"
height="500">
<div class="carousel-caption text-white p-4 position-relative d-none d-md-block bg-dark mb-4"
style="top:0; left:0;">
<h3>Package Template</h3>
<p>Can create templates so that it helps in creating similar support
packages.</p>
</div>
</div>
<!-- End of Slide Items -->
<!-- Slider control -->
<a class="carousel-control-prev"
href="#slider" data-slide="prev">
<i
class="fa fa-arrow-left bg-dark p-3 rounded d-flex justify-content-center align-items-center"></i>
</a>
<a class="carousel-control-next"
href="#slider" data-slide="next">
<i
class="fa fa-arrow-right bg-dark p-3 rounded d-flex justify-content-center align-items-center"></i>
</a>
<!-- End of Slider control -->
</div>
<!-- END OF CAROUSEL -->
</div>
</div>
</div>
<!-- END OF TAB LIST -->
</div>
</div>
</section>
<!-- Suggested Products -->
<section class="oe_container"
style="padding:2rem 3rem 1rem; max-width:1540px; margin: 0 auto; ">
<h2 style="font-weight:600; text-align:center; margin-bottom:1rem; width:100%">
Suggested Products</h2>
<hr
style="background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<div id="suggestedSlider" class="row carousel slide mt-4"
data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item" style="min-height: 191px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/13.0/project_task_timer/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/project_task_timer.png?ae168aa">
</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/13.0/project_report_pdf/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/project_repo.png?ae168aa">
</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/13.0/project_custom_gantt/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/project_gantt.png?ae168aa">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 191px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/12.0/project_task_timer/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/task_image.png?ae168aa">
</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/13.0/task_deadline_reminder/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/reminder.png?ae168aa">
</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/12.0/project_report_pdf/"
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="//apps.odoocdn.com/apps/assets/14.0/custom_gantt_view/images/project_report.png?ae168aa">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#suggestedSlider"
data-slide="prev"
style="width:35px; color:#000">
<span class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span> </a> <a
class="carousel-control-next"
href="#suggestedSlider" data-slide="next"
style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</section>
<!-- End of Suggested Products -->
<!-- Our Services -->
<section class="oe_container" style="padding:2rem 3rem 1rem">
<!-- <h2 style="font-weight:600; text-align:center; margin-bottom:1rem; width:100%">Our Services</h2>
<hr
style="background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;"> -->
<div class="row mt-4 position-relative"
style="max-width:1540px; margin: 0 auto;">
<div class="col-lg-12 jumbotron text-white position-relative shadow-sm"
style="background-color: #b22126; background-image: url('./assets/arrows-transparent.png'); background-size: cover; background-position: bottom; border-radius: 10px;">
<span class="badge badge-pill px-3 py-2 text-dark shadow-sm font-weight-bold"
style="background-color: #f6b93b;"><i
class="fa fa-trophy mr-2"></i>Odoo Gold Partner</span>
<div class="row">
<div class="col-lg-6 mt-4">
<h1 style="font-family: Roboto, 'sans-serif'; color:#FFF;">
Our Services</h1>
<p class="lead">We provide following services</p>
<ul class="mt-4"
style="list-style: none; padding: 0; line-height: 2.8; font-weight: 500;">
<li>
<a href="https://www.cybrosys.com/odoo-customization-and-installation/"
style="color: white; text-decoration: none;"
target="_blank"><i
class="fa fa-cogs mr-2"
style="color: #f6b93b; font-size: 1.5rem"></i>Odoo
Customization</a></li>
<li>
<a href="https://www.cybrosys.com/odoo-erp-implementation/"
style="color: white; text-decoration: none;"
target="_blank"><i
class="fa fa-wrench mr-2"
style="color: #f6b93b; font-size: 1.5rem"></i>Odoo
Implementation</a></li>
<li>
<a href="https://www.cybrosys.com/odoo-erp-support/"
style="color: white; text-decoration: none;"
target="_blank"><i
class="fa fa-life-ring mr-2"
style="color: #f6b93b; font-size: 1.5rem"></i>Odoo
Support</a></li>
<li>
<a href="https://www.cybrosys.com/hire-odoo-developer/"
style="color: white; text-decoration: none;"
target="_blank"><i
class="fa fa-user mr-2"
style="color: #f6b93b; font-size: 1.5rem"></i>
Hire
Odoo Developers</a></li>
</ul>
</div>
</div>
</div>
<img src="./assets/trophy.png" width="50%"
height="auto" alt="Odoo Gold Partner"
class="position-absolute" style="right: 0; bottom: 0;">
</div>
</section>
<!-- End of Our Services -->
<!-- Our Industries -->
<section class="oe_container" style="padding:2rem 3rem 1rem">
<div class="row" style="max-width:1540px; margin: 0 auto; ">
<div class="col-lg-12">
<h2 style="font-weight:600; text-align:center; margin-bottom:1rem; width:100%">
Our
Industries</h2>
<hr
style="background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
</div>
<div class="row mt-4 position-relative"
style="max-width:1540px; margin: 0 auto;">
<!-- Left Column -->
<div class="col-lg-6">
<div class="bg-white shadow px-4 py-3 mb-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/best-trading-erp/"
target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/trading.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Trading</h4>
<p style="font-weight: 300;">Easily
procure and sell your products</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/education-erp-software/"
target="_blank" class="text-dark"
style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/education.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Education</h4>
<p style="font-weight: 300;">A
Collaborative platform for
educational
management</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/manufacturing-erp-software/"
target="_blank" class="text-dark"
style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/manufacturing.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Manufacturing</h4>
<p style="font-weight: 300;">Plan, track
and schedule your operations</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/ecommerce-website/"
target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/ecom.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
E-commerce & Website</h4>
<p style="font-weight: 300;">Mobile
friendly, awe-inspiring product
pages
</p>
</div>
</div>
</a>
</div>
</div>
<!-- End of Left Column -->
<!-- Right Column -->
<div class="col-lg-6">
<div class="bg-white shadow px-4 py-3 mb-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/pos/"
target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/pos.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
POS</h4>
<p style="font-weight: 300;">Easy
configuring and convivial
selling</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/service-management/"
target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/service.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Service Management</h4>
<p style="font-weight: 300;">Keep track
of services and invoice accordingly
</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/restaurant-management/"
target="_blank" class="text-dark"
style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/restaurant.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Restaurant</h4>
<p style="font-weight: 300;">Run your
bar or restaurant methodica</p>
</div>
</div>
</a>
</div>
<div class="bg-white shadow px-4 py-3 my-3"
style="border-radius: 10px;">
<a href="https://www.cybrosys.com/odoo/industries/hotel-management-erp/"
target="_blank"
class="text-dark" style="text-decoration: none;">
<div class="row">
<div class="col-lg-3 no-gutters">
<img src="./assets/icons/hotel.png">
</div>
<div class="col-lg-9 no-gutters pt-3">
<h4 style="font-family: Roboto, 'sans-serif">
Hotel Management</h4>
<p style="font-weight: 300;">An
all-inclusive hotel management
application
</p>
</div>
</div>
</a>
</div>
</div>
<!-- End of Right Column -->
</div>
</div>
</section>
<!-- End of Our Industries-->
<!-- Footer Section -->
<section class="oe_container" style="padding:2rem 3rem 1rem">
<div class="row" style="max-width:1540px; margin: 0 auto; ">
<div class="col-lg-12 mb-4">
<h2 style="font-weight:600; text-align:center; margin-bottom:1rem; width:100%">
Need Help?</h2>
<hr
style="background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
</div>
</div>
<!-- Contact Cards -->
<div class="row d-flex justify-content-center align-items-center"
style="max-width:1540px; margin: 0 auto;">
<div class="col-lg-3 shadow mt-2"
style="padding: 5rem 2rem 2rem; border-radius: 10px; margin-right: 3rem; border-top: 7px solid #546E7A; height: 300px;">
<h5 class="font-weight-bold"
style="font-family: Roboto, 'sans-serif';">Visit us</h5>
<p class="mb-4" style="color: #808e9b; font-size: 0.9rem;">
Visit our website for more
information.</p>
<a href="https://cybrosys.com" target="_blank"
class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #546E7A; color: #FFF; border-radius: 4px;">www.cybrosys.com</a>
</div>
<div class="col-lg-3 shadow mt-2"
style="padding: 5rem 2rem 2rem; border-radius: 10px; margin-right: 3rem; border-top: 7px solid #b22126; height: 330px;">
<h5 class="font-weight-bold"
style="font-family: Roboto, 'sans-serif';">Write to
us</h5>
<p class="mb-4" style="color: #808e9b; font-size: 0.9rem;">
Do you have any queries regarding our
products &amp; services? Let us know.</p>
<a href="mailto:odoo@cybrosys.com" target="_blank"
class="btn btn-block mb-2 deep_hover"
style="text-decoration: none; background-color: #b22126; color: #FFF; border-radius: 4px;">odoo@cybrosys.com</a>
<a href="mailto:info@cybrosys.com" target="_blank"
class="btn btn-block deep_hover"
style="text-decoration: none; background-color: #b22126; color: #FFF; border-radius: 4px;">info@cybrosys.com</a>
</div>
b
<div class="col-lg-3 shadow mt-2"
style="padding: 5rem 2rem 2rem; border-radius: 10px; margin-right: 3rem; border-top: 7px solid #546E7A; height: 300px;">
<h5 class="font-weight-bold"
style="font-family: Roboto, 'sans-serif';">Follow
Us</h5>
<p class="mb-4" style="color: #808e9b; font-size: 0.9rem;">
Follow us on social media for latest
updates.</p>
<div class="d-flex justify-content-begin align-items-center">
<a href="https://www.facebook.com/cybrosystechnologies"
target="_blank"
class="btn mb-2 mr-2 deep_hover d-flex justify-content-center align-items-center"
style="text-decoration: none; background-color:#3b5998; color: #fff; height: 35px; width: 35px; border-radius: 4px;"><i
class="fa fa-facebook"></i></a>
<a href="https://twitter.com/cybrosys" target="_blank"
class="btn mb-2 mr-2 deep_hover d-flex justify-content-center align-items-center"
style="text-decoration: none; background-color:#00acee ; color: #fff ; height: 35px; width: 35px; border-radius: 4px;"><i
class="fa fa-twitter"></i></a>
<a href="https://www.youtube.com/channel/UCKjWLm7iCyOYINVspCSanjg"
target="_blank"
class="btn mb-2 mr-2 deep_hover d-flex justify-content-center align-items-center"
style="text-decoration: none; background-color:#FF0000 ; color: #fff ; height: 35px; width: 35px; border-radius: 4px;"><i
class="fa fa-play"></i></a>
<a href="https://medium.com/cybrosys" target="_blank"
class="btn mb-2 deep_hover d-flex justify-content-center align-items-center"
style="text-decoration: none; background-color:#000 ; color: #fff ; height: 35px; width: 35px; border-radius: 4px;"><i
class="fa fa-medium"></i></a>
</div>
</div>
<!-- End of Contact Cards -->
</div>
</section>
</section>
</div>
<!-- Footer -->
<section class="oe_container" style="padding:2rem 3rem 1rem;">
<div class="row"
style="max-width:1540px; margin: 0 auto; margin-right: 3rem; ">
<!-- Logo -->
<div class="col-lg-12 d-flex justify-content-center align-items-center"
style="margin-top: 4rem;">
<img src="https://www.cybrosys.com/images/logo.png" width="200px"
height="auto"/>
</div>
<!-- End of Logo -->
<div class="col-lg-12" style="margin-top: 2rem;">
<hr
style="margin-top: 3rem;background: linear-gradient(90deg, rgba(2,0,36,0) 0%, rgba(229,229,229,1) 33%, rgba(229,229,229,1) 58%, rgba(0,212,255,0) 100%); height: 2px; border-style: none;">
<!-- End of Footer Section -->
</div>
</div>
</section>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js"
integrity="sha512-wV7Yj1alIZDqZFCUQJy85VN+qvEIly93fIQAN7iqDFCPEucLCeNFz4r35FCo9s6WrpdDQPi80xbljXB8Bjtvcg=="
crossorigin="anonymous"></script>
</body>
</html>

78
support_package/views/package_template.xml

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="project_menu_config_project_template"
model="ir.actions.act_window">
<field name="name">Support Package Template</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">support.package.template</field>
<field name="view_mode">tree,kanban,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new package template !
</p>
</field>
</record>
<record id="config_project_template_tree" model="ir.ui.view">
<field name="name">support.package.template.tree</field>
<field name="model">support.package.template</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="count"/>
<field name="duration" widget="timesheet_uom"/>
<field name="package_validity"/>
</tree>
</field>
</record>
<record id="config_project_template_form" model="ir.ui.view">
<field name="name">support.package.template.form</field>
<field name="model">support.package.template</field>
<field name="arch" type="xml">
<form>
<header>
<button name="button_create_package" class="oe_highlight oe_read_only"
string="Create Package" type="object"
context="{
'default_is_support_package': True,
'default_name': name,
'default_support_count': count,
'default_support_duration': duration,
'default_support_validity_number': validity_number,
'default_validity_rule': validity_rule
}"/>
</header>
<sheet>
<div class="oe_title">
<h4>Name :</h4>
<h1><field name="name" colspan="3" required="1"/></h1>
</div>
<br/>
<group>
<group name="package_template_details"
string="Package Details">
<field name="count"/>
<field name="duration" widget="timesheet_uom"/>
<label string="Package Validity" for="validity_number"/>
<div name="validity_number" class="o_row">
<field name="validity_number"/>
<field name="validity_rule"/>
</div>
</group>
<group>
</group>
</group>
</sheet>
</form>
</field>
</record>
<menuitem id="menu_configuration_package_template"
name="Template"
parent="support_package.support_menu_configuration"
action="support_package.project_menu_config_project_template"
sequence="22"/>
</odoo>

152
support_package/views/support_client.xml

@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="support_view_client_search_form" model="ir.ui.view">
<field name="name">Inherit Client Search Support</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_search_form"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//filter[@name='my_tasks']" position="before">
<field name="is_support_package"/>
<filter string="Customers of Support"
name="filter_is_support"
domain="[('is_support_package','=',True)]"/>
<separator/>
</xpath>
</field>
</record>
<record id="action_view_all_task_customers" model="ir.actions.act_window">
<field name="name">Customers</field>
<field name="res_model">project.task</field>
<field name="search_view_id" ref="project.view_task_search_form"/>
<field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field>
<field name="context">{'search_default_filter_is_support': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No customers found. Let's create one!
</p>
</field>
</record>
<record id="view_task_form2_support_inherited" model="ir.ui.view">
<field name="name">project.task.form.inherited</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2" />
<field name="groups_id" eval="[(6,0, (ref('hr_timesheet.group_hr_timesheet_user'),))]"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='unit_amount']" position="after">
<field name="support_count" force_save="1"/>
</xpath>
</field>
</record>
<record id="view_task_tree2_support_inherited" model="ir.ui.view">
<field name="name">project.task.tree.inherited</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_tree2"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='project_id']" position="after">
<field name="partner_id"/>
</xpath>
</field>
</record>
<record id="quick_create_form_support_customers" model="ir.ui.view">
<field name="name">Inherit Task Kanban Quick create : Package Customer</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.quick_create_task_form"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']/.." position="before">
<div class="o_kanban_record_headings" id="view_task_kanban_title_replace">
<group name="quick_create_support_package_client"
attrs="{'invisible': [('is_support_package', '=', False)]}">
<field name="partner_id" string="Customer"/>
<field name="start_date" string="Start Date"/>
<field name="support_count" invisible="1"/>
<field name="count_used" invisible="1"/>
<field name="count_remaining" invisible="1"/>
<field name="support_duration" invisible="1"/>
<field name="planned_hours" invisible="1"/>
<field name="is_support_package" invisible="1"/>
<field name="package_validity" invisible="1"/>
<field name="start_date" invisible="1"/>
<field name="end_date" invisible="1"/>
<field name="date_deadline" invisible="1"/>
</group>
</div>
</xpath>
</field>
</record>
<record id="view_task_form2_support_package_customers" model="ir.ui.view">
<field name="name">Inherit Project Task Form: Package Customers</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_assign_to_me']" position="after">
<button name="action_renew" string="Renewal Quotation" type="object" class="oe_highlight"
attrs="{'invisible' : [('to_renew', '=', False)]}"/>
</xpath>
<xpath expr="//page[@name='extra_info']" position="before">
<page name="support_details" string="Support Details"
attrs="{'invisible': [('is_support_package', '=', False)]}">
<group>
<group name="support_details" string="Details">
<field name="is_support_package" attrs="{'readonly':True}"/>
<field name="support_count" attrs="{'readonly':True}"/>
<field name="support_duration" widget="timesheet_uom" attrs="{'readonly':True}"/>
<label string="Package Validity" for="package_validity"/>
<div class="o_row">
<field name="package_validity" attrs="{'readonly':True}"/>
day(s)
</div>
<field name="start_date" attrs="{'readonly':False}"/>
<field name="end_date" attrs="{'readonly':True}"/>
</group>
<group>
</group>
</group>
</page>
</xpath>
<xpath expr="//div[@name='button_box']" position="after">
<div class="badge-pill badge-warning float-right"
attrs="{'invisible': [('to_renew', '=', False)]}">For Renewal</div>
</xpath>
<xpath expr="//field[@name='partner_id']" position="after">
<field name="count_used"
attrs="{'readonly':True, 'invisible': [('is_support_package', '=', False)]}"/>
<field name="count_remaining" string="Remaining Tickets"
attrs="{'readonly':True, 'invisible': [('is_support_package', '=', False)]}"/>
<field name="to_renew"/>
</xpath>
</field>
</record>
<record id="view_task_kanban_support_customer" model="ir.ui.view">
<field name="name">Inherit Project Task Kanban: Support Customers</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_kanban"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='tag_ids']" position="after">
<field name="to_renew" invisible="1"/>
<div class="badge badge-pill badge-info badge-warning mt4 mr16"
attrs="{'invisible': [('to_renew', '=', False)]}">
To Renew
</div>
</xpath>
</field>
</record>
<menuitem id="support_incident_menu_clients"
name="Customers"
parent="support_package.support_menu_root"
action="support_package.action_view_all_task_customers"
sequence="10"/>
</odoo>

206
support_package/views/support_package.xml

@ -0,0 +1,206 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="search_view_inherit_support" model="ir.ui.view">
<field name="name">Inherit Product Search Support</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_search_view"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//filter[@name='services']" position="before">
<filter string="Support Packages"
name="filter_is_support"
domain="[('is_support','=',True)]"/>
<separator/>
</xpath>
</field>
</record>
<record id="product_inherit_support_package" model="ir.ui.view">
<field name="name">Inherit Product Product: Support Package</field>
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='purchase_ok']/.." position="after">
<field name="is_support"/>
<label for="is_support"/>
</xpath>
</field>
</record>
<record id="product_template_inherit_support_package" model="ir.ui.view">
<field name="name">Inherit Product Template: Support Product</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="product.product_template_only_form_view"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='purchase_ok']/.." position="after">
<field name="is_support"/>
<label for="is_support"/>
</xpath>
</field>
</record>
<record id="project_project_support_package" model="ir.ui.view">
<field name="name">Project Project : Support Package</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.project_project_view_form_simplified"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//group" position="after">
<group id="is_support_package" class="oe_inline">
<field name="is_support_package"/>
<field name="support_count" class="oe_inline" attrs="{'invisible':[('is_support_package', '=', False)]}"/>
<field name="support_duration" class="oe_inline" widget="timesheet_uom" attrs="{'invisible':[('is_support_package', '=', False)]}"/>
<label string="Maximum Validity" for="support_validity_number" attrs="{'invisible':[('is_support_package', '=', False)]}"/>
<div name="support_validity_number" class="o_row" attrs="{'invisible':[('is_support_package', '=', False)]}">
<field name="support_validity_number" class="oe_inline"/>
<field name="validity_rule" class="oe_inline"/>
</div>
</group>
</xpath>
</field>
</record>
<record id="project_support_package_form" model="ir.ui.view">
<field name="name">Inherit project form : Support Package</field>
<field name="model">project.project</field>
<field name="inherit_id" ref="project.edit_project"/>
<field name="priority">25</field>
<field name="arch" type="xml">
<xpath expr="//field[@name='privacy_visibility']/.." position='attributes'>
<attribute name="attrs">
{'invisible':[('is_support_package', '=', True)]}
</attribute>
</xpath>
<xpath expr="//field[@name='allowed_internal_user_ids']/.." position='attributes'>
<attribute name="attrs">
{'invisible':['|',
('is_support_package', '=', True),
('privacy_visibility', '!=', 'followers')]}
</attribute>
</xpath>
<xpath expr="//field[@name='allowed_internal_user_ids']/.." position="before">
<group>
<field name="privacy_visibility_support" widget="radio" string="Visibility"
attrs="{'invisible':[('is_support_package', '=', False)]}"/>
<field name="allowed_internal_user_support_ids" widget="many2many_tags"
attrs="{'invisible': [('privacy_visibility_support', '!=', 'followers')]}"/>
</group>
</xpath>
<xpath expr="//div[@id='rating_settings']/.." position="before">
<div class="row mt16 o_settings_container">
<div class="col-lg-6 o_setting_box" id="support_package">
<div class="o_setting_left_pane">
<field name="is_support_package"/>
</div>
<div class="o_setting_right_pane">
<label for="is_support_package"
string="Support Package"/>
<div class="text-muted">
This project is a Support Package
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//group[@name='extra_settings']/.." position="after">
<br/>
<group>
<group name="support_package_info" string="Support Package info"
attrs="{'invisible':[('is_support_package', '=', False)]}">
<field name="support_count"/>
<field name="support_duration" widget="timesheet_uom"/>
<label string="Package Validity" for="support_validity_number"/>
<div name="support_validity_number" class="o_row">
<field name="support_validity_number"/>
<field name="validity_rule"/>
</div>
</group>
</group>
</xpath>
</field>
</record>
<record id="project_all_support_package" model="ir.actions.act_window">
<field name="name">Support Package</field>
<field name="res_model">project.project</field>
<field name="domain">[('is_support_package', '=', True)]</field>
<field name="view_mode">kanban,form</field>
<field name="view_id" ref="project.view_project_kanban"/>
<field name="search_view_id" ref="project.view_project_project_filter"/>
<field name="target">main</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No packages found. Let's create one!
</p>
</field>
</record>
<record id="project_all_support_package_config" model="ir.actions.act_window">
<field name="name">Support Package : Configration</field>
<field name="res_model">project.project</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('is_support_package', '=', True)]</field>
<field name="search_view_id" ref="project.view_project_project_filter"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No packages found. Let's create one!
</p>
</field>
</record>
<record id="action_support_products" model="ir.actions.act_window">
<field name="name">Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,tree,form,activity</field>
<field name="view_id" ref="product.product_template_kanban_view"/>
<field name="search_view_id" ref="product.product_template_search_view"/>
<field name="context">{
'search_default_filter_is_support': True,
'search_default_filter_to_sell':1,
'default_type':'service',
'default_is_support':True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product
</p>
</field>
</record>
<menuitem id="support_menu_root"
name="Support"
action="support_package.project_all_support_package"
sequence="1"/>
<menuitem id="support_menu_project_support_package"
name="Packages"
parent="support_package.support_menu_root"
sequence="5"/>
<menuitem id="packages_menu_project_packages"
name="Packages"
parent="support_package.support_menu_project_support_package"
action="support_package.project_all_support_package"
sequence="7"/>
<menuitem id="packages_menu_project_support_products"
name="Products"
parent="support_package.support_menu_project_support_package"
action="support_package.action_support_products"
sequence="9"/>
<menuitem id="support_menu_configuration"
name="Configuration"
parent="support_package.support_menu_root"
sequence="20"/>
<menuitem id="menu_configuration_package"
name="Package Configuration"
parent="support_package.support_menu_configuration"
action="support_package.project_all_support_package_config"
sequence="21"/>
</odoo>
Loading…
Cancel
Save