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.
 
 
 
 
 

273 lines
11 KiB

# -*- coding: utf-8 -*-
##############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Aysha Shalin (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 dateutil.relativedelta import relativedelta
from odoo import api, fields, models
class WorkersDetails(models.Model):
""" Class to create workers """
_name = "workers.details"
_description = "Workers"
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string="Name", required=True, help="Field to type name")
skill_ids = fields.Many2many('skill.details', string="Skills",
help="Field to choose skills of worker")
related_partner_id = fields.Many2one('res.partner',
string="Related Partner",
readonly=True,
help="Field represent the related "
"partner")
wage = fields.Monetary(string="Wage per Day",
help="Field to give wage of worker")
rate = fields.Monetary(string="Rate per Day",
help="Field to give rate of worker")
phone_number = fields.Char(string="Phone Number",
help="Field to give address of worker")
email = fields.Char(string="Email", help="Field to give email of worker")
currency_id = fields.Many2one('res.currency',
string='Currency', help="Currency",
related='company_id.currency_id')
company_id = fields.Many2one('res.company', string='Company',
required=True, help="Company",
default=lambda self: self.env.company)
image_worker = fields.Binary(string="Image",
help="Field to give image of worker")
state = fields.Selection(
[('available', 'Available'),
('not_available', 'Not Available')], default="available",
string="State", help="Field to specify state of worker")
@api.model
def create(self, vals):
""" Function to created related partner """
partner = self.env['res.partner'].create({
'name': vals['name'],
'phone': vals['phone_number'],
'email': vals['email'],
'image_1920': vals['image_worker'],
})
vals['related_partner_id'] = partner.id
self.related_partner_id = vals['related_partner_id']
return super(WorkersDetails, self).create(vals)
@api.model
def get_labour_supply_details(self):
""" Function to get the number of ongoing contract for dashboard """
labour_supply_ongoing = self.env['labour.supply'].search_count(
[('from_date', '<=', fields.Date.today()),
('to_date', '>=', fields.Date.today()),
('state', '=', 'invoiced'),
('company_id', '=', self.env.company.id)])
return {'ongoing_contract': labour_supply_ongoing}
@api.model
def get_workers_count(self):
""" Function to get the number of workers for dashboard """
state = []
count = []
workers = self.env['workers.details'].search(
[('company_id', '=', self.env.company.id)])
not_available_labour = workers.filtered(
lambda record: record.state == 'not_available')
state.append("Not Available")
count.append(len(not_available_labour))
available_labour = workers.filtered(
lambda record: record.state == 'available')
state.append("Available")
count.append(len(available_labour))
values = {
'state': state,
'count': count,
}
return values
@api.model
def get_top_customer(self):
""" Function to fetch top ten customer for dashboard """
query = (
'select res_partner.id,res_partner.name,'
'res_partner.email,count(labour_supply.company_id)\n'
' from labour_supply\n'
' inner join res_partner on '
'res_partner.id=labour_supply.customer_id')
query += f" where labour_supply.company_id = {self.env.company.id:d} "
query += """group by res_partner.id order by count desc limit 10"""
self.env.cr.execute(query)
datas = self.env.cr.dictfetchall()
return {'customer': datas}
@api.model
def get_skills_available(self):
""" Function to get skill available for dashboard """
query = """select name,company_id from skill_details"""
query += f" where skill_details.company_id = {self.env.company.id:d} "
query += """limit 10"""
self.env.cr.execute(query)
datas = self.env.cr.dictfetchall()
return {'skill': datas}
@api.model
def get_workers_available(self):
""" Function to get the number of workers for dashboard """
query = """select * from workers_details
where state ='available'"""
query += f" and workers_details.company_id = {self.env.company.id:d} "
query += """limit 10"""
self.env.cr.execute(query)
datas = self.env.cr.dictfetchall()
return {'workers': datas}
@api.model
def get_total_invoiced_amount(self):
""" Function to get the number of contract on the basis of customer and
state for dashboard. """
labour_supply_ongoing = self.env['labour.supply'].search(
[('state', '=', 'invoiced'),
('company_id', '=', self.env.user.company_id.id)])
invoiced_amount = 0
for contract in labour_supply_ongoing:
invoiced_amount = invoiced_amount + contract.total_amount
return {'invoiced_amount': invoiced_amount}
@api.model
def get_expected_amount(self):
""" Function to get expecting amount """
labour_supply_ongoing = self.env['labour.supply'].search(
[('state', 'not in', ['ready', 'expired', 'draft'])])
expected_amount = 0
for contract in labour_supply_ongoing:
expected_amount = expected_amount + contract.total_amount
return {'expected_amount': expected_amount}
@api.model
def get_contract_count_state(self):
""" Function to get the number of contract on the basis of customer and
state for dashboard initially. """
state = []
count = []
labour_supply = self.env['labour.supply'].search(
[('company_id', '=', self.env.company.id)])
labour_supply_draft = labour_supply.filtered(
lambda record: record.state == 'draft')
state.append("Draft")
count.append(len(labour_supply_draft))
labour_supply_ready = labour_supply.filtered(
lambda record: record.state == 'ready')
state.append("Ready")
count.append(len(labour_supply_ready))
labour_supply_confirm = labour_supply.filtered(
lambda record: record.state == 'confirm')
state.append("Confirm")
count.append(len(labour_supply_confirm))
labour_supply_invoiced = labour_supply.filtered(
lambda record: record.state == 'invoiced')
state.append("Invoiced")
count.append(len(labour_supply_invoiced))
labour_supply_expired = labour_supply.filtered(
lambda record: record.state == 'expired')
state.append("Expired")
count.append(len(labour_supply_expired))
labour_supply_cancelled = labour_supply.filtered(
lambda record: record.state == 'cancelled')
state.append("Cancelled")
count.append(len(labour_supply_cancelled))
values = {
'state': state,
'count': count,
}
return values
@api.model
def get_contract_amount(self):
""" Function to get the amount of contract on the sequence """
sequence = []
amount = []
labour_supply = self.env['labour.supply'].search(
[('company_id', '=', self.env.company.id)], limit=5)
for contract in labour_supply:
sequence.append(contract.sequence_number)
amount.append(contract.total_amount)
values = {
'sequence': sequence,
'amount': amount,
}
return values
@api.model
def get_details_amount(self, option):
""" Function to get the amount of contract on the basis of filter
dashboard initially. """
sample_date = fields.Date.today()
first_day = sample_date + relativedelta(day=1)
last_day = sample_date + relativedelta(day=31)
first_month = first_day + relativedelta(month=1)
last_month = last_day + relativedelta(month=12)
sequence = []
amount = []
labour_supply = self.env['labour.supply'].search(
[('company_id', '=', self.env.company.id)], limit=5)
if option == 'daily':
labour_supply = labour_supply.filtered(
lambda record: record.from_date == sample_date)
elif option == "monthly":
labour_supply = labour_supply.filtered(
lambda record: first_day <= record.from_date <= last_day)
elif option == "yearly":
labour_supply = labour_supply.filtered(
lambda record: first_month <= record.from_date <= last_month)
for contract in labour_supply:
sequence.append(contract.sequence_number)
amount.append(contract.total_amount)
values = {
'sequence': sequence,
'amount': amount,
}
return values
@api.model
def get_contract_count_customer(self):
""" Function to get the number of contract on the basis of customer and
state for dashboard initially. """
labour_supply = self.env['labour.supply'].search(
[('company_id', '=', self.env.company.id)])
customer = []
customer_id = []
count = []
for contract in labour_supply:
if contract.customer_id.id not in customer_id:
number = self.env['labour.supply'].search_count(
[('customer_id', '=', contract.customer_id.id),
('company_id', '=', self.env.company.id)])
customer.append(contract.customer_id.name)
customer_id.append(contract.customer_id.id)
count.append(number)
values = {
'name': customer,
'count': count,
}
return values