Slink/sos_inventory/models/sos_sequence_generator.py

119 lines
4.7 KiB
Python
Executable File

from odoo import models, api, fields
from datetime import date,datetime
from odoo.exceptions import ValidationError
class Sequence_Generator(models.AbstractModel):
_name = 'sos_sequence_generator'
_description = 'Utility for Generating Custom Sequences'
@api.model
def generate_sequence(self, model_name, form_name, field_name):
today = fields.Date.today()
# Calculate financial year based on April to April cycle
year_start = today.year if today.month > 3 else today.year - 1
year_end = year_start + 1
fy = f"{year_start % 100}-{year_end % 100}"
month = today.strftime('%m') # Current month as two-digit string
# Build the base sequence string to check existing sequences
base_sequence_prefix = f"SOS/{form_name}/{fy}/{month}/"
# Query the latest record in the same model with the highest sequence for the current month and fiscal year
records = self.env[model_name].search(
[(field_name, 'like', f"{base_sequence_prefix}%")],
order=f"{field_name} desc", # Corrected order clause
limit=1
)
if records and records[0][field_name]:
last_sequence = records[0][field_name]
# Attempt to split and extract the last number part of the sequence
try:
last_number = int(last_sequence.split('/')[-1])
new_number = last_number + 1
except ValueError:
# Fallback if the last sequence isn't properly formatted or can't be converted to an integer
new_number = 1
else:
# No records found for this month and year, start with 001
new_number = 1
# Return the complete sequence
return f"{base_sequence_prefix}{new_number:03d}"
@staticmethod
def action_assign_signature(record, image_field_name, user_field_name, no_signature_message=None):
current_user = record.env.user
esign = current_user.signature_image
if esign:
setattr(record, image_field_name, esign)
setattr(record, user_field_name, current_user)
else:
if no_signature_message:
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'message': no_signature_message,
'type': 'danger',
'sticky': False
}
}
return None
@staticmethod
def calculate_week_number(start_date, end_date, input_date):
# Check for False values
if not start_date or not end_date or not input_date:
raise ValidationError("Without Indent plan you can't do this Opreation")
start_date_dt = datetime.strptime(str(start_date), '%Y-%m-%d')
end_date_dt = datetime.strptime(str(end_date), '%Y-%m-%d')
input_date_dt = datetime.strptime(str(input_date), '%Y-%m-%d')
if input_date_dt < start_date_dt or input_date_dt > end_date_dt:
raise ValidationError("Date exceeds the target date range.")
# Alternatively, you could set a value indicating the date is out of range:
# return "Date is out of the given range"
else:
days_diff = (input_date_dt - start_date_dt).days
week_number = days_diff // 7 + 1
return week_number
@staticmethod
def send_group_email(env, email_from, email_to, subject, body,group_xml_id):
group = env.ref(group_xml_id)
if group:
users = env['res.users'].search([('groups_id', 'in', [group.id])])
emails = users.mapped('email')
# email_to = ','.join(emails)
mail_values = {
'subject': subject,
'body_html': body,
'email_to': email_to,
'email_from': email_from,
}
mail = env['mail.mail'].sudo().create(mail_values)
mail.sudo().send()
else:
print("No Recepients Found")
@staticmethod
def send_mon_min_email(env, email_from, email_to, subject, body,user_type):
if user_type == "user":
users = env['res.users'].search([('id', '=', env.user.id)])
reporting_user = env['res.users'].search([('id', '=', users.reporting_to.id)])
# email_to = reporting_user.login
else:
# email_to = "ramachandran.r@sosaley.com"
print("test")
mail_values = {
'subject': subject,
'body_html': body,
'email_to': email_to,
'email_from': email_from,
}
mail = env['mail.mail'].sudo().create(mail_values)
mail.sudo().send()