diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase/models/account_invoice.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/purchase/models/account_invoice.py')
| -rw-r--r-- | addons/purchase/models/account_invoice.py | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/addons/purchase/models/account_invoice.py b/addons/purchase/models/account_invoice.py new file mode 100644 index 00000000..b60380c4 --- /dev/null +++ b/addons/purchase/models/account_invoice.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ + + +class AccountMove(models.Model): + _inherit = 'account.move' + + purchase_vendor_bill_id = fields.Many2one('purchase.bill.union', store=False, readonly=True, + states={'draft': [('readonly', False)]}, + string='Auto-complete', + help="Auto-complete from a past bill / purchase order.") + purchase_id = fields.Many2one('purchase.order', store=False, readonly=True, + states={'draft': [('readonly', False)]}, + string='Purchase Order', + help="Auto-complete from a past purchase order.") + + def _get_invoice_reference(self): + self.ensure_one() + vendor_refs = [ref for ref in set(self.line_ids.mapped('purchase_line_id.order_id.partner_ref')) if ref] + if self.ref: + return [ref for ref in self.ref.split(', ') if ref and ref not in vendor_refs] + vendor_refs + return vendor_refs + + @api.onchange('purchase_vendor_bill_id', 'purchase_id') + def _onchange_purchase_auto_complete(self): + ''' Load from either an old purchase order, either an old vendor bill. + + When setting a 'purchase.bill.union' in 'purchase_vendor_bill_id': + * If it's a vendor bill, 'invoice_vendor_bill_id' is set and the loading is done by '_onchange_invoice_vendor_bill'. + * If it's a purchase order, 'purchase_id' is set and this method will load lines. + + /!\ All this not-stored fields must be empty at the end of this function. + ''' + if self.purchase_vendor_bill_id.vendor_bill_id: + self.invoice_vendor_bill_id = self.purchase_vendor_bill_id.vendor_bill_id + self._onchange_invoice_vendor_bill() + elif self.purchase_vendor_bill_id.purchase_order_id: + self.purchase_id = self.purchase_vendor_bill_id.purchase_order_id + self.purchase_vendor_bill_id = False + + if not self.purchase_id: + return + + # Copy data from PO + invoice_vals = self.purchase_id.with_company(self.purchase_id.company_id)._prepare_invoice() + invoice_vals['currency_id'] = self.line_ids and self.currency_id or invoice_vals.get('currency_id') + del invoice_vals['ref'] + self.update(invoice_vals) + + # Copy purchase lines. + po_lines = self.purchase_id.order_line - self.line_ids.mapped('purchase_line_id') + new_lines = self.env['account.move.line'] + for line in po_lines.filtered(lambda l: not l.display_type): + new_line = new_lines.new(line._prepare_account_move_line(self)) + new_line.account_id = new_line._get_computed_account() + new_line._onchange_price_subtotal() + new_lines += new_line + new_lines._onchange_mark_recompute_taxes() + + # Compute invoice_origin. + origins = set(self.line_ids.mapped('purchase_line_id.order_id.name')) + self.invoice_origin = ','.join(list(origins)) + + # Compute ref. + refs = self._get_invoice_reference() + self.ref = ', '.join(refs) + + # Compute payment_reference. + if len(refs) == 1: + self.payment_reference = refs[0] + + self.purchase_id = False + self._onchange_currency() + self.partner_bank_id = self.bank_partner_id.bank_ids and self.bank_partner_id.bank_ids[0] + + @api.onchange('partner_id', 'company_id') + def _onchange_partner_id(self): + res = super(AccountMove, self)._onchange_partner_id() + if self.partner_id and\ + self.move_type in ['in_invoice', 'in_refund'] and\ + self.currency_id != self.partner_id.property_purchase_currency_id and\ + self.partner_id.property_purchase_currency_id.id: + if not self.env.context.get('default_journal_id'): + journal_domain = [ + ('type', '=', 'purchase'), + ('company_id', '=', self.company_id.id), + ('currency_id', '=', self.partner_id.property_purchase_currency_id.id), + ] + default_journal_id = self.env['account.journal'].search(journal_domain, limit=1) + if default_journal_id: + self.journal_id = default_journal_id + if self.env.context.get('default_currency_id'): + self.currency_id = self.env.context['default_currency_id'] + if self.partner_id.property_purchase_currency_id: + self.currency_id = self.partner_id.property_purchase_currency_id + return res + + @api.model_create_multi + def create(self, vals_list): + # OVERRIDE + moves = super(AccountMove, self).create(vals_list) + for move in moves: + if move.reversed_entry_id: + continue + purchase = move.line_ids.mapped('purchase_line_id.order_id') + if not purchase: + continue + refs = ["<a href=# data-oe-model=purchase.order data-oe-id=%s>%s</a>" % tuple(name_get) for name_get in purchase.name_get()] + message = _("This vendor bill has been created from: %s") % ','.join(refs) + move.message_post(body=message) + return moves + + def write(self, vals): + # OVERRIDE + old_purchases = [move.mapped('line_ids.purchase_line_id.order_id') for move in self] + res = super(AccountMove, self).write(vals) + for i, move in enumerate(self): + new_purchases = move.mapped('line_ids.purchase_line_id.order_id') + if not new_purchases: + continue + diff_purchases = new_purchases - old_purchases[i] + if diff_purchases: + refs = ["<a href=# data-oe-model=purchase.order data-oe-id=%s>%s</a>" % tuple(name_get) for name_get in diff_purchases.name_get()] + message = _("This vendor bill has been modified from: %s") % ','.join(refs) + move.message_post(body=message) + return res + + +class AccountMoveLine(models.Model): + """ Override AccountInvoice_line to add the link to the purchase order line it is related to""" + _inherit = 'account.move.line' + + purchase_line_id = fields.Many2one('purchase.order.line', 'Purchase Order Line', ondelete='set null', index=True) + purchase_order_id = fields.Many2one('purchase.order', 'Purchase Order', related='purchase_line_id.order_id', readonly=True) + + def _copy_data_extend_business_fields(self, values): + # OVERRIDE to copy the 'purchase_line_id' field as well. + super(AccountMoveLine, self)._copy_data_extend_business_fields(values) + values['purchase_line_id'] = self.purchase_line_id.id |
