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.

346 rindas
17KB

  1. # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
  3. from odoo.exceptions import UserError
  4. from odoo import fields, models, api
  5. from odoo.tools import float_compare
  6. class MoneyTransferOrder(models.Model):
  7. _name = 'money.transfer.order'
  8. _description = u'资金转账单'
  9. _inherit = ['mail.thread', 'mail.activity.mixin']
  10. _order = 'id desc'
  11. state = fields.Selection([
  12. ('draft', u'草稿'),
  13. ('done', u'已确认'),
  14. ('cancel', u'已作废'),
  15. ], string=u'状态', readonly=True,
  16. default='draft', copy=False, index=True,
  17. tracking=True,
  18. help=u'资金转账单状态标识,新建时状态为草稿;确认后状态为已确认')
  19. name = fields.Char(string=u'单据编号', copy=False, default='/',
  20. help=u'单据编号,创建时会自动生成')
  21. date = fields.Date(string=u'单据日期',
  22. default=lambda self: fields.Date.context_today(self),
  23. readonly="state!='draft'",
  24. help=u'单据创建日期')
  25. note = fields.Text(string=u'备注', help=u'可以为该单据添加一些需要的标识信息')
  26. line_ids = fields.One2many('money.transfer.order.line', 'transfer_id',
  27. string=u'资金转账单行',
  28. readonly="state!='draft'",
  29. help=u'资金转账单明细行')
  30. company_id = fields.Many2one(
  31. 'res.company',
  32. string=u'公司',
  33. change_default=True,
  34. default=lambda self: self.env.company)
  35. voucher_id = fields.Many2one('voucher',
  36. u'对应凭证',
  37. readonly=True,
  38. ondelete='restrict',
  39. help=u'资金转账单确认时生成的对应凭证',
  40. copy=False)
  41. transfer_amount = fields.Float(
  42. compute='_compute_transfer_amount', string='转账总金额')
  43. @api.depends('line_ids', 'line_ids.amount')
  44. def _compute_transfer_amount(self):
  45. for mto in self:
  46. mto.transfer_amount = sum([line.amount for line in mto.line_ids])
  47. def money_transfer_done(self):
  48. '''转账单的审核按钮'''
  49. self.ensure_one()
  50. if not self.line_ids:
  51. raise UserError('请先输入转账金额')
  52. decimal_amount = self.env.ref('core.decimal_amount')
  53. for line in self.line_ids:
  54. company_currency_id = self.env.user.company_id.currency_id.id
  55. out_currency_id = \
  56. line.out_bank_id.currency_id.id or company_currency_id
  57. in_currency_id = \
  58. line.in_bank_id.currency_id.id or company_currency_id
  59. if line.out_bank_id == line.in_bank_id:
  60. raise UserError('转出账户与转入账户不能相同')
  61. if line.amount <= 0:
  62. raise UserError('转账金额必须大于0。\n 转账金额:%s' % line.amount)
  63. if out_currency_id == company_currency_id: # 如果转出账户是公司本位币
  64. if float_compare(
  65. line.out_bank_id.balance,
  66. line.amount,
  67. decimal_amount.digits) == -1:
  68. raise UserError('转出账户余额不足。\n转出账户余额:%s 本次转出金额:%s' % (
  69. line.out_bank_id.balance, line.amount))
  70. else: # 转出账户余额充足
  71. line.out_bank_id.balance -= line.amount
  72. if in_currency_id == company_currency_id: # 如果转入账户是公司本位币
  73. line.in_bank_id.balance += line.amount
  74. else: # 如果转入账户是外币
  75. line.in_bank_id.balance += line.currency_amount
  76. else: # 如果转出账户是外币
  77. if float_compare(
  78. line.out_bank_id.balance,
  79. line.currency_amount,
  80. precision_digits=decimal_amount.digits) == -1:
  81. raise UserError(
  82. '转出账户余额不足。\n转出账户余额:%s 本次转出外币金额:%s'
  83. % (line.out_bank_id.balance, line.currency_amount))
  84. if in_currency_id == company_currency_id: # 如果转入账户是公司本位币
  85. line.in_bank_id.balance += line.amount
  86. line.out_bank_id.balance -= line.currency_amount
  87. elif (in_currency_id != company_currency_id
  88. and in_currency_id == out_currency_id):
  89. # 如果转入账户是外币,只支持同种外币互转
  90. line.in_bank_id.balance += line.currency_amount
  91. line.out_bank_id.balance -= line.currency_amount
  92. else:
  93. raise UserError('系统不支持外币转不同外币')
  94. # 创建凭证并审核
  95. voucher = self.create_voucher()
  96. return self.write({
  97. 'voucher_id': voucher.id,
  98. 'state': 'done',
  99. })
  100. def money_transfer_draft(self):
  101. '''转账单的反审核按钮,外币要考虑是转入还是转出'''
  102. self.ensure_one()
  103. decimal_amount = self.env.ref('core.decimal_amount')
  104. for line in self.line_ids:
  105. company_currency_id = self.env.user.company_id.currency_id.id
  106. out_currency_id = \
  107. line.out_bank_id.currency_id.id or company_currency_id
  108. in_currency_id = \
  109. line.in_bank_id.currency_id.id or company_currency_id
  110. if line.currency_amount > 0:
  111. if (in_currency_id != company_currency_id
  112. and out_currency_id == in_currency_id):
  113. # 转入和转出都是外币
  114. if float_compare(
  115. line.in_bank_id.balance,
  116. line.currency_amount,
  117. precision_digits=decimal_amount.digits) == -1:
  118. raise UserError(
  119. '转入账户余额不足。\n转入账户余额:%s 本次转出外币金额:%s'
  120. % (line.in_bank_id.balance, line.currency_amount))
  121. else: # 转入账户余额充足
  122. line.in_bank_id.balance -= line.currency_amount
  123. line.out_bank_id.balance += line.currency_amount
  124. elif (in_currency_id == company_currency_id
  125. and out_currency_id != company_currency_id):
  126. # 转入账户为本位币,转出是外币
  127. if float_compare(
  128. line.in_bank_id.balance,
  129. line.amount,
  130. precision_digits=decimal_amount.digits) == -1:
  131. raise UserError(
  132. '转入账户余额不足。\n转入账户余额:%s 本次转出金额:%s'
  133. % (line.in_bank_id.balance, line.amount))
  134. else:
  135. line.in_bank_id.balance -= line.amount
  136. line.out_bank_id.balance += line.currency_amount
  137. elif (in_currency_id != company_currency_id
  138. and out_currency_id == company_currency_id):
  139. # 转入账户为外币,转出是人民币
  140. if float_compare(
  141. line.in_bank_id.balance,
  142. line.currency_amount,
  143. precision_digits=decimal_amount.digits) == -1:
  144. raise UserError(
  145. '转入账户余额不足。\n转入账户余额:%s 本次转出金额:%s'
  146. % (line.in_bank_id.balance, line.currency_amount))
  147. else:
  148. line.in_bank_id.balance -= line.currency_amount
  149. line.out_bank_id.balance += line.amount
  150. else:
  151. raise UserError('系统不支持外币转不同外币')
  152. else: # 转入/转出账户都为本位币
  153. if float_compare(
  154. line.in_bank_id.balance,
  155. line.amount,
  156. precision_digits=decimal_amount.digits) == -1:
  157. raise UserError('转入账户余额不足。\n转入账户余额:%s 本次转出金额:%s'
  158. % (line.in_bank_id.balance, line.amount))
  159. else:
  160. line.in_bank_id.balance -= line.amount
  161. line.out_bank_id.balance += line.amount
  162. voucher = self.voucher_id
  163. self.write({
  164. 'voucher_id': False,
  165. 'state': 'draft',
  166. })
  167. # 反审核凭证并删除
  168. if voucher.state == 'done':
  169. voucher.voucher_draft()
  170. voucher.unlink()
  171. return True
  172. def create_voucher(self):
  173. """创建凭证并审核"""
  174. vouch_obj = self.env['voucher'].create(
  175. {'date': self.date, 'ref': '%s,%s' % (self._name, self.id)})
  176. vals = {}
  177. for line in self.line_ids:
  178. out_currency_id = (
  179. line.out_bank_id.currency_id.id
  180. or self.env.user.company_id.currency_id.id)
  181. in_currency_id = (
  182. line.in_bank_id.currency_id.id
  183. or self.env.user.company_id.currency_id.id)
  184. company_currency_id = self.env.user.company_id.currency_id.id
  185. if (out_currency_id != company_currency_id
  186. or in_currency_id != company_currency_id) \
  187. and not line.currency_amount:
  188. raise UserError('错误, 请请输入外币金额。')
  189. if (line.currency_amount
  190. and in_currency_id == company_currency_id
  191. and out_currency_id != company_currency_id):
  192. '''结汇'''
  193. '''借方行'''
  194. self.env['voucher.line'].create({
  195. 'name': "%s %s结汇至%s %s" % (
  196. self.name,
  197. line.out_bank_id.name,
  198. line.in_bank_id.name,
  199. self.note),
  200. 'account_id': line.in_bank_id.account_id.id,
  201. 'debit': line.amount,
  202. 'voucher_id': vouch_obj.id,
  203. 'partner_id': '',
  204. 'currency_id': '',
  205. 'currency_amount': line.currency_amount,
  206. 'rate_silent': line.amount / line.currency_amount
  207. })
  208. '''贷方行'''
  209. self.env['voucher.line'].create({
  210. 'name': "%s %s结汇至%s %s" % (
  211. self.name, line.out_bank_id.name,
  212. line.in_bank_id.name,
  213. self.note),
  214. 'account_id': line.out_bank_id.account_id.id,
  215. 'credit': line.amount,
  216. 'voucher_id': vouch_obj.id,
  217. 'partner_id': '',
  218. 'currency_id': out_currency_id,
  219. 'currency_amount': line.currency_amount,
  220. 'rate_silent': line.amount / line.currency_amount
  221. })
  222. elif (line.currency_amount
  223. and in_currency_id != company_currency_id
  224. and out_currency_id == company_currency_id):
  225. '''买汇'''
  226. '''借方行'''
  227. self.env['voucher.line'].create({
  228. 'name': u"%s %s买汇至%s %s" % (
  229. self.name,
  230. line.out_bank_id.name,
  231. line.in_bank_id.name,
  232. self.note),
  233. 'account_id': line.in_bank_id.account_id.id,
  234. 'debit': line.amount,
  235. 'voucher_id': vouch_obj.id,
  236. 'partner_id': '',
  237. 'currency_id': in_currency_id,
  238. 'currency_amount': line.currency_amount,
  239. 'rate_silent': line.amount / line.currency_amount
  240. })
  241. '''贷方行'''
  242. self.env['voucher.line'].create({
  243. 'name': u"%s %s买汇至%s %s" % (
  244. self.name,
  245. line.out_bank_id.name,
  246. line.in_bank_id.name,
  247. self.note),
  248. 'account_id': line.out_bank_id.account_id.id,
  249. 'credit': line.amount,
  250. 'voucher_id': vouch_obj.id,
  251. 'partner_id': '',
  252. 'currency_id': '',
  253. 'currency_amount': line.currency_amount,
  254. 'rate_silent': line.amount / line.currency_amount
  255. })
  256. elif (line.currency_amount
  257. and in_currency_id == out_currency_id
  258. and in_currency_id != company_currency_id):
  259. '''相同外币币别互转'''
  260. '''借方行'''
  261. rate_silent = self.env['res.currency'].get_rate_silent(
  262. self.date, in_currency_id)
  263. self.env['voucher.line'].create({
  264. 'name': u"%s %s外币互转至%s %s" % (
  265. self.name,
  266. line.out_bank_id.name,
  267. line.in_bank_id.name,
  268. self.note),
  269. 'account_id': line.in_bank_id.account_id.id,
  270. 'debit': line.currency_amount * rate_silent,
  271. 'voucher_id': vouch_obj.id,
  272. 'partner_id': '',
  273. 'currency_id': in_currency_id,
  274. 'currency_amount': line.currency_amount,
  275. 'rate_silent': rate_silent
  276. })
  277. '''贷方行'''
  278. self.env['voucher.line'].create({
  279. 'name': u"%s %s外币互转至%s %s" % (
  280. self.name, line.out_bank_id.name,
  281. line.in_bank_id.name, self.note),
  282. 'account_id': line.out_bank_id.account_id.id,
  283. 'credit': line.currency_amount * rate_silent,
  284. 'voucher_id': vouch_obj.id, 'partner_id': '',
  285. 'currency_id': out_currency_id,
  286. 'currency_amount': line.currency_amount,
  287. 'rate_silent': rate_silent
  288. })
  289. else:
  290. '''人民币间'''
  291. vals.update({
  292. 'vouch_obj_id': vouch_obj.id,
  293. 'name': self.name, 'string': self.note or '',
  294. 'amount': abs(line.amount),
  295. 'credit_account_id': line.out_bank_id.account_id.id,
  296. 'debit_account_id': line.in_bank_id.account_id.id,
  297. })
  298. self.env['money.invoice'].create_voucher_line(vals)
  299. vouch_obj.voucher_done()
  300. return vouch_obj
  301. class MoneyTransferOrderLine(models.Model):
  302. _name = 'money.transfer.order.line'
  303. _description = u'资金转账单明细'
  304. transfer_id = fields.Many2one('money.transfer.order',
  305. string=u'资金转账单', ondelete='cascade',
  306. help=u'资金转账单行对应的资金转账单')
  307. out_bank_id = fields.Many2one('bank.account', string=u'转出账户',
  308. required=True, ondelete='restrict',
  309. help=u'资金转账单行上的转出账户')
  310. in_bank_id = fields.Many2one('bank.account', string=u'转入账户',
  311. required=True, ondelete='restrict',
  312. help=u'资金转账单行上的转入账户')
  313. currency_amount = fields.Float(string=u'外币金额',
  314. digits='Amount',
  315. help=u'转出或转入的外币金额')
  316. amount = fields.Float(string=u'金额',
  317. digits='Amount',
  318. help=u'转出或转入的金额')
  319. mode_id = fields.Many2one('settle.mode', string=u'结算方式',
  320. ondelete='restrict',
  321. help=u'结算方式:支票、信用卡等')
  322. number = fields.Char(string=u'结算号', help=u'本次结算号')
  323. note = fields.Char(string=u'备注',
  324. help=u'可以为该单据添加一些需要的标识信息')
  325. company_id = fields.Many2one(
  326. 'res.company',
  327. string=u'公司',
  328. change_default=True,
  329. default=lambda self: self.env.company)
上海开阖软件有限公司 沪ICP备12045867号-1