[ADD]: Quote roller module

bzr revid: aja@tinyerp.com-20131202123437-zn6u2ckxbid3jknb
This commit is contained in:
ajay javiya (OpenERP) 2013-12-02 18:04:37 +05:30
parent b6cb210865
commit 3e5ae00690
13 changed files with 620 additions and 3 deletions

View File

@ -51,7 +51,7 @@ class mail_compose_message(osv.TransientModel):
res.update(
self.onchange_template_id(
cr, uid, [], context['default_template_id'], res.get('composition_mode'),
res.get('model'), res.get('res_id'), context=context
res.get('model'), res.get('res_id', context.get('active_id')), context=context
)['value']
)
return res
@ -114,7 +114,6 @@ class mail_compose_message(osv.TransientModel):
values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context))
else:
values = self.default_get(cr, uid, ['subject', 'body', 'email_from', 'email_to', 'email_cc', 'partner_to', 'reply_to', 'attachment_ids', 'mail_server_id'], context=context)
if values.get('body_html'):
values['body'] = values.pop('body_html')
return {'value': values}
@ -169,7 +168,6 @@ class mail_compose_message(osv.TransientModel):
# filter template values
fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'attachments', 'mail_server_id']
values = dict.fromkeys(res_ids, False)
template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, context=context)
for res_id in res_ids:
res_id_values = dict((field, template_values[res_id][field]) for field in fields if template_values[res_id].get(field))

View File

@ -0,0 +1,2 @@
import controllers
import models

View File

@ -0,0 +1,22 @@
{
'name': 'Quote Roller',
'category': 'Website',
'summary': 'Send Live Quotation',
'version': '1.0',
'description': """
OpenERP Sale Quote Roller
==================
""",
'author': 'OpenERP SA',
'depends': ['website_sale','website','product','portal_sale', 'mail'],
'data': [
'views/website_sale_quote.xml',
'sale_quote_view.xml',
'sale_quote_data.xml'
],
'demo': [
],
'qweb': ['static/src/xml/*.xml'],
'installable': True,
}

View File

@ -0,0 +1,3 @@
import main
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,57 @@
import random
import uuid
import simplejson
import werkzeug.exceptions
from openerp import SUPERUSER_ID
from openerp.osv import osv
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website.models import website
class sale_quote(http.Controller):
def get_quote(self, token):
quote_pool = request.registry.get('sale.quote')
quote_id = quote_pool.search(request.cr, SUPERUSER_ID, [('access_token', '=', token)], context=request.context)
return quote_id
@website.route(['/quote/<token>'], type='http', auth="public")
def view(self, token=None, **post):
values = {}
# http://hostname:8069/quote?id=
quote_pool = request.registry.get('sale.quote')
quotation = quote_pool.browse(request.cr, SUPERUSER_ID, self.get_quote(token))[0]
values.update({
'quotation' : quotation,
})
return request.website.render('website_sale_quote.quotation', values)
@website.route(['/quote/<token>/accept'], type='http', auth="public")
def accept(self, token=None , **post):
values = {}
quotation = request.registry.get('sale.quote').write(request.cr, SUPERUSER_ID, self.get_quote(token), {'state': 'accept'})
return request.redirect("/quote/%s" % token)
@website.route(['/quote/<token>/decline'], type='http', auth="public")
def decline(self, token=None , **post):
values = {}
quotation = request.registry.get('sale.quote').write(request.cr, SUPERUSER_ID, self.get_quote(token), {'state': 'cancel'})
return request.redirect("/quote/%s" % token)
@website.route(['/quote/<token>/post'], type='http', auth="public")
def post(self, token=None, **post):
values = {}
if post.get('new_message'):
request.session.body = post.get('new_message')
if 'body' in request.session and request.session.body:
request.registry.get('sale.quote').message_post(request.cr, SUPERUSER_ID, self.get_quote(token),
body=request.session.body,
type='comment',
subtype='mt_comment',
)
request.session.body = False
return request.redirect("/quote/%s" % token)

View File

@ -0,0 +1 @@
import order

View File

@ -0,0 +1,121 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from openerp.osv import osv, fields
import hashlib
import time
class sale_quote(osv.Model):
_name = "sale.quote"
_inherit = ['mail.thread', 'ir.needaction_mixin']
_description = "Sales Quotations"
_columns = {
# 'template_id': fields.many2one('ir.ui.view', 'Template'),
'order_id': fields.many2one('sale.order', 'Order', required=True),
'state': fields.selection([
('draft', 'Draft Quotation'),
('sent', 'Quotation Sent'),
('accept', 'Accept'),
('cancel', 'Cancelled'),
('done', 'Done'),
], 'Status'),
'to_email': fields.char('Customers Email'),
'access_token':fields.char('Quotation Token', size=256),
}
def new_quotation_token(self, cr, uid, record_id):
db_uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
quotation_token = hashlib.sha256('%s-%s-%s' % (time.time(), db_uuid, record_id)).hexdigest()
return self.write(cr, uid, [record_id],{'access_token': quotation_token} )
def create(self, cr, uid, vals, context=None):
if context is None:
context = {}
new_id = super(sale_quote, self).create(cr, uid, vals, context=context)
self.new_quotation_token(cr, uid, new_id)
return new_id
class sale_order(osv.osv):
_inherit = 'sale.order'
_columns = {
'quote_url': fields.char('URL'),
}
# def action_quotation_send(self, cr, uid, ids, context=None):
# '''
# This function opens a window to compose an email, with the edi sale template message loaded by default
# '''
# data_pool = self.pool.get('ir.model.data')
# sale_quote = self.pool.get('sale.quote')
# try:
# compose_form_id = data_pool.get_object_reference(cr, uid, 'mail', 'email_compose_message_wizard_form')[1]
# except ValueError:
# compose_form_id = False
# model,template_id = data_pool.get_object_reference(cr, uid, 'website_sale_quote', "email_template_sale_quote")
# ctx = dict(context)
# for order in self.browse(cr, uid, ids, context):
# if not order.quote_id:
# new_id = sale_quote.create(cr, uid,{
# 'state' : 'draft',
# 'to_email': order.partner_id.email,
# })
# self.write(cr, uid, [order.id] ,{'quote_id': new_id}, context)
# ctx.update({
# 'default_model': 'sale.order',
# 'default_res_id': order.id,
# 'default_use_template': bool(template_id),
# 'default_template_id': template_id,
# 'default_composition_mode': 'comment',
# 'mark_so_as_sent': True
# })
# return {
# 'type': 'ir.actions.act_window',
# 'view_type': 'form',
# 'view_mode': 'form',
# 'res_model': 'mail.compose.message',
# 'views': [(compose_form_id, 'form')],
# 'view_id': compose_form_id,
# 'target': 'new',
# 'context': ctx,
# }
def action_quotation_send(self, cr, uid, ids, context=None):
quote = super(sale_order, self).action_quotation_send(cr, uid,ids, context)
sale_quote = self.pool.get('sale.quote')
for order in self.browse(cr, uid, ids, context):
q_id = sale_quote.search(cr, uid, [('order_id','=', order.id)], context=context)
if not q_id:
new_id = sale_quote.create(cr, uid,{
'order_id' : order.id,
'state' : 'draft',
'to_email': order.partner_id.email,
})
self.write(cr, uid, order.id, {'quote_url': self.get_signup_url(cr, uid, [order.id], context)})
return quote
def get_signup_url(self, cr, uid, ids, context=None):
url = False
quote_id = self.pool.get('sale.quote').search(cr, uid, [('order_id','=', ids[0])], context=context)
for quote in self.pool.get('sale.quote').browse(cr, uid, quote_id, context=context):
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='http://localhost:8069', context=context)
url = "%s/quote/%s" % (base_url, quote.access_token)
return url

View File

@ -0,0 +1,29 @@
<openerp>
<data>
<!--Email template -->
<record id="email_template_sale_quote" model="email.template">
<field name="name">Sales Quotation - Send by Email (Quote)</field>
<field name="email_from">${object.user_id.email or ''}</field>
<field name="subject">${object.company_id.name} ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'} (Ref ${object.name or 'n/a' })</field>
<field name="partner_to">${object.partner_invoice_id.id}</field>
<field name="model_id" ref="website_sale_quote.model_sale_order"/>
<field name="auto_delete" eval="True"/>
<field name="body_html"><![CDATA[
<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, 255, 255); ">
<p>Hello ${object.partner_id.name},</p>
<p>Here is your ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'} from ${object.company_id.name}: </p>
<% set signup_url = object.get_quote_url() %>
<p>
You can access this document and pay online via our Customer Portal:
</p>
<a style="display:block; width: 150px; height:20px; margin-left: 120px; color: #DDD; font-family: 'Lucida Grande', Helvetica, Arial, sans-serif; font-size: 13px; font-weight: bold; text-align: center; text-decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat no-repeat;"
href="${signup_url}">View ${object.state in ('draft', 'sent') and 'Quotation' or 'Order'}</a>
</div>
]]></field>
</record>
</data>
</openerp>

View File

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add payment options to sale.order and invoice forms -->
<record model="ir.ui.view" id="sale_order_form_quote">
<field name="name">sale.order.form.payment</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<notebook version="7.0" position="before">
<field name="quote_url"/>
</notebook>
</field>
</record>
</data>
</openerp>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -0,0 +1,13 @@
body { padding-top:30px;
}
.widget .panel-body { padding:0px; }
.widget .list-group { margin-bottom: 0; }
.widget .panel-title { display:inline }
.widget .label-info { float: right; }
.widget li.list-group-item {border-radius: 0;border: 0;border-top: 1px solid #ddd;}
.widget li.list-group-item:hover { background-color: rgba(86,61,124,.1); }
.widget .mic-info { color: #666666;font-size: 11px; }
.widget .action { margin-top:5px; }
.widget .comment-text { font-size: 12px; }
.widget .btn-block { border-top-left-radius:0px;border-top-right-radius:0px; }
.oe_section { padding-top:40px; }

View File

@ -0,0 +1,32 @@
openerp.base_calendar = function(instance) {
var _t = instance.web._t;
var QWeb = instance.web.qweb;
instance.base_calendar = {}
instance.sale_quote.quotation = instance.web.Widget.extend({
init: function(parent, db, action, id, view, quotation) {
this._super();
this.db = db;
this.action = action;
this.id = id;
this.view = view;
this.quotation = quotation;
},
start: function() {
var self = this;
self.open_invitation_form(self.quotation);
},
open_quotation : function(quotation){
alert('aaa');
this.$el.html(QWeb.render('quotation_view', {'quotation': JSON.parse(quotation)}));
},
});
instance.sale_quote.view = function (db, action, id, view, quotation) {
instance.session.session_bind(instance.session.origin).done(function () {
new instance.sale_quote.quotation(null,db,action,id,view,quotation).appendTo($("body").addClass('openerp'));
});
}
};
//vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:

View File

@ -0,0 +1,322 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="static_layout">&lt;!DOCTYPE html&gt;
<html t-att-lang="lang.replace('_', '-')"
t-att-data-editable="'1' if editable else None"
t-att-data-translatable="'1' if translatable else None"
t-att-data-view-xmlid="xmlid if editable else None"
t-att-data-main-object="repr(main_object) if editable else None"
t-att-data-report-margin-top="40"
t-att-data-report-innerheight="30">
<head>
<link rel='stylesheet' href='/report/static/src/css/report.css'/>
<t t-if="main_object and 'website_meta_title' in main_object">
<t t-set="title" t-value="main_object.website_meta_title"/>
</t>
<t t-if="not title and main_object and 'name' in main_object">
<t t-set="additional_title" t-value="main_object.name"/>
</t>
<t t-if="not title">
<t t-set="title"><t t-raw="res_company.name"/><t t-if="additional_title"> - <t t-raw="additional_title"/></t></t>
</t>
<title><t t-esc="title"/></title>
<meta name="openerp.company" t-att-value="res_company.name"/>
<meta name="description" t-att-value="main_object and 'website_meta_description' in main_object
and main_object.website_meta_description or website_meta_description"/>
<meta name="keywords" t-att-value="main_object and 'website_meta_keywords' in main_object
and main_object.website_meta_keywords or website_meta_keywords"/>
<!-- Load stylesheets before scripts to avoid blocking -->
<link rel='stylesheet' href='/web/static/lib/fontawesome/css/font-awesome.css'/>
<t t-if="editable">
<link rel='stylesheet' href='/website/static/src/css/snippets.css'/>
<link rel='stylesheet' href='/website/static/src/css/editor.css'/>
<link rel='stylesheet' href='/website/static/lib/bootstrap-tour/bootstrap-tour.css'/>
</t>
<t t-call="website.theme"/>
<script type="text/javascript" src="/web/static/lib/es5-shim/es5-shim.min.js"></script>
<script type="text/javascript" src="/web/static/lib/underscore/underscore.js"></script>
<script type="text/javascript" src="/web/static/lib/underscore.string/lib/underscore.string.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery/jquery.js"></script>
<script type="text/javascript" src="/website/static/lib/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript">
// Bootstrap and jQuery UI conflicts
$.fn.bstooltip = $.fn.tooltip;
$.fn.bsbutton = $.fn.button;
</script>
<script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script>
<script type="text/javascript" src="/web/static/src/js/openerpframework.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/src/js/website.snippets.animation.js"></script>
<t t-if="editable" id="editable_scripts_hook">
<link rel="stylesheet" href="/select2/static/lib/select2/select2.css"/>
<link rel="stylesheet" href="/website/static/lib/select2-bootstrap-css/select2-bootstrap.css"/>
<link rel='stylesheet' href="/web/static/lib/jquery.ui/css/smoothness/jquery-ui-1.9.1.custom.css"/>
<script type="text/javascript" src="/select2/static/lib/select2/select2.js"></script>
<script type="text/javascript" src="/web/static/lib/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/website/static/lib/bootstrap-tour/bootstrap-tour.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/lib/ace/ace.js"></script>
<script type="text/javascript" src="/website/static/lib/vkbeautify/vkbeautify.0.99.00.beta.js"></script>
<script type="text/javascript" src="/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js"></script>
<!-- mutation observers shim backed by mutation events (8 < IE < 11, Safari < 6, FF < 14, Chrome < 17) -->
<script type="text/javascript" src="/website/static/lib//jquery.mjs.nestedSortable/jquery.mjs.nestedSortable.js"></script>
<script type="text/javascript" src="/website/static/lib/MutationObservers/test/sidetable.js"></script>
<script type="text/javascript" src='/website/static/lib/nearest/jquery.nearest.js'></script>
<script type="text/javascript" src="/website/static/lib/MutationObservers/MutationObserver.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.editor.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.menu.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.mobile.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.seo.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.tour.js"></script>
<script type="text/javascript" src="/website/static/src/js/website.tour.banner.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/src/js/website.snippets.editor.js"></script>
<script t-if="not translatable" type="text/javascript" src="/website/static/src/js/website.ace.js"></script>
<script t-if="translatable" type="text/javascript" src="/website/static/src/js/website.translator.js"></script>
</t>
</head>
<body>
<div id="wrapwrap">
<t t-raw="0" />
</div>
</body>
</html>
</template>
<template id="quotation" name="Your Quotation">
<t t-call="website_sale_quote.static_layout">
<div class="col-xs-12 col-md-8 tab-content">
<section id="main" class="tab-pane active oe_section">
<div class="container panel panel-default">
<div class="row panel-body">
<div class="text-center">
<h1>What does Quickstart cover ?</h1>
</div>
<div>
<p class="lead"><small>1. The OpenERP Enterprise Contract (1 year coverage): unlimited bugfix, security alerts, migration</small></p>
<p class="lead"><small>2. The “Get on Board” Hands-on Training (choice between our core modules)</small></p>
<p class="lead"><small>3. On-site consulting (minimum 2 days)</small></p>
</div>
<div class="text-center">
<h1>How does it work?</h1>
</div>
<div>
<p class="lead"><small>1. OpenERP qualifies your main business needs</small></p>
<p class="lead"><small>2. You get a tailored demo</small></p>
<p class="lead"><small>3. We train you on your chosen module
</small></p>
<p class="lead"><small>4. We deploy your chosen module with a dedicated functional consultant</small></p>
<p class="lead"><small>5. We get you involved in the deployment of OpenERP in your company</small></p>
</div>
<p class="lead">
<small>
The QuickStart offer simply enables any SME to start using OpenERP in just a few days. Since we launched this approach, we already deployed 50 customers in production. <a href="http://v6.openerp.com/node/1390">Check out some of the <strong>testimonials</strong>!</a>
</small>
</p>
</div>
</div>
</section>
<section id="quote" class="tab-pane oe_section">
<div class="well">
<div class="row">
<div class="col-xs-6 col-sm-6 col-md-6">
<address>
<strong t-field="quotation.order_id.partner_id.name"/>
<br/>
<t t-esc="quotation.order_id.partner_id.street"/>
<br/>
<t t-esc="quotation.order_id.partner_id.city"/>, <t t-esc="quotation.order_id.partner_id.state_id.name"/> <t t-esc="quotation.order_id.partner_id.zip"/>
<br/>
<abbr title="Phone">P:</abbr> <t t-esc="quotation.order_id.partner_id.phone"/>
</address>
</div>
<div class="col-xs-6 col-sm-6 col-md-6 text-right">
<p>
<em>Date: <t t-esc="quotation.order_id.date_order"/></em>
</p>
<p>
<em>Quotation #: <t t-esc="quotation.order_id.name"/></em>
</p>
</div>
</div>
<div class="row">
<div class="text-center">
<h1>Quotation</h1>
</div>
<table class="table table-hover">
<thead>
<tr>
<th>Product</th>
<th>Description</th>
<th>#</th>
<th class="text-center">Unit Price</th>
<th class="text-center">Subtotal</th>
</tr>
</thead>
<tbody>
<t t-foreach="quotation.order_id.order_line" t-as="line">
<tr>
<td class="col-md-9"><em><t t-esc="line.product_id.name"/></em></td>
<td class="col-md-9"><em><t t-esc="line.name"/></em></td>
<td class="col-md-1" style="text-align: center"><t t-esc="line.product_uom_qty"/></td>
<td class="col-md-1 text-center"><t t-esc="line.price_unit"/></td>
<td class="col-md-1 text-center"><t t-esc="line.price_subtotal"/></td>
</tr>
</t>
<tr>
<td></td>
<td></td>
<td></td>
<td class="text-right">
<p>
<strong>Untaxed Amount: </strong>
</p>
<p>
<strong>Tax: </strong>
</p></td>
<td class="text-center">
<p>
<strong t-field="quotation.order_id.amount_untaxed"
t-field-options='{
"widget": "monetary",
"display_currency": "website.pricelist_id.currency_id"
}'></strong>
</p>
<p>
<!-- <strong><t t-esc="quotation.amount_taxed"/></strong>-->
</p>
</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td class="text-right"><strong>Total: </strong></td>
<td class="text-center text-success">
<strong
t-field="quotation.order_id.amount_total"
t-field-options='{"widget": "monetary",
"display_currency":"website.pricelist_id.currency_id"
}'></strong>
</td>
</tr>
</tbody>
</table>
<div class="text-center">
<a type="submit" t-if="quotation.state != 'accept'" t-href="/quote/#{ quotation.access_token }/accept" class="btn btn-labeled btn-success"><span class="btn-label"><i class="glyphicon glyphicon-ok"></i></span>Accept</a>
<a type="submit" t-if="quotation.state != 'cancel'" t-href="/quote/#{ quotation.access_token }/decline" class="btn btn-labeled btn-danger"><span class="btn-label"><i class="glyphicon glyphicon-remove"></i></span>Decline</a>
</div>
</div>
</div>
</section>
<section id="accouting" class="tab-pane oe_section">
<div class="container">
<div class="text-center">
<h1>What am i looking for ?</h1>
</div>
<div class="media">
<a class="pull-right" href="#">
<img class="media-object" src="/crm/static/description/icon.png" alt="..."/>
</a>
<div class="media-body">
<h4 class="media-heading">Customer Relationship Management</h4>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Manage my leads</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Optimize my Sales Cycle</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Create customize dashboard</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Improve my Sales reporting</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Communicate with customers and colleagues</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Controll and manage my sales forcastes</i></small></p>
</div>
</div>
<div class="media">
<a class="pull-left" href="#">
<img class="media-object" src="/hr_timesheet_sheet/static/description/icon.png" alt="..."/>
</a>
<div class="media-body pull-right">
<h4 class="media-heading">Service Management</h4>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Manage my customer contracts</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Optimize and analyze my time management</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Manage , analysis and trace my issue</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Create customize dashboard</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Perform project management</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Trace my invoices</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Manage my helpdesk</i></small></p>
</div>
</div>
</div>
</section>
<section id="sales" class="tab-pane oe_section">
<div class="container">
<div class="text-center">
<h1>What's in it for me ?</h1>
</div>
<div>
<h4>The OpenERP Enterprise contract(1 year) convering</h4>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Unlimited Bugfix service</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil">"One Click" Update</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Functional Support</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Migration</i></small></p>
<p class="lead"><small><i class="glyphicon glyphicon-pencil"> Online Hosting</i></small></p>
</div>
</div>
</section>
<div class="panel panel-default widget">
<div class="panel-heading">
<span class="glyphicon glyphicon-comment"></span>
<h3 class="panel-title">Recent Comments</h3>
</div>
<div class="panel-body">
<ul class="list-group">
<t t-foreach="quotation.message_ids" t-as="message">
<li class="list-group-item">
<div class="row">
<div class="col-xs-2 col-md-1">
<img t-att-src="'data:image/png;base64,' + message.author_id.image_small" class="img-circle img-responsive" alt="" /></div>
<div class="col-xs-10 col-md-11">
<div>
<a href="http://www.jquery2dotnet.com/2013/10/google-style-login-page-desing-usign.html"/>
<t t-raw="message.body"/>
<div class="mic-info">
By: <a href="#"><t t-esc="message.author_id.name"/></a> on <t t-esc="message.date"/>
</div>
</div>
</div>
</div>
</li>
</t>
</ul>
</div>
</div>
<form id="post" accept-charset="UTF-8" method="POST" t-att-action="'/quote/%%s/post#post' %% quotation.access_token">
<textarea rows="3" id="new_message" name="new_message" placeholder="Your Comment....." class="form-control span7"> </textarea>
<button type="submit" t-att-id="quotation.access_token" class="btn btn-info">Post your Comment</button>
</form>
</div>
<div class="col-xs-6 col-md-4 sidebar oe_section" id="sidebar">
<ul class="nav nav-pills nav-stacked" data-spy="affix">
<li class="active"><a href="#main" data-toggle="tab"><i class="icon-chevron-right"></i> Introduction</a></li>
<li ><a href="#crm" data-toggle="tab"><i class="icon-chevron-right"></i> CRM and Marketing</a></li>
<li><a href="#sales" data-toggle="tab"><i class="icon-chevron-right"></i> Sales and Warehouse</a></li>
<li ><a href="#crm" data-toggle="tab"><i class="icon-chevron-right"></i> Manufacturing</a></li>
<li><a href="#accouting" data-toggle="tab"><i class="icon-chevron-right"></i> Accounting</a></li>
<li><a href="#quote" data-toggle="tab"><i class="icon-chevron-right"></i> Quotation</a></li>
</ul>
</div></t>
</template>
</data>
</openerp>