GoodERP
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

205 lines
8.0KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from datetime import datetime
  4. from odoo import fields, models, api
  5. from odoo.tools import float_is_zero
  6. from odoo.exceptions import UserError, ValidationError
  7. class Partner(models.Model):
  8. '''查看业务伙伴对账单'''
  9. _inherit = 'partner'
  10. def _init_source_create(self, name, partner_id, category_id, is_init, date,
  11. currency_id,
  12. amount, reconciled, to_reconcile, date_due, state):
  13. if not float_is_zero(amount, 2):
  14. return self.env['money.invoice'].create({
  15. 'name': name,
  16. 'partner_id': partner_id,
  17. 'category_id': category_id,
  18. 'is_init': is_init,
  19. 'currency_id': currency_id,
  20. 'date': date,
  21. 'amount': amount,
  22. 'reconciled': reconciled,
  23. 'to_reconcile': to_reconcile,
  24. 'date_due': date_due,
  25. 'state': state,
  26. })
  27. def _set_receivable_init(self):
  28. self.ensure_one()
  29. # 如果有前期初值,删掉已前的单据
  30. money_invoice_id = self.env['money.invoice'].search([
  31. ('partner_id', '=', self.id),
  32. ('name', '=', '期初应收余额'),
  33. ('is_init', '=', True)])
  34. if money_invoice_id:
  35. if money_invoice_id.state == 'done':
  36. money_invoice_id.money_invoice_draft()
  37. money_invoice_id.unlink()
  38. if self.receivable_init:
  39. # 创建结算单
  40. categ = self.env.ref('money.core_category_sale')
  41. self._init_source_create(
  42. "期初应收余额", self.id, categ.id, True,
  43. self.env.user.company_id.start_date,
  44. self.c_category_id.account_id.currency_id.id,
  45. self.receivable_init, 0,
  46. self.receivable_init,
  47. self.env.user.company_id.start_date,
  48. 'draft')
  49. def _set_payable_init(self):
  50. self.ensure_one()
  51. # 如果有前期初值,删掉已前的单据
  52. money_invoice_id = self.env['money.invoice'].search([
  53. ('partner_id', '=', self.id),
  54. ('name', '=', '期初应付余额'),
  55. ('is_init', '=', True)])
  56. if money_invoice_id:
  57. money_invoice_id.money_invoice_draft()
  58. money_invoice_id.unlink()
  59. if self.payable_init:
  60. # 创建结算单
  61. categ = self.env.ref('money.core_category_purchase')
  62. self._init_source_create(
  63. "期初应付余额", self.id, categ.id, True,
  64. self.env.user.company_id.start_date,
  65. self.s_category_id.account_id.currency_id.id,
  66. self.payable_init, 0,
  67. self.payable_init,
  68. self.env.user.company_id.start_date, 'draft')
  69. receivable_init = fields.Float(u'应收期初',
  70. digits='Amount',
  71. copy=False,
  72. inverse=_set_receivable_init,
  73. help=u'客户的应收期初余额')
  74. payable_init = fields.Float(u'应付期初',
  75. digits='Amount',
  76. copy=False,
  77. inverse=_set_payable_init,
  78. help=u'供应商的应付期初余额')
  79. invoice_ids = fields.One2many(
  80. 'money.invoice', 'partner_id', '未清结算单',
  81. domain=[
  82. ('to_reconcile', '>', 0),
  83. ('state', '=', 'done'),
  84. ('date_due', '<=', datetime.today().date())])
  85. money_ids = fields.One2many(
  86. 'money.order', 'partner_id', '未清付款',
  87. domain=[('to_reconcile', '>', 0), ('state', '=', 'done')])
  88. amount_due = fields.Float('到期余额', compute='_compute_amount_due')
  89. def _compute_amount_due(self):
  90. for p in self:
  91. p.amount_due = 0
  92. p.amount_due += sum([i.to_reconcile for i in p.invoice_ids])
  93. p.amount_due -= sum([m.to_reconcile for m in p.money_ids])
  94. p.amount_due = round(p.amount_due, 2)
  95. def partner_statements(self):
  96. """
  97. 调用这个方法弹出 业务伙伴对账单向导
  98. :return:
  99. """
  100. self.ensure_one()
  101. ctx = {'default_partner_id': self.id}
  102. # 既是客户又是供应商的业务伙伴,根据是在客户还是供应商界面点击的 查看对账单 按钮,显示不同的明细
  103. if (self.c_category_id.type == 'customer'
  104. and self.env.context.get('is_customer_view')):
  105. view = self.env.ref('money.customer_statements_report_wizard_form')
  106. ctx.update({'default_customer': True})
  107. else:
  108. view = self.env.ref('money.partner_statements_report_wizard_form')
  109. ctx.update({'default_supplier': True})
  110. return {
  111. 'name': u'业务伙伴对账单向导',
  112. 'view_mode': 'form',
  113. 'view_id': False,
  114. 'views': [(view.id, 'form')],
  115. 'res_model': 'partner.statements.report.wizard',
  116. 'type': 'ir.actions.act_window',
  117. 'context': ctx,
  118. 'target': 'new',
  119. }
  120. def action_view_money_invoice(self):
  121. self.ensure_one()
  122. act = self.env.ref('money.action_view_money_invoice').read([])[0]
  123. act.update({'domain': [('partner_id', '=', self.id)]})
  124. act.update({'context': {'search_default_to_reconcile': '1'}})
  125. return act
  126. class BankAccount(models.Model):
  127. '''查看账户对账单'''
  128. _inherit = 'bank.account'
  129. def _set_init_balance(self):
  130. """
  131. 如果 init_balance 字段里面有值则 进行 一系列的操作。
  132. :return:
  133. """
  134. self.ensure_one()
  135. start_date = self.env.user.company_id.start_date
  136. start_date_period_id = self.env['finance.period'].search_period(
  137. start_date)
  138. if self.init_balance and start_date_period_id.is_closed:
  139. raise UserError(u'初始化期间(%s)已结账!' % start_date_period_id.name)
  140. # 如果有前期初值,删掉已前的单据
  141. other_money_id = self.env['other.money.order'].search([
  142. ('bank_id', '=', self.id),
  143. ('is_init', '=', True)])
  144. if other_money_id:
  145. other_money_id.other_money_draft()
  146. other_money_id.unlink()
  147. if self.init_balance:
  148. # 资金期初 生成 其他收入
  149. money_get = self.with_context(
  150. type='other_get').env['other.money.order']
  151. other_money_init = money_get.create({
  152. 'bank_id': self.id,
  153. 'date': self.env.user.company_id.start_date,
  154. 'is_init': True,
  155. 'line_ids': [(0, 0, {
  156. 'category_id': self.env.ref('money.core_category_init').id,
  157. 'amount': self.init_balance,
  158. 'tax_rate': 0,
  159. 'tax_amount': 0,
  160. })],
  161. 'state': 'draft',
  162. 'currency_amount': self.currency_amount,
  163. })
  164. # 审核 其他收入单
  165. other_money_init.other_money_done()
  166. init_balance = fields.Float(u'期初',
  167. digits='Amount',
  168. inverse=_set_init_balance,
  169. help=u'资金的期初余额')
  170. def bank_statements(self):
  171. """
  172. 账户对账单向导 调用这个方法弹出 账户对账单向导
  173. :return:
  174. """
  175. self.ensure_one()
  176. view = self.env.ref('money.bank_statements_report_wizard_form')
  177. return {
  178. 'name': u'账户对账单向导',
  179. 'view_mode': 'form',
  180. 'view_id': False,
  181. 'views': [(view.id, 'form')],
  182. 'res_model': 'bank.statements.report.wizard',
  183. 'type': 'ir.actions.act_window',
  184. 'context': {'default_bank_id': self.id},
  185. 'target': 'new',
  186. }
上海开阖软件有限公司 沪ICP备12045867号-1