Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions osi_commissions_report/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import models
19 changes: 19 additions & 0 deletions osi_commissions_report/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "OSI Commissions Report",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "Open Source Integrators",
"maintainer": "Open Source Integrators",
"website": "https://github.com/ursais/osi-addons",
"category": "Accounting/Reporting",
"depends": ["account", "partner_commission"],
"data": [
"security/ir.model.access.csv",
"views/commissions_report_views.xml",
],
"application": False,
"installable": True,
}
4 changes: 4 additions & 0 deletions osi_commissions_report/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import commissions_report
139 changes: 139 additions & 0 deletions osi_commissions_report/models/commissions_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# Copyright (C) 2024 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, fields, models


class CommissionsReport(models.TransientModel):
"""
Commissions Report Model
Shows all invoices with their referrer/commission information.
Similar to Sales Not Attributed Report but includes ALL invoices.
"""
_name = "commissions.report"
_description = "Commissions Report"
_order = "invoice_date desc, name"

name = fields.Char(string="Invoice Number", readonly=True)
invoice_date = fields.Date(string="Invoice Date", readonly=True)
partner_id = fields.Many2one(
"res.partner",
string="Customer/Vendor",
readonly=True,
)
referrer_id = fields.Many2one(
"res.partner",
string="Referrer",
readonly=True,
)
amount_total = fields.Monetary(
string="Total Amount",
readonly=True,
currency_field="currency_id",
)
currency_id = fields.Many2one(
"res.currency",
string="Currency",
readonly=True,
)
move_type = fields.Selection(
[
("out_invoice", "Customer Invoice"),
("out_refund", "Customer Credit Note"),
("in_invoice", "Vendor Bill"),
("in_refund", "Vendor Credit Note"),
("entry", "Journal Entry"),
],
string="Type",
readonly=True,
)
state = fields.Selection(
[
("draft", "Draft"),
("posted", "Posted"),
("cancel", "Cancelled"),
],
string="Status",
readonly=True,
)
invoice_id = fields.Many2one(
"account.move",
string="Invoice",
readonly=True,
)

@api.model
def _get_report_data(self):
"""
Get all invoices with their referrer information.
Returns account.move records with referrer_id field populated.
"""
invoices = self.env["account.move"].search([
("move_type", "in", ["out_invoice", "out_refund", "in_invoice", "in_refund"]),
])
return invoices

@api.model
def generate_report(self):
"""
Generate the commissions report by creating report records from all invoices.
This method is called automatically when the report is accessed.
"""
# Clear existing report records to ensure fresh data
self.search([]).unlink()

invoices = self._get_report_data()
report_vals = []
for invoice in invoices:
referrer_id = False
if hasattr(invoice, "referrer_id") and invoice.referrer_id:
referrer_id = invoice.referrer_id.id

report_vals.append({
"name": invoice.name or "/",
"invoice_date": invoice.invoice_date,
"partner_id": invoice.partner_id.id if invoice.partner_id else False,
"referrer_id": referrer_id,
"amount_total": invoice.amount_total,
"currency_id": invoice.currency_id.id if invoice.currency_id else False,
"move_type": invoice.move_type,
"state": invoice.state,
"invoice_id": invoice.id,
})

if report_vals:
self.create(report_vals)
return True

def action_open_invoice(self):
"""
Open the related invoice from the report.
"""
self.ensure_one()
if not self.invoice_id:
return False
return {
"name": "Invoice",
"type": "ir.actions.act_window",
"res_model": "account.move",
"res_id": self.invoice_id.id,
"view_mode": "form",
"target": "current",
}

@api.model
def action_view_report(self):
"""
Action method to generate and view the report.
Called from the menu action.
"""
self.generate_report()
return {
"name": "Commissions Report",
"type": "ir.actions.act_window",
"res_model": "commissions.report",
"view_mode": "tree,form",
"domain": [],
"context": {"create": False},
"target": "current",
}
3 changes: 3 additions & 0 deletions osi_commissions_report/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_commissions_report_user,commissions.report.user,model_commissions_report,account.group_account_user,1,1,1,1
access_commissions_report_readonly,commissions.report.readonly,model_commissions_report,account.group_account_readonly,1,0,0,0
133 changes: 133 additions & 0 deletions osi_commissions_report/views/commissions_report_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Commissions Report Tree View -->
<record id="view_commissions_report_tree" model="ir.ui.view">
<field name="name">commissions.report.tree</field>
<field name="model">commissions.report</field>
<field name="arch" type="xml">
<tree string="Commissions Report" decoration-muted="state == 'cancel'" decoration-info="state == 'draft'">
<field name="name"/>
<field name="invoice_date"/>
<field name="partner_id"/>
<field name="referrer_id"/>
<field name="move_type"/>
<field name="state"/>
<field name="amount_total" sum="Total"/>
<field name="currency_id" invisible="1"/>
<field name="invoice_id" invisible="1"/>
</tree>
</field>
</record>

<!-- Commissions Report Form View -->
<record id="view_commissions_report_form" model="ir.ui.view">
<field name="name">commissions.report.form</field>
<field name="model">commissions.report</field>
<field name="arch" type="xml">
<form string="Commissions Report">
<header>
<button name="action_open_invoice" string="Open Invoice" type="object" class="btn-primary" attrs="{'invisible': [('invoice_id', '=', False)]}"/>
</header>
<sheet>
<group>
<group>
<field name="name"/>
<field name="invoice_date"/>
<field name="partner_id"/>
<field name="referrer_id"/>
</group>
<group>
<field name="move_type"/>
<field name="state"/>
<field name="amount_total"/>
<field name="currency_id"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="invoice_id" invisible="1"/>
</div>
</form>
</field>
</record>

<!-- Commissions Report Search View -->
<record id="view_commissions_report_search" model="ir.ui.view">
<field name="name">commissions.report.search</field>
<field name="model">commissions.report</field>
<field name="arch" type="xml">
<search string="Commissions Report">
<field name="name"/>
<field name="partner_id"/>
<field name="referrer_id"/>
<field name="invoice_id"/>
<separator/>
<filter string="Customer Invoices" name="customer_invoices" domain="[('move_type', '=', 'out_invoice')]"/>
<filter string="Customer Credit Notes" name="customer_refunds" domain="[('move_type', '=', 'out_refund')]"/>
<filter string="Vendor Bills" name="vendor_bills" domain="[('move_type', '=', 'in_invoice')]"/>
<filter string="Vendor Credit Notes" name="vendor_refunds" domain="[('move_type', '=', 'in_refund')]"/>
<separator/>
<filter string="With Referrer" name="with_referrer" domain="[('referrer_id', '!=', False)]"/>
<filter string="Without Referrer" name="without_referrer" domain="[('referrer_id', '=', False)]"/>
<separator/>
<filter string="Posted" name="posted" domain="[('state', '=', 'posted')]"/>
<filter string="Draft" name="draft" domain="[('state', '=', 'draft')]"/>
<filter string="Cancelled" name="cancelled" domain="[('state', '=', 'cancel')]"/>
<group expand="0" string="Group By">
<filter string="Invoice Date" name="group_by_date" context="{'group_by': 'invoice_date'}"/>
<filter string="Partner" name="group_by_partner" context="{'group_by': 'partner_id'}"/>
<filter string="Referrer" name="group_by_referrer" context="{'group_by': 'referrer_id'}"/>
<filter string="Type" name="group_by_type" context="{'group_by': 'move_type'}"/>
<filter string="Status" name="group_by_status" context="{'group_by': 'state'}"/>
</group>
</search>
</field>
</record>

<!-- Commissions Report Action -->
<record id="action_commissions_report" model="ir.actions.act_window">
<field name="name">Commissions Report</field>
<field name="res_model">commissions.report</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_commissions_report_search"/>
<field name="context">{'create': False}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Commissions Report
</p>
<p>
This report shows all invoices with their referrer/commission information.
The report is automatically generated when accessed.
</p>
</field>
</record>

<!-- Server Action to Generate and View Report -->
<record id="action_server_commissions_report" model="ir.actions.server">
<field name="name">Commissions Report</field>
<field name="model_id" ref="model_commissions_report"/>
<field name="state">code</field>
<field name="code">
# Generate the report
report_model = env['commissions.report']
report_model.generate_report()

# Return action to view the report
action = {
'name': 'Commissions Report',
'type': 'ir.actions.act_window',
'res_model': 'commissions.report',
'view_mode': 'tree,form',
'context': {'create': False},
'target': 'current',
}
</field>
</record>

<!-- Menu Item -->
<menuitem id="menu_commissions_report"
name="Commissions Report"
action="action_server_commissions_report"
parent="account.menu_finance_reports"
sequence="100"/>
</odoo>
Loading