Giter Site home page Giter Site logo

refugee.questionnaire's People

Contributors

againddm avatar dilesoft avatar kenoma avatar kleorn avatar s207883 avatar vinogradovivanovsky avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

refugee.questionnaire's Issues

Скорректировать сортировку записей в отчете

Сейчас записи сортируются как на скриншоте: по дням - снизу вверх (новые дни сверху), но внутри дня по времени - сверху вниз (самое позднее время снизу):
Screenshot_20220517_203750

Нужно сделать сортировку и по дням, и по времени снизу вверх (самая последняя запись - всегда самая верхняя)

Более детальное указание запрашиваемой гуманитарки

В некоторых пунктах нужно доделать выбор:
Например постельное белье
-подушка (кол-во)

  • одеяло(кол-во)
    -Постельный комплект...
    -матрац..
    -другое ...
    Так же с посудой
    И с одеждой не только размеры , а в сантиметрах дополнить . Так как размеры не соответствуют.

Нужны таймстампы в логах.

В целях упрощения диагностики предлагаю сделать логи более информативными - как минмум не хватает таймстампов. Возможно имеет смысл добавить еще какую-либо инфу в них.

Кнопка Обратно

  1. Кнопка Обратно перекидывает в самое начало меню. Это дезориентирует.

Как лучше:

  • по Обратно уходить на один уровень выше
  • и в головном меню - не отображать Обратно

Исключить лишние поля из CSV + изменения в полях Username и Timestamp

По просьбе заказчика удалить поля и не сохранять в базу (в том числе во избежание хранения лишних ПД):

  1. UserId

  2. Id

  3. IsCompleted

  4. FirstName

  5. LastName

  6. IsAdmin

  7. Добавлять в начало к значению поля Username символ @

  8. Переименовать столбец Username в "Telegram"

  9. Переименовать столбец Timestamp в "Дата заполнения" (для краткости - на самом деле в идеале там будут дата-время - см. #3 )

Select Users

Необходимо пользователям без даты присваивать не текущую дату а например
public DateTime Created { get; set; } =Convert.ToDateTime("01.01.2000");

Реализовать вывод блока вопросов в случае положительного ответа на вопрос-условие с кнопками Да/Нет

Задавать вопрос "Есть возможность помочь с жильем?" (да/нет), и если да - задаем про жилье вопросы, если нет - сразу следующий блок

Вариант реализации 1 (сложный, универсальный):

1)добавить в конфиг столбец Answers: пусто или json {"Да":EnableCategoryButton, "Нет":Button} (тогда выводить кнопки: Да, Нет и т.п.)

  1. если столбец Category (или другой создать, чтобы кнопки категорий не включались) не пустой и ранее был вопрос
    с такой же Category и одним из вариантов ответа EnableCategoryButton - задавать только если выбран этот ответ.
    В противном случае задавать всегда.

Вариант 2 (простой, не универсальный, но на 95% нужен только он):

В ValidationRegex писать "(Да|Нет)", и тогда показывать кнопки Да, Нет и считать этот вопрос триггером категории

Питерский бот

Ключ и админов скинул в личку, опросник лежит в demo-mirsklad-ref-quest-6.csv

Доработки для записи видеоинструкции

Вместо текста
———
Год рождения (в формате: 2022)
———

написать текст
———
Год рождения — например, 1982 (нужен только год рождения, а не дата)
———

В боте Белгорода при отправке анкеты выдавать сообщение:
———
Спасибо! Ваша анкета отправлена команде волонтёров Белгорода "Путь в будущее" https://t.me/putvbud
———

Выгрузка в excel

на выгружается часть архива с последнего архива с 11.07-24.07
в самом архиве записи есть, локально отрабатывает
на сервере памяти добавляли
PS может что то с библиотекой excel

Добавить информацию о работе с репозиторием.

Добрый день, увидел статью о вас в группе СМ.

Можете добавить контакты для связи, либо где можно получить информацию о доске и текущих задачах и требуемом функционале?

Работаю с похожим стеком, думаю, мог бы помочь.

Добавить разновидность вопросов, ответ в которых выбирается из перечня заранее предопределенных

  • В модели QuestionnaireEntry нужно добавить новое поле string[] AnswerVariations. которое должно корректно считываться из csv (конвертер можно запилить в QuestionnaireEntryClassMap).
  • В самой csv сделать столбец, в котором варианты ответов будут записаны в строку с разделителем, например 1|2|3|4
  • В методе SendQuestMessageToUser проверять, если ли варианты AnswerVariations или нет, если есть - рендерить вопрос с блоком кнопок
  • Коллбек от кнопки можно повесить на TryProcessStateMachineAsync
  • Поправить ридми

Правки бота Воронежа

Бот https://t.me/help_refugees_voronezh_bot
Файл ref-9036.csv

Нужно исправить:

  1. При заполнении анкеты два первых вопроса появляются одновременно, перепутанные местами. Вначале должен идти вопрос "ФИО...", а после ответа на него -- вопрос "Вы уже заполняли заявку через этого бота?"
  2. Вопрос "Вы уже заполняли заявку через этого бота?" должен быть голосовалкой, чтобы выбор был из двух вариантов, а не текстовые ответы.
  3. Вопросы и реакции на некорректные ответы на них нужно привести в соответствие. Сейчас при ответе на вопрос "год рождения" бот пишет: "ЭТОТ БОТ ТОЛЬКО ДЛЯ ВОРОНЕЖСКОЙ ОБЛАСТИ!" -- хотя это реакция в случае некорректного ответа на вопрос про регион пребывания.

Параметр командной строки для выбора направления сортировки по времени

Добавить необязательный параметр командной строки для выбора направления сортировки по времени:
asc - старые записи сверху, новые снизу
desc - старые снизу, новые сверху (как сейчас)

По умолчанию, если параметр не указан, выбирать asc

Кнопка Перезаполнить

  1. Кнопка Перезаполнить: (...) удаляет весь выбор под пунктом меню. Сценарий. Хочу указать размер обуви и заказать несколько видов обуви. Для этого задуман раздел Одежда и обувь/Обувь. (скриншот). Нажимаю Размер, ввожу размер. Оказываюсь на верхнем уровне. Вижу кнопку Перезаполнить: Верхняя одежда. При нажатии на нее появляется кнопка с прежним названием Верхняя одежда, но если дойти до Одежда и обувь/Обувь весь выбор внутри него сбрасывается! Получается, не могу выбрать внутри Обуви несколько пунктов (размер и виды обуви).

Как лучше:
Переименовать Перезаполнить на Изменить (волонтеры просили). И по нажатию - уходить вглубь (не удалять все сразу). Далее в глубине - аналогичный принцип.

Добавить включ валидации конфига

Добавить ключ ,булевый --check-config , при указании которого запуска приложения не происходит, а происходит вычитывания файла с вопросами и выход с кодом возврата 0, если файл валидный, и не 0, если невалидный.

Поправки API

1 Добавить в LiteDbRepo и в IRepository соответственно

RefRequest[] GetRequestsDt(DateTime dt);
    RefRequest[] GetRequestsDtArch(DateTime dt);
    UserData[] GetUsersDt(DateTime dt);
public RefRequest[] GetRequestsDt(DateTime dt)
    {
        using var db = new LiteDatabase(Path.Combine(_dbPath, "current_requests.ldb"));

        var collection = db.GetCollection<RefRequest>(nameof(RefRequest));
        collection.EnsureIndex(z => z.Id);
        collection.EnsureIndex(z => z.TimeStamp);

        return collection.Find(z => z.TimeStamp > dt).OrderBy(z => z.TimeStamp).ToArray();

      
    }
    public RefRequest[] GetRequestsDtArch(DateTime dt)
    {
        var getAllArchives = Directory.GetFiles(_dbPath, "*current_requests.ldb");

        var retval = new List<RefRequest>();
        foreach (var archive in getAllArchives)
        {
            using var db = new LiteDatabase(archive);

            var collection = db.GetCollection<RefRequest>(nameof(RefRequest));
            collection.EnsureIndex(z => z.Id);
            collection.EnsureIndex(z => z.TimeStamp);

            retval.AddRange(collection.Find(z => z.TimeStamp > dt).OrderBy(z => z.TimeStamp));
        }

        return retval.OrderBy(t => t.TimeStamp).ToArray();
    }
public UserData[] GetUsersDt(DateTime dt)
    {
        using var db = new LiteDatabase(Path.Combine(_dbPath, "users.ldb"));

        var collection = db.GetCollection<UserData>(nameof(UserData));
        collection.EnsureIndex(z => z.Token);
        collection.EnsureIndex(z => z.UserId, unique: true);
        collection.EnsureIndex(z => z.Created);

        return collection.Find(z => z.Created > dt).OrderBy(z => z.Created).ToArray();
    }

в контролер QuestionariesArchiveController.cs

/// <summary>
        ///     Возвращает записи из таблицы от даты
        /// </summary>
        /// <returns></returns>
        /// <response code="200">Список анкет</response>
        /// <response code="401">Не передан токен для доступа</response>
        [HttpGet("refrequestDt")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status401Unauthorized)]
        public IActionResult GetRecordsDate([FromHeader(Name = "X-Volunteer-Token")] string token, [Required(ErrorMessage = "Установите дату")] DateTime? dt)
        {
            _logger.LogTrace("Someone requested {Method} with {Token}", nameof(GetRecords), token);

            if (!_repo.IsKnownToken(token))
            {
                return Unauthorized();
            }
            var records = _repo.GetRequestsDt((DateTime)dt);

            return Ok(records);
        }
        /// <summary>
        ///     Возвращает записи из архива от даты
        /// </summary>
        /// <returns></returns>
        /// <response code="200">Список анкет</response>
        /// <response code="401">Не передан токен для доступа</response>
        [HttpGet("refrequestDtArch")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status401Unauthorized)]
        public IActionResult GetRecordsDateArch([FromHeader(Name = "X-Volunteer-Token")] string token, [Required(ErrorMessage = "Установите дату")] DateTime? dt)
        {
            _logger.LogTrace("Someone requested {Method} with {Token}", nameof(GetRecords), token);

            if (!_repo.IsKnownToken(token))
            {
                return Unauthorized();
            }
            var records = _repo.GetRequestsDtArch((DateTime)dt);

            return Ok(records);
        }
      /// <summary>
        ///     Возвращает записи пользователей из хранилища бота по дате
        /// </summary>
        /// <returns></returns>
        /// <response code="200">Список пользователей</response>
        /// <response code="401">Не передан токен для доступа</response>
        [HttpGet("usersdt")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status401Unauthorized)]
        public IActionResult GetUsersDate([FromHeader(Name = "X-Volunteer-Token")] string token, [Required(ErrorMessage = "Установите дату")] DateTime? dt)
        {
            _logger.LogTrace("Someone requested {Method} with {Token}", nameof(GetRecords), token);

            if (!_repo.IsKnownToken(token))
            {
                return Unauthorized();
            }

            var records = _repo.GetUsersDt((DateTime)dt);

            return Ok(records);
        }

4 в QuestionariesArchiveController -> GetRecords сортировку по дате
var records = _repo.GetAllRequests().OrderByDescending(z => z.TimeStamp);

Добавить возможность задавать суперадмина через CLI.

Далеко не всегда человек который запускает бота, и человек, котоырй должен быть в нём админом, один и тот же человек.
Было бы гораздо удбнее, если бы был ключ командной строки --adminID, куда можно было бы передать идентификатор админского пользователя при запуске. Это исключит возможность кому-то левому стать "первым написавшим."

Навигация по меню

Навигация по меню. Сценарий: Открыть пункт меню с вопросами, например, Одежда и обувь / Верхняя одежда. Ответить на вопросы. После этого бот возвращается на самый верхний уровень меню. Тесты на людях показали, что это сбивает с толку. Надо оставаться на том же уровне меню (в примере - внутри Одежда и обувь). Для глубоких пунктов это еще и сэкономит время, чтобы не искать их снова для продолжения (пример - Одежда и обувь / Обувь).

Добавить в конфиг анкеты поле ColumnName

Чтобы была преемственность данных при изменении текста вопроса, добавить в конфиг анкеты поле ColumnName (без ограничений набора символов, в т.ч. русские буквы с пробелами) и использовать его как ключ поля + выводить в заголовке в отчетах

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.