persian-data-grid 0.5.0 → 0.7.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 (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-E5Q6FYDS.js +125 -0
  4. package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
  5. package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
  6. package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
  7. package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
  8. package/dist/GridPlugin-DewWufGZ.d.cts +57 -0
  9. package/dist/GridPresenceService-GEH6535Q.js +3 -0
  10. package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
  11. package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
  12. package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
  13. package/dist/GridSession-CeIfVFck.d.ts +2625 -0
  14. package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
  15. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  16. package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
  17. package/dist/GridSyncService-GECXGEKL.js +3 -0
  18. package/dist/GridSyncService-GECXGEKL.js.map +1 -0
  19. package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
  20. package/dist/PdfRenderer-bN7ca_Aj.d.ts +22 -0
  21. package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
  22. package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
  23. package/dist/SelectImpl-NM4O4IGW.js +447 -0
  24. package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
  25. package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
  26. package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
  27. package/dist/UITableController-C71LXBiX.d.ts +678 -0
  28. package/dist/UITableController-CIwnHIw8.d.cts +678 -0
  29. package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +89 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +62 -0
  34. package/dist/adapters/arian-erp.d.ts +62 -0
  35. package/dist/adapters/arian-erp.js +79 -0
  36. package/dist/adapters/arian-erp.js.map +1 -0
  37. package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
  38. package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
  39. package/dist/appendAtEnd-TJEABLGD.js +33 -0
  40. package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
  41. package/dist/applyImportedRows-C2fWYoPy.d.cts +135 -0
  42. package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
  44. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  45. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
  46. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.map +1 -0
  47. package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
  48. package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
  49. package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
  50. package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
  51. package/dist/callbackRemoteApi-BYLjmSI6.d.ts +51 -0
  52. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  53. package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
  54. package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
  55. package/dist/chunk-27ALJSZP.js +12187 -0
  56. package/dist/chunk-27ALJSZP.js.map +1 -0
  57. package/dist/chunk-3HP3HQCW.cjs +688 -0
  58. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  59. package/dist/chunk-3Y3KKGEC.js +3 -0
  60. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  61. package/dist/chunk-52LFOPXD.cjs +588 -0
  62. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  63. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  64. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  65. package/dist/chunk-5HKVMPBD.js +937 -0
  66. package/dist/chunk-5HKVMPBD.js.map +1 -0
  67. package/dist/chunk-72IVAOTK.cjs +38 -0
  68. package/dist/chunk-72IVAOTK.cjs.map +1 -0
  69. package/dist/chunk-77UXAJII.js +112 -0
  70. package/dist/chunk-77UXAJII.js.map +1 -0
  71. package/dist/chunk-7GWV5HGO.js +36 -0
  72. package/dist/chunk-7GWV5HGO.js.map +1 -0
  73. package/dist/chunk-7T6AWRPU.js +581 -0
  74. package/dist/chunk-7T6AWRPU.js.map +1 -0
  75. package/dist/chunk-AU3RDJYQ.js +243 -0
  76. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-CMQ4VLCW.cjs +840 -0
  80. package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
  81. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  82. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  83. package/dist/chunk-E2J533UH.cjs +53 -0
  84. package/dist/chunk-E2J533UH.cjs.map +1 -0
  85. package/dist/chunk-EBV6HGZB.cjs +33 -0
  86. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-F6EMC75A.cjs +34 -0
  90. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  91. package/dist/chunk-GKE33FOJ.js +32 -0
  92. package/dist/chunk-GKE33FOJ.js.map +1 -0
  93. package/dist/chunk-GQEDLUMB.js +168 -0
  94. package/dist/chunk-GQEDLUMB.js.map +1 -0
  95. package/dist/chunk-HLOHWFOA.js +645 -0
  96. package/dist/chunk-HLOHWFOA.js.map +1 -0
  97. package/dist/chunk-IMPCRWYP.cjs +251 -0
  98. package/dist/chunk-IMPCRWYP.cjs.map +1 -0
  99. package/dist/chunk-IPPIXOVQ.js +317 -0
  100. package/dist/chunk-IPPIXOVQ.js.map +1 -0
  101. package/dist/chunk-J4XJ4UBC.js +1404 -0
  102. package/dist/chunk-J4XJ4UBC.js.map +1 -0
  103. package/dist/chunk-J7CPPFXT.cjs +89 -0
  104. package/dist/chunk-J7CPPFXT.cjs.map +1 -0
  105. package/dist/chunk-JOICD47Q.cjs +41 -0
  106. package/dist/chunk-JOICD47Q.cjs.map +1 -0
  107. package/dist/chunk-KCNTKYUY.js +206 -0
  108. package/dist/chunk-KCNTKYUY.js.map +1 -0
  109. package/dist/chunk-KHMG6EI2.js +13 -0
  110. package/dist/chunk-KHMG6EI2.js.map +1 -0
  111. package/dist/chunk-KMRURD5J.cjs +15 -0
  112. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  113. package/dist/chunk-KRJG3KMP.cjs +174 -0
  114. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  115. package/dist/chunk-LY27YAXE.cjs +208 -0
  116. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  117. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  118. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  119. package/dist/chunk-MUQQKPWR.js +84 -0
  120. package/dist/chunk-MUQQKPWR.js.map +1 -0
  121. package/dist/chunk-N7SJTINL.cjs +4 -0
  122. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  123. package/dist/chunk-NB5GCGHL.js +833 -0
  124. package/dist/chunk-NB5GCGHL.js.map +1 -0
  125. package/dist/chunk-NQUVAJQA.js +298 -0
  126. package/dist/chunk-NQUVAJQA.js.map +1 -0
  127. package/dist/chunk-NTV2UUAJ.cjs +149 -0
  128. package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
  129. package/dist/chunk-PJQWHF6T.js +31 -0
  130. package/dist/chunk-PJQWHF6T.js.map +1 -0
  131. package/dist/chunk-PQY54EL5.js +248 -0
  132. package/dist/chunk-PQY54EL5.js.map +1 -0
  133. package/dist/chunk-Q7TBBUTX.cjs +110 -0
  134. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  135. package/dist/chunk-QZN7R2WP.cjs +114 -0
  136. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  137. package/dist/chunk-RKVSJU46.js +35 -0
  138. package/dist/chunk-RKVSJU46.js.map +1 -0
  139. package/dist/chunk-SVO62ZV2.js +50 -0
  140. package/dist/chunk-SVO62ZV2.js.map +1 -0
  141. package/dist/chunk-SX4VQXAA.cjs +114 -0
  142. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  143. package/dist/chunk-SZ7BLAY3.js +92 -0
  144. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  145. package/dist/chunk-TN4MG6FY.js +112 -0
  146. package/dist/chunk-TN4MG6FY.js.map +1 -0
  147. package/dist/chunk-UC7PHDM6.cjs +331 -0
  148. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  149. package/dist/chunk-UXVLYUUW.js +108 -0
  150. package/dist/chunk-UXVLYUUW.js.map +1 -0
  151. package/dist/chunk-VBAZ77Q4.js +932 -0
  152. package/dist/chunk-VBAZ77Q4.js.map +1 -0
  153. package/dist/chunk-VSAFQTW5.cjs +319 -0
  154. package/dist/chunk-VSAFQTW5.cjs.map +1 -0
  155. package/dist/chunk-VYJQ2HTA.cjs +936 -0
  156. package/dist/chunk-VYJQ2HTA.cjs.map +1 -0
  157. package/dist/chunk-W5256BJ4.js +56 -0
  158. package/dist/chunk-W5256BJ4.js.map +1 -0
  159. package/dist/chunk-WTHTVKVI.cjs +12299 -0
  160. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  161. package/dist/chunk-WUMOSOEK.cjs +62 -0
  162. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  163. package/dist/chunk-XLRE2J25.js +140 -0
  164. package/dist/chunk-XLRE2J25.js.map +1 -0
  165. package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
  166. package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
  167. package/dist/createEngineGridQuery-BBkud5oE.d.ts +939 -0
  168. package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -0
  169. package/dist/date-picker-jalali.cjs +263 -0
  170. package/dist/date-picker-jalali.cjs.map +1 -0
  171. package/dist/date-picker-jalali.d.cts +62 -0
  172. package/dist/date-picker-jalali.d.ts +62 -0
  173. package/dist/date-picker-jalali.js +256 -0
  174. package/dist/date-picker-jalali.js.map +1 -0
  175. package/dist/finance.cjs +205 -0
  176. package/dist/finance.cjs.map +1 -0
  177. package/dist/finance.d.cts +90 -0
  178. package/dist/finance.d.ts +90 -0
  179. package/dist/finance.js +157 -0
  180. package/dist/finance.js.map +1 -0
  181. package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
  182. package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
  183. package/dist/foldedColumn-TFURUKFG.js +64 -0
  184. package/dist/foldedColumn-TFURUKFG.js.map +1 -0
  185. package/dist/headless.cjs +729 -0
  186. package/dist/headless.cjs.map +1 -0
  187. package/dist/headless.d.cts +508 -0
  188. package/dist/headless.d.ts +508 -0
  189. package/dist/headless.js +226 -0
  190. package/dist/headless.js.map +1 -0
  191. package/dist/index-DN8M8Jkq.d.cts +14 -0
  192. package/dist/index-DmzL-F_o.d.ts +14 -0
  193. package/dist/index.cjs +8060 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +457 -2305
  196. package/dist/index.d.ts +457 -2305
  197. package/dist/index.js +7302 -11084
  198. package/dist/index.js.map +1 -1
  199. package/dist/locales/ar.cjs +12 -0
  200. package/dist/locales/ar.cjs.map +1 -0
  201. package/dist/locales/ar.d.cts +6 -0
  202. package/dist/locales/ar.d.ts +6 -0
  203. package/dist/locales/ar.js +3 -0
  204. package/dist/locales/ar.js.map +1 -0
  205. package/dist/locales/en.cjs +12 -0
  206. package/dist/locales/en.cjs.map +1 -0
  207. package/dist/locales/en.d.cts +6 -0
  208. package/dist/locales/en.d.ts +6 -0
  209. package/dist/locales/en.js +3 -0
  210. package/dist/locales/en.js.map +1 -0
  211. package/dist/locales/fa.cjs +12 -0
  212. package/dist/locales/fa.cjs.map +1 -0
  213. package/dist/locales/fa.d.cts +6 -0
  214. package/dist/locales/fa.d.ts +6 -0
  215. package/dist/locales/fa.js +3 -0
  216. package/dist/locales/fa.js.map +1 -0
  217. package/dist/locales/index.cjs +51 -0
  218. package/dist/locales/index.cjs.map +1 -0
  219. package/dist/locales/index.d.cts +5 -0
  220. package/dist/locales/index.d.ts +5 -0
  221. package/dist/locales/index.js +6 -0
  222. package/dist/locales/index.js.map +1 -0
  223. package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
  224. package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
  225. package/dist/memoryRecords-OJTGXLRH.js +47 -0
  226. package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
  227. package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
  228. package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
  229. package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
  230. package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
  231. package/dist/pagedKit-MFGAJFSK.cjs +134 -0
  232. package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
  233. package/dist/pagedKit-WYWY4LRV.js +127 -0
  234. package/dist/pagedKit-WYWY4LRV.js.map +1 -0
  235. package/dist/pagedSearch-HCPJW7VM.js +38 -0
  236. package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
  237. package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
  238. package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
  239. package/dist/plugins/csv.cjs +124 -0
  240. package/dist/plugins/csv.cjs.map +1 -0
  241. package/dist/plugins/csv.d.cts +44 -0
  242. package/dist/plugins/csv.d.ts +44 -0
  243. package/dist/plugins/csv.js +120 -0
  244. package/dist/plugins/csv.js.map +1 -0
  245. package/dist/plugins/excel.cjs +52 -0
  246. package/dist/plugins/excel.cjs.map +1 -0
  247. package/dist/plugins/excel.d.cts +14 -0
  248. package/dist/plugins/excel.d.ts +14 -0
  249. package/dist/plugins/excel.js +7 -0
  250. package/dist/plugins/excel.js.map +1 -0
  251. package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
  252. package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
  253. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
  254. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
  255. package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
  256. package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
  257. package/dist/plugins/pdf.cjs +24 -0
  258. package/dist/plugins/pdf.cjs.map +1 -0
  259. package/dist/plugins/pdf.d.cts +21 -0
  260. package/dist/plugins/pdf.d.ts +21 -0
  261. package/dist/plugins/pdf.js +7 -0
  262. package/dist/plugins/pdf.js.map +1 -0
  263. package/dist/presence.cjs +56 -0
  264. package/dist/presence.cjs.map +1 -0
  265. package/dist/presence.d.cts +17 -0
  266. package/dist/presence.d.ts +17 -0
  267. package/dist/presence.js +54 -0
  268. package/dist/presence.js.map +1 -0
  269. package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
  270. package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
  271. package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
  272. package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
  273. package/dist/styles.css +1440 -0
  274. package/dist/sync.cjs +148 -0
  275. package/dist/sync.cjs.map +1 -0
  276. package/dist/sync.d.cts +17 -0
  277. package/dist/sync.d.ts +17 -0
  278. package/dist/sync.js +146 -0
  279. package/dist/sync.js.map +1 -0
  280. package/dist/types-D__47BKv.d.cts +23 -0
  281. package/dist/types-D__47BKv.d.ts +23 -0
  282. package/package.json +185 -29
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Iranian money units (PR-140).
3
+ * Canonical storage is integer **rials** (same convention as `toMinorUnits`).
4
+ * 1 toman = 10 rials.
5
+ */
6
+ type CurrencyUnit = 'rial' | 'toman';
7
+ declare const RIALS_PER_TOMAN = 10;
8
+ declare function rialToToman(rial: number): number;
9
+ declare function tomanToRial(toman: number): number;
10
+ declare function convertCurrency(amount: number, from: CurrencyUnit, to: CurrencyUnit): number;
11
+ type FormatPriceOptions = {
12
+ /** Unit of the numeric `amount` argument. Default `rial`. */
13
+ unit?: CurrencyUnit;
14
+ /** Unit shown in the label suffix. Defaults to `unit`. */
15
+ displayUnit?: CurrencyUnit;
16
+ /** Append unit label (`ریال` / `تومان`). Default true. */
17
+ withLabel?: boolean;
18
+ /** Use Persian digits via Intl. Default true. */
19
+ persianDigits?: boolean;
20
+ locale?: string;
21
+ };
22
+ /**
23
+ * Format a money amount. Converts when `unit` ≠ `displayUnit`.
24
+ * Values are truncated to integers before conversion.
25
+ */
26
+ declare function formatPrice(amount: number, options?: FormatPriceOptions): string;
27
+
28
+ /**
29
+ * Integer → Persian words for document printing (PR-140).
30
+ * Covers non-negative integers up to 10^15 − 1 (تریلیون scale).
31
+ */
32
+ type NumberToPersianWordsOptions = {
33
+ /** Append currency word (`ریال` / `تومان`). */
34
+ currency?: 'rial' | 'toman';
35
+ /** Prefix for negative numbers. Default `منفی`. */
36
+ negativeWord?: string;
37
+ };
38
+ /**
39
+ * Convert an integer (or truncatable number) to Persian words.
40
+ * Fractional parts are truncated toward zero.
41
+ */
42
+ declare function numberToPersianWords(value: number | bigint, options?: NumberToPersianWordsOptions): string;
43
+
44
+ /**
45
+ * Iranian financial (fiscal) periods on the Jalali calendar (PR-140).
46
+ * Iranian FY = 1 Farvardin … 29/30 Esfand of the same Jalali year.
47
+ */
48
+ type FinancialPeriod = {
49
+ /** e.g. `fy-1404` */
50
+ id: string;
51
+ /** e.g. `سال مالی ۱۴۰۴` */
52
+ label: string;
53
+ /** Jalali year of the period */
54
+ jalaliYear: number;
55
+ start: Date;
56
+ end: Date;
57
+ };
58
+ /** Jalali year that owns this civil date for Iranian FY purposes. */
59
+ declare function jalaliFinancialYear(date: Date): number;
60
+ declare function financialPeriodForYear(jalaliYear: number): FinancialPeriod;
61
+ declare function financialPeriodForDate(date: Date): FinancialPeriod;
62
+ declare function listFinancialPeriods(fromJalaliYear: number, toJalaliYear: number): FinancialPeriod[];
63
+ declare function isInFinancialPeriod(date: Date, period: FinancialPeriod): boolean;
64
+ /** Inclusive list of month starts (1 … 12) for a FY. */
65
+ declare function financialMonths(jalaliYear: number): Date[];
66
+
67
+ /**
68
+ * Iranian official holidays (Jalali fixed dates) (PR-140).
69
+ * Lunar/Islamic moveable holidays can be merged via `extra`.
70
+ */
71
+ type IranHoliday = {
72
+ /** Jalali month 1–12 */
73
+ jm: number;
74
+ /** Jalali day */
75
+ jd: number;
76
+ title: string;
77
+ /** When set, holiday applies only to that Jalali year */
78
+ jy?: number;
79
+ };
80
+ /** Civil / solar fixed holidays observed every Jalali year. */
81
+ declare const IRAN_FIXED_HOLIDAYS: readonly IranHoliday[];
82
+ declare function iranHolidaysForYear(jalaliYear: number, extra?: readonly IranHoliday[]): Array<IranHoliday & {
83
+ date: Date;
84
+ }>;
85
+ declare function isIranHoliday(date: Date, extra?: readonly IranHoliday[]): boolean;
86
+ declare function holidayTitle(date: Date, extra?: readonly IranHoliday[]): string | null;
87
+ /** Skip Fridays (Iran weekend) and holidays; returns next open day. */
88
+ declare function nextBusinessDay(date: Date, extra?: readonly IranHoliday[]): Date;
89
+
90
+ export { type CurrencyUnit, type FinancialPeriod, type FormatPriceOptions, IRAN_FIXED_HOLIDAYS, type IranHoliday, type NumberToPersianWordsOptions, RIALS_PER_TOMAN, convertCurrency, financialMonths, financialPeriodForDate, financialPeriodForYear, formatPrice, holidayTitle, iranHolidaysForYear, isInFinancialPeriod, isIranHoliday, jalaliFinancialYear, listFinancialPeriods, nextBusinessDay, numberToPersianWords, rialToToman, tomanToRial };
@@ -0,0 +1,157 @@
1
+ export { IRAN_FIXED_HOLIDAYS, holidayTitle, iranHolidaysForYear, isIranHoliday, nextBusinessDay } from './chunk-W5256BJ4.js';
2
+ export { RIALS_PER_TOMAN, convertCurrency, formatPrice, rialToToman, tomanToRial } from './chunk-RKVSJU46.js';
3
+ import { gregorianDateToJalali, jalaliToGregorianDate, jalaliMonthLength } from './chunk-GQEDLUMB.js';
4
+ import './chunk-AU3RDJYQ.js';
5
+
6
+ // infrastructure/finance/numberToPersianWords.ts
7
+ var ONES = [
8
+ "",
9
+ "\u06CC\u06A9",
10
+ "\u062F\u0648",
11
+ "\u0633\u0647",
12
+ "\u0686\u0647\u0627\u0631",
13
+ "\u067E\u0646\u062C",
14
+ "\u0634\u0634",
15
+ "\u0647\u0641\u062A",
16
+ "\u0647\u0634\u062A",
17
+ "\u0646\u0647",
18
+ "\u062F\u0647",
19
+ "\u06CC\u0627\u0632\u062F\u0647",
20
+ "\u062F\u0648\u0627\u0632\u062F\u0647",
21
+ "\u0633\u06CC\u0632\u062F\u0647",
22
+ "\u0686\u0647\u0627\u0631\u062F\u0647",
23
+ "\u067E\u0627\u0646\u0632\u062F\u0647",
24
+ "\u0634\u0627\u0646\u0632\u062F\u0647",
25
+ "\u0647\u0641\u062F\u0647",
26
+ "\u0647\u062C\u062F\u0647",
27
+ "\u0646\u0648\u0632\u062F\u0647"
28
+ ];
29
+ var TENS = [
30
+ "",
31
+ "",
32
+ "\u0628\u06CC\u0633\u062A",
33
+ "\u0633\u06CC",
34
+ "\u0686\u0647\u0644",
35
+ "\u067E\u0646\u062C\u0627\u0647",
36
+ "\u0634\u0635\u062A",
37
+ "\u0647\u0641\u062A\u0627\u062F",
38
+ "\u0647\u0634\u062A\u0627\u062F",
39
+ "\u0646\u0648\u062F"
40
+ ];
41
+ var HUNDREDS = [
42
+ "",
43
+ "\u0635\u062F",
44
+ "\u062F\u0648\u06CC\u0633\u062A",
45
+ "\u0633\u06CC\u0635\u062F",
46
+ "\u0686\u0647\u0627\u0631\u0635\u062F",
47
+ "\u067E\u0627\u0646\u0635\u062F",
48
+ "\u0634\u0634\u0635\u062F",
49
+ "\u0647\u0641\u062A\u0635\u062F",
50
+ "\u0647\u0634\u062A\u0635\u062F",
51
+ "\u0646\u0647\u0635\u062F"
52
+ ];
53
+ var SCALES = ["", "\u0647\u0632\u0627\u0631", "\u0645\u06CC\u0644\u06CC\u0648\u0646", "\u0645\u06CC\u0644\u06CC\u0627\u0631\u062F", "\u062A\u0631\u06CC\u0644\u06CC\u0648\u0646"];
54
+ function joinAnd(parts) {
55
+ return parts.filter(Boolean).join(" \u0648 ");
56
+ }
57
+ function underThousand(n) {
58
+ if (n <= 0) return "";
59
+ if (n < 20) return ONES[n];
60
+ if (n < 100) {
61
+ const ten = Math.floor(n / 10);
62
+ const one = n % 10;
63
+ return joinAnd([TENS[ten], ONES[one]]);
64
+ }
65
+ const hundred = Math.floor(n / 100);
66
+ const rest = n % 100;
67
+ return joinAnd([HUNDREDS[hundred], underThousand(rest)]);
68
+ }
69
+ function numberToPersianWords(value, options = {}) {
70
+ let n;
71
+ if (typeof value === "bigint") {
72
+ n = value;
73
+ } else {
74
+ if (!Number.isFinite(value)) return "";
75
+ n = BigInt(Math.trunc(value));
76
+ }
77
+ const negative = n < 0n;
78
+ if (negative) n = -n;
79
+ let words;
80
+ if (n === 0n) {
81
+ words = "\u0635\u0641\u0631";
82
+ } else {
83
+ const chunks = [];
84
+ let scale = 0;
85
+ let remaining = n;
86
+ while (remaining > 0n && scale < SCALES.length) {
87
+ const chunk = Number(remaining % 1000n);
88
+ remaining /= 1000n;
89
+ if (chunk > 0) {
90
+ const body = underThousand(chunk);
91
+ const scaleWord = SCALES[scale];
92
+ chunks.unshift(scaleWord ? `${body} ${scaleWord}` : body);
93
+ }
94
+ scale += 1;
95
+ }
96
+ if (remaining > 0n) {
97
+ words = n.toString();
98
+ } else {
99
+ words = joinAnd(chunks);
100
+ }
101
+ }
102
+ if (negative) {
103
+ words = `${options.negativeWord ?? "\u0645\u0646\u0641\u06CC"} ${words}`;
104
+ }
105
+ if (options.currency === "rial") return `${words} \u0631\u06CC\u0627\u0644`;
106
+ if (options.currency === "toman") return `${words} \u062A\u0648\u0645\u0627\u0646`;
107
+ return words;
108
+ }
109
+
110
+ // infrastructure/finance/financialPeriods.ts
111
+ function utcDay(date) {
112
+ return new Date(
113
+ Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12)
114
+ );
115
+ }
116
+ function jalaliFinancialYear(date) {
117
+ return gregorianDateToJalali(utcDay(date)).jy;
118
+ }
119
+ function financialPeriodForYear(jalaliYear) {
120
+ const start = jalaliToGregorianDate(jalaliYear, 1, 1);
121
+ const lastDay = jalaliMonthLength(jalaliYear, 12);
122
+ const end = jalaliToGregorianDate(jalaliYear, 12, lastDay);
123
+ return {
124
+ id: `fy-${jalaliYear}`,
125
+ label: `\u0633\u0627\u0644 \u0645\u0627\u0644\u06CC ${jalaliYear}`,
126
+ jalaliYear,
127
+ start,
128
+ end
129
+ };
130
+ }
131
+ function financialPeriodForDate(date) {
132
+ return financialPeriodForYear(jalaliFinancialYear(date));
133
+ }
134
+ function listFinancialPeriods(fromJalaliYear, toJalaliYear) {
135
+ const from = Math.min(fromJalaliYear, toJalaliYear);
136
+ const to = Math.max(fromJalaliYear, toJalaliYear);
137
+ const out = [];
138
+ for (let y = from; y <= to; y += 1) {
139
+ out.push(financialPeriodForYear(y));
140
+ }
141
+ return out;
142
+ }
143
+ function isInFinancialPeriod(date, period) {
144
+ const t = utcDay(date).getTime();
145
+ return t >= period.start.getTime() && t <= period.end.getTime();
146
+ }
147
+ function financialMonths(jalaliYear) {
148
+ const months = [];
149
+ for (let m = 1; m <= 12; m += 1) {
150
+ months.push(jalaliToGregorianDate(jalaliYear, m, 1));
151
+ }
152
+ return months;
153
+ }
154
+
155
+ export { financialMonths, financialPeriodForDate, financialPeriodForYear, isInFinancialPeriod, jalaliFinancialYear, listFinancialPeriods, numberToPersianWords };
156
+ //# sourceMappingURL=finance.js.map
157
+ //# sourceMappingURL=finance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/finance/numberToPersianWords.ts","../infrastructure/finance/financialPeriods.ts"],"names":[],"mappings":";;;;;;AAKA,IAAM,IAAA,GAAO;AAAA,EACX,EAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gCAAA;AAAA,EACA,sCAAA;AAAA,EACA,gCAAA;AAAA,EACA,sCAAA;AAAA,EACA,sCAAA;AAAA,EACA,sCAAA;AAAA,EACA,0BAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,IAAA,GAAO;AAAA,EACX,EAAA;AAAA,EACA,EAAA;AAAA,EACA,0BAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,gCAAA;AAAA,EACA,oBAAA;AAAA,EACA,gCAAA;AAAA,EACA,gCAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,QAAA,GAAW;AAAA,EACf,EAAA;AAAA,EACA,cAAA;AAAA,EACA,gCAAA;AAAA,EACA,0BAAA;AAAA,EACA,sCAAA;AAAA,EACA,gCAAA;AAAA,EACA,0BAAA;AAAA,EACA,gCAAA;AAAA,EACA,gCAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,SAAS,CAAC,EAAA,EAAI,0BAAA,EAAQ,sCAAA,EAAU,8CAAW,4CAAS,CAAA;AAE1D,SAAS,QAAQ,KAAA,EAAyB;AACxC,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,UAAK,CAAA;AACzC;AAEA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,IAAI,CAAA,IAAK,GAAG,OAAO,EAAA;AACnB,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,IAAA,CAAK,CAAC,CAAA;AACzB,EAAA,IAAI,IAAI,GAAA,EAAK;AACX,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,MAAM,CAAA,GAAI,EAAA;AAChB,IAAA,OAAO,OAAA,CAAQ,CAAC,IAAA,CAAK,GAAG,GAAI,IAAA,CAAK,GAAG,CAAE,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAClC,EAAA,MAAM,OAAO,CAAA,GAAI,GAAA;AACjB,EAAA,OAAO,OAAA,CAAQ,CAAC,QAAA,CAAS,OAAO,GAAI,aAAA,CAAc,IAAI,CAAC,CAAC,CAAA;AAC1D;AAaO,SAAS,oBAAA,CACd,KAAA,EACA,OAAA,GAAuC,EAAC,EAChC;AACR,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,CAAA,GAAI,KAAA;AAAA,EACN,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,EAAA;AACpC,IAAA,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,WAAW,CAAA,GAAI,EAAA;AACrB,EAAA,IAAI,QAAA,MAAc,CAAC,CAAA;AAEnB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,KAAA,GAAQ,oBAAA;AAAA,EACV,CAAA,MAAO;AACL,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,OAAO,SAAA,GAAY,EAAA,IAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ;AAC9C,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,GAAY,KAAK,CAAA;AACtC,MAAA,SAAA,IAAa,KAAA;AACb,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,QAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,KAAK,IAAI,CAAA;AAAA,MAC1D;AACA,MAAA,KAAA,IAAS,CAAA;AAAA,IACX;AACA,IAAA,IAAI,YAAY,EAAA,EAAI;AAElB,MAAA,KAAA,GAAQ,EAAE,QAAA,EAAS;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,GAAQ,CAAA,EAAG,OAAA,CAAQ,YAAA,IAAgB,0BAAM,IAAI,KAAK,CAAA,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAQ,OAAO,GAAG,KAAK,CAAA,yBAAA,CAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,GAAG,KAAK,CAAA,+BAAA,CAAA;AACjD,EAAA,OAAO,KAAA;AACT;;;AC7GA,SAAS,OAAO,IAAA,EAAkB;AAChC,EAAA,OAAO,IAAI,IAAA;AAAA,IACT,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,cAAA,EAAe,EAAG,IAAA,CAAK,WAAA,EAAY,EAAG,IAAA,CAAK,UAAA,EAAW,EAAG,EAAE;AAAA,GAC3E;AACF;AAGO,SAAS,oBAAoB,IAAA,EAAoB;AACtD,EAAA,OAAO,qBAAA,CAAsB,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,EAAA;AAC7C;AAEO,SAAS,uBAAuB,UAAA,EAAqC;AAC1E,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,UAAA,EAAY,EAAE,CAAA;AAChD,EAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,UAAA,EAAY,EAAA,EAAI,OAAO,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAM,UAAU,CAAA,CAAA;AAAA,IACpB,KAAA,EAAO,+CAAY,UAAU,CAAA,CAAA;AAAA,IAC7B,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,uBAAuB,IAAA,EAA6B;AAClE,EAAA,OAAO,sBAAA,CAAuB,mBAAA,CAAoB,IAAI,CAAC,CAAA;AACzD;AAEO,SAAS,oBAAA,CACd,gBACA,YAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,YAAY,CAAA;AAClD,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,YAAY,CAAA;AAChD,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,EAAA,EAAI,KAAK,CAAA,EAAG;AAClC,IAAA,GAAA,CAAI,IAAA,CAAK,sBAAA,CAAuB,CAAC,CAAC,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,mBAAA,CACd,MACA,MAAA,EACS;AACT,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,CAAE,OAAA,EAAQ;AAC/B,EAAA,OAAO,CAAA,IAAK,OAAO,KAAA,CAAM,OAAA,MAAa,CAAA,IAAK,MAAA,CAAO,IAAI,OAAA,EAAQ;AAChE;AAGO,SAAS,gBAAgB,UAAA,EAA4B;AAC1D,EAAA,MAAM,SAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,EAAA,EAAI,KAAK,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,qBAAA,CAAsB,UAAA,EAAY,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,MAAA;AACT","file":"finance.js","sourcesContent":["/**\r\n * Integer → Persian words for document printing (PR-140).\r\n * Covers non-negative integers up to 10^15 − 1 (تریلیون scale).\r\n */\r\n\r\nconst ONES = [\r\n '',\r\n 'یک',\r\n 'دو',\r\n 'سه',\r\n 'چهار',\r\n 'پنج',\r\n 'شش',\r\n 'هفت',\r\n 'هشت',\r\n 'نه',\r\n 'ده',\r\n 'یازده',\r\n 'دوازده',\r\n 'سیزده',\r\n 'چهارده',\r\n 'پانزده',\r\n 'شانزده',\r\n 'هفده',\r\n 'هجده',\r\n 'نوزده',\r\n];\r\n\r\nconst TENS = [\r\n '',\r\n '',\r\n 'بیست',\r\n 'سی',\r\n 'چهل',\r\n 'پنجاه',\r\n 'شصت',\r\n 'هفتاد',\r\n 'هشتاد',\r\n 'نود',\r\n];\r\n\r\nconst HUNDREDS = [\r\n '',\r\n 'صد',\r\n 'دویست',\r\n 'سیصد',\r\n 'چهارصد',\r\n 'پانصد',\r\n 'ششصد',\r\n 'هفتصد',\r\n 'هشتصد',\r\n 'نهصد',\r\n];\r\n\r\nconst SCALES = ['', 'هزار', 'میلیون', 'میلیارد', 'تریلیون'] as const;\r\n\r\nfunction joinAnd(parts: string[]): string {\r\n return parts.filter(Boolean).join(' و ');\r\n}\r\n\r\nfunction underThousand(n: number): string {\r\n if (n <= 0) return '';\r\n if (n < 20) return ONES[n]!;\r\n if (n < 100) {\r\n const ten = Math.floor(n / 10);\r\n const one = n % 10;\r\n return joinAnd([TENS[ten]!, ONES[one]!]);\r\n }\r\n const hundred = Math.floor(n / 100);\r\n const rest = n % 100;\r\n return joinAnd([HUNDREDS[hundred]!, underThousand(rest)]);\r\n}\r\n\r\nexport type NumberToPersianWordsOptions = {\r\n /** Append currency word (`ریال` / `تومان`). */\r\n currency?: 'rial' | 'toman';\r\n /** Prefix for negative numbers. Default `منفی`. */\r\n negativeWord?: string;\r\n};\r\n\r\n/**\r\n * Convert an integer (or truncatable number) to Persian words.\r\n * Fractional parts are truncated toward zero.\r\n */\r\nexport function numberToPersianWords(\r\n value: number | bigint,\r\n options: NumberToPersianWordsOptions = {},\r\n): string {\r\n let n: bigint;\r\n if (typeof value === 'bigint') {\r\n n = value;\r\n } else {\r\n if (!Number.isFinite(value)) return '';\r\n n = BigInt(Math.trunc(value));\r\n }\r\n\r\n const negative = n < 0n;\r\n if (negative) n = -n;\r\n\r\n let words: string;\r\n if (n === 0n) {\r\n words = 'صفر';\r\n } else {\r\n const chunks: string[] = [];\r\n let scale = 0;\r\n let remaining = n;\r\n while (remaining > 0n && scale < SCALES.length) {\r\n const chunk = Number(remaining % 1000n);\r\n remaining /= 1000n;\r\n if (chunk > 0) {\r\n const body = underThousand(chunk);\r\n const scaleWord = SCALES[scale]!;\r\n chunks.unshift(scaleWord ? `${body} ${scaleWord}` : body);\r\n }\r\n scale += 1;\r\n }\r\n if (remaining > 0n) {\r\n // Beyond documented range — fall back to digit string\r\n words = n.toString();\r\n } else {\r\n words = joinAnd(chunks);\r\n }\r\n }\r\n\r\n if (negative) {\r\n words = `${options.negativeWord ?? 'منفی'} ${words}`;\r\n }\r\n\r\n if (options.currency === 'rial') return `${words} ریال`;\r\n if (options.currency === 'toman') return `${words} تومان`;\r\n return words;\r\n}\r\n","/**\r\n * Iranian financial (fiscal) periods on the Jalali calendar (PR-140).\r\n * Iranian FY = 1 Farvardin … 29/30 Esfand of the same Jalali year.\r\n */\r\n\r\nimport {\r\n gregorianDateToJalali,\r\n jalaliMonthLength,\r\n jalaliToGregorianDate,\r\n} from '../date/jalaliMath';\r\n\r\nexport type FinancialPeriod = {\r\n /** e.g. `fy-1404` */\r\n id: string;\r\n /** e.g. `سال مالی ۱۴۰۴` */\r\n label: string;\r\n /** Jalali year of the period */\r\n jalaliYear: number;\r\n start: Date;\r\n end: Date;\r\n};\r\n\r\nfunction utcDay(date: Date): Date {\r\n return new Date(\r\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 12),\r\n );\r\n}\r\n\r\n/** Jalali year that owns this civil date for Iranian FY purposes. */\r\nexport function jalaliFinancialYear(date: Date): number {\r\n return gregorianDateToJalali(utcDay(date)).jy;\r\n}\r\n\r\nexport function financialPeriodForYear(jalaliYear: number): FinancialPeriod {\r\n const start = jalaliToGregorianDate(jalaliYear, 1, 1);\r\n const lastDay = jalaliMonthLength(jalaliYear, 12);\r\n const end = jalaliToGregorianDate(jalaliYear, 12, lastDay);\r\n return {\r\n id: `fy-${jalaliYear}`,\r\n label: `سال مالی ${jalaliYear}`,\r\n jalaliYear,\r\n start,\r\n end,\r\n };\r\n}\r\n\r\nexport function financialPeriodForDate(date: Date): FinancialPeriod {\r\n return financialPeriodForYear(jalaliFinancialYear(date));\r\n}\r\n\r\nexport function listFinancialPeriods(\r\n fromJalaliYear: number,\r\n toJalaliYear: number,\r\n): FinancialPeriod[] {\r\n const from = Math.min(fromJalaliYear, toJalaliYear);\r\n const to = Math.max(fromJalaliYear, toJalaliYear);\r\n const out: FinancialPeriod[] = [];\r\n for (let y = from; y <= to; y += 1) {\r\n out.push(financialPeriodForYear(y));\r\n }\r\n return out;\r\n}\r\n\r\nexport function isInFinancialPeriod(\r\n date: Date,\r\n period: FinancialPeriod,\r\n): boolean {\r\n const t = utcDay(date).getTime();\r\n return t >= period.start.getTime() && t <= period.end.getTime();\r\n}\r\n\r\n/** Inclusive list of month starts (1 … 12) for a FY. */\r\nexport function financialMonths(jalaliYear: number): Date[] {\r\n const months: Date[] = [];\r\n for (let m = 1; m <= 12; m += 1) {\r\n months.push(jalaliToGregorianDate(jalaliYear, m, 1));\r\n }\r\n return months;\r\n}\r\n"]}
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ // infrastructure/Repositories/paged/foldedColumn.ts
4
+ function foldColumnSubscription(args) {
5
+ const { subscribe, iterate, reducer, seed, cb, onError } = args;
6
+ const mixHash = (h1, h2, token) => {
7
+ for (let i = 0; i < token.length; i++) {
8
+ const c = token.charCodeAt(i);
9
+ h1 = Math.imul(h1 ^ c, 16777619) >>> 0;
10
+ h2 = Math.imul(h2 ^ c, 2654435761) >>> 0;
11
+ }
12
+ return [h1, h2];
13
+ };
14
+ let cancelled = false;
15
+ let prev = "";
16
+ let inFlight = false;
17
+ let pending = false;
18
+ const notify = async () => {
19
+ if (cancelled) return;
20
+ if (inFlight) {
21
+ pending = true;
22
+ return;
23
+ }
24
+ inFlight = true;
25
+ try {
26
+ let acc = seed;
27
+ let hash = [2166136261, 5381];
28
+ let sawAny = false;
29
+ await iterate((item) => {
30
+ sawAny = true;
31
+ acc = reducer(acc, item);
32
+ hash = mixHash(
33
+ hash[0],
34
+ hash[1],
35
+ `${item.id}:${String(item.rowNum)}:${String(item.value)}`
36
+ );
37
+ });
38
+ if (cancelled) return;
39
+ const sig = sawAny ? `${hash[0]}:${hash[1]}` : "empty";
40
+ if (sig !== prev) {
41
+ prev = sig;
42
+ cb(acc);
43
+ }
44
+ } catch (e) {
45
+ onError?.(e);
46
+ } finally {
47
+ inFlight = false;
48
+ if (pending && !cancelled) {
49
+ pending = false;
50
+ void notify();
51
+ }
52
+ }
53
+ };
54
+ const unsubscribe = subscribe(() => {
55
+ void notify();
56
+ });
57
+ void notify();
58
+ return () => {
59
+ cancelled = true;
60
+ unsubscribe?.();
61
+ };
62
+ }
63
+
64
+ exports.foldColumnSubscription = foldColumnSubscription;
65
+ //# sourceMappingURL=foldedColumn-IHDT4ARZ.cjs.map
66
+ //# sourceMappingURL=foldedColumn-IHDT4ARZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/Repositories/paged/foldedColumn.ts"],"names":[],"mappings":";;;AAMO,SAAS,uBAA0B,IAAA,EAS3B;AACb,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,SAAS,IAAA,EAAM,EAAA,EAAI,SAAQ,GAAI,IAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAY,EAAA,EAAY,KAAA,KAAoC;AAC3E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC5B,MAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,KAAM,CAAA;AACrC,MAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,UAAU,CAAA,KAAM,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,SAAS,YAA2B;AACxC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,IAAI;AACF,MAAA,IAAI,GAAA,GAAM,IAAA;AACV,MAAA,IAAI,IAAA,GAAyB,CAAC,UAAA,EAAY,IAAI,CAAA;AAC9C,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,MAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,GAAA,GAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvB,QAAA,IAAA,GAAO,OAAA;AAAA,UACL,KAAK,CAAC,CAAA;AAAA,UACN,KAAK,CAAC,CAAA;AAAA,UACN,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,SACzD;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,GAAA,GAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,GAAK,OAAA;AAC/C,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,EAAA,CAAG,GAAG,CAAA;AAAA,MACR;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,GAAU,CAAC,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAA,IAAW,CAAC,SAAA,EAAW;AACzB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,KAAK,MAAA,EAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,UAAU,MAAM;AAClC,IAAA,KAAK,MAAA,EAAO;AAAA,EACd,CAAC,CAAA;AACD,EAAA,KAAK,MAAA,EAAO;AAEZ,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,WAAA,IAAc;AAAA,EAChB,CAAA;AACF","file":"foldedColumn-IHDT4ARZ.cjs","sourcesContent":["// Streamed column fold (Memory Iron Rule): folds every non-deleted item of a\r\n// column into a small accumulator and re-emits only when the data changed.\r\n// Loaded lazily with the paged kit — see `TableEngine.subscribeColumn`.\r\n\r\nexport type ColumnItem = { id: number; rowNum: unknown; value: unknown };\r\n\r\nexport function foldColumnSubscription<T>(args: {\r\n /** Store tick source (any state change re-evaluates the fold). */\r\n subscribe: (listener: () => void) => (() => void) | undefined;\r\n /** Feeds every non-deleted item (streamed in batches by the caller). */\r\n iterate: (onItem: (item: ColumnItem) => void) => Promise<void>;\r\n reducer: (acc: T, item: ColumnItem) => T;\r\n seed: T;\r\n cb: (acc: T) => void;\r\n onError?: (error: unknown) => void;\r\n}): () => void {\r\n const { subscribe, iterate, reducer, seed, cb, onError } = args;\r\n\r\n // Two independent FNV-style hashes over a per-item token — O(1) heap.\r\n const mixHash = (h1: number, h2: number, token: string): [number, number] => {\r\n for (let i = 0; i < token.length; i++) {\r\n const c = token.charCodeAt(i);\r\n h1 = Math.imul(h1 ^ c, 16777619) >>> 0;\r\n h2 = Math.imul(h2 ^ c, 2654435761) >>> 0;\r\n }\r\n return [h1, h2];\r\n };\r\n\r\n let cancelled = false;\r\n let prev = '';\r\n let inFlight = false;\r\n let pending = false;\r\n\r\n const notify = async (): Promise<void> => {\r\n if (cancelled) return;\r\n if (inFlight) {\r\n pending = true;\r\n return;\r\n }\r\n inFlight = true;\r\n try {\r\n let acc = seed;\r\n let hash: [number, number] = [2166136261, 5381];\r\n let sawAny = false;\r\n await iterate((item) => {\r\n sawAny = true;\r\n acc = reducer(acc, item);\r\n hash = mixHash(\r\n hash[0],\r\n hash[1],\r\n `${item.id}:${String(item.rowNum)}:${String(item.value)}`,\r\n );\r\n });\r\n if (cancelled) return;\r\n const sig = sawAny ? `${hash[0]}:${hash[1]}` : 'empty';\r\n if (sig !== prev) {\r\n prev = sig;\r\n cb(acc);\r\n }\r\n } catch (e) {\r\n onError?.(e);\r\n } finally {\r\n inFlight = false;\r\n if (pending && !cancelled) {\r\n pending = false;\r\n void notify();\r\n }\r\n }\r\n };\r\n\r\n const unsubscribe = subscribe(() => {\r\n void notify();\r\n });\r\n void notify();\r\n\r\n return () => {\r\n cancelled = true;\r\n unsubscribe?.();\r\n };\r\n}\r\n"]}
@@ -0,0 +1,64 @@
1
+ // infrastructure/Repositories/paged/foldedColumn.ts
2
+ function foldColumnSubscription(args) {
3
+ const { subscribe, iterate, reducer, seed, cb, onError } = args;
4
+ const mixHash = (h1, h2, token) => {
5
+ for (let i = 0; i < token.length; i++) {
6
+ const c = token.charCodeAt(i);
7
+ h1 = Math.imul(h1 ^ c, 16777619) >>> 0;
8
+ h2 = Math.imul(h2 ^ c, 2654435761) >>> 0;
9
+ }
10
+ return [h1, h2];
11
+ };
12
+ let cancelled = false;
13
+ let prev = "";
14
+ let inFlight = false;
15
+ let pending = false;
16
+ const notify = async () => {
17
+ if (cancelled) return;
18
+ if (inFlight) {
19
+ pending = true;
20
+ return;
21
+ }
22
+ inFlight = true;
23
+ try {
24
+ let acc = seed;
25
+ let hash = [2166136261, 5381];
26
+ let sawAny = false;
27
+ await iterate((item) => {
28
+ sawAny = true;
29
+ acc = reducer(acc, item);
30
+ hash = mixHash(
31
+ hash[0],
32
+ hash[1],
33
+ `${item.id}:${String(item.rowNum)}:${String(item.value)}`
34
+ );
35
+ });
36
+ if (cancelled) return;
37
+ const sig = sawAny ? `${hash[0]}:${hash[1]}` : "empty";
38
+ if (sig !== prev) {
39
+ prev = sig;
40
+ cb(acc);
41
+ }
42
+ } catch (e) {
43
+ onError?.(e);
44
+ } finally {
45
+ inFlight = false;
46
+ if (pending && !cancelled) {
47
+ pending = false;
48
+ void notify();
49
+ }
50
+ }
51
+ };
52
+ const unsubscribe = subscribe(() => {
53
+ void notify();
54
+ });
55
+ void notify();
56
+ return () => {
57
+ cancelled = true;
58
+ unsubscribe?.();
59
+ };
60
+ }
61
+
62
+ export { foldColumnSubscription };
63
+ //# sourceMappingURL=foldedColumn-TFURUKFG.js.map
64
+ //# sourceMappingURL=foldedColumn-TFURUKFG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/Repositories/paged/foldedColumn.ts"],"names":[],"mappings":";AAMO,SAAS,uBAA0B,IAAA,EAS3B;AACb,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,SAAS,IAAA,EAAM,EAAA,EAAI,SAAQ,GAAI,IAAA;AAG3D,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAY,EAAA,EAAY,KAAA,KAAoC;AAC3E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC5B,MAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,KAAM,CAAA;AACrC,MAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,UAAU,CAAA,KAAM,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,SAAS,YAA2B;AACxC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,IAAI;AACF,MAAA,IAAI,GAAA,GAAM,IAAA;AACV,MAAA,IAAI,IAAA,GAAyB,CAAC,UAAA,EAAY,IAAI,CAAA;AAC9C,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,MAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,GAAA,GAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvB,QAAA,IAAA,GAAO,OAAA;AAAA,UACL,KAAK,CAAC,CAAA;AAAA,UACN,KAAK,CAAC,CAAA;AAAA,UACN,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,SACzD;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,GAAA,GAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,GAAK,OAAA;AAC/C,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAA,GAAO,GAAA;AACP,QAAA,EAAA,CAAG,GAAG,CAAA;AAAA,MACR;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,GAAU,CAAC,CAAA;AAAA,IACb,CAAA,SAAE;AACA,MAAA,QAAA,GAAW,KAAA;AACX,MAAA,IAAI,OAAA,IAAW,CAAC,SAAA,EAAW;AACzB,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,KAAK,MAAA,EAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,UAAU,MAAM;AAClC,IAAA,KAAK,MAAA,EAAO;AAAA,EACd,CAAC,CAAA;AACD,EAAA,KAAK,MAAA,EAAO;AAEZ,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,WAAA,IAAc;AAAA,EAChB,CAAA;AACF","file":"foldedColumn-TFURUKFG.js","sourcesContent":["// Streamed column fold (Memory Iron Rule): folds every non-deleted item of a\r\n// column into a small accumulator and re-emits only when the data changed.\r\n// Loaded lazily with the paged kit — see `TableEngine.subscribeColumn`.\r\n\r\nexport type ColumnItem = { id: number; rowNum: unknown; value: unknown };\r\n\r\nexport function foldColumnSubscription<T>(args: {\r\n /** Store tick source (any state change re-evaluates the fold). */\r\n subscribe: (listener: () => void) => (() => void) | undefined;\r\n /** Feeds every non-deleted item (streamed in batches by the caller). */\r\n iterate: (onItem: (item: ColumnItem) => void) => Promise<void>;\r\n reducer: (acc: T, item: ColumnItem) => T;\r\n seed: T;\r\n cb: (acc: T) => void;\r\n onError?: (error: unknown) => void;\r\n}): () => void {\r\n const { subscribe, iterate, reducer, seed, cb, onError } = args;\r\n\r\n // Two independent FNV-style hashes over a per-item token — O(1) heap.\r\n const mixHash = (h1: number, h2: number, token: string): [number, number] => {\r\n for (let i = 0; i < token.length; i++) {\r\n const c = token.charCodeAt(i);\r\n h1 = Math.imul(h1 ^ c, 16777619) >>> 0;\r\n h2 = Math.imul(h2 ^ c, 2654435761) >>> 0;\r\n }\r\n return [h1, h2];\r\n };\r\n\r\n let cancelled = false;\r\n let prev = '';\r\n let inFlight = false;\r\n let pending = false;\r\n\r\n const notify = async (): Promise<void> => {\r\n if (cancelled) return;\r\n if (inFlight) {\r\n pending = true;\r\n return;\r\n }\r\n inFlight = true;\r\n try {\r\n let acc = seed;\r\n let hash: [number, number] = [2166136261, 5381];\r\n let sawAny = false;\r\n await iterate((item) => {\r\n sawAny = true;\r\n acc = reducer(acc, item);\r\n hash = mixHash(\r\n hash[0],\r\n hash[1],\r\n `${item.id}:${String(item.rowNum)}:${String(item.value)}`,\r\n );\r\n });\r\n if (cancelled) return;\r\n const sig = sawAny ? `${hash[0]}:${hash[1]}` : 'empty';\r\n if (sig !== prev) {\r\n prev = sig;\r\n cb(acc);\r\n }\r\n } catch (e) {\r\n onError?.(e);\r\n } finally {\r\n inFlight = false;\r\n if (pending && !cancelled) {\r\n pending = false;\r\n void notify();\r\n }\r\n }\r\n };\r\n\r\n const unsubscribe = subscribe(() => {\r\n void notify();\r\n });\r\n void notify();\r\n\r\n return () => {\r\n cancelled = true;\r\n unsubscribe?.();\r\n };\r\n}\r\n"]}