You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							145 lines
						
					
					
						
							6.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							145 lines
						
					
					
						
							6.7 KiB
						
					
					
				
								# -*- 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)
							 | 
						|
								
							 | 
						|
								
							 |