client event - instasport/club-api GitHub Wiki

Расписание и тренировки (посещения) клиента

Для получения расписания тренировок и посещений клиента в заголовке авторизации нужно указать токен (авторизованного клиента) и клуб.

Расписание клиента

Расписание - это список тренировок на которые клиент может записаться. Это расписание почти не отличается от общего расписания в клубе. Для ускорения загрузки расписания можно использовать пагинацю, которая позволяет загрузить расписание постепенно. Для этого при запросе необходимо указать два параметра page - номер страницы, pageSize - размер страницы.

Важное отличие - это варианты оплаты. Если задан клиент, то в в каждой тренировке возвращается поле payments и cards. Эти поля показывают, какие есть варианты оплаты за эту конкретную тренировку.

Параметры (необязательные)

startDate - начальная дата, если не указана, то используется сегодняшняя
startTime - время, начиная с которого показывать тренировки
startDateTime - дата и время, начиная с которого показывать тренировки (если указано startDateTime, то startDate и startTime не учитываются)
endDate - конечная дата, если не указана, то возвращаются все тренировки, начиная со startDate
endTime - время, до которого показывать тренировки
endDateTime - дата и время, до которого показывать тренировки (если указано endDateTime, то endDate и endTime не учитываются)
hall - ID зала, если не указан то показываются посещения по всем залам в клубе
zone - ID зоны, если не указан то показываются посещения по всем зонам в клубе
gender - пол посетителей
activityId - ID activity, если не указан показываются тренировки по всех типах тренировок
instructorId - ID инструктора, если не указан показываются тренировки всех инструкторов
complexityId - ID сложности, если не указан показываются тренировки по всех сложностях

myCards - показывать только тренировки на которых можно использовать абонемент пользователя(bool)
myVisits - показывать только тренировки, на которые записан пользователь(bool)

morning - показывать утренние тренировки (bool)
day - показывать дневные тренировки (bool)
evening - показывать вечерние тренировки (bool)

page - номер страницы
pageSize - количество тренировок на странице

Если зал не указан, то показываются все групповые тренировки, изо всех залов.

Если начало периода или конец периода не заданы, то показываются тренировки за один сегодняшний день.

Если morning/day/evening не выбраны, то показываются все тренировки, если выбраны все, тоже показываются все

Если номер страницы больше чем кол-во страниц при текущем pageSize, то придет пустой массив

query ClientEvents {
  clientEvents(startDate: "2020-09-01", endDate: "2020-10-01", hall: 5, gender: 2, page:1, pageSize:20, activityId:149, instructorId:88745, myCards:true, myVisits:false, morning:true, day:false, evening:false) {
    id
    date
    duration
    title
    seats
    activity {
      id
      slug
      title   
      description
      image
    }
    complexity {
      id
      title
      order
      description
      descriptionHtml
      color
      textColor
    }
    description
    descriptionHtml
    image
    instructors {
      id
      firstName
      lastName
      instructorImage
    }
    hall
    color
    textColor
    variant
    gender
    status
    payment
    payments {
        choice
        title
    }
    zone {
        id
        title
    }
    visitors{
      avatar
      name
      gender
      ageGroup {
        title
      }
    }
    ageInfo {
        gender {
            id
            title
        } 
        ageGroup {
            id
            title
        }
        tagTitle
        tagDescription
        tagKeywords
        ogType
        ogSiteName
        ogTitle
        ogDescription
        ogImage
        ogImageWidth
        ogImageHeight
        ogImageType
        ogImageAlt
    }
  }
}

Поля

duration - время тренировки в минутах
cards - абонементы, которыми можно оплатить тренировку
status - текстовое поле

Поле payment (deprecated) показывает каким способом можно совершить авторизацию (оплату) тренировки

-1 - Заявка
2 - Liqpay
3 - Абонемент
4 - Счет
5 - Бронирование
10 - Portmone
11 - WayForPay

Поле payments показывает каким способом можно совершить авторизацию (оплату) тренировки и название этого способа

-1 - Заявка
2 - Liqpay
3 - Абонемент
4 - Счет
5 - Бронирование
11 - WayForPay

"payments": [
    {
        "choice": 4,
        "title": "Оплатить со счета"
    },
    {
        "choice": 2,
        "title": "Оплатить онлайн"
    }
],

Поле variant

1 - Групповая
2 - Индивидуальная
3 - Сплит

Поле gender

0 - Не определен
1 - Парень
2 - Девушка

Получение информации об одной тренировке

Для получения информации об одной тренировке обязательно указать ID тренировки.

query ClientEventDetail {
  clientEvent(id: 572668, profileId:123456) {
    id
    date
    duration
    title
    seats
    activity {
      id
      slug
      title   
      description
      image
    }
    complexity {
      id
      title
      order
      description
      descriptionHtml
      color
      textColor
    }
    description
    descriptionHtml
    image
    instructors {
      id
      firstName
      lastName
      instructorImage
    }
    hall
    zone {
        id
        title
    }
    color
    textColor
    variant
    gender
    status
    onlineUrl
    clientsCount
    clientsAge
    clientsGender {
        male
        female
        unknown
    }
    payment 
    payments {
        title
        choice
    }
    cards {
      id
    }
    account
    price
    promocodePrice
    options {
      id
      title
      description
      image
      price
      promocodePrice
    }
    family {
         id 
         firstName 
         lastName 
         birthday 
         gender 
         relation
         liqpay(clientReturnUrl: "url", eventId: 572668) {
              data
              signature
              action
              price
              clientCommission
              comment
        }
        wayforpay(clientReturnUrl: "url", eventId: 572668) {
            price
        }
    }
    liqpay(clientReturnUrl: "url") {
      data
      signature
      action
      price
      clientCommission
      comment
    }
    wayforpay(clientReturnUrl: "url") {
      merchantAccount
      merchantDomainName
      merchantSignature
      orderReference
      orderDate
      amount
      currency
      productName
      productCount
      productPrice
      returnUrl
      serviceUrl
      action
      price
      clientCommission
      comment
    }
    visitors{
      avatar
      name
      ageGroup {
        title
      }
    }
    ageInfo {
        gender {
            id
            title
        } 
        ageGroup {
            id
            title
        }
    }
  }
    visitSet {
      id
      paidStatus
      paid
      paidByCard {
        dueDate
        amount
        template {
          title
          subtitle
          group {
            title
          }
        }
      }
      liqpay(clientReturnUrl: "https://") {
        data
        signature
        action
      }
      wayforpay(clientReturnUrl: "https://") {
        merchantAccount
        merchantDomainName
        merchantSignature
        orderReference
        orderDate
        amount
        currency
        productName
        productCount
        productPrice
        returnUrl
        serviceUrl
        action
        price
        clientCommission
        comment
      }

      status
      visitOptions {
        id
        optionId
        title
        price
        image
        description

        paid
      }
      refundable
      payments {
        choice
        title
        description
      }

      cards {
        id
        dueDate
        template {
          title
          subtitle
          amount
          price
        }
      }
      authorized
      user {
        id
        firstName
        lastName
        avatar
      }
    }

}

Дополнительные поля

payment (deprecated) - варианты оплат
payments - варианты и названия оплат, например "payments": [{"choice": 4,"title": "Оплатить со счета"},]
cards - абонементы, которыми можно оплатить тренировку
account - количество денег на счету. если разрешена оплата со счета, то дополнительно сравнивать цену и состояние счета не нужно (это не так просто, учитывая наличие цены с промокодом)
price - цена разового посещения
promocodePrice - цена разового посещения по промокоду. Если совпадает с price, то значит скидки нет
family - список семейных профилей. Используется для записи на тренировку одного из семейных профилей
onlineUrl - ссылка на онлайн тренировку. Доступна для клиентов оплативших тренировку. Доступна начиная с времени указанного в тренировке и до конца тренировки
zone - зона в которой проходит тренировква
visitors - массив профилей пользлвателей оплативших тренировку
options - массив доступных опций

Поле payment показывает каким способом можно совершить авторизацию (оплату) тренировки

-1 - Заявка
2 - Liqpay
3 - Абонемент
4 - Счет
5 - Бронирование
10 - Portmone
11 - WayForPay

Поля для онлайн оплаты

liqpay - данные для кнопки оплаты Liqpay
wayforpay - данные для кнопки оплаты WayForPay

Необязательные параметры:

clientReturnUrl - строка, url на который буде перенаправлен клиент после совершения оплаты
liqpay(clientReturnUrl: "url")

Пример кнопки оплаты Liqpay

<form method="post" action="{{action}}" accept-charset="utf-8">
  <input type="hidden" name="data" value="{{data}}">
  <input type="hidden" name="signature" value="{{signature}}">
</form>

Пример кнопки оплаты WayForPay

<form method="post" action="https://secure.wayforpay.com/pay" accept-charset="utf-8">
  <input type="hidden" name="merchantAccount" value="instasport_co">
  <input type="hidden" name="merchantAuthType" value="SimpleSignature">
  <input type="hidden" name="merchantDomainName" value="instasport.co">
  <input type="hidden" name="merchantSignature" value="2b065fefa2686db641afc7a0f14248d7">
  <input type="hidden" name="orderReference" value="16622 card 79322">
  <input type="hidden" name="orderDate" value="1605871730">
  <input type="hidden" name="amount" value="1000.00">
  <input type="hidden" name="currency" value="UAH">
  <input type="hidden" name="productName[]" value="Абонемент '79322 / A Q / TRX / 12 тренировок  / 12'">
  <input type="hidden" name="productCount[]" value="1">
  <input type="hidden" name="productPrice[]" value="1000.00">
  <input type="hidden" name="returnUrl" value="https://instasport.co/club/test/client/return/card/79322/">
  <input type="hidden" name="serviceUrl" value="https://instasport.co/club/test/wayforpay/callback/">
</form>

Текстовое поле status

'Время регистрации прошло',
'Тренировка уже началась',
'Тренировка прошла',
'Нет мест',
'Нет мест. Можно подать заявку',
'1 место',
'2 места',
'Вы уже подали заявку',
'Место на тренировке забронировано',
'Тренировка вам подарена',
'Тренировка оплачена за наличные',
'Тренировка оплачена кредитной картой',
'Тренировка оплачена абонементом',
'Тренировка оплачена со счета',
'Тренировка оплачена через терминал',
'Тренировка оплачена',
'Тренировка частично оплачена',
'Тренировка авторизована',
'Тренировка частичтно авторизована',

Статистическая информация о тренировке

Клиент который делает запрос учитывается в статистику.

clientsCount - оличество оплаченых тренировок, учитываются все тренировки, кроме заявок
clientsAge - список возрастов клиетов, учитываються только уникальные клиенты
clientsGender {male female unknown} - количество посетителей терировки дя каждого пола, учитываються только уникальные клиенты
ageInfo {gender {id title } ageGroup {id title}} - информация о поле и возрастной группе клиентов

Пример полученных данных

"clientsCount": 10,
"clientsAge": [
    28,
    26,
    61,
    26,
    30,
    20
 ],
"clientsGender": {
    "male": 5,
    "female": 1,
    "unknown": 4
}
"ageInfo": [
    {
       "gender": {
           "id": "2",
            "title": "Девушка"
       },
       "ageGroup": {
           "id": "6",
            "title": "Группа С"
        }
     },
     "gender": {
           "id": "1",
            "title": "Парень"
       },
       "ageGroup": {
           "id": "1",
            "title": "Молодежь"
        }
     },
 ],

Оценки тренировок

После окончания тренировки, клиент оплативший и не пропустивший тренировку может оставить оценки тренировки. Возможность оценивания тренировки клиентом можно получить в поле markAllowed. Доступные критерии оценивания можно получить в поле criteria.

    markAllowed - bool,  возможность оставить оценку
    criteria { - массив, критерии оценивания
        title - название оценки
    }
    markHistory - массив, история оставленных оценок
query ClientEventDetail {
  clientEvent(id: 572668) {
    id
    markAllowed
    criteria {
        id
        title
    }
    markHistory{
        portalCriterion {
            id
            title
        }
        mark
        comment
        dateCreated
        profile {
            id
        }
    }
}

Оставить оценку

Параметры запроса

eventId - int, ID тренировки. Обязательный параметр.
marks - JSON string, данные введенные клиентом. Обязательный параметр.
mutation MarkEvent {
    MarkEvent(eventId: 772566, marks: "[{"id": "3", "mark": "3", "comment": "comment text"}, {"id": "4", "mark": "4", "comment": "comment text"}]") {
    event{
        id
        markHistory {
            portalCriterion{
                title
            }
            mark
            comment
        }
    }
}

Редактирование оценки

Параметры запроса

eventId - int, ID тренировки. Обязательный параметр.
marks - JSON string, данные введенные клиентом. Обязательный параметр.
        id - int, ID оценки которую необходимо оредактировать,
        mark - int, оценка
        comment - string, комментарий
mutation UpdateMarkEvent {
    updateEventMark(eventId: 772566, marks: "[{"id": "27", "mark": "3", "comment": "comment text"}, {"id": "28", "mark": "4", "comment": "comment text"}]") {
    event{
        id
        markHistory {
            portalCriterion{
                title
            }
            mark
            comment
        }
    }
}

Удалить оценку

Параметры запроса

eventId - int, ID тренировки. Обязательный параметр.
mutation {
deleteEventMark(eventId:772566) {
    event {
        id
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️