GoodERP
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

178 rindas
6.2KB

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