tychat-contracts 1.0.100 → 1.0.101

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.
@@ -32,6 +32,18 @@ export declare class AnalyticsDashboardTopProcedureDto {
32
32
  name: string;
33
33
  count: number;
34
34
  }
35
+ /** Média de `message.sent` por hora do relógio durante o expediente configurado. */
36
+ export declare class AnalyticsDashboardMessageHourDto {
37
+ hour: number;
38
+ averageSent: number;
39
+ totalSent: number;
40
+ openOccurrencesInPeriod: number;
41
+ }
42
+ export declare class AnalyticsDashboardMessagePeakDto {
43
+ hour: number;
44
+ totalSent: number;
45
+ averageSent: number;
46
+ }
35
47
  /**
36
48
  * Resposta enriquecida de `GET /analytics/dashboard` (mantém campos legados `total`, `byEventType`, `byDomain`).
37
49
  */
@@ -44,6 +56,9 @@ export declare class AnalyticsDashboardResponseDto {
44
56
  noShowRatePercent: number;
45
57
  financialSummary: AnalyticsDashboardFinancialDto;
46
58
  topProcedures: AnalyticsDashboardTopProcedureDto[];
59
+ messagesByClinicHour: AnalyticsDashboardMessageHourDto[];
60
+ messagesPeakHour: AnalyticsDashboardMessagePeakDto | null;
61
+ clinicTimezone: string;
47
62
  total: number;
48
63
  byEventType: Array<{
49
64
  eventType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-query.dto.d.ts","sourceRoot":"","sources":["../../src/analytics/analytics-query.dto.ts"],"names":[],"mappings":"AAYA,OAAO,EAAwB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,kBAAkB,2CAA4C,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE;;GAEG;AACH,qBAAa,uBAAuB;IAMlC,SAAS,EAAE,MAAM,CAAC;IAOlB,OAAO,EAAE,MAAM,CAAC;IAShB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAS9B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAO3B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,0BAA0B;IAMrC,SAAS,EAAE,MAAM,CAAC;IAOlB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8FAA8F;AAC9F,qBAAa,8BAA8B;IAKzC,OAAO,EAAE,MAAM,CAAC;IAMhB,aAAa,EAAE,MAAM,CAAC;IAMtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iCAAiC;IAE5C,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,6BAA6B;IAExC,mBAAmB,EAAE,MAAM,CAAC;IAG5B,oBAAoB,EAAE,MAAM,CAAC;IAM7B,mBAAmB,EAAE,MAAM,CAAC;IAK5B,kBAAkB,EAAE,MAAM,CAAC;IAO3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAMnC,iBAAiB,EAAE,MAAM,CAAC;IAG1B,gBAAgB,EAAE,8BAA8B,CAAC;IAGjD,aAAa,EAAE,iCAAiC,EAAE,CAAC;IAGnD,KAAK,EAAE,MAAM,CAAC;IAKd,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAKzD,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD"}
1
+ {"version":3,"file":"analytics-query.dto.d.ts","sourceRoot":"","sources":["../../src/analytics/analytics-query.dto.ts"],"names":[],"mappings":"AAYA,OAAO,EAAwB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,kBAAkB,2CAA4C,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE;;GAEG;AACH,qBAAa,uBAAuB;IAMlC,SAAS,EAAE,MAAM,CAAC;IAOlB,OAAO,EAAE,MAAM,CAAC;IAShB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAS9B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAO3B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,0BAA0B;IAMrC,SAAS,EAAE,MAAM,CAAC;IAOlB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8FAA8F;AAC9F,qBAAa,8BAA8B;IAKzC,OAAO,EAAE,MAAM,CAAC;IAMhB,aAAa,EAAE,MAAM,CAAC;IAMtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iCAAiC;IAE5C,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,qBAAa,gCAAgC;IAE3C,IAAI,EAAE,MAAM,CAAC;IAMb,WAAW,EAAE,MAAM,CAAC;IAGpB,SAAS,EAAE,MAAM,CAAC;IAMlB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,gCAAgC;IAE3C,IAAI,EAAE,MAAM,CAAC;IAEE,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,EAAE,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,6BAA6B;IAExC,mBAAmB,EAAE,MAAM,CAAC;IAG5B,oBAAoB,EAAE,MAAM,CAAC;IAM7B,mBAAmB,EAAE,MAAM,CAAC;IAK5B,kBAAkB,EAAE,MAAM,CAAC;IAO3B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAMnC,iBAAiB,EAAE,MAAM,CAAC;IAG1B,gBAAgB,EAAE,8BAA8B,CAAC;IAGjD,aAAa,EAAE,iCAAiC,EAAE,CAAC;IAOnD,oBAAoB,EAAE,gCAAgC,EAAE,CAAC;IAOzD,gBAAgB,EAAE,gCAAgC,GAAG,IAAI,CAAC;IAM1D,cAAc,EAAE,MAAM,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;IAKd,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAKzD,QAAQ,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD"}
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AnalyticsDashboardResponseDto = exports.AnalyticsDashboardTopProcedureDto = exports.AnalyticsDashboardFinancialDto = exports.AnalyticsDashboardQueryDto = exports.AnalyticsReportQueryDto = exports.ANALYTICS_GROUP_BY = void 0;
12
+ exports.AnalyticsDashboardResponseDto = exports.AnalyticsDashboardMessagePeakDto = exports.AnalyticsDashboardMessageHourDto = exports.AnalyticsDashboardTopProcedureDto = exports.AnalyticsDashboardFinancialDto = exports.AnalyticsDashboardQueryDto = exports.AnalyticsReportQueryDto = exports.ANALYTICS_GROUP_BY = void 0;
13
13
  const swagger_1 = require("@nestjs/swagger");
14
14
  const class_validator_1 = require("class-validator");
15
15
  const class_transformer_1 = require("class-transformer");
@@ -127,7 +127,7 @@ __decorate([
127
127
  ], AnalyticsDashboardFinancialDto.prototype, "averageTicket", void 0);
128
128
  __decorate([
129
129
  (0, swagger_1.ApiProperty)({
130
- description: 'Volume de cobranças criadas no período ainda não quitadas no momento do registro: soma de `payment.created` + faturas `billing.invoice_created` com status PENDING ou OVERDUE no metadata (aproximação; não substitui saldo contábil)',
130
+ description: 'Valor ainda em aberto no fim do período (exclusive endDate): soma de `payment.created` no intervalo sem `payment.payed` correspondente (mesmo paymentId) com occurredAt anterior a endDate; mais faturas `billing.invoice_created` PENDING/OVERDUE sem `billing.invoice_paid` (mesmo invoiceId). Baseado em eventos de analytics.',
131
131
  }),
132
132
  __metadata("design:type", Number)
133
133
  ], AnalyticsDashboardFinancialDto.prototype, "pending", void 0);
@@ -144,6 +144,52 @@ __decorate([
144
144
  (0, swagger_1.ApiProperty)({ description: 'Quantidade de ocorrências no período' }),
145
145
  __metadata("design:type", Number)
146
146
  ], AnalyticsDashboardTopProcedureDto.prototype, "count", void 0);
147
+ /** Média de `message.sent` por hora do relógio durante o expediente configurado. */
148
+ class AnalyticsDashboardMessageHourDto {
149
+ hour;
150
+ averageSent;
151
+ totalSent;
152
+ openOccurrencesInPeriod;
153
+ }
154
+ exports.AnalyticsDashboardMessageHourDto = AnalyticsDashboardMessageHourDto;
155
+ __decorate([
156
+ (0, swagger_1.ApiProperty)({ description: 'Hora local (0–23) no fuso clinicTimezone' }),
157
+ __metadata("design:type", Number)
158
+ ], AnalyticsDashboardMessageHourDto.prototype, "hour", void 0);
159
+ __decorate([
160
+ (0, swagger_1.ApiProperty)({
161
+ description: 'Média de mensagens enviadas nessa hora: totalSent / openOccurrencesInPeriod (0 se não houve expediente nessa hora no período)',
162
+ }),
163
+ __metadata("design:type", Number)
164
+ ], AnalyticsDashboardMessageHourDto.prototype, "averageSent", void 0);
165
+ __decorate([
166
+ (0, swagger_1.ApiProperty)({ description: 'Total de eventos message.sent nessa hora local, só dentro do horário da clínica' }),
167
+ __metadata("design:type", Number)
168
+ ], AnalyticsDashboardMessageHourDto.prototype, "totalSent", void 0);
169
+ __decorate([
170
+ (0, swagger_1.ApiProperty)({
171
+ description: 'Quantas vezes essa hora calendário integrou o expediente (dias locais no intervalo × slots de opening_hours)',
172
+ }),
173
+ __metadata("design:type", Number)
174
+ ], AnalyticsDashboardMessageHourDto.prototype, "openOccurrencesInPeriod", void 0);
175
+ class AnalyticsDashboardMessagePeakDto {
176
+ hour;
177
+ totalSent;
178
+ averageSent;
179
+ }
180
+ exports.AnalyticsDashboardMessagePeakDto = AnalyticsDashboardMessagePeakDto;
181
+ __decorate([
182
+ (0, swagger_1.ApiProperty)({ description: 'Hora local (0–23) com maior totalSent entre as horas de expediente' }),
183
+ __metadata("design:type", Number)
184
+ ], AnalyticsDashboardMessagePeakDto.prototype, "hour", void 0);
185
+ __decorate([
186
+ (0, swagger_1.ApiProperty)(),
187
+ __metadata("design:type", Number)
188
+ ], AnalyticsDashboardMessagePeakDto.prototype, "totalSent", void 0);
189
+ __decorate([
190
+ (0, swagger_1.ApiProperty)(),
191
+ __metadata("design:type", Number)
192
+ ], AnalyticsDashboardMessagePeakDto.prototype, "averageSent", void 0);
147
193
  /**
148
194
  * Resposta enriquecida de `GET /analytics/dashboard` (mantém campos legados `total`, `byEventType`, `byDomain`).
149
195
  */
@@ -156,6 +202,9 @@ class AnalyticsDashboardResponseDto {
156
202
  noShowRatePercent;
157
203
  financialSummary;
158
204
  topProcedures;
205
+ messagesByClinicHour;
206
+ messagesPeakHour;
207
+ clinicTimezone;
159
208
  total;
160
209
  byEventType;
161
210
  byDomain;
@@ -202,6 +251,28 @@ __decorate([
202
251
  (0, swagger_1.ApiProperty)({ type: [AnalyticsDashboardTopProcedureDto], maxItems: 5 }),
203
252
  __metadata("design:type", Array)
204
253
  ], AnalyticsDashboardResponseDto.prototype, "topProcedures", void 0);
254
+ __decorate([
255
+ (0, swagger_1.ApiProperty)({
256
+ description: 'Pico / distribuição de mensagens no horário da clínica: médias por hora local (só `message.sent` dentro de opening_hours). Ordenado por hora crescente. Vazio se não houver opening_hours.',
257
+ type: [AnalyticsDashboardMessageHourDto],
258
+ }),
259
+ __metadata("design:type", Array)
260
+ ], AnalyticsDashboardResponseDto.prototype, "messagesByClinicHour", void 0);
261
+ __decorate([
262
+ (0, swagger_1.ApiProperty)({
263
+ description: 'Hora com maior volume de mensagens no expediente; null se não houver dados ou horário configurado',
264
+ nullable: true,
265
+ type: AnalyticsDashboardMessagePeakDto,
266
+ }),
267
+ __metadata("design:type", Object)
268
+ ], AnalyticsDashboardResponseDto.prototype, "messagesPeakHour", void 0);
269
+ __decorate([
270
+ (0, swagger_1.ApiProperty)({
271
+ description: 'Fuso IANA usado para hora local e opening_hours (env ANALYTICS_CLINIC_TIMEZONE ou America/Sao_Paulo)',
272
+ example: 'America/Sao_Paulo',
273
+ }),
274
+ __metadata("design:type", String)
275
+ ], AnalyticsDashboardResponseDto.prototype, "clinicTimezone", void 0);
205
276
  __decorate([
206
277
  (0, swagger_1.ApiProperty)({ description: 'Total de eventos de analytics no período (legado)' }),
207
278
  __metadata("design:type", Number)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tychat-contracts",
3
- "version": "1.0.100",
3
+ "version": "1.0.101",
4
4
  "description": "DTOs compartilhados com class-validator (API e microserviços)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -104,7 +104,7 @@ export class AnalyticsDashboardFinancialDto {
104
104
 
105
105
  @ApiProperty({
106
106
  description:
107
- 'Volume de cobranças criadas no período ainda não quitadas no momento do registro: soma de `payment.created` + faturas `billing.invoice_created` com status PENDING ou OVERDUE no metadata (aproximação; não substitui saldo contábil)',
107
+ 'Valor ainda em aberto no fim do período (exclusive endDate): soma de `payment.created` no intervalo sem `payment.payed` correspondente (mesmo paymentId) com occurredAt anterior a endDate; mais faturas `billing.invoice_created` PENDING/OVERDUE sem `billing.invoice_paid` (mesmo invoiceId). Baseado em eventos de analytics.',
108
108
  })
109
109
  pending: number;
110
110
  }
@@ -117,6 +117,36 @@ export class AnalyticsDashboardTopProcedureDto {
117
117
  count: number;
118
118
  }
119
119
 
120
+ /** Média de `message.sent` por hora do relógio durante o expediente configurado. */
121
+ export class AnalyticsDashboardMessageHourDto {
122
+ @ApiProperty({ description: 'Hora local (0–23) no fuso clinicTimezone' })
123
+ hour: number;
124
+
125
+ @ApiProperty({
126
+ description:
127
+ 'Média de mensagens enviadas nessa hora: totalSent / openOccurrencesInPeriod (0 se não houve expediente nessa hora no período)',
128
+ })
129
+ averageSent: number;
130
+
131
+ @ApiProperty({ description: 'Total de eventos message.sent nessa hora local, só dentro do horário da clínica' })
132
+ totalSent: number;
133
+
134
+ @ApiProperty({
135
+ description:
136
+ 'Quantas vezes essa hora calendário integrou o expediente (dias locais no intervalo × slots de opening_hours)',
137
+ })
138
+ openOccurrencesInPeriod: number;
139
+ }
140
+
141
+ export class AnalyticsDashboardMessagePeakDto {
142
+ @ApiProperty({ description: 'Hora local (0–23) com maior totalSent entre as horas de expediente' })
143
+ hour: number;
144
+
145
+ @ApiProperty() totalSent: number;
146
+
147
+ @ApiProperty() averageSent: number;
148
+ }
149
+
120
150
  /**
121
151
  * Resposta enriquecida de `GET /analytics/dashboard` (mantém campos legados `total`, `byEventType`, `byDomain`).
122
152
  */
@@ -157,6 +187,26 @@ export class AnalyticsDashboardResponseDto {
157
187
  @ApiProperty({ type: [AnalyticsDashboardTopProcedureDto], maxItems: 5 })
158
188
  topProcedures: AnalyticsDashboardTopProcedureDto[];
159
189
 
190
+ @ApiProperty({
191
+ description:
192
+ 'Pico / distribuição de mensagens no horário da clínica: médias por hora local (só `message.sent` dentro de opening_hours). Ordenado por hora crescente. Vazio se não houver opening_hours.',
193
+ type: [AnalyticsDashboardMessageHourDto],
194
+ })
195
+ messagesByClinicHour: AnalyticsDashboardMessageHourDto[];
196
+
197
+ @ApiProperty({
198
+ description: 'Hora com maior volume de mensagens no expediente; null se não houver dados ou horário configurado',
199
+ nullable: true,
200
+ type: AnalyticsDashboardMessagePeakDto,
201
+ })
202
+ messagesPeakHour: AnalyticsDashboardMessagePeakDto | null;
203
+
204
+ @ApiProperty({
205
+ description: 'Fuso IANA usado para hora local e opening_hours (env ANALYTICS_CLINIC_TIMEZONE ou America/Sao_Paulo)',
206
+ example: 'America/Sao_Paulo',
207
+ })
208
+ clinicTimezone: string;
209
+
160
210
  @ApiProperty({ description: 'Total de eventos de analytics no período (legado)' })
161
211
  total: number;
162
212