diff --git a/models/res_partner.py b/models/res_partner.py index 389e0ff6f11f65c87a73dadb6917f83083867211..a0456e7a0a1a54cd19a02f72e200ebe54b7cf230 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -2,10 +2,41 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api +from ast import literal_eval class AutreResPartner(models.Model): _inherit = "res.partner" + @api.multi + def _invoice_total_benef(self): + account_invoice = self.env['account.invoice'] + if not self.ids: + self.total_invoiced_benef = 0.0 + return True + + user_currency_id = self.env.user.company_id.currency_id.id + all_partner_ids = [self.id] + # generate where clause + where_query = account_invoice._where_calc([ + ('beneficiaire_id', 'in', all_partner_ids), ('state', 'not in', ['draft', 'cancel']), + ('type', 'in', ('out_invoice', 'out_refund')) + ]) + account_invoice._apply_ir_rules(where_query, 'read') + from_clause, where_clause, where_clause_params = where_query.get_sql() + + # price_total is in the company currency + query = """ + SELECT SUM(amount_untaxed) as total, beneficiaire_id + FROM account_invoice account_invoice + WHERE %s + GROUP BY beneficiaire_id + """ % where_clause + self.env.cr.execute(query, where_clause_params) + price_totals = self.env.cr.dictfetchall() + + self.total_invoiced_benef = sum(price['total'] for price in price_totals) + + # Particulier beneficiaire = fields.Boolean(string="Est un bénéficiaire") societe_id = fields.Many2one('res.partner', string='Société liée') @@ -41,6 +72,21 @@ class AutreResPartner(models.Model): preference_chorus = fields.Boolean('Chorus Pro') email_fact = fields.Char('Email de facturation') ref_chorus = fields.Char('Références Chorus') + total_invoiced_benef = fields.Monetary(compute='_invoice_total_benef', string="Total Invoiced beneficiaire", + groups='account.group_account_invoice') + + def _compute_sale_order_count(self): + super(AutreResPartner, self)._compute_sale_order_count() + sale_data = self.env['sale.order'].read_group(domain=[('beneficiaire_id', 'child_of', self.ids)], + fields=['beneficiaire_id'], groupby=['beneficiaire_id']) + mapped_data = dict([(m['beneficiaire_id'][0], m['beneficiaire_id_count']) for m in sale_data]) + for partner in self: + # let's obtain the partner id and all its child ids + partner_ids = [partner.id] + partner.child_ids.ids + # then we can sum for all the partner's child + sale_order_count_benef = sum(mapped_data.get(child, 0) for child in partner_ids) + partner.sale_order_count += sale_order_count_benef + @api.onchange('company_type') def onchange_company_type(self): @@ -69,6 +115,14 @@ class AutreResPartner(models.Model): self.financement = False self.societe_id = False + @api.multi + def action_view_partner_invoices_benef(self): + self.ensure_one() + action = self.env.ref('account.action_invoice_refund_out_tree').read()[0] + action['domain'] = literal_eval(action['domain']) + action['domain'].append(('beneficiaire_id', 'child_of', self.id)) + return action + class AutrementStatut(models.Model): _description = 'Partner Statut' _name = 'res.partner.statut' diff --git a/views/account_invoice_view.xml b/views/account_invoice_view.xml index 4d3ac0fe66633154b4fbdf212a5f4122adee43c4..19a902b51ba6631054422e277fa4f486fa282960 100644 --- a/views/account_invoice_view.xml +++ b/views/account_invoice_view.xml @@ -17,5 +17,16 @@ </field> </record> + <record id="autrement_invoice_tree" model="ir.ui.view"> + <field name="name">autrement.account.invoice.tree</field> + <field name="model">account.invoice</field> + <field name="inherit_id" ref="account.invoice_tree"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='partner_id']" position="after"> + <field name="beneficiaire_id" /> + </xpath> + </field> + </record> + </data> </odoo> \ No newline at end of file diff --git a/views/res_partner_view.xml b/views/res_partner_view.xml index 2272b67cd783c8da1acf7021cdf50fb70f0d095b..b5e5b01865589c063a4ceb289a6142e0a0acf4a3 100644 --- a/views/res_partner_view.xml +++ b/views/res_partner_view.xml @@ -276,5 +276,51 @@ </field> </record> + <record model="ir.ui.view" id="autrment_partner_view_buttons_ab"> + <field name="name">autrement.partner.view.buttons</field> + <field name="model">res.partner</field> + <field name="inherit_id" ref="base.view_partner_form" /> + <field name="priority" eval="20"/> + <field name="groups_id" eval="[(4, ref('account.group_account_invoice'))]"/> + <field name="arch" type="xml"> + <div name="button_box" position="inside"> + <button type="object" class="oe_stat_button" icon="fa-pencil-square-o" name="action_view_partner_invoices_benef" + attrs="{'invisible': [('customer', '=', False)]}" context="{'default_beneficiaire_id': active_id}"> + <div class="o_form_field o_stat_info"> + <span class="o_stat_value"> + <field name="total_invoiced_benef" widget='monetary' options="{'currency_field': 'currency_id'}"/> + </span> + <span class="o_stat_text">Facturé bénéficiaire</span> + </div> + </button> + </div> + </field> + </record> + + <record id="sale.act_res_partner_2_sale_order" model="ir.actions.act_window"> + <field name="name">Quotations and Sales</field> + <field name="res_model">sale.order</field> + <field name="view_type">form</field> + <field name="view_mode">tree,form,graph</field> + <field name="context">{ + 'default_beneficiaire_id': active_id, + }</field> + <field name="groups_id" eval="[(4, ref('sales_team.group_sale_salesman'))]"/> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Create a new quotation, the first step of a new sale! + </p><p> + Once the quotation is confirmed by the customer, it becomes a sales order.<br/> You will be able to create an invoice and collect the payment. + </p> + </field> + </record> + + <!-- <record id="sale.act_res_partner_2_sale_order" model="ir.actions.act_window"> + <field name="name">Quotations and Sales</field> + <field name="res_model">sale.order</field> + <field name="inherit_id" ref="sale.act_res_partner_2_sale_order"/> + <field name="context">{'search_default_beneficiaire_id': active_id}</field> + </record> --> + </data> </odoo> diff --git a/views/sale_view.xml b/views/sale_view.xml index ffdf9b74149e1743e2757df9ca174ed6dc67cd14..6ed2f810a92dc55ae7ceb066cc83aae34853b06b 100644 --- a/views/sale_view.xml +++ b/views/sale_view.xml @@ -14,6 +14,40 @@ </field> </record> + <record id="autrement_view_sales_order_filter" model="ir.ui.view"> + <field name="name">autrement.sale.order.list.select</field> + <field name="model">sale.order</field> + <field name="inherit_id" ref="sale.view_sales_order_filter"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='partner_id']" position="after"> + <field name="beneficiaire_id" operator="child_of" /> + </xpath> + </field> + </record> + + <record id="autrement_view_order_tree" model="ir.ui.view"> + <field name="name">autrement.sale.order.tree</field> + <field name="model">sale.order</field> + <field name="inherit_id" ref="sale.view_order_tree"/> + <field name="arch" type="xml"> + <xpath expr="//field[@name='partner_id']" position="after"> + <field name="beneficiaire_id" /> + </xpath> + </field> + </record> + + <record id="autrement_view_sales_order_filter" model="ir.ui.view"> + <field name="name">autrement.sale.order.list.select</field> + <field name="model">sale.order</field> + <field name="inherit_id" ref="sale.view_sales_order_filter"/> + <field name="priority" eval="15"/> + <field name="arch" type="xml"> + <xpath expr="//filter[@name='my_sale_orders_filter']" position="before"> + <filter string="Test" name="my_vente" + domain="['|',('parent_id','=',context.get('active_id',True)),('beneficiaire_id','=',context.get('active_id',True))]"/> + </xpath> + </field> + </record> </data> </odoo> \ No newline at end of file