|  | # Copyright 2016 上海开阖软件有限公司 (http://www.osbzr.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models, api, tools
from odoo.exceptions import UserError
class SupplierStatementsReport(models.Model):
    _inherit = "supplier.statements.report"
    _auto = False
    purchase_amount = fields.Float(string='采购金额', readonly=True,
                                   digits='Amount')
    benefit_amount = fields.Float(string='优惠金额', readonly=True,
                                  digits='Amount')
    move_id = fields.Many2one('wh.move', string='出入库单', readonly=True)
    def init(self):
        # union money_order(type = 'pay'), money_invoice(type = 'expense')
        cr = self._cr
        tools.drop_view_if_exists(cr, 'supplier_statements_report')
        cr.execute("""
            CREATE or REPLACE VIEW supplier_statements_report AS (
            SELECT  ROW_NUMBER() OVER(ORDER BY partner_id, date, amount desc) AS id,
                    partner_id,
                    name,
                    date,
                    done_date,
                    purchase_amount,
                    benefit_amount,
                    amount,
                    pay_amount,
                    discount_money,
                    balance_amount,
                    note,
                    move_id
            FROM
                (
                SELECT m.partner_id,
                        m.name,
                        m.date,
                        m.write_date AS done_date,
                        0 AS purchase_amount,
                        0 AS benefit_amount,
                        0 AS amount,
                        m.amount AS pay_amount,
                        m.discount_amount AS discount_money,
                        0 AS balance_amount,
                        m.note,
                        NULL AS move_id
                FROM money_order AS m
                WHERE m.type = 'pay' AND m.state = 'done'
                UNION ALL
                SELECT  mi.partner_id,
                        mi.name,
                        mi.date,
                        mi.create_date AS done_date,
                        br.amount + br.discount_amount AS purchase_amount,
                        br.discount_amount AS benefit_amount,
                        mi.amount,
                        0 AS pay_amount,
                        0 AS discount_money,
                        0 AS balance_amount,
                        Null AS note,
                        mi.move_id
                FROM money_invoice AS mi
                LEFT JOIN core_category AS c ON mi.category_id = c.id
                LEFT JOIN buy_receipt AS br ON br.buy_move_id = mi.move_id
                WHERE c.type = 'expense' AND mi.state = 'done'
                ) AS ps)
        """)
    def find_source_order(self):
        # 查看原始单据,三情况:收付款单、采购退货单、采购入库单、核销单
        model_view = {
            'money.order': {'name': '付款单',
                            'view': 'money.money_order_form'},
            'buy.receipt': {'name': '采购入库单',
                            'view': 'buy.buy_receipt_form',
                            'name_return': '采购退货单',
                            'view_return': 'buy.buy_return_form'},
            'reconcile.order': {'name': '核销单',
                                'view': 'money.reconcile_order_form'}
        }
        for model, view_dict in model_view.items():
            res = self.env[model].search([('name', '=', self.name)])
            name = model == 'buy.receipt' and res.is_return and \
                view_dict['name_return'] or view_dict['name']
            view = model == 'buy.receipt' and res.is_return and \
                self.env.ref(view_dict['view_return']) \
                or self.env.ref(view_dict['view'])
            if res:
                return {
                    'name': name,
                    'view_mode': 'form',
                    'view_id': False,
                    'views': [(view.id, 'form')],
                    'res_model': model,
                    'type': 'ir.actions.act_window',
                    'res_id': res.id,
                }
        raise UserError('期初余额没有原始单据可供查看。')
class SupplierStatementsReportWithGoods(models.TransientModel):
    _name = "supplier.statements.report.with.goods"
    _description = "供应商对账单带商品明细"
    partner_id = fields.Many2one('partner', string='业务伙伴', readonly=True)
    name = fields.Char(string='单据编号', readonly=True)
    date = fields.Date(string='单据日期', readonly=True)
    done_date = fields.Date(string='完成日期', readonly=True)
    category_id = fields.Many2one('core.category', '商品类别')
    goods_code = fields.Char('商品编号')
    goods_name = fields.Char('商品名称')
    attribute_id = fields.Many2one('attribute', '规格型号')
    uom_id = fields.Many2one('uom', '单位')
    quantity = fields.Float('数量',
                            digits='Quantity')
    price = fields.Float('单价',
                         digits='Amount')
    discount_amount = fields.Float('折扣额',
                                   digits='Amount')
    without_tax_amount = fields.Float('不含税金额',
                                      digits='Amount')
    tax_amount = fields.Float('税额',
                              digits='Amount')
    order_amount = fields.Float(string='采购金额', readonly=True,
                                digits='Amount')  # 采购
    benefit_amount = fields.Float(string='优惠金额', readonly=True,
                                  digits='Amount')
    fee = fields.Float(string='客户承担费用', readonly=True,
                       digits='Amount')
    amount = fields.Float(string='应付金额', readonly=True,
                          digits='Amount')
    pay_amount = fields.Float(string='实际付款金额', readonly=True,
                              digits='Amount')
    discount_money = fields.Float(string='付款折扣', readonly=True,
                                  digits='Amount')
    balance_amount = fields.Float(string='应付款余额', readonly=True,
                                  digits='Amount')
    note = fields.Char(string='备注', readonly=True)
    move_id = fields.Many2one('wh.move', string='出入库单', readonly=True)
    def find_source_order(selfs):
        # 三情况:收付款单、采购退货单、采购入库单、核销单
        for self in selfs:
            model_view = {
                'money.order': {'name': '付款单',
                                'view': 'money.money_order_form'},
                'buy.receipt': {'name': '采购入库单',
                                'view': 'buy.buy_receipt_form',
                                'name_return': '采购退货单',
                                'view_return': 'buy.buy_return_form'},
                'reconcile.order': {'name': '核销单',
                                    'view': 'money.reconcile_order_form'}
            }
            for model, view_dict in model_view.items():
                res = self.env[model].search([('name', '=', self.name)])
                name = model == 'buy.receipt' and res.is_return and \
                    view_dict['name_return'] or view_dict['name']
                view = model == 'buy.receipt' and res.is_return and \
                    self.env.ref(view_dict['view_return']) \
                    or self.env.ref(view_dict['view'])
                if res:
                    return {
                        'name': name,
                        'view_mode': 'form',
                        'view_id': False,
                        'views': [(view.id, 'form')],
                        'res_model': model,
                        'type': 'ir.actions.act_window',
                        'res_id': res.id,
                    }
            raise UserError('期初余额没有原始单据可供查看。')
 |