Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

Тема: Предложения по улучшению функционала GameKeeper

  1. #11
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    Идея полностью переписать этот Game Keeper не покидает меня, но я ограничиваюсь лишь нужными мне приложениями.
    Хотите забивать кучу товаров по категориям - прямо из экселевского файла?
    Без проблем - можно написать стороннюю программу, раз они не хотят.
    Может ваш штатный админ напишет? Там не нужно никаких суперпознаний в программировании - обычная работа с базой данных. Анализируешь входные данные и отправляешь кучу запросов.

    Я к примеру сделал программу для восстановления магнитной полосы на картах - через записывающий MSR206 девайс. Ввел номер, провел картой, готово.

    Сгорание бонусов - можно сделать через планировщик заданий - до выполнения бэкапа.
    Вот пример:
    Код:
    UPDATE [gkArcade].[gk].[GK_CARDS] SET [Bonus] = 0 WHERE DATEADD(day,90,[CardLastUse]) < GETDATE()
    Если картой не пользоваться 90 дней - бонусы сгорают.

  2. #12
    Разбирающийся
    Регистрация
    10.08.2010
    Адрес
    Иваново
    Сообщений
    924
    Поблагодарил(а)
    27
    Благодарностей: 47 (сообщений: 40)
    11. Возможность удаленной заливки прошивок на ZB контроллеры и ТД. Без программатора.
    12. Сохранять настройки (Адрес, канал, PAN ID) при перепрошивке.

  3. #13
    Разбирающийся
    Регистрация
    18.10.2012
    Адрес
    Новосибирск, Омск
    Сообщений
    5,362
    Поблагодарил(а)
    188
    Благодарностей: 462 (сообщений: 364)
    Сгорание бонусов - можно сделать через планировщик заданий - до выполнения бэкапа.
    Вот пример:
    Респект за знание структуры БД и SQL, но...

    Возвращаясь к теме топика (вступлюсь за UCS, они мне за это приплачивают): предложенный вариант - это костыль который на первый взгляд решает проблему, но создаст кашу в отчетах, т.к. начисления бонусов будут, а операций отражающих их сгорание - нет. В итоге на вопрос гостя: А куда делись мои бонусы? никто ничего ответить не сможет т.к. ни в одном отчете этого видно не будет.

    Хорошо если кассир вспомнит про сгорание через 90 дней и сможет "на пальцах" объяснить гостю что к чему. Но кассир этого не сделает, а особенно в случае когда внесений бонусных было много и часть из них уже просрочена...

  4. #14
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Цитата Сообщение от sibgaba Посмотреть сообщение
    Респект за знание структуры БД и SQL, но...

    Возвращаясь к теме топика (вступлюсь за UCS, они мне за это приплачивают): предложенный вариант - это костыль который на первый взгляд решает проблему, но создаст кашу в отчетах, т.к. начисления бонусов будут, а операций отражающих их сгорание - нет. В итоге на вопрос гостя: А куда делись мои бонусы? никто ничего ответить не сможет т.к. ни в одном отчете этого видно не будет.

    Хорошо если кассир вспомнит про сгорание через 90 дней и сможет "на пальцах" объяснить гостю что к чему. Но кассир этого не сделает, а особенно в случае когда внесений бонусных было много и часть из них уже просрочена...
    Ну так, чтобы людям не приходилось, делать костыли , нужно делать нормальный и продуманный функционал.И прислушиваться к предложениям юзеров.

  5. #15
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    да с этими отчетами вообще бида - UCS для чего то придумали две таблицы с транзакциями. Люди знающие SQL при желании смогут все это организовать. Если бы не лень я бы даже написал вам его - там надо использовать курсор.

    Я очень хочу увидеть вменяемую документацию по всему функционалу Game Keeper - а то чтобы узнать как работает та или иная фишка - приходится эксперементировать. Лучше чтобы была документация - где описано назначение каждой вкладки в редакторе, каждого поля вкладки и примеры его заполнения для реализации тех или иных функций.

  6. #16
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    Вчера меня перло и поэтому я сделал проверку временного периода на валидность - тоесть проверяет действует ли выбраный период в текущее время. Вот код функций:

    Первая для получения значения бита из переменной с областью значений байта (254...0):
    Код:
    CREATE FUNCTION [gk].[GetBit] (@val int,@bit int) RETURNS bit AS
    BEGIN
        DECLARE @out bit = 0
        DECLARE @i int = 7
        WHILE @i >= 0 BEGIN
            IF(@val >= POWER(2,@i)) BEGIN
                SET @val -= POWER(2,@i)
                IF(@i = @bit)BEGIN SET @out = 1 END
            END
            SET @i -= 1
        END
        RETURN @out
    END
    И вторая сама проверка периода, возвращает число совпавших интервалов в данном периоде - ноль если нет совпадений. Если периоды составлены из не пересекающихся временнных интервалов то будет возвращать 1 если период действителен.

    Код:
    CREATE FUNCTION [gk].[CheckPeriod] (@period int) RETURNS int AS
    BEGIN
    DECLARE @TIME int = DATEPART(HOUR, GETDATE())*60 + DATEPART(MINUTE, GETDATE())
    DECLARE @out int = (SELECT count(*)      
      FROM [gkArcade].[gk].[PERIODDETAILS]
      WHERE ([PERIOD] = @period)AND([STATUS] = 3)AND(IIF(([STARTTIME]<= @TIME)AND([ENDTIME] >= @TIME),32*gk.GetBit([DATEFLAGS],5),0)+
      IIF((gk.Getbit([DAYSOFWEEK],DATEPART(weekday,GETDATE())) = 1),gk.GetBit([DATEFLAGS],0),0)+
      IIF(([STARTDATE]<=GETDATE())AND([ENDDATE]>=GETDATE()),16*gk.GetBit([DATEFLAGS],4),0)+
      IIF((DATEADD(year,YEAR(GETDATE())-YEAR([STARTDATE]),[STARTDATE])<=GETDATE())AND(DATEADD(year,YEAR(GETDATE())-YEAR([ENDDATE]),[ENDDATE])>=GETDATE())AND(gk.GetBit([DATEFLAGS],3)=1),8*gk.GetBit([DATEFLAGS],3)+4*gk.GetBit([DATEFLAGS],2)+2*gk.GetBit([DATEFLAGS],1),0)+
      IIF((DAY([STARTDATE])<=DAY(GETDATE()))AND(DAY([ENDDATE])>=DAY(GETDATE()))AND(gk.GetBit([DATEFLAGS],3) = 0)AND(gk.GetBit([DATEFLAGS],4) = 0),6*gk.GetBit([DATEFLAGS],1)*gk.GetBit([DATEFLAGS],2),0) = [DATEFLAGS] ))
      RETURN @out
    END
    Пример:
    Код:
    SELECT * FROM [gkArcade].[gk].[GK_BONUSES]   WHERE [gkArcade].[gk].CheckPeriod([PERIOD])>0
    Покажет ВСЕ действующие по времени бунусы.

    И код обнуляющий бонусы с транзакциями - через курсор
    Считается что ид 2 у пользователя админ - транзакции от его имени
    Код:
    DECLARE @CARD int
    DECLARE @Level int
    DECLARE @Bonus money
    DECLARE upd CURSOR READ_ONLY FOR
    SELECT [CARD],[Bonus],[Level] FROM [gkArcade].[gk].[GK_CARDS] 
    WHERE DATEADD(day,90,[CardLastUse]) < GETDATE() --карты не активные 90
    OPEN upd
    FETCH NEXT FROM upd INTO @CARD,@Bonus,@Level
    WHILE (@@FETCH_STATUS <> -1) BEGIN --Операция "Списание бонусов" ид 850
    INSERT INTO [gkArcade].[gk].[TRANSACTS] ([DATE],[ACCOUNT],[EMPLOYEE],[ACTIVITY],[VALUE1],[UNIT1],[VALUE2],[UNIT2],[QUANT],[CREATOR],[CREATORADDR],[CREATORDATE],[CARD],[DEAL],[CheckItem]) 
                        VALUES(GETDATE(),@CARD,2,850,1,401,@BONUS,401,1,1,1,GETDATE(),@CARD,NULL,0)
    INSERT INTO [gkArcade].[gk].[GK_TRANSACTS]([DATE],[ACTIVITY],[CARD],[ACCOUNT_TYPE],[VALUE],[QUANT],[CREATOR],[CREATORADDR],[DEAL],[CHECK_ITEM],[EMPLOYEE],[LEVEL],[ARCADE],[GUID],[TRANSACT_GUID]) 
                        VALUES(GETDATE(),850,@CARD,2,-@BONUS,0,1,1,NULL,0,2,@Level,1,newid(),newid())
    -- обнуляем бонус
    UPDATE [gkArcade].[gk].[GK_CARDS] SET [Bonus] = 0 WHERE [Card]=@CARD
    FETCH NEXT FROM upd INTO @CARD,@Bonus,@Level
    END
    CLOSE upd
    Надеюсь данный код поможет вам реализовать вашу бизнеслогику не входящую в функционал Game Keeper
    Последний раз редактировалось NeiroN; 27.02.2015 в 12:45.

  7. #17
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Собрал воедино и отправил в UCS , все предложения.
    Ответили как ни странно.


    Выделю главное​, без воды.

    Александр.

    Сейчас мы разрабатываем новую логику работы тарификации и большая часть из
    описанного ниже планируется к реализации.

    Некоторые комментарии в пожеланиям ниже.

    Предложения:
    1) Добавить возможность завершать тарификации на кассе которые были открыты
    на контроллере.
    2) Добавить возможность обнулять карты клиента по одной или массово (с
    указанием интервала номеров например) , или по заданным параметрам, например
    "Обнулить все карты с балансом менее < x " .
    Очень много клиентов не гасят свой минус, и все карты приходится обнулять
    через SQL.

    Ответ UCS
    Обнуление карт реализовано не будет. Предварительно принцип планируется
    следующим. Незакрытие тарификации будут автоматически закрываться в конце
    дня со списанием средств за полное время тарификации. Если баланс карт при
    этом будет уходить в минус, то разница
    Будет храниться отдельно для возможности получения отчёта по этим данным.

    8) Добавить отчетность по кассовым операциям (возможно я что-то не знаю) ,
    но я нигде не видел отчета По Х и З - отчетам.
    В R-keeper это называется кассовый протокол, здесь подобного ничего нету .

    Ответ UCS
    Планируется добавить в версии 3.27. Но следует учитывать, что принципы
    работы R-Keeper и Game-Keeper разные. Не все, что логично для одной системы
    логично для другой.

    9) Предлагаю доделать до ума механизм приостановки тарификации , сейчас в
    версии 3,25 можно выставить время за которое клиент должен погасить минус,
    это круто конечно, но многие клиенты не гасят свои минуса и уходят а карта
    продолжает уходить в огромный минус и ее приходится обнулять а таких карт
    много.
    Было бы неплохо сделать возможность замораживать минусовой баланс, клиент
    выходит у него недостаточно очков , заморозили баланс и все.
    Придет в следующий раз покататься , ему придется его погасить , при этом
    сумму с него потребуют реальную и вменяемую а не та огромная сумма, что в
    нынешнем раскладе накапает за время его отсутствия.
    10) Добавить возможность сгорания бонусов через определенное время
    (опционально)

    Ответ UCS
    В планах сделать время жизни бонусов.

    11)Возможность удаленной заливки прошивок на ZB контроллеры и ТД. Без
    программатора.
    Ответ UCS
    В разработке сейчас.

    12)Сохранять настройки (Адрес, канал, PAN ID) при перепрошивке.
    13)Расширить работу с зонами - на каждую зону , сделать возможность
    настраивать свое приветствие, и свои настройки (Игровой зал)

    Ответ UCS
    Пока не планируется.

    14) Расширить возможности бонусной системы - разделение по зонам ,
    разделение по уровням
    15) Добавить возможность в GknetMonitor видеть версию прошивки контроллера
    16) Добавить возможность скидок в ту же бонусную систему ( как в 6 Кипере по
    аналогу)

    Ответ UCS
    Game-Keeper не скидочная система. "Скидки" реализуются управлением тарифами.

    18) Добавить возможность админам, самим создавать валюты и называть их как им угодно
    Сейчас существует Наличные,Кредитные Карты, Пластиковые карты - неудобно кассирам!!!
    Ну и само собой, задавать куда будет новая валюта отбиваться в Кредит или в Наличные.

    Ответ UCS
    По валютам.
    В ближайших версиях планируется разделение справочника Единицы. После этого
    появится функционал управления валютами.

  8. #18
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    Еще в "Редакторе" ,как и писали, неплохо бы групповое управление ценами(RULES) - чтобы можно было скопировать с других уровней, изминив цену на число или процент, задав определенный временной период. Я вначале мучался вручную(в редакторе) - потом начал писать на SQL запросы для этого. А как быть другим? Думаю там должно быть групповое управление и кнопки "Копировать", "Вставить" - вобщем чтобы удобно было...

  9. #19
    Banned
    Регистрация
    03.01.2014
    Адрес
    Россия
    Сообщений
    958
    Поблагодарил(а)
    4
    Благодарностей: 9 (сообщений: 6)
    Цитата Сообщение от NeiroN Посмотреть сообщение
    Еще в "Редакторе" ,как и писали, неплохо бы групповое управление ценами(RULES) - чтобы можно было скопировать с других уровней, изминив цену на число или процент, задав определенный временной период. Я вначале мучался вручную(в редакторе) - потом начал писать на SQL запросы для этого. А как быть другим? Думаю там должно быть групповое управление и кнопки "Копировать", "Вставить" - вобщем чтобы удобно было...
    Написал и об этом =)

  10. #20
    Разбирающийся Аватар для NeiroN
    Регистрация
    30.01.2015
    Адрес
    Ижевск
    Сообщений
    119
    Поблагодарил(а)
    0
    Благодарностей: 5 (сообщений: 3)
    Еще часто нужно разделить бонусы по уровням - для каждого уровня свой бонус.

    Для этого есть решение - в базе сделать триггер, который будет при пополнении баланса начислять бонус. Как связать бонусы с уровнем? Можно воспользоваться полем "Код", оно доступно прямо в редакторе и есть почти у всех основных объектов. Поле код у уровня должно при этом быть частью поля код у бонуса: "L01" у уровня и "L01_b01" у бонуса для этого уровня. В запросе мы заведем переменную,в которую будем получать содержимое поля код у уровня и использовать его в фильтре при выборе бонусов. Чтобы бонусы работали в альтернативном режиме - их надо отключить изменяя статус на "Неактивен"

    USE [gkArcade]
    GO

    CREATE TRIGGER [gk].[GK_TRANSACT_TRIGGER]
    ON [gk].[GK_TRANSACTS]
    AFTER INSERT
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @ACT int = (SELECT [ACTIVITY] FROM inserted)
    DECLARE @TYPE int = (SELECT [ACCOUNT_TYPE] FROM inserted)
    DECLARE @CARD int = (SELECT [CARD] FROM inserted)
    DECLARE @Level int = (SELECT [Level] FROM [gk].[GK_CARDS] WHERE [Card] = @CARD)
    -- Insert statements for trigger here
    IF (@ACT >= 901 AND @ACT <= 919)AND @TYPE = 31 BEGIN --пополнение баланса
    DECLARE @VALID smalldatetime = (SELECT [ValidFor] FROM [gk].[GK_CARDS_EX] WHERE [Card] = @CARD)
    DECLARE @maxdays int = 1 --число дней от дня рождения. в итоге: день до, день рождения, день после (+/- 1 день)
    DECLARE @BONUS money
    DECLARE @PAY money = (SELECT [VALUE] FROM inserted)
    DECLARE @LC varchar(10) = (SELECT [CODE] FROM [gk].LEVELS WHERE [LEVEL]=@Level) --получаем код уровня
    DECLARE @BIRTH int = --количество людей по данной карте у которых день рождения
    (SELECT count(*) FROM [gk].[GK_CARDS_CHILDS] --найдем всех детей
    WHERE ABS(DATEDIFF(day,GETDATE(),DATEADD(year,YEAR(GETDA TE())-YEAR([Birthday]),[Birthday]))) <= @maxdays
    AND [CARD] = @CARD) +
    (SELECT count(*) FROM [gkArcade].[gk].[GK_CARDS_EX] --и владельца
    WHERE ABS(DATEDIFF(day,GETDATE(),DATEADD(year,YEAR(GETDA TE())-YEAR([Birthday]),[Birthday]))) <= @maxdays
    AND [CARD] = @CARD)
    IF @BIRTH = 0 BEGIN -- если ни у кого нет дня рождения сегодня
    SET @BONUS = (SELECT MAX(CASE WHEN [RELATIVE] = 0 THEN [VALUE] WHEN [RELATIVE] = 1 THEN @PAY*[VALUE] END) FROM [gk].[GK_BONUSES]
    WHERE [STATUS] = 2 AND [KIND] = 1 AND (@PAY >= [LOW] AND @PAY <= [HIGH]) AND [CODE] LIKE @LC+'%' AND [gkArcade].[gk].CheckPeriod([PERIOD]) > 0)
    END ELSE BEGIN -- если есть то даем максимально возможный бонус
    SET @BONUS = (SELECT MAX(CASE WHEN [RELATIVE] = 0 THEN [VALUE] WHEN [RELATIVE] = 1 THEN @PAY*[VALUE] END) FROM [gk].[GK_BONUSES]
    WHERE [STATUS] = 2 AND [KIND] = 1 AND (@PAY >= [LOW] AND @PAY <= [HIGH]) AND ([CODE] LIKE @LC+'bir%' OR [CODE] LIKE @LC+'%') AND [gkArcade].[gk].CheckPeriod([PERIOD]) > 0)
    END
    IF @BONUS > 0 BEGIN -- если Бонус положен то даем его
    DECLARE @Employee int = (SELECT [EMPLOYEE] FROM inserted)
    DECLARE @Creator int = (SELECT [CREATOR] FROM inserted)
    DECLARE @Deal int = (SELECT [DEAL] FROM inserted)
    DECLARE @CheckItem int = (SELECT [CHECK_ITEM] FROM inserted)
    DECLARE @TGUID uniqueidentifier = (SELECT [TRANSACT_GUID] FROM inserted)
    -- создаем транзакции
    INSERT INTO [gk].[TRANSACTS] ([DATE],[ACCOUNT],[EMPLOYEE],[ACTIVITY],[VALUE1],[UNIT1],[VALUE2],[UNIT2],[QUANT],[CREATOR],[CREATORADDR],[CREATORDATE],[CARD],[DEAL],[CheckItem])
    VALUES(GETDATE(),@CARD,@Employee,411,1,401,@BONUS, 1,1,@Creator,1,GETDATE(),@CARD,@Deal,@CheckItem+1)
    INSERT INTO [gk].[GK_TRANSACTS]([DATE],[ACTIVITY],[CARD],[ACCOUNT_TYPE],[VALUE],[QUANT],[CREATOR],[CREATORADDR],[DEAL],[CHECK_ITEM],[EMPLOYEE],[LEVEL],[ARCADE],[GUID],[TRANSACT_GUID])
    VALUES(GETDATE(),411,@CARD,@TYPE,@BONUS,0,@Creator ,1,@Deal,@CheckItem+1,@Employee,@Level,1,newid(),@ TGUID)
    -- заачисляем бонус
    UPDATE [gk].[GK_CARDS] SET [Bonus] += @BONUS WHERE [Card]=@CARD
    END
    END
    END

    У меня используется дополнительная таблица где перечисленны дети с привязкой к карте.(у нас такие акции), также используется функция для проверки периода(действует или нет)

    Различные бонусы стали очень популярны, причем важно их делить по разным критериям(уровень, время, день рождения владельца или его детей).

    Реализовать данный функционал было не особо сложно - задача вполне решаема в обычном порядке.

Похожие темы

  1. GameKeeper и банковский терминал
    от Hendehog в разделе GameKeeper
    Ответов: 8
    Последнее сообщение: 20.11.2014, 17:30
  2. GameKeeper документация
    от Hendehog в разделе GameKeeper
    Ответов: 24
    Последнее сообщение: 15.10.2014, 08:00

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •