Adds Kasse (Cash Register) module and related components
Introduces comprehensive cash management functionality with multiple view components for tracking daily transactions, filtering, and reconciliation Implements: - Cash calculation and difference tracking - Dynamic tab switching - Checkbox selection and row expansion - Date filtering and approval mechanisms
This commit is contained in:
parent
12869e35bf
commit
754681059d
31 changed files with 2904 additions and 28 deletions
|
|
@ -69,3 +69,5 @@
|
|||
</swp-side-column>
|
||||
</swp-dashboard-grid>
|
||||
</swp-page-container>
|
||||
|
||||
<partial name="_WaitlistDrawer" />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
<swp-card>
|
||||
<swp-card-header>
|
||||
<swp-card-title>Periodens omsætning</swp-card-title>
|
||||
<swp-card-action>Systemtal vs. kontrol</swp-card-action>
|
||||
</swp-card-header>
|
||||
<swp-card-content>
|
||||
<swp-data-table>
|
||||
<swp-data-header>
|
||||
<span>Type</span>
|
||||
<span>System</span>
|
||||
<span>Kontrol</span>
|
||||
</swp-data-header>
|
||||
|
||||
<swp-data-row>
|
||||
<swp-data-label>Kortbetalinger</swp-data-label>
|
||||
<swp-data-system>12.875,50</swp-data-system>
|
||||
<swp-data-input>
|
||||
<input type="text" placeholder="Valgfrit" />
|
||||
</swp-data-input>
|
||||
</swp-data-row>
|
||||
|
||||
<swp-data-row>
|
||||
<swp-data-label>MobilePay / Online</swp-data-label>
|
||||
<swp-data-system>2.450,00</swp-data-system>
|
||||
<swp-data-input>
|
||||
<input type="text" placeholder="Valgfrit" />
|
||||
</swp-data-input>
|
||||
</swp-data-row>
|
||||
|
||||
<swp-data-row>
|
||||
<swp-data-label>Kontantsalg</swp-data-label>
|
||||
<swp-data-system>3.540,00</swp-data-system>
|
||||
<swp-data-value class="muted">..</swp-data-value>
|
||||
</swp-data-row>
|
||||
</swp-data-table>
|
||||
|
||||
<swp-table-note>Kort og MobilePay afstemmes mod bank/indløser. Kontanter tælles op nedenfor.</swp-table-note>
|
||||
</swp-card-content>
|
||||
</swp-card>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for displaying today's payment figures.
|
||||
/// Shows system values vs. optional control values for different payment types.
|
||||
/// </summary>
|
||||
public class KasseDagensTalViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<swp-card>
|
||||
<swp-card-header>
|
||||
<swp-card-title>Periodeoplysninger</swp-card-title>
|
||||
<swp-card-action>Identificér afstemningen</swp-card-action>
|
||||
</swp-card-header>
|
||||
<swp-card-content>
|
||||
<swp-period-display>
|
||||
<swp-period-label>Periode</swp-period-label>
|
||||
<swp-period-value>
|
||||
<span class="from">28. dec 2025 kl. 18:00</span>
|
||||
<span class="arrow">→</span>
|
||||
<span class="to">29. dec 2025</span>
|
||||
</swp-period-value>
|
||||
</swp-period-display>
|
||||
|
||||
<swp-form-grid style="margin-top: var(--spacing-10);">
|
||||
<swp-form-field>
|
||||
<swp-form-label>Kassepunkt</swp-form-label>
|
||||
<swp-form-input>
|
||||
<select id="register">
|
||||
<option>Kasse 1 – Reception</option>
|
||||
<option>Kasse 2 – Salon</option>
|
||||
</select>
|
||||
</swp-form-input>
|
||||
</swp-form-field>
|
||||
|
||||
<swp-form-field>
|
||||
<swp-form-label>Afsluttet af</swp-form-label>
|
||||
<swp-form-input>
|
||||
<select id="employee">
|
||||
<option>Anna Jensen</option>
|
||||
<option>Karina Knudsen</option>
|
||||
<option>Martin Nielsen</option>
|
||||
</select>
|
||||
</swp-form-input>
|
||||
</swp-form-field>
|
||||
</swp-form-grid>
|
||||
|
||||
<swp-auto-id>Afstemnings-ID: <strong>KA-2025-12-29</strong> · Z-043</swp-auto-id>
|
||||
</swp-card-content>
|
||||
</swp-card>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for daily reconciliation info.
|
||||
/// Shows period, register, and employee information.
|
||||
/// </summary>
|
||||
public class KasseDagsoplysningerViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<swp-difference-box id="differenceBox" class="neutral">
|
||||
<swp-difference-label>
|
||||
Kontant difference
|
||||
<small>Optalt minus forventet</small>
|
||||
</swp-difference-label>
|
||||
<swp-difference-value id="differenceValue">– kr</swp-difference-value>
|
||||
</swp-difference-box>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for displaying the cash difference.
|
||||
/// Shows positive/negative/neutral states with color coding.
|
||||
/// </summary>
|
||||
public class KasseDifferenceViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<swp-filter-bar>
|
||||
<swp-filter-group>
|
||||
<swp-filter-label>Fra</swp-filter-label>
|
||||
<input type="date" id="dateFrom" />
|
||||
</swp-filter-group>
|
||||
<swp-filter-group>
|
||||
<swp-filter-label>Til</swp-filter-label>
|
||||
<input type="date" id="dateTo" />
|
||||
</swp-filter-group>
|
||||
<swp-filter-group>
|
||||
<swp-filter-label>Kassepunkt</swp-filter-label>
|
||||
<select id="register">
|
||||
<option>Alle</option>
|
||||
<option>Kasse 1 – Reception</option>
|
||||
<option>Kasse 2 – Salon</option>
|
||||
</select>
|
||||
</swp-filter-group>
|
||||
<swp-filter-group>
|
||||
<swp-filter-label>Status</swp-filter-label>
|
||||
<select id="status">
|
||||
<option>Alle</option>
|
||||
<option>Godkendt</option>
|
||||
<option>Kladde</option>
|
||||
</select>
|
||||
</swp-filter-group>
|
||||
<swp-filter-spacer></swp-filter-spacer>
|
||||
<swp-btn class="secondary">Nulstil</swp-btn>
|
||||
</swp-filter-bar>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for the filter bar on the Kasse list page.
|
||||
/// Contains date range, kassepunkt, and status filters.
|
||||
/// </summary>
|
||||
public class KasseFilterBarViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
<swp-card>
|
||||
<swp-card-header>
|
||||
<swp-card-title>Afslut dagen</swp-card-title>
|
||||
</swp-card-header>
|
||||
<swp-card-content>
|
||||
<swp-approval-grid>
|
||||
<swp-form-field>
|
||||
<swp-form-label>Status</swp-form-label>
|
||||
<swp-status-row>
|
||||
<swp-status-badge class="draft">Kladde</swp-status-badge>
|
||||
</swp-status-row>
|
||||
</swp-form-field>
|
||||
|
||||
<swp-form-field>
|
||||
<swp-form-label>Godkendt af (valgfrit)</swp-form-label>
|
||||
<swp-form-input>
|
||||
<select id="approver">
|
||||
<option value="">Vælg...</option>
|
||||
<option>Karina Knudsen</option>
|
||||
<option>Butikschef</option>
|
||||
</select>
|
||||
</swp-form-input>
|
||||
</swp-form-field>
|
||||
|
||||
<swp-checkbox-field>
|
||||
<input type="checkbox" id="confirmCheckbox" />
|
||||
<label for="confirmCheckbox">Jeg bekræfter, at kassen er talt op, og at tallene er indtastet efter bedste evne.</label>
|
||||
</swp-checkbox-field>
|
||||
</swp-approval-grid>
|
||||
</swp-card-content>
|
||||
<swp-card-footer>
|
||||
<swp-btn class="secondary">Gem som kladde</swp-btn>
|
||||
<swp-actions-right>
|
||||
<swp-btn class="ghost">Fortryd</swp-btn>
|
||||
<swp-btn class="primary" id="approveBtn" disabled>Godkend & lås</swp-btn>
|
||||
</swp-actions-right>
|
||||
</swp-card-footer>
|
||||
</swp-card>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for the approval section.
|
||||
/// Handles status, approver selection, and confirmation checkbox.
|
||||
/// </summary>
|
||||
public class KasseGodkendelseViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<swp-card>
|
||||
<swp-card-header>
|
||||
<swp-card-title>Kontanter i kassen</swp-card-title>
|
||||
</swp-card-header>
|
||||
<swp-card-content>
|
||||
<swp-calc-row>
|
||||
<swp-calc-label>
|
||||
<span>Startbeholdning</span>
|
||||
<small>Overført fra sidste afstemning</small>
|
||||
</swp-calc-label>
|
||||
<swp-calc-value class="muted">2.000,00</swp-calc-value>
|
||||
</swp-calc-row>
|
||||
|
||||
<swp-calc-row>
|
||||
<swp-calc-label>
|
||||
<span>Udbetalinger / Bilag</span>
|
||||
<small>Sammentæl bilag betalt kontant</small>
|
||||
</swp-calc-label>
|
||||
<swp-calc-input>
|
||||
<input type="text" id="payouts" placeholder="0,00" />
|
||||
</swp-calc-input>
|
||||
</swp-calc-row>
|
||||
|
||||
<swp-calc-row>
|
||||
<swp-calc-label>
|
||||
<span>Udtaget til bank</span>
|
||||
<small>Kontanter lagt til side</small>
|
||||
</swp-calc-label>
|
||||
<swp-calc-input>
|
||||
<input type="text" id="toBank" placeholder="0,00" />
|
||||
</swp-calc-input>
|
||||
</swp-calc-row>
|
||||
|
||||
<swp-calc-row>
|
||||
<swp-calc-label>
|
||||
<span>Forventet kontantbeholdning</span>
|
||||
</swp-calc-label>
|
||||
<swp-calc-value id="expectedCash">5.220,00</swp-calc-value>
|
||||
</swp-calc-row>
|
||||
|
||||
<swp-calc-row class="input-row">
|
||||
<swp-calc-label>
|
||||
<span>Optalt kontantbeholdning <span style="color: var(--color-red)">*</span></span>
|
||||
<small>Hvad ligger der faktisk i kassen?</small>
|
||||
</swp-calc-label>
|
||||
<swp-calc-input>
|
||||
<input type="text" id="actualCash" placeholder="0,00" />
|
||||
</swp-calc-input>
|
||||
</swp-calc-row>
|
||||
</swp-card-content>
|
||||
</swp-card>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for cash calculation section.
|
||||
/// Handles starting balance, payouts, bank deposits, and actual cash count.
|
||||
/// </summary>
|
||||
public class KasseKontanterViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<swp-card>
|
||||
<swp-card-header>
|
||||
<swp-card-title>Note til difference</swp-card-title>
|
||||
<swp-card-action>Valgfrit</swp-card-action>
|
||||
</swp-card-header>
|
||||
<swp-card-content>
|
||||
<swp-note-field>
|
||||
<textarea placeholder="Fx kassedifference, fejlslag, runding osv."></textarea>
|
||||
</swp-note-field>
|
||||
<swp-note-hint>Kan gøres obligatorisk ved difference over 100 kr.</swp-note-hint>
|
||||
</swp-card-content>
|
||||
</swp-card>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for the note field.
|
||||
/// Optional field for explaining cash differences.
|
||||
/// </summary>
|
||||
public class KasseNoteViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<swp-kasse-stats>
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>12</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Afstemninger i periode</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat class="highlight">
|
||||
<swp-kasse-stat-value>186.450 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Total omsætning</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>42.340 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Kontantsalg</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat class="warning">
|
||||
<swp-kasse-stat-value>-75 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Samlet difference</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
</swp-kasse-stats>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for the stats bar on the Kasse list page.
|
||||
/// Shows summary statistics for reconciliations.
|
||||
/// </summary>
|
||||
public class KasseStatsBarViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,191 @@
|
|||
<!-- Action Bar -->
|
||||
<swp-action-bar>
|
||||
<swp-selection-info>
|
||||
<span id="selectionCount">0 valgt</span>
|
||||
</swp-selection-info>
|
||||
<swp-btn class="primary" id="exportBtn" disabled>
|
||||
<i class="ph ph-download"></i>
|
||||
Eksporter SAF-T
|
||||
</swp-btn>
|
||||
</swp-action-bar>
|
||||
|
||||
<!-- Table -->
|
||||
<swp-kasse-table>
|
||||
<swp-kasse-table-header>
|
||||
<swp-kasse-th class="checkbox"><input type="checkbox" id="selectAll" /></swp-kasse-th>
|
||||
<swp-kasse-th>Dato</swp-kasse-th>
|
||||
<swp-kasse-th>ID</swp-kasse-th>
|
||||
<swp-kasse-th>Periode</swp-kasse-th>
|
||||
<swp-kasse-th>Kassepunkt</swp-kasse-th>
|
||||
<swp-kasse-th>Afsluttet af</swp-kasse-th>
|
||||
<swp-kasse-th class="right">Omsætning</swp-kasse-th>
|
||||
<swp-kasse-th class="right">Difference</swp-kasse-th>
|
||||
<swp-kasse-th>Status</swp-kasse-th>
|
||||
<swp-kasse-th></swp-kasse-th>
|
||||
</swp-kasse-table-header>
|
||||
|
||||
<swp-kasse-table-body>
|
||||
<!-- Draft row (current day) -->
|
||||
<swp-kasse-table-row data-id="draft" class="draft-row">
|
||||
<swp-kasse-td class="checkbox"></swp-kasse-td>
|
||||
<swp-kasse-td class="muted">I dag</swp-kasse-td>
|
||||
<swp-kasse-td class="id muted">–</swp-kasse-td>
|
||||
<swp-kasse-td>
|
||||
<swp-period-cell>
|
||||
<span class="dates">29. dec 17:45 → ...</span>
|
||||
</swp-period-cell>
|
||||
</swp-kasse-td>
|
||||
<swp-kasse-td>Kasse 1</swp-kasse-td>
|
||||
<swp-kasse-td class="muted">–</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono muted">4.250 kr</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono muted">–</swp-kasse-td>
|
||||
<swp-kasse-td><swp-status-badge class="draft">Kladde</swp-status-badge></swp-kasse-td>
|
||||
<swp-kasse-td><swp-row-arrow><i class="ph ph-caret-right"></i></swp-row-arrow></swp-kasse-td>
|
||||
</swp-kasse-table-row>
|
||||
|
||||
<swp-kasse-table-row data-id="043">
|
||||
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
|
||||
<swp-kasse-td>29. dec</swp-kasse-td>
|
||||
<swp-kasse-td class="id">Z-043</swp-kasse-td>
|
||||
<swp-kasse-td>
|
||||
<swp-period-cell>
|
||||
<span class="dates">28. dec 18:00 → 29. dec 17:45</span>
|
||||
</swp-period-cell>
|
||||
</swp-kasse-td>
|
||||
<swp-kasse-td>Kasse 1</swp-kasse-td>
|
||||
<swp-kasse-td>Anna Jensen</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">18.865 kr</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">0 kr</swp-kasse-td>
|
||||
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
|
||||
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
|
||||
</swp-kasse-table-row>
|
||||
<swp-kasse-row-detail data-for="043">
|
||||
<swp-row-detail-content>
|
||||
<swp-row-detail-actions>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-csv"></i>
|
||||
Download CSV
|
||||
</swp-btn>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-pdf"></i>
|
||||
Download PDF
|
||||
</swp-btn>
|
||||
<swp-btn class="primary">
|
||||
<i class="ph ph-list-bullets"></i>
|
||||
Se transaktioner
|
||||
</swp-btn>
|
||||
</swp-row-detail-actions>
|
||||
</swp-row-detail-content>
|
||||
</swp-kasse-row-detail>
|
||||
|
||||
<swp-kasse-table-row data-id="042">
|
||||
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
|
||||
<swp-kasse-td>28. dec</swp-kasse-td>
|
||||
<swp-kasse-td class="id">Z-042</swp-kasse-td>
|
||||
<swp-kasse-td>
|
||||
<swp-period-cell>
|
||||
<span class="dates">27. dec 18:30 → 28. dec 18:00</span>
|
||||
</swp-period-cell>
|
||||
</swp-kasse-td>
|
||||
<swp-kasse-td>Kasse 1</swp-kasse-td>
|
||||
<swp-kasse-td>Karina Knudsen</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">12.450 kr</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono negative">-25 kr</swp-kasse-td>
|
||||
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
|
||||
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
|
||||
</swp-kasse-table-row>
|
||||
<swp-kasse-row-detail data-for="042">
|
||||
<swp-row-detail-content>
|
||||
<swp-row-detail-actions>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-csv"></i>
|
||||
Download CSV
|
||||
</swp-btn>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-pdf"></i>
|
||||
Download PDF
|
||||
</swp-btn>
|
||||
<swp-btn class="primary">
|
||||
<i class="ph ph-list-bullets"></i>
|
||||
Se transaktioner
|
||||
</swp-btn>
|
||||
</swp-row-detail-actions>
|
||||
</swp-row-detail-content>
|
||||
</swp-kasse-row-detail>
|
||||
|
||||
<swp-kasse-table-row data-id="041">
|
||||
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
|
||||
<swp-kasse-td>27. dec</swp-kasse-td>
|
||||
<swp-kasse-td class="id">Z-041</swp-kasse-td>
|
||||
<swp-kasse-td>
|
||||
<swp-period-cell>
|
||||
<span class="dates">26. dec 18:00 → 27. dec 18:30</span>
|
||||
</swp-period-cell>
|
||||
</swp-kasse-td>
|
||||
<swp-kasse-td>Kasse 1</swp-kasse-td>
|
||||
<swp-kasse-td>Martin Nielsen</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">21.340 kr</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">0 kr</swp-kasse-td>
|
||||
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
|
||||
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
|
||||
</swp-kasse-table-row>
|
||||
<swp-kasse-row-detail data-for="041">
|
||||
<swp-row-detail-content>
|
||||
<swp-row-detail-actions>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-csv"></i>
|
||||
Download CSV
|
||||
</swp-btn>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-pdf"></i>
|
||||
Download PDF
|
||||
</swp-btn>
|
||||
<swp-btn class="primary">
|
||||
<i class="ph ph-list-bullets"></i>
|
||||
Se transaktioner
|
||||
</swp-btn>
|
||||
</swp-row-detail-actions>
|
||||
</swp-row-detail-content>
|
||||
</swp-kasse-row-detail>
|
||||
|
||||
<swp-kasse-table-row data-id="040">
|
||||
<swp-kasse-td class="checkbox"><input type="checkbox" class="row-select" /></swp-kasse-td>
|
||||
<swp-kasse-td>23. dec</swp-kasse-td>
|
||||
<swp-kasse-td class="id">Z-040</swp-kasse-td>
|
||||
<swp-kasse-td>
|
||||
<swp-period-cell>
|
||||
<span class="dates">22. dec 18:00 → 23. dec 17:30</span>
|
||||
</swp-period-cell>
|
||||
</swp-kasse-td>
|
||||
<swp-kasse-td>Kasse 1</swp-kasse-td>
|
||||
<swp-kasse-td>Anna Jensen</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono">28.750 kr</swp-kasse-td>
|
||||
<swp-kasse-td class="right mono negative">-50 kr</swp-kasse-td>
|
||||
<swp-kasse-td><swp-status-badge class="approved">Godkendt</swp-status-badge></swp-kasse-td>
|
||||
<swp-kasse-td><swp-row-toggle><i class="ph ph-caret-right"></i></swp-row-toggle></swp-kasse-td>
|
||||
</swp-kasse-table-row>
|
||||
<swp-kasse-row-detail data-for="040">
|
||||
<swp-row-detail-content>
|
||||
<swp-row-detail-actions>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-csv"></i>
|
||||
Download CSV
|
||||
</swp-btn>
|
||||
<swp-btn class="secondary">
|
||||
<i class="ph ph-file-pdf"></i>
|
||||
Download PDF
|
||||
</swp-btn>
|
||||
<swp-btn class="primary">
|
||||
<i class="ph ph-list-bullets"></i>
|
||||
Se transaktioner
|
||||
</swp-btn>
|
||||
</swp-row-detail-actions>
|
||||
</swp-row-detail-content>
|
||||
</swp-kasse-row-detail>
|
||||
</swp-kasse-table-body>
|
||||
|
||||
<swp-kasse-table-footer>
|
||||
<span>Viser 5 afstemninger</span>
|
||||
<span>Z-040 → Z-043</span>
|
||||
</swp-kasse-table-footer>
|
||||
</swp-kasse-table>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Components;
|
||||
|
||||
/// <summary>
|
||||
/// ViewComponent for the reconciliation table on the Kasse list page.
|
||||
/// Shows all reconciliations with action bar and SAF-T export.
|
||||
/// </summary>
|
||||
public class KasseTableViewComponent : ViewComponent
|
||||
{
|
||||
public IViewComponentResult Invoke()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
}
|
||||
93
PlanTempus.Application/Features/Kasse/Pages/Index.cshtml
Normal file
93
PlanTempus.Application/Features/Kasse/Pages/Index.cshtml
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
@page "/kasse"
|
||||
@using PlanTempus.Application.Features.Kasse.Pages
|
||||
@model PlanTempus.Application.Features.Kasse.Pages.IndexModel
|
||||
@{
|
||||
ViewData["Title"] = "Kasse";
|
||||
}
|
||||
|
||||
<!-- Sticky Header (Stats + Tabs) -->
|
||||
<swp-kasse-sticky-header>
|
||||
<!-- Context Stats (changes based on active tab) -->
|
||||
<swp-kasse-header>
|
||||
<!-- Stats for Oversigt tab -->
|
||||
<swp-kasse-stats data-for-tab="oversigt" class="active">
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>12</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Afstemninger i periode</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat class="highlight">
|
||||
<swp-kasse-stat-value>186.450 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Total omsætning</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>42.340 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Kontantsalg</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat class="warning">
|
||||
<swp-kasse-stat-value>-75 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Samlet difference</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
</swp-kasse-stats>
|
||||
|
||||
<!-- Stats for Dagens afstemning tab -->
|
||||
<swp-kasse-stats data-for-tab="afstemning">
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>47</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Transaktioner i dag</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat class="highlight">
|
||||
<swp-kasse-stat-value>18.865 kr</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Omsætning i dag</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>29. dec 17:45</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Sidste afstemning</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
<swp-kasse-stat>
|
||||
<swp-kasse-stat-value>Anna J.</swp-kasse-stat-value>
|
||||
<swp-kasse-stat-label>Åbnede kassen 29. dec 09:05</swp-kasse-stat-label>
|
||||
</swp-kasse-stat>
|
||||
</swp-kasse-stats>
|
||||
</swp-kasse-header>
|
||||
|
||||
<!-- Tab Bar -->
|
||||
<swp-tab-bar>
|
||||
<swp-tab class="active" data-tab="oversigt">
|
||||
<i class="ph ph-list-checks"></i>
|
||||
Oversigt
|
||||
</swp-tab>
|
||||
<swp-tab data-tab="afstemning">
|
||||
<i class="ph ph-cash-register"></i>
|
||||
Kasseafstemning
|
||||
</swp-tab>
|
||||
</swp-tab-bar>
|
||||
</swp-kasse-sticky-header>
|
||||
|
||||
<!-- Tab Content: Oversigt -->
|
||||
<swp-tab-content data-tab="oversigt" class="active">
|
||||
<swp-page-container>
|
||||
@await Component.InvokeAsync("KasseFilterBar")
|
||||
@await Component.InvokeAsync("KasseTable")
|
||||
</swp-page-container>
|
||||
</swp-tab-content>
|
||||
|
||||
<!-- Tab Content: Dagens Afstemning -->
|
||||
<swp-tab-content data-tab="afstemning">
|
||||
<swp-page-container>
|
||||
<swp-kasse-grid>
|
||||
<swp-kasse-column>
|
||||
@await Component.InvokeAsync("KasseDagensTal")
|
||||
@await Component.InvokeAsync("KasseKontanter")
|
||||
@await Component.InvokeAsync("KasseDifference")
|
||||
</swp-kasse-column>
|
||||
|
||||
<swp-kasse-column>
|
||||
@await Component.InvokeAsync("KasseDagsoplysninger")
|
||||
@await Component.InvokeAsync("KasseNote")
|
||||
@await Component.InvokeAsync("KasseGodkendelse")
|
||||
</swp-kasse-column>
|
||||
</swp-kasse-grid>
|
||||
|
||||
<swp-system-note>Systemet gemmer hvornår og af hvem der er godkendt – enkelt kontrolspor.</swp-system-note>
|
||||
</swp-page-container>
|
||||
</swp-tab-content>
|
||||
10
PlanTempus.Application/Features/Kasse/Pages/Index.cshtml.cs
Normal file
10
PlanTempus.Application/Features/Kasse/Pages/Index.cshtml.cs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
|
||||
namespace PlanTempus.Application.Features.Kasse.Pages;
|
||||
|
||||
public class IndexModel : PageModel
|
||||
{
|
||||
public void OnGet()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -79,8 +79,8 @@ public class MockMenuService : IMenuService
|
|||
{
|
||||
Id = "pos",
|
||||
Label = "Kasse",
|
||||
Icon = "ph-device-mobile",
|
||||
Url = "/pos",
|
||||
Icon = "ph-cash-register",
|
||||
Url = "/kasse",
|
||||
MinimumRole = UserRole.Staff,
|
||||
SortOrder = 3
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@
|
|||
<link rel="stylesheet" href="~/css/attentions.css">
|
||||
<link rel="stylesheet" href="~/css/quick-stats.css">
|
||||
<link rel="stylesheet" href="~/css/waitlist.css">
|
||||
<link rel="stylesheet" href="~/css/tabs.css">
|
||||
<link rel="stylesheet" href="~/css/kasse.css">
|
||||
@await RenderSectionAsync("Styles", required: false)
|
||||
</head>
|
||||
<body class="has-demo-banner">
|
||||
|
|
@ -50,7 +52,6 @@
|
|||
</swp-app-layout>
|
||||
|
||||
<partial name="_ProfileDrawer" />
|
||||
<partial name="_WaitlistDrawer" />
|
||||
<swp-drawer-overlay id="drawerOverlay"></swp-drawer-overlay>
|
||||
|
||||
<script type="module" src="~/js/app.js"></script>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue