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.
		
		
		
		
		
			
		
			
				
					
					
						
							262 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							262 lines
						
					
					
						
							11 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Mohamed Muzammil VP (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    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 (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################### | |
| import datetime | |
| import calendar | |
| from odoo import api, fields, models | |
| 
 | |
| 
 | |
| class PurchaseOrder(models.Model): | |
|     """ Inherit purchase.order model and add fields and methods """ | |
|     _inherit = 'purchase.order' | |
| 
 | |
|     requisition_order = fields.Char( | |
|         string='Requisition Order', help='Requisition Order' | |
|     ) | |
|     company_currency_amount = fields.Float( | |
|         string='Company Currency Total', compute='_compute_amount', | |
|         help="Total amount in company currency" | |
|     ) | |
|     number_to_words = fields.Char( | |
|         string="Amount in Words (Total) : ", | |
|         compute='_compute_number_to_words', help="Total amount in words" | |
|     ) | |
| 
 | |
|     def _compute_amount(self): | |
|         """Total amount in company currency""" | |
|         for amount in self: | |
|             amount.company_currency_amount = self.env['res.currency']._compute( | |
|                 amount.currency_id, amount.company_id.currency_id, | |
|                 amount.amount_total) | |
| 
 | |
|     def _compute_number_to_words(self): | |
|         """Compute the amount to words in Purchase Order""" | |
|         for rec in self: | |
|             rec.number_to_words = rec.currency_id.amount_to_text( | |
|                 rec.amount_total) | |
| 
 | |
|     def action_multi_confirm(self): | |
|         """Confirm multiple order by a single click""" | |
|         for order in self.env['purchase.order'].browse( | |
|                 self.env.context.get('active_ids')).filtered( | |
|             lambda o: o.state in ['draft', 'sent']): | |
|             order.button_confirm() | |
| 
 | |
|     def action_multi_cancel(self): | |
|         """Cancel multiple order by a single click""" | |
|         for order in self.env['purchase.order'].browse( | |
|                 self.env.context.get('active_ids')): | |
|             order.button_cancel() | |
| 
 | |
|     def button_confirm(self): | |
|         """The same order line merges when the confirmation button is | |
|          clicked""" | |
|         line_groups = {} | |
|         for line in self.order_line: | |
|             key = (line.product_id.id, line.price_unit) | |
|             line_groups.setdefault(key, []).append(line) | |
|         for lines in line_groups.values(): | |
|             if len(lines) > 1: | |
|                 lines[0].product_qty = sum(line.product_qty for line in lines) | |
|                 lines[0]._compute_amount() | |
|                 for line in lines[1:]: | |
|                     line.unlink() | |
|         res = super(PurchaseOrder, self).button_confirm() | |
|         return res | |
| 
 | |
|     @api.onchange('partner_id') | |
|     def _recompute_discount(self): | |
|         """Calculate the discount""" | |
|         self.order_line.calculate_discount_percentage() | |
| 
 | |
|     @api.model | |
|     def get_data(self): | |
|         """Get various counts and total amounts related to different states | |
|          of purchase-related records.""" | |
|         return{ | |
|             'rfq': self.search_count([('state', '=', 'draft')]), | |
|             'rfq_sent': self.search_count([('state', '=', 'sent')]), | |
|             'rfq_to_approve': self.search_count([('state', '=', 'to approve')]), | |
|             'purchase_order': self.search_count([('state', '=', 'purchase')]), | |
|             'cancelled_order': self.search_count([('state', '=', 'cancel')]), | |
|             'amount_total': sum(self.search([ | |
|                 ('state', '=', 'purchase')]).mapped('amount_total')), | |
|             'amount_rfq': sum(self.search([ | |
|                 ('state', '=', 'draft')]).mapped('amount_total')), | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_value(self, start_date, end_date): | |
|         """It is to pass values according to start and end date to the | |
|         dashboard.""" | |
|         if start_date and end_date: | |
|             rfq = self.search_count( | |
|                 [('state', '=', 'draft'), ('date_order', '>=', start_date), | |
|                  ('date_order', '<=', end_date)]) | |
|             rfq_sent = self.search_count( | |
|                 [('state', '=', 'sent'), ('date_order', '>=', start_date), | |
|                  ('date_order', '<=', end_date)]) | |
|             rfq_to_approve = self.search_count( | |
|                 [('state', '=', 'to approve'), | |
|                  ('date_order', '>=', start_date), | |
|                  ('date_order', '<=', end_date)]) | |
|             purchase_order = self.search_count( | |
|                 [('state', '=', 'purchase'), ('date_order', '>=', start_date), | |
|                  ('date_order', '<=', end_date)]) | |
|             cancelled_order = self.search_count( | |
|                 [('state', '=', 'cancel'), ('date_order', '>=', start_date), | |
|                  ('date_order', '<=', end_date)]) | |
|             amount_total = sum(self.search([ | |
|                 ('state', '=', 'purchase'), ('date_order', '>=', start_date), | |
|                 ('date_order', '<=', end_date)]).mapped('amount_total')) | |
|             amount_rfq = sum(self.search([ | |
|                 ('state', '=', 'draft'), ('date_order', '>=', start_date), | |
|                 ('date_order', '<=', end_date)]).mapped('amount_total')) | |
|         elif start_date: | |
|             rfq = self.search_count([('state', '=', 'draft'), | |
|                                      ('date_order', '>=', start_date)]) | |
|             rfq_sent = self.search_count([('state', '=', 'sent'), | |
|                                           ('date_order', '>=', start_date)]) | |
|             rfq_to_approve = self.search_count( | |
|                 [('state', '=', 'to approve'), | |
|                  ('date_order', '>=', start_date), | |
|                  ]) | |
|             purchase_order = self.search_count( | |
|                 [('state', '=', 'purchase'), ('date_order', '>=', start_date)]) | |
|             cancelled_order = self.search_count( | |
|                 [('state', '=', 'cancel'), ('date_order', '>=', start_date)]) | |
|             amount_total = sum(self.search([ | |
|                 ('state', '=', 'purchase'), ('date_order', '>=', start_date) | |
|             ]).mapped('amount_total')) | |
|             amount_rfq = sum(self.search([ | |
|                 ('state', '=', 'draft'), ('date_order', '>=', start_date) | |
|             ]).mapped('amount_total')) | |
|         elif end_date: | |
|             rfq = self.search_count( | |
|                 [('state', '=', 'draft'), ('date_order', '<=', end_date)]) | |
|             rfq_sent = self.search_count( | |
|                 [('state', '=', 'sent'), | |
|                  ('date_order', '<=', end_date)]) | |
|             rfq_to_approve = self.search_count( | |
|                 [('state', '=', 'to approve'), | |
|                  ('date_order', '<=', end_date), | |
|                  ]) | |
|             purchase_order = self.search_count( | |
|                 [('state', '=', 'purchase'), ('date_order', '<=', end_date)]) | |
|             cancelled_order = self.search_count( | |
|                 [('state', '=', 'cancel'), ('date_order', '<=', end_date)]) | |
|             amount_total = sum(self.search([ | |
|                 ('state', '=', 'purchase'), ('date_order', '<=', end_date) | |
|             ]).mapped('amount_total')) | |
|             amount_rfq = sum(self.search([ | |
|                 ('state', '=', 'draft'), ('date_order', '>=', start_date) | |
|             ]).mapped('amount_total')) | |
|         return { | |
|             'rfq': rfq, | |
|             'rfq_sent': rfq_sent, | |
|             'rfq_to_approve': rfq_to_approve, | |
|             'purchase_order': purchase_order, | |
|             'cancelled_order': cancelled_order, | |
|             'amount_total': amount_total, | |
|             'amount_rfq': amount_rfq, | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_current_month_purchase(self): | |
|         """Returns current month purchase""" | |
|         date = fields.Datetime.today() | |
|         start_date = datetime.datetime(date.year, date.month, 1) | |
|         purchase_order = self.search_count( | |
|             [('create_date', '<', date), ('create_date', '>', start_date), | |
|              ('state', '=', 'purchase')] | |
|         ) | |
|         current_month_count = { | |
|             calendar.month_name[date.month]: purchase_order | |
|         } | |
|         return{ | |
|             'current_month_count': current_month_count | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_monthly_purchase_order(self): | |
|         """Returns monthly purchase count data to the graph of dashboard""" | |
|         monthly_purchase = {} | |
|         purchase_order = self.search([('state', '=', 'purchase')]) | |
|         lst = [rec.create_date.month for rec in purchase_order] | |
|         for i in range(1, 13): | |
|             count = lst.count(i) | |
|             monthly_purchase.update({ | |
|                 calendar.month_name[i]: count | |
|             }) | |
|         return { | |
|             'monthly_purchase_count': monthly_purchase, | |
|         } | |
| 
 | |
|     @api.model | |
|     def get_monthly_order(self): | |
|         """Returns complete monthly data includes rfq, purchase order, | |
|         canceled order,to approve order etc. of to the graph of dashboard""" | |
|         monthly_count = {} | |
|         purchase_order = self.search([]) | |
|         lst = [rec.create_date.month for rec in purchase_order] | |
|         for i in range(1, 13): | |
|             count = lst.count(i) | |
|             monthly_count.update({ | |
|                 calendar.month_name[i]: count | |
|             }) | |
|         return { | |
|             'monthly_count': monthly_count, | |
|         } | |
| 
 | |
|     @api.model | |
|     def total_amount_spend(self): | |
|         """Returns total amount spend for purchase""" | |
|         total_amount = sum(self.search([ | |
|             ('state', '=', 'purchase')]).mapped('amount_total')) | |
|         return { | |
|             'amount_total': total_amount | |
|         } | |
| 
 | |
|     def recommendation_wizard(self): | |
|         """Add data to wizard""" | |
|         orders = self.search([('partner_id', '=', self.partner_id.id)]) | |
|         pro_id = [] | |
|         for order in orders: | |
|             for product in order.order_line.product_id: | |
|                 val = (0, 0, { | |
|                     'product_id': product.id, | |
|                     'available_qty': product.qty_available, | |
|                     'list_price': product.list_price, | |
|                     'qty_need': 0, | |
|                     'is_modified': False, | |
|                 }) | |
|                 if val not in pro_id: | |
|                     pro_id.append(val) | |
|             res = { | |
|                 'type': 'ir.actions.act_window', | |
|                 'view_mode': 'form', | |
|                 'res_model': 'product.recommendation', | |
|                 'target': 'new', | |
|                 'context': { | |
|                     'default_line_ids': pro_id, | |
|                 } | |
|             } | |
|         return res
 | |
| 
 |