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.
		
		
		
		
		
			
		
			
				
					
					
						
							252 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							252 lines
						
					
					
						
							13 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Yadhukrishnan K (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/>. | |
| ################################################################################ | |
| from datetime import date, timedelta | |
| from odoo import api, models | |
| 
 | |
| 
 | |
| class FleetVehicle(models.Model): | |
|     """ | |
|     The FleetVehicle class provides the data to the js when the dashboard is | |
|     loaded. | |
|         Methods: | |
|             get_tiles_data(self): | |
|                 when the page is loaded get the data from different models and | |
|                 transfer to the js file. | |
|                 return a dictionary variable. | |
|             get_graph_data(self, month, flag, model_ids): | |
|                 month and flag are Integer variables and model_ids is object. | |
|                 In this methode getting data to the corresponding month from the | |
|                 model_ids and return | |
|                 it to the get_tiles_data methode. return a list variable. | |
|     """ | |
|     _inherit = 'fleet.vehicle' | |
| 
 | |
|     @api.model | |
|     def get_tiles_data(self): | |
|         """ | |
|         Summary: | |
|             when the page is loaded get the data from different models and | |
|             transfer to the js file. | |
|             return a dictionary variable. | |
|         return: | |
|             type:It is a dictionary variable. This dictionary contain data that | |
|             affecting the dashboard view. | |
|         """ | |
|         # Checking login user is manager or not. | |
|         if self.env.user.user_has_groups('fleet.fleet_group_manager'): | |
|             flag = 1 | |
|             fleet_vehicle_odometer_ids = self.env[ | |
|                 'fleet.vehicle.odometer'].search([]) | |
|             fleet_vehicle_log_services_ids = self.env[ | |
|                 'fleet.vehicle.log.services'].search([]) | |
|             service_type_list = [['Service Type', 'Total Repair']] | |
|             # Getting service type and it's total services. | |
|             for fleet_service_type_id in self.env['fleet.service.type'].search([]): | |
|                 service_types_list = [fleet_service_type_id.name, | |
|                                       self.env['fleet.vehicle.log.services'] | |
|                                       .search_count([('service_type_id', '=', | |
|                                                       fleet_service_type_id.id)])] | |
|                 if service_types_list not in service_type_list: | |
|                     service_type_list.append(service_types_list) | |
|             fleet_vehicle_log_contract_ids = self.env[ | |
|                 'fleet.vehicle.log.contract'].search([]) | |
|             filtered_fleet_vehicle_log_contract_ids = \ | |
|                 fleet_vehicle_log_contract_ids.filtered( | |
|                     lambda fleet_vehicle_log_contract_id: | |
|                     fleet_vehicle_log_contract_id.state not in [ | |
|                         'expired', | |
|                         'closed']) | |
|             fleet_model_list = [fleet_vehicle_id.model_id.id for | |
|                                 fleet_vehicle_id in self.env | |
|                                 ['fleet.vehicle'].search([])] | |
|             fleet_model_list = [fleet_model for n, fleet_model in | |
|                                 enumerate(fleet_model_list) if | |
|                                 fleet_model not in fleet_model_list[:n]] | |
|             fleet_manufacture_list = [fleet_vehicle_id.model_id.brand_id.id for | |
|                                       fleet_vehicle_id in | |
|                                       self.env['fleet.vehicle'].search([])] | |
|             fleet_manufacture_list = [fleet_manufacture for n, fleet_manufacture | |
|                                       in enumerate(fleet_manufacture_list) if | |
|                                       fleet_manufacture not in | |
|                                       fleet_manufacture_list[:n]] | |
|             return { | |
|                 'total_odometer': sum( | |
|                     fleet_vehicle_odometer_ids.mapped('value')), | |
|                 'service_cost': sum( | |
|                     fleet_vehicle_log_services_ids.mapped('amount')), | |
|                 'recurring_cost': sum( | |
|                     filtered_fleet_vehicle_log_contract_ids.mapped( | |
|                         'cost_generated')), | |
|                 'all_vehicles': self.env['fleet.vehicle'].search_count([]), | |
|                 'service_type': service_type_list, | |
|                 'service_cost_list': self.get_graph_data(6, 1, self.env[ | |
|                     'fleet.vehicle.log.services'].search([])), | |
|                 'odometer_value_list': self.get_graph_data(13, 0, | |
|                                                            fleet_vehicle_odometer_ids), | |
|                 'fleet_state': [{'state': fleet_vehicle_state_id.name, | |
|                                  'number': self.env[ | |
|                                      'fleet.vehicle'].search_count( | |
|                                      [('state_id', '=', | |
|                                        fleet_vehicle_state_id.id)])} | |
|                                 for fleet_vehicle_state_id in | |
|                                 self.env['fleet.vehicle.state'].search( | |
|                                     [])], | |
|                 'admin_odometer_list': [fleet_vehicle_odometer_id.id | |
|                                         for fleet_vehicle_odometer_id in | |
|                                         fleet_vehicle_odometer_ids], | |
|                 'admin_fleet_cost_list': [fleet_vehicle_log_services_id.id for | |
|                                           fleet_vehicle_log_services_id in | |
|                                           fleet_vehicle_log_services_ids], | |
|                 'admin_recurring_list': [fleet_vehicle_log_contract_id.id for | |
|                                          fleet_vehicle_log_contract_id in | |
|                                          fleet_vehicle_log_contract_ids if | |
|                                          fleet_vehicle_log_contract_id.state not in [ | |
|                                              'expired', | |
|                                              'closed']], | |
|                 'fleet_vehicle_list': [fleet_vehicle_id.id for fleet_vehicle_id | |
|                                        in | |
|                                        self.env['fleet.vehicle'].search([])], | |
|                 'fleet_model_list': fleet_model_list, | |
|                 'fleet_manufacture_list': fleet_manufacture_list, | |
|                 'flag': flag, | |
|             } | |
|         else: | |
|             flag = 0 | |
|             fleet_vehicle_odometer_ids = self.env[ | |
|                 'fleet.vehicle.odometer'].search( | |
|                 [('vehicle_id.manager_id.id', '=', self.env.uid)]) | |
|             # Getting total odometer value. | |
|             fleet_vehicle_log_services_ids = self.env[ | |
|                 'fleet.vehicle.log.services'].search( | |
|                 [('vehicle_id.manager_id.id', '=', self.env.uid)]) | |
|             # Getting total service cost. | |
|             service_type_list = [['Service Type', 'Total Repair']] | |
|             # Getting service type and it's total services. | |
|             for fleet_service_type_id in self.env['fleet.service.type'].search( | |
|                     []): | |
|                 service_types_list = [fleet_service_type_id.name, | |
|                                       self.env['fleet.vehicle.log.services']. | |
|                                       search_count( | |
|                                           [('service_type_id', '=', | |
|                                             fleet_service_type_id.id), | |
|                                            ('vehicle_id.manager_id.id', '=', | |
|                                             self.env.uid)])] | |
|                 if service_types_list not in service_type_list: | |
|                     service_type_list.append(service_types_list) | |
|             fleet_vehicle_log_contract_ids = self.env[ | |
|                 'fleet.vehicle.log.contract'].search([]) | |
|             filtered_fleet_vehicle_log_contract_ids = \ | |
|                 fleet_vehicle_log_contract_ids.filtered( | |
|                     lambda fleet_vehicle_log_contract_id: | |
|                     fleet_vehicle_log_contract_id.state not in [ | |
|                         'expired', | |
|                         'closed']) | |
|             fleet_vehicle_ids = self.env['fleet.vehicle'].search([]) | |
|             # Getting vehicle status and total number vehicles for the | |
|             # Corresponding state. | |
|             model_list = [fleet_vehicle_id.model_id.id for fleet_vehicle_id in | |
|                           fleet_vehicle_ids] | |
|             model_list = [model for n, model in enumerate(model_list) if | |
|                           model not in model_list[:n]] | |
|             manufacture_list = [fleet_vehicle_id.model_id.brand_id.id for | |
|                                 fleet_vehicle_id in fleet_vehicle_ids] | |
|             manufacture_list = [manufacture for n, manufacture in | |
|                                 enumerate(manufacture_list) if | |
|                                 manufacture not in manufacture_list[:n]] | |
|             return { | |
|                 'total_odometer': sum( | |
|                     fleet_vehicle_odometer_ids.mapped('value')), | |
|                 'service_cost': sum( | |
|                     fleet_vehicle_log_services_ids.mapped('amount')), | |
|                 'recurring_cost': sum( | |
|                     filtered_fleet_vehicle_log_contract_ids.mapped( | |
|                         'cost_generated')), | |
|                 'all_vehicles':  self.env['fleet.vehicle'].search_count([]), | |
|                 'service_type': service_type_list, | |
|                 'service_cost_list': self.get_graph_data(6, 1, self.env[ | |
|                     'fleet.vehicle.log.services'].search( | |
|                     [('vehicle_id.manager_id.id', '=', self.env.uid)])), | |
|                 'odometer_value_list': self.get_graph_data(13, 0, | |
|                                                            fleet_vehicle_odometer_ids), | |
|                 'fleet_state': [{'state': fleet_vehicle_state_id.name, | |
|                                  'number': self.env['fleet.vehicle'].search_count( | |
|                                          [('state_id', '=', | |
|                                            fleet_vehicle_state_id.id)])} | |
|                                 for fleet_vehicle_state_id in | |
|                                 self.env['fleet.vehicle.state'].search( | |
|                                     [])], | |
|                 'flag': flag, | |
|                 'model_list': model_list, | |
|                 'manufacture_list': manufacture_list | |
|             } | |
| 
 | |
|     def get_graph_data(self, month, flag, model_ids): | |
|         """ | |
|         summary: | |
|             In this meth ode getting data to the corresponding month from the | |
|             model_ids and return | |
|             it to the get_tiles_data methode. | |
|         Args: | |
|             month(int): This parameter used to calculate the month range. | |
|             flag(int): This parameter used to differentiate the need and | |
|             performing different functions. | |
|             model_ids(obj): This parameter used to identify the model to | |
|             performs the function. | |
|         Returns: | |
|             type:list of lists , it contains the data for the corresponding | |
|             month. | |
|         """ | |
|         data_list = [['Month', '']] | |
|         # Getting last "month" range | |
|         for i in range(0, month): | |
|             previous_month = date.today().replace(day=5) - timedelta( | |
|                 days=i * 30) | |
|             first_day_of_previous_month = previous_month.replace(day=1) | |
|             last_day_of_previous_month = previous_month.replace( | |
|                 day=1) + timedelta(days=32) | |
|             last_day_of_previous_month = last_day_of_previous_month.replace( | |
|                 day=1) - timedelta(days=1) | |
|             monthly_service_cost = 0 | |
|             if flag == 1: | |
|                 # Getting data to the corresponding month and append to | |
|                 # The data_list | |
|                 for fleet_vehicle_log_services_id in model_ids: | |
|                     if first_day_of_previous_month < \ | |
|                             fleet_vehicle_log_services_id.date < \ | |
|                             last_day_of_previous_month: | |
|                         monthly_service_cost += \ | |
|                             fleet_vehicle_log_services_id.amount | |
|                 data_list.append([ | |
|                     previous_month.strftime("%b"), monthly_service_cost | |
|                 ]) | |
|             else: | |
|                 # Getting data to the corresponding month and append to the | |
|                 # data_list | |
|                 monthly_odometer_value = 0 | |
|                 for fleet_vehicle_odometer_id in model_ids: | |
|                     if first_day_of_previous_month < \ | |
|                             fleet_vehicle_odometer_id.date < \ | |
|                             last_day_of_previous_month: | |
|                         monthly_odometer_value += \ | |
|                             fleet_vehicle_odometer_id.value | |
|                 data_list.append( | |
|                     [previous_month.strftime("%b-%y"), monthly_odometer_value]) | |
|         return data_list
 | |
| 
 |