anonym. reports
This commit is contained in:
@@ -504,6 +504,10 @@ export function injectReportsControls() {
|
||||
<input type="date" id="cr-end" value="${crEndDate}" class="px-3 py-1.5 border border-gray-300 rounded-md text-sm"></div>
|
||||
<button onclick="window.accountingView.loadCustomerRevenue()" class="px-3 py-1.5 bg-blue-600 text-white rounded-md text-sm font-medium hover:bg-blue-700">Run</button>
|
||||
<button onclick="window.accountingView.exportCustomerRevenuePdf()" class="px-3 py-1.5 bg-gray-100 hover:bg-gray-200 text-gray-700 rounded-md text-sm font-medium border border-gray-300">📄 Export PDF</button>
|
||||
<label class="flex items-center gap-1 pt-5 text-xs text-gray-600 cursor-pointer">
|
||||
<input type="checkbox" id="cr-anonymize" class="h-4 w-4 text-blue-600 border-gray-300 rounded">
|
||||
Anonymize
|
||||
</label>
|
||||
</div>
|
||||
<div id="cr-result"></div>
|
||||
</div>
|
||||
@@ -553,8 +557,10 @@ export async function loadTaxSummary() {
|
||||
export async function loadCustomerRevenue() {
|
||||
crStartDate = document.getElementById('cr-start').value;
|
||||
crEndDate = document.getElementById('cr-end').value;
|
||||
const anonymize = document.getElementById('cr-anonymize')?.checked || false;
|
||||
if (!crStartDate || !crEndDate) return showError('cr-result', 'Please select both start and end dates.');
|
||||
showLoading('cr-result', 'Loading customer revenue...');
|
||||
const maskName = (name) => anonymize ? name.charAt(0) : name;
|
||||
try {
|
||||
const data = await window.API.accounting.getCustomerRevenue(crStartDate, crEndDate);
|
||||
if (data.error) return showError('cr-result', data.error);
|
||||
@@ -571,7 +577,7 @@ export async function loadCustomerRevenue() {
|
||||
const rev = parseFloat(r.total_revenue) || 0;
|
||||
const pct = grandTotal > 0 ? ((rev / grandTotal) * 100).toFixed(1) : '0.0';
|
||||
rowsHtml += `<tr class="border-t hover:bg-gray-50">
|
||||
<td class="px-3 py-2 text-sm font-medium">${rank}. ${escapeHtml(r.customer_name)}</td>
|
||||
<td class="px-3 py-2 text-sm font-medium">${rank}. ${escapeHtml(maskName(r.customer_name))}</td>
|
||||
<td class="px-3 py-2 text-sm text-center">${r.invoice_count}</td>
|
||||
<td class="px-3 py-2 text-sm text-right">${fmtMoney(rev)}</td>
|
||||
<td class="px-3 py-2 text-sm text-right text-gray-500">${pct}%</td>
|
||||
@@ -604,8 +610,10 @@ export async function loadCustomerRevenue() {
|
||||
export function exportCustomerRevenuePdf() {
|
||||
const startEl = document.getElementById('cr-start');
|
||||
const endEl = document.getElementById('cr-end');
|
||||
const anonymize = document.getElementById('cr-anonymize')?.checked || false;
|
||||
if (!startEl?.value || !endEl?.value) return alert('Please select start and end dates first.');
|
||||
const url = `/api/accounting/reports/customer-revenue/pdf?startDate=${startEl.value}&endDate=${endEl.value}`;
|
||||
let url = `/api/accounting/reports/customer-revenue/pdf?startDate=${startEl.value}&endDate=${endEl.value}`;
|
||||
if (anonymize) url += '&anonymize=true';
|
||||
window.open(url, '_blank');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user