@blackcode_sa/metaestetics-api 1.12.72 → 1.13.1

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/admin/index.d.mts +872 -1
  2. package/dist/admin/index.d.ts +872 -1
  3. package/dist/admin/index.js +3604 -356
  4. package/dist/admin/index.mjs +3594 -357
  5. package/dist/index.d.mts +1349 -1
  6. package/dist/index.d.ts +1349 -1
  7. package/dist/index.js +5325 -2141
  8. package/dist/index.mjs +4939 -1767
  9. package/package.json +1 -1
  10. package/src/admin/analytics/analytics.admin.service.ts +278 -0
  11. package/src/admin/analytics/index.ts +2 -0
  12. package/src/admin/index.ts +6 -0
  13. package/src/backoffice/services/analytics.service.proposal.md +4 -0
  14. package/src/services/analytics/ARCHITECTURE.md +199 -0
  15. package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -0
  16. package/src/services/analytics/GROUPED_ANALYTICS.md +501 -0
  17. package/src/services/analytics/QUICK_START.md +393 -0
  18. package/src/services/analytics/README.md +304 -0
  19. package/src/services/analytics/SUMMARY.md +141 -0
  20. package/src/services/analytics/TRENDS.md +380 -0
  21. package/src/services/analytics/USAGE_GUIDE.md +518 -0
  22. package/src/services/analytics/analytics-cloud.service.ts +222 -0
  23. package/src/services/analytics/analytics.service.ts +2142 -0
  24. package/src/services/analytics/index.ts +4 -0
  25. package/src/services/analytics/review-analytics.service.ts +941 -0
  26. package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -0
  27. package/src/services/analytics/utils/cost-calculation.utils.ts +182 -0
  28. package/src/services/analytics/utils/grouping.utils.ts +434 -0
  29. package/src/services/analytics/utils/stored-analytics.utils.ts +347 -0
  30. package/src/services/analytics/utils/time-calculation.utils.ts +186 -0
  31. package/src/services/analytics/utils/trend-calculation.utils.ts +200 -0
  32. package/src/services/index.ts +1 -0
  33. package/src/types/analytics/analytics.types.ts +597 -0
  34. package/src/types/analytics/grouped-analytics.types.ts +173 -0
  35. package/src/types/analytics/index.ts +4 -0
  36. package/src/types/analytics/stored-analytics.types.ts +137 -0
  37. package/src/types/index.ts +3 -0
@@ -0,0 +1,200 @@
1
+ import { Appointment } from '../../../types/appointment';
2
+ import { Timestamp } from 'firebase/firestore';
3
+
4
+ /**
5
+ * Trend period type
6
+ */
7
+ export type TrendPeriod = 'week' | 'month' | 'quarter' | 'year';
8
+
9
+ /**
10
+ * Period information for trend grouping
11
+ */
12
+ export interface PeriodInfo {
13
+ period: string; // e.g., "2024-W01", "2024-01", "2024-Q1", "2024"
14
+ startDate: Date;
15
+ endDate: Date;
16
+ }
17
+
18
+ /**
19
+ * Calculates the start and end dates for a given period
20
+ */
21
+ export function getPeriodDates(date: Date, period: TrendPeriod): PeriodInfo {
22
+ const year = date.getFullYear();
23
+ const month = date.getMonth();
24
+ const day = date.getDate();
25
+
26
+ let startDate: Date;
27
+ let endDate: Date;
28
+ let periodString: string;
29
+
30
+ switch (period) {
31
+ case 'week': {
32
+ // Get Monday of the week
33
+ const dayOfWeek = date.getDay();
34
+ const diff = date.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1); // Adjust when day is Sunday
35
+ startDate = new Date(year, month, diff);
36
+ startDate.setHours(0, 0, 0, 0);
37
+
38
+ endDate = new Date(startDate);
39
+ endDate.setDate(endDate.getDate() + 6);
40
+ endDate.setHours(23, 59, 59, 999);
41
+
42
+ // ISO week format: YYYY-Www
43
+ const weekNumber = getWeekNumber(date);
44
+ periodString = `${year}-W${weekNumber.toString().padStart(2, '0')}`;
45
+ break;
46
+ }
47
+
48
+ case 'month': {
49
+ startDate = new Date(year, month, 1);
50
+ startDate.setHours(0, 0, 0, 0);
51
+
52
+ endDate = new Date(year, month + 1, 0);
53
+ endDate.setHours(23, 59, 59, 999);
54
+
55
+ periodString = `${year}-${(month + 1).toString().padStart(2, '0')}`;
56
+ break;
57
+ }
58
+
59
+ case 'quarter': {
60
+ const quarter = Math.floor(month / 3);
61
+ const quarterStartMonth = quarter * 3;
62
+
63
+ startDate = new Date(year, quarterStartMonth, 1);
64
+ startDate.setHours(0, 0, 0, 0);
65
+
66
+ endDate = new Date(year, quarterStartMonth + 3, 0);
67
+ endDate.setHours(23, 59, 59, 999);
68
+
69
+ periodString = `${year}-Q${quarter + 1}`;
70
+ break;
71
+ }
72
+
73
+ case 'year': {
74
+ startDate = new Date(year, 0, 1);
75
+ startDate.setHours(0, 0, 0, 0);
76
+
77
+ endDate = new Date(year, 11, 31);
78
+ endDate.setHours(23, 59, 59, 999);
79
+
80
+ periodString = `${year}`;
81
+ break;
82
+ }
83
+ }
84
+
85
+ return {
86
+ period: periodString,
87
+ startDate,
88
+ endDate,
89
+ };
90
+ }
91
+
92
+ /**
93
+ * Gets ISO week number for a date
94
+ */
95
+ function getWeekNumber(date: Date): number {
96
+ const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
97
+ const dayNum = d.getUTCDay() || 7;
98
+ d.setUTCDate(d.getUTCDate() + 4 - dayNum);
99
+ const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
100
+ return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
101
+ }
102
+
103
+ /**
104
+ * Groups appointments by trend period
105
+ */
106
+ export function groupAppointmentsByPeriod(
107
+ appointments: Appointment[],
108
+ period: TrendPeriod,
109
+ ): Map<string, Appointment[]> {
110
+ const periodMap = new Map<string, Appointment[]>();
111
+
112
+ appointments.forEach(appointment => {
113
+ const appointmentDate = appointment.appointmentStartTime.toDate();
114
+ const periodInfo = getPeriodDates(appointmentDate, period);
115
+ const periodKey = periodInfo.period;
116
+
117
+ if (!periodMap.has(periodKey)) {
118
+ periodMap.set(periodKey, []);
119
+ }
120
+ periodMap.get(periodKey)!.push(appointment);
121
+ });
122
+
123
+ return periodMap;
124
+ }
125
+
126
+ /**
127
+ * Generates all periods between start and end date for a given period type
128
+ */
129
+ export function generatePeriods(
130
+ startDate: Date,
131
+ endDate: Date,
132
+ period: TrendPeriod,
133
+ ): PeriodInfo[] {
134
+ const periods: PeriodInfo[] = [];
135
+ const current = new Date(startDate);
136
+
137
+ while (current <= endDate) {
138
+ const periodInfo = getPeriodDates(current, period);
139
+
140
+ // Only add if period overlaps with our date range
141
+ if (periodInfo.endDate >= startDate && periodInfo.startDate <= endDate) {
142
+ periods.push(periodInfo);
143
+ }
144
+
145
+ // Move to next period
146
+ switch (period) {
147
+ case 'week':
148
+ current.setDate(current.getDate() + 7);
149
+ break;
150
+ case 'month':
151
+ current.setMonth(current.getMonth() + 1);
152
+ break;
153
+ case 'quarter':
154
+ current.setMonth(current.getMonth() + 3);
155
+ break;
156
+ case 'year':
157
+ current.setFullYear(current.getFullYear() + 1);
158
+ break;
159
+ }
160
+ }
161
+
162
+ return periods.sort((a, b) => a.startDate.getTime() - b.startDate.getTime());
163
+ }
164
+
165
+ /**
166
+ * Calculates percentage change between two values
167
+ * @param current - Current value
168
+ * @param previous - Previous value
169
+ * @returns Percentage change (positive = increase, negative = decrease)
170
+ */
171
+ export function calculatePercentageChange(current: number, previous: number): number {
172
+ if (previous === 0) {
173
+ return current > 0 ? 100 : 0;
174
+ }
175
+ return ((current - previous) / previous) * 100;
176
+ }
177
+
178
+ /**
179
+ * Gets trend direction and percentage change
180
+ */
181
+ export interface TrendChange {
182
+ value: number;
183
+ previousValue: number;
184
+ percentageChange: number;
185
+ direction: 'up' | 'down' | 'stable';
186
+ }
187
+
188
+ export function getTrendChange(current: number, previous: number): TrendChange {
189
+ const percentageChange = calculatePercentageChange(current, previous);
190
+ const direction: 'up' | 'down' | 'stable' =
191
+ percentageChange > 0.01 ? 'up' : percentageChange < -0.01 ? 'down' : 'stable';
192
+
193
+ return {
194
+ value: current,
195
+ previousValue: previous,
196
+ percentageChange: Math.abs(percentageChange),
197
+ direction,
198
+ };
199
+ }
200
+
@@ -1,3 +1,4 @@
1
+ export * from "./analytics";
1
2
  export * from "./appointment";
2
3
  export * from "./auth";
3
4
  export * from "./calendar";