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.

176 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 odoo import fields, models, api, tools
  4. from odoo.exceptions import UserError
  5. class SupplierStatementsReport(models.Model):
  6. _inherit = "supplier.statements.report"
  7. _auto = False
  8. purchase_amount = fields.Float(string='采购金额', readonly=True,
  9. digits='Amount')
  10. benefit_amount = fields.Float(string='优惠金额', readonly=True,
  11. digits='Amount')
  12. move_id = fields.Many2one('wh.move', string='出入库单', readonly=True)
  13. def init(self):
  14. # union money_order(type = 'pay'), money_invoice(type = 'expense')
  15. cr = self._cr
  16. tools.drop_view_if_exists(cr, 'supplier_statements_report')
  17. cr.execute("""
  18. CREATE or REPLACE VIEW supplier_statements_report AS (
  19. SELECT ROW_NUMBER() OVER(ORDER BY partner_id, date, amount desc) AS id,
  20. partner_id,
  21. name,
  22. date,
  23. done_date,
  24. purchase_amount,
  25. benefit_amount,
  26. amount,
  27. pay_amount,
  28. discount_money,
  29. balance_amount,
  30. note,
  31. move_id
  32. FROM
  33. (
  34. SELECT m.partner_id,
  35. m.name,
  36. m.date,
  37. m.write_date AS done_date,
  38. 0 AS purchase_amount,
  39. 0 AS benefit_amount,
  40. 0 AS amount,
  41. m.amount AS pay_amount,
  42. m.discount_amount AS discount_money,
  43. 0 AS balance_amount,
  44. m.note,
  45. NULL AS move_id
  46. FROM money_order AS m
  47. WHERE m.type = 'pay' AND m.state = 'done'
  48. UNION ALL
  49. SELECT mi.partner_id,
  50. mi.name,
  51. mi.date,
  52. mi.create_date AS done_date,
  53. br.amount + br.discount_amount AS purchase_amount,
  54. br.discount_amount AS benefit_amount,
  55. mi.amount,
  56. 0 AS pay_amount,
  57. 0 AS discount_money,
  58. 0 AS balance_amount,
  59. Null AS note,
  60. mi.move_id
  61. FROM money_invoice AS mi
  62. LEFT JOIN core_category AS c ON mi.category_id = c.id
  63. LEFT JOIN buy_receipt AS br ON br.buy_move_id = mi.move_id
  64. WHERE c.type = 'expense' AND mi.state = 'done'
  65. ) AS ps)
  66. """)
  67. def find_source_order(self):
  68. # 查看原始单据,三情况:收付款单、采购退货单、采购入库单、核销单
  69. model_view = {
  70. 'money.order': {'name': '付款单',
  71. 'view': 'money.money_order_form'},
  72. 'buy.receipt': {'name': '采购入库单',
  73. 'view': 'buy.buy_receipt_form',
  74. 'name_return': '采购退货单',
  75. 'view_return': 'buy.buy_return_form'},
  76. 'reconcile.order': {'name': '核销单',
  77. 'view': 'money.reconcile_order_form'}
  78. }
  79. for model, view_dict in model_view.items():
  80. res = self.env[model].search([('name', '=', self.name)])
  81. name = model == 'buy.receipt' and res.is_return and \
  82. view_dict['name_return'] or view_dict['name']
  83. view = model == 'buy.receipt' and res.is_return and \
  84. self.env.ref(view_dict['view_return']) \
  85. or self.env.ref(view_dict['view'])
  86. if res:
  87. return {
  88. 'name': name,
  89. 'view_mode': 'form',
  90. 'view_id': False,
  91. 'views': [(view.id, 'form')],
  92. 'res_model': model,
  93. 'type': 'ir.actions.act_window',
  94. 'res_id': res.id,
  95. }
  96. raise UserError('期初余额没有原始单据可供查看。')
  97. class SupplierStatementsReportWithGoods(models.TransientModel):
  98. _name = "supplier.statements.report.with.goods"
  99. _description = "供应商对账单带商品明细"
  100. partner_id = fields.Many2one('partner', string='业务伙伴', readonly=True)
  101. name = fields.Char(string='单据编号', readonly=True)
  102. date = fields.Date(string='单据日期', readonly=True)
  103. done_date = fields.Date(string='完成日期', readonly=True)
  104. category_id = fields.Many2one('core.category', '商品类别')
  105. goods_code = fields.Char('商品编号')
  106. goods_name = fields.Char('商品名称')
  107. attribute_id = fields.Many2one('attribute', '规格型号')
  108. uom_id = fields.Many2one('uom', '单位')
  109. quantity = fields.Float('数量',
  110. digits='Quantity')
  111. price = fields.Float('单价',
  112. digits='Amount')
  113. discount_amount = fields.Float('折扣额',
  114. digits='Amount')
  115. without_tax_amount = fields.Float('不含税金额',
  116. digits='Amount')
  117. tax_amount = fields.Float('税额',
  118. digits='Amount')
  119. order_amount = fields.Float(string='采购金额', readonly=True,
  120. digits='Amount') # 采购
  121. benefit_amount = fields.Float(string='优惠金额', readonly=True,
  122. digits='Amount')
  123. fee = fields.Float(string='客户承担费用', readonly=True,
  124. digits='Amount')
  125. amount = fields.Float(string='应付金额', readonly=True,
  126. digits='Amount')
  127. pay_amount = fields.Float(string='实际付款金额', readonly=True,
  128. digits='Amount')
  129. discount_money = fields.Float(string='付款折扣', readonly=True,
  130. digits='Amount')
  131. balance_amount = fields.Float(string='应付款余额', readonly=True,
  132. digits='Amount')
  133. note = fields.Char(string='备注', readonly=True)
  134. move_id = fields.Many2one('wh.move', string='出入库单', readonly=True)
  135. def find_source_order(selfs):
  136. # 三情况:收付款单、采购退货单、采购入库单、核销单
  137. for self in selfs:
  138. model_view = {
  139. 'money.order': {'name': '付款单',
  140. 'view': 'money.money_order_form'},
  141. 'buy.receipt': {'name': '采购入库单',
  142. 'view': 'buy.buy_receipt_form',
  143. 'name_return': '采购退货单',
  144. 'view_return': 'buy.buy_return_form'},
  145. 'reconcile.order': {'name': '核销单',
  146. 'view': 'money.reconcile_order_form'}
  147. }
  148. for model, view_dict in model_view.items():
  149. res = self.env[model].search([('name', '=', self.name)])
  150. name = model == 'buy.receipt' and res.is_return and \
  151. view_dict['name_return'] or view_dict['name']
  152. view = model == 'buy.receipt' and res.is_return and \
  153. self.env.ref(view_dict['view_return']) \
  154. or self.env.ref(view_dict['view'])
  155. if res:
  156. return {
  157. 'name': name,
  158. 'view_mode': 'form',
  159. 'view_id': False,
  160. 'views': [(view.id, 'form')],
  161. 'res_model': model,
  162. 'type': 'ir.actions.act_window',
  163. 'res_id': res.id,
  164. }
  165. raise UserError('期初余额没有原始单据可供查看。')
上海开阖软件有限公司 沪ICP备12045867号-1