@tallyui/pos 0.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.
Files changed (37) hide show
  1. package/dist/index.d.ts +262 -0
  2. package/dist/index.js +632 -0
  3. package/package.json +39 -0
  4. package/src/currency/currency-provider.test.tsx +36 -0
  5. package/src/currency/currency-provider.tsx +32 -0
  6. package/src/currency/format-currency.test.ts +36 -0
  7. package/src/currency/format-currency.ts +18 -0
  8. package/src/currency/index.ts +3 -0
  9. package/src/index.ts +34 -0
  10. package/src/logging/index.ts +3 -0
  11. package/src/logging/logger.test.ts +154 -0
  12. package/src/logging/logger.ts +67 -0
  13. package/src/logging/sinks.test.ts +60 -0
  14. package/src/logging/sinks.ts +46 -0
  15. package/src/logging/types.ts +26 -0
  16. package/src/order/discount-engine.test.ts +152 -0
  17. package/src/order/index.ts +13 -0
  18. package/src/order/order-builder.test.ts +246 -0
  19. package/src/order/order-builder.ts +273 -0
  20. package/src/order/order-manager.test.ts +209 -0
  21. package/src/order/order-manager.ts +175 -0
  22. package/src/order/payment.test.ts +91 -0
  23. package/src/order/types.ts +66 -0
  24. package/src/receipt/build-receipt-data.test.ts +166 -0
  25. package/src/receipt/build-receipt-data.ts +56 -0
  26. package/src/receipt/index.ts +2 -0
  27. package/src/receipt/types.ts +42 -0
  28. package/src/repository/create-repository.test.ts +166 -0
  29. package/src/repository/create-repository.ts +74 -0
  30. package/src/repository/index.ts +2 -0
  31. package/src/repository/types.ts +15 -0
  32. package/src/tax/calculate.test.ts +59 -0
  33. package/src/tax/calculate.ts +32 -0
  34. package/src/tax/index.ts +4 -0
  35. package/src/tax/tax-provider.test.tsx +51 -0
  36. package/src/tax/tax-provider.tsx +36 -0
  37. package/src/tax/types.ts +15 -0
@@ -0,0 +1,262 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { MangoQuery, RxCollection } from 'rxdb';
4
+ import { Observable } from 'rxjs';
5
+ import { ProductTraits } from '@tallyui/core';
6
+
7
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
8
+ interface LogEntry {
9
+ level: LogLevel;
10
+ scope: string;
11
+ message: string;
12
+ data?: Record<string, unknown>;
13
+ timestamp: number;
14
+ }
15
+ interface LogSink {
16
+ id: string;
17
+ levels: LogLevel[];
18
+ scopes?: string[];
19
+ write(entry: LogEntry): void;
20
+ }
21
+ interface Logger {
22
+ debug(message: string, data?: Record<string, unknown>): void;
23
+ info(message: string, data?: Record<string, unknown>): void;
24
+ warn(message: string, data?: Record<string, unknown>): void;
25
+ error(message: string, data?: Record<string, unknown>): void;
26
+ createScope(name: string): Logger;
27
+ addSink(sink: LogSink): void;
28
+ removeSink(sinkId: string): void;
29
+ }
30
+
31
+ declare function createLogger(scope?: string): Logger;
32
+
33
+ interface ConsoleSinkOptions {
34
+ id?: string;
35
+ levels: LogLevel[];
36
+ scopes?: string[];
37
+ }
38
+ declare function consoleSink(options: ConsoleSinkOptions): LogSink;
39
+ interface CallbackSinkOptions {
40
+ id: string;
41
+ levels: LogLevel[];
42
+ scopes?: string[];
43
+ callback: (entry: LogEntry) => void;
44
+ }
45
+ declare function callbackSink(options: CallbackSinkOptions): LogSink;
46
+
47
+ declare function formatCurrency(amount: number, currencyCode: string, locale?: string): string;
48
+
49
+ interface CurrencyProviderProps {
50
+ currencyCode: string;
51
+ locale?: string;
52
+ children: ReactNode;
53
+ }
54
+ declare function CurrencyProvider({ currencyCode, locale, children }: CurrencyProviderProps): react_jsx_runtime.JSX.Element;
55
+ declare function useCurrencyFormatter(): (amount: number) => string;
56
+
57
+ interface TaxResult {
58
+ priceExclTax: number;
59
+ priceInclTax: number;
60
+ taxAmount: number;
61
+ }
62
+ type TaxRateMap = {
63
+ default: number;
64
+ [taxClass: string]: number;
65
+ };
66
+ interface TaxContext {
67
+ getTaxRate(taxClass?: string): number;
68
+ pricesIncludeTax: boolean;
69
+ }
70
+
71
+ declare function addTax(priceExclTax: number, rate: number): number;
72
+ declare function extractTax(priceInclTax: number, rate: number): number;
73
+ declare function calculateTax(price: number, rate: number, pricesIncludeTax: boolean): TaxResult;
74
+
75
+ interface TaxProviderProps {
76
+ rates: Record<string, number>;
77
+ pricesIncludeTax: boolean;
78
+ children: ReactNode;
79
+ }
80
+ declare function TaxProvider({ rates, pricesIncludeTax, children }: TaxProviderProps): react_jsx_runtime.JSX.Element;
81
+ declare function useTax(): TaxContext;
82
+
83
+ interface Repository<T> {
84
+ findById$(id: string): Observable<T | null>;
85
+ findAll$(query?: MangoQuery<T>): Observable<T[]>;
86
+ search$(term: string, fields: (keyof T)[]): Observable<T[]>;
87
+ count$(): Observable<number>;
88
+ create(data: Partial<T>): Promise<T>;
89
+ update(id: string, patch: Partial<T>): Promise<T>;
90
+ remove(id: string): Promise<void>;
91
+ bulkCreate(items: Partial<T>[]): Promise<T[]>;
92
+ bulkRemove(ids: string[]): Promise<void>;
93
+ }
94
+
95
+ declare function createRepository<T extends {
96
+ id: string;
97
+ }>(collection: RxCollection<T>): Repository<T>;
98
+
99
+ interface Order {
100
+ id: string;
101
+ status: 'draft' | 'parked' | 'saved' | 'completed';
102
+ lineItems: LineItem[];
103
+ discounts: AppliedDiscount[];
104
+ payments: Payment[];
105
+ customer: CustomerSummary | null;
106
+ note: string;
107
+ subtotal: number;
108
+ discountTotal: number;
109
+ taxTotal: number;
110
+ total: number;
111
+ balanceDue: number;
112
+ changeDue: number;
113
+ currency: string;
114
+ createdAt: string;
115
+ updatedAt: string;
116
+ }
117
+ interface LineItem {
118
+ id: string;
119
+ productId: string;
120
+ variantId?: string;
121
+ name: string;
122
+ sku: string;
123
+ imageUrl?: string;
124
+ price: number;
125
+ quantity: number;
126
+ taxRate: number;
127
+ taxAmount: number;
128
+ discounts: AppliedDiscount[];
129
+ discountAmount: number;
130
+ lineTotal: number;
131
+ }
132
+ interface Discount {
133
+ type: 'percentage' | 'fixed';
134
+ value: number;
135
+ label?: string;
136
+ couponCode?: string;
137
+ }
138
+ interface AppliedDiscount extends Discount {
139
+ id: string;
140
+ amount: number;
141
+ }
142
+ interface Payment {
143
+ id: string;
144
+ method: string;
145
+ amount: number;
146
+ reference?: string;
147
+ }
148
+ interface CustomerSummary {
149
+ id: string;
150
+ name: string;
151
+ email?: string;
152
+ }
153
+ interface PaymentMethod {
154
+ id: string;
155
+ label: string;
156
+ icon?: string;
157
+ requiresReference?: boolean;
158
+ }
159
+
160
+ interface OrderBuilderOptions {
161
+ currency: string;
162
+ taxContext: TaxContext;
163
+ id?: string;
164
+ }
165
+ interface OrderBuilder {
166
+ order$: Observable<Order>;
167
+ addProduct(doc: any, traits: ProductTraits, options?: {
168
+ variantId?: string;
169
+ quantity?: number;
170
+ }): string;
171
+ updateQuantity(lineId: string, quantity: number): void;
172
+ removeItem(lineId: string): void;
173
+ applyLineDiscount(lineId: string, discount: Discount): void;
174
+ applyOrderDiscount(discount: Discount): void;
175
+ removeDiscount(discountId: string): void;
176
+ addPayment(payment: Omit<Payment, 'id'>): string;
177
+ removePayment(paymentId: string): void;
178
+ setCustomer(customer: CustomerSummary | null): void;
179
+ setNote(note: string): void;
180
+ clear(): void;
181
+ getSnapshot(): Order;
182
+ }
183
+ declare function createOrderBuilder(options: OrderBuilderOptions): OrderBuilder;
184
+
185
+ interface ParkedOrderSummary {
186
+ id: string;
187
+ customerName?: string;
188
+ itemCount: number;
189
+ total: number;
190
+ parkedAt: string;
191
+ source: 'local' | 'server';
192
+ }
193
+ interface OrderManagerOptions {
194
+ currency: string;
195
+ taxContext: TaxContext;
196
+ draftsCollection: RxCollection;
197
+ }
198
+ interface OrderManager {
199
+ activeOrder$: Observable<OrderBuilder>;
200
+ parkedOrders$: Observable<ParkedOrderSummary[]>;
201
+ newOrder(): OrderBuilder;
202
+ parkCurrentOrder(): Promise<string>;
203
+ resumeOrder(orderId: string): Promise<OrderBuilder>;
204
+ deleteParkedOrder(orderId: string): Promise<void>;
205
+ }
206
+ declare function createOrderManager(options: OrderManagerOptions): OrderManager;
207
+
208
+ interface ReceiptLineItem {
209
+ name: string;
210
+ sku: string;
211
+ quantity: number;
212
+ unitPrice: number;
213
+ lineTotal: number;
214
+ }
215
+ interface ReceiptData {
216
+ header: {
217
+ storeName: string;
218
+ storeAddress?: string;
219
+ orderNumber: string;
220
+ date: string;
221
+ cashier?: string;
222
+ register?: string;
223
+ };
224
+ lineItems: ReceiptLineItem[];
225
+ discounts: {
226
+ label: string;
227
+ amount: number;
228
+ }[];
229
+ totals: {
230
+ subtotal: number;
231
+ discountTotal: number;
232
+ taxLines: {
233
+ label: string;
234
+ rate: number;
235
+ amount: number;
236
+ }[];
237
+ taxTotal: number;
238
+ total: number;
239
+ };
240
+ payments: {
241
+ method: string;
242
+ amount: number;
243
+ reference?: string;
244
+ }[];
245
+ changeDue: number;
246
+ footer: {
247
+ note?: string;
248
+ barcode?: string;
249
+ };
250
+ currency: string;
251
+ }
252
+ interface ReceiptConfig {
253
+ storeName: string;
254
+ storeAddress?: string;
255
+ cashier?: string;
256
+ register?: string;
257
+ taxLabels?: Record<number, string>;
258
+ }
259
+
260
+ declare function buildReceiptData(order: Order, config: ReceiptConfig): ReceiptData;
261
+
262
+ export { type AppliedDiscount, CurrencyProvider, type CurrencyProviderProps, type CustomerSummary, type Discount, type LineItem, type LogEntry, type LogLevel, type LogSink, type Logger, type Order, type OrderBuilder, type OrderBuilderOptions, type OrderManager, type OrderManagerOptions, type ParkedOrderSummary, type Payment, type PaymentMethod, type ReceiptConfig, type ReceiptData, type ReceiptLineItem, type Repository, type TaxContext, TaxProvider, type TaxProviderProps, type TaxRateMap, type TaxResult, addTax, buildReceiptData, calculateTax, callbackSink, consoleSink, createLogger, createOrderBuilder, createOrderManager, createRepository, extractTax, formatCurrency, useCurrencyFormatter, useTax };