# -*- coding: utf-8 -*-
##############################################################################
#
#    datenpol gmbh
#    Copyright (C) 2013-TODAY datenpol gmbh ()
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as
#    published by the Free Software Foundation, either version 3 of the
#    License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see .
#
##############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class AccountInvoice(models.Model):
    _inherit = 'account.invoice'
    @api.model
    def default_inter_company_supplier_isset(self):
        return bool(self.env.user.company_id.inter_company_supplier_id.id)
    inter_company_supplier_isset = fields.Boolean(compute='_compute_inter_company_supplier_isset',
                                                  default=default_inter_company_supplier_isset)
    reimburse_invoice_id = fields.Many2one(comodel_name='account.invoice', string='Weiterverrechnung')
    charge_further = fields.Boolean(string='Weiterverrechnen', compute='_compute_charge_further', store=True,
                                    help='Ist gesetzt, wenn das WV-Flag von mindestens einer Zeile gesetzt ist')
    pg_ic_num = fields.Char('PG_IC_Nummer')
    pg_ic_flag = fields.Boolean(string='IC', help='Rechnung nach PG exportiert')
    @api.multi
    def _compute_inter_company_supplier_isset(self):
        for record in self:
            record.inter_company_supplier_isset = bool(self.env.user.company_id.inter_company_supplier_id.id)
    @api.multi
    @api.depends('invoice_line_ids.reimbursement')
    def _compute_charge_further(self):
        for record in self:
            record.charge_further = False
            for line in record.invoice_line_ids:
                if line.reimbursement:
                    record.charge_further = True
                    break
    @api.multi
    def action_set_all_wv_flag(self):
        for record in self:
            for line in record.invoice_line_ids:
                line.reimbursement = True
    @api.multi
    def action_unset_all_wv_flag(self):
        for record in self:
            for line in record.invoice_line_ids:
                line.reimbursement = False
    @api.multi
    def reimburse_invoice(self):
        for record in self:
            if not record.charge_further:
                raise ValidationError(_('Sie müssen mindestens eine Position mit WV markieren.'))
            if record.charge_further and not record.reimburse_invoice_id and record.state not in ['draft']:
                intercompany_admin_id = record.company_id.admin_user_id
                in_invoice_vals = record._prepare_er_invoice_data()
                invoice_id = self.env['account.invoice'].sudo(intercompany_admin_id).create(
                    in_invoice_vals)
                record.reimburse_invoice_id = invoice_id.id
                for line in record.invoice_line_ids:
                    if line.reimbursement:
                        in_line_vals = record._prepare_er_invoice_line_data(line, invoice_id)
                        self.env['account.invoice.line'].sudo(intercompany_admin_id).create(in_line_vals)
                invoice_id.compute_taxes()
    @api.multi
    def _prepare_er_invoice_data(self):
        self.ensure_one()
        journal = self.env['account.journal'].sudo(self.company_id.admin_user_id).search(
            [('type', '=', 'purchase'), ('company_id', '=', self.company_id.id)], limit=1)
        vals = {
            'company_id': self.company_id.id,
            'type': 'in_invoice',
            'partner_id': self.company_id.inter_company_supplier_id.partner_id.id,
            'origin': "Weiterverrechnung von " + self.number,
            'journal_id': journal.id,
            'currency_id': self.currency_id and self.currency_id.id,
        }
        inv = self.env['account.invoice'].with_context(company_id=self.company_id.id).sudo(
            self.company_id.admin_user_id).new(vals)
        inv._onchange_partner_id()
        new_vals = {k: v or False for k, v in dict(inv._cache).items()}
        return inv._convert_to_write(new_vals)
    @api.model
    def _prepare_er_invoice_line_data(self, line, invoice_id):
        vals = {
            'name': line.name,
            'price_unit': line.price_unit * (line.invoice_id.company_id.percentage_billing / 100),
            'quantity': line.quantity,
            'discount': line.discount,
            'product_id': line.product_id.id or False,
            'uom_id': line.uom_id.id or False,
            'sequence': line.sequence,
            'invoice_id': invoice_id.id
        }
        new_line = self.env['account.invoice.line'].with_context(company_id=line.invoice_id.company_id.id).sudo(
            line.invoice_id.company_id.admin_user_id).new(vals)
        new_line._onchange_product_id()
        new_line_vals = {k: v or False for k, v in dict(new_line._cache).items()}
        return new_line._convert_to_write(new_line_vals)
    @api.multi
    def invoice_validate(self):
        res = super(AccountInvoice, self).invoice_validate()
        for record in self:
            if record.type == 'in_invoice' and record.partner_id.id == record.company_id.inter_company_supplier_id.partner_id.id:
                company_id = record.company_id.inter_company_supplier_id
                intercompany_admin_id = company_id.admin_user_id
                out_invoice_vals = record._prepare_ic_invoice_data()
                invoice_id = self.env['account.invoice'].sudo(intercompany_admin_id).create(
                    out_invoice_vals)
                for line in record.invoice_line_ids:
                    out_line_vals = record._prepare_ic_invoice_line_data(line, invoice_id)
                    self.env['account.invoice.line'].sudo(intercompany_admin_id).create(out_line_vals)
                invoice_id.compute_taxes()
        return res
    @api.multi
    def _prepare_ic_invoice_data(self):
        self.ensure_one()
        journal = self.env['account.journal'].sudo(self.company_id.inter_company_supplier_id.admin_user_id).search(
            [('type', '=', 'sale'), ('company_id', '=', self.company_id.inter_company_supplier_id.id)], limit=1)
        vals = {
            'company_id': self.company_id.inter_company_supplier_id.id,
            'type': 'out_invoice',
            'partner_id': self.company_id.partner_id.id,
            'origin': self.origin,
            'journal_id': journal.id,
            'currency_id': self.currency_id and self.currency_id.id,
        }
        inv = self.env['account.invoice'].with_context(company_id=self.company_id.inter_company_supplier_id.id).sudo(
            self.company_id.inter_company_supplier_id.admin_user_id).new(vals)
        inv._onchange_partner_id()
        new_vals = {k: v or False for k, v in dict(inv._cache).items()}
        return inv._convert_to_write(new_vals)
    @api.model
    def _prepare_ic_invoice_line_data(self, line, invoice_id):
        vals = {
            'name': line.name,
            'quantity': line.quantity,
            'discount': line.discount,
            'product_id': line.product_id.id or False,
            'uom_id': line.uom_id.id or False,
            'sequence': line.sequence,
            'invoice_id': invoice_id.id
        }
        admin_user = line.invoice_id.company_id.inter_company_supplier_id.admin_user_id
        company_id = line.invoice_id.company_id.inter_company_supplier_id.id
        new_line = self.env['account.invoice.line'].with_context(company_id=company_id).sudo(admin_user).new(vals)
        new_line._onchange_product_id()
        new_line.price_unit = line.price_unit
        new_line_vals = {k: v or False for k, v in dict(new_line._cache).items()}
        return new_line._convert_to_write(new_line_vals)
class AccountInvoiceLine(models.Model):
    _inherit = 'account.invoice.line'
    @api.model
    def _default_reimbursement(self):
        if self.env.user.company_id.inter_company_supplier_id:
            return True
    reimbursement = fields.Boolean(string='WV', default=_default_reimbursement,
                                   help='Wenn Weiterverrechnung (WV) gesetzt ist, dann wird diese Zeile intern weiterverrechnet')
    inter_company_supplier_isset = fields.Boolean(related='invoice_id.inter_company_supplier_isset')
    state = fields.Selection(related='invoice_id.state')