# -*- coding: utf-8 -*- # Jalali-aware inheritance for hr.payslip.run defaults import jdatetime from datetime import date, datetime from dateutil.relativedelta import relativedelta from odoo import models, fields, api, _ class HrPayslipRun(models.Model): _inherit = 'hr.payslip.run' # Redefine fields with Jalali-aware defaults date_start = fields.Date( string='Date From', required=True, default=lambda self: self._default_date_start() ) date_end = fields.Date( string='Date To', required=True, default=lambda self: self._default_date_end() ) @api.model def _default_date_start(self): """ Compute the first day of the current month. Uses Jalali calendar for Persian users (fa_IR), otherwise Gregorian. Returns an ISO-formatted date string. """ lang = self.env.user.lang or 'en_US' if lang == 'fa_IR': j_today = jdatetime.date.fromgregorian(date=date.today()) j_start = jdatetime.date(j_today.year, j_today.month, 1) return fields.Date.to_string(j_start.togregorian()) return fields.Date.to_string(date.today().replace(day=1)) @api.model def _default_date_end(self): """ Compute the last day of the current month. Uses Jalali calendar for Persian users (fa_IR), otherwise Gregorian. Returns an ISO-formatted date string. """ lang = self.env.user.lang or 'en_US' if lang == 'fa_IR': j_today = jdatetime.date.fromgregorian(date=date.today()) if j_today.month == 12: j_next = jdatetime.date(j_today.year + 1, 1, 1) else: j_next = jdatetime.date(j_today.year, j_today.month + 1, 1) j_end = j_next - jdatetime.timedelta(days=1) return fields.Date.to_string(j_end.togregorian()) # Gregorian fallback: last day of this month end_date = (datetime.now() + relativedelta(months=1, day=1, days=-1)).date() return fields.Date.to_string(end_date) @api.model def default_get(self, fields_list): """ Override default_get to inject Jalali-aware defaults for date_start and date_end on record creation. """ res = super(HrPayslipRun, self).default_get(fields_list) if 'date_start' in fields_list: res['date_start'] = self._default_date_start() if 'date_end' in fields_list: res['date_end'] = self._default_date_end() return res