GoodERP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1235 lines
53KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo import models, fields, api
  4. from odoo.exceptions import UserError
  5. from math import fabs
  6. import copy
  7. class TrialBalance(models.Model):
  8. """科目余额表"""
  9. _name = "trial.balance"
  10. _order = 'subject_code'
  11. _description = '科目余额表'
  12. @api.depends('cumulative_occurrence_debit',
  13. 'cumulative_occurrence_credit',
  14. 'ending_balance_debit',
  15. 'ending_balance_credit',
  16. 'subject_name_id')
  17. def _get_year_init(self):
  18. for tb in self:
  19. if tb.subject_name_id.costs_types in ('in', 'out'):
  20. tb.year_init_debit = tb.year_init_credit = 0
  21. continue
  22. if tb.subject_name_id.balance_directions == 'in':
  23. # 年初借 = 期末借 - 期末贷 - 本年借 + 本年贷
  24. tb.year_init_debit = (
  25. tb.ending_balance_debit
  26. - tb.ending_balance_credit
  27. - tb.cumulative_occurrence_debit
  28. + tb.cumulative_occurrence_credit)
  29. tb.year_init_credit = 0
  30. else:
  31. # 年初贷 = 期末贷 - 期末借 - 本年贷 + 本年借
  32. tb.year_init_credit = (
  33. tb.ending_balance_credit
  34. - tb.ending_balance_debit
  35. - tb.cumulative_occurrence_credit
  36. + tb.cumulative_occurrence_debit)
  37. tb.year_init_debit = 0
  38. period_id = fields.Many2one('finance.period', string='会计期间')
  39. subject_code = fields.Char('科目编码')
  40. subject_name = fields.Char('科目名称')
  41. subject_name_id = fields.Many2one(
  42. 'finance.account', string='科目', ondelete='cascade')
  43. account_type = fields.Selection(
  44. string='科目类型', related='subject_name_id.account_type')
  45. level = fields.Integer(
  46. string='科目级次', related='subject_name_id.level', store=True)
  47. year_init_debit = fields.Float(
  48. '年初余额(借方)', digits='Amount', default=0, compute=_get_year_init)
  49. year_init_credit = fields.Float(
  50. '年初余额(贷方)', digits='Amount', default=0, compute=_get_year_init)
  51. initial_balance_debit = fields.Float(
  52. '期初余额(借方)', digits='Amount', default=0)
  53. initial_balance_credit = fields.Float(
  54. '期初余额(贷方)', digits='Amount', default=0)
  55. current_occurrence_debit = fields.Float(
  56. '本期发生额(借方)', digits='Amount', default=0)
  57. current_occurrence_credit = fields.Float(
  58. '本期发生额(贷方)', digits='Amount', default=0)
  59. ending_balance_debit = fields.Float(
  60. '期末余额(借方)', digits='Amount', default=0)
  61. ending_balance_credit = fields.Float(
  62. '期末余额(贷方)', digits='Amount', default=0)
  63. cumulative_occurrence_debit = fields.Float(
  64. '本年累计发生额(借方)', digits='Amount', default=0)
  65. cumulative_occurrence_credit = fields.Float(
  66. '本年累计发生额(贷方)', digits='Amount', default=0)
  67. def button_change_number(self):
  68. self.ensure_one()
  69. view = self.env.ref('finance.change_cumulative_occurrence_wizard_form')
  70. return {
  71. 'name': '调整累计数',
  72. 'type': 'ir.actions.act_window',
  73. 'view_mode': 'form',
  74. 'res_model': 'change.cumulative.occurrence.wizard',
  75. 'views': [(view.id, 'form')],
  76. 'view_id': view.id,
  77. 'target': 'new',
  78. 'context': dict(
  79. self.env.context,
  80. active_id=self.id,
  81. active_ids=[self.id]
  82. ),
  83. }
  84. @api.model
  85. def check_trial_balance(self, period_id):
  86. res = {}
  87. trial_balance_items = self.env['trial.balance'].search(
  88. [('period_id', '=', period_id.id),
  89. ('account_type', '=', 'normal')])
  90. field_list = [
  91. "total_year_init_debit",
  92. "total_year_init_credit",
  93. "total_initial_balance_debit",
  94. "total_initial_balance_credit",
  95. "total_current_occurrence_debit",
  96. "total_current_occurrence_credit",
  97. "total_ending_balance_debit",
  98. "total_ending_balance_credit",
  99. "total_cumulative_occurrence_debit",
  100. "total_cumulative_occurrence_credit"
  101. ]
  102. for field in field_list:
  103. res.update({field: sum(trial_balance_items.mapped(field[6:]))})
  104. if period_id == period_id.get_init_period():
  105. diff_year_init = res.get(
  106. 'total_year_init_debit', 0) - res.get(
  107. 'total_year_init_credit', 0)
  108. diff_cumulative_occurrence = res.get(
  109. 'total_cumulative_occurrence_debit', 0) - res.get(
  110. 'total_cumulative_occurrence_credit', 0)
  111. diff_ending_balance = res.get(
  112. 'total_ending_balance_debit', 0) - res.get(
  113. 'total_ending_balance_credit', 0)
  114. if diff_year_init != 0:
  115. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  116. (period_id.name, diff_year_init))
  117. if diff_cumulative_occurrence != 0:
  118. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  119. (period_id.name, diff_cumulative_occurrence))
  120. if diff_ending_balance != 0:
  121. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  122. (period_id.name, diff_ending_balance))
  123. else:
  124. diff_initial_balance = res.get(
  125. 'total_initial_balance_debit', 0) - res.get(
  126. 'total_initial_balance_credit', 0)
  127. diff_current_occurrence = res.get(
  128. 'total_current_occurrence_debit', 0) - res.get(
  129. 'total_current_occurrence_credit', 0)
  130. diff_ending_balance = res.get(
  131. 'total_ending_balance_debit', 0) - res.get(
  132. 'total_ending_balance_credit', 0)
  133. if diff_initial_balance != 0:
  134. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  135. (period_id.name, diff_initial_balance))
  136. if diff_current_occurrence != 0:
  137. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  138. (period_id.name, diff_current_occurrence))
  139. if diff_ending_balance != 0:
  140. raise UserError('期间:%s 借贷不平\n\n差异金额:%s' %
  141. (period_id.name, diff_ending_balance))
  142. return True
  143. class CheckTrialBalanceWizard(models.TransientModel):
  144. """ 检查试算平衡
  145. """
  146. _name = 'check.trial.balance.wizard'
  147. _description = '检查试算平衡'
  148. @api.model
  149. def default_get(self, fields):
  150. res = super(CheckTrialBalanceWizard, self).default_get(fields)
  151. active_id = self.env.context.get('active_id', False)
  152. trial_balance_item = self.env['trial.balance'].browse(active_id)
  153. period_id = trial_balance_item.period_id
  154. is_init_period = False
  155. if period_id == period_id.get_init_period():
  156. is_init_period = True
  157. trial_balance_items = self.env['trial.balance'].search(
  158. [('period_id', '=', period_id.id),
  159. ('account_type', '=', 'normal')])
  160. field_list = [
  161. "total_year_init_debit",
  162. "total_year_init_credit",
  163. "total_initial_balance_debit",
  164. "total_initial_balance_credit",
  165. "total_current_occurrence_debit",
  166. "total_current_occurrence_credit",
  167. "total_ending_balance_debit",
  168. "total_ending_balance_credit",
  169. "total_cumulative_occurrence_debit",
  170. "total_cumulative_occurrence_credit"
  171. ]
  172. for field in field_list:
  173. res.update({field: sum(trial_balance_items.mapped(field[6:]))})
  174. res.update({'period_id': period_id.id,
  175. 'is_init_period': is_init_period})
  176. if is_init_period:
  177. diff_year_init = res.get('total_year_init_debit', 0) - res.get(
  178. 'total_year_init_credit', 0)
  179. diff_cumulative_occurrence = res.get(
  180. 'total_cumulative_occurrence_debit', 0) - res.get(
  181. 'total_cumulative_occurrence_credit', 0)
  182. diff_ending_balance = res.get(
  183. 'total_ending_balance_debit', 0) - res.get(
  184. 'total_ending_balance_credit', 0)
  185. if diff_year_init != 0:
  186. res.update({'is_balance': False, 'result': '2',
  187. 'diff': diff_year_init})
  188. if diff_cumulative_occurrence != 0:
  189. res.update({'is_balance': False, 'result': '2',
  190. 'diff': diff_cumulative_occurrence})
  191. if diff_ending_balance != 0:
  192. res.update({'is_balance': False, 'result': '2',
  193. 'diff': diff_ending_balance})
  194. if not (diff_year_init
  195. or diff_cumulative_occurrence
  196. or diff_ending_balance):
  197. res.update({'is_balance': True, 'result': '1'})
  198. else:
  199. diff_initial_balance = res.get(
  200. 'total_initial_balance_debit', 0) - res.get(
  201. 'total_initial_balance_credit', 0)
  202. diff_current_occurrence = res.get(
  203. 'total_current_occurrence_debit', 0) - res.get(
  204. 'total_current_occurrence_credit', 0)
  205. diff_ending_balance = res.get(
  206. 'total_ending_balance_debit', 0) - res.get(
  207. 'total_ending_balance_credit', 0)
  208. if diff_initial_balance != 0:
  209. res.update({'is_balance': False, 'result': '2',
  210. 'diff': diff_initial_balance})
  211. if diff_current_occurrence != 0:
  212. res.update({'is_balance': False, 'result': '2',
  213. 'diff': diff_current_occurrence})
  214. if diff_ending_balance != 0:
  215. res.update({'is_balance': False, 'result': '2',
  216. 'diff': diff_ending_balance})
  217. if not (diff_initial_balance
  218. or diff_current_occurrence
  219. or diff_ending_balance):
  220. res.update({'is_balance': True, 'result': '1'})
  221. return res
  222. period_id = fields.Many2one(
  223. 'finance.period', string='会计期间', help='检查试算平衡的期间')
  224. is_init_period = fields.Boolean(
  225. string='Is Init Period',
  226. )
  227. total_year_init_debit = fields.Float(
  228. '年初余额(借方)', digits='Amount', default=0)
  229. total_year_init_credit = fields.Float(
  230. '年初余额(贷方)', digits='Amount', default=0)
  231. total_initial_balance_debit = fields.Float(
  232. '期初余额(借方)', digits='Amount', default=0)
  233. total_initial_balance_credit = fields.Float(
  234. '期初余额(贷方)', digits='Amount', default=0)
  235. total_current_occurrence_debit = fields.Float(
  236. '本期发生额(借方)', digits='Amount', default=0)
  237. total_current_occurrence_credit = fields.Float(
  238. '本期发生额(贷方)', digits='Amount', default=0)
  239. total_ending_balance_debit = fields.Float(
  240. '期末余额(借方)', digits='Amount', default=0)
  241. total_ending_balance_credit = fields.Float(
  242. '期末余额(贷方)', digits='Amount', default=0)
  243. total_cumulative_occurrence_debit = fields.Float(
  244. '本年累计发生额(借方)', digits='Amount', default=0)
  245. total_cumulative_occurrence_credit = fields.Float(
  246. '本年累计发生额(贷方)', digits='Amount', default=0)
  247. result = fields.Selection(
  248. string='借贷平衡情况',
  249. selection=[('1', '借贷平衡'), ('2', '借贷不平')]
  250. )
  251. is_balance = fields.Boolean(
  252. string='Is Balance',
  253. )
  254. diff = fields.Float(
  255. string='差异金额',
  256. )
  257. company_id = fields.Many2one(
  258. 'res.company',
  259. string='公司',
  260. change_default=True,
  261. default=lambda self: self.env.company)
  262. class ChangeCumulativeOccurrenceWizard(models.TransientModel):
  263. """ The summary line for a class docstring should fit on one line.
  264. """
  265. _name = 'change.cumulative.occurrence.wizard'
  266. _description = 'Change Cumulative Occurrence Wizard'
  267. old_cumulative_occurrence_debit = fields.Float(
  268. '原本年累计发生额(借方)', digits='Amount')
  269. cumulative_occurrence_debit = fields.Float(
  270. '本年累计发生额(借方)', digits='Amount')
  271. old_cumulative_occurrence_credit = fields.Float(
  272. '原本年累计发生额(贷方)', digits='Amount')
  273. cumulative_occurrence_credit = fields.Float(
  274. '本年累计发生额(贷方)', digits='Amount')
  275. cumulative_occurrence = fields.Float('本年累计实际发生额', digits='Amount')
  276. account_id = fields.Many2one(
  277. string='科目',
  278. comodel_name='finance.account',
  279. ondelete='set null',
  280. )
  281. costs_types = fields.Selection(
  282. string='科目类型',
  283. related='account_id.user_type.costs_types',
  284. )
  285. trial_balance_id = fields.Many2one(
  286. string='Trial Balance',
  287. comodel_name='trial.balance',
  288. ondelete='set null',
  289. )
  290. @api.model
  291. def default_get(self, fields):
  292. if len(self.env.context.get('active_ids', False)) > 1:
  293. raise UserError('一次只能调整一行')
  294. res = super(ChangeCumulativeOccurrenceWizard, self).default_get(fields)
  295. active_id = self.env.context.get('active_id', False)
  296. if active_id:
  297. trial_balance_item = self.env['trial.balance'].browse(active_id)
  298. if trial_balance_item.subject_name_id.account_type == 'view':
  299. raise UserError('只能调整末级科目相关的行')
  300. res.update({
  301. 'cumulative_occurrence_debit':
  302. trial_balance_item.cumulative_occurrence_debit,
  303. 'cumulative_occurrence_credit':
  304. trial_balance_item.cumulative_occurrence_credit,
  305. 'old_cumulative_occurrence_debit':
  306. trial_balance_item.cumulative_occurrence_debit,
  307. 'old_cumulative_occurrence_credit':
  308. trial_balance_item.cumulative_occurrence_credit,
  309. 'trial_balance_id': active_id,
  310. 'account_id': trial_balance_item.subject_name_id.id
  311. })
  312. return res
  313. def update_cumulative_occurrence(self):
  314. parent_accounts = []
  315. account = self.trial_balance_id.subject_name_id
  316. while account:
  317. parent_accounts.append(account)
  318. account = account.parent_id
  319. diff_cumulative_occurrence_debit = 0
  320. diff_cumulative_occurrence_credit = 0
  321. if self.costs_types in ('in', 'out'):
  322. diff_cumulative_occurrence_debit = self.cumulative_occurrence - \
  323. self.old_cumulative_occurrence_debit
  324. diff_cumulative_occurrence_credit = self.cumulative_occurrence - \
  325. self.old_cumulative_occurrence_credit
  326. else:
  327. diff_cumulative_occurrence_debit = (
  328. self.cumulative_occurrence_debit
  329. - self.old_cumulative_occurrence_debit)
  330. diff_cumulative_occurrence_credit = (
  331. self.cumulative_occurrence_credit
  332. - self.old_cumulative_occurrence_credit)
  333. for account in parent_accounts:
  334. trial_balance_ids = self.env['trial.balance'].search(
  335. [('subject_name_id', '=', account.id),
  336. ('period_id', '=', self.trial_balance_id.period_id.id)])
  337. for trial_balance_id in trial_balance_ids:
  338. trial_balance_id.write(
  339. {'cumulative_occurrence_debit':
  340. (trial_balance_id.cumulative_occurrence_debit
  341. + diff_cumulative_occurrence_debit)})
  342. trial_balance_id.write(
  343. {'cumulative_occurrence_credit':
  344. (trial_balance_id.cumulative_occurrence_credit
  345. + diff_cumulative_occurrence_credit)})
  346. view = self.env.ref('finance.init_balance_list')
  347. return {
  348. 'type': 'ir.actions.act_window',
  349. 'name': '科目余额表:' + self.trial_balance_id.period_id.name,
  350. 'view_mode': 'list',
  351. 'res_model': 'trial.balance',
  352. 'target': 'main',
  353. 'view_id': False,
  354. 'views': [(view.id, 'list')],
  355. 'domain': [('period_id', '=', self.trial_balance_id.period_id.id)]
  356. }
  357. class CreateTrialBalanceWizard(models.TransientModel):
  358. """根据输入的期间 生成科目余额表的 向导 """
  359. _name = "create.trial.balance.wizard"
  360. _description = '科目余额表的创建向导'
  361. @api.model
  362. def _default_period_id(self):
  363. return self._default_period_id_impl()
  364. @api.model
  365. def _default_period_id_impl(self):
  366. """
  367. 默认是当前会计期间
  368. :return: 当前会计期间的对象
  369. """
  370. return self.env['finance.period'].get_date_now_period_id()
  371. period_id = fields.Many2one(
  372. 'finance.period',
  373. default=_default_period_id,
  374. string='会计期间',
  375. help='限定生成期间的范围')
  376. has_transaction = fields.Boolean(
  377. string='有发生额',
  378. )
  379. has_balance = fields.Boolean(
  380. string='有余额',
  381. )
  382. company_id = fields.Many2one(
  383. 'res.company',
  384. string='公司',
  385. change_default=True,
  386. default=lambda self: self.env.company)
  387. def compute_last_period_id(self, period_id):
  388. """取得参数区间的上个期间"""
  389. if int(period_id.month) == 1:
  390. year = int(period_id.year) - 1
  391. month = 12
  392. else:
  393. year = period_id.year
  394. month = int(period_id.month) - 1
  395. return self.env['finance.period'].search([
  396. ('year', '=', str(year)),
  397. ('month', '=', str(month))])
  398. def compute_next_period_id(self, period_id):
  399. """取得输入期间的下一个期间"""
  400. if int(period_id.month) == 12:
  401. year = int(period_id.year) + 1
  402. month = 1
  403. else:
  404. year = period_id.year
  405. month = int(period_id.month) + 1
  406. return self.env['finance.period'].search([
  407. ('year', '=', str(year)),
  408. ('month', '=', str(month))])
  409. def get_period_balance(self, period_id):
  410. """取出本期发生额
  411. 返回结果是 科目 借 贷
  412. """
  413. # sql = '''select vol.account_id as account_id,
  414. # sum(vol.debit) as debit,
  415. # sum(vol.credit) as credit
  416. # from voucher as vo
  417. # left join voucher_line as vol
  418. # on vo.id = vol.voucher_id
  419. # where vo.period_id=%s
  420. # group by vol.account_id'''
  421. # self.env.cr.execute(sql, (period_id,))
  422. # return self.env.cr.dictfetchall()
  423. self.ensure_one()
  424. data = []
  425. for account in self.env['finance.account'].search([]):
  426. account_balance = account.get_balance(period_id)
  427. data.append({
  428. 'account_id': account.id,
  429. 'debit': account_balance.get('debit'),
  430. 'credit': account_balance.get('credit'),
  431. 'balance': account_balance.get('balance')
  432. })
  433. return data
  434. def create_trial_balance(self):
  435. """ \
  436. 生成科目余额表 \
  437. 1.如果所选区间已经关闭则直接调出已有的科目余额表记录
  438. 2.判断如果所选的区间的 前一个期间没有关闭则报错
  439. 3.如果上一个区间不存在则报错
  440. """
  441. trial_balance_objs = self.env['trial.balance'].search(
  442. [('period_id', '=', self.period_id.id)])
  443. trial_balance_ids = [
  444. trial_balance_row.id for trial_balance_row in trial_balance_objs]
  445. if not self.period_id.is_closed:
  446. trial_balance_objs.unlink()
  447. last_period = self.compute_last_period_id(self.period_id)
  448. if last_period:
  449. if not last_period.is_closed:
  450. raise UserError('期间%s未结账,无法取到%s期期初余额' %
  451. (last_period.name, self.period_id.name))
  452. period_id = self.period_id.id
  453. current_occurrence_dic_list = self.get_period_balance(period_id)
  454. trial_balance_dict = {}
  455. """把本期发生额的数量填写到 准备好的dict 中 """
  456. for current_occurrence in current_occurrence_dic_list:
  457. account = self.env['finance.account'].browse(
  458. current_occurrence.get('account_id'))
  459. ending_balance_debit = ending_balance_credit = 0
  460. this_debit = current_occurrence.get('debit', 0) or 0
  461. this_credit = current_occurrence.get('credit', 0) or 0
  462. if account.balance_directions == 'in':
  463. ending_balance_debit = this_debit - this_credit
  464. else:
  465. ending_balance_credit = this_credit - this_debit
  466. account_dict = {'period_id': period_id,
  467. 'current_occurrence_debit': this_debit,
  468. 'current_occurrence_credit': this_credit,
  469. 'subject_code': account.code,
  470. 'initial_balance_credit': 0,
  471. 'initial_balance_debit': 0,
  472. 'ending_balance_debit': ending_balance_debit,
  473. 'ending_balance_credit': ending_balance_credit,
  474. 'cumulative_occurrence_debit': this_debit,
  475. 'cumulative_occurrence_credit': this_credit,
  476. 'subject_name_id': account.id}
  477. trial_balance_dict[account.id] = account_dict
  478. trial_balance_dict.update(self.construct_trial_balance_dict(
  479. trial_balance_dict, last_period))
  480. trial_balance_ids = [
  481. self.env['trial.balance'].create(vals).id
  482. for (key, vals) in list(trial_balance_dict.items())]
  483. else:
  484. # 更新 科目余额表, 将新出现的 科目加入到 科目余额表
  485. trial_balance_dict = {}
  486. period_id = self.period_id.id
  487. last_period = self.compute_last_period_id(self.period_id)
  488. current_occurrence_dic_list = self.get_period_balance(period_id)
  489. exist_trial_balanace_accounts = self.env['trial.balance'].search(
  490. [('period_id', '=', period_id)]).mapped('subject_name_id')
  491. for current_occurrence in current_occurrence_dic_list:
  492. account = self.env['finance.account'].browse(
  493. current_occurrence.get('account_id'))
  494. if account not in exist_trial_balanace_accounts:
  495. trial_balance_dict[account.id] = \
  496. self._prepare_account_dict(
  497. current_occurrence,
  498. period_id)
  499. trial_balance_dict.update(self.construct_trial_balance_dict(
  500. trial_balance_dict, last_period))
  501. for (key, vals) in list(trial_balance_dict.items()):
  502. if key not in exist_trial_balanace_accounts.ids:
  503. trial_balance_ids.extend(
  504. self.env['trial.balance'].create(vals).ids)
  505. # 对 科目余额表 上下级 数据重新计算
  506. for trial_item in self.env['trial.balance'].search([
  507. ('account_type', '=', 'view'),
  508. ('period_id', '=', self.period_id.id)],
  509. order='level desc'):
  510. parent_account_id = trial_item.subject_name_id
  511. child_account_ids = self.env['finance.account'].search(
  512. [('id', 'child_of', parent_account_id.id),
  513. ('account_type', '=', 'normal')])
  514. child_trial_items = self.env['trial.balance'].search(
  515. [('subject_name_id', 'in', child_account_ids.ids),
  516. ('period_id', '=', self.period_id.id)])
  517. trial_item.write(
  518. {
  519. "year_init_debit": sum(
  520. child_trial_items.mapped("year_init_debit")),
  521. "year_init_credit": sum(
  522. child_trial_items.mapped("year_init_credit")),
  523. "initial_balance_debit": sum(
  524. child_trial_items.mapped("initial_balance_debit")),
  525. "initial_balance_credit": sum(
  526. child_trial_items.mapped("initial_balance_credit")),
  527. "current_occurrence_debit": sum(
  528. child_trial_items.mapped("current_occurrence_debit")),
  529. "current_occurrence_credit": sum(
  530. child_trial_items.mapped("current_occurrence_credit")),
  531. "ending_balance_debit": sum(
  532. child_trial_items.mapped("ending_balance_debit")),
  533. "ending_balance_credit": sum(
  534. child_trial_items.mapped("ending_balance_credit")),
  535. "cumulative_occurrence_debit": sum(
  536. child_trial_items.mapped("cumulative_occurrence_debit")
  537. ),
  538. "cumulative_occurrence_credit": sum(
  539. child_trial_items.mapped(
  540. "cumulative_occurrence_credit")),
  541. }
  542. )
  543. view_id = self.env.ref('finance.trial_balance_list').id
  544. if self.period_id == self.period_id.get_init_period():
  545. view_id = self.env.ref('finance.init_balance_list').id
  546. context = {}
  547. if self.has_balance and not self.has_transaction:
  548. context.update({'search_default_has_balance': 1})
  549. elif not self.has_balance and self.has_transaction:
  550. context.update({'search_default_has_transaction': 1})
  551. elif self.has_balance and self.has_transaction:
  552. context.update({'search_default_has_balance': 1,
  553. 'search_default_has_transaction': 1})
  554. return {
  555. 'type': 'ir.actions.act_window',
  556. 'name': '科目余额表:' + self.period_id.name,
  557. 'view_mode': 'list',
  558. 'res_model': 'trial.balance',
  559. 'target': 'main',
  560. 'view_id': False,
  561. 'context': context,
  562. 'views': [(view_id, 'list')],
  563. 'domain': [('id', 'in', trial_balance_ids)]
  564. }
  565. def _prepare_account_dict(self, current_occurrence, period_id):
  566. account = self.env['finance.account'].browse(
  567. current_occurrence.get('account_id'))
  568. ending_balance_debit = ending_balance_credit = 0
  569. this_debit = current_occurrence.get('debit', 0) or 0
  570. this_credit = current_occurrence.get('credit', 0) or 0
  571. if account.balance_directions == 'in':
  572. ending_balance_debit = this_debit - this_credit
  573. else:
  574. ending_balance_credit = this_credit - this_debit
  575. account_dict = {
  576. 'period_id': period_id,
  577. 'current_occurrence_debit': this_debit,
  578. 'current_occurrence_credit': this_credit,
  579. 'subject_code': account.code,
  580. 'initial_balance_credit': 0,
  581. 'initial_balance_debit': 0,
  582. 'ending_balance_debit': ending_balance_debit,
  583. 'ending_balance_credit': ending_balance_credit,
  584. 'cumulative_occurrence_debit': this_debit,
  585. 'cumulative_occurrence_credit': this_credit,
  586. 'subject_name_id': account.id
  587. }
  588. return account_dict
  589. def compute_trial_balance_data(self, trial_balance, last_period,
  590. subject_name_id, trial_balance_dict):
  591. ''' 获得 科目余额表 数据 '''
  592. initial_balance_credit = trial_balance.ending_balance_credit or 0
  593. initial_balance_debit = trial_balance.ending_balance_debit or 0
  594. this_debit = this_credit = ending_balance_credit = 0
  595. if subject_name_id in trial_balance_dict: # 本月有发生额
  596. this_debit = trial_balance_dict[subject_name_id].get(
  597. 'current_occurrence_debit', 0) or 0
  598. this_credit = trial_balance_dict[subject_name_id].get(
  599. 'current_occurrence_credit', 0) or 0
  600. ending_balance_debit = initial_balance_debit + \
  601. this_debit - initial_balance_credit - this_credit
  602. if ending_balance_debit < 0:
  603. ending_balance_credit -= ending_balance_debit
  604. ending_balance_debit = 0
  605. else:
  606. ending_balance_credit = initial_balance_credit
  607. ending_balance_debit = initial_balance_debit
  608. # 本年累计发生额
  609. if self.period_id.year == last_period.year:
  610. cumulative_occurrence_credit = this_credit + \
  611. trial_balance.cumulative_occurrence_credit
  612. cumulative_occurrence_debit = this_debit + \
  613. trial_balance.cumulative_occurrence_debit
  614. else:
  615. cumulative_occurrence_credit = this_credit
  616. cumulative_occurrence_debit = this_debit
  617. return_vals = [initial_balance_credit,
  618. initial_balance_debit,
  619. ending_balance_credit,
  620. ending_balance_debit,
  621. this_debit,
  622. this_credit,
  623. cumulative_occurrence_credit,
  624. cumulative_occurrence_debit]
  625. return return_vals
  626. def construct_trial_balance_dict(self, trial_balance_dict, last_period):
  627. """ 结合上一期间的 数据 填写 trial_balance_dict(余额表 记录生成dict) """
  628. currency_dict = copy.deepcopy(trial_balance_dict)
  629. for trial_balance in self.env['trial.balance'].search(
  630. [('period_id', '=', last_period.id)]):
  631. subject_name_id = trial_balance.subject_name_id.id
  632. [initial_balance_credit, initial_balance_debit,
  633. ending_balance_credit, ending_balance_debit, this_debit,
  634. this_credit, cumulative_occurrence_credit,
  635. cumulative_occurrence_debit] = \
  636. self.compute_trial_balance_data(
  637. trial_balance, last_period, subject_name_id, currency_dict)
  638. subject_code = trial_balance.subject_code
  639. currency_dict[trial_balance.subject_name_id.id] = {
  640. 'initial_balance_credit': initial_balance_credit,
  641. 'initial_balance_debit': initial_balance_debit,
  642. 'ending_balance_credit': ending_balance_credit,
  643. 'ending_balance_debit': ending_balance_debit,
  644. 'current_occurrence_debit': this_debit,
  645. 'current_occurrence_credit': this_credit,
  646. 'cumulative_occurrence_credit': cumulative_occurrence_credit,
  647. 'cumulative_occurrence_debit': cumulative_occurrence_debit,
  648. 'subject_code': subject_code,
  649. 'period_id': self.period_id.id,
  650. 'subject_name_id': subject_name_id
  651. }
  652. return currency_dict
  653. class CreateVouchersSummaryWizard(models.TransientModel):
  654. """创建 明细账或者总账的向导 """
  655. _name = "create.vouchers.summary.wizard"
  656. _description = '明细账或总账创建向导'
  657. @api.model
  658. def _default_end_period_id(self):
  659. """
  660. 默认是当前会计期间
  661. :return: 当前会计期间的对象
  662. """
  663. return self.env['finance.period'].get_date_now_period_id()
  664. @api.model
  665. def _default_begin_period_id(self):
  666. """
  667. 默认是当前会计期间
  668. :return: 当前会计期间的对象
  669. """
  670. return self.env['finance.period'].get_year_fist_period_id()
  671. @api.model
  672. def _default_subject_name_id(self):
  673. return self.env['finance.account'].get_smallest_code_account()
  674. @api.model
  675. def _default_subject_name_end_id(self):
  676. return self.env['finance.account'].get_max_code_account()
  677. period_begin_id = fields.Many2one(
  678. 'finance.period',
  679. string='开始期间',
  680. default=_default_begin_period_id,
  681. help='默认是本年第一个期间')
  682. period_end_id = fields.Many2one(
  683. 'finance.period',
  684. string='结束期间',
  685. default=_default_end_period_id,
  686. help='默认是当前期间')
  687. subject_name_id = fields.Many2one(
  688. 'finance.account',
  689. string='会计科目 从',
  690. default=_default_subject_name_id,
  691. help='默认是所有科目的最小code')
  692. subject_name_end_id = fields.Many2one(
  693. 'finance.account',
  694. string='到',
  695. default=_default_subject_name_end_id,
  696. help='默认是所有科目的最大code')
  697. no_occurred = fields.Boolean(
  698. '有发生额', default=True, help='无发生额的科目不显示明细账,默认为不显示')
  699. no_balance = fields.Boolean(
  700. '有余额', default=True, help='无余额的科目不显示明细账,默认为不显示')
  701. company_id = fields.Many2one(
  702. 'res.company',
  703. string='公司',
  704. change_default=True,
  705. default=lambda self: self.env.company)
  706. @api.onchange('period_begin_id', 'period_end_id')
  707. def onchange_period(self):
  708. '''结束期间大于起始期间报错'''
  709. if self.env['finance.period'].period_compare(
  710. self.period_end_id, self.period_begin_id) < 0:
  711. self.period_end_id = self.period_begin_id
  712. return {'warning': {
  713. 'title': '错误',
  714. 'message':
  715. '结束期间必须大于等于开始期间!\n开始期间为:%s 结束期间为:%s' %
  716. (self.period_begin_id.name, self.period_end_id.name),
  717. }}
  718. def get_initial_balance(self, period, account_row):
  719. """取得期初余额"""
  720. vals_dict = {}
  721. if period:
  722. period_id = period.id
  723. else:
  724. period_id = False
  725. initial_balance_credit = 0
  726. initial_balance_debit = 0
  727. trial_balance_obj = self.env['trial.balance'].search(
  728. [('period_id', '=', period_id),
  729. ('subject_name_id', '=', account_row.id)])
  730. if trial_balance_obj:
  731. initial_balance_credit = trial_balance_obj.ending_balance_credit
  732. initial_balance_debit = trial_balance_obj.ending_balance_debit
  733. direction_tuple = self.judgment_lending(
  734. 0, initial_balance_credit, initial_balance_debit)
  735. vals_dict.update({
  736. 'date': False,
  737. 'direction': direction_tuple[0],
  738. 'balance': fabs(direction_tuple[1]),
  739. 'summary':
  740. account_row.code + ' ' + account_row.name + ":" + '期初余额'})
  741. return vals_dict
  742. def judgment_lending(self, balance, balance_credit, balance_debit):
  743. """根据明细账的借贷 金额 判断出本条记录的余额 及方向,balance 为上一条记录余额
  744. 传入参数 余额 ,贷方,借方
  745. :return:返回一个tuple (借贷平借贷方向 ,余额)
  746. """
  747. balance += balance_debit - balance_credit
  748. if balance > 0:
  749. direction = '借'
  750. elif balance < 0:
  751. direction = '贷'
  752. else:
  753. direction = '平'
  754. return (direction, balance)
  755. def get_year_balance(self, period, subject_name):
  756. """根据期间和科目名称 计算出本期合计 和本年累计 (已经关闭的期间)
  757. :param period 期间 subject_name 科目object
  758. return: [本期合计dict,本年合计dict ]
  759. """
  760. vals_dict = {}
  761. trial_balance_obj = self.env['trial.balance'].search(
  762. [('period_id', '=', period.id),
  763. ('subject_name_id', '=', subject_name.id)])
  764. if trial_balance_obj:
  765. cumulative_occurrence_credit = \
  766. trial_balance_obj.cumulative_occurrence_credit
  767. cumulative_occurrence_debit = \
  768. trial_balance_obj.cumulative_occurrence_debit
  769. current_occurrence_credit = \
  770. trial_balance_obj.current_occurrence_credit
  771. current_occurrence_debit = \
  772. trial_balance_obj.current_occurrence_debit
  773. ending_balance_debit = trial_balance_obj.ending_balance_debit
  774. ending_balance_credit = trial_balance_obj.ending_balance_credit
  775. else:
  776. cumulative_occurrence_credit = 0
  777. cumulative_occurrence_debit = 0
  778. current_occurrence_credit = 0
  779. current_occurrence_debit = 0
  780. ending_balance_debit = 0
  781. ending_balance_credit = 0
  782. direction_tuple_period = self.judgment_lending(
  783. 0, ending_balance_credit, ending_balance_debit)
  784. period_vals = {
  785. 'date': False,
  786. 'direction': direction_tuple_period[0],
  787. 'period_id': period.id,
  788. 'credit': current_occurrence_credit,
  789. 'debit': current_occurrence_debit,
  790. 'balance': fabs(direction_tuple_period[1]),
  791. 'summary': subject_name.code + ' ' +
  792. subject_name.name + ":" + '本期合计'}
  793. vals_dict.update({
  794. 'date': False,
  795. 'direction': direction_tuple_period[0],
  796. 'balance': fabs(direction_tuple_period[1]),
  797. 'period_id': False,
  798. 'debit': cumulative_occurrence_debit,
  799. 'credit': cumulative_occurrence_credit,
  800. 'summary': subject_name.code + ' ' +
  801. subject_name.name + ":" + '本年累计'})
  802. return [period_vals, vals_dict]
  803. def get_current_occurrence_amount(self, period, subject_name):
  804. """计算出 本期的科目的 voucher_line的明细记录 """
  805. child_ids = self.env['finance.account'].search(
  806. [('id', 'child_of', subject_name.id)])
  807. account_ids = tuple(child_ids.ids)
  808. sql = '''
  809. select vo.date as date,
  810. vo.id as voucher_id,
  811. COALESCE(vol.debit,0) as debit,
  812. vol.name as summary,
  813. COALESCE(vol.credit,0) as credit
  814. from voucher as vo left join voucher_line as vol
  815. on vo.id = vol.voucher_id
  816. where vo.state='done'
  817. and vo.period_id=%s
  818. and vol.account_id = %s
  819. order by vo.name
  820. '''
  821. self.env.cr.execute(sql, (period.id, subject_name.id))
  822. sql_results = self.env.cr.dictfetchall()
  823. last_period = self.env[
  824. 'create.trial.balance.wizard'].compute_last_period_id(period)
  825. local_last_period = last_period
  826. initial_balance = self.get_initial_balance(
  827. local_last_period, subject_name)
  828. balance = 0 # 上一条记录余额
  829. for i in range(len(sql_results)):
  830. if i == 0:
  831. balance = initial_balance['balance']
  832. if initial_balance['direction'] == '贷':
  833. balance = -balance
  834. else:
  835. balance += sql_results[i - 1]['debit'] - \
  836. sql_results[i - 1]['credit']
  837. direction_tuple = self.judgment_lending(
  838. balance, sql_results[i]['credit'], sql_results[i]['debit'])
  839. sql_results[i].update({'direction': direction_tuple[0],
  840. 'balance': fabs(direction_tuple[1]),
  841. 'period_id': period.id}
  842. )
  843. return sql_results
  844. def get_unclose_year_balance(self, initial_balance_new,
  845. period, subject_name):
  846. """取得没有关闭的期间的 本期合计和 本年累计"""
  847. current_occurrence = {}
  848. child_ids = self.env['finance.account'].search(
  849. [('id', 'child_of', subject_name.id)])
  850. account_ids = tuple(child_ids.ids)
  851. sql = '''
  852. select sum(COALESCE(vol.debit,0)) as debit,
  853. sum(COALESCE(vol.credit,0)) as credit
  854. from voucher as vo left join voucher_line as vol
  855. on vo.id = vol.voucher_id where vo.state='done'
  856. and vo.period_id=%s and vol.account_id in %s
  857. group by vol.account_id'''
  858. self.env.cr.execute(sql, (period.id, account_ids))
  859. sql_results = self.env.cr.dictfetchall()
  860. current_credit = 0
  861. current_debit = 0
  862. if sql_results:
  863. current_credit = sum(row.get('credit', 0) for row in sql_results)
  864. current_debit = sum(row.get('debit', 0) for row in sql_results)
  865. # 本年累计
  866. # 查找累计区间,作本年累计
  867. year_balance_debit = year_balance_credit = 0
  868. compute_periods = self.env['finance.period'].search(
  869. [('year', '=', str(period.year)),
  870. ('month', '<=', str(period.month))])
  871. init_period_id = False
  872. for line_period in compute_periods:
  873. if line_period == line_period.get_init_period():
  874. init_period_id = line_period
  875. sql = '''
  876. select sum(COALESCE(vol.debit,0)) as debit,
  877. sum(COALESCE(vol.credit,0)) as credit
  878. from voucher as vo left join voucher_line as vol
  879. on vo.id = vol.voucher_id where vo.state='done'
  880. and vo.period_id=%s and vol.account_id in %s
  881. group by vol.account_id'''
  882. self.env.cr.execute(sql, (line_period.id, account_ids))
  883. sql_results = self.env.cr.dictfetchall()
  884. if sql_results:
  885. year_balance_debit = year_balance_debit + \
  886. sum(row.get('debit', 0) for row in sql_results)
  887. year_balance_credit = year_balance_credit + \
  888. sum(row.get('credit', 0) for row in sql_results)
  889. if init_period_id:
  890. trial_balance_init_period = self.env['trial.balance'].search(
  891. [('subject_name_id', '=', subject_name.id),
  892. ('period_id', '=', init_period_id.id)])
  893. year_balance_debit -= sum(
  894. trial_balance_init_period.mapped('year_init_debit'))
  895. year_balance_credit -= sum(
  896. trial_balance_init_period.mapped('year_init_credit'))
  897. direction_tuple_current = self.judgment_lending(
  898. initial_balance_new.get('balance', 0)
  899. if initial_balance_new['direction'] == '借'
  900. else -initial_balance_new.get('balance', 0),
  901. current_credit, current_debit)
  902. current_occurrence.update({
  903. 'date': False,
  904. 'direction': direction_tuple_current[0],
  905. 'balance': fabs(direction_tuple_current[1]),
  906. 'debit': current_debit,
  907. 'credit': current_credit,
  908. 'period_id': period.id,
  909. 'summary': subject_name.code + ' ' +
  910. subject_name.name + ":" + '本期合计'
  911. })
  912. initial_balance_new.update({
  913. 'date': False,
  914. 'direction': direction_tuple_current[0],
  915. 'balance': abs(direction_tuple_current[1]),
  916. 'debit': year_balance_debit,
  917. 'credit': year_balance_credit,
  918. 'period_id': False,
  919. 'summary': subject_name.code + ' ' +
  920. subject_name.name + ":" + '本年累计'
  921. })
  922. return [current_occurrence, initial_balance_new]
  923. def create_vouchers_summary(self):
  924. """创建出根据所选期间范围内的 明细帐记录"""
  925. last_period = self.env[
  926. 'create.trial.balance.wizard'].compute_last_period_id(
  927. self.period_begin_id)
  928. if last_period:
  929. if not last_period.is_closed:
  930. raise UserError('期间%s未结账,无法取到%s期初余额' %
  931. (last_period.name, self.period_begin_id.name))
  932. vouchers_summary_ids = []
  933. subject_ids = self.env['finance.account'].search(
  934. [('code', '>=', self.subject_name_id.code),
  935. ('code', '<=', self.subject_name_end_id.code)])
  936. account_ids = []
  937. for subject_id in subject_ids:
  938. child_subject_ids = self.env['finance.account'].search(
  939. [('id', 'child_of', subject_id.id)])
  940. account_ids.extend(child_subject_ids)
  941. new_account_ids = []
  942. for account in account_ids:
  943. if account not in new_account_ids:
  944. new_account_ids.append(account)
  945. for account_line in new_account_ids:
  946. local_last_period = last_period
  947. local_currcy_period = self.period_begin_id
  948. break_flag = True
  949. init = 1
  950. while break_flag:
  951. create_vals = []
  952. initial_balance = self.get_initial_balance(
  953. local_last_period, account_line) # 取上期间期初余额
  954. if init:
  955. create_vals.append(initial_balance) # 期初
  956. init = 0
  957. occurrence_amount = self.get_current_occurrence_amount(
  958. local_currcy_period, account_line) # 本期明细
  959. create_vals += occurrence_amount
  960. if local_currcy_period.is_closed:
  961. cumulative_year_occurrence = self.get_year_balance(
  962. local_currcy_period, account_line) # 本期合计 本年累计
  963. else:
  964. cumulative_year_occurrence = self.get_unclose_year_balance(
  965. copy.deepcopy(initial_balance),
  966. local_currcy_period, account_line)
  967. create_vals += cumulative_year_occurrence
  968. if local_currcy_period.id == self.period_end_id.id:
  969. break_flag = False
  970. local_last_period = local_currcy_period
  971. local_currcy_period = self.env[
  972. 'create.trial.balance.wizard'].compute_next_period_id(
  973. local_currcy_period)
  974. if not local_currcy_period: # 无下一期间,退出循环。
  975. break_flag = False
  976. # # 无发生额不显示
  977. # if self.no_occurred and len(occurrence_amount) == 0:
  978. # continue
  979. # 无余额不显示
  980. if cumulative_year_occurrence[0].get('credit') == 0 \
  981. and cumulative_year_occurrence[0].get('debit') == 0 \
  982. and cumulative_year_occurrence[0].get('balance') == 0:
  983. continue
  984. for vals in create_vals: # create_vals 值顺序为:期初余额 本期明细 本期本年累计
  985. vouchers_summary_ids.append(
  986. (self.env['vouchers.summary'].create(vals)).id)
  987. view_id = self.env.ref('finance.vouchers_summary_list').id
  988. title = self.period_begin_id.name
  989. if self.period_end_id != self.period_begin_id:
  990. title += '-'
  991. title += self.period_end_id.name
  992. title += '_'
  993. title += self.subject_name_id.name
  994. if self.subject_name_end_id != self.subject_name_id:
  995. title += '-'
  996. title += self.subject_name_end_id.name
  997. return {
  998. 'type': 'ir.actions.act_window',
  999. 'name': '明细账 : %s' % title,
  1000. 'view_mode': 'list',
  1001. 'res_model': 'vouchers.summary',
  1002. 'target': 'main',
  1003. 'view_id': False,
  1004. 'views': [(view_id, 'list')],
  1005. 'domain': [('id', 'in', vouchers_summary_ids)],
  1006. 'limit': 65535,
  1007. }
  1008. def create_general_ledger_account(self):
  1009. """创建总账"""
  1010. last_period = self.env[
  1011. 'create.trial.balance.wizard'].compute_last_period_id(
  1012. self.period_begin_id)
  1013. if last_period and not last_period.is_closed:
  1014. raise UserError(
  1015. '期间%s未结账,无法取到%s期初余额' %
  1016. (last_period.name, self.period_begin_id.name))
  1017. vouchers_summary_ids = []
  1018. subject_ids = self.env['finance.account'].search(
  1019. [('code', '>=', self.subject_name_id.code),
  1020. ('code', '<=', self.subject_name_end_id.code)])
  1021. account_ids = []
  1022. for subject_id in subject_ids:
  1023. child_subject_ids = self.env['finance.account'].search(
  1024. [('id', 'child_of', subject_id.id)])
  1025. account_ids.extend(child_subject_ids)
  1026. new_account_ids = []
  1027. for account in account_ids:
  1028. if account not in new_account_ids:
  1029. new_account_ids.append(account)
  1030. for account_line in new_account_ids:
  1031. local_last_period = last_period
  1032. local_currcy_period = self.period_begin_id
  1033. break_flag = True
  1034. while break_flag:
  1035. create_vals = []
  1036. initial_balance = self.get_initial_balance(
  1037. local_last_period, account_line)
  1038. create_vals.append(initial_balance)
  1039. if local_currcy_period.is_closed:
  1040. cumulative_year_occurrence = self.get_year_balance(
  1041. local_currcy_period, account_line)
  1042. else:
  1043. cumulative_year_occurrence = self.get_unclose_year_balance(
  1044. copy.deepcopy(initial_balance),
  1045. local_currcy_period, account_line)
  1046. create_vals += cumulative_year_occurrence
  1047. if local_currcy_period.id == self.period_end_id.id:
  1048. break_flag = False
  1049. local_last_period = local_currcy_period
  1050. local_currcy_period = self.env[
  1051. 'create.trial.balance.wizard'].compute_next_period_id(
  1052. local_currcy_period)
  1053. if not local_currcy_period: # 无下一期间,退出循环。
  1054. break_flag = False
  1055. # 无余额不显示
  1056. if self.no_balance \
  1057. and cumulative_year_occurrence[0].get('credit') == 0 \
  1058. and cumulative_year_occurrence[0].get('debit') == 0 \
  1059. and cumulative_year_occurrence[1].get('credit') == 0 \
  1060. and cumulative_year_occurrence[1].get('debit') == 0:
  1061. continue
  1062. for vals in create_vals:
  1063. del vals['date']
  1064. vouchers_summary_ids.append(
  1065. (self.env['general.ledger.account'].create(vals)).id)
  1066. view_id = self.env.ref('finance.general_ledger_account_list').id
  1067. title = self.period_begin_id.name
  1068. if self.period_end_id != self.period_begin_id:
  1069. title += '-'
  1070. title += self.period_end_id.name
  1071. title += '_'
  1072. title += self.subject_name_id.name
  1073. if self.subject_name_end_id != self.subject_name_id:
  1074. title += '-'
  1075. title += self.subject_name_end_id.name
  1076. return {
  1077. 'type': 'ir.actions.act_window',
  1078. 'name': '总账 %s' % title,
  1079. 'view_mode': 'list',
  1080. 'res_model': 'general.ledger.account',
  1081. 'target': 'main',
  1082. 'view_id': False,
  1083. 'views': [(view_id, 'list')],
  1084. 'domain': [('id', 'in', vouchers_summary_ids)],
  1085. 'limit': 65535,
  1086. }
  1087. class VouchersSummary(models.TransientModel):
  1088. """明细帐"""
  1089. _name = 'vouchers.summary'
  1090. _description = '明细账'
  1091. date = fields.Date('日期', help='日期')
  1092. period_id = fields.Many2one('finance.period', string='会计期间', help='会计期间')
  1093. voucher_id = fields.Many2one('voucher', '凭证字号', help='凭证字号')
  1094. summary = fields.Char('摘要', help='从凭证中获取到对应的摘要')
  1095. direction = fields.Char('方向', help='会计术语,主要方向借、贷、平, 当借方金额大于贷方金额 方向为借\n\
  1096. ,当贷方金额大于借方金额 方向为贷\n 借贷相等时 方向为平')
  1097. debit = fields.Float('借方金额', digits='Amount', help='借方金额')
  1098. credit = fields.Float('贷方金额', digits='Amount', help='贷方金额')
  1099. balance = fields.Float('余额', digits='Amount', help='一般显示为正数,计算方式:当方向为借时 \
  1100. 余额= 借方金额-贷方金额, 当方向为贷时 余额= 贷方金额-借方金额')
  1101. def view_detail_voucher(self):
  1102. '''查看凭证明细按钮'''
  1103. view = self.env.ref('finance.voucher_form')
  1104. return {
  1105. 'name': '会计凭证明细',
  1106. 'view_mode': 'form',
  1107. 'view_id': False,
  1108. 'views': [(view.id, 'form')],
  1109. 'res_model': 'voucher',
  1110. 'type': 'ir.actions.act_window',
  1111. 'res_id': self.voucher_id.id,
  1112. }
  1113. class GeneralLedgerAccount(models.TransientModel):
  1114. """总账"""
  1115. _name = 'general.ledger.account'
  1116. _description = '总账'
  1117. period_id = fields.Many2one(
  1118. 'finance.period', string='会计期间', help='记录本条记录的期间!')
  1119. summary = fields.Char('摘要', help='摘要')
  1120. direction = fields.Char('方向', help='会计术语,主要方向借、贷、平, 当借方金额大于贷方金额 方向为借\n\
  1121. ,当贷方金额大于借方金额 方向为贷\n 借贷相等时 方向为平')
  1122. debit = fields.Float('借方金额', digits='Amount', help='借方金额')
  1123. credit = fields.Float('贷方金额', digits='Amount', help='贷方金额')
  1124. balance = fields.Float('余额', digits='Amount', help='一般显示为正数,计算方式:当方向为借时\
  1125. 余额= 借方金额-贷方金额, 当方向为贷时 余额= 贷方金额-借方金额')
上海开阖软件有限公司 沪ICP备12045867号-1