apskel-pos-backend/templates/daily_transaction.html

606 lines
18 KiB
HTML
Raw Normal View History

2025-08-10 20:41:34 +07:00
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laporan Transaksi Harian - APSKEL</title>
<style>
@page {
size: A4;
margin: 20mm 15mm;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #ffffff;
color: #2d3748;
line-height: 1.6;
font-size: 12px;
font-weight: 400;
}
.report-container {
max-width: 210mm;
margin: 0 auto;
background: #ffffff;
padding: 0;
}
/* Header Section */
.report-header {
border-bottom: 4px solid #2b6cb0;
padding-bottom: 20px;
margin-bottom: 30px;
}
.header-main {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20px;
}
.company-section {
display: flex;
align-items: center;
gap: 15px;
}
.logo-container {
width: 60px;
height: 60px;
border-radius: 8px;
overflow: hidden;
border: 2px solid #e2e8f0;
background: #f7fafc;
display: flex;
align-items: center;
justify-content: center;
}
.company-details h1 {
font-size: 28px;
font-weight: 800;
color: #2b6cb0;
margin-bottom: 2px;
letter-spacing: -0.5px;
}
.company-subtitle {
font-size: 14px;
color: #4a5568;
font-weight: 500;
}
.report-info {
text-align: right;
}
.report-title {
font-size: 20px;
font-weight: 700;
color: #2d3748;
margin-bottom: 4px;
}
.report-subtitle {
font-size: 12px;
color: #718096;
font-weight: 500;
}
.report-meta {
background: #f7fafc;
border-radius: 6px;
padding: 15px;
border: 1px solid #e2e8f0;
}
.meta-grid {
display: flex;
justify-content: space-between;
align-items: center;
gap: 20px;
}
.meta-item {
display: flex;
flex-direction: column;
gap: 3px;
}
.meta-label {
font-size: 10px;
font-weight: 600;
color: #718096;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.meta-value {
font-size: 13px;
font-weight: 600;
color: #2d3748;
}
/* Section Headers */
.section {
margin-bottom: 30px;
}
.section-header {
margin-bottom: 15px;
padding-bottom: 8px;
border-bottom: 2px solid #e2e8f0;
}
.section-number {
font-size: 11px;
font-weight: 700;
color: #2b6cb0;
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 4px;
}
.section-title {
font-size: 16px;
font-weight: 700;
color: #2d3748;
}
/* Compact Summary Section */
.summary-container {
border: 1px solid #e2e8f0;
border-radius: 6px;
overflow: hidden;
}
.summary-header {
background: #2b6cb0;
color: #fff;
padding: 8px 12px;
}
.summary-header h3 {
font-size: 13px;
font-weight: 600;
margin: 0;
}
.summary-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
padding: 12px;
}
.summary-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 8px;
background: #fff;
border: 1px solid #e2e8f0;
border-radius: 6px;
text-align: center;
min-height: 80px;
justify-content: space-between;
}
.summary-label {
font-size: 8px;
font-weight: 700;
color: #4a5568;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 6px;
line-height: 1.2;
}
.summary-value {
font-size: 14px;
font-weight: 800;
color: #2d3748;
font-variant-numeric: tabular-nums;
font-family: 'Courier New', monospace;
margin-bottom: 4px;
}
.summary-description {
font-size: 8px;
color: #718096;
line-height: 1.2;
text-align: center;
}
/* Data Tables */
.table-container {
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.table-header {
background: #f7fafc;
padding: 12px 20px;
border-bottom: 1px solid #e2e8f0;
}
.table-title {
font-size: 14px;
font-weight: 700;
color: #2d3748;
margin-bottom: 2px;
}
.table-subtitle {
font-size: 11px;
color: #718096;
}
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
}
.data-table thead {
background: #edf2f7;
}
.data-table th {
padding: 10px 12px;
text-align: left;
font-size: 10px;
font-weight: 700;
color: #4a5568;
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 2px solid #e2e8f0;
}
.data-table th.align-center { text-align: center; }
.data-table th.align-right { text-align: right; }
.data-table tbody tr {
border-bottom: 1px solid #f7fafc;
}
.data-table tbody tr:nth-child(even) {
background-color: #f7fafc;
}
.data-table tbody tr:last-child {
border-bottom: none;
}
.data-table td {
padding: 10px 12px;
font-size: 11px;
color: #4a5568;
font-weight: 500;
}
.data-table td.align-center {
text-align: center;
}
.data-table td.align-right {
text-align: right;
font-variant-numeric: tabular-nums;
font-family: 'Courier New', monospace;
font-weight: 600;
}
.data-table td.number-cell {
font-weight: 600;
color: #2d3748;
}
.item-name {
font-weight: 700;
color: #2d3748;
}
/* Financial Summary */
.financial-summary {
max-width: 400px;
margin-left: 0;
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.financial-header {
background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%);
color: #ffffff;
padding: 12px 20px;
text-align: center;
}
.financial-header h3 {
font-size: 14px;
font-weight: 700;
margin: 0;
}
.financial-content {
padding: 0;
}
.financial-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 20px;
border-bottom: 1px solid #f7fafc;
font-size: 11px;
}
.financial-row:last-child {
border-bottom: none;
}
.financial-row.subtotal {
background: #f7fafc;
border-bottom: 2px solid #e2e8f0;
font-weight: 600;
}
.financial-row.final {
background: linear-gradient(135deg, #2b6cb0 0%, #3182ce 100%);
color: #ffffff;
font-weight: 700;
font-size: 12px;
}
.financial-label {
font-weight: 600;
color: inherit;
}
.financial-amount {
font-weight: 700;
font-variant-numeric: tabular-nums;
font-family: 'Courier New', monospace;
color: inherit;
}
/* Footer Notes */
.report-footer {
margin-top: 30px;
padding-top: 15px;
border-top: 1px solid #e2e8f0;
background: #f7fafc;
border-radius: 6px;
padding: 15px;
}
.footer-title {
font-size: 12px;
font-weight: 700;
color: #2d3748;
margin-bottom: 8px;
}
.footer-notes {
list-style: none;
padding: 0;
}
.footer-notes li {
font-size: 10px;
color: #718096;
line-height: 1.4;
margin-bottom: 6px;
padding-left: 12px;
position: relative;
}
.footer-notes li:before {
content: "•";
color: #2b6cb0;
font-weight: bold;
position: absolute;
left: 0;
}
/* Fixed Layout for PDF */
body {
font-size: 10pt;
line-height: 1.4;
}
.report-container {
padding: 0;
margin: 0;
max-width: none;
width: 100%;
}
.data-table tbody tr:nth-child(even) {
background-color: #f7fafc !important;
}
.section {
page-break-inside: avoid;
}
.summary-grid {
page-break-inside: avoid;
}
.data-table {
page-break-inside: avoid;
}
.page-break {
page-break-before: always;
}
.no-break {
page-break-inside: avoid;
}
</style>
</head>
<body>
<div class="report-container">
<!-- HEADER -->
<div class="report-header">
<div class="header-main">
<div class="company-section">
<div class="logo-container">
<!-- SVG Logo -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500" width="40" height="40">
<rect fill="rgb(241,234,249)" x="0" y="0" width="500" height="500" />
<g transform="translate(248 204) scale(1.97)">
<g transform="translate(18 17)">
<path fill="rgb(54,23,94)" d="M 71 60 v 6 a 4 4 0 0 1 -4 4 H 61 a 4 4 0 0 0 0 8 h 6 A 12 12 0 0 0 79 66 V 60 a 4 4 0 0 0 -8 0" />
</g>
<g transform="translate(-17 -18)">
<path fill="rgb(54,23,94)" d="M 30 39 V 33 a 4 4 0 0 1 4 -4 h 6 a 4 4 0 0 0 0 -8 H 34 A 12 12 0 0 0 22 33 v 6 a 4 4 0 0 0 8 0" />
</g>
<g transform="translate(17 -17)">
<path fill="rgb(54,23,94)" d="M 81 40 V 27 a 8 8 0 0 0 -8 -8 H 60.17 A 4.12 4.12 0 0 0 56 22.61 A 4 4 0 0 0 60 27 h 7.34 L 54.17 40.17 a 4 4 0 0 0 5.66 5.66 L 73 32.66 v 7.17 A 4.12 4.12 0 0 0 76.61 44 A 4 4 0 0 0 81 40" />
</g>
<g transform="translate(-16 16)">
<path fill="rgb(54,23,94)" d="M 19 61 V 71 A 10 10 0 0 0 29 81 H 39 A 10 10 0 0 0 49 71 V 61 A 10 10 0 0 0 39 51 H 29 A 10 10 0 0 0 19 61 m 8 0 a 2 2 0 0 1 2 -2 H 39 a 2 2 0 0 1 2 2 V 71 a 2 2 0 0 1 -2 2 H 29 a 2 2 0 0 1 -2 -2 Z" />
</g>
</g>
</svg>
</div>
<div class="company-details">
<h1>APSKEL</h1>
<div class="company-subtitle">
{{.OrganizationName}}
{{if .OutletName}} {{.OutletName}}{{end}}
</div>
</div>
</div>
<div class="report-info">
<div class="report-title">Laporan Transaksi Harian</div>
<div class="report-subtitle">Daily Transaction Report</div>
</div>
</div>
<div class="report-meta">
<div class="meta-grid">
<div class="meta-item">
<div class="meta-label">Tanggal Laporan</div>
<div class="meta-value">{{.ReportDate}}</div>
</div>
<div class="meta-item">
<div class="meta-label">Periode</div>
<div class="meta-value">{{.StartDate}} {{.EndDate}}</div>
</div>
<div class="meta-item">
<div class="meta-label">Dicetak Oleh</div>
<div class="meta-value">{{.GeneratedBy}}</div>
</div>
<div class="meta-item">
<div class="meta-label">Waktu Cetak</div>
<div class="meta-value">{{.PrintTime}}</div>
</div>
</div>
</div>
</div>
<!-- 01. RINGKASAN KINERJA -->
<div class="section no-break">
<div class="section-header">
<div class="section-number">01. Ringkasan Kinerja</div>
<div class="section-title">Metrik Kinerja Harian</div>
</div>
<div class="summary-container">
<div class="summary-header">
<h3>Ringkasan Keuangan & Operasional</h3>
</div>
<div class="summary-grid">
<div class="summary-item">
<div class="summary-label">Total Transaksi</div>
<div class="summary-value">{{.Summary.TotalTransactions}}</div>
<div class="summary-description">Jumlah transaksi yang diproses</div>
</div>
<div class="summary-item">
<div class="summary-label">Item Terjual</div>
<div class="summary-value">{{.Summary.TotalItems}}</div>
<div class="summary-description">Total unit produk yang terjual</div>
</div>
<div class="summary-item">
<div class="summary-label">Pendapatan Kotor</div>
<div class="summary-value">{{.Summary.GrossSales}}</div>
<div class="summary-description">Total penjualan sebelum potongan</div>
</div>
<div class="summary-item">
<div class="summary-label">Total Diskon</div>
<div class="summary-value">{{.Summary.Discount}}</div>
<div class="summary-description">Potongan harga yang diberikan</div>
</div>
<div class="summary-item">
<div class="summary-label">Pajak</div>
<div class="summary-value">{{.Summary.Tax}}</div>
<div class="summary-description">Total pajak yang dikumpulkan</div>
</div>
<div class="summary-item">
<div class="summary-label">Pendapatan Bersih</div>
<div class="summary-value">{{.Summary.NetSales}}</div>
<div class="summary-description">Pendapatan setelah diskon & pajak</div>
</div>
<div class="summary-item">
<div class="summary-label">HPP (COGS)</div>
<div class="summary-value">{{.Summary.COGS}}</div>
<div class="summary-description">Harga Pokok Penjualan</div>
</div>
<div class="summary-item">
<div class="summary-label">Laba Kotor</div>
<div class="summary-value">{{.Summary.GrossProfit}}</div>
<div class="summary-description">Keuntungan sebelum biaya operasional</div>
</div>
<div class="summary-item">
<div class="summary-label">Margin Laba Kotor</div>
<div class="summary-value">{{.Summary.GrossMarginPercent}}%</div>
<div class="summary-description">Persentase keuntungan terhadap penjualan</div>
</div>
</div>
</div>
</div>
<!-- 02. RINCIAN TRANSAKSI -->
<div class="section no-break">
<div class="section-header">
<div class="section-number">02. Rincian Transaksi</div>
<div class="section-title">Detail Penjualan Per Item</div>
</div>
<div class="table-container">
<div class="table-header">
<div class="table-title">Breakdown Penjualan Harian</div>
<div class="table-subtitle">Rincian transaksi berdasarkan item produk yang terjual</div>
</div>
<table class="data-table">
<thead>
<tr>
<th>No.</th>
<th>Nama Item</th>
<th class="align-center">Qty</th>
<th class="align-right">Penjualan Kotor</th>
<th class="align-right">Diskon</th>
<th class="align-right">Penjualan Bersih</th>
<th class="align-right">HPP</th>
<th class="align-right">Laba Kotor</th>
</tr>
</thead>
<tbody>
{{range $i, $item := .Items}}
<tr>
<td class="align-center number-cell">{{add $i 1}}</td>
<td><span class="item-name">{{$item.Name}}</span></td>
<td class="align-center number-cell">{{$item.Quantity}}</td>
<td class="align-right number-cell">{{$item.GrossSales}}</td>
<td class="align-right number-cell">{{$item.Discount}}</td>
<td class="align-right number-cell">{{$item.NetSales}}</td>
<td class="align-right number-cell">{{$item.COGS}}</td>
<td class="align-right number-cell">{{$item.GrossProfit}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</div>
<!-- 03. RINGKASAN FINANSIAL -->
<div class="section no-break">
<div class="section-header">
<div class="section-number">03. Ringkasan Finansial</div>
<div class="section-title">Perhitungan Laba Rugi</div>
</div>
<div class="financial-summary">
<div class="financial-header">
<h3>Laporan Laba Kotor Harian</h3>
</div>
<div class="financial-content">
<div class="financial-row subtotal">
<span class="financial-label">Pendapatan Kotor</span>
<span class="financial-amount">{{.Summary.GrossSales}}</span>
</div>
<div class="financial-row">
<span class="financial-label">Dikurangi: Diskon</span>
<span class="financial-amount">({{.Summary.Discount}})</span>
</div>
<div class="financial-row">
<span class="financial-label">Ditambah: Pajak</span>
<span class="financial-amount">{{.Summary.Tax}}</span>
</div>
<div class="financial-row subtotal">
<span class="financial-label">Pendapatan Bersih</span>
<span class="financial-amount">{{.Summary.NetSales}}</span>
</div>
<div class="financial-row">
<span class="financial-label">Dikurangi: HPP (COGS)</span>
<span class="financial-amount">({{.Summary.COGS}})</span>
</div>
<div class="financial-row final">
<span class="financial-label">Laba Kotor</span>
<span class="financial-amount">{{.Summary.GrossProfit}}</span>
</div>
</div>
</div>
</div>
<!-- FOOTER NOTES -->
<div class="report-footer">
<div class="footer-title">Catatan Laporan</div>
<ul class="footer-notes">
<li>Laporan ini dibuat berdasarkan data transaksi yang tercatat dalam sistem APSKEL pada periode yang ditentukan</li>
<li>Semua nilai dalam mata uang Rupiah (IDR) kecuali dinyatakan lain dalam dokumen</li>
<li>Margin Laba Kotor dihitung sebagai (Laba Kotor ÷ Pendapatan Bersih) × 100%</li>
<li>HPP (Harga Pokok Penjualan) mencakup biaya langsung untuk memproduksi atau memperoleh barang yang terjual</li>
<li>Data ini dapat digunakan untuk analisis kinerja harian dan perencanaan strategis bisnis</li>
</ul>
</div>
</div>
</body>
</html>