@ -0,0 +1,19 @@ |
|||
Quotation Revised History v10 |
|||
============================= |
|||
The clients will require negotiations whenever we sent a quotation to them.In such cases we need to edit the |
|||
Quotation's order lines. We have included the 'Revise the Quotation' button for it. The order lines can be edited |
|||
by a click on this button. At the same time a history or copy of the quotation will also be generated automatically. |
|||
We can track the history using the smart buttons. |
|||
Every quotations have a expiration date which we set manually.On configuring the above shown settings we can |
|||
automatically set the expiration date very easily. |
|||
|
|||
Features |
|||
======== |
|||
|
|||
* Retrieve the History of Revised Quotations. |
|||
* Automatically Set Expiration Date For Quotation. |
|||
* Email Template Contains The Expiration Date. |
|||
|
|||
Credits |
|||
======= |
|||
Nikhil Krishnan @ cybrosys, nikhil@cybrosys.in |
@ -0,0 +1,25 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Nikhil krishnan(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import models |
@ -0,0 +1,46 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Nikhil krishnan(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
{ |
|||
'name': 'Quotation Revised History', |
|||
'version': '10.0.1.0.0', |
|||
'summary': """We Can Retrieve the History of Revised Quotations.""", |
|||
'description': """ Negotiations with clients and we resent multiple Quotations, |
|||
This module store the History of Every Quotations""", |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'website': 'http://www.cybrosys.com', |
|||
'category': 'Sales Management', |
|||
'depends': ['sale'], |
|||
'license': 'LGPL-3', |
|||
'data': [ |
|||
'views/quotation_handler.xml', |
|||
'views/sale_config_settings_exp_date_views.xml', |
|||
'data/mail_template_data_exp_date.xml', |
|||
], |
|||
'demo': [], |
|||
'images': ['static/description/banner.jpg'], |
|||
'installable': True, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,63 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<!--Email template --> |
|||
<record id="sale.email_template_edi_sale" model="mail.template"> |
|||
<field name="name">Sales Order - Send by Email</field> |
|||
<field name="email_from">${(object.user_id.email and '%s <%s>' % (object.user_id.name, object.user_id.email) or '')|safe}</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_id.id}</field> |
|||
<field name="model_id" ref="sale.model_sale_order"/> |
|||
<field name="auto_delete" eval="True"/> |
|||
<field name="report_template" ref="sale.report_sale_order"/> |
|||
<field name="report_name">${(object.name or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''}</field> |
|||
<field name="lang">${object.partner_id.lang}</field> |
|||
<field name="body_html"><![CDATA[ |
|||
<p>Dear ${object.partner_id.name} |
|||
% set access_action = object.get_access_action() |
|||
% set doc_name = 'quotation' if object.state in ('draft', 'sent') else 'order confirmation' |
|||
% set is_online = access_action and access_action['type'] == 'ir.actions.act_url' |
|||
% set access_name = is_online and object.template_id and 'Accept and pay %s online' % doc_name or 'View %s' % doc_name |
|||
% set access_url = is_online and access_action['url'] or object.get_signup_url() |
|||
|
|||
% if object.partner_id.parent_id: |
|||
(<i>${object.partner_id.parent_id.name}</i>) |
|||
% endif |
|||
,</p> |
|||
<p> |
|||
Here is your ${doc_name} <strong>${object.name}</strong> |
|||
% if object.origin: |
|||
(with reference: ${object.origin} ) |
|||
% endif |
|||
amounting in <strong>${object.amount_total} ${object.pricelist_id.currency_id.name}</strong> |
|||
from ${object.company_id.name}. |
|||
</p> |
|||
|
|||
<br/><br/> |
|||
% if is_online: |
|||
<center> |
|||
<a href="${access_url}" style="background-color: #1abc9c; padding: 20px; text-decoration: none; color: #fff; border-radius: 5px; font-size: 16px;" class="o_default_snippet_text">${access_name}</a> |
|||
<br/><br/> |
|||
<span style="color:#888888">(or view attached PDF)</span> |
|||
</center> |
|||
<br/> |
|||
% endif |
|||
% if object.state in ('draft', 'sent'): |
|||
% if object.state == "pre" or object.state == "draft" or object.state == "sent" : |
|||
% if object.validity_date: |
|||
<p> Your quotation will expire on <strong>${object.validity_date}</strong>.</p> |
|||
% endif |
|||
% endif |
|||
<p>You can reply to this email if you have any questions.</p> |
|||
|
|||
<p>Thank you,</p> |
|||
|
|||
<p style="color:#eeeeee;"> |
|||
% if object.user_id and object.user_id.signature: |
|||
${object.user_id.signature | safe} |
|||
% endif |
|||
</p> |
|||
]]></field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Nikhil krishnan(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
import sale |
|||
import sale_config_settings_exp_date_views |
@ -0,0 +1,145 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Nikhil krishnan(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from odoo import models, fields, api, _ |
|||
from datetime import timedelta, datetime |
|||
|
|||
|
|||
class SaleOrder(models.Model): |
|||
_inherit = 'sale.order' |
|||
|
|||
name = fields.Char(string='Order Reference', required=True, copy=False, readonly=True, |
|||
index=True, default='New') |
|||
parent_so_id = fields.Many2one('sale.order', 'Parent SO') |
|||
revised_order_count = fields.Integer(string='# of Revised Orders', compute='_revised_count') |
|||
validity_date = fields.Date(string='Expiration Date', readonly=True, states={'draft': [('readonly', False)], |
|||
'pre': [('readonly', False)]}, |
|||
help="Automatically expiration date of your quotation (offer) will set as 14 days " |
|||
"later, or it will set the date automatically based on the settings, We can set " |
|||
"it manually too.") |
|||
|
|||
state = fields.Selection([ |
|||
('pre', 'Revised Quotation'), |
|||
('draft', 'Quotation'), |
|||
('sent', 'Quotation Sent'), |
|||
('revised', 'Revised'), |
|||
('sale', 'Sale Order'), |
|||
('done', 'Done'), |
|||
('cancel', 'Cancelled'), |
|||
], string='Status', readonly=True, copy=False, index=True, track_visibility='onchange', default='draft') |
|||
revision_number = fields.Integer(string='Revision', copy=False, default=1) |
|||
org_name = fields.Char(string='Origin', copy=False) |
|||
|
|||
@api.model |
|||
def create(self, vals): |
|||
date_start = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_start') |
|||
if not date_start: |
|||
if 'validity_date' in vals: |
|||
if vals.get('validity_date'): |
|||
pass |
|||
else: |
|||
date_no = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_no') |
|||
date_today = fields.Date.today() |
|||
date_object = datetime.strptime(date_today, '%Y-%m-%d') |
|||
if not date_no: |
|||
pass |
|||
else: |
|||
v_date = date_object + timedelta(days=date_no) |
|||
vals['validity_date'] = v_date |
|||
|
|||
return super(SaleOrder, self).create(vals) |
|||
|
|||
@api.multi |
|||
def _revised_count(self): |
|||
for sale in self: |
|||
revised_count = sale.search([('parent_so_id', '=', sale.id)]) |
|||
sale.revised_order_count = len(revised_count) |
|||
|
|||
# ********************Overwrite the print button to give expiration date******************** |
|||
@api.multi |
|||
def print_quotation(self): |
|||
is_date = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date') |
|||
date_start = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_start') |
|||
date_no = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_no') |
|||
if is_date: |
|||
if date_start: |
|||
if date_no: |
|||
for doc in self: |
|||
if doc.state in ['pre', 'draft']: |
|||
date_today = fields.Date.today() |
|||
date_object = datetime.strptime(date_today, '%Y-%m-%d') |
|||
v_date = date_object + timedelta(days=date_no) |
|||
doc.validity_date = v_date |
|||
self.filtered(lambda s: s.state == 'pre').write({'state': 'sent'}) |
|||
return super(SaleOrder, self).print_quotation() |
|||
|
|||
@api.multi |
|||
def make_revision(self): |
|||
for rec in self: |
|||
if not rec.org_name: |
|||
namee = rec.name + '/R' + str(rec.revision_number) |
|||
rec.org_name = rec.name |
|||
else: |
|||
namee = rec.org_name + '/R' + str(rec.revision_number) |
|||
if not rec.org_name: |
|||
names = rec.name |
|||
else: |
|||
names = rec.org_name |
|||
vals = { |
|||
'name': names + "-" + str(rec.revision_number), |
|||
'state': 'revised', |
|||
'parent_so_id': rec.id |
|||
} |
|||
new_so_copy = rec.copy(default=vals) |
|||
rec.state = 'pre' |
|||
rec.name = namee |
|||
rec.revision_number += 1 |
|||
date_start = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_start') |
|||
if date_start: |
|||
rec.validity_date = False |
|||
|
|||
|
|||
class MailComposeMessage(models.TransientModel): |
|||
_inherit = 'mail.compose.message' |
|||
|
|||
@api.multi |
|||
def send_mail(self, auto_commit=False): |
|||
if self._context.get('default_model') == 'sale.order' and self._context.get('default_res_id') and self._context.get('mark_so_as_sent'): |
|||
order = self.env['sale.order'].browse([self._context['default_res_id']]) |
|||
# ********************Email Sent action Change the State in pre stage too******************** |
|||
if order.state in ('draft', 'pre'): |
|||
order.state = 'sent' |
|||
date_start = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_start') |
|||
if date_start: |
|||
# ********************Email Sent action Set the Exp Date From settings******************** |
|||
date_no = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date_no') |
|||
date_today = fields.Date.today() |
|||
date_object = datetime.strptime(date_today, '%Y-%m-%d') |
|||
if date_no: |
|||
v_date = date_object + timedelta(days=date_no) |
|||
order.validity_date = v_date |
|||
|
|||
self = self.with_context(mail_post_autofollow=True) |
|||
return super(MailComposeMessage, self).send_mail(auto_commit=auto_commit) |
|||
|
@ -0,0 +1,62 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2017-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Nikhil krishnan(<http://www.cybrosys.com>) |
|||
# you can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. |
|||
# |
|||
# It is forbidden to publish, distribute, sublicense, or sell copies |
|||
# of the Software or modified copies of the Software. |
|||
# |
|||
# 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 |
|||
# GENERAL PUBLIC LICENSE (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from odoo import api, fields, models |
|||
|
|||
|
|||
class SaleConfiguration(models.TransientModel): |
|||
_inherit = 'sale.config.settings' |
|||
|
|||
so_expiration_date = fields.Selection([(0, "No Default Expiration Date"), (1, "Default 14 days"), |
|||
(2, 'Created as company rule')], "Expiration Date", |
|||
help="Allows you to set Expiration Date.") |
|||
so_expiration_date_start = fields.Selection([(0, "Quotation Creation Date"), |
|||
(1, "Quotation Sent Date")], |
|||
"Expiration Date Start from", |
|||
help="Allows you to set Expiration Date Start from.") |
|||
so_expiration_date_no = fields.Integer(string="No.of Days") |
|||
|
|||
@api.multi |
|||
def set_default_so_expiration_date(self): |
|||
return self.env['ir.values'].sudo().set_default( |
|||
'sale.config.settings', 'so_expiration_date', self.so_expiration_date) |
|||
|
|||
@api.multi |
|||
def set_default_so_expiration_date_start(self): |
|||
return self.env['ir.values'].sudo().set_default( |
|||
'sale.config.settings', 'so_expiration_date_start', self.so_expiration_date_start) |
|||
|
|||
@api.multi |
|||
def set_default_so_expiration_date_no(self): |
|||
a = self.env['ir.values'].get_default('sale.config.settings', 'so_expiration_date', self.so_expiration_date) |
|||
if a == 0: |
|||
so_expiration_date_no = False |
|||
elif a == 1: |
|||
so_expiration_date_no = 14 |
|||
else: |
|||
so_expiration_date_no = self.so_expiration_date_no |
|||
return self.env['ir.values'].sudo().set_default( |
|||
'sale.config.settings', 'so_expiration_date_no', so_expiration_date_no) |
|||
|
|||
|
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 10 KiB |
@ -0,0 +1,189 @@ |
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h2 class="oe_slogan">Quotation Revised History</h2> |
|||
<h3 class="oe_slogan">Retrieve the History of Revised Quotations</h3> |
|||
<h4 class="oe_slogan">Author : Cybrosys Techno Solutions , www.cybrosys.com</h4> |
|||
<div> |
|||
<h4><p>Features:</p></h4> |
|||
<ul> |
|||
<li style="list-style:none !important;"><span style="color:green;"> ☑</span> Retrieve the history of revised quotations.</li> |
|||
<li style="list-style:none !important;"><span style="color:green;"> ☑</span> Automatically set expiration date for quotation.</li> |
|||
<li style="list-style:none !important;"><span style="color:green;"> ☑</span> Email template contains the expiration date.</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotation in "Quotation Sent" state</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="sent state.png"> |
|||
</div> |
|||
</div> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
The clients will require negotiations whenever we sent a quotation to them.In such cases we need to edit the Quotation's order lines. |
|||
We have included the 'Revise the Quotation' button for it. The order lines can be edited by a click on this button. |
|||
At the same time a history or copy of the quotation will also be generated automatically.We can track the history using the smart buttons. |
|||
</p> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotation in "Revised Quotation" state</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="revised state.png"> |
|||
</div> |
|||
</div> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
In the Revised Quotation state, we can edit the order lines and resent to the client. |
|||
<p>Quotation Sent ---> Revised Quotation ---> Quotation Sent</p> |
|||
<p>The smart button on the top right of the form will provide the entire revised history of quotation. |
|||
The revised quotation will be indicated by a change in name format as (initial name/R1) in a recurring manner.</p> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span6"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<img src="sent state not editable.png"> |
|||
</div> |
|||
<p class="oe_mt32"> |
|||
<p>In the Quotation Sent state we can't edit the Order lines. When we need to revise just click on |
|||
the "Revise the Quotation" button.</p> |
|||
</p> |
|||
</div> |
|||
<div class="oe_span6"> |
|||
<div class="oe_demo oe_picture oe_screenshot"> |
|||
<img src="editable line.png"> |
|||
</div> |
|||
<p class="oe_mt32"> |
|||
<p>In the Revised Quotation state we can edit the order lines and resend it through mail or |
|||
take print out with new order lines.</p> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotation History</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<p> |
|||
<ul> |
|||
<li>Smart button redirect you to the Quotation History.</li> |
|||
</ul> |
|||
<ul> |
|||
<li>Tree view of the Revised Quotations of the particular parent quotation.</li> |
|||
</ul> |
|||
</p> |
|||
</div> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="revised tree.png"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotation in "Revised" state</h3> |
|||
<div class="oe_row oe_spaced"> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="revised form view.png"> |
|||
</div> |
|||
</div> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
In this state we can't edit anything, it's just for a view. |
|||
</p> |
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotation Email template</h3> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="email template.png"> |
|||
</div> |
|||
</div> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
If we gave expiration date then it will mention in the Email |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container oe_dark"> |
|||
<div class="oe_row oe_spaced"> |
|||
<h3 class="oe_slogan">Quotations & Sales Settings</h3> |
|||
<div class="oe_span12"> |
|||
<div class="oe_row_img oe_centered"> |
|||
<img class="oe_picture oe_screenshot" src="settings.png"> |
|||
</div> |
|||
</div> |
|||
<div class="oe_span12"> |
|||
<p class="oe_mt32"> |
|||
Sales --> Configuration --> Settings ---> Quotations & Sales --> Expiration Date |
|||
</p> |
|||
<p> |
|||
Every quotations have a expiration date which we set manually.On configuring the above shown settings we can |
|||
automatically set the expiration date very easily. |
|||
|
|||
<p>No Expiration date: No changes(we have to set the date manually)</p> |
|||
<p>Default 14 days: The expiration date calculated from Quotation Creation Date or form Quotation Sent Date is set for 14 days.</p> |
|||
<p>Created as company rule: The quotation will expire as per the custom days set by user from Quotation Creation Date or from the Quotation Sent Date . </p> |
|||
</p> |
|||
<p>Expiration Date Calculated From : Choose either of the two, Quotation Creation Date or Quotation Sent Date</p> |
|||
</div> |
|||
</div> |
|||
</section> |
|||
|
|||
<section class="oe_container"> |
|||
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
|||
<div class="oe_slogan" style="margin-top:10px !important;"> |
|||
<div> |
|||
<a class="btn btn-primary btn-lg mt8" |
|||
style="color: #FFFFFF !important;border-radius: 0;" href="http://www.cybrosys.com"><i |
|||
class="fa fa-envelope"></i> Email </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="http://www.cybrosys.com/contact/"><i |
|||
class="fa fa-phone"></i> Contact Us </a> <a |
|||
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
|||
href="http://www.cybrosys.com/odoo-customization-and-installation/"><i |
|||
class="fa fa-check-square"></i> Request Customization </a> |
|||
</div> |
|||
<br> |
|||
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
|||
<div> |
|||
<a href="https://twitter.com/cybrosys" target="_blank"><i class="fa fa-2x fa-twitter" style="color:white;background: #00a0d1;width:35px;"></i></a></td> |
|||
<a href="https://www.linkedin.com/company/cybrosys-technologies-pvt-ltd" target="_blank"><i class="fa fa-2x fa-linkedin" style="color:white;background: #31a3d6;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://www.facebook.com/cybrosystechnologies" target="_blank"><i class="fa fa-2x fa-facebook" style="color:white;background: #3b5998;width:35px;padding-left: 8px;"></i></a></td> |
|||
<a href="https://plus.google.com/106641282743045431892/about" target="_blank"><i class="fa fa-2x fa-google-plus" style="color:white;background: #c53c2c;width:35px;padding-left: 3px;"></i></a></td> |
|||
<a href="https://in.pinterest.com/cybrosys" target="_blank"><i class="fa fa-2x fa-pinterest" style="color:white;background: #ac0f18;width:35px;padding-left: 3px;"></i></a></td> |
|||
</div> |
|||
</div> |
|||
</section> |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 70 KiB |
@ -0,0 +1,112 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="act_sale_order_2_revised" model="ir.actions.act_window"> |
|||
<field name="name">Revised Quotation Orders</field> |
|||
<field name="res_model">sale.order</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="view_id" ref="sale.view_quotation_tree"/> |
|||
<field name="domain">[('parent_so_id', '=', active_id)]</field> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Revised order against this Quotation Order. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<!--In sale order menu, we need to avoid the 'revised' state orders. --> |
|||
|
|||
<record id="sale.action_orders" model="ir.actions.act_window"> |
|||
<field name="name">Sales Orders</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">sale.order</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_mode">tree,kanban,form,calendar,pivot,graph</field> |
|||
<field name="search_view_id" ref="sale.sale_order_view_search_inherit_sale"/> |
|||
<field name="context">{}</field> |
|||
<field name="domain">[('state', 'not in', ('draft','revised','sent', 'cancel'))]</field> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Create a Quotation, the first step of a new sale. |
|||
</p><p> |
|||
Once the quotation is confirmed, it becomes a sales order. |
|||
You'll be able to invoice it and collect payments. |
|||
From the <i>Sales Orders</i> menu, you can track delivery |
|||
orders or services. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="sale.action_quotations" model="ir.actions.act_window"> |
|||
<field name="name">Quotations</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">sale.order</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_id" ref="sale.view_quotation_tree"/> |
|||
<field name="view_mode">tree,kanban,form,calendar,pivot,graph</field> |
|||
<field name="context">{}</field> |
|||
<field name="domain">[('state','in',('pre','draft','sent','cancel'))]</field> |
|||
<field name="search_view_id" ref="sale.view_sales_order_filter"/> |
|||
<field name="help" type="html"> |
|||
<p class="oe_view_nocontent_create"> |
|||
Create a Quotation, the first step of a new sale. |
|||
</p><p> |
|||
Your next actions should flow efficiently: confirm the Quotation |
|||
to a Sale Order, then create the Invoice and collect the Payment. |
|||
</p><p> |
|||
Note that once a Quotation becomes a Sale Order, it will be moved |
|||
from the Quotations list to the Sales Order list. |
|||
</p> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_order_form_revised" model="ir.ui.view"> |
|||
<field name="name">sale.order.form</field> |
|||
<field name="model">sale.order</field> |
|||
<field name="inherit_id" ref="sale.view_order_form" /> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//button[@name='action_confirm']" position="after"> |
|||
<button name="make_revision" string="Revise the Quotation" type="object" states="sent" class="btn-primary"/> |
|||
<button name="action_quotation_send" string="Send by Email" type="object" states="pre" class="btn-primary"/> |
|||
<button name="print_quotation" string="Print" type="object" states="pre" class="btn-primary"/> |
|||
<button name="action_cancel" states="pre" type="object" string="Cancel"/> |
|||
</xpath> |
|||
|
|||
<xpath expr="//div[@name='button_box']" position="inside"> |
|||
<button class="oe_inline oe_stat_button" type="action" name="%(act_sale_order_2_revised)d" |
|||
icon="fa-bars" attrs="{'invisible':[('state','in',[('draft','revised')]}"> |
|||
<field string="Revised Quotation Orders" name="revised_order_count" widget="statinfo"/> |
|||
</button> |
|||
</xpath> |
|||
|
|||
<xpath expr="//field[@name='order_line']" position="attributes"> |
|||
<attribute name="attrs">{'readonly': [('state', 'in', ('sent','revised','done','cancel'))]}</attribute> |
|||
</xpath> |
|||
|
|||
<xpath expr="//field[@name='payment_term_id']" position="attributes"> |
|||
<attribute name="attrs">{'readonly': [('state', 'in', ('sent','revised','done','cancel'))]}</attribute> |
|||
</xpath> |
|||
|
|||
<xpath expr="//field[@name='user_id']" position="attributes"> |
|||
<attribute name="attrs">{'readonly': [('state', 'in', ('sent','revised','done','cancel'))]}</attribute> |
|||
</xpath> |
|||
|
|||
<xpath expr="//field[@name='team_id']" position="attributes"> |
|||
<attribute name="attrs">{'readonly': [('state', 'in', ('sent','revised','done','cancel'))]}</attribute> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_quotation_handler_tree" model="ir.ui.view"> |
|||
<field name="name">sale.order.tree</field> |
|||
<field name="model">sale.order</field> |
|||
<field name="inherit_id" ref="sale.view_quotation_tree" /> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//field[@name='state']" position="replace"> |
|||
<field name="state"/> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,29 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="view_sales_config_revised_quotation" model="ir.ui.view"> |
|||
<field name="name">sale settings</field> |
|||
<field name="model">sale.config.settings</field> |
|||
<field name="inherit_id" ref="sale.view_sales_config"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//div/group/field[@name='auto_done_setting']" position="after"> |
|||
<label for="so_expiration_date" string="Expiration Date"/> |
|||
<div> |
|||
<field name="so_expiration_date" widget="radio" /> |
|||
<div attrs="{'invisible': [('so_expiration_date', 'not in', [2])]}"> |
|||
<field name="so_expiration_date_no" class="oe_inline"/> |
|||
<label for="so_expiration_date_no" string="Days"/> |
|||
</div> |
|||
</div> |
|||
<label for="so_expiration_date_start" string="Expiration Date Calculated From" |
|||
attrs="{'invisible': [('so_expiration_date', 'not in', [1,2])]}"/> |
|||
<div> |
|||
<div attrs="{'invisible': [('so_expiration_date', 'not in', [1,2])]}"> |
|||
<field name="so_expiration_date_start" widget="radio"/> |
|||
</div> |
|||
</div> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |