[ADD]: Quote roller module
bzr revid: aja@tinyerp.com-20131202123437-zn6u2ckxbid3jknb
This commit is contained in:
parent
b6cb210865
commit
3e5ae00690
|
@ -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))
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
import controllers
|
||||
import models
|
|
@ -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,
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
import main
|
||||
|
||||
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -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)
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
import order
|
|
@ -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
|
|
@ -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>
|
|
@ -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 |
|
@ -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; }
|
|
@ -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:
|
|
@ -0,0 +1,322 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<template id="static_layout"><!DOCTYPE html>
|
||||
<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>
|
Loading…
Reference in New Issue