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.
 
 
 
 
 

102 lines
4.2 KiB

# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Anfas Faisal K (odoo@cybrosys.com)
#
# This program is under the terms of the Odoo Proprietary License v1.0(OPL-1)
# It is forbidden to publish, distribute, sublicense, or sell copies of the
# Software or modified copies of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
###############################################################################
from odoo import api, models
from datetime import datetime, timedelta
class FleetDashboard(models.Model):
"""
Model for the Fleet Dashboard, providing various statistics and data
related to the fleet vehicles, contracts, and invoices.
"""
_name = 'fleet.dashboard'
_description = 'Fleet Dashboard'
@api.model
def get_datas(self):
"""
Retrieves overall statistics related to fleet vehicles, contracts,
and invoices.
"""
total_vehicles = self.env['fleet.vehicle'].search_count([])
operational_vehicles = self.env['fleet.vehicle'].search_count(
[('status', '=', 'operational')])
maintenance_vehicles = self.env['fleet.vehicle'].search_count(
[('status', '=', 'undermaintenance')])
all_invoices = self.env['account.move'].search_count(
[('vehicle_rental_id', '!=', False)])
pending_invoices = self.env['account.move'].search_count([
('vehicle_rental_id', '!=', False),
('state', '=', 'posted'),
('payment_state', '!=', 'paid')
])
total_contracts = self.env['fleet.rental.contract'].search_count([])
total_contract_working = self.env[
'fleet.rental.contract'].search_count(
[('state', '=', 'in_progress')])
total_contract_returned = self.env[
'fleet.rental.contract'].search_count(
[('state', '=', 'return')])
total_contract_cancel = self.env['fleet.rental.contract'].search_count(
[('state', '=', 'cancel')])
return {
'total_vehicles': total_vehicles,
'total_contracts': total_contracts,
'total_contract_working': total_contract_working,
'total_contract_return': total_contract_returned,
'total_contract_cancel': total_contract_cancel,
'operational': operational_vehicles,
'under_maintenance': maintenance_vehicles,
'all_customers': self.env['res.partner'].search_count([]),
'all_invoices': all_invoices,
'pending_invoices': pending_invoices,
}
@api.model
def get_monthly_contract_invoices(self):
"""
Retrieves the count of posted invoices for each month of the
current year related to vehicle rentals.
"""
current_year = datetime.now().year
data = []
labels = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November',
'December']
for month in range(1, 13):
start_date = datetime(current_year, month, 1)
end_date = (start_date + timedelta(days=32)).replace(
day=1) - timedelta(days=1)
invoice_count = self.env['account.move'].search_count([
('vehicle_rental_id', '!=', False),
('invoice_date', '>=', start_date),
('invoice_date', '<=', end_date),
('state', '=', 'posted')
])
data.append(invoice_count)
return {
'labels': labels,
'data': data
}