-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathyoutrack_uploader.js
More file actions
517 lines (467 loc) · 62.6 KB
/
Copy pathyoutrack_uploader.js
File metadata and controls
517 lines (467 loc) · 62.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
/*
MIT License
Copyright (c) 2025 Dmitry Tsenkov
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
// Данный скрипт предназначен для импорта CSV в Канбан youtrack.
(()=>{
// Сюда напиши свой домен!
const DOMAIN = 'https://dts256.youtrack.cloud/';
// Профиль -> Безопасность аккаунта -> Токены -> Новый токен...
const ACCESS_TOKEN = 'perm-YWRtaW4=.NDgtMw==.kwAwZLxj0TbuVwOlJZgT3TaMzKAW6C';
// Название проекта
const PROJECT = 'lab23-ese';
// Проект -> Учет времени -> включить
// Проект -> Учет времени -> Поле оценки -> Estimation
// Проект -> Учет времени -> Затраченное время -> Spent Time
// Имя пользователя от имени кого будет проставляться время в задачах
const PM = 'admin';
// Кроме Summary и Description поля должны быть созданы в Проект->Настраиваемые поля.
// Они должны должным образом настроены и иметь нужные значения.
// Поле Sprint должно быть привязано к Доскам Agile (Проект->Доски Agile->Параметры доски->Поведение доски->Связывать спринты со значениями поля Sprint)
//
// Поддерживаемые типы полей этим скриптом:
// дата, дата и время, перечисление, состояние, строковое значение, пользователь, период
const CSV = `Summary,Description,Assignee,Priority,Stage,Sprint,Start Date,Due Date,Estimation,Spent Time,Tags,Components
"Интервью со стейкхолдерами","Встречи с заказчиком, редакцией, бизнес-аналитиками",admin,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-05,2025-11-06,8h,9h,"анализ,требования","Анализ"
"Анализ конкурентов","Исследование afisha.ru, timepad.ru, kassir.ru",admin,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-06,2025-11-07,8h,7h,"анализ,конкуренты","Анализ"
"Сбор функциональных требований","Формирование списка функциональных требований",admin,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-07,2025-11-08,8h,9h,"анализ,требования","Анализ"
"Приоритизация MoSCoW","Классификация требований по Must/Should/Could/Won't",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-08,2025-11-09,8h,7h,"анализ,приоритизация","Анализ"
"Согласование требований","Согласование с редакцией и бизнесом",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-09,2025-11-10,8h,8h,"анализ,согласование","Анализ"
"Прототип главной страницы","Low-fi прототип главной страницы и списка событий",maximbarsukov,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-05,2025-11-06,8h,9h,"дизайн,прототипы","Дизайн"
"Прототип карточки события","Low-fi прототип детальной страницы события",maximbarsukov,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-06,2025-11-07,8h,8h,"дизайн,прототипы","Дизайн"
"Прототип системы фильтров","Low-fi прототип фильтров и поиска",maximbarsukov,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-07,2025-11-08,8h,9h,"дизайн,прототипы","Дизайн"
"Прототип админ-панели","Low-fi прототип административной панели",maximbarsukov,Critical,Done,"Спринт 1 - Старт и планирование",2025-11-08,2025-11-09,8h,8h,"дизайн,прототипы","Дизайн"
"Выбор фронтенд-фреймворка","Сравнение Next.js vs Nuxt, выбор решения",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-07,2025-11-08,4h,5h,"архитектура,технологии","Архитектура"
"Выбор базы данных","Сравнение PostgreSQL vs MongoDB",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-08,2025-11-09,4h,4h,"архитектура,технологии","Архитектура"
"Выбор инфраструктуры","Docker/K8s, CI/CD инструменты",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-09,2025-11-10,4h,5h,"архитектура,технологии","Архитектура"
"Согласование стека с командой","Финальное согласование технологического стека",admin,High,Done,"Спринт 1 - Старт и планирование",2025-11-10,2025-11-11,4h,4h,"архитектура,технологии","Архитектура"
"Настройка репозитория","Создание Git репозитория, настройка веток",Дмитрий Ценеков,High,Done,"Спринт 1 - Старт и планирование",2025-11-09,2025-11-10,4h,5h,"devops,ci-cd","Инфраструктура"
"Настройка Docker окружения","Базовые Dockerfile и docker-compose",Дмитрий Ценеков,High,Done,"Спринт 1 - Старт и планирование",2025-11-10,2025-11-11,8h,9h,"devops,ci-cd","Инфраструктура"
"Настройка CI/CD пайплайна","Базовый пайплайн для тестирования и сборки",Дмитрий Ценеков,High,Done,"Спринт 1 - Старт и планирование",2025-11-11,2025-11-12,8h,8h,"devops,ci-cd","Инфраструктура"
"Дизайн-система: цвета и типографика","Определение цветовой палитры и шрифтов",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-12,2025-11-13,8h,9h,"дизайн,ui","Дизайн"
"Дизайн-система: кнопки и инпуты","Компоненты кнопок, полей ввода, селектов",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-13,2025-11-14,8h,8h,"дизайн,ui","Дизайн"
"Дизайн-система: карточки и списки","Компоненты карточек событий, списков, сеток",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-14,2025-11-15,8h,9h,"дизайн,ui","Дизайн"
"Дизайн главной страницы (desktop)","Полный дизайн главной для десктопа",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-15,2025-11-16,12h,13h,"дизайн,ui","Дизайн"
"Дизайн главной страницы (mobile)","Адаптивный дизайн главной для мобильных",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-16,2025-11-17,12h,11h,"дизайн,ui","Дизайн"
"Дизайн карточки события (desktop)","Детальная страница события для десктопа",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-17,2025-11-18,12h,13h,"дизайн,ui","Дизайн"
"Дизайн карточки события (mobile)","Адаптивная карточка события для мобильных",maximbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-18,2025-11-19,12h,11h,"дизайн,ui","Дизайн"
"Дизайн страницы поиска","Страница поиска и фильтрации",maximbarsukov,High,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-19,2025-11-20,8h,9h,"дизайн,ui","Дизайн"
"UI Kit: базовые компоненты","Создание библиотеки базовых компонентов",maximbarsukov,High,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-20,2025-11-21,12h,13h,"дизайн,ui","Дизайн"
"UI Kit: сложные компоненты","Компоненты фильтров, календаря, карт",maximbarsukov,High,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-21,2025-11-22,12h,11h,"дизайн,ui","Дизайн"
"Проектирование схемы БД","ER-диаграмма, связи между таблицами",maxbarsukov,Critical,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-13,2025-11-14,8h,9h,"бэкенд,база-данных","Бэкенд"
"Проектирование индексов","Планирование индексов для оптимизации",maxbarsukov,High,Done,"Спринт 2 - Прототип и дизайн-система",2025-11-14,2025-11-15,8h,7h,"бэкенд,база-данных","Бэкенд"
"Миграции БД: пользователи","Миграции для таблицы пользователей",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-24,2025-11-25,8h,9h,"бэкенд,база-данных","Бэкенд"
"Миграции БД: города","Миграции для таблицы городов",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-25,2025-11-26,4h,5h,"бэкенд,база-данных","Бэкенд"
"Миграции БД: категории","Миграции для таблицы категорий",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-26,2025-11-27,4h,4h,"бэкенд,база-данных","Бэкенд"
"Модель пользователя","Модель User с полями и валидацией",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-24,2025-11-25,8h,9h,"бэкенд,модели","Бэкенд"
"Модель города","Модель City с полями и валидацией",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-25,2025-11-26,4h,5h,"бэкенд,модели","Бэкенд"
"Модель категории","Модель Category с полями и валидацией",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-26,2025-11-27,4h,4h,"бэкенд,модели","Бэкенд"
"API: список пользователей","GET endpoint для списка пользователей",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-27,2025-11-28,4h,5h,"бэкенд,api","Бэкенд"
"API: создание пользователя","POST endpoint для создания пользователя",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-28,2025-11-29,4h,4h,"бэкенд,api","Бэкенд"
"API: список городов","GET endpoint для списка городов",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-29,2025-11-30,4h,5h,"бэкенд,api","Бэкенд"
"API: список категорий","GET endpoint для списка категорий",maxbarsukov,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-30,2025-12-01,4h,4h,"бэкенд,api","Бэкенд"
"Базовый layout","Главный layout с хедером и футером",maximb2208,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-24,2025-11-25,8h,9h,"фронтенд,верстка","Фронтенд"
"Хедер с навигацией","Хедер с логотипом и основной навигацией",maximb2208,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-25,2025-11-26,8h,7h,"фронтенд,верстка","Фронтенд"
"Футер","Футер с ссылками и информацией",maximb2208,High,Done,"Спринт 3 - Каркас проекта",2025-11-26,2025-11-27,4h,5h,"фронтенд,верстка","Фронтенд"
"Настройка React Router","Базовая настройка маршрутизации",maximb2208,Critical,Done,"Спринт 3 - Каркас проекта",2025-11-27,2025-11-28,4h,5h,"фронтенд,роутинг","Фронтенд"
"Страница 404","Страница для ненайденных маршрутов",maximb2208,High,Done,"Спринт 3 - Каркас проекта",2025-11-28,2025-11-29,4h,4h,"фронтенд,роутинг","Фронтенд"
"Главная страница (заглушка)","Заглушка для главной страницы",maximb2208,High,Done,"Спринт 3 - Каркас проекта",2025-11-29,2025-11-30,4h,5h,"фронтенд,верстка","Фронтенд"
"Модель события","Модель Event с основными полями",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-01,2025-12-02,8h,9h,"бэкенд,события","Бэкенд"
"Модель расписания","Модель Schedule для повторяющихся событий",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-02,2025-12-03,8h,7h,"бэкенд,события","Бэкенд"
"Модель места","Модель Place с адресом и координатами",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-03,2025-12-04,8h,9h,"бэкенд,места","Бэкенд"
"API: создание события","POST endpoint для создания события",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-04,2025-12-05,8h,7h,"бэкенд,api","Бэкенд"
"API: список событий","GET endpoint для списка событий",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-05,2025-12-06,8h,9h,"бэкенд,api","Бэкенд"
"API: детали события","GET endpoint для деталей события",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-06,2025-12-07,8h,7h,"бэкенд,api","Бэкенд"
"API: создание места","POST endpoint для создания места",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-07,2025-12-08,8h,9h,"бэкенд,api","Бэкенд"
"API: список мест","GET endpoint для списка мест",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-08,2025-12-09,8h,7h,"бэкенд,api","Бэкенд"
"Регистрация пользователя","POST endpoint для регистрации",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-03,2025-12-04,8h,9h,"бэкенд,авторизация","Бэкенд"
"Аутентификация по email","Логин/логаут по email и паролю",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-04,2025-12-05,8h,7h,"бэкенд,авторизация","Бэкенд"
"OAuth интеграция","Авторизация через VK, OK и другие соцсети",maxbarsukov,High,Done,"Спринт 4 - Ядро данных",2025-12-05,2025-12-06,12h,13h,"бэкенд,авторизация","Бэкенд"
"JWT токены","Генерация и валидация JWT токенов",maxbarsukov,Critical,Done,"Спринт 4 - Ядро данных",2025-12-06,2025-12-07,8h,9h,"бэкенд,авторизация","Бэкенд"
"Восстановление пароля","Механизм восстановления пароля по email",maxbarsukov,High,Done,"Спринт 4 - Ядро данных",2025-12-07,2025-12-08,8h,7h,"бэкенд,авторизация","Бэкенд"
"Компонент выбора города","Выпадающий список с выбором города",maximb2208,High,Done,"Спринт 4 - Ядро данных",2025-12-02,2025-12-03,4h,5h,"фронтенд,компоненты","Фронтенд"
"Сохранение выбора города","Сохранение в cookies/сессии",maximb2208,High,Done,"Спринт 4 - Ядро данных",2025-12-03,2025-12-04,4h,4h,"фронтенд,компоненты","Фронтенд"
"Обновление контента по городу","Динамическое обновление при смене города",maximb2208,High,Done,"Спринт 4 - Ядро данных",2025-12-04,2025-12-05,8h,9h,"фронтенд,компоненты","Фронтенд"
"Модель категорий","Модель Category с деревом категорий",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-10,2025-12-11,8h,9h,"бэкенд,категории","Бэкенд"
"API управления категориями","CRUD endpoints для категорий",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-11,2025-12-12,8h,7h,"бэкенд,api","Бэкенд"
"Модель тегов","Модель Tag для гибкой tagging системы",maxbarsukov,Normal,Done,"Спринт 5 - Контент и геолокация",2025-12-12,2025-12-13,6h,7h,"бэкенд,теги","Бэкенд"
"Интеграция с картами","Подключение Google Maps API",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-13,2025-12-14,8h,9h,"бэкенд,карты","Бэкенд"
"Геокодирование адресов","Преобразование адресов в координаты",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-14,2025-12-15,8h,7h,"бэкенд,геолокация","Бэкенд"
"Поиск по локации","Поиск событий near location",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-15,2025-12-16,8h,9h,"бэкенд,геолокация","Бэкенд"
"Модель расписания","Поддержка разовых событий",maxbarsukov,Critical,Done,"Спринт 5 - Контент и геолокация",2025-12-16,2025-12-17,8h,7h,"бэкенд,расписание","Бэкенд"
"Повторяющиеся события","Логика recurring events",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-17,2025-12-18,12h,13h,"бэкенд,расписание","Бэкенд"
"События с несколькими датами","Events with multiple dates",maxbarsukov,High,Done,"Спринт 5 - Контент и геолокация",2025-12-18,2025-12-19,8h,9h,"бэкенд,расписание","Бэкенд"
"Календарный интерфейс","UI для управления расписанием в админке",maximb2208,High,Done,"Спринт 5 - Контент и геолокация",2025-12-19,2025-12-20,12h,11h,"фронтенд,админка","Фронтенд"
"Интерфейс категорий","Управление категориями в админке",maximb2208,High,Done,"Спринт 5 - Контент и геолокация",2025-12-20,2025-12-21,8h,9h,"фронтенд,админка","Фронтенд"
"Backend поиска","Elasticsearch/PostgreSQL full-text search",maxbarsukov,Critical,Done,"Спринт 6 - Поиск и фильтры",2025-12-22,2025-12-23,12h,13h,"бэкенд,поиск","Бэкенд"
"API поиска","Search endpoints with query params",maxbarsukov,Critical,Done,"Спринт 6 - Поиск и фильтры",2025-12-23,2025-12-24,8h,7h,"бэкенд,api","Бэкенд"
"Фильтрация по категориям","Backend фильтрации по категориям",maxbarsukov,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-24,2025-12-25,8h,9h,"бэкенд,фильтры","Бэкенд"
"Фильтрация по дате","Filter by date range",maxbarsukov,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-25,2025-12-26,8h,7h,"бэкенд,фильтры","Бэкенд"
"Фильтрация по цене","Filter by price range",maxbarsukov,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-26,2025-12-27,6h,7h,"бэкенд,фильтры","Бэкенд"
"Фильтрация по возрасту","Age restrictions filter",maxbarsukov,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-27,2025-12-28,6h,5h,"бэкенд,фильтры","Бэкенд"
"Фильтрация по тегам","Tag-based filtering",maxbarsukov,Normal,Done,"Спринт 6 - Поиск и фильтры",2025-12-28,2025-12-29,8h,9h,"бэкенд,фильтры","Бэкенд"
"Компонент поиска","Search input with debounce",maximb2208,Critical,Done,"Спринт 6 - Поиск и фильтры",2025-12-22,2025-12-23,8h,9h,"фронтенд,поиск","Фронтенд"
"AJAX подгрузка результатов","Live search results",maximb2208,Critical,Done,"Спринт 6 - Поиск и фильтры",2025-12-23,2025-12-24,8h,7h,"фронтенд,поиск","Фронтенд"
"Панель фильтров","Filter sidebar with all options",maximb2208,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-24,2025-12-25,12h,13h,"фронтенд,фильтры","Фронтенд"
"Чекбоксы категорий","Category filter checkboxes",maximb2208,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-25,2025-12-26,8h,7h,"фронтенд,фильтры","Фронтенд"
"Date picker","Component for date selection",maximb2208,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-26,2025-12-27,8h,9h,"фронтенд,фильтры","Фронтенд"
"Range sliders","Price and age range sliders",maximb2208,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-27,2025-12-28,8h,7h,"фронтенд,фильтры","Фронтенд"
"Отображение результатов","Search results list/grid",maximb2208,Critical,Done,"Спринт 6 - Поиск и фильтры",2025-12-28,2025-12-29,8h,9h,"фронтенд,поиск","Фронтенд"
"Пагинация","Pagination for search results",maximb2208,High,Done,"Спринт 6 - Поиск и фильтры",2025-12-29,2025-12-30,8h,7h,"фронтенд,поиск","Фронтенд"
"Модель избранного","Favorites model (user-event relation)",maxbarsukov,High,Done,"Спринт 7 - Личный кабинет",2026-01-05,2026-01-06,8h,9h,"бэкенд,избранное","Бэкенд"
"API избранного","Endpoints for managing favorites",maxbarsukov,High,Done,"Спринт 7 - Личный кабинет",2026-01-06,2026-01-07,8h,7h,"бэкенд,api","Бэкенд"
"Модель комментариев","Comment model with hierarchy",maxbarsukov,High,Done,"Спринт 7 - Личный кабинет",2026-01-07,2026-01-08,8h,9h,"бэкенд,комментарии","Бэкенд"
"API комментариев","CRUD for comments",maxbarsukov,High,Done,"Спринт 7 - Личный кабинет",2026-01-08,2026-01-09,8h,7h,"бэкенд,api","Бэкенд"
"Система модерации","Comment moderation workflow",maxbarsukov,High,Done,"Спринт 7 - Личный кабинет",2026-01-09,2026-01-10,12h,13h,"бэкенд,модерация","Бэкенд"
"Модель email подписок","Email subscriptions model",maxbarsukov,Normal,Done,"Спринт 7 - Личный кабинет",2026-01-10,2026-01-11,6h,7h,"бэкенд,рассылки","Бэкенд"
"Double opt-in","Email confirmation for subscriptions",maxbarsukov,Normal,Done,"Спринт 7 - Личный кабинет",2026-01-11,2026-01-12,8h,7h,"бэкенд,рассылки","Бэкенд"
"Шаблоны писем","Email templates system",maxbarsukov,Normal,Done,"Спринт 7 - Личный кабинет",2026-01-12,2026-01-13,8h,9h,"бэкенд,рассылки","Бэкенд"
"Личный кабинет layout","User profile page layout",maximb2208,High,Done,"Спринт 7 - Личный кабинет",2026-01-05,2026-01-06,8h,9h,"фронтенд,личный-кабинет","Фронтенд"
"Вкладка избранного","Favorites tab in profile",maximb2208,High,Done,"Спринт 7 - Личный кабинет",2026-01-06,2026-01-07,8h,7h,"фронтенд,личный-кабинет","Фронтенд"
"Кнопка добавления в избранное","Add to favorites button",maximb2208,High,Done,"Спринт 7 - Личный кабинет",2026-01-07,2026-01-08,6h,7h,"фронтенд,избранное","Фронтенд"
"Компонент комментариев","Comments component with replies",maximb2208,High,Done,"Спринт 7 - Личный кабинет",2026-01-08,2026-01-09,12h,13h,"фронтенд,комментарии","Фронтенд"
"Форма комментария","Comment form with validation",maximb2208,High,Done,"Спринт 7 - Личный кабинет",2026-01-09,2026-01-10,8h,7h,"фронтенд,комментарии","Фронтенд"
"Настройки уведомлений","Notification settings in profile",maximb2208,Normal,Done,"Спринт 7 - Личный кабинет",2026-01-10,2026-01-11,8h,9h,"фронтенд,личный-кабинет","Фронтенд"
"Форма подписки","Email subscription form",maximb2208,Normal,Done,"Спринт 7 - Личный кабинет",2026-01-11,2026-01-12,6h,7h,"фронтенд,рассылки","Фронтенд"
"WYSIWYG редактор","Rich text editor component",maximb2208,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-19,2026-01-20,12h,13h,"фронтенд,админка","Фронтенд"
"Загрузка изображений","Image upload for editor",maximb2208,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-20,2026-01-21,8h,7h,"фронтенд,админка","Фронтенд"
"Админка: список событий","Events list in admin panel",maximb2208,Critical,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-21,2026-01-22,8h,9h,"фронтенд,админка","Фронтенд"
"Админка: создание события","Event creation form",maximb2208,Critical,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-22,2026-01-23,12h,13h,"фронтенд,админка","Фронтенд"
"Админка: редактирование события","Event edit form",maximb2208,Critical,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-23,2026-01-24,8h,7h,"фронтенд,админка","Фронтенд"
"Админка: список мест","Places list in admin",maximb2208,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-24,2026-01-25,8h,9h,"фронтенд,админка","Фронтенд"
"Админка: создание места","Place creation form",maximb2208,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-25,2026-01-26,8h,7h,"фронтенд,админка","Фронтенд"
"Система статусов событий","Event status management",maxbarsukov,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-26,2026-01-27,8h,9h,"бэкенд,модерация","Бэкенд"
"Workflow модерации","Content moderation workflow",maxbarsukov,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-27,2026-01-28,12h,13h,"бэкенд,модерация","Бэкенд"
"Ролевая модель","User roles and permissions",maxbarsukov,High,Done,"Спринт 8 - Админ-панель (Часть 1)",2026-01-28,2026-01-29,8h,7h,"бэкенд,безопасность","Бэкенд"
"Модель статей","Article model for news/blog",maxbarsukov,High,Done,"Спринт 9 - Дополнительный контент",2026-02-02,2026-02-03,8h,9h,"бэкенд,cms","Бэкенд"
"API статей","CRUD endpoints for articles",maxbarsukov,High,Done,"Спринт 9 - Дополнительный контент",2026-02-03,2026-02-04,8h,7h,"бэкенд,api","Бэкенд"
"Модель подборок","Collection model for editorial content",maxbarsukov,High,Done,"Спринт 9 - Дополнительный контент",2026-02-04,2026-02-05,8h,9h,"бэкенд,cms","Бэкенд"
"API подборок","Endpoints for collections",maxbarsukov,High,Done,"Спринт 9 - Дополнительный контент",2026-02-05,2026-02-06,8h,7h,"бэкенд,api","Бэкенд"
"Автоматические подборки","Auto-generated collections by tags",maxbarsukov,Normal,Done,"Спринт 9 - Дополнительный контент",2026-02-06,2026-02-07,12h,13h,"бэкенд,подборки","Бэкенд"
"Система тегов","Tags management system",maxbarsukov,Normal,Done,"Спринт 9 - Дополнительный контент",2026-02-07,2026-02-08,8h,9h,"бэкенд,теги","Бэкенд"
"Админка: управление статьями","Articles management in admin",maximb2208,High,Done,"Спринт 9 - Дополнительный контент",2026-02-02,2026-02-03,8h,9h,"фронтенд,админка","Фронтенд"
"Админка: создание подборок","Collections creation in admin",maximb2208,High,Done,"Спринт 9 - Дополнительный контент",2026-02-03,2026-02-04,8h,7h,"фронтенд,админка","Фронтенд"
"Фронтенд статей","Articles listing and detail pages",maximb2208,High,Done,"Спринт 9 - Дополнительный контент",2026-02-04,2026-02-05,12h,13h,"фронтенд,cms","Фронтенд"
"Фронтенд подборок","Collections display on frontend",maximb2208,High,Done,"Спринт 9 - Дополнительный контент",2026-02-05,2026-02-06,8h,7h,"фронтенд,подборки","Фронтенд"
"Облако тегов","Tags cloud component",maximb2208,Normal,Done,"Спринт 9 - Дополнительный контент",2026-02-06,2026-02-07,6h,7h,"фронтенд,теги","Фронтенд"
"Админка: модерация комментариев","Comments moderation interface",maximb2208,High,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-16,2026-02-17,8h,9h,"фронтенд,модерация","Фронтенд"
"Жалобы пользователей","User reports system",maximb2208,High,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-17,2026-02-18,8h,7h,"фронтенд,модерация","Фронтенд"
"Админка: управление пользователями","Users management in admin",maximb2208,High,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-18,2026-02-19,8h,9h,"фронтенд,админка","Фронтенд"
"Система банов","Ban/unban users functionality",maxbarsukov,High,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-19,2026-02-20,8h,7h,"бэкенд,пользователи","Бэкенд"
"Массовые операции","Bulk operations in admin",maxbarsukov,Normal,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-20,2026-02-21,12h,13h,"бэкенд,админка","Бэкенд"
"Инструменты аналитики","Basic analytics in admin",maxbarsukov,Normal,Done,"Спринт 10 - Админ-панель (Часть 2) и модерация",2026-02-21,2026-02-22,8h,9h,"бэкенд,аналитика","Бэкенд"
"Модель тестов","Quiz model with questions/answers",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-02,2026-03-03,12h,13h,"бэкенд,тесты","Бэкенд"
"API тестов","Endpoints for quizzes",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-03,2026-03-04,8h,7h,"бэкенд,api","Бэкенд"
"Логика подсчета результатов","Quiz results calculation",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-04,2026-03-05,12h,13h,"бэкенд,тесты","Бэкенд"
"Система просмотров","View counters for events/articles",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-05,2026-03-06,8h,7h,"бэкенд,аналитика","Бэкенд"
"Рейтинги и лайки","Ratings and likes system",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-06,2026-03-07,12h,13h,"бэкенд,рейтинги","Бэкенд"
"Топ популярности","Popularity rankings",maxbarsukov,Normal,Done,"Спринт 11 - Интерактивности",2026-03-07,2026-03-08,8h,9h,"бэкенд,аналитика","Бэкенд"
"Админка: создание тестов","Quiz creation in admin",maximb2208,Normal,Done,"Спринт 11 - Интерактивности",2026-03-02,2026-03-03,12h,13h,"фронтенд,админка","Фронтенд"
"Фронтенд тестов","Quiz taking interface",maximb2208,Normal,Done,"Спринт 11 - Интерактивности",2026-03-03,2026-03-04,12h,11h,"фронтенд,тесты","Фронтенд"
"Результаты тестов","Quiz results display",maximb2208,Normal,Done,"Спринт 11 - Интерактивности",2026-03-04,2026-03-05,8h,9h,"фронтенд,тесты","Фронтенд"
"Кнопки лайков","Like buttons on frontend",maximb2208,Normal,Done,"Спринт 11 - Интерактивности",2026-03-05,2026-03-06,6h,7h,"фронтенд,рейтинги","Фронтенд"
"Счетчики просмотров","View counters on frontend",maximb2208,Normal,Done,"Спринт 11 - Интерактивности",2026-03-06,2026-03-07,6h,5h,"фронтенд,аналитика","Фронтенд"
"Интеграционное тестирование: поиск","Search functionality E2E tests",Дмитрий Ценеков,High,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-16,2026-03-17,8h,9h,"тестирование,qa","Тестирование"
"Интеграционное тестирование: аутентификация","Auth flow E2E tests",Дмитрий Ценеков,High,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-17,2026-03-18,8h,7h,"тестирование,qa","Тестирование"
"Интеграционное тестирование: админка","Admin panel E2E tests",Дмитрий Ценеков,High,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-18,2026-03-19,12h,13h,"тестирование,qa","Тестирование"
"Исправление критических багов","High priority bug fixes",Дмитрий Ценеков,Critical,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-19,2026-03-20,16h,17h,"тестирование,баги","Тестирование"
"Исправление средних багов","Medium priority bug fixes",Дмитрий Ценеков,High,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-20,2026-03-21,16h,15h,"тестирование,баги","Тестирование"
"Развертывание альфа-версии","Alpha environment deployment",Дмитрий Ценеков,High,Done,"Спринт 12 - Релиз Кандидат 1 (RC1)",2026-03-21,2026-03-22,8h,9h,"devops,тестирование","Инфраструктура"
"Альфа-тестирование: основные сценарии","Core functionality alpha testing",Дмитрий Ценеков,High,Done,"Спринт 13 - Альфа-тестирование",2026-03-30,2026-03-31,16h,17h,"тестирование,qa","Тестирование"
"Альфа-тестирование: edge cases","Edge cases and error handling",Дмитрий Ценеков,High,Done,"Спринт 13 - Альфа-тестирование",2026-03-31,2026-04-01,16h,15h,"тестирование,qa","Тестирование"
"Сбор фидбека команды","Internal team feedback collection",Дмитрий Ценеков,High,Done,"Спринт 13 - Альфа-тестирование",2026-04-01,2026-04-02,8h,9h,"тестирование,фидбек","Тестирование"
"Исправление багов по фидбеку","Bug fixes based on alpha feedback",Дмитрий Ценеков,High,Done,"Спринт 13 - Альфа-тестирование",2026-04-02,2026-04-03,16h,17h,"тестирование,баги","Тестирование"
"API документация","OpenAPI/Swagger documentation",maxbarsukov,High,Done,"Спринт 13 - Альфа-тестирование",2026-04-03,2026-04-04,12h,13h,"бэкенд,api,документация","Бэкенд"
"REST API для партнеров","Public API for partners",maxbarsukov,High,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-13,2026-04-14,16h,17h,"бэкенд,api,интеграции","Бэкенд"
"API аутентификация","API authentication (JWT/API keys)",maxbarsukov,High,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-14,2026-04-15,12h,11h,"бэкенд,api,безопасность","Бэкенд"
"Rate limiting","API rate limiting",maxbarsukov,High,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-15,2026-04-16,8h,9h,"бэкенд,api,безопасность","Бэкенд"
"Реферальные ссылки","Referral links system",maxbarsukov,High,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-16,2026-04-17,12h,13h,"бэкенд,интеграции","Бэкенд"
"Отслеживание переходов","Click tracking for referrals",maxbarsukov,High,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-17,2026-04-18,8h,7h,"бэкенд,аналитика","Бэкенд"
"Система баннеров","Banner ads management",maxbarsukov,Normal,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-18,2026-04-19,12h,13h,"бэкенд,реклама","Бэкенд"
"Ротация баннеров","Banner rotation logic",maxbarsukov,Normal,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-19,2026-04-20,8h,9h,"бэкенд,реклама","Бэкенд"
"Интерфейс управления рекламой","Ads management in admin",maximb2208,Normal,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-13,2026-04-14,12h,13h,"фронтенд,реклама","Фронтенд"
"Баннерные места","Banner placement on frontend",maximb2208,Normal,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-14,2026-04-15,8h,7h,"фронтенд,реклама","Фронтенд"
"Промотируемые события","Promoted events marking",maximb2208,Normal,Done,"Спринт 14 - Интеграции (Часть 1)",2026-04-15,2026-04-16,6h,7h,"фронтенд,реклама","Фронтенд"
"Модель бронирования","Booking model with seats",maxbarsukov,Critical,Done,"Спринт 15 - Система бронирования",2026-04-27,2026-04-28,12h,13h,"бэкенд,бронирование","Бэкенд"
"API бронирования","Booking endpoints",maxbarsukov,Critical,Done,"Спринт 15 - Система бронирования",2026-04-28,2026-04-29,12h,11h,"бэкенд,api","Бэкенд"
"Выбор мест","Seat selection logic",maxbarsukov,High,Done,"Спринт 15 - Система бронирования",2026-04-29,2026-04-30,16h,17h,"бэкенд,бронирование","Бэкенд"
"Автоотмена брони","Auto-cancel after 15 minutes",maxbarsukov,Critical,Done,"Спринт 15 - Система бронирования",2026-04-30,2026-05-01,8h,9h,"бэкенд,бронирование","Бэкенд"
"Интерфейс бронирования","Booking form on frontend",maximb2208,Critical,Done,"Спринт 15 - Система бронирования",2026-04-27,2026-04-28,12h,13h,"фронтенд,бронирование","Фронтенд"
"Выбор мест на фронтенде","Seat selection interface",maximb2208,High,Done,"Спринт 15 - Система бронирования",2026-04-28,2026-04-29,16h,17h,"фронтенд,бронирование","Фронтенд"
"Таймер бронирования","Booking timer countdown",maximb2208,High,Done,"Спринт 15 - Система бронирования",2026-04-29,2026-04-30,8h,9h,"фронтенд,бронирование","Фронтенд"
"Интеграция платежной системы","Payment gateway integration",maxbarsukov,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-11,2026-05-12,16h,17h,"бэкенд,платежи","Бэкенд"
"Обработка платежей","Payment processing logic",maxbarsukov,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-12,2026-05-13,12h,11h,"бэкенд,платежи","Бэкенд"
"Webhooks платежей","Payment webhooks handling",maxbarsukov,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-13,2026-05-14,12h,13h,"бэкенд,платежи","Бэкенд"
"Обработка возвратов","Refund processing",maxbarsukov,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-14,2026-05-15,8h,9h,"бэкенд,платежи","Бэкенд"
"Chargeback handling","Chargeback management",maxbarsukov,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-15,2026-05-16,8h,7h,"бэкенд,платежи","Бэкенд"
"Фронтенд оплаты","Payment form on frontend",maximb2208,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-11,2026-05-12,12h,13h,"фронтенд,платежи","Фронтенд"
"Статусы оплаты","Payment status display",maximb2208,High,Done,"Спринт 16 - Интеграция платежей",2026-05-12,2026-05-13,8h,7h,"фронтенд,платежи","Фронтенд"
"Тестирование платежных сценариев","Payment flow E2E tests",Дмитрий Ценеков,Critical,Done,"Спринт 16 - Интеграция платежей",2026-05-13,2026-05-14,12h,13h,"тестирование,платежи","Тестирование"
"Развертывание бета-версии","Beta environment setup",Дмитрий Ценеков,High,Done,"Спринт 17 - Бета-тестирование",2026-05-25,2026-05-26,8h,9h,"devops,тестирование","Инфраструктура"
"Бета-тестирование с пользователями","User acceptance testing",Дмитрий Ценеков,High,Done,"Спринт 17 - Бета-тестирование",2026-05-26,2026-05-27,16h,17h,"тестирование,qa","Тестирование"
"Сбор фидбека пользователей","User feedback collection",admin,Normal,Done,"Спринт 17 - Бета-тестирование",2026-05-27,2026-05-28,12h,13h,"аналитика,фидбек","Аналитика"
"Анализ фидбека","Feedback analysis and prioritization",admin,Normal,Done,"Спринт 17 - Бета-тестирование",2026-05-28,2026-05-29,12h,11h,"аналитика,фидбек","Аналитика"
"Исправление багов бета-теста","Beta bug fixes",Дмитрий Ценеков,High,Done,"Спринт 17 - Бета-тестирование",2026-05-29,2026-05-30,16h,17h,"тестирование,баги","Тестирование"
"Оптимизация запросов БД","Database query optimization",maxbarsukov,High,Done,"Спринт 18 - Производительность и безопасность",2026-06-06,2026-06-07,16h,17h,"бэкенд,оптимизация","Бэкенд"
"Индексация","Database indexing optimization",maxbarsukov,High,Done,"Спринт 18 - Производительность и безопасность",2026-06-07,2026-06-08,12h,11h,"бэкенд,оптимизация","Бэкенд"
"Кэширование","Caching implementation (Redis)",maxbarsukov,High,Done,"Спринт 18 - Производительность и безопасность",2026-06-08,2026-06-09,16h,17h,"бэкенд,оптимизация","Бэкенд"
"Нагрузочное тестирование","Load testing setup",Дмитрий Ценеков,High,Done,"Спринт 18 - Производительность и безопасность",2026-06-09,2026-06-10,12h,13h,"тестирование,нагрузка","Тестирование"
"Анализ производительности","Performance analysis",Дмитрий Ценеков,High,Done,"Спринт 18 - Производительность и безопасность",2026-06-10,2026-06-11,12h,11h,"тестирование,нагрузка","Тестирование"
"Аудит безопасности: XSS","XSS protection audit",Дмитрий Ценеков,Critical,Done,"Спринт 18 - Производительность и безопасность",2026-06-11,2026-06-12,8h,9h,"безопасность,аудит","Безопасность"
"Аудит безопасности: CSRF","CSRF protection audit",Дмитрий Ценеков,Critical,Done,"Спринт 18 - Производительность и безопасность",2026-06-12,2026-06-13,8h,7h,"безопасность,аудит","Безопасность"
"Аудит безопасности: SQL инъекции","SQL injection prevention",Дмитрий Ценеков,Critical,Done,"Спринт 18 - Производительность и безопасность",2026-06-13,2026-06-14,8h,9h,"безопасность,аудит","Безопасность"
"HTTPS настройка","HTTPS configuration",Дмитрий Ценеков,Critical,Done,"Спринт 18 - Производительность и безопасность",2026-06-14,2026-06-15,8h,7h,"безопасность,инфраструктура","Инфраструктура"
"Доработка по фидбеку бета-теста","Beta feedback implementation",Дмитрий Ценеков,High,Done,"Спринт 19 - Финальные доработки",2026-06-20,2026-06-21,16h,17h,"тестирование,доработки","Тестирование"
"A/B тестирование: заголовки","Headlines A/B testing",admin,Normal,Done,"Спринт 19 - Финальные доработки",2026-06-21,2026-06-22,8h,9h,"аналитика,тестирование","Аналитика"
"A/B тестирование: CTA кнопки","Call-to-action buttons testing",admin,Normal,Done,"Спринт 19 - Финальные доработки",2026-06-22,2026-06-23,8h,7h,"аналитика,тестирование","Аналитика"
"A/B тестирование: формы подписки","Subscription forms testing",admin,Normal,Done,"Спринт 19 - Финальные доработки",2026-06-23,2026-06-24,8h,9h,"аналитика,тестирование","Аналитика"
"Техническая документация","Technical documentation",admin,High,Done,"Спринт 19 - Финальные доработки",2026-06-24,2026-06-25,16h,17h,"документация","Документация"
"Пользовательская документация","User documentation",admin,High,Done,"Спринт 19 - Финальные доработки",2026-06-25,2026-06-26,16h,15h,"документация","Документация"
"Приемочное тестирование (UAT)","User acceptance testing with stakeholders",Дмитрий Ценеков,Critical,Done,"Спринт 20 - Стабилизация (RC2)",2026-07-04,2026-07-05,12h,13h,"тестирование,uat","Тестирование"
"Исправление UAT багов","UAT bug fixes",Дмитрий Ценеков,Critical,Done,"Спринт 20 - Стабилизация (RC2)",2026-07-05,2026-07-06,16h,17h,"тестирование,баги","Тестирование"
"Финальные проверки перед релизом","Final pre-release checks",Дмитрий Ценеков,Critical,Done,"Спринт 20 - Стабилизация (RC2)",2026-07-06,2026-07-07,12h,11h,"devops,релиз","Инфраструктура"
"Production развертывание","Production deployment",Дмитрий Ценеков,Critical,Done,"Спринт 21 - Релизная подготовка",2026-07-18,2026-07-19,16h,17h,"devops,развёртывание","Инфраструктура"
"Настройка мониторинга","Monitoring setup (APM, logs)",Дмитрий Ценеков,Critical,Done,"Спринт 21 - Релизная подготовка",2026-07-19,2026-07-20,12h,11h,"devops,мониторинг","Инфраструктура"
"Настройка алертинга","Alerting configuration",Дмитрий Ценеков,Critical,Done,"Спринт 21 - Релизная подготовка",2026-07-20,2026-07-21,12h,13h,"devops,мониторинг","Инфраструктура"
"План инцидент-менеджмента","Incident management plan",admin,High,Done,"Спринт 21 - Релизная подготовка",2026-07-21,2026-07-22,12h,11h,"документация,поддержка","Документация"
"Процессы поддержки","Support processes documentation",admin,High,Done,"Спринт 21 - Релизная подготовка",2026-07-22,2026-07-23,12h,13h,"документация,поддержка","Документация"
"Официальный релиз","Official project launch",admin,Critical,Done,"Спринт 22 - Релиз!",2026-08-01,2026-08-02,8h,8h,"релиз","Релиз"
"Мониторинг после релиза","Post-release monitoring",Дмитрий Ценеков,Critical,Done,"Спринт 22 - Релиз!",2026-08-02,2026-08-03,16h,17h,"devops,мониторинг","Инфраструктура"
"Обработка инцидентов","Incident response",Дмитрий Ценеков,Critical,Done,"Спринт 22 - Релиз!",2026-08-03,2026-08-04,16h,15h,"поддержка,инциденты","Поддержка"
"Исправление пост-релизных багов","Post-release bug fixes",Дмитрий Ценеков,High,Done,"Спринт 23 - Пост-релиз- поддержка",2026-08-15,2026-08-16,16h,17h,"тестирование,баги","Тестирование"
"Поддержка пользователей","User support and assistance",admin,Normal,Done,"Спринт 23 - Пост-релиз- поддержка",2026-08-16,2026-08-17,16h,15h,"поддержка","Поддержка"
"Аналитика пользовательского поведения","User behavior analytics",admin,Normal,Done,"Спринт 23 - Пост-релиз- поддержка",2026-08-17,2026-08-18,16h,17h,"аналитика,метрики","Аналитика"
"Сбор фидбека для v2.0","Feedback collection for next version",admin,Normal,Done,"Спринт 24 - Планирование v2.0",2026-08-29,2026-08-30,12h,13h,"аналитика,планирование","Аналитика"
"Анализ метрик проекта","Project metrics analysis",admin,Normal,Done,"Спринт 24 - Планирование v2.0",2026-08-30,2026-08-31,12h,11h,"аналитика,отчетность","Аналитика"
"Формирование бэклога v2.0","Backlog creation for version 2.0",admin,High,Done,"Спринт 24 - Планирование v2.0",2026-08-31,2026-09-01,16h,17h,"планирование,бэклог","Планирование"`.replace(/^\s+/gm, '');
console.log(parseCSV(CSV));
const CHECK_NO_ISSUES = (DOMAIN != 'https://dts256.youtrack.cloud/');
// ==========================================
async function DO_IT(arrayOfIssues) {
// https://www.jetbrains.com/help/youtrack/devportal/HUB-REST-API_Users_Get-All-Users.html
const users = await fetchJSON('GET', `users?fields=id,ringId,name`);
const user_PM = users.find(user => user.name === PM);
if (!user_PM)
throw new Error(`PM не найден`);
// https://www.jetbrains.com/help/youtrack/devportal/resource-api-issues.html#get_all-Issue-method
const issues = (await fetchJSON('GET', 'issues?fields=id,summary,project(name,id)')).filter(x=>x.project.name==PROJECT);
if (CHECK_NO_ISSUES && issues.length)
throw new Error('У вас уже есть задачи в проекте. Либо удалите задачи, которые есть в проекте, либо установите CHECK_NO_ISSUES = true в значение false');
// https://www.jetbrains.com/help/youtrack/devportal/HUB-REST-API_Projects_Get-All-Projects.html
const project = (await fetchJSON('GET', 'admin/projects?fields=id,name')).filter(x=>x.name==PROJECT)[0];
if (!project)
throw new Error(`Не найден проект с названием ${PROJECT}`);
const ignoreFields = ['Summary', 'Description'];
// https://www.jetbrains.com/help/youtrack/devportal/resource-api-admin-customFieldSettings-customFields.html#get_all-CustomField-method
const customFields = await fetchJSON('GET', `admin/projects/${project.id}/fields?fields=id,field(id,name,fieldType(id,isMultiValue)),bundle(id,values(id,name,$type)),$type`);
if (!arrayOfIssues.length)
throw new Error(`arrayOfIssues не содержит задач для импорта`);
else {
const notFoundFields = Object.keys(arrayOfIssues[0]).filter(x=>![...ignoreFields, ...customFields.map(x=>x.field.name)].includes(x));
if (notFoundFields.length) throw new Error(`Не найдены пользовательские поля задач: `+notFoundFields.join(', '));
}
const customFieldsChecker = customFields.map(x => {
const fieldType = x.field.fieldType.id;
const proxy_data = {
name: x.field.name,
id: x.id,
fieldType,
isMultiValue: x.field.fieldType.isMultiValue,
$type: x.$type
};
if (fieldType === "period" || fieldType === "period[*]")
return {
converter: value => (/^(\d+[ndhmгмдчмс] )*(\d+[ndhmгмдчмс])$/).test(value) ? {presentation: value} : false,
...proxy_data,
};
if (fieldType === "date" || fieldType === "date[*]")
return {
...proxy_data,
converter: value => {
const date = new Date(value);
return isNaN(date.getTime()) ? false : date.getTime();
}
};
if (fieldType === "date and time" || fieldType === "date and time[*]")
return {
...proxy_data,
converter: value => {
const date = new Date(value);
return isNaN(date.getTime()) ? false : date.getTime();
}
};
if (fieldType === "enum[1]" || fieldType === "enum[*]")
return {
...proxy_data,
converter: value => {
if (!x.bundle || !x.bundle.values) return false;
const foundValue = x.bundle.values.find(item =>
item.name.toLowerCase() === value.toLowerCase() ||
item.id === value
);
return foundValue ? {id: foundValue.id, name: foundValue.name, $type: foundValue.$type} : false;
},
"$type":(proxy_data.isMultiValue?'Multi':'Single')+proxy_data.$type
};
if (fieldType === "state[1]" || fieldType === "state[*]")
return {
...proxy_data,
converter: value => {
if (!x.bundle || !x.bundle.values) return false;
const foundValue = x.bundle.values.find(item =>
item.name.toLowerCase() === value.toLowerCase() ||
item.id === value
);
return foundValue ? {id: foundValue.id, name: foundValue.name, $type: foundValue.$type} : false;
}
};
if (fieldType === "user[1]" || fieldType === "user[*]")
return {
...proxy_data,
converter: value => {
const foundUser = users.find(user => user.name === value);
return foundUser ? { ringId: foundUser.ringId } : false;
},
"$type":(proxy_data.isMultiValue?'Multi':'Single')+proxy_data.$type
};
if (fieldType === "string" || fieldType === "string[*]")
return {
...proxy_data,
converter: value => value
};
return {name: x.field.name, fieldType};
});
for (const f of customFieldsChecker) {
if (!f) console.log("WARN: ._.");
if (!f.converter) console.log(`WARN: Неизвестный тип поля ${f.name}: ${f.fieldType}`);
}
for (const issue of arrayOfIssues) {
const customFieldsData = [];
for (const fieldName in issue) {
if (ignoreFields.includes(fieldName)) continue;
const fieldChecker = customFieldsChecker.find(f => f.name === fieldName);
if (!fieldChecker) throw new Error("._.");
if (!fieldChecker.converter) throw new Error(`Неизвестный тип поля ${fieldChecker.name}: ${fieldChecker.fieldType}`);
const value = issue[fieldName];
let convertedValue;
if (fieldChecker.isMultiValue) {
convertedValue = processMultiValueField(value, fieldChecker.converter, );
} else {
convertedValue = fieldChecker.converter(value);
}
if (convertedValue !== false) {
customFieldsData.push({"value": convertedValue, "name": fieldChecker.name, "$type": fieldChecker.$type.replace('Project','Issue'), "id": fieldChecker.id});
} else {
throw new Error("Для задачи "+JSON.stringify(issue)+' поле '+fieldName+' с типом '+fieldChecker.fieldType+' не было разобрано');
}
}
issue._fields_data = customFieldsData;
}
console.log(arrayOfIssues);
let incr = 0;
for (const issue of arrayOfIssues) {
const createdIssue = await fetchJSON('POST','issues', {
"project": {"id": project.id},
"summary": issue.Summary,
"description": issue.Description,
"customFields": issue._fields_data.filter((x,i)=>x.name!='Spent Time')
});
await fetchJSON('POST',`issues/${createdIssue.id}/timeTracking/workItems/`, {
attributes: [],
author:{ringId: user_PM.ringId},
creator:{ringId: user_PM.id},
date: +new Date(issue._fields_data.filter((x,i)=>x.name=='Due Date')[0].value),
duration: issue._fields_data.filter((x,i)=>x.name=='Spent Time')[0].value,
text: '',
type: null
});
console.log((++incr) + '/' + arrayOfIssues.length);
}
console.log("Успешно!!!");
}
DO_IT(parseCSV(CSV));
// ==========================================
async function fetchJSON(method, url, body) {
const r = await fetch(DOMAIN+'api/'+url, {
method: method,
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer '+ACCESS_TOKEN,
'Cache-Control': 'no-cache',
'Content-Type': 'application/json'
},
body: body && JSON.stringify(body)
}).catch(_=>{throw new Error(`CORS? Run it in NODE.JS or DevTool on ${DOMAIN}!`);});
if (!r.ok) {
let err;
try{
err = await r.json();
} catch (e){};
throw new Error(`ERROR (${method} ${DOMAIN+'api/'+url}) ${r.status}`+(err?': '+JSON.stringify(err):''));
}
return await r.json();
}
function periodToMilliseconds(period) {
const match = period.match(/(\d+)([hmd])/);
if (!match) return 0;
const value = parseInt(match[1]);
const unit = match[2];
switch (unit) {
case 'h': return value * 60 * 60 * 1000;
case 'm': return value * 60 * 1000;
case 'd': return value * 24 * 60 * 60 * 1000;
default: return 0;
}
}
function processMultiValueField(value, converter) {
const values = value.split(',').map(v => v.trim());
const convertedValues = values.map(v => converter(v)).filter(v => v !== false);
return convertedValues.length > 0 ? convertedValues : false;
}
function parseCSV(csv) {
const lines = CSVToArray(csv,',');
const headers = lines[0];
const result = [];
for (let i = 1; i < lines.length; i++) {
const obj = {};
const currentline = lines[i];
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
return result;
}
function CSVToArray(strData, strDelimiter){
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp("(\\" + strDelimiter + "|\\r?\\n|\\r|^)(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|([^\"\\" + strDelimiter + "\\r\\n]*))", "gi");
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec(strData)) {
var strMatchedDelimiter = arrMatches[1];
if (strMatchedDelimiter.length && strMatchedDelimiter !== strDelimiter) arrData.push([]);
var strMatchedValue;
if (arrMatches[2])
strMatchedValue = arrMatches[2].replace(new RegExp( "\"\"", "g" ), "\"");
else
strMatchedValue = arrMatches[3];
arrData[arrData.length - 1].push(strMatchedValue);
}
return arrData;
}
})();