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.
108 lines
4.2 KiB
108 lines
4.2 KiB
# -*- coding: utf-8 -*-
|
|
################################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: ASWIN A 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 NONINFRINGEMENT.
|
|
# 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 fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class CalculateIncentive(models.Model):
|
|
"""
|
|
This class represents the model for calculating and tracking sales
|
|
incentives. Each instance of this model corresponds to a specific
|
|
calculation of incentives for a salesperson based on their achieved goals.
|
|
"""
|
|
_name = 'calculate.incentive'
|
|
_description = 'Calculate Incentive'
|
|
|
|
salesperson_id = fields.Many2one(
|
|
'res.users',
|
|
string='Salesperson',
|
|
help='salesperson associated with the scheme'
|
|
)
|
|
goal = fields.Float(
|
|
string='Target',
|
|
help='Target amount that the salesperson needs to achieve.'
|
|
)
|
|
achieved = fields.Float(
|
|
string='Achievement',
|
|
help='Achieved amount by the salesperson.'
|
|
)
|
|
achievement_percentage = fields.Float(
|
|
string='Achievement %',
|
|
help='Achievement in percentage.'
|
|
)
|
|
incentive = fields.Float(
|
|
string='Incentive',
|
|
help='Total incentive earned by the salesperson.')
|
|
check = fields.Boolean(string="Check",
|
|
help="Used to check if it is paid or not")
|
|
start_date = fields.Date(
|
|
string='Start Date',
|
|
help='The start date for the period associated with the goal.'
|
|
)
|
|
end_date = fields.Date(
|
|
string='End Date',
|
|
help='The end date for the period associated with the goal.'
|
|
)
|
|
date_check = fields.Boolean(
|
|
compute='_compute_date_check',
|
|
help='Computed field indicating whether the dates meet end date.')
|
|
status = fields.Selection(
|
|
[('unpaid', 'Not Paid'),
|
|
('submit', 'Submitted To Accountant'), ('paid', 'Paid'),
|
|
('reject', 'Rejected')], string='State', default='unpaid',
|
|
help='Status of the record.'
|
|
)
|
|
|
|
def _compute_date_check(self):
|
|
"""
|
|
Compute the date check for each record.
|
|
This method iterates over the records and checks if the end date
|
|
is less than or equal to the current date. If true, it sets the
|
|
date_check field to True; otherwise, it sets it to False.
|
|
:return: None
|
|
"""
|
|
for rec in self:
|
|
rec.date_check = False
|
|
if rec.end_date <= fields.Date.today():
|
|
rec.date_check = True
|
|
|
|
def action_submit_to_accountant(self):
|
|
"""
|
|
Creates an 'approve.incentive' record for the calculated incentive
|
|
amount, and updates the status to 'Submitted To Accountant'.
|
|
If the incentive amount is 0.0, a UserError is raised.
|
|
"""
|
|
if self.incentive == 0.0:
|
|
raise UserError(_('Incentive amount is 0.0'))
|
|
data = {
|
|
'salesperson_id': self.salesperson_id.id,
|
|
'goal': self.goal,
|
|
'achieved': self.achieved,
|
|
'achievement_percentage': self.achievement_percentage,
|
|
'incentive': self.incentive,
|
|
'status': 'submit',
|
|
'start_date': self.start_date,
|
|
'end_date': self.end_date,
|
|
}
|
|
self.env['approve.incentive'].create(data)
|
|
self.check = True
|
|
self.status = 'submit'
|
|
|