|
- # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
- # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-
- from datetime import date
- from odoo import models, fields, api
- from odoo.exceptions import UserError
-
-
- class BuyPaymentWizard(models.TransientModel):
- _name = 'buy.payment.wizard'
- _description = '采购付款一览表向导'
-
- @api.model
- def _default_date_start(self):
- return self.env.user.company_id.start_date
-
- @api.model
- def _default_date_end(self):
- return date.today()
-
- date_start = fields.Date('开始日期', default=_default_date_start,
- help='报表汇总的开始日期,默认为公司启用日期')
- date_end = fields.Date('结束日期', default=_default_date_end,
- help='报表汇总的结束日期,默认为当前日期')
- s_category_id = fields.Many2one('core.category', '供应商类别',
- help='只统计选定的供应商类别')
- partner_id = fields.Many2one('partner', '供应商',
- help='只统计选定的供应商')
- order_id = fields.Many2one('buy.receipt', '采购单号',
- help='只统计选定的采购单号')
- warehouse_dest_id = fields.Many2one('warehouse', '仓库',
- help='只统计选定的仓库')
- company_id = fields.Many2one(
- 'res.company',
- string='公司',
- change_default=True,
- default=lambda self: self.env.company)
-
- def _get_domain(self):
- '''返回wizard界面上条件'''
- cond = [('date', '>=', self.date_start),
- ('date', '<=', self.date_end),
- ('state', '=', 'done')]
- if self.s_category_id:
- cond.append(
- ('partner_id.s_category_id', '=', self.s_category_id.id)
- )
- if self.partner_id:
- cond.append(('partner_id', '=', self.partner_id.id))
- if self.order_id:
- cond.append(('id', '=', self.order_id.id))
- if self.warehouse_dest_id:
- cond += ['|', ('buy_move_id.warehouse_dest_id', '=', self.warehouse_dest_id.id),
- ('buy_move_id.warehouse_id', '=', self.warehouse_dest_id.id)]
- return cond
-
- def _compute_payment(self, receipt):
- '''计算该入库单的已付款和应付款余额'''
- # 查找入库单产生的结算单
- domain = [('name', '=', receipt.name), ('state', '=', 'done')]
- if receipt.order_id: # 查找采购订单产生的结算单
- domain = ['|', '&', ('name', '=', receipt.name), ('state', '=', 'done'),
- '&', ('name', '=', receipt.order_id.name), ('state', '=', 'done')]
- invoices = self.env['money.invoice'].search(domain)
- payment = sum([invoice.reconciled for invoice in invoices])
- return payment
-
- def _compute_payment_rate(self, payment, amount):
- '''计算付款率'''
- payment_rate = amount != 0 and (payment / amount) * 100 or 0.0
- return payment_rate
-
- def _prepare_buy_payment(self, receipt):
- '''对于传入的入库单,为创建采购付款一览表准备数据'''
- self.ensure_one()
- factor = not receipt.is_return and 1 or -1 # 如果是退货则金额均取反
- purchase_amount = factor * (receipt.discount_amount + receipt.amount)
- discount_amount = factor * receipt.discount_amount
- amount = factor * receipt.amount
- order_type = receipt.is_return and '采购退回' or '普通采购'
- warehouse = receipt.is_return and receipt.warehouse_id or receipt.warehouse_dest_id
- # 计算该入库单的已付款
- payment = self._compute_payment(receipt)
- return {
- 's_category_id': receipt.partner_id.s_category_id.id,
- 'partner_id': receipt.partner_id.id,
- 'type': order_type,
- 'date': receipt.date,
- 'warehouse_dest_id': warehouse.id,
- 'order_name': receipt.name,
- 'purchase_amount': purchase_amount,
- 'discount_amount': discount_amount,
- 'amount': amount,
- 'payment': payment,
- 'balance': amount - payment,
- 'payment_rate': self._compute_payment_rate(payment, amount),
- 'note': receipt.note,
- }
-
- def button_ok(self):
- res = []
- if self.date_end < self.date_start:
- raise UserError('开始日期不能大于结束日期!')
-
- receipt_obj = self.env['buy.receipt']
- for receipt in receipt_obj.search(self._get_domain(), order='partner_id,date'):
- # 用查找到的入库单信息来创建一览表
- line = self.env['buy.payment'].create(
- self._prepare_buy_payment(receipt))
- res.append(line.id)
-
- return {
- 'name': '采购付款一览表',
- 'view_mode': 'list',
- 'res_model': 'buy.payment',
- 'type': 'ir.actions.act_window',
- 'target': 'main',
- 'domain': [('id', 'in', res)],
- 'limit': 65535,
- }
|