Skip to content
Extraits de code Groupes Projets
project.py 5,03 ko
Newer Older
  • Learn to ignore specific revisions
  • Juliana's avatar
    Juliana a validé
    # Copyright 2021 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    from ast import literal_eval
    from odoo import fields, models, api, _
    
    
    class Project(models.Model):
        _inherit = 'project.project'
    
        @api.multi
        def _compute_invoice_count(self):
            for project in self:
                # retrieve all projects
    
                project.invoice_count = self.env['account.invoice'].sudo().search_count([('project_id', '=', self.id)])
    
    Juliana's avatar
    Juliana a validé
    
        # ------------------------------------------------------
        # Fields declaration
        # ------------------------------------------------------
        invoice_ids = fields.One2many(
            'account.invoice',
            'project_id',
            string='Factures')
        invoice_count = fields.Integer(
            compute='_compute_invoice_count',
            string='Nombre de factures')
    
        # ------------------------------------------------------
        # SQL Constraints
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Default methods
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Computed fields / Search Fields
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Onchange / Constraints
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # CRUD methods (ORM overrides)
        # ------------------------------------------------------
    
        # ------------------------------------------------------
        # Actions
        # ------------------------------------------------------
        @api.multi
        def action_view_project_invoices(self):
            self.ensure_one()
    
            action = self.env.ref('account.action_invoice_refund_out_tree').sudo().read()[0]
    
    Juliana's avatar
    Juliana a validé
            action['domain'] = [('type', 'in', ['out_invoice', 'out_refund']), ('project_id', '=', self.id)]
            return action
    
        @api.multi
        def action_generate_invoices(self):
            for project in self:
                for benef in project.financement_ids:
                    if benef.partner_id.parent_id:
                        partner = benef.partner_id.parent_id
                    else:
                        partner = benef.partner_id
    
    
                    if partner.type_structure_id:
                        # search the product corresponding to the company associated
                        product_id = self.env['product.product'].search([('type_product', '=', 'collectivite')])
                    else:
                        # search the product corresponding to the company associated
                        product_id = self.env['product.product'].search([('type_product', '=', 'particular')])
    
    Juliana's avatar
    Juliana a validé
                    # If doesn't exist, create the invoice
    
    Juliana's avatar
    Juliana a validé
                    if not benef.invoice_id:
    
    Juliana's avatar
    Juliana a validé
                        account_invoice_id = self.create_invoice(
                            product_id, partner, benef.montant)
    
    Juliana's avatar
    Juliana a validé
                        benef.write({'invoice_id': account_invoice_id.id})
    
    Juliana's avatar
    Juliana a validé
    
        def create_invoice(self, product, partner, amount):
            result = dict()
            Invoice = self.env['account.invoice']
            InvoiceLine = self.env['account.invoice.line']
            journal_id = self.env['account.journal'].search([('company_id', '=', self.env.user.company_id.id)], limit=1)
    
            payment_term_id = self.env.ref('adefpat_account.account_payment_term_adefpat')
    
    Juliana's avatar
    Juliana a validé
            benef_invoice = Invoice.create({
                'name': partner.name,
                'project_id': self.id,
                'partner_id': partner.id,
                'type': 'out_invoice',
                'journal_id': journal_id.id,
                'state': 'draft',
    
    Juliana's avatar
    Juliana a validé
                'payment_term_id': payment_term_id.id,
                'user_id': self.user_id.id
    
    Juliana's avatar
    Juliana a validé
            })
    
            # Création de la ligne CG Scop
            benef_invoice_line = InvoiceLine.create({
    
                'name': product.name,
    
    Juliana's avatar
    Juliana a validé
                'invoice_id': benef_invoice.id,
                'product_id': product.id,
                'account_id': product.property_account_income_id.id,
    
                'account_analytic_id': self.analytic_account_id.id,
    
    Juliana's avatar
    Juliana a validé
                'invoice_line_tax_ids': [(6, 0, product.taxes_id.ids)],
                'name': product.name,
                'price_unit': amount
            })
            result['invoice'] = benef_invoice
            result['invoice_line'] = benef_invoice_line
    
    Juliana's avatar
    Juliana a validé
            return benef_invoice
    
    Juliana's avatar
    Juliana a validé
    
        # ------------------------------------------------------
        # Business methods
    
    Juliana's avatar
    Juliana a validé
        # ------------------------------------------------------
    
    
    Juliana's avatar
    Juliana a validé
    class ProjectTask(models.Model):
        _inherit = "project.task"
    
        invoice_id = fields.Many2one(
            "account.invoice",
            string="Facture liée",
            domain=[("type", "=", "in_invoice")],
            ondelete="restrict",
        )
        payment_date_invoice = fields.Date("Date de paiement de la facture")
        date_account = fields.Date("Date de la facture")
    
    
    Juliana's avatar
    Juliana a validé
    
    class AdefpatFinancement(models.Model):
        _inherit = 'adefpat.project.financement'
    
        invoice_id = fields.Many2one(
            'account.invoice',