tin-spa 20.14.113 → 20.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/index.d.ts +80 -10
- package/fesm2022/{tin-spa-accounting.module-Cg4vWaJE.mjs → tin-spa-accounting.module-CamqAeW_.mjs} +71 -83
- package/fesm2022/tin-spa-accounting.module-CamqAeW_.mjs.map +1 -0
- package/fesm2022/{tin-spa-agent-page.component-DJvMPjCQ.mjs → tin-spa-agent-page.component-DTYn54p0.mjs} +2 -2
- package/fesm2022/{tin-spa-agent-page.component-DJvMPjCQ.mjs.map → tin-spa-agent-page.component-DTYn54p0.mjs.map} +1 -1
- package/fesm2022/{tin-spa-agent.component-D0CGGnGZ.mjs → tin-spa-agent.component-CZKMWl3r.mjs} +2 -2
- package/fesm2022/{tin-spa-agent.component-D0CGGnGZ.mjs.map → tin-spa-agent.component-CZKMWl3r.mjs.map} +1 -1
- package/fesm2022/{tin-spa-assets.module-qIWNwJ2E.mjs → tin-spa-assets.module-BcOjlhfm.mjs} +16 -11
- package/fesm2022/tin-spa-assets.module-BcOjlhfm.mjs.map +1 -0
- package/fesm2022/tin-spa-core.mjs +426 -112
- package/fesm2022/tin-spa-core.mjs.map +1 -1
- package/fesm2022/{tin-spa-general-erp.module-CoYxceLj.mjs → tin-spa-general-erp.module-b6SjnWUM.mjs} +2 -2
- package/fesm2022/{tin-spa-general-erp.module-CoYxceLj.mjs.map → tin-spa-general-erp.module-b6SjnWUM.mjs.map} +1 -1
- package/fesm2022/{tin-spa-hr.module-CKPZ9ZOj.mjs → tin-spa-hr.module-DkGVK2lX.mjs} +2 -2
- package/fesm2022/{tin-spa-hr.module-CKPZ9ZOj.mjs.map → tin-spa-hr.module-DkGVK2lX.mjs.map} +1 -1
- package/fesm2022/tin-spa-http.mjs +32 -1
- package/fesm2022/tin-spa-http.mjs.map +1 -1
- package/fesm2022/{tin-spa-inventory.module-DRKAcNau.mjs → tin-spa-inventory.module-CYWBqSCd.mjs} +16 -11
- package/fesm2022/tin-spa-inventory.module-CYWBqSCd.mjs.map +1 -0
- package/fesm2022/{tin-spa-loans.module-BTDmgrWo.mjs → tin-spa-loans.module-BDh-T-Ng.mjs} +2 -2
- package/fesm2022/{tin-spa-loans.module-BTDmgrWo.mjs.map → tin-spa-loans.module-BDh-T-Ng.mjs.map} +1 -1
- package/fesm2022/{tin-spa-manufacturing.module-CHta6oV_.mjs → tin-spa-manufacturing.module-9Ti-BFb2.mjs} +2 -2
- package/fesm2022/{tin-spa-manufacturing.module-CHta6oV_.mjs.map → tin-spa-manufacturing.module-9Ti-BFb2.mjs.map} +1 -1
- package/fesm2022/{tin-spa-payroll.module-CZ_GO1jF.mjs → tin-spa-payroll.module-54Efumv_.mjs} +9 -6
- package/fesm2022/{tin-spa-payroll.module-CZ_GO1jF.mjs.map → tin-spa-payroll.module-54Efumv_.mjs.map} +1 -1
- package/fesm2022/{tin-spa-purchasing.module-NCdwquaF.mjs → tin-spa-purchasing.module-Bq8JnsyM.mjs} +16 -11
- package/fesm2022/tin-spa-purchasing.module-Bq8JnsyM.mjs.map +1 -0
- package/fesm2022/{tin-spa-sales.module-D0uEGJW7.mjs → tin-spa-sales.module-nyrJulzD.mjs} +40 -17
- package/fesm2022/tin-spa-sales.module-nyrJulzD.mjs.map +1 -0
- package/fesm2022/{tin-spa-tenancy-erp.module-GwIv8Wbc.mjs → tin-spa-tenancy-erp.module-DGATA-p_.mjs} +2 -2
- package/fesm2022/{tin-spa-tenancy-erp.module-GwIv8Wbc.mjs.map → tin-spa-tenancy-erp.module-DGATA-p_.mjs.map} +1 -1
- package/fesm2022/{tin-spa-tin-spa-Cqe5hYTr.mjs → tin-spa-tin-spa-BMy59BVn.mjs} +1428 -219
- package/fesm2022/tin-spa-tin-spa-BMy59BVn.mjs.map +1 -0
- package/fesm2022/tin-spa.mjs +1 -1
- package/http/index.d.ts +3 -1
- package/index.d.ts +144 -24
- package/package.json +1 -1
- package/src/tin-styles.css +27 -0
- package/fesm2022/tin-spa-accounting.module-Cg4vWaJE.mjs.map +0 -1
- package/fesm2022/tin-spa-assets.module-qIWNwJ2E.mjs.map +0 -1
- package/fesm2022/tin-spa-inventory.module-DRKAcNau.mjs.map +0 -1
- package/fesm2022/tin-spa-purchasing.module-NCdwquaF.mjs.map +0 -1
- package/fesm2022/tin-spa-sales.module-D0uEGJW7.mjs.map +0 -1
- package/fesm2022/tin-spa-tin-spa-Cqe5hYTr.mjs.map +0 -1
package/fesm2022/{tin-spa-payroll.module-CZ_GO1jF.mjs → tin-spa-payroll.module-54Efumv_.mjs}
RENAMED
|
@@ -4,7 +4,7 @@ import * as i1$2 from '@angular/router';
|
|
|
4
4
|
import { RouterModule } from '@angular/router';
|
|
5
5
|
import * as i1$1 from 'tin-spa/core';
|
|
6
6
|
import { PayrollService, DataServiceLib, ConfigService, MessageService } from 'tin-spa/core';
|
|
7
|
-
import { P as PageComponent, T as TilesComponent, C as ChartsComponent, e as SpaAdminModule } from './tin-spa-tin-spa-
|
|
7
|
+
import { P as PageComponent, T as TilesComponent, C as ChartsComponent, e as SpaAdminModule } from './tin-spa-tin-spa-BMy59BVn.mjs';
|
|
8
8
|
import * as i1 from '@angular/common';
|
|
9
9
|
import { CommonModule } from '@angular/common';
|
|
10
10
|
import * as i2 from '@angular/forms';
|
|
@@ -657,7 +657,8 @@ class PayrollDashboardComponent {
|
|
|
657
657
|
{ name: 'totalPayrollCostYTD', alias: 'Payroll Cost (YTD)', color: '#00695c', icon: 'attach_money', style: 'icon', prefix: '$', info: 'Year-to-date gross payroll' },
|
|
658
658
|
],
|
|
659
659
|
loadAction: { url: 'payrollruns/dashboard-summary/x' },
|
|
660
|
-
loadInit: true
|
|
660
|
+
loadInit: true,
|
|
661
|
+
security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72 (datalib.service.ts:260) — a single-module dashboard, so the gate sits on the whole config
|
|
661
662
|
};
|
|
662
663
|
// Changed: Chart tiles — cost ratio gauge, trend sparkline, department pie, run status bar
|
|
663
664
|
this.chartTiles = {
|
|
@@ -668,7 +669,8 @@ class PayrollDashboardComponent {
|
|
|
668
669
|
{ name: 'runStatusSplit', alias: 'Run Status', color: '#9c27b0', chart: { type: 'bar', colors: ['#9e9e9e', '#2196f3', '#ff9800', '#4caf50'], height: 100, dataField: 'runStatusSplit' }, footer: 'All-time run status', footerIcon: 'bar_chart' },
|
|
669
670
|
],
|
|
670
671
|
loadAction: { url: 'payrollruns/dashboard-chart-tiles/x' },
|
|
671
|
-
loadInit: true
|
|
672
|
+
loadInit: true,
|
|
673
|
+
security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72
|
|
672
674
|
};
|
|
673
675
|
// Changed: Full charts — cost trend, department breakdown, earnings vs deductions, commission & overtime
|
|
674
676
|
this.chartConfig = {
|
|
@@ -680,7 +682,8 @@ class PayrollDashboardComponent {
|
|
|
680
682
|
],
|
|
681
683
|
loadAction: { url: 'payrollruns/dashboard-charts/x' },
|
|
682
684
|
loadInit: true,
|
|
683
|
-
columns: 2
|
|
685
|
+
columns: 2,
|
|
686
|
+
security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72
|
|
684
687
|
};
|
|
685
688
|
}
|
|
686
689
|
ngOnInit() {
|
|
@@ -732,7 +735,7 @@ class PayrollDashboardComponent {
|
|
|
732
735
|
|
|
733
736
|
<spa-charts [config]="chartConfig"></spa-charts>
|
|
734
737
|
</div>
|
|
735
|
-
`, isInline: true, styles: [".dashboard-container{padding:16px}.dashboard-title{display:flex;align-items:center;gap:8px;margin-bottom:16px;color:#333;font-weight:500}.runs-section{margin-top:16px}.section-title{display:flex;align-items:center;margin-bottom:8px;color:#333;font-weight:500}.kpi-table{width:100%;border-collapse:collapse;font-size:13px}.kpi-table th{text-align:left;padding:8px 12px;background:#f5f5f5;border-bottom:2px solid #e0e0e0;font-weight:500}.kpi-table td{padding:8px 12px;border-bottom:1px solid #eee}.kpi-table tr:hover{background:#fafafa}.status-chip{padding:2px 8px;border-radius:12px;color:#fff;font-size:11px;font-weight:500}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "tileClick", "tileUnClick"] }, { kind: "component", type: ChartsComponent, selector: "spa-charts", inputs: ["config", "data", "reload"] }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
|
|
738
|
+
`, isInline: true, styles: [".dashboard-container{padding:16px}.dashboard-title{display:flex;align-items:center;gap:8px;margin-bottom:16px;color:#333;font-weight:500}.runs-section{margin-top:16px}.section-title{display:flex;align-items:center;margin-bottom:8px;color:#333;font-weight:500}.kpi-table{width:100%;border-collapse:collapse;font-size:13px}.kpi-table th{text-align:left;padding:8px 12px;background:#f5f5f5;border-bottom:2px solid #e0e0e0;font-weight:500}.kpi-table td{padding:8px 12px;border-bottom:1px solid #eee}.kpi-table tr:hover{background:#fafafa}.status-chip{padding:2px 8px;border-radius:12px;color:#fff;font-size:11px;font-weight:500}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "contentResolved", "tileClick", "tileUnClick"] }, { kind: "component", type: ChartsComponent, selector: "spa-charts", inputs: ["config", "data", "reload"], outputs: ["contentResolved"] }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
|
|
736
739
|
}
|
|
737
740
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PayrollDashboardComponent, decorators: [{
|
|
738
741
|
type: Component,
|
|
@@ -844,4 +847,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
|
|
|
844
847
|
}] });
|
|
845
848
|
|
|
846
849
|
export { PayrollModule };
|
|
847
|
-
//# sourceMappingURL=tin-spa-payroll.module-
|
|
850
|
+
//# sourceMappingURL=tin-spa-payroll.module-54Efumv_.mjs.map
|
package/fesm2022/{tin-spa-payroll.module-CZ_GO1jF.mjs.map → tin-spa-payroll.module-54Efumv_.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tin-spa-payroll.module-CZ_GO1jF.mjs","sources":["../../../projects/tin-spa/src/lib/pages/payroll/salary-structures/salary-structures.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/statutory-deductions/statutory-deductions.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/payroll-runs/payroll-runs.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-configs/commission-configs.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-entries/commission-entries.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-statement/commission-statement.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/salary-advances/salary-advances.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/overtime-entries/overtime-entries.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/payroll-dashboard/payroll-dashboard.component.ts","../../../projects/tin-spa/src/lib/modules/payroll/payroll-routing.module.ts","../../../projects/tin-spa/src/lib/modules/payroll/payroll.module.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-salary-structures',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SalaryStructuresComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Salary Structures',\n tableConfig: this.payrollService.salaryStructuresTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-statutory-deductions',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class StatutoryDeductionsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Statutory Deductions',\n tableConfig: this.payrollService.statutoryDeductionTypesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-payroll-runs',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class PayrollRunsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Payroll Runs',\n tableConfig: this.payrollService.payrollRunsTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-commission-configs',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CommissionConfigsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Commission Configs',\n tableConfig: this.payrollService.commissionConfigsTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-commission-entries',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CommissionEntriesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Commission Entries',\n tableConfig: this.payrollService.commissionEntriesTableConfig\n };\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { ApiResponse } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { ConfigService } from 'tin-spa/core';\nimport { MessageService } from 'tin-spa/core';\n\n// Added (Phase 6): the Driver Commission Statement, and the only place the response-level warnings from\n// preview and generate reach a human. Phases 2-5 surfaced the ROW-level ones — a 0.00 entry, a rule scoped\n// to nobody — but a rule skipped because it expired, and an invoice excluded because a credit note settled\n// it rather than cash, live on the RESPONSE, and nothing rendered them. `execAction` on the table component\n// toasts apiResponse.message and drops apiResponse.data, so a Preview button bound to a table config would\n// have shown the one-line summary and silently discarded every named reason. Hence a page.\n@Component({\n selector: 'spa-commission-statement',\n template: `\n <div class=\"cs-container\">\n\n <h4 class=\"cs-title\"><mat-icon>receipt_long</mat-icon> Driver Commission Statement</h4>\n\n <!-- Period, and the two actions. Preview and Generate render only where trip commission is switched on,\n which in practice means Shift — every other app gets the statement without the generator. -->\n <div class=\"cs-bar\">\n <div class=\"cs-period\">\n <mat-form-field appearance=\"outline\" class=\"cs-year\">\n <mat-label>Year</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"periodYear\" (change)=\"clearResults()\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"cs-month\">\n <mat-label>Month</mat-label>\n <mat-select [(ngModel)]=\"periodMonth\" (selectionChange)=\"clearResults()\">\n <mat-option *ngFor=\"let m of months\" [value]=\"m.value\">{{ m.name }}</mat-option>\n </mat-select>\n </mat-form-field>\n <button mat-stroked-button color=\"primary\" (click)=\"loadStatement()\" [disabled]=\"busy\">Show Statement</button>\n </div>\n\n <div class=\"cs-actions\" *ngIf=\"tripCommissionEnabled\">\n <button mat-stroked-button (click)=\"preview()\" [disabled]=\"busy\"><mat-icon>visibility</mat-icon> Preview (writes nothing)</button>\n <button mat-flat-button color=\"primary\" (click)=\"generate()\" [disabled]=\"busy\"><mat-icon>playlist_add</mat-icon> Generate from Trips</button>\n </div>\n </div>\n\n <div class=\"alert alert-secondary cs-note\" *ngIf=\"!tripCommissionEnabled\">\n Commission is not generated from trips in this app, so this page reports what has been recorded rather than\n proposing anything new.\n </div>\n\n <!-- ============ PREVIEW RESULT — the whole point of this page ============ -->\n <div class=\"cs-panel\" *ngIf=\"previewResult\">\n <div class=\"alert alert-info cs-headline\">\n <strong>Preview only — nothing was written.</strong>\n {{ previewResult.entries?.length || 0 }} {{ (previewResult.entries?.length === 1) ? 'entry' : 'entries' }}\n totalling {{ previewTotal | number:'1.2-2' }} for {{ previewResult.periodName || periodLabel() }}.\n Generating turns these into <strong>Draft</strong> entries, which still have to be approved before payroll can pay them.\n </div>\n\n <!-- Response-level warnings: the ones that were invisible until now -->\n <div class=\"alert alert-warning\" *ngIf=\"previewResult.warnings?.length\">\n <strong>{{ previewResult.warnings.length }} warning{{ previewResult.warnings.length === 1 ? '' : 's' }} about this period</strong>\n <ul class=\"cs-list\"><li *ngFor=\"let w of previewResult.warnings\">{{ w }}</li></ul>\n </div>\n\n <!-- Skipped rules, each with the reason the evaluator refused it -->\n <div class=\"alert alert-danger\" *ngIf=\"previewResult.skippedRules?.length\">\n <strong>{{ previewResult.skippedRules.length }} rule{{ previewResult.skippedRules.length === 1 ? '' : 's' }} paid nobody</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let s of previewResult.skippedRules\"><strong>{{ s.configName }}</strong> — {{ s.reason }}</li>\n </ul>\n </div>\n\n <table class=\"cs-table\" *ngIf=\"previewResult.entries?.length\">\n <thead>\n <tr>\n <th>Employee</th><th>Rule</th><th>Basis</th><th>Earned When</th>\n <th class=\"cs-num\">Measured</th><th class=\"cs-num\">Rate</th><th class=\"cs-num\">Raw</th><th class=\"cs-num\">Would Pay</th><th>Notes</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of previewResult.entries\">\n <td>{{ e.employeeName }}</td>\n <td>{{ e.configName }}</td>\n <td>{{ e.basisName }}</td>\n <td>{{ e.earnEventName }}</td>\n <td class=\"cs-num\">{{ e.metricValue | number:'1.0-2' }}</td>\n <td class=\"cs-num\">{{ e.rate | number:'1.0-4' }}</td>\n <td class=\"cs-num\">{{ e.rawAmount | number:'1.2-2' }}</td>\n <td class=\"cs-num cs-strong\" [class.cs-zero]=\"e.commissionAmount === 0\">{{ e.commissionAmount | number:'1.2-2' }}</td>\n <td class=\"cs-notes\">\n <span class=\"cs-flag\" *ngIf=\"e.usedTiers\">tiered</span>\n <span class=\"cs-flag\" *ngIf=\"e.minimumApplied\">floor applied</span>\n <span class=\"cs-flag\" *ngIf=\"e.maximumApplied\">cap applied</span>\n <span class=\"cs-warn\" *ngFor=\"let w of e.warnings\">{{ w }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- ============ GENERATE RESULT ============ -->\n <div class=\"cs-panel\" *ngIf=\"generateResult\">\n <div class=\"alert alert-success cs-headline\">\n <strong>{{ generateResult.entriesCreated }} Draft entr{{ generateResult.entriesCreated === 1 ? 'y' : 'ies' }}</strong>\n created from {{ generateResult.linesCreated }} source line{{ generateResult.linesCreated === 1 ? '' : 's' }},\n totalling {{ generateResult.totalAmount | number:'1.2-2' }} for {{ generateResult.periodName || periodLabel() }}.\n Draft entries do <strong>not</strong> reach a payslip until they are approved.\n </div>\n\n <!-- What a regeneration MOVED. These three are the ones nobody must discover from a payslip. -->\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.draftEntriesReplaced || generateResult.approvedEntriesNeutralised || generateResult.paidEntriesReversed\">\n <ul class=\"cs-list\">\n <li *ngIf=\"generateResult.draftEntriesReplaced\">{{ generateResult.draftEntriesReplaced }} previous draft entr{{ generateResult.draftEntriesReplaced === 1 ? 'y was' : 'ies were' }} replaced.</li>\n <li *ngIf=\"generateResult.approvedEntriesNeutralised\"><strong>{{ generateResult.approvedEntriesNeutralised }} already-approved entr{{ generateResult.approvedEntriesNeutralised === 1 ? 'y was' : 'ies were' }} reversed and must be approved again.</strong></li>\n <li *ngIf=\"generateResult.paidEntriesReversed\"><strong>{{ generateResult.paidEntriesReversed }} already-paid entr{{ generateResult.paidEntriesReversed === 1 ? 'y' : 'ies' }} raised a negative clawback awaiting approval.</strong> The original payment stands.</li>\n </ul>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.entriesWithWarnings?.length\">\n <strong>{{ generateResult.entriesWithWarnings.length }} entr{{ generateResult.entriesWithWarnings.length === 1 ? 'y needs' : 'ies need' }} attention before approval</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let e of generateResult.entriesWithWarnings\">\n <strong>{{ e.employeeName }}</strong> — {{ e.configName }} — {{ e.commissionAmount | number:'1.2-2' }}\n <span *ngFor=\"let w of e.warnings\" class=\"cs-warn\">{{ w }}</span>\n </li>\n </ul>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.warnings?.length\">\n <ul class=\"cs-list\"><li *ngFor=\"let w of generateResult.warnings\">{{ w }}</li></ul>\n </div>\n\n <div class=\"alert alert-danger\" *ngIf=\"generateResult.skippedRules?.length\">\n <strong>{{ generateResult.skippedRules.length }} rule{{ generateResult.skippedRules.length === 1 ? '' : 's' }} paid nobody</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let s of generateResult.skippedRules\"><strong>{{ s.configName }}</strong> — {{ s.reason }}</li>\n </ul>\n </div>\n </div>\n\n <!-- ============ THE STATEMENT ITSELF ============ -->\n <div class=\"cs-panel\" *ngIf=\"statementLoaded\">\n <h5 class=\"cs-section\">Recorded for {{ periodLabel() }}</h5>\n\n <div class=\"cs-totals\">\n <div class=\"cs-total\"><span class=\"cs-total-label\">Proposed (Draft)</span><span class=\"cs-total-value cs-draft\">{{ totals.draft | number:'1.2-2' }}</span><span class=\"cs-total-note\">not payable until approved</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Payable (Approved)</span><span class=\"cs-total-value cs-approved\">{{ totals.approved | number:'1.2-2' }}</span><span class=\"cs-total-note\">will be picked up by a payroll run</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Settled (Paid)</span><span class=\"cs-total-value\">{{ totals.paid | number:'1.2-2' }}</span><span class=\"cs-total-note\">already on a payslip line</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Reversed</span><span class=\"cs-total-value cs-reversed\">{{ totals.reversed | number:'1.2-2' }}</span><span class=\"cs-total-note\">clawbacks against earlier entries</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Carried forward in</span><span class=\"cs-total-value\">{{ totals.carried | number:'1.2-2' }}</span><span class=\"cs-total-note\">earned in an earlier period</span></div>\n </div>\n\n <div class=\"alert alert-secondary cs-note\" *ngIf=\"!entries.length\">\n Nothing has been recorded for this period yet.\n </div>\n\n <table class=\"cs-table\" *ngIf=\"entries.length\">\n <thead>\n <tr><th>Employee</th><th>Description</th><th>Source</th><th class=\"cs-num\">Measured</th><th class=\"cs-num\">Amount</th><th>Status</th><th>Paid</th><th>Lines</th></tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of entries\">\n <td>{{ e.employeeName }}</td>\n <td>\n {{ e.description }}\n <span class=\"cs-flag\" *ngIf=\"e.isCarriedForward\">from {{ e.originPeriodMonth }}/{{ e.originPeriodYear }}</span>\n <span class=\"cs-flag cs-flag-warn\" *ngIf=\"e.isReversal\">reverses #{{ e.reversesCommissionEntryID }}</span>\n </td>\n <td>{{ e.sourceType }}</td>\n <td class=\"cs-num\">{{ e.metricValue | number:'1.0-2' }}</td>\n <td class=\"cs-num cs-strong\" [class.cs-negative]=\"e.commissionAmount < 0\">{{ e.commissionAmount | number:'1.2-2' }}</td>\n <td><span [ngClass]=\"statusClass(e)\">{{ e.statusName }}</span></td>\n <td>{{ e.isPaid ? 'Yes' : '' }}</td>\n <td>{{ e.lineCount }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n </div>\n `,\n styles: [`\n .cs-container { padding: 16px; }\n .cs-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: #333; font-weight: 500; }\n .cs-bar { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: space-between; margin-bottom: 8px; }\n .cs-period { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }\n .cs-actions { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }\n .cs-year { width: 110px; }\n .cs-month { width: 160px; }\n .cs-note { font-size: 14px; }\n .cs-panel { margin-top: 8px; }\n .cs-headline { font-size: 14px; }\n .cs-section { color: #333; font-weight: 500; margin: 16px 0 8px; }\n .cs-list { margin: 6px 0 0; padding-left: 20px; }\n .cs-list li { margin-bottom: 3px; }\n .cs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n .cs-table th { text-align: left; padding: 8px 12px; background: #f5f5f5; border-bottom: 2px solid #e0e0e0; font-weight: 500; white-space: nowrap; }\n .cs-table td { padding: 8px 12px; border-bottom: 1px solid #eee; vertical-align: top; }\n .cs-table tr:hover { background: #fafafa; }\n .cs-num { text-align: right; white-space: nowrap; }\n .cs-strong { font-weight: 600; }\n .cs-zero { color: #e65100; }\n .cs-negative { color: #c62828; }\n .cs-notes { max-width: 320px; }\n .cs-flag { display: inline-block; margin: 1px 4px 1px 0; padding: 1px 7px; border-radius: 10px; background: #eceff1; color: #455a64; font-size: 11px; white-space: nowrap; }\n .cs-flag-warn { background: #fff3cd; color: #664d03; }\n .cs-warn { display: block; color: #664d03; font-size: 12px; margin-top: 2px; }\n .cs-totals { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 12px; }\n .cs-total { display: flex; flex-direction: column; min-width: 170px; flex: 1 1 170px; padding: 10px 14px; border: 1px solid #e0e0e0; border-radius: 6px; background: #fff; }\n .cs-total-label { font-size: 12px; color: #607d8b; }\n .cs-total-value { font-size: 20px; font-weight: 600; }\n .cs-total-note { font-size: 11px; color: #90a4ae; }\n .cs-draft { color: #757575; }\n .cs-approved { color: #2e7d32; }\n .cs-reversed { color: #c62828; }\n .cs-status-draft { color: #757575; }\n .cs-status-approved { color: #2e7d32; font-weight: 600; }\n .cs-status-reversed { color: #c62828; }\n\n /* Phones: the two control groups stop competing for one row and the wide tables scroll inside\n themselves rather than pushing the page sideways. */\n @media (max-width: 700px) {\n .cs-bar { flex-direction: column; align-items: stretch; }\n .cs-actions button { flex: 1 1 auto; }\n .cs-panel { overflow-x: auto; }\n .cs-notes { max-width: none; }\n }\n `],\n standalone: false\n})\nexport class CommissionStatementComponent implements OnInit {\n\n private dataService = inject(DataServiceLib);\n private configService = inject(ConfigService);\n private messageService = inject(MessageService);\n\n months = [\n { value: 1, name: 'January' }, { value: 2, name: 'February' }, { value: 3, name: 'March' },\n { value: 4, name: 'April' }, { value: 5, name: 'May' }, { value: 6, name: 'June' },\n { value: 7, name: 'July' }, { value: 8, name: 'August' }, { value: 9, name: 'September' },\n { value: 10, name: 'October' }, { value: 11, name: 'November' }, { value: 12, name: 'December' },\n ];\n\n periodYear = new Date().getFullYear();\n periodMonth = new Date().getMonth() + 1;\n\n busy = false;\n previewResult: any = null;\n generateResult: any = null;\n entries: any[] = [];\n statementLoaded = false;\n totals = { draft: 0, approved: 0, paid: 0, reversed: 0, carried: 0 };\n\n // Reads the one shared App Configuration record. An app whose configuration has no EnableTripCommission\n // property simply gets undefined, so the generator hides — this fails CLOSED on purpose, matching the\n // server's own late-bound read of the flag. A button that offers to write commission in an app that does\n // not generate it is worse than no button.\n tripCommissionEnabled = false;\n\n ngOnInit(): void {\n this.tripCommissionEnabled = !!this.configService.value?.enableTripCommission;\n this.configService.config$.subscribe((config: any) => {\n this.tripCommissionEnabled = !!config?.enableTripCommission;\n });\n this.loadStatement();\n }\n\n periodLabel(): string {\n return `${this.months.find(m => m.value === this.periodMonth)?.name ?? this.periodMonth} ${this.periodYear}`;\n }\n\n get previewTotal(): number {\n return (this.previewResult?.entries || []).reduce((sum: number, e: any) => sum + (e.commissionAmount || 0), 0);\n }\n\n statusClass(entry: any): string {\n if (entry?.status === 1) return 'cs-status-draft';\n if (entry?.status === 2) return 'cs-status-approved';\n if (entry?.status === 4) return 'cs-status-reversed';\n return '';\n }\n\n // Changing the period invalidates both result panels — leaving July's preview on screen above August's\n // statement is how someone approves the wrong month.\n clearResults() {\n this.previewResult = null;\n this.generateResult = null;\n this.statementLoaded = false;\n }\n\n loadStatement() {\n if (!this.validPeriod()) return;\n\n this.busy = true;\n this.dataService.CallApi({ url: `commissionentries/period/${this.periodYear}-${this.periodMonth}` }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Could not load the statement'); return; }\n this.entries = res.data || [];\n this.statementLoaded = true;\n this.recalculateTotals();\n },\n error: () => { this.busy = false; }\n });\n }\n\n // Draft, Approved, Paid and Reversed are summed separately and never rolled into one figure. A single\n // \"total commission\" would read as owed when most of it is a proposal nobody has approved.\n private recalculateTotals() {\n this.totals = { draft: 0, approved: 0, paid: 0, reversed: 0, carried: 0 };\n\n for (const e of this.entries) {\n const amount = e.commissionAmount || 0;\n if (e.isPaid || e.status === 3) this.totals.paid += amount;\n else if (e.status === 2) this.totals.approved += amount;\n else if (e.status === 4) this.totals.reversed += amount;\n else this.totals.draft += amount;\n\n if (e.isCarriedForward) this.totals.carried += amount;\n }\n }\n\n // PREVIEW WRITES NOTHING. It is gated on cap77 VIEW server-side for exactly that reason, and the result\n // panel repeats it — a figure on screen that looks committed is the failure this button exists to avoid.\n preview() {\n if (!this.validPeriod()) return;\n\n this.busy = true;\n this.generateResult = null;\n this.dataService.CallApi({ url: 'shiftcommission/preview', method: 'post' }, { periodYear: this.periodYear, periodMonth: this.periodMonth }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Preview failed'); return; }\n this.previewResult = res.data || {};\n },\n error: () => { this.busy = false; }\n });\n }\n\n // GENERATE WRITES. Every entry lands as Draft, so nothing here can pay anybody without a separate\n // approval — the confirm says so rather than leaving it to be discovered.\n generate() {\n if (!this.validPeriod()) return;\n\n this.messageService.confirm(`Generate commission entries for ${this.periodLabel()}? They are created as Draft and still have to be approved before a payroll run can pay them. Regenerating a period reverses entries that were already approved or paid.`)\n .subscribe((answer: any) => {\n if (answer !== 'yes') return;\n\n this.busy = true;\n this.previewResult = null;\n this.dataService.CallApi({ url: 'shiftcommission/generate', method: 'post' }, { periodYear: this.periodYear, periodMonth: this.periodMonth }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Generation failed'); return; }\n this.generateResult = res.data || {};\n this.loadStatement(); // the statement below must agree with what was just written\n },\n error: () => { this.busy = false; }\n });\n });\n }\n\n private validPeriod(): boolean {\n if (!this.periodMonth || this.periodMonth < 1 || this.periodMonth > 12) { this.messageService.toast('Choose a month'); return false; }\n if (!this.periodYear || this.periodYear < 2000 || this.periodYear > 2100) { this.messageService.toast('Year must be between 2000 and 2100'); return false; }\n return true;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-salary-advances',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SalaryAdvancesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Salary Advances',\n tableConfig: this.payrollService.salaryAdvancesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-overtime-entries',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class OvertimeEntriesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Overtime Entries',\n tableConfig: this.payrollService.overtimeEntriesTableConfig\n };\n}\n","import { Component, OnInit } from '@angular/core';\nimport { TileConfig, ChartConfig, ApiResponse } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core';\n\n// Payroll module dashboard with cost tracking, department analysis, and employee metrics\n@Component({\n selector: 'spa-payroll-dashboard',\n template: `\n <div class=\"dashboard-container\">\n <h4 class=\"dashboard-title\"><mat-icon>payments</mat-icon> Payroll Dashboard</h4>\n <spa-tiles [config]=\"summaryTiles\"></spa-tiles>\n <div style=\"margin-top: 16px;\"></div>\n <spa-tiles [config]=\"chartTiles\"></spa-tiles>\n\n <!-- Recent Payroll Runs sub-table -->\n <div *ngIf=\"recentRuns.length > 0\" class=\"runs-section\">\n <h5 class=\"section-title\">\n <mat-icon style=\"vertical-align: middle; margin-right: 4px;\">play_circle</mat-icon>\n Recent Payroll Runs\n </h5>\n <table class=\"kpi-table\">\n <thead>\n <tr>\n <th>Period</th>\n <th>Pay Date</th>\n <th>Status</th>\n <th>Employees</th>\n <th>Gross Pay</th>\n <th>Net Pay</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let run of recentRuns\">\n <td>{{ run.periodName }}</td>\n <td>{{ run.payDate | date:'mediumDate' }}</td>\n <td>\n <span class=\"status-chip\" [style.background]=\"run.statusColor\">{{ run.statusName }}</span>\n </td>\n <td>{{ run.payslipCount }}</td>\n <td>{{ run.totalGrossPay | currency }}</td>\n <td>{{ run.totalNetPay | currency }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <spa-charts [config]=\"chartConfig\"></spa-charts>\n </div>\n `,\n styles: [`\n .dashboard-container { padding: 16px; }\n .dashboard-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: #333; font-weight: 500; }\n .runs-section { margin-top: 16px; }\n .section-title { display: flex; align-items: center; margin-bottom: 8px; color: #333; font-weight: 500; }\n .kpi-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n .kpi-table th { text-align: left; padding: 8px 12px; background: #f5f5f5; border-bottom: 2px solid #e0e0e0; font-weight: 500; }\n .kpi-table td { padding: 8px 12px; border-bottom: 1px solid #eee; }\n .kpi-table tr:hover { background: #fafafa; }\n .status-chip { padding: 2px 8px; border-radius: 12px; color: white; font-size: 11px; font-weight: 500; }\n `],\n standalone: false\n})\nexport class PayrollDashboardComponent implements OnInit {\n\n constructor(private dataService: DataServiceLib) { }\n\n recentRuns: any[] = [];\n\n // Changed: Summary tiles — payroll KPIs\n summaryTiles: TileConfig = {\n tiles: [\n { name: 'eligibleEmployees', alias: 'Eligible Employees', color: '#1565c0', icon: 'group', style: 'icon', info: 'Active employees with salary structures' },\n { name: 'lastPayrollNet', alias: 'Last Payroll (Net)', color: '#4caf50', icon: 'account_balance', style: 'icon', prefix: '$', info: 'Net pay of last completed run' },\n { name: 'pendingAdvances', alias: 'Pending Advances', color: '#f44336', icon: 'money_off', style: 'icon', info: 'Undeducted salary advances' },\n { name: 'overtimeMTD', alias: 'Overtime (MTD)', color: '#ff9800', icon: 'more_time', style: 'icon', prefix: '$', info: 'Total overtime this month' },\n { name: 'payrollRunsYTD', alias: 'Runs (YTD)', color: '#7b1fa2', icon: 'play_circle', style: 'icon', info: 'Payroll runs this year' },\n { name: 'totalPayrollCostYTD', alias: 'Payroll Cost (YTD)', color: '#00695c', icon: 'attach_money', style: 'icon', prefix: '$', info: 'Year-to-date gross payroll' },\n ],\n loadAction: { url: 'payrollruns/dashboard-summary/x' },\n loadInit: true\n };\n\n // Changed: Chart tiles — cost ratio gauge, trend sparkline, department pie, run status bar\n chartTiles: TileConfig = {\n tiles: [\n { name: 'payrollCostRatio', alias: 'Payroll Cost Ratio', color: '#ff9800', chart: { type: 'doughnut', gaugeColor: '#ff9800', height: 130, dataField: 'payrollCostRatio' }, footer: 'Payroll as % of expenses', footerIcon: 'info' },\n { name: 'payrollTrend', alias: 'Payroll Trend', color: '#2196f3', chart: { type: 'line', color: '#2196f3', height: 100, dataField: 'payrollTrend' }, footer: 'Last 12 months gross', footerIcon: 'timeline' },\n { name: 'departmentSplit', alias: 'By Department', color: '#4caf50', chart: { type: 'pie', colors: ['#2196f3', '#4caf50', '#ff9800', '#f44336', '#9c27b0'], height: 130, dataField: 'departmentSplit' }, footer: 'Employee distribution', footerIcon: 'pie_chart' },\n { name: 'runStatusSplit', alias: 'Run Status', color: '#9c27b0', chart: { type: 'bar', colors: ['#9e9e9e', '#2196f3', '#ff9800', '#4caf50'], height: 100, dataField: 'runStatusSplit' }, footer: 'All-time run status', footerIcon: 'bar_chart' },\n ],\n loadAction: { url: 'payrollruns/dashboard-chart-tiles/x' },\n loadInit: true\n };\n\n // Changed: Full charts — cost trend, department breakdown, earnings vs deductions, commission & overtime\n chartConfig: ChartConfig = {\n charts: [\n { name: 'payrollCostTrend', title: 'Payroll Cost Trend', type: 'line', height: '300px', showPoints: true, tension: 0.4, colors: ['#2196f3', '#4caf50', '#f44336'], showLegend: true },\n { name: 'departmentCosts', title: 'Cost by Department', type: 'bar', height: '300px', colors: ['#2196f3', '#4caf50', '#ff9800', '#f44336', '#9c27b0'] },\n { name: 'earningsVsDeductions', title: 'Earnings vs Deductions', type: 'doughnut', height: '300px', colors: ['#4caf50', '#f44336'] },\n { name: 'variablePayTrend', title: 'Commission & Overtime', type: 'bar', height: '300px', showLegend: true, colors: ['#9c27b0', '#ff9800'] },\n ],\n loadAction: { url: 'payrollruns/dashboard-charts/x' },\n loadInit: true,\n columns: 2\n };\n\n ngOnInit(): void {\n // Load recent payroll runs for sub-table\n this.dataService.CallApi({ url: 'payrollruns/dashboard-recent/x' }).subscribe((res: ApiResponse) => {\n if (res.success) this.recentRuns = res.data || [];\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { SalaryStructuresComponent } from '../../pages/payroll/salary-structures/salary-structures.component';\nimport { StatutoryDeductionsComponent } from '../../pages/payroll/statutory-deductions/statutory-deductions.component';\nimport { PayrollRunsComponent } from '../../pages/payroll/payroll-runs/payroll-runs.component';\nimport { CommissionConfigsComponent } from '../../pages/payroll/commission-configs/commission-configs.component';\nimport { CommissionEntriesComponent } from '../../pages/payroll/commission-entries/commission-entries.component';\nimport { CommissionStatementComponent } from '../../pages/payroll/commission-statement/commission-statement.component'; // Added (Phase 6)\nimport { SalaryAdvancesComponent } from '../../pages/payroll/salary-advances/salary-advances.component';\nimport { OvertimeEntriesComponent } from '../../pages/payroll/overtime-entries/overtime-entries.component';\nimport { PayrollDashboardComponent } from '../../pages/payroll/payroll-dashboard/payroll-dashboard.component';\n\nexport const PAYROLL_ROUTES: Routes = [\n { path: \"salary-structures\", component: SalaryStructuresComponent },\n { path: \"statutory-deductions\", component: StatutoryDeductionsComponent },\n { path: \"runs\", component: PayrollRunsComponent },\n { path: \"commission-configs\", component: CommissionConfigsComponent },\n { path: \"commission-entries\", component: CommissionEntriesComponent },\n { path: \"commission-statement\", component: CommissionStatementComponent, data: { capName: 'cap86' } }, // Added (Phase 6): cap86 — routed and registered, granted in no role template // Changed: added INERT capName — cap86 is capCommissionStatement, menu link exactly \"home/payroll/commission-statement\" (datalib.service.ts:276,278)\n { path: \"salary-advances\", component: SalaryAdvancesComponent },\n { path: \"overtime-entries\", component: OvertimeEntriesComponent },\n { path: \"dashboard\", component: PayrollDashboardComponent }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(PAYROLL_ROUTES)],\n exports: [RouterModule]\n})\nexport class PayrollRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { PayrollRoutingModule } from './payroll-routing.module'; // Added (S10-part-1): this domain is now reached by loadChildren, so it carries its own RouterModule.forChild table instead of contributing routes to the eager parent\nimport { CommonModule } from '@angular/common';\nimport { SpaAdminModule } from '../spa-admin.module';\nimport { SalaryStructuresComponent } from '../../pages/payroll/salary-structures/salary-structures.component';\nimport { StatutoryDeductionsComponent } from '../../pages/payroll/statutory-deductions/statutory-deductions.component';\nimport { PayrollRunsComponent } from '../../pages/payroll/payroll-runs/payroll-runs.component';\nimport { CommissionConfigsComponent } from '../../pages/payroll/commission-configs/commission-configs.component';\nimport { CommissionEntriesComponent } from '../../pages/payroll/commission-entries/commission-entries.component';\nimport { CommissionStatementComponent } from '../../pages/payroll/commission-statement/commission-statement.component'; // Added (Phase 6)\nimport { SalaryAdvancesComponent } from '../../pages/payroll/salary-advances/salary-advances.component';\nimport { OvertimeEntriesComponent } from '../../pages/payroll/overtime-entries/overtime-entries.component';\nimport { PayrollDashboardComponent } from '../../pages/payroll/payroll-dashboard/payroll-dashboard.component';\n\n@NgModule({\n declarations: [\n SalaryStructuresComponent,\n StatutoryDeductionsComponent,\n PayrollRunsComponent,\n CommissionConfigsComponent,\n CommissionEntriesComponent,\n CommissionStatementComponent,\n SalaryAdvancesComponent,\n OvertimeEntriesComponent,\n PayrollDashboardComponent\n ],\n imports: [\n PayrollRoutingModule,\n CommonModule,\n SpaAdminModule\n ]\n})\nexport class PayrollModule { }\n"],"names":["i1.PageComponent","i4","i5","i6","i1","i2","i3","i4.TilesComponent","i5.ChartsComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tin-spa-payroll.module-54Efumv_.mjs","sources":["../../../projects/tin-spa/src/lib/pages/payroll/salary-structures/salary-structures.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/statutory-deductions/statutory-deductions.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/payroll-runs/payroll-runs.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-configs/commission-configs.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-entries/commission-entries.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/commission-statement/commission-statement.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/salary-advances/salary-advances.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/overtime-entries/overtime-entries.component.ts","../../../projects/tin-spa/src/lib/pages/payroll/payroll-dashboard/payroll-dashboard.component.ts","../../../projects/tin-spa/src/lib/modules/payroll/payroll-routing.module.ts","../../../projects/tin-spa/src/lib/modules/payroll/payroll.module.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-salary-structures',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SalaryStructuresComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Salary Structures',\n tableConfig: this.payrollService.salaryStructuresTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-statutory-deductions',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class StatutoryDeductionsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Statutory Deductions',\n tableConfig: this.payrollService.statutoryDeductionTypesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-payroll-runs',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class PayrollRunsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Payroll Runs',\n tableConfig: this.payrollService.payrollRunsTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-commission-configs',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CommissionConfigsComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Commission Configs',\n tableConfig: this.payrollService.commissionConfigsTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-commission-entries',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class CommissionEntriesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Commission Entries',\n tableConfig: this.payrollService.commissionEntriesTableConfig\n };\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { ApiResponse } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core';\nimport { ConfigService } from 'tin-spa/core';\nimport { MessageService } from 'tin-spa/core';\n\n// Added (Phase 6): the Driver Commission Statement, and the only place the response-level warnings from\n// preview and generate reach a human. Phases 2-5 surfaced the ROW-level ones — a 0.00 entry, a rule scoped\n// to nobody — but a rule skipped because it expired, and an invoice excluded because a credit note settled\n// it rather than cash, live on the RESPONSE, and nothing rendered them. `execAction` on the table component\n// toasts apiResponse.message and drops apiResponse.data, so a Preview button bound to a table config would\n// have shown the one-line summary and silently discarded every named reason. Hence a page.\n@Component({\n selector: 'spa-commission-statement',\n template: `\n <div class=\"cs-container\">\n\n <h4 class=\"cs-title\"><mat-icon>receipt_long</mat-icon> Driver Commission Statement</h4>\n\n <!-- Period, and the two actions. Preview and Generate render only where trip commission is switched on,\n which in practice means Shift — every other app gets the statement without the generator. -->\n <div class=\"cs-bar\">\n <div class=\"cs-period\">\n <mat-form-field appearance=\"outline\" class=\"cs-year\">\n <mat-label>Year</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"periodYear\" (change)=\"clearResults()\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"cs-month\">\n <mat-label>Month</mat-label>\n <mat-select [(ngModel)]=\"periodMonth\" (selectionChange)=\"clearResults()\">\n <mat-option *ngFor=\"let m of months\" [value]=\"m.value\">{{ m.name }}</mat-option>\n </mat-select>\n </mat-form-field>\n <button mat-stroked-button color=\"primary\" (click)=\"loadStatement()\" [disabled]=\"busy\">Show Statement</button>\n </div>\n\n <div class=\"cs-actions\" *ngIf=\"tripCommissionEnabled\">\n <button mat-stroked-button (click)=\"preview()\" [disabled]=\"busy\"><mat-icon>visibility</mat-icon> Preview (writes nothing)</button>\n <button mat-flat-button color=\"primary\" (click)=\"generate()\" [disabled]=\"busy\"><mat-icon>playlist_add</mat-icon> Generate from Trips</button>\n </div>\n </div>\n\n <div class=\"alert alert-secondary cs-note\" *ngIf=\"!tripCommissionEnabled\">\n Commission is not generated from trips in this app, so this page reports what has been recorded rather than\n proposing anything new.\n </div>\n\n <!-- ============ PREVIEW RESULT — the whole point of this page ============ -->\n <div class=\"cs-panel\" *ngIf=\"previewResult\">\n <div class=\"alert alert-info cs-headline\">\n <strong>Preview only — nothing was written.</strong>\n {{ previewResult.entries?.length || 0 }} {{ (previewResult.entries?.length === 1) ? 'entry' : 'entries' }}\n totalling {{ previewTotal | number:'1.2-2' }} for {{ previewResult.periodName || periodLabel() }}.\n Generating turns these into <strong>Draft</strong> entries, which still have to be approved before payroll can pay them.\n </div>\n\n <!-- Response-level warnings: the ones that were invisible until now -->\n <div class=\"alert alert-warning\" *ngIf=\"previewResult.warnings?.length\">\n <strong>{{ previewResult.warnings.length }} warning{{ previewResult.warnings.length === 1 ? '' : 's' }} about this period</strong>\n <ul class=\"cs-list\"><li *ngFor=\"let w of previewResult.warnings\">{{ w }}</li></ul>\n </div>\n\n <!-- Skipped rules, each with the reason the evaluator refused it -->\n <div class=\"alert alert-danger\" *ngIf=\"previewResult.skippedRules?.length\">\n <strong>{{ previewResult.skippedRules.length }} rule{{ previewResult.skippedRules.length === 1 ? '' : 's' }} paid nobody</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let s of previewResult.skippedRules\"><strong>{{ s.configName }}</strong> — {{ s.reason }}</li>\n </ul>\n </div>\n\n <table class=\"cs-table\" *ngIf=\"previewResult.entries?.length\">\n <thead>\n <tr>\n <th>Employee</th><th>Rule</th><th>Basis</th><th>Earned When</th>\n <th class=\"cs-num\">Measured</th><th class=\"cs-num\">Rate</th><th class=\"cs-num\">Raw</th><th class=\"cs-num\">Would Pay</th><th>Notes</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of previewResult.entries\">\n <td>{{ e.employeeName }}</td>\n <td>{{ e.configName }}</td>\n <td>{{ e.basisName }}</td>\n <td>{{ e.earnEventName }}</td>\n <td class=\"cs-num\">{{ e.metricValue | number:'1.0-2' }}</td>\n <td class=\"cs-num\">{{ e.rate | number:'1.0-4' }}</td>\n <td class=\"cs-num\">{{ e.rawAmount | number:'1.2-2' }}</td>\n <td class=\"cs-num cs-strong\" [class.cs-zero]=\"e.commissionAmount === 0\">{{ e.commissionAmount | number:'1.2-2' }}</td>\n <td class=\"cs-notes\">\n <span class=\"cs-flag\" *ngIf=\"e.usedTiers\">tiered</span>\n <span class=\"cs-flag\" *ngIf=\"e.minimumApplied\">floor applied</span>\n <span class=\"cs-flag\" *ngIf=\"e.maximumApplied\">cap applied</span>\n <span class=\"cs-warn\" *ngFor=\"let w of e.warnings\">{{ w }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- ============ GENERATE RESULT ============ -->\n <div class=\"cs-panel\" *ngIf=\"generateResult\">\n <div class=\"alert alert-success cs-headline\">\n <strong>{{ generateResult.entriesCreated }} Draft entr{{ generateResult.entriesCreated === 1 ? 'y' : 'ies' }}</strong>\n created from {{ generateResult.linesCreated }} source line{{ generateResult.linesCreated === 1 ? '' : 's' }},\n totalling {{ generateResult.totalAmount | number:'1.2-2' }} for {{ generateResult.periodName || periodLabel() }}.\n Draft entries do <strong>not</strong> reach a payslip until they are approved.\n </div>\n\n <!-- What a regeneration MOVED. These three are the ones nobody must discover from a payslip. -->\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.draftEntriesReplaced || generateResult.approvedEntriesNeutralised || generateResult.paidEntriesReversed\">\n <ul class=\"cs-list\">\n <li *ngIf=\"generateResult.draftEntriesReplaced\">{{ generateResult.draftEntriesReplaced }} previous draft entr{{ generateResult.draftEntriesReplaced === 1 ? 'y was' : 'ies were' }} replaced.</li>\n <li *ngIf=\"generateResult.approvedEntriesNeutralised\"><strong>{{ generateResult.approvedEntriesNeutralised }} already-approved entr{{ generateResult.approvedEntriesNeutralised === 1 ? 'y was' : 'ies were' }} reversed and must be approved again.</strong></li>\n <li *ngIf=\"generateResult.paidEntriesReversed\"><strong>{{ generateResult.paidEntriesReversed }} already-paid entr{{ generateResult.paidEntriesReversed === 1 ? 'y' : 'ies' }} raised a negative clawback awaiting approval.</strong> The original payment stands.</li>\n </ul>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.entriesWithWarnings?.length\">\n <strong>{{ generateResult.entriesWithWarnings.length }} entr{{ generateResult.entriesWithWarnings.length === 1 ? 'y needs' : 'ies need' }} attention before approval</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let e of generateResult.entriesWithWarnings\">\n <strong>{{ e.employeeName }}</strong> — {{ e.configName }} — {{ e.commissionAmount | number:'1.2-2' }}\n <span *ngFor=\"let w of e.warnings\" class=\"cs-warn\">{{ w }}</span>\n </li>\n </ul>\n </div>\n\n <div class=\"alert alert-warning\" *ngIf=\"generateResult.warnings?.length\">\n <ul class=\"cs-list\"><li *ngFor=\"let w of generateResult.warnings\">{{ w }}</li></ul>\n </div>\n\n <div class=\"alert alert-danger\" *ngIf=\"generateResult.skippedRules?.length\">\n <strong>{{ generateResult.skippedRules.length }} rule{{ generateResult.skippedRules.length === 1 ? '' : 's' }} paid nobody</strong>\n <ul class=\"cs-list\">\n <li *ngFor=\"let s of generateResult.skippedRules\"><strong>{{ s.configName }}</strong> — {{ s.reason }}</li>\n </ul>\n </div>\n </div>\n\n <!-- ============ THE STATEMENT ITSELF ============ -->\n <div class=\"cs-panel\" *ngIf=\"statementLoaded\">\n <h5 class=\"cs-section\">Recorded for {{ periodLabel() }}</h5>\n\n <div class=\"cs-totals\">\n <div class=\"cs-total\"><span class=\"cs-total-label\">Proposed (Draft)</span><span class=\"cs-total-value cs-draft\">{{ totals.draft | number:'1.2-2' }}</span><span class=\"cs-total-note\">not payable until approved</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Payable (Approved)</span><span class=\"cs-total-value cs-approved\">{{ totals.approved | number:'1.2-2' }}</span><span class=\"cs-total-note\">will be picked up by a payroll run</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Settled (Paid)</span><span class=\"cs-total-value\">{{ totals.paid | number:'1.2-2' }}</span><span class=\"cs-total-note\">already on a payslip line</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Reversed</span><span class=\"cs-total-value cs-reversed\">{{ totals.reversed | number:'1.2-2' }}</span><span class=\"cs-total-note\">clawbacks against earlier entries</span></div>\n <div class=\"cs-total\"><span class=\"cs-total-label\">Carried forward in</span><span class=\"cs-total-value\">{{ totals.carried | number:'1.2-2' }}</span><span class=\"cs-total-note\">earned in an earlier period</span></div>\n </div>\n\n <div class=\"alert alert-secondary cs-note\" *ngIf=\"!entries.length\">\n Nothing has been recorded for this period yet.\n </div>\n\n <table class=\"cs-table\" *ngIf=\"entries.length\">\n <thead>\n <tr><th>Employee</th><th>Description</th><th>Source</th><th class=\"cs-num\">Measured</th><th class=\"cs-num\">Amount</th><th>Status</th><th>Paid</th><th>Lines</th></tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of entries\">\n <td>{{ e.employeeName }}</td>\n <td>\n {{ e.description }}\n <span class=\"cs-flag\" *ngIf=\"e.isCarriedForward\">from {{ e.originPeriodMonth }}/{{ e.originPeriodYear }}</span>\n <span class=\"cs-flag cs-flag-warn\" *ngIf=\"e.isReversal\">reverses #{{ e.reversesCommissionEntryID }}</span>\n </td>\n <td>{{ e.sourceType }}</td>\n <td class=\"cs-num\">{{ e.metricValue | number:'1.0-2' }}</td>\n <td class=\"cs-num cs-strong\" [class.cs-negative]=\"e.commissionAmount < 0\">{{ e.commissionAmount | number:'1.2-2' }}</td>\n <td><span [ngClass]=\"statusClass(e)\">{{ e.statusName }}</span></td>\n <td>{{ e.isPaid ? 'Yes' : '' }}</td>\n <td>{{ e.lineCount }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n </div>\n `,\n styles: [`\n .cs-container { padding: 16px; }\n .cs-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: #333; font-weight: 500; }\n .cs-bar { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; justify-content: space-between; margin-bottom: 8px; }\n .cs-period { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }\n .cs-actions { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }\n .cs-year { width: 110px; }\n .cs-month { width: 160px; }\n .cs-note { font-size: 14px; }\n .cs-panel { margin-top: 8px; }\n .cs-headline { font-size: 14px; }\n .cs-section { color: #333; font-weight: 500; margin: 16px 0 8px; }\n .cs-list { margin: 6px 0 0; padding-left: 20px; }\n .cs-list li { margin-bottom: 3px; }\n .cs-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n .cs-table th { text-align: left; padding: 8px 12px; background: #f5f5f5; border-bottom: 2px solid #e0e0e0; font-weight: 500; white-space: nowrap; }\n .cs-table td { padding: 8px 12px; border-bottom: 1px solid #eee; vertical-align: top; }\n .cs-table tr:hover { background: #fafafa; }\n .cs-num { text-align: right; white-space: nowrap; }\n .cs-strong { font-weight: 600; }\n .cs-zero { color: #e65100; }\n .cs-negative { color: #c62828; }\n .cs-notes { max-width: 320px; }\n .cs-flag { display: inline-block; margin: 1px 4px 1px 0; padding: 1px 7px; border-radius: 10px; background: #eceff1; color: #455a64; font-size: 11px; white-space: nowrap; }\n .cs-flag-warn { background: #fff3cd; color: #664d03; }\n .cs-warn { display: block; color: #664d03; font-size: 12px; margin-top: 2px; }\n .cs-totals { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 12px; }\n .cs-total { display: flex; flex-direction: column; min-width: 170px; flex: 1 1 170px; padding: 10px 14px; border: 1px solid #e0e0e0; border-radius: 6px; background: #fff; }\n .cs-total-label { font-size: 12px; color: #607d8b; }\n .cs-total-value { font-size: 20px; font-weight: 600; }\n .cs-total-note { font-size: 11px; color: #90a4ae; }\n .cs-draft { color: #757575; }\n .cs-approved { color: #2e7d32; }\n .cs-reversed { color: #c62828; }\n .cs-status-draft { color: #757575; }\n .cs-status-approved { color: #2e7d32; font-weight: 600; }\n .cs-status-reversed { color: #c62828; }\n\n /* Phones: the two control groups stop competing for one row and the wide tables scroll inside\n themselves rather than pushing the page sideways. */\n @media (max-width: 700px) {\n .cs-bar { flex-direction: column; align-items: stretch; }\n .cs-actions button { flex: 1 1 auto; }\n .cs-panel { overflow-x: auto; }\n .cs-notes { max-width: none; }\n }\n `],\n standalone: false\n})\nexport class CommissionStatementComponent implements OnInit {\n\n private dataService = inject(DataServiceLib);\n private configService = inject(ConfigService);\n private messageService = inject(MessageService);\n\n months = [\n { value: 1, name: 'January' }, { value: 2, name: 'February' }, { value: 3, name: 'March' },\n { value: 4, name: 'April' }, { value: 5, name: 'May' }, { value: 6, name: 'June' },\n { value: 7, name: 'July' }, { value: 8, name: 'August' }, { value: 9, name: 'September' },\n { value: 10, name: 'October' }, { value: 11, name: 'November' }, { value: 12, name: 'December' },\n ];\n\n periodYear = new Date().getFullYear();\n periodMonth = new Date().getMonth() + 1;\n\n busy = false;\n previewResult: any = null;\n generateResult: any = null;\n entries: any[] = [];\n statementLoaded = false;\n totals = { draft: 0, approved: 0, paid: 0, reversed: 0, carried: 0 };\n\n // Reads the one shared App Configuration record. An app whose configuration has no EnableTripCommission\n // property simply gets undefined, so the generator hides — this fails CLOSED on purpose, matching the\n // server's own late-bound read of the flag. A button that offers to write commission in an app that does\n // not generate it is worse than no button.\n tripCommissionEnabled = false;\n\n ngOnInit(): void {\n this.tripCommissionEnabled = !!this.configService.value?.enableTripCommission;\n this.configService.config$.subscribe((config: any) => {\n this.tripCommissionEnabled = !!config?.enableTripCommission;\n });\n this.loadStatement();\n }\n\n periodLabel(): string {\n return `${this.months.find(m => m.value === this.periodMonth)?.name ?? this.periodMonth} ${this.periodYear}`;\n }\n\n get previewTotal(): number {\n return (this.previewResult?.entries || []).reduce((sum: number, e: any) => sum + (e.commissionAmount || 0), 0);\n }\n\n statusClass(entry: any): string {\n if (entry?.status === 1) return 'cs-status-draft';\n if (entry?.status === 2) return 'cs-status-approved';\n if (entry?.status === 4) return 'cs-status-reversed';\n return '';\n }\n\n // Changing the period invalidates both result panels — leaving July's preview on screen above August's\n // statement is how someone approves the wrong month.\n clearResults() {\n this.previewResult = null;\n this.generateResult = null;\n this.statementLoaded = false;\n }\n\n loadStatement() {\n if (!this.validPeriod()) return;\n\n this.busy = true;\n this.dataService.CallApi({ url: `commissionentries/period/${this.periodYear}-${this.periodMonth}` }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Could not load the statement'); return; }\n this.entries = res.data || [];\n this.statementLoaded = true;\n this.recalculateTotals();\n },\n error: () => { this.busy = false; }\n });\n }\n\n // Draft, Approved, Paid and Reversed are summed separately and never rolled into one figure. A single\n // \"total commission\" would read as owed when most of it is a proposal nobody has approved.\n private recalculateTotals() {\n this.totals = { draft: 0, approved: 0, paid: 0, reversed: 0, carried: 0 };\n\n for (const e of this.entries) {\n const amount = e.commissionAmount || 0;\n if (e.isPaid || e.status === 3) this.totals.paid += amount;\n else if (e.status === 2) this.totals.approved += amount;\n else if (e.status === 4) this.totals.reversed += amount;\n else this.totals.draft += amount;\n\n if (e.isCarriedForward) this.totals.carried += amount;\n }\n }\n\n // PREVIEW WRITES NOTHING. It is gated on cap77 VIEW server-side for exactly that reason, and the result\n // panel repeats it — a figure on screen that looks committed is the failure this button exists to avoid.\n preview() {\n if (!this.validPeriod()) return;\n\n this.busy = true;\n this.generateResult = null;\n this.dataService.CallApi({ url: 'shiftcommission/preview', method: 'post' }, { periodYear: this.periodYear, periodMonth: this.periodMonth }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Preview failed'); return; }\n this.previewResult = res.data || {};\n },\n error: () => { this.busy = false; }\n });\n }\n\n // GENERATE WRITES. Every entry lands as Draft, so nothing here can pay anybody without a separate\n // approval — the confirm says so rather than leaving it to be discovered.\n generate() {\n if (!this.validPeriod()) return;\n\n this.messageService.confirm(`Generate commission entries for ${this.periodLabel()}? They are created as Draft and still have to be approved before a payroll run can pay them. Regenerating a period reverses entries that were already approved or paid.`)\n .subscribe((answer: any) => {\n if (answer !== 'yes') return;\n\n this.busy = true;\n this.previewResult = null;\n this.dataService.CallApi({ url: 'shiftcommission/generate', method: 'post' }, { periodYear: this.periodYear, periodMonth: this.periodMonth }).subscribe({\n next: (res: ApiResponse) => {\n this.busy = false;\n if (!res.success) { this.messageService.toast(res.message || 'Generation failed'); return; }\n this.generateResult = res.data || {};\n this.loadStatement(); // the statement below must agree with what was just written\n },\n error: () => { this.busy = false; }\n });\n });\n }\n\n private validPeriod(): boolean {\n if (!this.periodMonth || this.periodMonth < 1 || this.periodMonth > 12) { this.messageService.toast('Choose a month'); return false; }\n if (!this.periodYear || this.periodYear < 2000 || this.periodYear > 2100) { this.messageService.toast('Year must be between 2000 and 2100'); return false; }\n return true;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-salary-advances',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class SalaryAdvancesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Salary Advances',\n tableConfig: this.payrollService.salaryAdvancesTableConfig\n };\n}\n","import { Component, inject } from '@angular/core';\nimport { PayrollService } from 'tin-spa/core';\nimport { PageConfig } from 'tin-spa/core';\n\n@Component({\n selector: 'spa-overtime-entries',\n standalone: false,\n template: '<spa-page [config]=\"pageConfig\"></spa-page>'\n})\nexport class OvertimeEntriesComponent {\n private payrollService = inject(PayrollService);\n\n pageConfig: PageConfig = {\n title: 'Overtime Entries',\n tableConfig: this.payrollService.overtimeEntriesTableConfig\n };\n}\n","import { Component, OnInit } from '@angular/core';\nimport { TileConfig, ChartConfig, ApiResponse } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core';\n\n// Payroll module dashboard with cost tracking, department analysis, and employee metrics\n@Component({\n selector: 'spa-payroll-dashboard',\n template: `\n <div class=\"dashboard-container\">\n <h4 class=\"dashboard-title\"><mat-icon>payments</mat-icon> Payroll Dashboard</h4>\n <spa-tiles [config]=\"summaryTiles\"></spa-tiles>\n <div style=\"margin-top: 16px;\"></div>\n <spa-tiles [config]=\"chartTiles\"></spa-tiles>\n\n <!-- Recent Payroll Runs sub-table -->\n <div *ngIf=\"recentRuns.length > 0\" class=\"runs-section\">\n <h5 class=\"section-title\">\n <mat-icon style=\"vertical-align: middle; margin-right: 4px;\">play_circle</mat-icon>\n Recent Payroll Runs\n </h5>\n <table class=\"kpi-table\">\n <thead>\n <tr>\n <th>Period</th>\n <th>Pay Date</th>\n <th>Status</th>\n <th>Employees</th>\n <th>Gross Pay</th>\n <th>Net Pay</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let run of recentRuns\">\n <td>{{ run.periodName }}</td>\n <td>{{ run.payDate | date:'mediumDate' }}</td>\n <td>\n <span class=\"status-chip\" [style.background]=\"run.statusColor\">{{ run.statusName }}</span>\n </td>\n <td>{{ run.payslipCount }}</td>\n <td>{{ run.totalGrossPay | currency }}</td>\n <td>{{ run.totalNetPay | currency }}</td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <spa-charts [config]=\"chartConfig\"></spa-charts>\n </div>\n `,\n styles: [`\n .dashboard-container { padding: 16px; }\n .dashboard-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: #333; font-weight: 500; }\n .runs-section { margin-top: 16px; }\n .section-title { display: flex; align-items: center; margin-bottom: 8px; color: #333; font-weight: 500; }\n .kpi-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n .kpi-table th { text-align: left; padding: 8px 12px; background: #f5f5f5; border-bottom: 2px solid #e0e0e0; font-weight: 500; }\n .kpi-table td { padding: 8px 12px; border-bottom: 1px solid #eee; }\n .kpi-table tr:hover { background: #fafafa; }\n .status-chip { padding: 2px 8px; border-radius: 12px; color: white; font-size: 11px; font-weight: 500; }\n `],\n standalone: false\n})\nexport class PayrollDashboardComponent implements OnInit {\n\n constructor(private dataService: DataServiceLib) { }\n\n recentRuns: any[] = [];\n\n // Changed: Summary tiles — payroll KPIs\n summaryTiles: TileConfig = {\n tiles: [\n { name: 'eligibleEmployees', alias: 'Eligible Employees', color: '#1565c0', icon: 'group', style: 'icon', info: 'Active employees with salary structures' },\n { name: 'lastPayrollNet', alias: 'Last Payroll (Net)', color: '#4caf50', icon: 'account_balance', style: 'icon', prefix: '$', info: 'Net pay of last completed run' },\n { name: 'pendingAdvances', alias: 'Pending Advances', color: '#f44336', icon: 'money_off', style: 'icon', info: 'Undeducted salary advances' },\n { name: 'overtimeMTD', alias: 'Overtime (MTD)', color: '#ff9800', icon: 'more_time', style: 'icon', prefix: '$', info: 'Total overtime this month' },\n { name: 'payrollRunsYTD', alias: 'Runs (YTD)', color: '#7b1fa2', icon: 'play_circle', style: 'icon', info: 'Payroll runs this year' },\n { name: 'totalPayrollCostYTD', alias: 'Payroll Cost (YTD)', color: '#00695c', icon: 'attach_money', style: 'icon', prefix: '$', info: 'Year-to-date gross payroll' },\n ],\n loadAction: { url: 'payrollruns/dashboard-summary/x' },\n loadInit: true,\n security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72 (datalib.service.ts:260) — a single-module dashboard, so the gate sits on the whole config\n };\n\n // Changed: Chart tiles — cost ratio gauge, trend sparkline, department pie, run status bar\n chartTiles: TileConfig = {\n tiles: [\n { name: 'payrollCostRatio', alias: 'Payroll Cost Ratio', color: '#ff9800', chart: { type: 'doughnut', gaugeColor: '#ff9800', height: 130, dataField: 'payrollCostRatio' }, footer: 'Payroll as % of expenses', footerIcon: 'info' },\n { name: 'payrollTrend', alias: 'Payroll Trend', color: '#2196f3', chart: { type: 'line', color: '#2196f3', height: 100, dataField: 'payrollTrend' }, footer: 'Last 12 months gross', footerIcon: 'timeline' },\n { name: 'departmentSplit', alias: 'By Department', color: '#4caf50', chart: { type: 'pie', colors: ['#2196f3', '#4caf50', '#ff9800', '#f44336', '#9c27b0'], height: 130, dataField: 'departmentSplit' }, footer: 'Employee distribution', footerIcon: 'pie_chart' },\n { name: 'runStatusSplit', alias: 'Run Status', color: '#9c27b0', chart: { type: 'bar', colors: ['#9e9e9e', '#2196f3', '#ff9800', '#4caf50'], height: 100, dataField: 'runStatusSplit' }, footer: 'All-time run status', footerIcon: 'bar_chart' },\n ],\n loadAction: { url: 'payrollruns/dashboard-chart-tiles/x' },\n loadInit: true,\n security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72\n };\n\n // Changed: Full charts — cost trend, department breakdown, earnings vs deductions, commission & overtime\n chartConfig: ChartConfig = {\n charts: [\n { name: 'payrollCostTrend', title: 'Payroll Cost Trend', type: 'line', height: '300px', showPoints: true, tension: 0.4, colors: ['#2196f3', '#4caf50', '#f44336'], showLegend: true },\n { name: 'departmentCosts', title: 'Cost by Department', type: 'bar', height: '300px', colors: ['#2196f3', '#4caf50', '#ff9800', '#f44336', '#9c27b0'] },\n { name: 'earningsVsDeductions', title: 'Earnings vs Deductions', type: 'doughnut', height: '300px', colors: ['#4caf50', '#f44336'] },\n { name: 'variablePayTrend', title: 'Commission & Overtime', type: 'bar', height: '300px', showLegend: true, colors: ['#9c27b0', '#ff9800'] },\n ],\n loadAction: { url: 'payrollruns/dashboard-charts/x' },\n loadInit: true,\n columns: 2,\n security: { allow: [this.dataService.capPayrollDashboard] } // Added (dashboard-alignment 1-D.3): cap72\n };\n\n ngOnInit(): void {\n // Load recent payroll runs for sub-table\n this.dataService.CallApi({ url: 'payrollruns/dashboard-recent/x' }).subscribe((res: ApiResponse) => {\n if (res.success) this.recentRuns = res.data || [];\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { SalaryStructuresComponent } from '../../pages/payroll/salary-structures/salary-structures.component';\nimport { StatutoryDeductionsComponent } from '../../pages/payroll/statutory-deductions/statutory-deductions.component';\nimport { PayrollRunsComponent } from '../../pages/payroll/payroll-runs/payroll-runs.component';\nimport { CommissionConfigsComponent } from '../../pages/payroll/commission-configs/commission-configs.component';\nimport { CommissionEntriesComponent } from '../../pages/payroll/commission-entries/commission-entries.component';\nimport { CommissionStatementComponent } from '../../pages/payroll/commission-statement/commission-statement.component'; // Added (Phase 6)\nimport { SalaryAdvancesComponent } from '../../pages/payroll/salary-advances/salary-advances.component';\nimport { OvertimeEntriesComponent } from '../../pages/payroll/overtime-entries/overtime-entries.component';\nimport { PayrollDashboardComponent } from '../../pages/payroll/payroll-dashboard/payroll-dashboard.component';\n\nexport const PAYROLL_ROUTES: Routes = [\n { path: \"salary-structures\", component: SalaryStructuresComponent },\n { path: \"statutory-deductions\", component: StatutoryDeductionsComponent },\n { path: \"runs\", component: PayrollRunsComponent },\n { path: \"commission-configs\", component: CommissionConfigsComponent },\n { path: \"commission-entries\", component: CommissionEntriesComponent },\n { path: \"commission-statement\", component: CommissionStatementComponent, data: { capName: 'cap86' } }, // Added (Phase 6): cap86 — routed and registered, granted in no role template // Changed: added INERT capName — cap86 is capCommissionStatement, menu link exactly \"home/payroll/commission-statement\" (datalib.service.ts:276,278)\n { path: \"salary-advances\", component: SalaryAdvancesComponent },\n { path: \"overtime-entries\", component: OvertimeEntriesComponent },\n { path: \"dashboard\", component: PayrollDashboardComponent }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(PAYROLL_ROUTES)],\n exports: [RouterModule]\n})\nexport class PayrollRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { PayrollRoutingModule } from './payroll-routing.module'; // Added (S10-part-1): this domain is now reached by loadChildren, so it carries its own RouterModule.forChild table instead of contributing routes to the eager parent\nimport { CommonModule } from '@angular/common';\nimport { SpaAdminModule } from '../spa-admin.module';\nimport { SalaryStructuresComponent } from '../../pages/payroll/salary-structures/salary-structures.component';\nimport { StatutoryDeductionsComponent } from '../../pages/payroll/statutory-deductions/statutory-deductions.component';\nimport { PayrollRunsComponent } from '../../pages/payroll/payroll-runs/payroll-runs.component';\nimport { CommissionConfigsComponent } from '../../pages/payroll/commission-configs/commission-configs.component';\nimport { CommissionEntriesComponent } from '../../pages/payroll/commission-entries/commission-entries.component';\nimport { CommissionStatementComponent } from '../../pages/payroll/commission-statement/commission-statement.component'; // Added (Phase 6)\nimport { SalaryAdvancesComponent } from '../../pages/payroll/salary-advances/salary-advances.component';\nimport { OvertimeEntriesComponent } from '../../pages/payroll/overtime-entries/overtime-entries.component';\nimport { PayrollDashboardComponent } from '../../pages/payroll/payroll-dashboard/payroll-dashboard.component';\n\n@NgModule({\n declarations: [\n SalaryStructuresComponent,\n StatutoryDeductionsComponent,\n PayrollRunsComponent,\n CommissionConfigsComponent,\n CommissionEntriesComponent,\n CommissionStatementComponent,\n SalaryAdvancesComponent,\n OvertimeEntriesComponent,\n PayrollDashboardComponent\n ],\n imports: [\n PayrollRoutingModule,\n CommonModule,\n SpaAdminModule\n ]\n})\nexport class PayrollModule { }\n"],"names":["i1.PageComponent","i4","i5","i6","i1","i2","i3","i4.TilesComponent","i5.ChartsComponent"],"mappings":"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"}
|
package/fesm2022/{tin-spa-purchasing.module-NCdwquaF.mjs → tin-spa-purchasing.module-Bq8JnsyM.mjs}
RENAMED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Component, NgModule } from '@angular/core';
|
|
3
|
-
import * as i1 from '@angular/router';
|
|
3
|
+
import * as i1$1 from '@angular/router';
|
|
4
4
|
import { RouterModule } from '@angular/router';
|
|
5
|
+
import * as i1 from 'tin-spa/core';
|
|
5
6
|
import { PurchasingService } from 'tin-spa/core';
|
|
6
|
-
import { P as PageComponent, T as TilesComponent, C as ChartsComponent, e as SpaAdminModule } from './tin-spa-tin-spa-
|
|
7
|
+
import { P as PageComponent, T as TilesComponent, C as ChartsComponent, e as SpaAdminModule } from './tin-spa-tin-spa-BMy59BVn.mjs';
|
|
7
8
|
import * as i3 from '@angular/material/icon';
|
|
8
9
|
import { CommonModule } from '@angular/common';
|
|
9
10
|
|
|
@@ -52,7 +53,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
|
|
|
52
53
|
|
|
53
54
|
// Purchasing module dashboard with procurement tracking
|
|
54
55
|
class PurchasingDashboardComponent {
|
|
55
|
-
constructor() {
|
|
56
|
+
constructor(dataService) {
|
|
57
|
+
this.dataService = dataService;
|
|
56
58
|
this.summaryTiles = {
|
|
57
59
|
tiles: [
|
|
58
60
|
{ name: 'totalPurchases', alias: 'Purchases (MTD)', color: '#2196f3', icon: 'shopping_bag', style: 'icon', info: 'Total purchase amount this month' },
|
|
@@ -62,7 +64,8 @@ class PurchasingDashboardComponent {
|
|
|
62
64
|
{ name: 'purchasesThisMonth', alias: 'Purchases (MTD)', color: '#4caf50', icon: 'receipt', style: 'icon', info: 'Purchases processed this month' }, // Changed: receiptsThisMonth → purchasesThisMonth
|
|
63
65
|
],
|
|
64
66
|
loadAction: { url: 'purchases/dashboard-summary/x' }, // Changed: inventoryreceipts → purchases
|
|
65
|
-
loadInit: true
|
|
67
|
+
loadInit: true,
|
|
68
|
+
security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62 (datalib.service.ts:592) — a single-module dashboard, so the gate sits on the whole config
|
|
66
69
|
};
|
|
67
70
|
// Changed: Chart-style tiles now use loadAction with dataField for dynamic data
|
|
68
71
|
this.chartTiles = {
|
|
@@ -72,7 +75,8 @@ class PurchasingDashboardComponent {
|
|
|
72
75
|
{ name: 'poStatusSplit', alias: 'PO Status', color: '#ff9800', chart: { type: 'doughnut', colors: ['#9e9e9e', '#2196f3', '#4caf50', '#f44336'], height: 130, dataField: 'poStatusSplit' }, footer: 'Current distribution', footerIcon: 'assignment' }, // Changed: dataField replaces inline data
|
|
73
76
|
],
|
|
74
77
|
loadAction: { url: 'purchases/dashboard-chart-tiles/x' }, // Changed: inventoryreceipts → purchases
|
|
75
|
-
loadInit: true
|
|
78
|
+
loadInit: true,
|
|
79
|
+
security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62
|
|
76
80
|
};
|
|
77
81
|
this.chartConfig = {
|
|
78
82
|
charts: [
|
|
@@ -83,10 +87,11 @@ class PurchasingDashboardComponent {
|
|
|
83
87
|
],
|
|
84
88
|
loadAction: { url: 'purchases/dashboard-charts/x' }, // Changed: inventoryreceipts → purchases
|
|
85
89
|
loadInit: true,
|
|
86
|
-
columns: 2
|
|
90
|
+
columns: 2,
|
|
91
|
+
security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62
|
|
87
92
|
};
|
|
88
93
|
}
|
|
89
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingDashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
94
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingDashboardComponent, deps: [{ token: i1.DataServiceLib }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
90
95
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PurchasingDashboardComponent, isStandalone: false, selector: "spa-purchasing-dashboard", ngImport: i0, template: `
|
|
91
96
|
<div class="dashboard-container">
|
|
92
97
|
<h4 class="dashboard-title"><mat-icon>local_shipping</mat-icon> Purchasing Dashboard</h4>
|
|
@@ -96,7 +101,7 @@ class PurchasingDashboardComponent {
|
|
|
96
101
|
<spa-tiles [config]="chartTiles"></spa-tiles>
|
|
97
102
|
<spa-charts [config]="chartConfig"></spa-charts>
|
|
98
103
|
</div>
|
|
99
|
-
`, isInline: true, styles: [".dashboard-container{padding:16px}.dashboard-title{display:flex;align-items:center;gap:8px;margin-bottom:16px;color:#333;font-weight:500}\n"], dependencies: [{ kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "tileClick", "tileUnClick"] }, { kind: "component", type: ChartsComponent, selector: "spa-charts", inputs: ["config", "data", "reload"] }] }); }
|
|
104
|
+
`, isInline: true, styles: [".dashboard-container{padding:16px}.dashboard-title{display:flex;align-items:center;gap:8px;margin-bottom:16px;color:#333;font-weight:500}\n"], dependencies: [{ kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TilesComponent, selector: "spa-tiles", inputs: ["config", "lastSearch", "data", "reload"], outputs: ["tileActionSelected", "contentResolved", "tileClick", "tileUnClick"] }, { kind: "component", type: ChartsComponent, selector: "spa-charts", inputs: ["config", "data", "reload"], outputs: ["contentResolved"] }] }); }
|
|
100
105
|
}
|
|
101
106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingDashboardComponent, decorators: [{
|
|
102
107
|
type: Component,
|
|
@@ -110,7 +115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
|
|
|
110
115
|
<spa-charts [config]="chartConfig"></spa-charts>
|
|
111
116
|
</div>
|
|
112
117
|
`, standalone: false, styles: [".dashboard-container{padding:16px}.dashboard-title{display:flex;align-items:center;gap:8px;margin-bottom:16px;color:#333;font-weight:500}\n"] }]
|
|
113
|
-
}] });
|
|
118
|
+
}], ctorParameters: () => [{ type: i1.DataServiceLib }] });
|
|
114
119
|
|
|
115
120
|
const PURCHASING_ROUTES = [
|
|
116
121
|
{ path: "orders", component: SupplierPurchaseOrdersComponent },
|
|
@@ -119,7 +124,7 @@ const PURCHASING_ROUTES = [
|
|
|
119
124
|
];
|
|
120
125
|
class PurchasingRoutingModule {
|
|
121
126
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingRoutingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
122
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: PurchasingRoutingModule, imports: [i1.RouterModule], exports: [RouterModule] }); }
|
|
127
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: PurchasingRoutingModule, imports: [i1$1.RouterModule], exports: [RouterModule] }); }
|
|
123
128
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingRoutingModule, imports: [RouterModule.forChild(PURCHASING_ROUTES), RouterModule] }); }
|
|
124
129
|
}
|
|
125
130
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PurchasingRoutingModule, decorators: [{
|
|
@@ -158,4 +163,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
|
|
|
158
163
|
}] });
|
|
159
164
|
|
|
160
165
|
export { PurchasingModule };
|
|
161
|
-
//# sourceMappingURL=tin-spa-purchasing.module-
|
|
166
|
+
//# sourceMappingURL=tin-spa-purchasing.module-Bq8JnsyM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tin-spa-purchasing.module-Bq8JnsyM.mjs","sources":["../../../projects/tin-spa/src/lib/pages/purchasing/supplier-purchase-orders/supplier-purchase-orders.component.ts","../../../projects/tin-spa/src/lib/pages/purchasing/inventory-receipts/inventory-receipts.component.ts","../../../projects/tin-spa/src/lib/pages/purchasing/purchasing-dashboard/purchasing-dashboard.component.ts","../../../projects/tin-spa/src/lib/modules/purchasing/purchasing-routing.module.ts","../../../projects/tin-spa/src/lib/modules/purchasing/purchasing.module.ts"],"sourcesContent":["import { Component, inject, OnInit } from '@angular/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { PurchasingService } from 'tin-spa/core'; // Changed: Use PurchasingService instead of InventoryService\n\n@Component({\n selector: 'spa-supplier-purchase-orders',\n template: '<spa-page [config]=\"pageConfig\"></spa-page>',\n standalone: false\n})\nexport class SupplierPurchaseOrdersComponent implements OnInit {\n\n private purchasingService = inject(PurchasingService); // Changed: Inject PurchasingService\n\n ngOnInit(): void { }\n\n pageConfig: PageConfig = {\n title: 'Purchase Orders',\n tableConfig: this.purchasingService.supplierPurchaseOrdersTableConfig // Changed: Use PurchasingService config\n };\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { PageConfig } from 'tin-spa/core';\nimport { PurchasingService } from 'tin-spa/core'; // Changed: Use PurchasingService instead of InventoryService\n\n// Changed: Component moved from inventory module to purchasing module\n@Component({\n selector: 'spa-inventory-receipts',\n template: '<spa-page [config]=\"pageConfig\"></spa-page>',\n standalone: false\n})\nexport class InventoryReceiptsComponent implements OnInit {\n\n private purchasingService = inject(PurchasingService); // Changed: Inject PurchasingService\n\n ngOnInit(): void { }\n\n pageConfig: PageConfig = {\n title: 'Purchases', // Changed: \"Inventory Receipts\" → \"Purchases\"\n tableConfig: this.purchasingService.purchasesTableConfig // Changed: inventoryReceiptsTableConfig → purchasesTableConfig\n };\n}\n","import { Component } from '@angular/core';\nimport { TileConfig, ChartConfig } from 'tin-spa/core';\nimport { DataServiceLib } from 'tin-spa/core'; // Added (dashboard-alignment 1-D.3): the CapItem source the whole-config security gates read\n\n// Purchasing module dashboard with procurement tracking\n@Component({\n selector: 'spa-purchasing-dashboard',\n template: `\n <div class=\"dashboard-container\">\n <h4 class=\"dashboard-title\"><mat-icon>local_shipping</mat-icon> Purchasing Dashboard</h4>\n <spa-tiles [config]=\"summaryTiles\"></spa-tiles>\n <!-- Changed: Chart tiles for purchasing visual indicators -->\n <div style=\"margin-top: 16px;\"></div>\n <spa-tiles [config]=\"chartTiles\"></spa-tiles>\n <spa-charts [config]=\"chartConfig\"></spa-charts>\n </div>\n `,\n styles: [`\n .dashboard-container { padding: 16px; }\n .dashboard-title { display: flex; align-items: center; gap: 8px; margin-bottom: 16px; color: #333; font-weight: 500; }\n `],\n standalone: false\n})\nexport class PurchasingDashboardComponent {\n\n constructor(private dataService: DataServiceLib) { }\n\n summaryTiles: TileConfig = {\n tiles: [\n { name: 'totalPurchases', alias: 'Purchases (MTD)', color: '#2196f3', icon: 'shopping_bag', style: 'icon', info: 'Total purchase amount this month' },\n { name: 'openPOs', alias: 'Open POs', color: '#ff9800', icon: 'pending_actions', style: 'icon', info: 'Purchase orders awaiting fulfillment' },\n { name: 'pendingPurchases', alias: 'Pending Purchases', color: '#9c27b0', icon: 'inventory_2', style: 'icon', info: 'Purchases awaiting processing' }, // Changed: pendingReceipts → pendingPurchases\n { name: 'supplierPaymentsOutstanding', alias: 'AP Outstanding', color: '#f44336', icon: 'payments', style: 'icon', info: 'Outstanding supplier payment amounts' },\n { name: 'purchasesThisMonth', alias: 'Purchases (MTD)', color: '#4caf50', icon: 'receipt', style: 'icon', info: 'Purchases processed this month' }, // Changed: receiptsThisMonth → purchasesThisMonth\n ],\n loadAction: { url: 'purchases/dashboard-summary/x' }, // Changed: inventoryreceipts → purchases\n loadInit: true,\n security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62 (datalib.service.ts:592) — a single-module dashboard, so the gate sits on the whole config\n };\n\n // Changed: Chart-style tiles now use loadAction with dataField for dynamic data\n chartTiles: TileConfig = {\n tiles: [\n { name: 'fulfillmentRate', alias: 'Fulfillment Rate', color: '#4caf50', chart: { type: 'doughnut', gaugeColor: '#4caf50', height: 130, dataField: 'fulfillmentRate' }, footer: 'PO fulfillment rate', footerIcon: 'verified' }, // Changed: dataField replaces gaugeValue\n { name: 'spendTrendSpark', alias: 'Spend Trend', color: '#2196f3', chart: { type: 'line', color: '#2196f3', height: 100, dataField: 'spendTrendSpark' }, footer: 'Last 12 months', footerIcon: 'show_chart' }, // Changed: dataField replaces inline data\n { name: 'poStatusSplit', alias: 'PO Status', color: '#ff9800', chart: { type: 'doughnut', colors: ['#9e9e9e', '#2196f3', '#4caf50', '#f44336'], height: 130, dataField: 'poStatusSplit' }, footer: 'Current distribution', footerIcon: 'assignment' }, // Changed: dataField replaces inline data\n ],\n loadAction: { url: 'purchases/dashboard-chart-tiles/x' }, // Changed: inventoryreceipts → purchases\n loadInit: true,\n security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62\n };\n\n chartConfig: ChartConfig = {\n charts: [\n { name: 'purchaseTrend', title: 'Purchase Spend Trend', type: 'line', height: '300px', showPoints: true, tension: 0.4, colors: ['#2196f3', '#f44336'], showLegend: true }, // Changed: showLegend for line chart\n { name: 'poStatus', title: 'PO Status Distribution', type: 'doughnut', height: '300px', colors: ['#9e9e9e', '#2196f3', '#4caf50', '#f44336', '#ff9800'] },\n { name: 'topSuppliers', title: 'Top Suppliers by Spend', type: 'bar', height: '300px', colors: ['#2196f3', '#42a5f5', '#64b5f6', '#90caf9', '#bbdefb'] },\n { name: 'apAging', title: 'AP Aging Breakdown', type: 'bar', height: '300px', colors: ['#4caf50', '#ff9800', '#ff5722', '#f44336', '#b71c1c'] },\n ],\n loadAction: { url: 'purchases/dashboard-charts/x' }, // Changed: inventoryreceipts → purchases\n loadInit: true,\n columns: 2,\n security: { allow: [this.dataService.capPurchasingDashboard] } // Added (dashboard-alignment 1-D.3): cap62\n };\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { SupplierPurchaseOrdersComponent } from '../../pages/purchasing/supplier-purchase-orders/supplier-purchase-orders.component';\nimport { InventoryReceiptsComponent } from '../../pages/purchasing/inventory-receipts/inventory-receipts.component';\nimport { PurchasingDashboardComponent } from '../../pages/purchasing/purchasing-dashboard/purchasing-dashboard.component';\n\nexport const PURCHASING_ROUTES: Routes = [\n { path: \"orders\", component: SupplierPurchaseOrdersComponent },\n { path: \"purchases\", component: InventoryReceiptsComponent },\n { path: \"dashboard\", component: PurchasingDashboardComponent }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(PURCHASING_ROUTES)],\n exports: [RouterModule]\n})\nexport class PurchasingRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { PurchasingRoutingModule } from './purchasing-routing.module'; // Added (S10-part-1): this domain is now reached by loadChildren, so it carries its own RouterModule.forChild table instead of contributing routes to the eager parent\nimport { CommonModule } from '@angular/common';\nimport { SpaAdminModule } from '../spa-admin.module';\nimport { SupplierPurchaseOrdersComponent } from '../../pages/purchasing/supplier-purchase-orders/supplier-purchase-orders.component';\nimport { InventoryReceiptsComponent } from '../../pages/purchasing/inventory-receipts/inventory-receipts.component';\nimport { PurchasingDashboardComponent } from '../../pages/purchasing/purchasing-dashboard/purchasing-dashboard.component';\n\n@NgModule({\n declarations: [\n SupplierPurchaseOrdersComponent,\n InventoryReceiptsComponent,\n PurchasingDashboardComponent\n ],\n imports: [\n PurchasingRoutingModule,\n CommonModule,\n SpaAdminModule\n ]\n})\nexport class PurchasingModule { }\n"],"names":["i1.PageComponent","i2","i3.TilesComponent","i4.ChartsComponent"],"mappings":"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"}
|