ofpos-shared-core 1.1.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/README.md +37 -0
- package/dist/AdapterRegistry.d.ts +83 -0
- package/dist/DomainServices.d.ts +151 -0
- package/dist/IntegrationServices.d.ts +75 -0
- package/dist/PosCore.d.ts +216 -0
- package/dist/contracts/contractVersioning.d.ts +6 -0
- package/dist/contracts/crossDomainPrimitives.d.ts +5 -0
- package/dist/contracts/responseEnvelope.d.ts +6 -0
- package/dist/contracts/syncProtocol.d.ts +8 -0
- package/dist/data/DbAdapter.d.ts +7 -0
- package/dist/data/applyPendingMigrations.d.ts +18 -0
- package/dist/data/inMemoryDbAdapter.d.ts +65 -0
- package/dist/data/migrations.d.ts +12 -0
- package/dist/data/relations.d.ts +3 -0
- package/dist/data/schema.d.ts +9 -0
- package/dist/data/seed.d.ts +370 -0
- package/dist/index.browser.mjs +18 -0
- package/dist/index.browser.mjs.LEGAL.txt +46 -0
- package/dist/index.cjs.js +18 -0
- package/dist/index.cjs.js.LEGAL.txt +46 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.esm.js +18 -0
- package/dist/index.esm.js.LEGAL.txt +46 -0
- package/dist/index.umd.js +18 -0
- package/dist/index.umd.js.LEGAL.txt +46 -0
- package/dist/integration/NotificationAdapter.d.ts +69 -0
- package/dist/integration/activityLogger.d.ts +44 -0
- package/dist/integration/activitySink.d.ts +8 -0
- package/dist/integration/apiService.d.ts +255 -0
- package/dist/integration/authorizationService.d.ts +225 -0
- package/dist/integration/backupScheduler.d.ts +75 -0
- package/dist/integration/checksum.d.ts +9 -0
- package/dist/integration/checksumAdapter.d.ts +8 -0
- package/dist/integration/configService.d.ts +431 -0
- package/dist/integration/defaultChecksumAdapter.d.ts +6 -0
- package/dist/integration/defaultEncryptionAdapter.d.ts +9 -0
- package/dist/integration/encryption.d.ts +95 -0
- package/dist/integration/encryptionAdapter.d.ts +8 -0
- package/dist/integration/httpAdapter.d.ts +9 -0
- package/dist/integration/loggerAdapter.d.ts +45 -0
- package/dist/integration/notificationService.d.ts +45 -0
- package/dist/integration/ofauthBridge.d.ts +29 -0
- package/dist/integration/ofauthCoreBridge.d.ts +19 -0
- package/dist/integration/platformAdapter.d.ts +8 -0
- package/dist/integration/roleAdapter.d.ts +61 -0
- package/dist/integration/socket.d.ts +60 -0
- package/dist/integration/socketAdapter.d.ts +8 -0
- package/dist/integration/userService.d.ts +126 -0
- package/dist/models/Bom.d.ts +17 -0
- package/dist/models/Category.d.ts +13 -0
- package/dist/models/Customer.d.ts +17 -0
- package/dist/models/CustomerGroup.d.ts +11 -0
- package/dist/models/Expense.d.ts +19 -0
- package/dist/models/FinancialSetting.d.ts +14 -0
- package/dist/models/History.d.ts +18 -0
- package/dist/models/InventoryLog.d.ts +23 -0
- package/dist/models/InventoryLot.d.ts +34 -0
- package/dist/models/KitchenTicket.d.ts +13 -0
- package/dist/models/KitchenTicketItem.d.ts +12 -0
- package/dist/models/LoyaltyAccount.d.ts +12 -0
- package/dist/models/LoyaltyLedger.d.ts +17 -0
- package/dist/models/Order.d.ts +45 -0
- package/dist/models/OrderItem.d.ts +19 -0
- package/dist/models/Payable.d.ts +23 -0
- package/dist/models/PriceHistory.d.ts +17 -0
- package/dist/models/PriceTier.d.ts +19 -0
- package/dist/models/Product.d.ts +25 -0
- package/dist/models/Promotion.d.ts +25 -0
- package/dist/models/Purchase.d.ts +29 -0
- package/dist/models/PurchaseItem.d.ts +21 -0
- package/dist/models/PurchaseOrder.d.ts +23 -0
- package/dist/models/PurchaseOrderItem.d.ts +19 -0
- package/dist/models/Receivable.d.ts +23 -0
- package/dist/models/ReportSchedule.d.ts +21 -0
- package/dist/models/Return.d.ts +57 -0
- package/dist/models/ReturnItem.d.ts +31 -0
- package/dist/models/Role.d.ts +13 -0
- package/dist/models/Sale.d.ts +43 -0
- package/dist/models/SaleItem.d.ts +19 -0
- package/dist/models/Settlement.d.ts +23 -0
- package/dist/models/Shift.d.ts +41 -0
- package/dist/models/StockAdjustment.d.ts +21 -0
- package/dist/models/StockOpname.d.ts +22 -0
- package/dist/models/StockOpnameItem.d.ts +27 -0
- package/dist/models/Supplier.d.ts +19 -0
- package/dist/models/TaxRate.d.ts +13 -0
- package/dist/models/Transaction.d.ts +32 -0
- package/dist/models/Uom.d.ts +15 -0
- package/dist/models/User.d.ts +21 -0
- package/dist/services/bomService.d.ts +71 -0
- package/dist/services/cartService.d.ts +65 -0
- package/dist/services/categoryService.d.ts +54 -0
- package/dist/services/customerGroupService.d.ts +47 -0
- package/dist/services/customerService.d.ts +133 -0
- package/dist/services/documentNumberPolicy.d.ts +15 -0
- package/dist/services/expenseService.d.ts +47 -0
- package/dist/services/exportAdapter.d.ts +48 -0
- package/dist/services/exportService.d.ts +263 -0
- package/dist/services/financialSettingService.d.ts +47 -0
- package/dist/services/historyService.d.ts +60 -0
- package/dist/services/inventoryLogService.d.ts +47 -0
- package/dist/services/inventoryService.d.ts +43 -0
- package/dist/services/orderItemService.d.ts +47 -0
- package/dist/services/orderService.d.ts +161 -0
- package/dist/services/payableService.d.ts +51 -0
- package/dist/services/priceHistoryService.d.ts +61 -0
- package/dist/services/priceTierService.d.ts +47 -0
- package/dist/services/pricingService.d.ts +192 -0
- package/dist/services/productService.d.ts +59 -0
- package/dist/services/promotionService.d.ts +47 -0
- package/dist/services/purchaseItemService.d.ts +47 -0
- package/dist/services/purchaseOrderItemService.d.ts +47 -0
- package/dist/services/purchaseOrderService.d.ts +47 -0
- package/dist/services/purchaseService.d.ts +130 -0
- package/dist/services/receivableService.d.ts +47 -0
- package/dist/services/reportScheduleService.d.ts +47 -0
- package/dist/services/reportingService.d.ts +251 -0
- package/dist/services/returnItemService.d.ts +47 -0
- package/dist/services/returnService.d.ts +123 -0
- package/dist/services/roleService.d.ts +47 -0
- package/dist/services/saleItemService.d.ts +47 -0
- package/dist/services/saleService.d.ts +154 -0
- package/dist/services/settlementService.d.ts +68 -0
- package/dist/services/shiftService.d.ts +92 -0
- package/dist/services/stockAdjustmentService.d.ts +47 -0
- package/dist/services/stockOpnameItemService.d.ts +47 -0
- package/dist/services/stockOpnameService.d.ts +51 -0
- package/dist/services/stockTransferService.d.ts +67 -0
- package/dist/services/supplierService.d.ts +51 -0
- package/dist/services/taxRateService.d.ts +47 -0
- package/dist/services/taxService.d.ts +63 -0
- package/dist/services/transactionService.d.ts +109 -0
- package/dist/services/uiProductService.d.ts +102 -0
- package/dist/services/uiTransactionService.d.ts +68 -0
- package/dist/services/uomService.d.ts +53 -0
- package/dist/services/userService.d.ts +47 -0
- package/dist/stores/cartStore.d.ts +109 -0
- package/dist/stores/eventBus.d.ts +55 -0
- package/dist/stores/sessionStore.d.ts +108 -0
- package/dist/stores/storageAdapter.d.ts +44 -0
- package/dist/stores/syncService.d.ts +90 -0
- package/dist/stores/syncStore.d.ts +163 -0
- package/package.json +82 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
import { DbAdapter, QueryOptions } from 'ofcore';
|
|
3
|
+
import { TaxRate, TaxRateData } from '../models/TaxRate';
|
|
4
|
+
/** Service interface for TaxRate operations. */
|
|
5
|
+
export interface ITaxRateService {
|
|
6
|
+
/** Add new TaxRate. */
|
|
7
|
+
addTaxRate(data: TaxRateData, tx?: DbAdapter): Promise<TaxRate>;
|
|
8
|
+
/** Update existing TaxRate. */
|
|
9
|
+
updateTaxRate(id: string, data: Partial<TaxRateData>): Promise<TaxRate>;
|
|
10
|
+
/** Get all TaxRates with complex options. */
|
|
11
|
+
getTaxRates(options?: QueryOptions, tx?: DbAdapter): Promise<TaxRate[]>;
|
|
12
|
+
/** Get TaxRate by ID or options. */
|
|
13
|
+
getTaxRate(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<TaxRate | null>;
|
|
14
|
+
/** Delete TaxRate (logical). */
|
|
15
|
+
deleteTaxRate(id: string, tx?: DbAdapter): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
queued: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
/** Duplicate TaxRate by ID. */
|
|
20
|
+
duplicateTaxRate(originalId: string, tx?: DbAdapter): Promise<TaxRate>;
|
|
21
|
+
}
|
|
22
|
+
/** Service implementation for TaxRate operations. */
|
|
23
|
+
export declare class TaxRateService implements ITaxRateService {
|
|
24
|
+
private context;
|
|
25
|
+
private dbAdapter;
|
|
26
|
+
private syncStore?;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize TaxRateService.
|
|
29
|
+
* @param context - PosCore context
|
|
30
|
+
*/
|
|
31
|
+
constructor(context: PosCore);
|
|
32
|
+
/** Add new TaxRate. */
|
|
33
|
+
addTaxRate(data: TaxRateData, tx?: DbAdapter): Promise<TaxRate>;
|
|
34
|
+
/** Update existing TaxRate. */
|
|
35
|
+
updateTaxRate(id: string, data: Partial<TaxRateData>, tx?: DbAdapter): Promise<TaxRate>;
|
|
36
|
+
/** Get all TaxRates with complex options. */
|
|
37
|
+
getTaxRates(options?: QueryOptions, tx?: DbAdapter): Promise<TaxRate[]>;
|
|
38
|
+
/** Get TaxRate by ID or options. */
|
|
39
|
+
getTaxRate(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<TaxRate | null>;
|
|
40
|
+
/** Delete TaxRate (logical). */
|
|
41
|
+
deleteTaxRate(id: string, tx?: DbAdapter): Promise<{
|
|
42
|
+
id: string;
|
|
43
|
+
queued: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
/** Duplicate TaxRate by ID. */
|
|
46
|
+
duplicateTaxRate(originalId: string, tx?: DbAdapter): Promise<TaxRate>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
/**
|
|
3
|
+
* Antarmuka untuk layanan pajak.
|
|
4
|
+
*/
|
|
5
|
+
export interface ITaxService {
|
|
6
|
+
/**
|
|
7
|
+
* Mendapatkan tarif PPN saat ini dari cache atau database.
|
|
8
|
+
* @returns Promise yang berisi tarif PPN.
|
|
9
|
+
*/
|
|
10
|
+
getPpnRate(): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Mendapatkan tarif PPH saat ini dari cache atau database.
|
|
13
|
+
* @returns Promise yang berisi tarif PPH.
|
|
14
|
+
*/
|
|
15
|
+
getPphRate(): Promise<number>;
|
|
16
|
+
/**
|
|
17
|
+
* Menetapkan tarif PPN baru dan memperbarui database.
|
|
18
|
+
* @param newRate Tarif PPN baru (harus >= 0).
|
|
19
|
+
*/
|
|
20
|
+
setPpnRate(newRate: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Menetapkan tarif PPH baru dan memperbarui database.
|
|
23
|
+
* @param newRate Tarif PPH baru (harus >= 0).
|
|
24
|
+
*/
|
|
25
|
+
setPphRate(newRate: number): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Mengosongkan cache tarif pajak (PPN dan PPH).
|
|
28
|
+
*/
|
|
29
|
+
clearTaxRateCache(): void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Implementasi layanan pajak yang menggunakan DbAdapter dan eventBus untuk
|
|
33
|
+
* menyimpan, mengambil, dan menghapus tarif pajak dengan caching.
|
|
34
|
+
*/
|
|
35
|
+
export declare class TaxService implements ITaxService {
|
|
36
|
+
private context;
|
|
37
|
+
private dbAdapter;
|
|
38
|
+
/**
|
|
39
|
+
* Membuat instance TaxService.
|
|
40
|
+
* @param context Konteks PosCore yang berisi registry dan dependensi.
|
|
41
|
+
*/
|
|
42
|
+
constructor(context: PosCore);
|
|
43
|
+
/**
|
|
44
|
+
* {@inheritDoc ITaxService.getPpnRate}
|
|
45
|
+
*/
|
|
46
|
+
getPpnRate(): Promise<number>;
|
|
47
|
+
/**
|
|
48
|
+
* {@inheritDoc ITaxService.getPphRate}
|
|
49
|
+
*/
|
|
50
|
+
getPphRate(): Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* {@inheritDoc ITaxService.setPpnRate}
|
|
53
|
+
*/
|
|
54
|
+
setPpnRate(newRate: number): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* {@inheritDoc ITaxService.setPphRate}
|
|
57
|
+
*/
|
|
58
|
+
setPphRate(newRate: number): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* {@inheritDoc ITaxService.clearTaxRateCache}
|
|
61
|
+
*/
|
|
62
|
+
clearTaxRateCache(): void;
|
|
63
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
import { DbAdapter, QueryOptions } from 'ofcore';
|
|
3
|
+
import { Transaction, TransactionData } from '../models/Transaction';
|
|
4
|
+
/** Service interface for Transaction operations. */
|
|
5
|
+
export interface ITransactionService {
|
|
6
|
+
/** Add new Transaction. */
|
|
7
|
+
addTransaction(data: TransactionData, tx?: DbAdapter): Promise<Transaction>;
|
|
8
|
+
/** Update existing Transaction. */
|
|
9
|
+
updateTransaction(id: string, data: Partial<TransactionData>): Promise<Transaction>;
|
|
10
|
+
/** Get all Transactions with complex options. */
|
|
11
|
+
getTransactions(options?: QueryOptions, tx?: DbAdapter): Promise<Transaction[]>;
|
|
12
|
+
/** Get Transaction by ID or options. */
|
|
13
|
+
getTransaction(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<Transaction | null>;
|
|
14
|
+
/** Delete Transaction (logical). */
|
|
15
|
+
deleteTransaction(id: string, tx?: DbAdapter): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
queued: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
/** Duplicate Transaction by ID. */
|
|
20
|
+
duplicateTransaction(originalId: string, tx?: DbAdapter): Promise<Transaction>;
|
|
21
|
+
recordCashIn(payment: {
|
|
22
|
+
method: string;
|
|
23
|
+
data: {
|
|
24
|
+
referenceType: string;
|
|
25
|
+
referenceId: string;
|
|
26
|
+
[key: string]: any;
|
|
27
|
+
};
|
|
28
|
+
amount: number;
|
|
29
|
+
}, tx?: DbAdapter): Promise<any>;
|
|
30
|
+
recordCashOut(params: {
|
|
31
|
+
method: string;
|
|
32
|
+
data: {
|
|
33
|
+
referenceType: string;
|
|
34
|
+
referenceId: string;
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
};
|
|
37
|
+
amount: number;
|
|
38
|
+
}, tx?: DbAdapter): Promise<any>;
|
|
39
|
+
getTransactionsByReference(referenceType: string, referenceId?: string, options?: QueryOptions, tx?: DbAdapter): Promise<Transaction[]>;
|
|
40
|
+
adjustCash(amount: number, direction: 'in' | 'out', reason: string, tx?: DbAdapter): Promise<Transaction>;
|
|
41
|
+
getDailySummary(date?: string): Promise<{
|
|
42
|
+
totalIn: number;
|
|
43
|
+
totalOut: number;
|
|
44
|
+
net: number;
|
|
45
|
+
date: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/** Service implementation for Transaction operations. */
|
|
49
|
+
export declare class TransactionService implements ITransactionService {
|
|
50
|
+
private context;
|
|
51
|
+
private dbAdapter;
|
|
52
|
+
private syncStore?;
|
|
53
|
+
private readonly allowedReferenceTypes;
|
|
54
|
+
/**
|
|
55
|
+
* Initialize TransactionService.
|
|
56
|
+
* @param context - PosCore context
|
|
57
|
+
*/
|
|
58
|
+
constructor(context: PosCore);
|
|
59
|
+
private getIdempotentTransaction;
|
|
60
|
+
private saveIdempotencyMarker;
|
|
61
|
+
private getActorId;
|
|
62
|
+
private isShiftGuardEnabled;
|
|
63
|
+
private shouldRequireActiveShift;
|
|
64
|
+
private assertActiveShiftGuard;
|
|
65
|
+
private assertCashPolicy;
|
|
66
|
+
private assertReferenceIntegrity;
|
|
67
|
+
private assertIdempotentReplayConsistency;
|
|
68
|
+
/** Add new Transaction. */
|
|
69
|
+
addTransaction(data: TransactionData, tx?: DbAdapter): Promise<Transaction>;
|
|
70
|
+
/** Update existing Transaction. */
|
|
71
|
+
updateTransaction(id: string, data: Partial<TransactionData>, tx?: DbAdapter): Promise<Transaction>;
|
|
72
|
+
/** Get all Transactions with complex options. */
|
|
73
|
+
getTransactions(options?: QueryOptions, tx?: DbAdapter): Promise<Transaction[]>;
|
|
74
|
+
/** Get Transaction by ID or options. */
|
|
75
|
+
getTransaction(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<Transaction | null>;
|
|
76
|
+
/** Delete Transaction (logical). */
|
|
77
|
+
deleteTransaction(id: string, tx?: DbAdapter): Promise<{
|
|
78
|
+
id: string;
|
|
79
|
+
queued: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
/** Duplicate Transaction by ID. */
|
|
82
|
+
duplicateTransaction(originalId: string, tx?: DbAdapter): Promise<Transaction>;
|
|
83
|
+
recordCashIn(params: {
|
|
84
|
+
method: string;
|
|
85
|
+
data: {
|
|
86
|
+
referenceType: string;
|
|
87
|
+
referenceId: string;
|
|
88
|
+
[key: string]: any;
|
|
89
|
+
};
|
|
90
|
+
amount: number;
|
|
91
|
+
}, tx?: DbAdapter): Promise<any>;
|
|
92
|
+
recordCashOut(params: {
|
|
93
|
+
method: string;
|
|
94
|
+
data: {
|
|
95
|
+
referenceType: string;
|
|
96
|
+
referenceId: string;
|
|
97
|
+
[key: string]: any;
|
|
98
|
+
};
|
|
99
|
+
amount: number;
|
|
100
|
+
}, tx?: DbAdapter): Promise<any>;
|
|
101
|
+
adjustCash(amount: number, direction: 'in' | 'out', reason: string, tx?: DbAdapter): Promise<Transaction>;
|
|
102
|
+
getTransactionsByReference(referenceType: string, referenceId?: string, options?: QueryOptions, tx?: DbAdapter): Promise<Transaction[]>;
|
|
103
|
+
getDailySummary(date?: string): Promise<{
|
|
104
|
+
totalIn: number;
|
|
105
|
+
totalOut: number;
|
|
106
|
+
net: number;
|
|
107
|
+
date: string;
|
|
108
|
+
}>;
|
|
109
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
/**
|
|
3
|
+
* Ringkasan data produk untuk UI.
|
|
4
|
+
*/
|
|
5
|
+
type ProductSummary = {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
price: number;
|
|
9
|
+
stock: number;
|
|
10
|
+
categoryId: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Input data untuk membuat produk.
|
|
14
|
+
*/
|
|
15
|
+
type ProductInput = {
|
|
16
|
+
name: string;
|
|
17
|
+
price: number;
|
|
18
|
+
cost: number;
|
|
19
|
+
description?: string;
|
|
20
|
+
barcode?: string;
|
|
21
|
+
stock: number;
|
|
22
|
+
categoryId: string;
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Data untuk pembaruan produk (nullable fields diperbolehkan).
|
|
27
|
+
*/
|
|
28
|
+
type ProductUpdate = Partial<ProductInput>;
|
|
29
|
+
/**
|
|
30
|
+
* Detail lengkap produk, termasuk daftar BOM.
|
|
31
|
+
*/
|
|
32
|
+
type ProductDetails = {
|
|
33
|
+
product: any;
|
|
34
|
+
boms: any[];
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Antarmuka publik untuk layanan UI produk.
|
|
38
|
+
*/
|
|
39
|
+
export interface IUIProductService {
|
|
40
|
+
/**
|
|
41
|
+
* Mengambil daftar seluruh produk yang tidak dihapus.
|
|
42
|
+
*/
|
|
43
|
+
listProducts(): Promise<ProductSummary[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Mengambil daftar produk berdasarkan kategori; jika categoryId tidak disediakan,
|
|
46
|
+
* akan mengembalikan seluruh produk.
|
|
47
|
+
*/
|
|
48
|
+
listProductsByCategory(categoryId?: string): Promise<ProductSummary[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Mengubah data produk yang sudah ada.
|
|
51
|
+
*/
|
|
52
|
+
editProduct(id: string, data: ProductUpdate): Promise<any>;
|
|
53
|
+
/**
|
|
54
|
+
* Mengambil detail produk beserta bloating material (BOM).
|
|
55
|
+
*/
|
|
56
|
+
fetchProductDetails(id: string): Promise<ProductDetails>;
|
|
57
|
+
/**
|
|
58
|
+
* Menghapus (soft-delete) produk berdasarkan ID.
|
|
59
|
+
*/
|
|
60
|
+
removeProduct(id: string): Promise<any>;
|
|
61
|
+
/**
|
|
62
|
+
* Mencari produk berdasarkan barcode.
|
|
63
|
+
*/
|
|
64
|
+
scanProduct(barcode: string): Promise<any>;
|
|
65
|
+
}
|
|
66
|
+
export declare class UIProductService implements IUIProductService {
|
|
67
|
+
private context;
|
|
68
|
+
private readonly dbAdapter;
|
|
69
|
+
private readonly productService;
|
|
70
|
+
private readonly bomService;
|
|
71
|
+
private readonly syncStore?;
|
|
72
|
+
/**
|
|
73
|
+
* Membuat instance layanan UI produk.
|
|
74
|
+
* @param context Konteks PosCore dengan dependensi yang diperlukan.
|
|
75
|
+
*/
|
|
76
|
+
constructor(context: PosCore);
|
|
77
|
+
/**
|
|
78
|
+
* {@inheritDoc IUIProductService.listProducts}
|
|
79
|
+
*/
|
|
80
|
+
listProducts(): Promise<ProductSummary[]>;
|
|
81
|
+
/**
|
|
82
|
+
* {@inheritDoc IUIProductService.listProductsByCategory}
|
|
83
|
+
*/
|
|
84
|
+
listProductsByCategory(categoryId?: string): Promise<ProductSummary[]>;
|
|
85
|
+
/**
|
|
86
|
+
* {@inheritDoc IUIProductService.editProduct}
|
|
87
|
+
*/
|
|
88
|
+
editProduct(id: string, data: ProductUpdate): Promise<any>;
|
|
89
|
+
/**
|
|
90
|
+
* {@inheritDoc IUIProductService.fetchProductDetails}
|
|
91
|
+
*/
|
|
92
|
+
fetchProductDetails(id: string): Promise<ProductDetails>;
|
|
93
|
+
/**
|
|
94
|
+
* {@inheritDoc IUIProductService.removeProduct}
|
|
95
|
+
*/
|
|
96
|
+
removeProduct(id: string): Promise<any>;
|
|
97
|
+
/**
|
|
98
|
+
* {@inheritDoc IUIProductService.scanProduct}
|
|
99
|
+
*/
|
|
100
|
+
scanProduct(barcode: string): Promise<any>;
|
|
101
|
+
}
|
|
102
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
/**
|
|
3
|
+
* Bentuk data hasil perhitungan transaksi,
|
|
4
|
+
* mencakup daftar item, subtotal, diskon, total, pajak PPN, PPH,
|
|
5
|
+
* total dengan pajak, dan jumlah yang harus dibayar ke penjual.
|
|
6
|
+
*/
|
|
7
|
+
export interface TransactionTotals {
|
|
8
|
+
pricedItems: Array<{
|
|
9
|
+
productId: string;
|
|
10
|
+
quantity: number;
|
|
11
|
+
unitPrice: number;
|
|
12
|
+
}>;
|
|
13
|
+
subTotal: number;
|
|
14
|
+
discount: number;
|
|
15
|
+
total: number;
|
|
16
|
+
ppn: number;
|
|
17
|
+
pph: number;
|
|
18
|
+
totalWithTax: number;
|
|
19
|
+
payableToSeller: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Interface layanan untuk perhitungan transaksi UI,
|
|
23
|
+
* menyediakan method untuk menghitung nilai moneter
|
|
24
|
+
* berdasarkan daftar item, diskon, dan grup pelanggan.
|
|
25
|
+
*/
|
|
26
|
+
export interface IUITransactionService {
|
|
27
|
+
/**
|
|
28
|
+
* Menghitung semua nilai moneter untuk daftar item,
|
|
29
|
+
* menerapkan diskon dan pajak.
|
|
30
|
+
*
|
|
31
|
+
* @param items Daftar produk dengan quantity
|
|
32
|
+
* @param discountCode (Opsional) Kode kupon atau diskon
|
|
33
|
+
* @param customerGroupId (Opsional) ID grup pelanggan untuk harga bertingkat
|
|
34
|
+
* @returns Promise yang mengembalikan object TransactionTotals
|
|
35
|
+
*/
|
|
36
|
+
calculateTransactionTotals(items: Array<{
|
|
37
|
+
productId: string;
|
|
38
|
+
quantity: number;
|
|
39
|
+
}>, discountCode?: string, customerGroupId?: string): Promise<TransactionTotals>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Implementasi IUITransactionService,
|
|
43
|
+
* menggunakan domainServices.pricing untuk menghitung nilai transaksi.
|
|
44
|
+
*/
|
|
45
|
+
export declare class UITransactionService implements IUITransactionService {
|
|
46
|
+
private context;
|
|
47
|
+
private readonly pricingService;
|
|
48
|
+
/**
|
|
49
|
+
* Membuat instance UITransactionService.
|
|
50
|
+
*
|
|
51
|
+
* @param context Konteks PosCore yang menyediakan service terkait.
|
|
52
|
+
*/
|
|
53
|
+
constructor(context: PosCore);
|
|
54
|
+
/**
|
|
55
|
+
* Menghitung semua nilai moneter untuk daftar item,
|
|
56
|
+
* menerapkan diskon dan pajak.
|
|
57
|
+
*
|
|
58
|
+
* @param items Daftar produk dengan quantity
|
|
59
|
+
* @param discountCode (Opsional) Kode kupon atau diskon
|
|
60
|
+
* @param customerGroupId (Opsional) ID grup pelanggan untuk harga bertingkat
|
|
61
|
+
* @returns Promise yang mengembalikan object TransactionTotals
|
|
62
|
+
*/
|
|
63
|
+
calculateTransactionTotals(items: Array<{
|
|
64
|
+
productId: string;
|
|
65
|
+
quantity: number;
|
|
66
|
+
uomId: string;
|
|
67
|
+
}>, discountCode?: string, customerGroupId?: string): Promise<TransactionTotals>;
|
|
68
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
import { DbAdapter, QueryOptions } from 'ofcore';
|
|
3
|
+
import { Uom, UomData } from '../models/Uom';
|
|
4
|
+
/** Service interface for Uom operations. */
|
|
5
|
+
export interface IUomService {
|
|
6
|
+
/** Add new Uom. */
|
|
7
|
+
addUom(data: UomData, tx?: DbAdapter): Promise<Uom>;
|
|
8
|
+
/** Update existing Uom. */
|
|
9
|
+
updateUom(id: string, data: Partial<UomData>): Promise<Uom>;
|
|
10
|
+
/** Get all Uoms with complex options. */
|
|
11
|
+
getUoms(options?: QueryOptions, tx?: DbAdapter): Promise<Uom[]>;
|
|
12
|
+
/** Get Uom by ID or options. */
|
|
13
|
+
getUom(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<Uom | null>;
|
|
14
|
+
/** Delete Uom (logical). */
|
|
15
|
+
deleteUom(id: string, tx?: DbAdapter): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
queued: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
/** Duplicate Uom by ID. */
|
|
20
|
+
duplicateUom(originalId: string, tx?: DbAdapter): Promise<Uom>;
|
|
21
|
+
convertQuantity(value: number, from: Pick<Uom, 'conversionFactor'>, to: Pick<Uom, 'conversionFactor'>): number;
|
|
22
|
+
convertUnitPrice(oldUnitPrice: number, oldUom: Pick<Uom, 'conversionFactor'>, newUom: Pick<Uom, 'conversionFactor'>): number;
|
|
23
|
+
getUomsMap(): Promise<Map<string, Uom>>;
|
|
24
|
+
}
|
|
25
|
+
/** Service implementation for Uom operations. */
|
|
26
|
+
export declare class UomService implements IUomService {
|
|
27
|
+
private context;
|
|
28
|
+
private dbAdapter;
|
|
29
|
+
private syncStore?;
|
|
30
|
+
/**
|
|
31
|
+
* Initialize UomService.
|
|
32
|
+
* @param context - PosCore context
|
|
33
|
+
*/
|
|
34
|
+
constructor(context: PosCore);
|
|
35
|
+
/** Add new Uom. */
|
|
36
|
+
addUom(data: UomData, tx?: DbAdapter): Promise<Uom>;
|
|
37
|
+
/** Update existing Uom. */
|
|
38
|
+
updateUom(id: string, data: Partial<UomData>, tx?: DbAdapter): Promise<Uom>;
|
|
39
|
+
/** Get all Uoms with complex options. */
|
|
40
|
+
getUoms(options?: QueryOptions, tx?: DbAdapter): Promise<Uom[]>;
|
|
41
|
+
/** Get Uom by ID or options. */
|
|
42
|
+
getUom(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<Uom | null>;
|
|
43
|
+
/** Delete Uom (logical). */
|
|
44
|
+
deleteUom(id: string, tx?: DbAdapter): Promise<{
|
|
45
|
+
id: string;
|
|
46
|
+
queued: boolean;
|
|
47
|
+
}>;
|
|
48
|
+
/** Duplicate Uom by ID. */
|
|
49
|
+
duplicateUom(originalId: string, tx?: DbAdapter): Promise<Uom>;
|
|
50
|
+
convertQuantity(value: number, from: Pick<Uom, 'conversionFactor'>, to: Pick<Uom, 'conversionFactor'>): number;
|
|
51
|
+
convertUnitPrice(fromUnitPrice: number, fromUom: Pick<Uom, 'conversionFactor'>, toUom: Pick<Uom, 'conversionFactor'>): number;
|
|
52
|
+
getUomsMap(): Promise<Map<string, Uom>>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { PosCore } from '../PosCore';
|
|
2
|
+
import { DbAdapter, QueryOptions } from 'ofcore';
|
|
3
|
+
import { User, UserData } from '../models/User';
|
|
4
|
+
/** Service interface for User operations. */
|
|
5
|
+
export interface IUserService {
|
|
6
|
+
/** Add new User. */
|
|
7
|
+
addUser(data: UserData, tx?: DbAdapter): Promise<User>;
|
|
8
|
+
/** Update existing User. */
|
|
9
|
+
updateUser(id: string, data: Partial<UserData>): Promise<User>;
|
|
10
|
+
/** Get all Users with complex options. */
|
|
11
|
+
getUsers(options?: QueryOptions, tx?: DbAdapter): Promise<User[]>;
|
|
12
|
+
/** Get User by ID or options. */
|
|
13
|
+
getUser(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<User | null>;
|
|
14
|
+
/** Delete User (logical). */
|
|
15
|
+
deleteUser(id: string, tx?: DbAdapter): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
queued: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
/** Duplicate User by ID. */
|
|
20
|
+
duplicateUser(originalId: string, tx?: DbAdapter): Promise<User>;
|
|
21
|
+
}
|
|
22
|
+
/** Service implementation for User operations. */
|
|
23
|
+
export declare class UserService implements IUserService {
|
|
24
|
+
private context;
|
|
25
|
+
private dbAdapter;
|
|
26
|
+
private syncStore?;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize UserService.
|
|
29
|
+
* @param context - PosCore context
|
|
30
|
+
*/
|
|
31
|
+
constructor(context: PosCore);
|
|
32
|
+
/** Add new User. */
|
|
33
|
+
addUser(data: UserData, tx?: DbAdapter): Promise<User>;
|
|
34
|
+
/** Update existing User. */
|
|
35
|
+
updateUser(id: string, data: Partial<UserData>, tx?: DbAdapter): Promise<User>;
|
|
36
|
+
/** Get all Users with complex options. */
|
|
37
|
+
getUsers(options?: QueryOptions, tx?: DbAdapter): Promise<User[]>;
|
|
38
|
+
/** Get User by ID or options. */
|
|
39
|
+
getUser(idOrOptions: string | QueryOptions, tx?: DbAdapter): Promise<User | null>;
|
|
40
|
+
/** Delete User (logical). */
|
|
41
|
+
deleteUser(id: string, tx?: DbAdapter): Promise<{
|
|
42
|
+
id: string;
|
|
43
|
+
queued: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
/** Duplicate User by ID. */
|
|
46
|
+
duplicateUser(originalId: string, tx?: DbAdapter): Promise<User>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modul penyimpanan keranjang belanja menggunakan StorageAdapter.
|
|
3
|
+
* Mengelola operasi CRUD pada data keranjang.
|
|
4
|
+
*/
|
|
5
|
+
import { PosCore } from '../PosCore';
|
|
6
|
+
/**
|
|
7
|
+
* Representasi item dalam keranjang.
|
|
8
|
+
*/
|
|
9
|
+
export interface CartItem {
|
|
10
|
+
/** ID sementara (UUID atau timestamp) */
|
|
11
|
+
id: string;
|
|
12
|
+
/** ID produk */
|
|
13
|
+
productId: string;
|
|
14
|
+
/** nama produk */
|
|
15
|
+
name: string | null;
|
|
16
|
+
/** Jumlah produk */
|
|
17
|
+
quantity: number;
|
|
18
|
+
/** ID satuan jika produk memiliki multi-UOM */
|
|
19
|
+
uomId: string | null;
|
|
20
|
+
/** kode uom */
|
|
21
|
+
uomCode: string | null;
|
|
22
|
+
/** Harga per unit saat discan */
|
|
23
|
+
unitPrice: number;
|
|
24
|
+
/** Catatan per item (opsional) */
|
|
25
|
+
note?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Struktur keranjang belanja.
|
|
29
|
+
*/
|
|
30
|
+
export interface Cart {
|
|
31
|
+
/** UUID keranjang, contoh: 'cart_1712345678' */
|
|
32
|
+
id: string;
|
|
33
|
+
/** Waktu pembuatan (ISO string) */
|
|
34
|
+
createdAt: string;
|
|
35
|
+
/** Waktu terakhir diubah (ISO string) */
|
|
36
|
+
lastModified: string;
|
|
37
|
+
/** ID kasir yang mengelola keranjang (opsional) */
|
|
38
|
+
userId?: string;
|
|
39
|
+
/** ID pelanggan jika dikenali (opsional) */
|
|
40
|
+
customerId?: string;
|
|
41
|
+
/** Nama pelanggan untuk tampilan cepat (opsional) */
|
|
42
|
+
customerName?: string;
|
|
43
|
+
/** Nomor meja untuk F&B (opsional) */
|
|
44
|
+
tableNumber?: string;
|
|
45
|
+
/** Label/deskripsi keranjang (opsional) */
|
|
46
|
+
label?: string;
|
|
47
|
+
discountCode?: string;
|
|
48
|
+
/** Daftar item dalam keranjang */
|
|
49
|
+
items: CartItem[];
|
|
50
|
+
/** Total sebelum diskon */
|
|
51
|
+
subtotal: number;
|
|
52
|
+
/** Total diskon dari promo/voucher */
|
|
53
|
+
totalDiscount: number;
|
|
54
|
+
/** PPN yang dikenakan */
|
|
55
|
+
ppn: number;
|
|
56
|
+
/** PPH yang dikenakan */
|
|
57
|
+
pph: number;
|
|
58
|
+
/** Total akhir setelah semua perhitungan */
|
|
59
|
+
finalTotal: number;
|
|
60
|
+
/** Catatan umum keranjang (opsional) */
|
|
61
|
+
note?: string;
|
|
62
|
+
/** Kunci edit sementara (opsional) */
|
|
63
|
+
isLocked?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/** Tipe peta keranjang berdasarkan ID */
|
|
66
|
+
export type CartMap = Record<string, Cart>;
|
|
67
|
+
/**
|
|
68
|
+
* Kelas penyimpanan keranjang dengan operasi dasar.
|
|
69
|
+
*/
|
|
70
|
+
export declare class CartStore {
|
|
71
|
+
private context;
|
|
72
|
+
/** Kunci utama untuk penyimpanan di adapter */
|
|
73
|
+
private static KEY;
|
|
74
|
+
private storage;
|
|
75
|
+
/**
|
|
76
|
+
* Membuat instance CartStore.
|
|
77
|
+
* @param context PosCore sebagai konteks aplikasi
|
|
78
|
+
*/
|
|
79
|
+
constructor(context: PosCore);
|
|
80
|
+
/**
|
|
81
|
+
* Mengambil semua keranjang dari storage.
|
|
82
|
+
* @returns Promise objek CartMap
|
|
83
|
+
*/
|
|
84
|
+
getAllCarts(): Promise<CartMap>;
|
|
85
|
+
/**
|
|
86
|
+
* Menyimpan semua keranjang ke storage.
|
|
87
|
+
* @param carts Data CartMap yang akan disimpan
|
|
88
|
+
*/
|
|
89
|
+
saveAllCarts(carts: CartMap): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Membuat keranjang baru dan menyimpannya.
|
|
92
|
+
* @param cart Objek Cart yang akan dibuat
|
|
93
|
+
*/
|
|
94
|
+
createCart(cart: Cart): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Memperbarui keranjang yang sudah ada.
|
|
97
|
+
* @param cart Objek Cart dengan data terbaru
|
|
98
|
+
*/
|
|
99
|
+
updateCart(cart: Cart): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Menghapus keranjang berdasarkan ID.
|
|
102
|
+
* @param cartId ID keranjang yang akan dihapus
|
|
103
|
+
*/
|
|
104
|
+
deleteCart(cartId: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Menghapus seluruh keranjang dari storage.
|
|
107
|
+
*/
|
|
108
|
+
clearAllCarts(): Promise<void>;
|
|
109
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modul bus event global menggunakan mitt.
|
|
3
|
+
* Menyediakan mekanisme publish/subscribe untuk event aplikasi.
|
|
4
|
+
*/
|
|
5
|
+
import { Emitter } from 'mitt';
|
|
6
|
+
export type PosCoreEvents = {
|
|
7
|
+
'stock:changed': {
|
|
8
|
+
productId: string;
|
|
9
|
+
delta: number;
|
|
10
|
+
};
|
|
11
|
+
'stock:rebuild': undefined;
|
|
12
|
+
'stockCache:rebuilt': undefined;
|
|
13
|
+
'order:finalized': string;
|
|
14
|
+
'purchase:finalized': string;
|
|
15
|
+
'return:processed': {
|
|
16
|
+
returnId: string;
|
|
17
|
+
type: string;
|
|
18
|
+
actualRefund: number;
|
|
19
|
+
};
|
|
20
|
+
'return:canceled': {
|
|
21
|
+
returnId: string;
|
|
22
|
+
};
|
|
23
|
+
'sale:finalized': string;
|
|
24
|
+
'shift:opened': {
|
|
25
|
+
shiftId: string;
|
|
26
|
+
cashierId: string;
|
|
27
|
+
startingCash: number;
|
|
28
|
+
};
|
|
29
|
+
'shift:closed': {
|
|
30
|
+
shiftId: string;
|
|
31
|
+
cashierId: string;
|
|
32
|
+
systemEndingCash: number;
|
|
33
|
+
physicalEndingCash: number;
|
|
34
|
+
difference: number;
|
|
35
|
+
};
|
|
36
|
+
'shift:reopened': {
|
|
37
|
+
fromShiftId: string;
|
|
38
|
+
reopenedShiftId: string;
|
|
39
|
+
cashierId: string;
|
|
40
|
+
approvedBy: string;
|
|
41
|
+
};
|
|
42
|
+
'taxRateChanged': undefined;
|
|
43
|
+
'data_changed': undefined;
|
|
44
|
+
'ops:alert': {
|
|
45
|
+
severity: 'warning' | 'critical';
|
|
46
|
+
category: 'sync';
|
|
47
|
+
code: string;
|
|
48
|
+
message: string;
|
|
49
|
+
correlationId?: string;
|
|
50
|
+
syncBatchId?: string;
|
|
51
|
+
metrics?: Record<string, number>;
|
|
52
|
+
at: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
export declare const eventBus: Emitter<PosCoreEvents>;
|