"""Bridge documents.document to accounting moves. Adds a Many2one link to the created invoice/move, a computed ``is_invoice_candidate`` flag for PDFs/images that have not yet been turned into a vendor bill, and the ``action_create_invoice`` entry point used by both the form button and the server action. """ from odoo import _, api, fields, models from odoo.exceptions import UserError INVOICE_CANDIDATE_MIMETYPES = ( 'application/pdf', 'image/png', 'image/jpeg', 'image/jpg', ) class DocumentsDocument(models.Model): _inherit = 'documents.document' move_id = fields.Many2one( 'account.move', string='Linked Invoice/Move', copy=False, ondelete='set null', help="The accounting move this document was used to create.", ) is_invoice_candidate = fields.Boolean( string='Is Invoice Candidate', compute='_compute_is_invoice_candidate', store=True, help="True when this document looks like a vendor bill " "(PDF/image binary) and has not yet been linked to a move.", ) @api.depends('mimetype', 'type', 'move_id') def _compute_is_invoice_candidate(self): for d in self: d.is_invoice_candidate = ( d.type == 'binary' and (d.mimetype or '') in INVOICE_CANDIDATE_MIMETYPES and not d.move_id ) def action_create_invoice(self): """Open the wizard to create a vendor invoice from this document.""" self.ensure_one() if self.move_id: raise UserError(_( "This document is already linked to invoice %s.", self.move_id.display_name, )) if self.type == 'folder': raise UserError(_( "Folders cannot be turned into invoices." )) if (self.mimetype or '') not in INVOICE_CANDIDATE_MIMETYPES: raise UserError(_( "Only PDF or image documents can be turned into invoices." )) return { 'type': 'ir.actions.act_window', 'name': _('Create Invoice from Document'), 'res_model': 'fusion.create.invoice.from.document.wizard', 'view_mode': 'form', 'target': 'new', 'context': {'default_document_id': self.id}, }