feat(fusion_accounting_followup): ai_text_panel + followup_history_table components
Made-with: Cursor
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
'name': 'Fusion Accounting Follow-up',
|
'name': 'Fusion Accounting Follow-up',
|
||||||
'version': '19.0.1.0.22',
|
'version': '19.0.1.0.23',
|
||||||
'category': 'Accounting/Accounting',
|
'category': 'Accounting/Accounting',
|
||||||
'summary': 'AI-augmented customer follow-ups (dunning) for unpaid invoices.',
|
'summary': 'AI-augmented customer follow-ups (dunning) for unpaid invoices.',
|
||||||
'description': """
|
'description': """
|
||||||
@@ -50,6 +50,10 @@ menu hides; the engine + AI tools remain available for the chat.
|
|||||||
'fusion_accounting_followup/static/src/components/partner_card/partner_card.xml',
|
'fusion_accounting_followup/static/src/components/partner_card/partner_card.xml',
|
||||||
'fusion_accounting_followup/static/src/components/aging_bucket_strip/aging_bucket_strip.js',
|
'fusion_accounting_followup/static/src/components/aging_bucket_strip/aging_bucket_strip.js',
|
||||||
'fusion_accounting_followup/static/src/components/aging_bucket_strip/aging_bucket_strip.xml',
|
'fusion_accounting_followup/static/src/components/aging_bucket_strip/aging_bucket_strip.xml',
|
||||||
|
'fusion_accounting_followup/static/src/components/ai_text_panel/ai_text_panel.js',
|
||||||
|
'fusion_accounting_followup/static/src/components/ai_text_panel/ai_text_panel.xml',
|
||||||
|
'fusion_accounting_followup/static/src/components/followup_history_table/followup_history_table.js',
|
||||||
|
'fusion_accounting_followup/static/src/components/followup_history_table/followup_history_table.xml',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'installable': True,
|
'installable': True,
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { Component } from "@odoo/owl";
|
||||||
|
|
||||||
|
export class AiTextPanel extends Component {
|
||||||
|
static template = "fusion_accounting_followup.AiTextPanel";
|
||||||
|
static props = {
|
||||||
|
text: { type: Object },
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t t-name="fusion_accounting_followup.AiTextPanel">
|
||||||
|
<div class="fu-ai-text-panel mt-3">
|
||||||
|
<h5>AI-Generated Follow-up Text</h5>
|
||||||
|
<div class="ai-subject">
|
||||||
|
Subject: <t t-esc="props.text.subject"/>
|
||||||
|
</div>
|
||||||
|
<div class="ai-body">
|
||||||
|
<t t-esc="props.text.body"/>
|
||||||
|
</div>
|
||||||
|
<div class="key-points" t-if="props.text.key_points and props.text.key_points.length">
|
||||||
|
<strong>Key points:</strong>
|
||||||
|
<ul>
|
||||||
|
<li t-foreach="props.text.key_points" t-as="point" t-key="point_index">
|
||||||
|
<t t-esc="point"/>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="text-muted mt-2" style="font-size: 0.75rem;">
|
||||||
|
Tone used: <t t-esc="props.text.tone_used or props.text.tone or 'gentle'"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/** @odoo-module **/
|
||||||
|
|
||||||
|
import { Component } from "@odoo/owl";
|
||||||
|
|
||||||
|
export class FollowupHistoryTable extends Component {
|
||||||
|
static template = "fusion_accounting_followup.FollowupHistoryTable";
|
||||||
|
static props = {
|
||||||
|
history: { type: Object },
|
||||||
|
};
|
||||||
|
|
||||||
|
formatDate(s) {
|
||||||
|
if (!s) return "";
|
||||||
|
return s.slice(0, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t t-name="fusion_accounting_followup.FollowupHistoryTable">
|
||||||
|
<div class="mt-4">
|
||||||
|
<h5>Follow-up History (<t t-esc="props.history.count or 0"/>)</h5>
|
||||||
|
<table t-if="props.history.runs and props.history.runs.length" class="fu-history-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Level</th>
|
||||||
|
<th>Tone</th>
|
||||||
|
<th>State</th>
|
||||||
|
<th class="text-end">Overdue</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr t-foreach="props.history.runs" t-as="run" t-key="run.id">
|
||||||
|
<td><t t-esc="formatDate(run.date)"/></td>
|
||||||
|
<td><t t-esc="run.level_name or '-'"/></td>
|
||||||
|
<td><t t-esc="run.tone_used or '-'"/></td>
|
||||||
|
<td><t t-esc="run.state"/></td>
|
||||||
|
<td class="text-end">
|
||||||
|
<t t-if="run.overdue_amount">$<t t-esc="run.overdue_amount.toFixed(2)"/></t>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div t-else="" class="text-muted">No history yet.</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
||||||
Reference in New Issue
Block a user