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) | |
| 
 | |
| 
 |