Tower: upload laundry_management 19.0.19.0.4 (via marketplace)

This commit is contained in:
2026-05-01 15:00:30 +00:00
parent 79fe584847
commit 743b002387

View File

@@ -0,0 +1,94 @@
/** @odoo-module */
import { Component } from "@odoo/owl";
import { Dialog } from "@web/core/dialog/dialog";
// Sort priority: cash first, then bank, then others
const JOURNAL_ORDER = { cash: 0, bank: 1 };
export class LaundrySettlementReceipt extends Component {
static components = { Dialog };
static template = "laundry_management.SettlementReceipt";
static props = {
partnerName: { type: String },
settledTotal: { type: Number },
remainingDue: { type: Number },
payments: { type: Array },
settledOrders: { type: Array },
close: { type: Function },
};
get dateTime() {
return new Date().toLocaleString();
}
fmt(value) {
return parseFloat(value || 0).toFixed(2);
}
/** Group payments by method name, merge duplicates, sort cash → bank → other. */
get groupedPayments() {
const map = {};
for (const p of this.props.payments) {
// Use method_name (from settlement_pos_pm_id) when available,
// fall back to journal_name for legacy payments without it.
const key = p.method_name || p.journal_name;
const jtype = p.journal_type || "other";
if (!map[key]) {
map[key] = { name: key, amount: 0, _type: jtype };
}
map[key].amount += p.amount;
}
return Object.values(map).sort(
(a, b) => (JOURNAL_ORDER[a._type] ?? 2) - (JOURNAL_ORDER[b._type] ?? 2)
);
}
/** Group settled orders by name, merge duplicates. */
get groupedOrders() {
const map = {};
for (const o of this.props.settledOrders) {
const key = o.name;
if (!map[key]) {
map[key] = { name: key, applied: 0, remaining_on_order: 0 };
}
map[key].applied += o.applied;
map[key].remaining_on_order = o.remaining_on_order;
}
return Object.values(map);
}
printReceipt() {
const receiptEl = document.querySelector(".settlement-receipt-content");
if (!receiptEl) return;
const printWindow = window.open("", "_blank", "width=300,height=600");
if (!printWindow) return;
printWindow.document.write(`
<html><head><title>Settlement Receipt</title>
<style>
body { font-family: monospace; font-size: 12px; width: 280px;
margin: 0 auto; padding: 10px; }
.text-center { text-align: center; }
.fw-bold { font-weight: bold; }
.fs-5 { font-size: 16px; }
.mt-2 { margin-top: 8px; }
.mb-1 { margin-bottom: 4px; }
.mb-2 { margin-bottom: 8px; }
.border-top { border-top: 1px dashed #000; padding-top: 6px; }
.border-bottom { border-bottom: 1px dashed #000; padding-bottom: 6px; }
.d-flex { display: flex; }
.justify-content-between { justify-content: space-between; }
table { width: 100%; border-collapse: collapse; }
td, th { padding: 2px 0; }
.text-end { text-align: right; }
.text-muted { color: #666; }
.small { font-size: 11px; }
</style></head><body>
${receiptEl.innerHTML}
</body></html>
`);
printWindow.document.close();
printWindow.focus();
printWindow.print();
printWindow.close();
}
}