GoodERP
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

176 lines
6.1KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. import calendar
  4. from datetime import datetime
  5. from odoo import api, fields, models
  6. from odoo.exceptions import UserError
  7. MONTH_SELECTION = [
  8. ('1', '01'),
  9. ('2', '02'),
  10. ('3', '03'),
  11. ('4', '04'),
  12. ('5', '05'),
  13. ('6', '06'),
  14. ('7', '07'),
  15. ('8', '08'),
  16. ('9', '09'),
  17. ('10', '10'),
  18. ('11', '11'),
  19. ('12', '12')]
  20. class FinancePeriod(models.Model):
  21. '''会计期间'''
  22. _name = 'finance.period'
  23. _order = 'name desc'
  24. _description = '会计期间'
  25. name = fields.Char(
  26. '会计期间',
  27. compute='_compute_name', readonly=True, store=True)
  28. is_closed = fields.Boolean('已结账', help='这个字段用于标识期间是否已结账,已结账的期间不能生成会计凭证。')
  29. year = fields.Char('会计年度', required=True, help='会计期间对应的年份')
  30. month = fields.Selection(
  31. MONTH_SELECTION, string='会计月份', required=True, help='会计期间对应的月份')
  32. company_id = fields.Many2one(
  33. 'res.company',
  34. string='公司',
  35. change_default=True,
  36. default=lambda self: self.env.company)
  37. @api.depends('year', 'month')
  38. def _compute_name(self):
  39. """
  40. 根据填写的月份年份 设定期间的name值
  41. :return: None
  42. """
  43. for p in self:
  44. if p.year and p.month:
  45. p.name = '%s%s' % (p.year, str(p.month).zfill(2))
  46. def period_compare(self, period_id_one, period_id_two):
  47. """
  48. 比较期间的大小
  49. :param period_id_one: 要比较的期间 1
  50. :param period_id_two:要比较的期间 2
  51. :return: 1 0 -1 分别代表 期间1 大于 等于 小于 期间2
  52. """
  53. period_one_str = "%s-%s" % (period_id_one.year,
  54. str(period_id_one.month).zfill(2))
  55. period_two_str = "%s-%s" % (period_id_two.year,
  56. str(period_id_two.month).zfill(2))
  57. if period_one_str > period_two_str:
  58. return 1
  59. elif period_one_str < period_two_str:
  60. return -1
  61. else:
  62. return 0
  63. @api.model
  64. def init_period(self):
  65. ''' 根据系统启用日期(安装core模块的日期)创建 '''
  66. current_date = self.env.ref('base.main_company').start_date
  67. period_id = self.search([
  68. ('year', '=', current_date.year),
  69. ('month', '=', current_date.month)
  70. ])
  71. if not period_id:
  72. return self.create({'year': current_date.year,
  73. 'month': str(current_date.month)})
  74. @api.model
  75. def get_init_period(self):
  76. '''系统启用的期间'''
  77. start_date = self.env.ref('base.main_company').start_date
  78. period_id = self.search([
  79. ('year', '=', start_date.year),
  80. ('month', '=', start_date.month)
  81. ])
  82. return period_id
  83. def get_date_now_period_id(self):
  84. """
  85. 默认是当前会计期间
  86. :return: 当前会计期间的对象 如果不存在则返回 False
  87. """
  88. datetime_str = datetime.now().strftime("%Y-%m-%d")
  89. datetime_str_list = datetime_str.split('-')
  90. period_row = self.search(
  91. [('year', '=', datetime_str_list[0]),
  92. ('month', '=', str(int(datetime_str_list[1])))])
  93. return period_row and period_row[0]
  94. def get_period_month_date_range(self, period_id):
  95. """
  96. 取得 period_id 期间的第一天 和最后一天
  97. :param period_id: 要取得一个月 最后一天和第一天的期间
  98. :return: 返回一个月的第一天和最后一天 ('2016-01-01','2016-01-31')
  99. """
  100. month_day_range = calendar.monthrange(
  101. int(period_id.year), int(period_id.month))
  102. return ("%s-%s-01" % (
  103. period_id.year,
  104. period_id.month.zfill(2)),
  105. "%s-%s-%s" % (
  106. period_id.year,
  107. period_id.month.zfill(2),
  108. str(month_day_range[1])))
  109. def get_year_fist_period_id(self):
  110. """
  111. 获取本年创建过的第一个会计期间
  112. :return: 当前会计期间的对象 如果不存在则返回 False
  113. """
  114. datetime_str = datetime.now().strftime("%Y-%m-%d")
  115. datetime_str_list = datetime_str.split('-')
  116. period_row = self.search(
  117. [('year', '=', datetime_str_list[0])])
  118. period_list = sorted(map(int, [period.month for period in period_row]))
  119. if not period_row[0]:
  120. raise UserError('日期%s所在会计期间不存在!' % datetime_str)
  121. fist_period = self.search(
  122. [('year', '=', datetime_str_list[0]),
  123. ('month', '=', period_list[0])], order='name')
  124. return fist_period
  125. def get_period(self, date):
  126. """
  127. 根据参数date 得出对应的期间
  128. :param date: 需要取得期间的时间
  129. :return: 对应的期间
  130. """
  131. if date:
  132. period_id = self.search([
  133. ('year', '=', date.year),
  134. ('month', '=', date.month)
  135. ])
  136. if period_id:
  137. if period_id.is_closed and self._context.get(
  138. 'module_name', False) != 'checkout_wizard':
  139. raise UserError('会计期间%s已关闭' % period_id.name)
  140. else:
  141. # 会计期间不存在,创建会计期间
  142. period_id = self.create(
  143. {'year': date.year, 'month': str(date.month)})
  144. return period_id
  145. def search_period(self, date):
  146. """
  147. 根据参数date 得出对应的期间
  148. :param date: 需要取得期间的时间
  149. :return: 对应的期间
  150. """
  151. if date:
  152. period_id = self.search([
  153. ('year', '=', date.year),
  154. ('month', '=', date.month)
  155. ])
  156. return period_id
  157. _sql_constraints = [
  158. ('period_uniq', 'unique (year,month)', '会计期间不能重复'),
  159. ]
上海开阖软件有限公司 沪ICP备12045867号-1