You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
4.8 KiB
Python
115 lines
4.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
import datetime
|
|
|
|
from odoo import models, fields, api
|
|
from odoo.exceptions import ValidationError, MissingError, UserError
|
|
|
|
|
|
def get_date_end_month(date_start):
|
|
"""根据开始日期计算一整月时间段的结束日期
|
|
|
|
:param date_start: 日期对象
|
|
:return: 结束日期,日期对象
|
|
"""
|
|
if date_start.month == 12:
|
|
year_end = date_start.year + 1
|
|
month_end = 1
|
|
else:
|
|
year_end = date_start.year
|
|
month_end = date_start.month + 1
|
|
|
|
if date_start.day == 29:
|
|
day_end = date_start.day - 1
|
|
else:
|
|
day_end = date_start.day
|
|
|
|
date_end = datetime.date(year_end, month_end, day_end) - datetime.timedelta(days=1)
|
|
return date_end
|
|
|
|
|
|
def get_monday(today):
|
|
"""
|
|
根据传入的日期返回本周周一日期
|
|
"""
|
|
today = datetime.datetime.strptime(str(today), "%Y-%m-%d")
|
|
return (today - datetime.timedelta(today.weekday())).date()
|
|
|
|
|
|
def get_sunday(today):
|
|
"""
|
|
根据传入的日期返回本周周日日期
|
|
"""
|
|
today = datetime.datetime.strptime(str(today), "%Y-%m-%d")
|
|
return (today + datetime.timedelta(6 - today.weekday())).date()
|
|
|
|
|
|
class IrSequence(models.Model):
|
|
_name = 'ir.sequence'
|
|
_inherit = 'ir.sequence'
|
|
|
|
date_range_type = fields.Selection([('year', '年'), ('month', '月'), ('week', '周')], string="子序列周期", default='year')
|
|
|
|
def _next(self, sequence_date=None):
|
|
"""修改原生序列只能自动以年为周期创建子序列"""
|
|
if self.use_date_range:
|
|
dt = fields.Date.today()
|
|
if self._context.get('ir_sequence_date'):
|
|
dt = self._context.get('ir_sequence_date')
|
|
seq_date = self.env['ir.sequence.date_range'].search(
|
|
[('sequence_id', '=', self.id), ('date_from', '<=', dt), ('date_to', '>=', dt)], limit=1)
|
|
|
|
# 新建按月划分的日期范围子序列
|
|
if not seq_date and self.date_range_type == 'month':
|
|
if isinstance(dt, str):
|
|
dt = datetime.datetime.strptime(dt, '%Y-%m-%d')
|
|
date_from = datetime.date(dt.year, dt.month, 1)
|
|
date_to = get_date_end_month(date_from)
|
|
# 日期后存在子序列修正截至日期
|
|
date_range = self.env['ir.sequence.date_range'].search(
|
|
[('sequence_id', '=', self.id), ('date_from', '>=', dt), ('date_from', '<=', date_to)],
|
|
order='date_from desc', limit=1)
|
|
if date_range:
|
|
date_to = date_range.date_from + datetime.timedelta(days=-1)
|
|
|
|
# 日期前存在子序列修正起始日期
|
|
date_range = self.env['ir.sequence.date_range'].search(
|
|
[('sequence_id', '=', self.id), ('date_to', '>=', date_from), ('date_to', '<=', dt)],
|
|
order='date_to desc', limit=1)
|
|
if date_range:
|
|
date_from = date_range.date_to + datetime.timedelta(days=1)
|
|
|
|
# 创建子序列
|
|
self.env['ir.sequence.date_range'].sudo().create({
|
|
'date_from': date_from,
|
|
'date_to': date_to,
|
|
'sequence_id': self.id,
|
|
})
|
|
# 新建按周划分的日期范围子序列
|
|
if not seq_date and self.date_range_type == 'week':
|
|
if isinstance(dt, str):
|
|
dt = datetime.datetime.strptime(dt, '%Y-%m-%d')
|
|
date_from = get_monday(datetime.datetime.today().date())
|
|
date_to = get_sunday(datetime.datetime.today().date())
|
|
# 日期后存在子序列修正截至日期
|
|
date_range = self.env['ir.sequence.date_range'].search(
|
|
[('sequence_id', '=', self.id), ('date_from', '>=', dt), ('date_from', '<=', date_to)],
|
|
order='date_from desc', limit=1)
|
|
if date_range:
|
|
date_to = date_range.date_from + datetime.timedelta(days=-1)
|
|
|
|
# 日期前存在子序列修正起始日期
|
|
date_range = self.env['ir.sequence.date_range'].search(
|
|
[('sequence_id', '=', self.id), ('date_to', '>=', date_from), ('date_to', '<=', dt)],
|
|
order='date_to desc', limit=1)
|
|
if date_range:
|
|
date_from = date_range.date_to + datetime.timedelta(days=1)
|
|
|
|
# 创建子序列
|
|
self.env['ir.sequence.date_range'].sudo().create({
|
|
'date_from': date_from,
|
|
'date_to': date_to,
|
|
'sequence_id': self.id,
|
|
})
|
|
|
|
return super(IrSequence, self)._next()
|