@aibrains/shared-types 0.15.0 → 0.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.
Files changed (76) hide show
  1. package/dist/events/enrollment-billing.events.d.ts +47 -0
  2. package/dist/events/enrollment-billing.events.d.ts.map +1 -0
  3. package/dist/events/enrollment-billing.events.js +9 -0
  4. package/dist/events/enrollment-billing.events.js.map +1 -0
  5. package/dist/identity/country-config.d.ts +120 -0
  6. package/dist/identity/country-config.d.ts.map +1 -0
  7. package/dist/identity/country-config.js +404 -0
  8. package/dist/identity/country-config.js.map +1 -0
  9. package/dist/identity/field-governance.d.ts +40 -0
  10. package/dist/identity/field-governance.d.ts.map +1 -0
  11. package/dist/identity/field-governance.js +111 -0
  12. package/dist/identity/field-governance.js.map +1 -0
  13. package/dist/index.d.ts +6 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +9 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/mappers/edfi/education-org.mapper.js +3 -3
  18. package/dist/mappers/edfi/education-org.mapper.js.map +1 -1
  19. package/dist/schemas/finance/common.d.ts +1 -1
  20. package/dist/schemas/finance/common.d.ts.map +1 -1
  21. package/dist/schemas/finance/common.js +1 -1
  22. package/dist/schemas/finance/common.js.map +1 -1
  23. package/dist/schemas/finance/credit-note.schema.d.ts +127 -0
  24. package/dist/schemas/finance/credit-note.schema.d.ts.map +1 -0
  25. package/dist/schemas/finance/credit-note.schema.js +55 -0
  26. package/dist/schemas/finance/credit-note.schema.js.map +1 -0
  27. package/dist/schemas/finance/discount-rule.schema.d.ts +352 -0
  28. package/dist/schemas/finance/discount-rule.schema.d.ts.map +1 -0
  29. package/dist/schemas/finance/discount-rule.schema.js +57 -0
  30. package/dist/schemas/finance/discount-rule.schema.js.map +1 -0
  31. package/dist/schemas/finance/fee-structure.schema.d.ts +36 -6
  32. package/dist/schemas/finance/fee-structure.schema.d.ts.map +1 -1
  33. package/dist/schemas/finance/fee-structure.schema.js +10 -0
  34. package/dist/schemas/finance/fee-structure.schema.js.map +1 -1
  35. package/dist/schemas/finance/index.d.ts +3 -0
  36. package/dist/schemas/finance/index.d.ts.map +1 -1
  37. package/dist/schemas/finance/index.js +3 -0
  38. package/dist/schemas/finance/index.js.map +1 -1
  39. package/dist/schemas/finance/invoice.schema.d.ts +63 -3
  40. package/dist/schemas/finance/invoice.schema.d.ts.map +1 -1
  41. package/dist/schemas/finance/invoice.schema.js +10 -1
  42. package/dist/schemas/finance/invoice.schema.js.map +1 -1
  43. package/dist/schemas/finance/payment.schema.d.ts +22 -22
  44. package/dist/schemas/finance/refund.schema.d.ts +99 -0
  45. package/dist/schemas/finance/refund.schema.d.ts.map +1 -0
  46. package/dist/schemas/finance/refund.schema.js +47 -0
  47. package/dist/schemas/finance/refund.schema.js.map +1 -0
  48. package/dist/schemas/identity/academic-year.schema.d.ts +14 -14
  49. package/dist/schemas/identity/department.schema.d.ts +6 -6
  50. package/dist/schemas/identity/index.d.ts +2 -0
  51. package/dist/schemas/identity/index.d.ts.map +1 -1
  52. package/dist/schemas/identity/index.js +4 -0
  53. package/dist/schemas/identity/index.js.map +1 -1
  54. package/dist/schemas/identity/leave.schema.d.ts +26 -26
  55. package/dist/schemas/identity/school-year.schema.d.ts +18 -18
  56. package/dist/schemas/identity/school.schema.d.ts +609 -120
  57. package/dist/schemas/identity/school.schema.d.ts.map +1 -1
  58. package/dist/schemas/identity/school.schema.js +32 -8
  59. package/dist/schemas/identity/school.schema.js.map +1 -1
  60. package/dist/utils/bikram-sambat.d.ts +68 -0
  61. package/dist/utils/bikram-sambat.d.ts.map +1 -0
  62. package/dist/utils/bikram-sambat.js +301 -0
  63. package/dist/utils/bikram-sambat.js.map +1 -0
  64. package/dist/utils/currency.d.ts +30 -8
  65. package/dist/utils/currency.d.ts.map +1 -1
  66. package/dist/utils/currency.js +93 -25
  67. package/dist/utils/currency.js.map +1 -1
  68. package/dist/utils/date-format.d.ts +20 -0
  69. package/dist/utils/date-format.d.ts.map +1 -0
  70. package/dist/utils/date-format.js +66 -0
  71. package/dist/utils/date-format.js.map +1 -0
  72. package/dist/utils/school-hours.d.ts +48 -0
  73. package/dist/utils/school-hours.d.ts.map +1 -0
  74. package/dist/utils/school-hours.js +134 -0
  75. package/dist/utils/school-hours.js.map +1 -0
  76. package/package.json +1 -1
@@ -2,44 +2,112 @@
2
2
  /**
3
3
  * Currency Formatting Utilities
4
4
  *
5
- * NPR formatting with Nepal-style lakh/crore grouping.
5
+ * Generic currency formatting with special support for South Asian
6
+ * lakh/crore grouping (NPR, INR) and standard Western grouping.
6
7
  * Pure utility functions — NOT in schema files.
7
8
  */
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.formatCurrency = formatCurrency;
9
11
  exports.formatNPR = formatNPR;
12
+ // ============================================================================
13
+ // CURRENCY REGISTRY
14
+ // ============================================================================
15
+ const CURRENCY_META = {
16
+ NPR: { code: 'NPR', symbol: 'NPR', symbolNative: 'रू', grouping: 'south_asian' },
17
+ INR: { code: 'INR', symbol: 'INR', symbolNative: '₹', grouping: 'south_asian' },
18
+ USD: { code: 'USD', symbol: '$', grouping: 'western' },
19
+ GBP: { code: 'GBP', symbol: '£', grouping: 'western' },
20
+ CAD: { code: 'CAD', symbol: 'CA$', grouping: 'western' },
21
+ AUD: { code: 'AUD', symbol: 'A$', grouping: 'western' },
22
+ };
23
+ // ============================================================================
24
+ // INTERNAL HELPERS
25
+ // ============================================================================
10
26
  /**
11
- * Format an amount as NPR currency string.
12
- * Uses Nepal's number formatting (commas at lakh/crore positions).
27
+ * Apply South Asian grouping: last 3 digits, then groups of 2.
28
+ * e.g. 1234567 "12,34,567"
29
+ */
30
+ function groupSouthAsian(intPart) {
31
+ if (intPart.length <= 3)
32
+ return intPart;
33
+ const last3 = intPart.slice(-3);
34
+ const rest = intPart.slice(0, -3);
35
+ const pairs = rest.replace(/\B(?=(\d{2})+(?!\d))/g, ',');
36
+ return `${pairs},${last3}`;
37
+ }
38
+ /**
39
+ * Apply Western grouping: groups of 3.
40
+ * e.g. 1234567 → "1,234,567"
41
+ */
42
+ function groupWestern(intPart) {
43
+ return intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
44
+ }
45
+ // ============================================================================
46
+ // PUBLIC API
47
+ // ============================================================================
48
+ /**
49
+ * Generic currency formatter.
50
+ *
51
+ * Picks the correct digit-grouping style (lakh/crore vs. Western)
52
+ * based on the currency code. Falls back to Western grouping for
53
+ * unknown currencies.
54
+ *
55
+ * @param amount - numeric amount (supports 0 and negatives for credits)
56
+ * @param currency - ISO 4217 currency code (e.g. 'NPR', 'USD')
57
+ * @param options - formatting overrides
13
58
  *
14
59
  * Examples:
15
- * formatNPR(12500) → "NPR 12,500.00"
16
- * formatNPR(12500, { locale: 'ne', showSymbol: true }) → "रू १२,५००.००"
17
- * formatNPR(150000) → "NPR 1,50,000.00" (lakh grouping)
60
+ * formatCurrency(0, 'NPR') → "NPR 0.00"
61
+ * formatCurrency(150000, 'NPR') → "NPR 1,50,000.00"
62
+ * formatCurrency(-500, 'NPR') → "NPR -500.00"
63
+ * formatCurrency(1234567, 'USD') → "$ 1,234,567.00"
64
+ * formatCurrency(1234567, 'INR') → "INR 12,34,567.00"
18
65
  */
19
- function formatNPR(amount, options = {}) {
20
- const { locale = 'en', showSymbol = true, decimals = 2 } = options;
21
- // Format with Nepal-style grouping (##,##,###.##)
22
- const fixed = Math.abs(amount).toFixed(decimals);
66
+ function formatCurrency(amount, currency, options = {}) {
67
+ var _a, _b;
68
+ const { locale, showSymbol = true, decimals = 2 } = options;
69
+ const meta = CURRENCY_META[currency];
70
+ const grouping = (_a = meta === null || meta === void 0 ? void 0 : meta.grouping) !== null && _a !== void 0 ? _a : 'western';
71
+ // Handle NaN / undefined defensively
72
+ const safeAmount = Number.isFinite(amount) ? amount : 0;
73
+ const isNegative = safeAmount < 0;
74
+ const fixed = Math.abs(safeAmount).toFixed(decimals);
23
75
  const [intPart, decPart] = fixed.split('.');
24
- // Apply lakh/crore grouping: last 3 digits, then groups of 2
25
- let grouped;
26
- if (intPart.length <= 3) {
27
- grouped = intPart;
28
- }
29
- else {
30
- const last3 = intPart.slice(-3);
31
- const rest = intPart.slice(0, -3);
32
- const pairs = rest.replace(/\B(?=(\d{2})+(?!\d))/g, ',');
33
- grouped = `${pairs},${last3}`;
34
- }
35
- // Convert digits to Devanagari for Nepali locale
76
+ const grouped = grouping === 'south_asian'
77
+ ? groupSouthAsian(intPart)
78
+ : groupWestern(intPart);
36
79
  let formatted = decPart ? `${grouped}.${decPart}` : grouped;
80
+ // Convert digits to Devanagari for Nepali locale
37
81
  if (locale === 'ne') {
38
82
  formatted = formatted.replace(/[0-9]/g, (d) => String.fromCharCode(0x0966 + Number(d)));
39
83
  }
40
- if (amount < 0)
84
+ if (isNegative)
41
85
  formatted = `-${formatted}`;
42
- const symbol = locale === 'ne' ? 'रू' : 'NPR';
43
- return showSymbol ? `${symbol} ${formatted}` : formatted;
86
+ if (!showSymbol)
87
+ return formatted;
88
+ // Pick display symbol
89
+ let symbol;
90
+ if (locale === 'ne' && (meta === null || meta === void 0 ? void 0 : meta.symbolNative)) {
91
+ symbol = meta.symbolNative;
92
+ }
93
+ else {
94
+ symbol = (_b = meta === null || meta === void 0 ? void 0 : meta.symbol) !== null && _b !== void 0 ? _b : currency;
95
+ }
96
+ return `${symbol} ${formatted}`;
97
+ }
98
+ /**
99
+ * Format an amount as NPR currency string.
100
+ * Convenience wrapper around formatCurrency for Nepali Rupees.
101
+ * Uses Nepal's lakh/crore grouping (##,##,###.##).
102
+ *
103
+ * Examples:
104
+ * formatNPR(0) → "NPR 0.00"
105
+ * formatNPR(12500) → "NPR 12,500.00"
106
+ * formatNPR(150000) → "NPR 1,50,000.00"
107
+ * formatNPR(-500) → "NPR -500.00"
108
+ * formatNPR(12500, { locale: 'ne' }) → "रू १२,५००.००"
109
+ */
110
+ function formatNPR(amount, options = {}) {
111
+ return formatCurrency(amount, 'NPR', options);
44
112
  }
45
113
  //# sourceMappingURL=currency.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"currency.js","sourceRoot":"","sources":["../../src/utils/currency.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiBH,8BAiCC;AA1CD;;;;;;;;GAQG;AACH,SAAgB,SAAS,CACvB,MAAc,EACd,UAA8B,EAAE;IAEhC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEnE,kDAAkD;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5C,6DAA6D;IAC7D,IAAI,OAAe,CAAC;IACpB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QACzD,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,iDAAiD;IACjD,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAC5C,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CACxC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,GAAG,CAAC;QAAE,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"currency.js","sourceRoot":"","sources":["../../src/utils/currency.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAkFH,wCA2CC;AAcD,8BAKC;AAzHD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,aAAa,GAAiC;IAClD,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE;IAChF,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE;IAC/E,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE;IACtD,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE;IACtD,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxD,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;CACxD,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,cAAc,CAC5B,MAAc,EACd,QAAgB,EAChB,UAA8B,EAAE;;IAEhC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE5D,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAkB,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,mCAAI,SAAS,CAAC;IAE5D,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,QAAQ,KAAK,aAAa;QACxC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC;QAC1B,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE1B,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5D,iDAAiD;IACjD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAC5C,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CACxC,CAAC;IACJ,CAAC;IAED,IAAI,UAAU;QAAE,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAE5C,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAElC,sBAAsB;IACtB,IAAI,MAAc,CAAC;IACnB,IAAI,MAAM,KAAK,IAAI,KAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAA,EAAE,CAAC;QAC1C,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,QAAQ,CAAC;IACpC,CAAC;IAED,OAAO,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CACvB,MAAc,EACd,UAA8B,EAAE;IAEhC,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Calendar-System-Aware Date Formatting
3
+ *
4
+ * Wraps Gregorian and BS formatting under a single API.
5
+ * All dates stored as Gregorian ISO — this formats for display.
6
+ */
7
+ /**
8
+ * Format an ISO date according to the school's calendar system.
9
+ */
10
+ export declare function formatSchoolDate(isoDate: string, calendarSystem: string, format?: string): string;
11
+ /**
12
+ * Parse a date string back to Gregorian ISO, based on calendar system.
13
+ */
14
+ export declare function parseSchoolDate(dateString: string, calendarSystem: string): string;
15
+ /**
16
+ * Generate an academic year label based on calendar system.
17
+ * Gregorian: "2025-2026", BS: "2082-2083"
18
+ */
19
+ export declare function getAcademicYearLabel(startDate: string, endDate: string, calendarSystem: string): string;
20
+ //# sourceMappingURL=date-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-format.d.ts","sourceRoot":"","sources":["../../src/utils/date-format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAuBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAMlF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,MAAM,CAYR"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Calendar-System-Aware Date Formatting
4
+ *
5
+ * Wraps Gregorian and BS formatting under a single API.
6
+ * All dates stored as Gregorian ISO — this formats for display.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.formatSchoolDate = formatSchoolDate;
10
+ exports.parseSchoolDate = parseSchoolDate;
11
+ exports.getAcademicYearLabel = getAcademicYearLabel;
12
+ const bikram_sambat_1 = require("./bikram-sambat");
13
+ /**
14
+ * Format an ISO date according to the school's calendar system.
15
+ */
16
+ function formatSchoolDate(isoDate, calendarSystem, format) {
17
+ if (!isoDate)
18
+ return '';
19
+ if (calendarSystem === 'bikram_sambat') {
20
+ return (0, bikram_sambat_1.formatBsDate)(isoDate, format);
21
+ }
22
+ // Gregorian formatting
23
+ const date = new Date(isoDate);
24
+ if (isNaN(date.getTime()))
25
+ return isoDate;
26
+ if (format === 'long') {
27
+ return date.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
28
+ }
29
+ if (format === 'short') {
30
+ return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
31
+ }
32
+ // Default: YYYY-MM-DD
33
+ const yyyy = date.getFullYear();
34
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
35
+ const dd = String(date.getDate()).padStart(2, '0');
36
+ return `${yyyy}-${mm}-${dd}`;
37
+ }
38
+ /**
39
+ * Parse a date string back to Gregorian ISO, based on calendar system.
40
+ */
41
+ function parseSchoolDate(dateString, calendarSystem) {
42
+ if (calendarSystem === 'bikram_sambat') {
43
+ return (0, bikram_sambat_1.parseBsDate)(dateString);
44
+ }
45
+ // Already Gregorian
46
+ return dateString;
47
+ }
48
+ /**
49
+ * Generate an academic year label based on calendar system.
50
+ * Gregorian: "2025-2026", BS: "2082-2083"
51
+ */
52
+ function getAcademicYearLabel(startDate, endDate, calendarSystem) {
53
+ if (calendarSystem === 'bikram_sambat') {
54
+ const startBs = (0, bikram_sambat_1.gregorianToBs)(startDate);
55
+ const endBs = (0, bikram_sambat_1.gregorianToBs)(endDate);
56
+ if (startBs.year === endBs.year)
57
+ return String(startBs.year);
58
+ return `${startBs.year}-${endBs.year}`;
59
+ }
60
+ const startYear = new Date(startDate).getFullYear();
61
+ const endYear = new Date(endDate).getFullYear();
62
+ if (startYear === endYear)
63
+ return String(startYear);
64
+ return `${startYear}-${endYear}`;
65
+ }
66
+ //# sourceMappingURL=date-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-format.js","sourceRoot":"","sources":["../../src/utils/date-format.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAOH,4CA2BC;AAKD,0CAMC;AAMD,oDAgBC;AAjED,mDAA2E;AAE3E;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,OAAe,EACf,cAAsB,EACtB,MAAe;IAEf,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;QACvC,OAAO,IAAA,4BAAY,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,uBAAuB;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,OAAO,CAAC;IAE1C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,sBAAsB;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,UAAkB,EAAE,cAAsB;IACxE,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;QACvC,OAAO,IAAA,2BAAW,EAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IACD,oBAAoB;IACpB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAClC,SAAiB,EACjB,OAAe,EACf,cAAsB;IAEtB,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAA,6BAAa,EAAC,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAA,6BAAa,EAAC,OAAO,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * School Hours Validation Utility
3
+ *
4
+ * Validates schedule slots, school days, and generates default bell schedule periods.
5
+ * All time values are HH:mm format (24-hour).
6
+ */
7
+ export interface SchoolHoursConfig {
8
+ startTime: string;
9
+ endTime: string;
10
+ schoolDays: number[];
11
+ periodDuration: number;
12
+ }
13
+ export interface Period {
14
+ number: number;
15
+ startTime: string;
16
+ endTime: string;
17
+ type: 'class' | 'break';
18
+ label: string;
19
+ }
20
+ /**
21
+ * Check if a time falls within school hours (inclusive start, exclusive end)
22
+ */
23
+ export declare function isWithinSchoolHours(time: string, startTime: string, endTime: string): boolean;
24
+ /**
25
+ * Check if a day of week is a school day
26
+ */
27
+ export declare function isSchoolDay(dayOfWeek: number, schoolDays: number[]): boolean;
28
+ /**
29
+ * Validate a schedule slot against school hours config.
30
+ * Returns error message string or null if valid.
31
+ */
32
+ export declare function validateScheduleSlot(params: {
33
+ startTime: string;
34
+ endTime: string;
35
+ dayOfWeek: number;
36
+ schoolConfig: SchoolHoursConfig;
37
+ }): string | null;
38
+ /**
39
+ * Auto-generate bell schedule periods based on school hours and period duration.
40
+ * Inserts breaks between periods.
41
+ */
42
+ export declare function generateDefaultPeriods(startTime: string, endTime: string, periodDuration: number, breakDuration?: number): Period[];
43
+ /**
44
+ * Validate a bell schedule against school hours.
45
+ * Returns array of error messages (empty if valid).
46
+ */
47
+ export declare function validateBellSchedule(periods: Period[], schoolConfig: SchoolHoursConfig): string[];
48
+ //# sourceMappingURL=school-hours.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"school-hours.d.ts","sourceRoot":"","sources":["../../src/utils/school-hours.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAK7F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAE5E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,iBAAiB,CAAC;CACjC,GAAG,MAAM,GAAG,IAAI,CAyBhB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,aAAa,GAAE,MAAW,GACzB,MAAM,EAAE,CAiCV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,iBAAiB,GAC9B,MAAM,EAAE,CA+BV"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * School Hours Validation Utility
4
+ *
5
+ * Validates schedule slots, school days, and generates default bell schedule periods.
6
+ * All time values are HH:mm format (24-hour).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.isWithinSchoolHours = isWithinSchoolHours;
10
+ exports.isSchoolDay = isSchoolDay;
11
+ exports.validateScheduleSlot = validateScheduleSlot;
12
+ exports.generateDefaultPeriods = generateDefaultPeriods;
13
+ exports.validateBellSchedule = validateBellSchedule;
14
+ /**
15
+ * Parse HH:mm string to minutes since midnight
16
+ */
17
+ function parseTime(time) {
18
+ const [h, m] = time.split(':').map(Number);
19
+ return h * 60 + m;
20
+ }
21
+ /**
22
+ * Format minutes since midnight to HH:mm
23
+ */
24
+ function formatTime(minutes) {
25
+ const h = Math.floor(minutes / 60);
26
+ const m = minutes % 60;
27
+ return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;
28
+ }
29
+ /**
30
+ * Check if a time falls within school hours (inclusive start, exclusive end)
31
+ */
32
+ function isWithinSchoolHours(time, startTime, endTime) {
33
+ const t = parseTime(time);
34
+ const start = parseTime(startTime);
35
+ const end = parseTime(endTime);
36
+ return t >= start && t <= end;
37
+ }
38
+ /**
39
+ * Check if a day of week is a school day
40
+ */
41
+ function isSchoolDay(dayOfWeek, schoolDays) {
42
+ return schoolDays.includes(dayOfWeek);
43
+ }
44
+ /**
45
+ * Validate a schedule slot against school hours config.
46
+ * Returns error message string or null if valid.
47
+ */
48
+ function validateScheduleSlot(params) {
49
+ const { startTime, endTime, dayOfWeek, schoolConfig } = params;
50
+ // Check school day
51
+ if (!isSchoolDay(dayOfWeek, schoolConfig.schoolDays)) {
52
+ const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
53
+ return `${dayNames[dayOfWeek]} is not a school day`;
54
+ }
55
+ // Check start time
56
+ if (!isWithinSchoolHours(startTime, schoolConfig.startTime, schoolConfig.endTime)) {
57
+ return `Start time ${startTime} falls outside school hours (${schoolConfig.startTime}-${schoolConfig.endTime})`;
58
+ }
59
+ // Check end time
60
+ if (!isWithinSchoolHours(endTime, schoolConfig.startTime, schoolConfig.endTime)) {
61
+ return `End time ${endTime} falls outside school hours (${schoolConfig.startTime}-${schoolConfig.endTime})`;
62
+ }
63
+ // Check order
64
+ if (parseTime(endTime) <= parseTime(startTime)) {
65
+ return `End time ${endTime} must be after start time ${startTime}`;
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * Auto-generate bell schedule periods based on school hours and period duration.
71
+ * Inserts breaks between periods.
72
+ */
73
+ function generateDefaultPeriods(startTime, endTime, periodDuration, breakDuration = 10) {
74
+ const periods = [];
75
+ let currentTime = parseTime(startTime);
76
+ const schoolEnd = parseTime(endTime);
77
+ let periodNumber = 1;
78
+ while (currentTime + periodDuration <= schoolEnd) {
79
+ // Add class period
80
+ periods.push({
81
+ number: periodNumber,
82
+ startTime: formatTime(currentTime),
83
+ endTime: formatTime(currentTime + periodDuration),
84
+ type: 'class',
85
+ label: `Period ${periodNumber}`,
86
+ });
87
+ currentTime += periodDuration;
88
+ periodNumber++;
89
+ // Add break if there's room for another period after break
90
+ if (currentTime + breakDuration + periodDuration <= schoolEnd) {
91
+ periods.push({
92
+ number: periodNumber - 1, // breaks share the preceding period number
93
+ startTime: formatTime(currentTime),
94
+ endTime: formatTime(currentTime + breakDuration),
95
+ type: 'break',
96
+ label: periodNumber === 5 ? 'Lunch Break' : 'Break',
97
+ });
98
+ currentTime += breakDuration;
99
+ }
100
+ }
101
+ return periods;
102
+ }
103
+ /**
104
+ * Validate a bell schedule against school hours.
105
+ * Returns array of error messages (empty if valid).
106
+ */
107
+ function validateBellSchedule(periods, schoolConfig) {
108
+ const errors = [];
109
+ const classPeriods = periods.filter(p => p.type === 'class');
110
+ if (classPeriods.length === 0) {
111
+ errors.push('Bell schedule must have at least one class period');
112
+ return errors;
113
+ }
114
+ // First period must not start before school start
115
+ const firstPeriod = classPeriods[0];
116
+ if (parseTime(firstPeriod.startTime) < parseTime(schoolConfig.startTime)) {
117
+ errors.push(`First period starts at ${firstPeriod.startTime}, before school start time ${schoolConfig.startTime}`);
118
+ }
119
+ // Last period must not end after school end
120
+ const lastPeriod = classPeriods[classPeriods.length - 1];
121
+ if (parseTime(lastPeriod.endTime) > parseTime(schoolConfig.endTime)) {
122
+ errors.push(`Last period ends at ${lastPeriod.endTime}, after school end time ${schoolConfig.endTime}`);
123
+ }
124
+ // Check period duration alignment (warning-level, not error)
125
+ for (const period of classPeriods) {
126
+ const duration = parseTime(period.endTime) - parseTime(period.startTime);
127
+ if (duration !== schoolConfig.periodDuration && duration !== schoolConfig.periodDuration * 2) {
128
+ // Allow single or double periods
129
+ errors.push(`Period ${period.number} duration (${duration}min) doesn't match configured period duration (${schoolConfig.periodDuration}min)`);
130
+ }
131
+ }
132
+ return errors;
133
+ }
134
+ //# sourceMappingURL=school-hours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"school-hours.js","sourceRoot":"","sources":["../../src/utils/school-hours.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aibrains/shared-types",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Shared Zod schemas, TypeScript types, and validators for Education data models.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",