@laboratoria/sdk-js 4.0.2 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
package/lib/core.js CHANGED
@@ -3,6 +3,9 @@ import { createModels, extendSchemaDefinitions } from './model';
3
3
  import { createClient } from './client.js';
4
4
  import schema from '../schemas/core.json';
5
5
 
6
+ const ONE_HOUR = 60 * 60 * 1000;
7
+ const ONE_DAY = 24 * ONE_HOUR;
8
+
6
9
  const extended = {
7
10
  Country: {
8
11
  primaryKey: 'code',
@@ -90,21 +93,77 @@ const extended = {
90
93
  `${name}${!stage ? '' : ` - ${stage.name}`} (id: ${id})`
91
94
  ),
92
95
  properties: {},
96
+ // Status:
97
+ // - `draft`: El cohort todavía no tiene fecha de inicio o fin de admisión.
98
+ // - `planned`: El cohort ya tiene fechas de inicio y fin de admisión, pero el
99
+ // período de admisiones todavía no ha comenzado.
100
+ // - `admission_started`: El periodo de admisión está abierto.
101
+ // - `admission_ended`: El período de admisión ya terminó, pero todavía no
102
+ // comienza el bootcamp.
103
+ // - `started`: El cohort está en período de bootcamp.
104
+ // - `ended`: El cohort ya terminó su bootcamp.
105
+ // - `placement_started`: El cohort se encuentra en período de placement (aka
106
+ // _placement_season_).
107
+ // - `placement_ended`: El período de placement ya terminó.
93
108
  parse: (props) => {
94
109
  const now = Date.now();
95
- // TODO: Handle case where start and/or end have not been selected in query
96
- const status = (
97
- props.start > now
98
- ? 'upcoming'
99
- : props.end < now
100
- ? 'past'
101
- : 'active'
110
+
111
+ let status;
112
+
113
+ if (props.placementStart) {
114
+ const placementDuration = props.placementDuration || 270;
115
+ const placementEnd = new Date(
116
+ +props.placementStart
117
+ + placementDuration * 24 * 60 * 60 * 1000
118
+ )
119
+
120
+ if (placementEnd < now) {
121
+ status = 'placement_ended';
122
+ } else if (props.placementStart < now) {
123
+ status = 'placement_started';
124
+ }
125
+ }
126
+
127
+ if (!status && props.end < now) {
128
+ status = 'ended';
129
+ }
130
+
131
+ if (!status && props.start < now) {
132
+ status = 'started';
133
+ }
134
+
135
+ // NOTA: La fecha de cierre de admisiones se guarda por defecto con la
136
+ // hora 00:00:00, pero semánticamente en realidad queremos expersar que
137
+ // las postulaciones están abiertas inclusive ese día, hasta las 23:59:59,
138
+ // con lo cual sumamos un día a la fecha de cierre para no excluir el
139
+ // último día.
140
+ const admissionEnd = (
141
+ props.admissionEnd
142
+ ? +props.admissionEnd + ONE_DAY
143
+ : false
102
144
  );
145
+ if (!status && admissionEnd && admissionEnd < now) {
146
+ status = 'admission_ended';
147
+ }
148
+
149
+ if (!status && props.admissionStart && props.admissionStart < now) {
150
+ status = 'admission_started';
151
+ }
152
+
153
+ if (!status && props.admissionStart && props.admissionEnd) {
154
+ status = 'planned';
155
+ }
156
+
157
+ if (!status) {
158
+ status = 'draft'
159
+ }
160
+
103
161
  const size = (
104
- status === 'upcoming' && props.vacancies
162
+ props.start > now && props.vacancies
105
163
  ? props.vacancies
106
164
  : props._count?.students || props.students?.length || 0
107
165
  );
166
+
108
167
  return {
109
168
  ...props,
110
169
  status,
@@ -208,6 +267,54 @@ const extended = {
208
267
  isRequired: false,
209
268
  },
210
269
  },
270
+ // Status:
271
+ // - `active`: Postulación en progreso.
272
+ // - `rejected`: Postulación rechazada por filtros (ingresos y/o educación).
273
+ // - `ready`: Retos completados y postulación _enviada_ (confirmada). Llegado a
274
+ // este estado se considera que la postulación está lista para el siguiente
275
+ // paso, por ejemplo entrevista.
276
+ // - `admission_ended`: Período de admisión del cohort seleccionado ya ha
277
+ // terminado, pero la postulación todavía no ha expirado, así que la postulante
278
+ // todavía puede continuar cambiando de cohort, siempre y cuando haya uno
279
+ // abierto dentro del período de validez de 90 días desde la creación de la
280
+ // postulación.
281
+ // - `expired`: Se pasaron los 90 días. La postulación ya no puede ser
282
+ // completada.
283
+ // - `cancelled`: La postulante canceló su propia postulación. (Todavía no
284
+ // implementado).
285
+ parse: (props) => {
286
+ const hasFailedFilters = (
287
+ typeof props.hasFailedFilters === 'boolean'
288
+ ? props.hasFailedFilters
289
+ : typeof props.failedFilters?.length === 'number'
290
+ ? props.failedFilters.length > 0
291
+ : undefined
292
+ );
293
+
294
+ if (!props.cohort?.admissionEnd || typeof hasFailedFilters === 'undefined') {
295
+ return props;
296
+ }
297
+
298
+ const now = Date.now();
299
+ let status;
300
+
301
+ if (props.isReady) {
302
+ status = 'ready';
303
+ } else if (hasFailedFilters && !props.bypassFilters) {
304
+ status = 'rejected';
305
+ } else if (props.createdAt < (now - 90 * ONE_DAY)) {
306
+ status = 'expired';
307
+ } else if (props.cohort?.status !== 'admission_started') {
308
+ status = 'admission_ended';
309
+ } else {
310
+ status = 'active';
311
+ }
312
+
313
+ return {
314
+ ...props,
315
+ status,
316
+ };
317
+ },
211
318
  },
212
319
  IscedLevel: {
213
320
  parse: (props) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laboratoria/sdk-js",
3
- "version": "4.0.2",
3
+ "version": "5.0.0",
4
4
  "description": "Laboratoria JavaScript (browser) SDK",
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "blueimp-md5": "^2.19.0",
14
- "firebase": "^9.19.1"
14
+ "firebase": "^9.20.0"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@babel/core": "^7.21.4",
@@ -19,8 +19,8 @@
19
19
  "babel-jest": "^29.5.0",
20
20
  "jest": "^29.5.0",
21
21
  "jest-environment-jsdom": "^29.5.0",
22
- "webpack": "^5.79.0",
23
- "webpack-cli": "^5.0.1"
22
+ "webpack": "^5.80.0",
23
+ "webpack-cli": "^5.0.2"
24
24
  },
25
25
  "jest": {
26
26
  "testEnvironment": "jsdom",
package/schemas/core.json CHANGED
@@ -989,7 +989,8 @@
989
989
  "enum": [
990
990
  "challenge",
991
991
  "application_filter",
992
- "application_filter_bypass"
992
+ "application_filter_bypass",
993
+ "application_cohort_change"
993
994
  ]
994
995
  },
995
996
  "data": {
@@ -1178,7 +1179,8 @@
1178
1179
  "transport": {
1179
1180
  "type": "string",
1180
1181
  "enum": [
1181
- "mandrill"
1182
+ "mandrill",
1183
+ "slack"
1182
1184
  ]
1183
1185
  },
1184
1186
  "status": {