GoodERP
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

207 linhas
8.1KB

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