75 lines
2.8 KiB
Python
75 lines
2.8 KiB
Python
import calendar
|
|
from datetime import timedelta
|
|
|
|
from odoo import models, fields
|
|
|
|
|
|
class IrSequence(models.Model):
|
|
_inherit = 'ir.sequence'
|
|
|
|
date_range_period = fields.Selection(
|
|
[('day', '每日'), ('month', '每月'), ('year', '每年')],
|
|
string='日期期间',
|
|
)
|
|
|
|
def _next(self, sequence_date=None):
|
|
""" Returns the next number in the preferred sequence in all the ones given in self."""
|
|
if not self.use_date_range:
|
|
return self._next_do()
|
|
# date mode
|
|
dt = sequence_date or self._context.get('ir_sequence_date', fields.Date.today())
|
|
seq_date = self.env['ir.sequence.date_range'].search(
|
|
[
|
|
('sequence_id', '=', self.id),
|
|
('date_from', '<=', dt),
|
|
('date_to', '>=', dt),
|
|
('date_range_period', '=', self.date_range_period)
|
|
], limit=1)
|
|
if not seq_date:
|
|
if self.date_range_period:
|
|
seq_date = self._create_date_range_seq_by_period(dt, self.date_range_period)
|
|
else:
|
|
seq_date = self._create_date_range_seq(dt)
|
|
return seq_date.with_context(ir_sequence_date_range=seq_date.date_from)._next()
|
|
|
|
def _create_date_range_seq_by_period(self, date, period):
|
|
if period == 'year':
|
|
year = fields.Date.from_string(date).strftime('%Y')
|
|
date_from = '{}-01-01'.format(year)
|
|
date_to = '{}-12-31'.format(year)
|
|
if period == 'month':
|
|
# 计算当前月份的第一天和最后一天
|
|
year = fields.Date.from_string(date).strftime('%Y')
|
|
month = fields.Date.from_string(date).strftime('%m')
|
|
date_from = fields.Date.from_string(date).strftime('%Y-%m-01')
|
|
date_to = '{}-{}-{}'.format(year, month, calendar.monthrange(int(year), int(month))[1])
|
|
if period == 'day':
|
|
date_from = date
|
|
date_to = date
|
|
date_range = self.env['ir.sequence.date_range'].search(
|
|
[
|
|
('sequence_id', '=', self.id),
|
|
('date_to', '>=', date_from),
|
|
('date_to', '<=', date),
|
|
('date_range_period', '=', period)
|
|
],
|
|
order='date_to desc', limit=1)
|
|
if date_range:
|
|
date_from = date_range.date_to + timedelta(days=1)
|
|
seq_date_range = self.env['ir.sequence.date_range'].sudo().create({
|
|
'date_from': date_from,
|
|
'date_to': date_to,
|
|
'sequence_id': self.id,
|
|
'date_range_period': period,
|
|
})
|
|
return seq_date_range
|
|
|
|
|
|
class IrSequenceDateRange(models.Model):
|
|
_inherit = 'ir.sequence.date_range'
|
|
|
|
date_range_period = fields.Selection(
|
|
[('day', '每日'), ('month', '每月'), ('year', '每年')],
|
|
string='日期期间',
|
|
)
|