Часть 3 из 12
Строки: 4001-6000 из 22262
================================================================================

        //LOG::printText("convertgoldAction:gold_id_$gold_id");
        //LOG::printText("convertgoldAction:to_type_$to_type");
        //LOG::printArray("array", $args);
        
        //$balance = $args['balance'];
        return Model::factory('user')->convertGold($this->user->id, $gold_id, $to_type); 
       // return Model::factory('user')->checkBalance($this->user->id, $balance);
    }

}

================================================================================
ФАЙЛ: app/controllers/generalController.php
================================================================================

<?php

/**
 * 
 * Класс описаний / объявления данных
 * Предоставляет общие настройки и данные, относящиеся ко всем модулям
 * Запросы этого класса не требует в подписи id-пользователя(uid) и ключа сессии(s_key).
 * 
 * Описания статических констант-настроек игры(таблица vars):
 * 
 *  -  (int)     start_money1                    : начальные money1, инфа для сервера 
 *  -  (int)     start_money2                    : начальные money2, инфа для сервера 
 *  -  (int)     start_energy                    : начальные energy, инфа для сервера 
 *  -  (int)     start_energy_max                : начальные energy_max, инфа для сервера 
 * 
 *  -  (int)     messages_out_max                : максимально кол-во исходящих сообщений 
 *  -  (int)     messages_in_max                 : максимально кол-во входящих сообщений 
 *  -  (int)     messages_in_max                 : время (в сек.) за которое восстанавливается энерогия в количестве energy_recovery_count;
 *  -  (int)     energy_recovery_time_period     : время (в сек.) за которое восстанавливается энерогия в количестве energy_recovery_count;
 *  -  (int)     energy_recovery_count           : кол-во энергии которое восстанавливается за период времени energy_recovery_time_period;
 *  -  (string)  base_booster                    : бустеры, отдающихля игроку  в начале игры (через запятую);
 *  -  (int)     base_booster_count              : количество каждого из бустеров, отдающихля игроку в начале игры (через запятую);
 *  -  (int)     gift_time_limit                 : время (в сек.) через которое можно послать повторуню заявку на получение или отправку подарка
 *  -  (int)     round_energy_price              : кол-во энергии которое уплачивает игрок при загадывании слова перед началом раунда
 *  -  (int)     mission_start_energy            : цена за участие в миссии (энергия)
 * 
 *  -  (int)     stage_start_cost_key            : цена за открытие в этапа (ключи)
 *  -  (int)     stage_start_cost_time           : цена за открытие в этапа (время в сек.)
 *  -  (int)     stage_start_cost_money1         : цена за открытие в этапа (money1)
 *  -  (int)     stage_key_time_limit            : время в секундах, после которого можно повторить просьбу другу - прислать ключ 
 * 
 *  -  (int)     friend_invite_bonus_money1      : бонус money1 который получает игрок в случае если друг воспользовался его приглашением
 *  -  (int)     friend_invite_bonus_energy      : бонус energy который получает игрок в случае если друг воспользовался его приглашением
 * 
 *  -  (string)  stage_key_donator_id            : id пользоватля от которого присылваются ключи в начале игры
 *  -  (string)  start_stage_key_set             : строка с набором ключей выдаются в начале игры. формат: номер_этапа, номер_этапа, номер_этапа 
 * 
 *  -  (int)     daily_bonus_day_count           : число дней в последовательности начисления ежендевного бонуса
 * 
 *  -  (int)     lottery_active_id               : id из табл.lottry_stat, какой именно шаблон (строка из таблицы) используется в текущий момент
 *  -  (int)     lottery_sector_count            : сколько секторов задействовано в лотереи ( число должно быть < 8 ), в табл.lottry_stat могут быть описаны 8 секторов, текущая константа ограничивает количество секторов из табл.lottry_stat которые используются на текущий момент
 *  -  (int)     lottery_recovery_system         : способ начисления money2, за которые можно запустить лотерю(0 : money2 не восстанавливается сама по себе никогда | 1 :  money2 восстанавливается раз в день, в момент первого захода пользователя в игру, но только если в этот момент money2 == 0 | 2 : money1 всегда увеличивается на 1 во время первого захода пользователя в игру)
 
 //*  -  (int)     stage_start_cost_social       : цена за открытие в этапа (цена покупки – голоса, id в shop_social_shop_social_stat)
 * 
 * 
 * @link http://188.120.253.174/base/od/files/shop_scheme.png Магазины
 * @link http://188.120.253.174/base/od/files/server_scheme.png Миссии
 *  
 * 

 */

class generalController extends abstractController {
    
    /**  
    * Предворительная инициализация общая для всех пользователей. 
    * 
    * Запрос не требует в подписи id-пользователя(uid).
    * Запрос не требует ключа сессии(s_key), в случае если он включен. 
    * Возвращает содержимое таблиц, одноименных ключам возвращаемого массива(кроме "result").
    * Все таблицы содержат статические данные, которые не может изменить игрок.
    * 
    * <br>Пример запроса к серверу:
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||general.get_data|||m||0||1||{}
    * </code>  
    * 
    * <br>Пример ответа от сервера:
    * <br> 
    * <code>
    * [["general.get_data",{"result":1,"vars":[{"id":"1","key":"start_money1","value":"150"},{"id":"2","key":"start_money2","value":"1"},{"id":"3","key":"start_energy","value":"5"},{"id":"4","key":"start_energy_max","value":"5"},{"id":"5","key":"messages_out_max","value":"10"},{"id":"6","key":"messages_in_max","value":"10"},{"id":"7","key":"energy_recovery_count","value":"1"},{"id":"8","key":"energy_recovery_time_period","value":"1200"},{"id":"9","key":"base_booster","value":"0,1,5"},{"id":"10","key":"base_booster_count","value":"3"},{"id":"11","key":"gift_time_limit","value":"43200"},{"id":"12","key":"round_energy_price","value":"1"},{"id":"13","key":"mission_start_energy","value":"1"},{"id":"14","key":"stage_start_cost_key","value":"3"},{"id":"15","key":"stage_start_cost_time","value":"28800"},{"id":"16","key":"stage_start_cost_money1","value":"150"},{"id":"18","key":"stage_key_time_limit","value":"43200"},{"id":"20","key":"stage_key_donator_id","value":"556818369153"},{"id":"21","key":"start_stage_key_set","value":"0,0,0,100,100,100,200,200,200,300,300,300,400,400,400,500,500,500,600,600,600,700,700,700,800,800,800,900,900,900"},{"id":"22","key":"daily_bonus_day_count","value":"5"},{"id":"23","key":"friend_invite_bonus_money1","value":"10"},{"id":"24","key":"friend_invite_bonus_energy","value":"20"}],"booster_stat":[{"id":"0","name":"Усиленные бомбы","description":"Увеличивает радиус поражения бомб"},{"id":"1","name":"Дополнительные ходы 10шт","description":"В игре"},{"id":"2","name":"Горизонтальная бомба","description":"Бустер"},{"id":"3","name":"Дополнительные ходы 5шт","description":""},{"id":"4","name":"Дополнительные ходы 8шт","description":""},{"id":"5","name":"Вертикальная бомба","description":"Бустер"},{"id":"6","name":"Цветная бомба","description":"Бустер"},{"id":"7","name":"Перемешивание","description":"Бустер"}],"daily_bonus_stat":[{"id":"0","money1":"0","money2":"0","energy":"3","booster_type":"0","booster_count":"0"},{"id":"1","money1":"0","money2":"0","energy":"3","booster_type":"0","booster_count":"0"},{"id":"2","money1":"0","money2":"0","energy":"4","booster_type":"0","booster_count":"0"},{"id":"3","money1":"0","money2":"0","energy":"4","booster_type":"0","booster_count":"0"},{"id":"4","money1":"0","money2":"0","energy":"4","booster_type":"0","booster_count":"0"}],"shop_social_stat":[{"id":"0","buy_money1":"300","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"27","description":"Монеты 300 единиц","image_path":"http://example.com/image.png","config":""},{"id":"1","buy_money1":"600","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"45","description":"Монеты 600 единиц","image_path":"http://example.com/image.png","config":""},{"id":"2","buy_money1":"1300","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"89","description":"Монеты 1300 единиц","image_path":"http://example.com/image.png","config":""},{"id":"3","buy_money1":"3000","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"179","description":"Монеты 3000 единиц","image_path":"","config":""},{"id":"4","buy_money1":"15000","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"1","description":"Монеты 15000 единиц","image_path":"","config":""},{"id":"5","buy_money1":"7000","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"6","description":"Валюта","image_path":"","config":""},{"id":"6","buy_money1":"0","buy_money2":"0","buy_energy":"5","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"1","description":"3 жизни","image_path":"","config":""},{"id":"7","buy_money1":"0","buy_money2":"0","buy_energy":"5","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"10","description":"5 жизней","image_path":"","config":""},{"id":"8","buy_money1":"0","buy_money2":"0","buy_energy":"10","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"20","description":"10 жизней","image_path":"","config":""},{"id":"9","buy_money1":"0","buy_money2":"0","buy_energy":"100","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"4","description":"Энергия 100","image_path":"","config":""},{"id":"10","buy_money1":"0","buy_money2":"0","buy_energy":"150","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"5","description":"Энергия 150","image_path":"","config":""},{"id":"11","buy_money1":"0","buy_money2":"0","buy_energy":"200","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"1","description":"Энергия 200","image_path":"","config":""},{"id":"12","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"1,2","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":"","config":""},{"id":"13","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"2,3","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":"","config":""},{"id":"14","buy_money1":"200","buy_money2":"0","buy_energy":"0","buy_booster_set":"1,2,3","buy_promotion":"-1","cost_social_money":"0","description":"","image_path":"","config":""},{"id":"15","buy_money1":"100","buy_money2":"50","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"2","description":"Максимальная граница энергии","image_path":"","config":""},{"id":"16","buy_money1":"0","buy_money2":"10","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"2","description":"","image_path":"","config":""},{"id":"17","buy_money1":"0","buy_money2":"15","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"2","description":"","image_path":"","config":""},{"id":"18","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"4","buy_promotion":"-1","cost_social_money":"1","description":"5 дополнительных шагов","image_path":"","config":""},{"id":"19","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"3","buy_promotion":"-1","cost_social_money":"15","description":"10 дополнительных шагов","image_path":"","config":""},{"id":"20","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"10","description":"Этап 1","image_path":"","config":""},{"id":"21","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"1","description":"Этап 2","image_path":"","config":""},{"id":"22","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"1","buy_promotion":"-1","cost_social_money":"1","description":"10 дополнительных шагов","image_path":"","config":""},{"id":"23","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"10","description":"Этап 3","image_path":"","config":""},{"id":"24","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"10","description":"Этап 4","image_path":"","config":""},{"id":"25","buy_money1":"0","buy_money2":"0","buy_energy":"0","buy_booster_set":"","buy_promotion":"-1","cost_social_money":"10","description":"Этап 5","image_path":"","config":""}],"shop_money1_stat":[{"id":"0","count":"300","buy_way":"1","bonus_percent":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"1","count":"600","buy_way":"1","bonus_percent":"5","cost_money2":"0","visible_flag":"1","social_shop_id":"1"},{"id":"2","count":"1300","buy_way":"1","bonus_percent":"10","cost_money2":"0","visible_flag":"1","social_shop_id":"2"},{"id":"3","count":"3000","buy_way":"1","bonus_percent":"15","cost_money2":"0","visible_flag":"1","social_shop_id":"3"},{"id":"4","count":"15000","buy_way":"1","bonus_percent":"20","cost_money2":"0","visible_flag":"1","social_shop_id":"4"},{"id":"5","count":"7000","buy_way":"1","bonus_percent":"70","cost_money2":"0","visible_flag":"1","social_shop_id":"5"}],"shop_money2_stat":[{"id":"0","count":"5","buy_way":"0","bonus_percent":"0","cost_money1":"10","visible_flag":"0","social_shop_id":"0"}],"shop_energy_stat":[{"id":"0","count":"1","buy_way":"1","bonus_percent":"5","cost_money1":"10","cost_money2":"0","visible_flag":"1","social_shop_id":"6"},{"id":"1","count":"5","buy_way":"1","bonus_percent":"10","cost_money1":"18","cost_money2":"0","visible_flag":"1","social_shop_id":"7"},{"id":"2","count":"10","buy_way":"1","bonus_percent":"20","cost_money1":"25","cost_money2":"0","visible_flag":"1","social_shop_id":"8"}],"shop_energy_max_stat":[{"id":"0","count":"5","buy_way":"0","bonus_percent":"10","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"1","count":"10","buy_way":"10","bonus_percent":"0","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"}],"shop_booster_stat":[{"id":"0","buy_booster_set":"0","buy_way":"0","cost_money1":"300","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"1","buy_booster_set":"1","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"22"},{"id":"2","buy_booster_set":"2","buy_way":"0","cost_money1":"450","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"3","buy_booster_set":"3","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"19"},{"id":"4","buy_booster_set":"4","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"18"},{"id":"5","buy_booster_set":"5","buy_way":"0","cost_money1":"150","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"6","buy_booster_set":"6","buy_way":"0","cost_money1":"19","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"7","buy_booster_set":"7","buy_way":"0","cost_money1":"29","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"8","buy_booster_set":"8","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"},{"id":"9","buy_booster_set":"9","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"0","social_shop_id":"0"}],"shop_booster_set_stat":[{"id":"0","type":"0","count":"3"},{"id":"1","type":"1","count":"1"},{"id":"2","type":"2","count":"3"},{"id":"3","type":"3","count":"1"},{"id":"4","type":"4","count":"1"},{"id":"5","type":"5","count":"1"},{"id":"6","type":"6","count":"3"},{"id":"7","type":"7","count":"3"},{"id":"8","type":"8","count":"1"},{"id":"9","type":"9","count":"1"}],"shop_stage_stat":[{"id":"0","buy_stage_stat_id":"0","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"20"},{"id":"1","buy_stage_stat_id":"1","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"21"},{"id":"2","buy_stage_stat_id":"2","buy_way":"1","cost_money1":"0","cost_money2":"0","visible_flag":"1","social_shop_id":"23"}],"shop_promotion_stat":[{"id":"0","buy_promotion":"0","buy_way":"1","cost_money1":"1000","cost_money2":"0","visible_flag":"1","social_shop_id":"0"},{"id":"1","buy_promotion":"1","buy_way":"1","cost_money1":"100","cost_money2":"0","visible_flag":"1","social_shop_id":"0"}],"company_stat":[{"id":"0","name":"ОБЩИЕ ТЕМЫ","description":"company_0 описание","flag_enabled":"1","config":"{\"map_class\":\"MC_GameMap\",\"menu_mark\":\"type1\",\"menu_photo\":\"cat_1.jpg\"}"},{"id":"1","name":"ГОРОДА И СТРАНЫ","description":"company_1 описание","flag_enabled":"1","config":"{\"map_class\":\"MC_GameMap\",\"menu_mark\":\"type1\",\"menu_photo\":\"cat_2.jpg\"}"}],"stage_stat":[{"id":"0","name":"stage_0_0","description":"stage0 description","company_stat_id":"0","position":"0","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_exp":"0","config":"{\"id_lib\":500,\"mark_position\":\"position_1\"}"},{"id":"1","name":"stage_0_1","description":"stage1 description","company_stat_id":"0","position":"1","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_exp":"0","config":"{\"id_lib\":501,\"mark_position\":\"position_1\"}"},{"id":"2","name":"stage_0_2","description":"stage2 description","company_stat_id":"0","position":"2","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_exp":"0","config":"{\"id_lib\":503,\"mark_position\":\"position_1\"}"},{"id":"100","name":"stage_1_1","description":"stage1 description","company_stat_id":"1","position":"0","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_exp":"0","config":"{\"id_lib\":501,\"mark_position\":\"position_1\"}"},{"id":"200","name":"stage_2_1","description":"stage1 description","company_stat_id":"2","position":"0","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_exp":"0","config":"{\"id_lib\":502,\"mark_position\":\"position_1\"}"}],"mission_stat":[{"id":"0","name":"mission0_1","description":"","stage_stat_id":"0","position":"0","path":"lvl_1.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\",\"tutorial\":[{\"step\":0,\"mark\":\"t1\",\"type\":\"click\"}]}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"1","name":"mission0_2","description":"","stage_stat_id":"0","position":"1","path":"lvl_2.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"2","name":"mission0_3","description":"","stage_stat_id":"0","position":"2","path":"lvl_3.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"3","name":"mission0_4","description":"","stage_stat_id":"0","position":"3","path":"lvl_4.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"4","name":"mission0_5","description":"","stage_stat_id":"0","position":"4","path":"lvl_5.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"5","name":"mission0_6","description":"","stage_stat_id":"0","position":"5","path":"lvl_6.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"6","name":"mission0_7","description":"","stage_stat_id":"0","position":"6","path":"lvl_7.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"7","name":"mission0_8","description":"","stage_stat_id":"0","position":"7","path":"lvl_8.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"8","name":"mission0_9","description":"","stage_stat_id":"0","position":"8","path":"lvl_9.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"9","name":"mission0_10","description":"","stage_stat_id":"0","position":"9","path":"lvl_10.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"10","name":"mission0_11","description":"","stage_stat_id":"0","position":"10","path":"lvl_11.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"11","name":"mission0_12","description":"","stage_stat_id":"0","position":"11","path":"lvl_12.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"12","name":"mission0_13","description":"","stage_stat_id":"0","position":"12","path":"lvl_13.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"13","name":"mission0_14","description":"","stage_stat_id":"0","position":"13","path":"lvl_14.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"14","name":"mission0_15","description":"","stage_stat_id":"0","position":"14","path":"lvl_15.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"20","name":"mission0_21","description":"","stage_stat_id":"1","position":"0","path":"lvl_21.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"21","name":"mission0_22","description":"","stage_stat_id":"1","position":"1","path":"lvl_22.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"22","name":"mission0_23","description":"","stage_stat_id":"1","position":"2","path":"lvl_23.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"23","name":"mission0_24","description":"","stage_stat_id":"1","position":"3","path":"lvl_24.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"24","name":"mission0_25","description":"","stage_stat_id":"1","position":"4","path":"lvl_25.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"25","name":"mission0_26","description":"","stage_stat_id":"1","position":"5","path":"lvl_26.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"26","name":"mission0_27","description":"","stage_stat_id":"1","position":"6","path":"lvl_27.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"27","name":"mission0_28","description":"","stage_stat_id":"1","position":"7","path":"lvl_28.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"28","name":"mission0_29","description":"","stage_stat_id":"1","position":"8","path":"lvl_29.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"29","name":"mission0_30","description":"","stage_stat_id":"1","position":"9","path":"lvl_30.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"30","name":"mission0_31","description":"","stage_stat_id":"1","position":"10","path":"lvl_31.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"31","name":"mission0_32","description":"","stage_stat_id":"1","position":"11","path":"lvl_32.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"32","name":"mission0_33","description":"","stage_stat_id":"1","position":"12","path":"lvl_33.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"33","name":"mission0_34","description":"","stage_stat_id":"1","position":"13","path":"lvl_34.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"34","name":"mission0_35","description":"","stage_stat_id":"1","position":"14","path":"lvl_35.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"35","name":"mission0_36","description":"","stage_stat_id":"2","position":"0","path":"lvl_36.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"36","name":"mission0_37","description":"","stage_stat_id":"2","position":"1","path":"lvl_37.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"37","name":"mission0_38","description":"","stage_stat_id":"2","position":"2","path":"lvl_38.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"38","name":"mission0_39","description":"","stage_stat_id":"2","position":"3","path":"lvl_39.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"39","name":"mission0_40","description":"","stage_stat_id":"2","position":"4","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"40","name":"mission0_41","description":"","stage_stat_id":"2","position":"5","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"41","name":"mission0_42","description":"","stage_stat_id":"2","position":"6","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"42","name":"mission0_43","description":"","stage_stat_id":"2","position":"7","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"43","name":"mission0_44","description":"","stage_stat_id":"2","position":"8","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"44","name":"mission0_45","description":"","stage_stat_id":"2","position":"9","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"45","name":"mission0_46","description":"","stage_stat_id":"2","position":"10","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"46","name":"mission0_47","description":"","stage_stat_id":"2","position":"11","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"47","name":"mission0_48","description":"","stage_stat_id":"2","position":"12","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"48","name":"mission0_49","description":"","stage_stat_id":"2","position":"13","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"49","name":"mission0_50","description":"","stage_stat_id":"2","position":"14","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"242","name":"mission1_0","description":"","stage_stat_id":"100","position":"0","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"243","name":"mission2_0","description":"","stage_stat_id":"200","position":"0","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"},{"id":"244","name":"mission2_1","description":"","stage_stat_id":"200","position":"1","path":"lvl_40.xml","point_in_star1":"1","point_in_star2":"20000","point_in_star3":"40000","prize_booster_type":"0","prize_booster_count":"0","prize_money1":"0","prize_energy":"0","prize_exp":"0","config":"{\"back\":\"b1\"}","replay_flag":"1","image_path":"image/lvl2.png"}],"library_stat":[{"id":"1","path":"MainMenu.swf"},{"id":"2","path":"game_graphics.swf"},{"id":"3","path":"Map.swf"},{"id":"4","path":"SoundGame.swf"},{"id":"5","path":"PreLoader.swf"},{"id":"6","path":"Hint_Info.swf"},{"id":"7","path":"TopMenu.swf"},{"id":"8","path":"List_Friend.swf"},{"id":"9","path":"List_Company.swf"},{"id":"100","path":"window/Window_Buy_Boost_Krem.swf"},{"id":"101","path":"window/Window_Choose_Boost.swf"},{"id":"102","path":"window/Window_End_Game.swf"},{"id":"103","path":"window/Window_Error.swf"},{"id":"104","path":"window/Window_No_Action.swf"},{"id":"105","path":"window/Window_Coins_Shop.swf"},{"id":"106","path":"window/Window_Energy_Shop.swf"},{"id":"107","path":"window/Window_Ask_Life.swf"},{"id":"108","path":"window/Window_Mail_Box.swf"},{"id":"109","path":"window/Window_Mission_Lock.swf"},{"id":"110","path":"window/Window_Game_Pause.swf"},{"id":"111","path":"window/Window_Result_Game.swf"},{"id":"112","path":"window/Window_New_Place.swf"},{"id":"113","path":"window/Window_Improve_Result.swf"},{"id":"114","path":"window/Window_Daily_Bonus.swf"},{"id":"115","path":"window/WindowStageUnlock.swf"},{"id":"116","path":"window/Window_Friend_Request.swf"},{"id":"117","path":"window/Window_Stage_Complete.swf"},{"id":"118","path":"window/Window_Buy_Boost.swf"},{"id":"119","path":"window/Window_First.swf"},{"id":"120","path":"window/Window_Start_Friend_Invite.swf"},{"id":"121","path":"window/Window_Help.swf"},{"id":"122","path":"window/Window_Open_Boost.swf"},{"id":"123","path":"window/Window_Boost_Buy_Step.swf"},{"id":"124","path":"window/Window_Bonus_Friend_Invite.swf"},{"id":"125","path":"window/Window_Mission_Apply.swf"},{"id":"128","path":"window/Window_Rank_New.swf"},{"id":"129","path":"window/Window_Mission_Bonus.swf"},{"id":"130","path":"window/Window_Gift_Energy.swf"},{"id":"131","path":"window/Window_Soc_Shop_Action.swf"},{"id":"132","path":"window/Window_Tutorial_MainMenu.swf"},{"id":"133","path":"window/Window_Tutorial_Map.swf"},{"id":"500","path":"map/stage_0_0.swf"},{"id":"501","path":"map/stage_0_1.swf"},{"id":"502","path":"map/stage_0_2.swf"},{"id":"503","path":"map/stage_0_3.swf"},{"id":"1000","path":"fillword_lvl.zip"}],"event_stat":[{"id":"0","description":"Бонус за участие","type_id":"0","time_start":"430438400","time_live":"86400","time_shift":"0","prize_money1":"100","prize_energy":"1","prize_booster_type":"0","prize_booster_count":"1","prize_action":"0","config":"что-то что нужно вам, если нужно","replay_flag":"1","enable_flag":"1","image_path":""}]}]]

    * </code>
    *  
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result                    : "1" - успех / "-x" - ошибка;  
    *  -  (array)   vars                      : <b>статические константы. Пояснение в шапке {@link  generalController}</b>. Массив объектов, каждый объект которого содержит следующие свойства:
    *  -  -  (int)     id                         : номер
    *  -  -  (string)  key                        : имя игровой константы
    *  -  -  (string)  value                      : значение
    *  -  (array)   booster_stat             : <b>информация о бустерах</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер бустера 
    *  -  -  (string)  name                       : название бустера
    *  -  -  (string)  description                : описание бустера
    * 
    *  -  (array)   daily_bonus_stat         : <b>информация о ежедневных бонусах</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер дня
    *  -  -  (int)     money1                     : кол-во валюты1 отдаваемое пользователю
    *  -  -  (int)     money2                     : кол-во валюты2 отдаваемое пользователю
    *  -  -  (int)     energy                     : кол-во энергии отдаваемое пользователю
    *  -  -  (int)     booster_type               : тип бустера 
    *  -  -  (int)     booster_count              : кол-во бустеров daily_bonus_stat.booster_count типа
    * 
    *  -  (array)   shop_social_stat      : <b>цены продаваемые товары товара за валюту соц.сети</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     buy_money1                 : количество продоваемой Валюты1
    *  -  -  (int)     buy_money2                 : количество продоваемой Валюты2
    *  -  -  (int)     buy_energy                 : количество продоваемой Энергии
    *  -  -  (string)  buy_booster_set            : список указателей(через запятую) на запись в таблице (shop_booster_set_stat) с информацией о продоваемых бустерах 
    *  -  -  (int)     buy_promotion              : номер продоваемой акции  
    *  -  -  (int)     buy_stage                  : продажа этапа(все этапы одинаково стоят)  
    *  -  -  (int)     cost_social_money          : цена за товары в валюте соц сети
    *  -  -  (string)  description                : кратокое описание продоваемого товара(совокупности товаров)
    *  -  -  (string)  image_path                 : изображение соответствующее продоваемому товару(совокупности товаров)
    * 
    *  -  (array)   shop_money1_stat      : <b>цены для на продаваеомую валюту1</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_money2_stat      : <b>цены на продаваемую Валюту2</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    * *  -  (array)   shop_energy_stat      : <b>цены на продаваемую энергию</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_energy_max_stat      : <b>цены на продаваеомые единиц увеличения максимальное число энергии</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     count                      : количество покупаемого товара
    *  -  -  (int)     bonus_percent              : бонус в процентах относительно наименее выгодной цены(информационное поле)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_booster_stat         : <b>цены на продаваемые бустеры</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (string)  buy_booster_set         : указатель на записи в таблице со списком покупаемых бустеров (табл.shop_booster_set_stat)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_booster_set_stat         : <b>тип и колличество бустера для продажи</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     type                       : тип бустрера
    *  -  -  (int)     count                      : количество 
    * 
    *  -  (array)   shop_stage_stat          : <b>цены на этапы</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     buy_stage_stat_id          : номер открываемого этапа (соотвествует id в табл. stage_stat)
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  -  (array)   shop_promotion             : <b>цены на продаваемые действтия</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     buy_promotion              : продваемые действий/акции, вшито в коде  
    *  -  -  (int)     buy_way                    : тип продажи (0 - ресурсы игры / 1 - валюта соц.сети )
    *  -  -  (int)     cost_money1                : цена в Валюте1 (используется если buy_way = 0)
    *  -  -  (int)     cost_money2                : цена в Валюте2 (используется если buy_way = 0)
    *  -  -  (int)     visible_flag               : флаг видимости в игровом магазине
    *  -  -  (int)     social_shop_id             : указатель на запись таблицу shop_social_stat, в случае продажи за валюту соц сети (в ней хранится цена в валюте соц.сети)
    * 
    *  - (array)   company_stat                : <b>статические данные о компаниях</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании 
    *  -  -  (string)  name                       : название
    *  -  -  (string)  description                : описание
    *  -  -  (int)     flag_enabled               : флаг включена ли компания
    *  -  -  (string)  config                     : поле для клиента (конфиг)
    * 
    *  - (array)   stage_stat                  : <b>статические данные о этапах</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании 
    *  -  -  (string)  name                       : название
    *  -  -  (string)  description                : описание
    *  -  -  (int)     company_stat_id            : входит в компанию id в табл. company.stat
    *  -  -  (int)     position                   : порядковый номер в компании
    *  -  -  (int)     prize_booster_type         : награда за миссию - тип бустера (колличество указано полем ниже)
    *  -  -  (int)     prize_booster_count        : награда за миссию - количество бустеров указаного выше типа
    *  -  -  (int)     prize_money                : награда за миссию - money1
    *  -  -  (int)     prize_exp                  : награда за миссию - exp
    *  -  -  (string)  config                     : поле для клиента (конфиг)
    * 
    * *  - (array)   mission_stat                : <b>статические данные о этапах</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер компании 
    *  -  -  (string)  name                       : название
    *  -  -  (string)  description                : описание
    *  -  -  (int)     stage_stat_id              : входит в этап id в табл. stage_stat
    *  -  -  (int)     position                   : порядковый номер в этапе
    *  -  -  (int)     path                       : путь к шаблону: ../mission/1.xml
    *  -  -  (int)     point_in_star1             : очков до звезды (или подобного условия выполнения миссии)
    *  -  -  (int)     point_in_star2             : очков до звезды (или подобного условия выполнения миссии)
    *  -  -  (int)     point_in_star3             : очков до звезды (или подобного условия выполнения миссии)
    * 
    *  -  -  (int)     prize_booster_type         : награда за миссию или звезду №1- тип бустера (колличество указано полем ниже)
    *  -  -  (int)     prize_booster_count        : награда за миссию или звезду №1 - количество бустеров указаного выше типа
    *  -  -  (int)     prize_money1               : награда за миссию или звезду №1 - money1
    *  -  -  (int)     prize_money2               : награда за миссию или звезду №1 - money2
    *  -  -  (int)     prize_energy               : награда за миссию или звезду №1 - энергия
    *  -  -  (int)     prize_exp                  : награда за миссию или звезду №1 - exp
    * 
    *  -  -  (int)     prize2_booster_type         : награда за звезду№2 - тип бустера (колличество указано полем ниже)
    *  -  -  (int)     prize2_booster_count        : награда за звезду№2 - количество бустеров указаного выше типа
    *  -  -  (int)     prize2_money1               : награда за звезду№2 - money1
    *  -  -  (int)     prize2_money2               : награда за звезду№2 - money2
    *  -  -  (int)     prize2_energy               : награда за звезду№2 - энергия
    *  -  -  (int)     prize2_exp                  : награда за звезду№2 - exp
        * 
    *  -  -  (int)     prize3_booster_type         : награда за звезду№3 - тип бустера (колличество указано полем ниже)
    *  -  -  (int)     prize3_booster_count        : награда за звезду№3 - количество бустеров указаного выше типа
    *  -  -  (int)     prize3_money1               : награда за звезду№3 - money1
    *  -  -  (int)     prize3_money2               : награда за звезду№3 - money2
    *  -  -  (int)     prize3_energy               : награда за звезду№3 - энергия
    *  -  -  (int)     prize3_exp                  : награда за звезду№3 - exp
    *  
    *  -  -  (string)  config                     : поле для клиента (конфиг)
    *  -  -  (int)     replay_flag                : флаг, можно ли переигрывать миссию: 1 - можно, 0 - нельзя
    *  -  -  (string)  image_path                 : поле для клиента (путь к картинке)
    *
    *  -  (array)   library_stat             : <b>тех таблица для клиента</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер 
    *  -  -  (int)     path                       : инфа
    * 
    *  -  (array)   event_stat               : <b>события</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер 
    *  -  -  (string)  description                : описание
    *  -  -  (int)     type_id                    : тип / 0 - ежедневное событие, повторное использование которого возможно после 00:00 следуещего дня
    *  -  -  (int)     time_start                 : еще не используется / время старта события timestamp
    *  -  -  (int)     time_live                  : еще не используется / время дейстияВ события, секунды
    *  -  -  (int)     time_shift                 : еще не используется / время остановки между итерациями события, секунды
    *  -  -  (int)     prize_money1               : призовой бонус в money1 
    *  -  -  (int)     prize_money2               : призовой бонус в money2  (жетоны для колеса фартуны)  
    *  -  -  (int)     prize_energy               : призовой бонус в energy
    *  -  -  (int)     prize_booster_type         : призовой бонус в тип бустера который будет выдваться 
    *  -  -  (int)     prize_booster_count        : призовой бонус в количесво бустеров типа event_stat.prize_booster_type
    *  -  -  (int)     prize_prize_action         : зашитое в клиенте действие (или в сервере)   
    *  -  -  (string)  config                     : поле для клиента (конфиг)
    *  -  -  (int)     replay_flag                : флаг потора / для события с type_id = 0 при replay_flag = 0, событие становится одноразовым
    *  -  -  (int)     enable_flag                : флаг обработки события, если enable_flag = 0 то все действия с событием игнорируются 
    *  -  -  (string)  image_path                 : поле для клиента (путь к картинке)
    *
    *  -  (array)    lottery_stat               : <b>лотерея (Список возможных призов )</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер 
    *  -  -  (int)     cost_money1                : стоимость в money1
    *  -  -  (int)     cost_money2                : стоимость в money2 (использовать эту валюту как жетоны латереи)
    *  -  -  (int)     sector_0_type              : сектор 0, типа приза.  ==0: money1, ==1: energy, ==2 booster, ==3 exp, ==4 какое-то действие зашитое в клиенте, сервер ничего не выдает. 
    *  -  -  (int)     sector_0_count             : сектор 0, количество 
    *  -  -  (int)     sector_0_extra             : сектор 0, дополнительная информация, если требуется. используется если sector_0_type==2(booster), указывается тип бустера. также может быть использована для sector_0_type==4 для определения действия на клиенте 
    *  -  -  (int)     sector_1_type              : сектор 1, типа приза
    *  -  -  (int)     sector_1_count             : сектор 1, количество 
    *  -  -  (int)     sector_1_extra             : сектор 1, дополнительная информация
    *  -  -  (int)     sector_2_type              : сектор 2, типа приза
    *  -  -  (int)     sector_2_count             : сектор 2, количество 
    *  -  -  (int)     sector_2_extra             : сектор 2, дополнительная информация
    *  -  -  (int)     sector_3_type              : сектор 3, типа приза
    *  -  -  (int)     sector_3_count             : сектор 3, количество 
    *  -  -  (int)     sector_3_extra             : сектор 3, дополнительная информация
    *  -  -  (int)     sector_4_type              : сектор 4, типа приза
    *  -  -  (int)     sector_4_count             : сектор 4, количество 
    *  -  -  (int)     sector_4_extra             : сектор 4, дополнительная информация
    *  -  -  (int)     sector_5_type              : сектор 5, типа приза           
    *  -  -  (int)     sector_5_count             : сектор 5, количество 
    *  -  -  (int)     sector_5_extra             : сектор 5, дополнительная информация 
    *  -  -  (int)     sector_6_type              : сектор 6, типа приза           
    *  -  -  (int)     sector_6_count             : сектор 6, количество 
    *  -  -  (int)     sector_6_extra             : сектор 6, дополнительная информация
    *  -  -  (int)     sector_7_type              : сектор 6, типа приза           
    *  -  -  (int)     sector_7_count             : сектор 6, количество 
    *  -  -  (int)     sector_7_extra             : сектор 6, дополнительная информация 
    * 
    */ 
    
    public function get_dataAction(){ 
       try{
              $result = array();
              $result['result']                  = 1; 
              $result['vars']                    = Model::factory( 'var')->getList();   
              
              $result['booster_stat']            = Model::factory( 'booster_stat')->getList();   
              $result['daily_bonus_stat']        = Model::factory( 'daily_bonus_stat')->getList();    
              
              $result                            = Model::factory( 'shop')->getClientPrice( $result );  
              
              $result['company_stat']            = Model::factory( 'company_stat')->getList(); 
              $result['stage_stat']              = Model::factory( 'stage_stat')->getList(); 
              $result['mission_stat']            = Model::factory( 'mission_stat')->getList(); 
              
              $result['library_stat']            = Model::factory( 'library_stat')->getList();   
             
              $result['event_stat']              = Model::factory( 'event_stat')->getList(); 
		
              $result['lottery_stat']             = Model::factory( 'lottery_stat')->getList();   

              return $result; 
              
          } catch (Exception $e){

              LOG_CRASH::add($e->getCode(), $e->getMessage(), "generalController", "get_dataAction");
              throw new Exception ($e->getMessage(), $e->getCode());
          }
    }
    
    /**
    * 
    * @ignore
    * 
    * Получения настроичных констант, влияющих на разные аспекты игрового процесса. 
    * 
    * @return array Массив возвращаемых значений, cодержит:
    *  -  (int)     result                   : "1" - успех / "-x" - ошибка;  
    *  -  (array)   vars                     : константы влияющие на игровой процесс(описаны в описании класса general)
    * 
    */
    
    public function get_configAction(){
        try{    
            $result              = array();
            $result['vars']      = Model::factory( 'var')->getList();
            
             
             $aTaskStat = Model::factory("task_stat", 6 )->get();
                $question_shuffle          = ""; 
               
                    $word = $aTaskStat['text'];
           
                    //str_shuffle  не работает с юникодом
                    $code = mb_detect_encoding($word);
            
                    $word = iconv($code,'cp1251',$word);
                    $question_shuffle = str_shuffle($word);
            
                    //if(0 != strcmp($word, $question_shuffle)){
                    //    break;
                    //}
            
                    $result = iconv('cp1251', "utf8", $question_shuffle);
          
          
            
            return $result; 
        } catch (Exception $e){

            LOG_CRASH::add($e->getCode(), $e->getMessage(), "generalController", "get_configAction");
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
}

================================================================================
ФАЙЛ: app/controllers/playlistController.php
================================================================================

<?php

/**
 * @ignore
 * Класс обработки плейлистов
 *  
 */
 
 
class playlistController extends abstractController {

    /**
    * 
    * @ignore
    * 
    * Возвращает весь список плейлистов из магазина 
    * 
    * Возвращает весь список плейлистов из магазина 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||playlist.get_shop_prise|||m||0||1||{}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["playlist.get_shop_prise",{"result":1,"shop_playlist_stat":[{"id":"0","playlist_id":"0","cost_money1":"10","cost_money2":"7","cost_energy":"5","visible_flag":"1","use_status":"0","use_count":"5"},{"id":"1","playlist_id":"3","cost_money1":"30","cost_money2":"10","cost_energy":"5","visible_flag":"1","use_status":"1","use_count":"0"},{"id":"2","playlist_id":"3","cost_money1":"50","cost_money2":"15","cost_energy":"8","visible_flag":"1","use_status":"1","use_count":"5"}]}]]
    * </code> 
    * 
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)   result                  : "1" - успех / "-x" - ошибка 
    *  -  (array)   shop_playlist_stat       : <b>цены для покупки плейлистов</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (int)     id                         : номер слота в магазине плейлистов
    *  -  -  (int)     playlist_id                : тип плейлиста, соотествует id в playlist_stat   
    *  -  -  (int)     cost_money1                : цена в валюте1
    *  -  -  (int)     cost_money2                : цена в валюте2  
    *  -  -  (int)     cost_energy                : цена в енергии
    *  -  -  (int)     visible_flag               : слот доступен или скрыт
    *  -  -  (int)     use_status                 : статус пользования плейлистом (0 - дается в аренду, 1 - отдается навсегда)
    *  -  -  (int)     use_count                  : сколько раз можно использовать плейлист до того как он исчезнет из пользования, если use_status = 1, поле игнарируется
   */ 
    public function get_shop_priseAction(){
        try{
            $list_shop_playlist_stat = Model::factory("shop_playlist_stat")->getList();
            return array("result" => 1, "shop_playlist_stat" => $list_shop_playlist_stat);
        } catch (Exception $e){
                
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "playlistController", "get_shop_priseAction");
            throw new Exception ($e->getMessage(), $e->getCode()); 
        }
    }
    
    /**
    * 
    * 
    * Покупает или берет в аренду плейлист
    * 
    * <br> Плейлисты доступные для покупки игроку, находятся в табл.shop_playlist_stat.
    * <br> В случае если плейлист взят в аренду, нельзя покупать такой же плейлист еще раз в аренду - cервер вернет ошибку.
    * <br> В случае если плейлист взят в аренду, можно покупать такой же плейлист навсегда. 
    * <br> Информация о том что плейлист взят в аренду перезатрется той что он куплен навсегда. 
    * 
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||playlist.buy_playlist|||m||0||1||{"shop_playlist_stat_id":0}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["playlist.buy_playlist",{"result":1,"shop_playlist_stat_id":2,"user_playlist":{"id":"226","playlist_id":"3","use_status":"1","use_count":"5"}}]]
    * </code>  
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (int) shop_playlist_stat_id  :  номер плейлиста из таблицы shop_playlist_stat
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)     result               : "1" - успех / "-x" - ошибка;
    *  -  (int)   shop_playlist_stat_id  :  номер плейлиста (из таблицы shop_playlist_stat)
    *  -  (array) user_playlist          :  <b> Информация о плейлистах принадлежащих(взятых в аренду) игроком</b>. Объект с множеством свойств имя/значение: 
    *  -  -  (int) id                       :  номер плейлиста в таблице с плейлистами пользователя (табл.user_playlist).
    *  -  -  (int) playlist_id              :  номер плейлиста в тиблице со статическими данными (табл.playlist_stat).
    *  -  -  (int) use_status               :  права пользователя на плейлист (0 = взят в аредну, 1 = куплен ).
    *  -  -  (int) use_count                :  при use_status=0(взят в аренду) - поле хранит число доступных исходящих игр на которое он взят в аренду, 
    *                                          и с каждой новой запущенной игрой уменьшается, пока не станет =0, при 0 строка удаляется, пользователь теряет доступ к плейлисту;
    *                                          при use_status=1 (куплен навсегда) содержимое поля значения не имеет.
    */   
    public function buy_playlistAction($args){   
        try{
            $user_id               = $this->user->id;
            
            $shop_playlist_stat_id      = -1;  
            if(TRUE == isset($args["shop_playlist_stat_id"])){
               $shop_playlist_stat_id = $args["shop_playlist_stat_id"];           
            } else {
               errors::exc(errors::errorIncorrectInput,"shop_playlist_stat_id not exist" ); 
            }
             
            $shop_playlist_stat_id = $args["shop_playlist_stat_id"];
            return Model::factory('user_playlist')->buyPlaylist($user_id, $shop_playlist_stat_id);
           
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "playlistController", "buy_playlistAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
    
    
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
}

================================================================================
ФАЙЛ: app/controllers/dailyController.php
================================================================================

<?php

/**
 * 
 * <b>Ежедневные действия</b>
 * 
 * <b>Ежедневные бонус:</b>
 * <br>Механизм выдачи ежедневного бонуса определяется константой vars.daily_bonus_accept_default возвращаемоей в {@link generalController::get_dataAction()}
 * 
 * <br><b>Если vars.daily_bonus_accept_default не существует или ==1</b> 
 * <br>Ежедневынй бонус зачисляется автоматически при первой инициализации игры в сутки при запросе {@link userController::initAction()}  
 * <br>при этом в возвращаемых значения {@link userController::initAction()} значение daily_bonus[flag_daily_bonus] == 0 означает что бонус был уже зачислен ранее (или отключен), значение daily_bonus[flag_daily_bonus] == 1 значит что ежедневынй бонус передан пользователю.
 * 
 * <br><b>Если константа vars.daily_bonus_accept_default существует и ==0</b>:
 * <br>Ежедневный бонус становится доступным после первой инциализации в сутки {@link userController::initAction()}, но он не зачисляется автоматически
 * <br>при этом в возвращаемых значения {@link userController::initAction()} значение daily_bonus[flag_daily_bonus] == 0 означает что бонус был уже зачислен ранее (или отключен), значение daily_bonus[flag_daily_bonus] == 1 значит что ежедневынй бонус доступен для того чтобы его забрали. 
 * <br>чтобы зачислить бонус игроку (забрать) требуется воспользоваться {@link dailyController::use_daily_bonusAction()}
 * <br>В случае, если игрок запустил игру в очередной день последовательности, его присутствие в игре засчитывается 
 * внезависимости от того забрал он бонус или нет. Но если он бонус не забрал по каким-то причинам, 
 * на следующий день при запуске игры ему доступен будет только бонус текущего дня на момент запуска (бонус предыдущего дня, который был доступен для зачисления, но игрок его не забрал, то забрать его уже невозможно).
 * <br> Если пользователь находится в игре не перезапуская ее во время наступления нового дня, и решает забрать свой бонус {@link dailyController::use_daily_bonusAction()},
 * ему зачислиться бонус того дня в полседовательности в который он запустил (инициализировал игру), дата его посещения игры в таком случае не будет обновлена. 
 * Для того чтобы обновить информацию о посещении пользователем игры и пересчитать ежедневный бонус и лотерею нужно либо перезапустить игру {@link userController::initAction()}
 * либо воспользоваться методом {@link dailyController::refreshAction()}. 
 * <br>Момент наступления нового дня определяется по системному времени сервера и, соовтественно, может отличаться от временной зоны запускаемого клиента. 
 *  
 * 
 * 
 * 
 * 
 * 
 */
class dailyController extends abstractController {
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------------------------------------------------------

    /**
     * 
     * Зачисление ежедневного бонуса игроку
     * 
     * Воспользовать методом возможно только если константа vars.daily_bonus_accept_default существует и ==0.
     * Ежедневнвый бонус становится доступным после первой инциализации в сутки {@link userController::initAction()}.
     * 
     * Если vars.daily_bonus_accept_default не существует или ==1, ежедневынй бонус зачисляется автоматически при первой инициализации игры в сутке при запросе {@link userController::initAction()};  
     * 
     * В ситуации если человек зашел в игру и провел в ней без перезапуска достаточно времени чтобы наступил новый день,
     * функция при использовании зачислит игроку ежедневный бонус за тот календарный день в который он зашел в игру (инициализировался).
     * Для того чтобы без перезапуска игры перейти на следующий день возмжоно воспользоваться запросом {@link dailyController::refreshAction()}. 
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * https://sms-empire.ru/find_diff/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||daily.use_daily_bonus|||m||0||1||{}}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["daily.use_daily_bonus",{"result":1}]]
     * </code>
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - бонус зачислен  // "0" - бонус не может быть зачислен (уже зачислен сегодня) / "-x" - ошибка;
     * 
     * 
     * 
     */
    public function use_daily_bonusAction() {
        try {

            $user_id = $this->user->id;
            return Model::factory("user_daily_actions", $user_id)->use_daily_bonus();
        } catch (Exception $e) {
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "use_daily_bonusAction");
            throw new Exception($e->getMessage(), $e->getCode());
        }
    }

    /**
     * 
     * Обновление информации о времени посещения пользователем игры
     * 
     * Фиксируется время посещения игры, как при запросе {@link userController::initAction()}. Пересчитываются и начисляются 
     * положенные игроку бонусы. 
     * 
     * В ситуации если человек зашел в игру и провел в ней без перезапуска достаточно времени чтобы наступил новый день,
     * функция при использовании пересчитает игроку ежедневный бонус(день посещения в последовательности) и лотерею за текущий календарный день.
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * https://sms-empire.ru/find_diff/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||daily.refresh|||m||0||1||{}}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["daily.refresh",{"daily_bonus":{"flag_daily_bonus":0,"count_of_days":0},"lottery_bonus":{"flag_lottery_bonus":0}}]]
     * </code>
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                    : "1" - успех / "-x" - ошибка;

     *  -  (Object)  daily_bonus               : <b>Данные о ежедневном бонусе игрока</b>. Объект, с множеством свойств имя/значение:
     *  -  -  (int)     flag_daily_bonus            : <br> == 0 : бонус не доступен или уже получен в предыдущие запуски игры.
     *                                                <br> == 1 : пользователь получил бонус (Если vars.daily_bonus_accept_default == 1 или константы не существует).
     *                                                <br> == 1 : бонус доступен для того чтобы пользователь его забрал (Если  vars.daily_bonus_accept_default == 0)
     *                                                
     *  -  -  (int)     count_of_days               : число дней подряд, без пропуска, которое игрок заходит в игру. 
     * 
     *  -  (Object)  lottery_bonus               : <b>Данные о восстановлении попытки воспользоваться лотереей игрока (+ 1 money2, учитывается в user[money2])</b>. Объект, с множеством свойств имя/значение:
     *  -  -  (int)     flag_lottery_bonus            : флаг (1 - плюс одна попытка использовать лотерею (+ 1 money2, учитывается в user[money2]), 0 - не начислено попыток);
     */
    public function refreshAction() {
        try {

            $user_id = $this->user->id;

            //так же как и в user.init 
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //----------------------------------------------------------------------------------------------------------
            //проверяем, наступил ли новый день, и если наступил то совершаем ежедневные действия 
            $daily_bonus = Model::factory('user_daily_actions', $user_id)->check();
            $result['daily_bonus'] = array("flag_daily_bonus" => $daily_bonus["flag_daily_bonus"], "count_of_days" => $daily_bonus["count_of_days"]);

            //лотерея
            $flag_lottery_bonus = 0;
            if ($daily_bonus["bonus_lottery"]["money2"] > 0) {
                $flag_lottery_bonus = 1;
            }
            $result['lottery_bonus'] = array("flag_lottery_bonus" => $flag_lottery_bonus);
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //-------------------------------------------------------------------------------------------------------------------------------------------------------
            //----------------------------------------------------------------------------------------------------------
            return $result;
        } catch (Exception $e) {
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "userController", "use_daily_bonusAction");
            throw new Exception($e->getMessage(), $e->getCode());
        }
    }

    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
}


================================================================================
ФАЙЛ: app/controllers/storageController.php
================================================================================

<?php

/**
 * Взаимодействие с хранилищем клиента
 *  
 */
 
class storageController extends abstractController {
    
    /**
    * Записывает данные в хранилище
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||storage.set|||m||0||1||{"key_data":"key data","data":"data"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["storage.set",{"result":1,"storage":{"key_data":"key data","data":"data"}}]]
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (string)  <b> key_data </b>       : ключ поВ которому записываются данные, уникален для каждого пользователя
    *  -  (string)  <b> data     </b>       : данные
    *
    *
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)   result                : "1" - успех / "-x" - ошибка   
    *  -  (array)   storage             : <b>записанные на севре данные</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (string)  key_data             : ключ поВ которому записываются данные, уникален для каждого пользователя
    *  -  -  (string)  data                 : данные
    * 
    * 
   */ 
    public function setAction($args){
        try{
             
            $user_id = 0;
            if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
             
             $key_data = "";
             if(TRUE == isset($args["key_data"])){
                $key_data = $args["key_data"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"key_data not exist" ); 
             } 
             
             $data = "";
             if(TRUE == isset($args["data"])){
                $data = $args["data"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"data not exist" ); 
             }
            
            return Model::factory("storage")->setStorage( $user_id, $key_data, $data );
            
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "storageController", "setAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }   
    
    
    /**
    * Получает данные из хранилища по ключу
    * 
    * <br><b>Пример запроса к серверу:</b>
    * <br> 
    * <code>
    * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200300|||s_key||-1|||m||0||0||storage.get|||m||0||1||{"key_data":"key data"}
    * </code>
    * 
    * <br><b>Пример ответа от сервера:</b>
    * <br> 
    * <code>
    * [["storage.get",{"result":1,"storage":{"key_data":"key data","data":"data"}}]]
    * [["storage.get",{"result":-400,"text":"record not found in storage"}]]
    * </code> 
    * 
    * @param  Object Входные данные. Объект с множеством свойств имя/значение:
    *  -  (string)  <b> key_data </b>       : ключ поВ которому записываются данные, уникален для каждого пользователя
    *
    *
    * @return Object Объект с множеством свойств имя/значение:
    *  -  (int)   result                : "1" - успех / "-x" - ошибка   
    *  -  (array)   storage             : <b>записанные на севре данные</b>. Массив объектов, каждый объект которого содержит следующие свойства: 
    *  -  -  (string)  key_data             : ключ поВ которому записываются данные, уникален для каждого пользователя
    *  -  -  (string)  data                 : данные
    * 
    * 
   */ 
    public function getAction($args){
        try{
             
            $user_id = 0;
            if(TRUE == $this->user->id){
                $user_id = $this->user->id;           
             } else {
                errors::exc(errors::errorIncorrectInput,"user_id not exist" ); 
             }
             
             $key_data = "";
             if(TRUE == isset($args["key_data"])){
                $key_data = $args["key_data"];           
             } else {
                errors::exc(errors::errorIncorrectInput,"key_data not exist" ); 
             } 
             
            return Model::factory("storage")->getStorage( $user_id, $key_data );
            
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "storageController", "getAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }   
}

================================================================================
ФАЙЛ: app/controllers/boosterController.php
================================================================================

<?php

/**

 * Контроллер 
 *  
 */
 
 
class boosterController extends abstractController {

    
     /**
     * 
     * @ignore
     * Возвращает весь список бустеров из магазина бустеров
     * 
     * Возвращает весь список бустеров из магазина бустеров
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||booster.get_shop_prise|||m||0||1||{}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["booster.get_shop_prise",{"result":1,"list_shop_booster":[{"id":"0","type":"0","cost_money1":"10","cost_money2":"15","cost_energy":"5","visible_flag":"1","count":"1"},{"id":"1","type":"1","cost_money1":"10","cost_money2":"15","cost_energy":"5","visible_flag":"1","count":"2"},{"id":"2","type":"2","cost_money1":"10","cost_money2":"15","cost_energy":"5","visible_flag":"1","count":"1"}]}]]
     * </code> 
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (Object)  list_shop_booster      : <b>Данные о продающихся бустерах</b>. Массив объектов, каждый объект которого содержит следующие свойства:
     *  -  -  (int)    id                      : порядковый номер продоваемого бустера;
     *  -  -  (int)    type                    : тип бустера, соотвествует id в табл.booster_stat
     *  -  -  (int)    cost_money1             : цена в единицах Валюты1;
     *  -  -  (int)    cost_money2             : цена в единицах Валюты2;
     *  -  -  (int)    cost_energy             : цена в единицах Энергии;
     *  -  -  (int)    visible_flag            : флаг видимости (1 - все видят, 0 - в обычном магазине не видно, но может отображаться в магазине за валюту. соц. сети)
     *  -  -  (int)    count                   : кол-во продаваемых бустеров
     * 
     * 
     * 
     */
    public function get_shop_priseAction(){
        try{
            $list_shop_booster_stat = Model::factory("shop_booster_stat")->getList();
            return array("result" => 1, "list_shop_booster" => $list_shop_booster_stat);
        } catch (Exception $e){
                
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "boosterController", "get_shop_priseAction");
            throw new Exception ($e->getMessage(), $e->getCode()); 
        }
    }
    
    /**
     * Покупает бустера
     * 
     * Покупает бустера в магазине бустеров
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||booster.buy|||m||0||1||{"shop_booster_stat_id":0}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["booster.buy",{"result":1,"shop_boosters":0,"user_boosters":{"type0":2,"type1":2,"type2":"0","type3":"0","type4":"0","type5":"0","type6":"0","type7":"0","type8":"0","type9":"0"}}]]
     * </code> 
     * 
     * @link http://188.120.253.174/base/od/files/shop_scheme.png Схема таблиц базы данных магазинов в игре. 
     * 
     * @param  Object Входные данные. Объект с множеством свойств имя/значение:
     *  -  (int)  <b>  shop_booster_stat_id  </b>  :  позиция бустреа вмагазине, id в табл.shop_booster_stat
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (int)     shop_booster_id        : позиция бустреа вмагазине;
     *  -  (Object)   user_boosters         : <b>Информация о кол-ве бустеров каждого типов у игрока</b>. Объект, который содержит следующие свойства:
     *  -  -  (int )  type0                    : кол-во бустеров 0-го типа;
     *  -  -  (int )  type1                    : кол-во бустеров 1-го типа;
     *  -  -  (int )  type2                    : кол-во бустеров 2-го типа;
     *  -  -  (int )  type3                    : кол-во бустеров 3-го типа;
     *  -  -  (int )  type4                    : кол-во бустеров 4-го типа;
     *  -  -  (int )  type5                    : кол-во бустеров 5-го типа;
     *  -  -  (int )  type6                    : кол-во бустеров 6-го типа;
     *  -  -  (int )  type7                    : кол-во бустеров 7-го типа;
     *  -  -  (int )  type8                    : кол-во бустеров 8-го типа;
     *  -  -  (int )  type9                    : кол-во бустеров 9-го типа;
     * 
     */
    public function buyAction($args){   
        try{
            $user_id               = $this->user->id;
            $shop_booster_stat_id  = $args["shop_booster_stat_id"];
            return Model::factory('user_booster', $user_id)->buyBooster( $shop_booster_stat_id);
           
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "boosterController", "buyAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }

  
    
    /**
     * Использовать бустер
     * 
     * Использоует один бустер указанного типа
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||booster.use|||m||0||1||{"booster_type":1}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["booster.use",{"result":1,"booster_type":1,"count":1}]]
     * </code> 
     * 
     * @param  Object Входные данные. Объект с множеством свойств имя/значение:
     *  -  (int)  <b>  booster_type   </b>  :  тип используемого бустера, id в табл.booster_stat
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (int)     booster_type           : тип бустера
     *  -  (int)     count                  : оставшеесе число бустеров данного типа
     */
    public function useAction($args){   
        try{
            $user_id       = $this->user->id;
            $booster_type    = $args["booster_type"];
            return Model::factory('user_booster', $user_id)->useBooster($booster_type);
           
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "boosterController", "useAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
    
    /**
     * Покупает и использует бустер
     * 
     * @ignore
     * 
     * Покупает бустер в магазине бустеров и сразу использует его. В случае если слот магазина описывает сразу несколько бустеров
     * покупаются и используются все сразу.
     * В случае если покупается несколько бустров одного типа, используется только один, остальные остаются у игрока.
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||booster.buy_and_use|||m||0||1||{"shop_booster_stat_id":0}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["booster.buy_and_use",{"result":1,"booster_type":"0","count":0}]]
     * </code> 
     * 
     * @link http://188.120.253.174/base/od/files/shop_scheme.png Схема таблиц базы данных магазинов в игре. 
     *
     * @param  Object Входные данные. Объект с множеством свойств имя/значение:
     *  -  (int)  <b>  shop_booster_stat_id  </b>  :  позиция бустреа вмагазине, id в табл.shop_booster_stat
     *  
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (int)     shop_booster_id        : позиция бустреа вмагазине;
     *  -  (Object)   user_boosters         : <b>Информация о кол-ве бустеров каждого типов у игрока</b>. Объект, который содержит следующие свойства:
     *  -  -  (int )  type0                    : кол-во бустеров 0-го типа;
     *  -  -  (int )  type1                    : кол-во бустеров 1-го типа;
     *  -  -  (int )  type2                    : кол-во бустеров 2-го типа;
     *  -  -  (int )  type3                    : кол-во бустеров 3-го типа;
     *  -  -  (int )  type4                    : кол-во бустеров 4-го типа;
     *  -  -  (int )  type5                    : кол-во бустеров 5-го типа;
     *  -  -  (int )  type6                    : кол-во бустеров 6-го типа;
     *  -  -  (int )  type7                    : кол-во бустеров 7-го типа;
     *  -  -  (int )  type8                    : кол-во бустеров 8-го типа;
     *  -  -  (int )  type9                    : кол-во бустеров 9-го типа;  
     */ 
    public function buy_and_useAction($args){   
        try{
            $user_id               = $this->user->id;
            
            $shop_booster_stat_id = -1;
            if(TRUE == isset($args["shop_booster_stat_id"])){
               $shop_booster_stat_id = $args["shop_booster_stat_id"];           
            } else {
               errors::exc(errors::errorIncorrectInput,"shop_booster_stat_id not exist" ); 
            }
            
            return Model::factory('user_booster', $user_id)->buyAndUseBooster( $shop_booster_stat_id );
           
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "boosterController", "buyAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
    
    /**
     * Обновить колличество бустеров у игрока
     * 
     * 
     * <br><b>Пример запроса к серверу:</b>
     * <br> 
     * <code>
     * http://188.120.253.174/base/od/htdocs/index.php?m=|||uid||100200710|||s_key||-1|||m||0||0||booster.refresh|||m||0||1||{}
     * </code>
     * 
     * <br><b>Пример ответа от сервера:</b>
     * <br> 
     * <code>
     * [["booster.refresh",{"result":1,"booster_type":1,"count":1}]]
     * </code> 
     * 
     * @return Object Объект с множеством свойств имя/значение:
     *  -  (int)     result                 : "1" - успех / "-x" - ошибка;
     *  -  (Object)  user_booster           :  <b>Данные о бустерах которые есть в наличи у пользователя</b>. Объект, с множеством свойств имя/значение:
     *  -  -  (int)     type0                       : кол-во плейлистов типа0, которые есть в наличии у игрока.
     *  -  -  (int)     type1                       : кол-во плейлистов типа1, которые есть в наличии у игрока.
     *  -  -  (int)     type2                       : кол-во плейлистов типа2, которые есть в наличии у игрока.
     *  -  -  (int)     type3                       : кол-во плейлистов типа3, которые есть в наличии у игрока.
     *  -  -  (int)     type4                       : кол-во плейлистов типа4, которые есть в наличии у игрока.
     *  -  -  (int)     type5                       : кол-во плейлистов типа5, которые есть в наличии у игрока.
     *  -  -  (int)     type6                       : кол-во плейлистов типа6, которые есть в наличии у игрока.
     *  -  -  (int)     type7                       : кол-во плейлистов типа7, которые есть в наличии у игрока.
     *  -  -  (int)     type8                       : кол-во плейлистов типа8, которые есть в наличии у игрока.
     *  -  -  (int)     type9                       : кол-во плейлистов типа9, которые есть в наличии у игрока.
     *  -  -  (int)     type9                       : кол-во плейлистов типа9, которые есть в наличии у игрока.
     */
    public function refreshAction($args){   
        try{
            $user_id       = $this->user->id;
            $aUserBooster = array();
            Model::factory('user_booster', $user_id)->refreshBooster($aUserBooster);
            return array("result" => 1, "user_booster" => $aUserBooster);
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "boosterController", "refreshAction", $this->user->id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
    }
    
    
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
    //--------------------------------------------------------------------------------------------------------------
}

================================================================================
ФАЙЛ: app/controllers/cacheController.php
================================================================================

<?php

/**
 * 
 * @link http://188.120.253.174/base/od/htdocs/index_server_cache_flush.php Почистить кеш
 */
 
class cacheController extends abstractController {
	
    /**
    * 
    * @ignore
    * Глобальная очистка кеша 
    * return bool
    */ 
	public function flushAction() {
		try{
            return CacheAccess::flush ();
        } catch (Exception $e){
                 
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "cacheController", "flushAction");
            throw new Exception ($e->getMessage(), $e->getCode());
        }
	}

}

================================================================================
ФАЙЛ: app/controllers/abstractController.php
================================================================================

<?php
/**
 * Контроллер по умолчанию
 * 
 * Контроллер по умолчанию
 * 
 * @ignore
 */
class abstractController {
	public $user;
	
	public function __construct($user = NULL) {
		$this->user = $user;
	}

}

================================================================================
ФАЙЛ: app/models/stage_statModel.php
================================================================================

<?php
/**
 * 
 */
class stage_statModel extends Model {
    
    protected $_tableName = 'stage_stat';
    
}


================================================================================
ФАЙЛ: app/models/storageModel.php
================================================================================

<?php
/**
 * 
 * Класс 
 */
class storageModel extends Model {
    
    protected $_tableName = 'storage';
    
    public function setStorage( $user_id, $key_data, $data){
        try{ 
            
            if(!Model::factory('user', $user_id)->exist()){
                  errors::exc(errors::errorIncorrectInput, "user id not exist");
            }
            
            $list_storage = $this->getList(array("user_id" => $user_id, "key_data" => $key_data));
            
            //если записей больше одной, удаляем все кроме первой---------------
            $list_storage_count = count($list_storage);
            if(count($list_storage) > 1){
                for($i = 1; $i <= $list_storage_count; $i++){
                    $this->delete(array("id" => $list_storage[$i]["id"]));
                }
            }
            //------------------------------------------------------------------
            //получаем значение если оно сущестует
            $arr_storage  = $list_storage[0];
            if(!is_array($arr_storage) || 0 == count($arr_storage)){
                $arr_storage = array("user_id" => $user_id, "key_data" => $key_data, "data" => $data);
            } else {
                $arr_storage = array("id" => $arr_storage["id"], "user_id" => $user_id, "key_data" => $key_data, "data" => $data);
            }
            $obj_storage = $this->create( $arr_storage );
            $arr_storage = $obj_storage->get();
            //------------------------------------------------------------------
            unset($arr_storage["id"]);
            unset($arr_storage["user_id"]);
            
            return array("result" => 1, "storage" => $arr_storage);

        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "storageModel", "set", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
    public function getStorage( $user_id, $key_data){
        try{ 
            
            if(!Model::factory('user', $user_id)->exist()){
                  errors::exc(errors::errorIncorrectInput, "user id not exist");
            }
            
            $list_storage = $this->getList(array("user_id" => $user_id, "key_data" => $key_data));
            
            //если записей больше одной, удаляем все кроме первой---------------
            $list_storage_count = count($list_storage);
            if(count($list_storage) > 1){
                for($i = 1; $i <= $list_storage_count; $i++){
                    $this->delete(array("id" => $list_storage[$i]["id"]));
                }
            }
            //------------------------------------------------------------------
            //получаем значение если оно сущестует
            $arr_storage  = $list_storage[0];
            if(!is_array($arr_storage) || 0 == count($arr_storage)){
                return array("result" => -400, "text" => "record not found in storage");
            } 
            
            unset($arr_storage["id"]);
            unset($arr_storage["user_id"]);
            
            return array("result" => 1, "storage" => $arr_storage);

        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "storageModel", "set", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
}

================================================================================
ФАЙЛ: app/models/user_boosterModel.php
================================================================================

<?php
/**
 * 
 */
class user_boosterModel extends Model {
    
    protected $_tableName = 'user_booster';
    
    
    /**
    * Назначет создаваемому игроку плейлисты 
    * 
    * id = user_id, передается при вызове фабрики
    */ 
    public function giveBoosterToNewUser(){
        try{
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
          
            $base_booster         = Model::factory ( 'var' )->loadByKey ( 'base_booster' )->value;
            $base_booster_count   = Model::factory ( 'var' )->loadByKey ( 'base_booster_count' )->value;
            //-------------------------------------------------------------------------------------
            //бустеры 
            $aBoostersToGive = array();
            $aBoosterType = explode(",", $base_booster);
             foreach($aBoosterType as $booste_type){
               if(Model::factory("booster_stat", $booste_type)->exist()){
                   $aBoostersToGive[ $booste_type ]+= $base_booster_count;
               }
            } 
            $aUserBoosters = Model::factory("user_booster", $user_id)->giveBooster($aBoostersToGive);
            return array("result" => 1, "user_boosters" => $aUserBoosters);  
      } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "gameModel", "giveBoosterToNewUser", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
      }  
    }
    
     /**
    * Отдает игроку бустреы в пользование
    * 
    * id = user_id, передается при вызове фабрики
    * 
    * @param  array  $array_booster   array([$type] => $count) номера бустеров из таблицы booster_stat и количество каждого из бустеров
    * @return mix
    */ 
    public function giveBoosterToUser( $array_booster ) {
        try{     
            //$this->id существует в любом случае, т.к. передается не в аргументах а посредством фабрики
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            if(!$this->exist()){
                $this->create(array('id' => $this->id, "type0" => 0, "type1" => 0, "type2" => 0, "type3" => 0, "type4" => 0, "type5" => 0, "type6" => 0, "type7" => 0, "type8" => 0, "type9" => 0));
                $this->save();
            }
            foreach($array_booster as $type => $count){
                //---------------------------------------------------------------------------------------------------
                if(!Model::factory('booster_stat', $type)->exist()){
                    continue;
                }
               
                //ОСТОРОЖНО! 
                //Переменная переменных, содежит имя переменное, которое может быть определено и изменено динамически
                $$field = "type".$type;
                if(!isset($this->$$field)){
                    continue;
                } 
                $this->$$field+= $count;
                //---------------------------------------------------------------------------------------------------
            }
            $this->save();
            return $this->get();
            
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "giveBoosterToUser", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
    
    public function checkBooster( $booster_id ) {
        try{     
            //$this->id существует в любом случае, т.к. передается не в аргументах а посредством фабрики
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            if(!Model::factory("booster_stat", $booster_id)->exist()){
                    errors::exc(errors::errorIncorrectDBValue, "booster id not exist");
            }
            
            if($booster_id < 0 || $booster_id > 9){
                return 0;
            }
            
            if(!$this->exist()){
                $this->create(array('id' => $this->id, "type0" => 0, "type1" => 0, "type2" => 0, "type3" => 0, "type4" => 0, "type5" => 0, "type6" => 0, "type7" => 0, "type8" => 0, "type9" => 0));
                $this->save();
            }
            
            $$field = "type".$booster_id; 
            if($this->$$field > 0){
                return $this->$$field;
            } else {
                return 0;
            }
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "giveBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
    }
    
    public function refreshBooster( &$aUserBooster = array() ) {
        try{     
            //$this->id существует в любом случае, т.к. передается не в аргументах а посредством фабрики
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            if(!$this->exist()){
                $this->create(array('id' => $this->id, "type0" => 0, "type1" => 0, "type2" => 0, "type3" => 0, "type4" => 0, "type5" => 0, "type6" => 0, "type7" => 0, "type8" => 0, "type9" => 0));
                $this->save();
            }

//----            
            $listUserBooster         = $this->getList(array('id' => $user_id));
            $aUserBooster            = $listUserBooster[0];
            unset($aUserBooster['id']);
            
            return 1;
            
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "refreshBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
    }
    
    /**
    * Отдает игроку бустреы в пользование
    * 
    * id = user_id, передается при вызове фабрики
    * 
    * @param  array  $array_booster   array([$type] => $count) номера бустеров из таблицы booster_stat и количество каждого из бустеров
    * @return mix
    */ 
    public function giveBooster( $array_booster ) {
        try{     
            //$this->id существует в любом случае, т.к. передается не в аргументах а посредством фабрики   
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            if(!$this->exist()){
                $this->create(array('id' => $this->id, "type0" => 0, "type1" => 0, "type2" => 0, "type3" => 0, "type4" => 0, "type5" => 0, "type6" => 0, "type7" => 0, "type8" => 0, "type9" => 0));
                $this->save();
            }
            foreach($array_booster as $type => $count){
                //---------------------------------------------------------------------------------------------------
                //ОСТОРОЖНО! 
                //Переменная переменных, содежит имя переменное, которое может быть определено и изменено динамически
                $$field = "type".$type; 
                $this->$$field+= $count;
                //---------------------------------------------------------------------------------------------------
            }
            $this->save();
            return $this->get();
            
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "giveBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
    //--------------------------
    
    /**
    * использование бустера
    * 
    * id = user_id, передается при вызове фабрики
    * 
    * @param  int    $booster_type   
    * @return mix
    */ 
    public function useBooster( $booster_type ) {
        try{
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }

            if(!Model::factory("booster_stat", $booster_type)->exist()){
                    errors::exc(errors::errorIncorrectDBValue, "booster id not exist");
            }
            if(!$this->exist()){
                $this->giveBoosterToNewUser();
                errors::exc(errors::errorIncorrectDBValue, "user not have boosters");  
            }
           
            //---------------------------------------------------------------------------------------------------
            //ОСТОРОЖНО! 
            //Переменная переменных, содежит имя переменное, которое может быть определено и изменено динамически
            $$field = "type".$booster_type;
            if($this->$$field > 0){
            
                 $this->$$field--;
                 $this->save();
                 return array("result" => 1, "booster_type" => $booster_type, "count" => $this->$$field);
            //---------------------------------------------------------------------------------------------------
            } else {
                 errors::exc(errors::errorIncorrectDBValue, "user is not available boosters of this type");
            }
            errors::exc(errors::errorUnexpectedEnd, "unexpected end of function");
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "useBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }  
    }
    
    
    /**
    * 
    * Покупка бустреа в игровом магазине 
    * 
    * id = user_id, передается при вызове фабрики
    * 
    * @param int    shop_booster_id id-записи в таблице-магазине бустеров
    * @param int    sale_method    способ продажи
    *  - sale_method = 0, продажа из магазина в игре, за игровую валюту 
    *  - sale_method = 1, продажа за валюту соц сети, <b>фактически дарение</b>, 
    * т.к. обработка списания валюты соц.сети сводится к возврату положительного ответа на запрос 
    * от сервера соц.сети, без явного запроса на списание валюты
    * игнорируются стоимость валюте1,валюте2 и энергии (соответственно cost_money1, cost_money2, cost_energy)
    * а также флаг видимости в игровом магазине (visible_flag) 
    * 
    */
    public function buyBooster( $price_id, &$arr_booster_buy = array() ){ 
        try{
            //тут все проверить!!!
            $user_id = $this->id;
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            
            if(!Model::factory("shop_booster_stat",$price_id)->exist()){
                 return array("result" => -2, "text" => "no entry in the price of store "); 
            }
        
            $aPrice = Model::factory("shop_booster_stat", $price_id)->get();
            
            if($aPrice['buy_way'] == 1){            //0 - ресурсы игры / 1 - валюта соц.сети
                return array("result" => -3, "text" => "wrong buy_way"); 
            }
            
            $aUserProfile  = Model::factory("user",$user_id)->getProfile();
            
            
            $CostMoney1 = $aPrice["cost_money1"];
            $CostMoney2 = $aPrice["cost_money2"];
            $CostItems  = $aPrice["cost_items"];
            $aUserBoosters = array();

            if($aPrice["visible_flag"] == 0){
                return array("result" => -4, "text" => "price record is not available now");  
            }
            if(!Model::factory("user", $user_id)->checkMoney($CostMoney1, $CostMoney2)){
                return array("result" => -5, "text" => "not enough money");  
            }
            //if(!Model::factory("user", $user_id)->checkEnergy($CostEnergy)){
            //    return array("result" => -4, "text" => "not enough energy");  
            //}
                
            //if(!Model::factory("user", $user_id)->checkEnergy($CostEnergy)){
            //    return array("result" => -4, "text" => "not enough energy");  
            //}   
              
            $aUserBoosters = $this->giveBoosterSet( $aPrice['buy_booster_set'], $arr_booster_buy);
                
            //-----------------------------------------------------------------------------------------
            $reason_id = 14;
            Model::factory( "user", $user_id)->changeMoney(  - $CostMoney1, - $CostMoney2, $reason_id); 
            //-----------------------------------------------------------------------------------------
            
            unset($aUserBoosters['id']);            
            return array("result" => 1, "shop_boosters" => $price_id, "user_boosters" => $aUserBoosters);
      
         } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "buyBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
     } 
     
     
      public function giveBoosterSet( $str_booster_set, &$give_boosters = array()){ 
        try{
            $aUserBoosters = array();
            
            $user_id = $this->id;
            
            if(!Model::factory('user', $user_id)->exist()){
                return array("result" => -1, "text" => "user not exist"); 
            }
            
            $arr_booster_set = explode(",", $str_booster_set);  
            if(count($arr_booster_set) <= 0){
                return 0;
            }
            
            foreach( $arr_booster_set as $booster_id ){
                
                $booster_info = Model::factory("shop_booster_set_stat", $booster_id)->get();
                $type  = $booster_info["type"];
                $count = $booster_info["count"];
                
                if(Model::factory("booster_stat", $booster_info["type"])->exist()){
                    if($give_boosters[ $type ]){
                        $give_boosters[ $type ] += $count;
                    } else {
                        $give_boosters[ $type ] = $count;
                    }
                }
            }
            
            //$aUserProfile  = Model::factory("user",$user_id)->getProfile();

            //-----------------------------------------------------------------------------------
            $aUserBoosters = $this->giveBooster( $give_boosters ); 
            //unset($aUserBoosters['id']);            

            return $aUserBoosters;
      
         } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "giveBoosterSet", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
     }
      /* 
    * @param int    shop_booster_id id-записи в таблице-магазине бустеров
    * @param int    sale_method    способ продажи
    *  - sale_method  = 0, продажа из магазина в игре, за игровую валюту 
    *  - sale_method  = 1, продажа за валюту соц сети, <b>фактически дарение</b>, 
    */
    
    public function buyAndUseBooster( $shop_booster_id){ 
        try{
       
            $booster_type = 0;
            $arr_booster_type = array();
            $result_buy = $this->buyBooster( $shop_booster_id, $arr_booster_type );
            $result_use = array();
            
            if(isset($result_buy["result"]) && $result_buy["result"] <= 0 ){
                $result_use = $result_buy;
            } else {
                 $result["result"] = 1;   
                 
                
                foreach($arr_booster_type as $type => $count){
                    $this->useBooster( $type );     
                }
            }
            
            $user_boosters = $this->get();
            unset($user_boosters["id"]);
            
            return array("result" => 1, "shop_booster_id" => $shop_booster_id, "user_boosters" => $user_boosters); 
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "user_boosterModel", "buyBooster", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
     }
      
}

================================================================================
ФАЙЛ: app/models/stageModel.php
================================================================================

<?php
/**
 * 
 */
class stageModel extends Model {
    
    protected $_tableName = 'stage';
    
    public function getListStage($user_id){
       try{
           if(!Model::factory('user', $user_id)->exist()){
               return array();
               // errors::exc(errors::errorIncorrectInput, "user $user_id id not exist");
           }
           $listStage =  $this->getList(array("user_id" => $user_id));
           foreach($listStage as &$mission){
               if(isset($stage['user_id'])){
                   unset($stage['user_id']); 
               }
           }
           
           if(!is_array( $listMission ) || 0 == count($listMission)){
              $listMission = array(); 
           }
           
           return $listStage;
       } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "stageModel", "getListStage", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        } 
    }
    
    public function giveStageKeyToNewUser( $user_id ){
       try{
            //if(!Model::factory('user', $user_id)->exist()){
            //    errors::exc(errors::errorIncorrectInput, "user $user_id id not exist");
            //}
            
            $user_donator_id      = Model::factory ( 'var' )->loadByKey ( 'stage_key_donator_id' )->value;
            $start_stage_key_set  = Model::factory ( 'var' )->loadByKey ( 'start_stage_key_set' )->value;
            $time   =  SConfig::$time;
            $status =  1;
            
            $arr_stage_key_set = explode(",", $start_stage_key_set);
            foreach($arr_stage_key_set as $stage_stat_id){
               Model::factory("stage_key")->create(array( "user_id" => $user_id, "user_donator_id" => $user_donator_id, "stage_stat_id" => $stage_stat_id, "status" => $status, "time" => $time));
            }
            return true;
        
       } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "stageModel", "giveStageKeyToNewUser", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
        
    }
    
    public function getStageActualKey($user_id){
       try{
           if(!Model::factory('user', $user_id)->exist()){
               return array();
               // errors::exc(errors::errorIncorrectInput, "user $user_id id not exist");
           }
           
           
           $listKeySend =  Model::factory("stage_key")->getList(array("user_id" => $user_id));
          
           foreach($listKeySend as &$stage_key){
               $this->timeToStageKeyAsk( $stage_key );
               $listKey[] = $stage_key;
           } 
           
           $listKeyAsk =  Model::factory("stage_key")->getList(array("user_donator_id" => $user_id));
          
           foreach($listKeyAsk as &$stage_key){
               $this->timeToStageKeyAsk( $stage_key );
               $listKey[] = $stage_key;
           }       
           
                
           if(!is_array( $listKey ) || 0 == count($listKey)){
              $listKey = array(); 
           }
           return $listKey;
       } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "stageModel", "getStageActualKey", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
       } 
  } 
  
    public function stageTimerStart( $user_id, $company_stat_id, $stage_position, &$time_to_open = array()){
       try{
            
           //1. Проверить нет ли уже такой записи
           
           $listStageTime = Model::factory("stage_time")->getList(array("user_id" => $user_id, "company_stat_id" => $company_stat_id, "stage_position" => $stage_position));
           if(is_array($listStageTime) && 0 != count($listStageTime)){
                return false;
           }
           
           //2. Если записи нет, создать ее
           Model::factory("stage_time")->create(array("user_id" => $user_id, "company_stat_id" => $company_stat_id, "stage_position" => $stage_position, "time" => SConfig::$time));
           return true;
                                   
        } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "stageModel", "stageTimerStart", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
        }
      
    }

    /*
    //Первый этап компании предоставляется бесплатно
    //Ключи за первый этап к копании не проверяются, так же не проверяется другие виды платы
    */ 
    public function stageStart($user_id, $stage_stat_id, $cost_type){
       try{
           if(!Model::factory('user', $user_id)->exist()){
               //return array();
                errors::exc(errors::errorIncorrectInput, "user $user_id id not exist");
           }
           
           if(!Model::factory('stage_stat', $stage_stat_id)->exist()){
               //return array();
                errors::exc(errors::errorIncorrectInput, "stage $stage_stat_id not exist");
           }
           
           if(  $cost_type < 0 || $cost_type > 3 ){
               //return array();
                errors::exc(errors::errorIncorrectInput, "cost_type $cost_type not exist");
           }
           
           //----------------------------------------------------------------------------------------------------------------
           $flag_first_stage_in_company = false;
           $arr_company                 = array();
           $flag_stage_start_approved   = false;
           $stage_position              = -1;
           //----------------------------------------------------------------------------------------------------------------
           
           
           //посмотреть в какой компании находится этап
           
           $stage_stat      = Model::factory("stage_stat",   $stage_stat_id)->get();
           $company_stat_id = $stage_stat["company_stat_id"];
           $stage_position  = $stage_stat["position"];

  
           if(!Model::factory('company_stat', $company_stat_id)->exist()){
               return array("result" => -121, "text" => "company_stat=$company_stat_id not exist");
               //errors::exc(errors::errorIncorrectInput, "company_stat $company_stat_id not exist");

            }
           $company_stat    = Model::factory("company_stat", $company_stat_id)->get();

  
           $stage           = Model::factory("stage")->getList(array("user_id"=> $user_id, "stage_stat_id" => $stage_stat_id));
           
           if( count($stage) != 0){
               return array("result" => -120, "text" => "stage already exist");
           }
          
          //------------------------------------------------------------
          //этапа не существует - нужно проверить можно ли его запустить
          
          
   
          //-----------------------------------------------------------------------------------------------------------------
          //-----------------------------------------------------------------------------------------------------------------
          //условие №1: пройден ли предыдущий этап---------------------------------------------------------------------------
          if($stage_position > 0){
          
             $arr_previous_stage_stat = array();
          
             if($this->getPreviousStage($user_id, $stage_stat_id, $arr_previous_stage_stat)){
          
                 if($this->checkCompliteStage( $user_id, $arr_previous_stage_stat["id"])){
                     $flag_complete_previous_stage = true;
                 } else {
                     return array("result" => -121, "text" => "previous stage not complete");
                 }
             } else {
                 
                 //проверить - первый ли этап в компании 
                 if(is_array($arr_previous_stage_stat) && 0 != count($arr_previous_stage_stat) ){
                    return array("result" => -126, "text" => "previous stage not complete");
                 } 
                 
                 $flag_first_stage_in_company = true;      
                
             }
          } else {
          // если $stage_stat["position"] = 0 считаем что это первый этап в компании, т.к. отрицательных этапов быть не может
              $flag_first_stage_in_company = true;
          } 
          //-----------------------------------------------------------------------------------------------------------------
          //-----------------------------------------------------------------------------------------------------------------
   
          
           
          //-----------------------------------------------------------------------------------------------------------------
          //-----------------------------------------------------------------------------------------------------------------
          //условие №3: достаточно ли ресурсов для открытия этапа
          //если да то тут же списываем ресурсы
          
          $list_stage_key = Model::factory("stage_key")->getList(array("user_id" => $user_id, "stage_stat_id" => $stage_stat["id"], "status" => 1));
          $arr_stage_time =  $this->checkStageTime($user_id, $company_stat_id, $stage_position);        
          
          if(false == $flag_first_stage_in_company){
              switch( $cost_type ){

                  
                  //0 - ключи, 1 - время, 2 - money1

                  case 0:{
                      //cost_key
                        $stage_start_cost_key      = Model::factory ( 'var' )->loadByKey ( 'stage_start_cost_key' )->value;

                        
                        if(is_array($list_stage_key) && count($list_stage_key) >= $stage_start_cost_key){















                             $flag_stage_start_approved = true;
                             continue;
                             
                        } else {
                             return array("result" => -122, "text" => "not enough stage keys");
                        }
                  
                  } break;
                  case 1:{
                      //cost_time
                         if(!is_array($arr_stage_time) || count($arr_stage_time) == 0 || $arr_stage_time["result"] != 1){
                              return array("result" => -123, "text" => "stage time not exist");
                         } else {
                             if($arr_stage_time["time"] == 0 ){
                                 Model::factory("stage_time")->delete(array("id" => $arr_stage_time["stage_time_id"]));
                                 $flag_stage_start_approved = true;
                                 continue;
                                 
                             } else {
                                 return array("result" => -124, "text" => "cannot open, timer not completed");
                             }
                         }




                      
                  } break;
                  case 2:{
                    $stage_start_cost_money1      = Model::factory ( 'var' )->loadByKey ( 'stage_start_cost_money1' )->value;

                      
                      if( Model::factory("user", $user_id)->checkMoney( $stage_start_cost_money1, 0) ){


                      
                           $reason_id = 102;                                                                          
                           Model::factory("user", $user_id)->changeMoney( - $stage_start_cost_money1, 0, $reason_id);

                           
                           $flag_stage_start_approved = true;


                           continue;   
                      } else {
                           return array("result" => -125, "text" => "not enough money1");



                      }
                  } break;
                  case 3:{
                      //открытие этапа за валюту соц сети
                      //действие доступно только из index_cback_od.php (в index_cback_vk.php обработчика нет)




                      continue;   
                  } break;
              }
          } else {
             
              if( $cost_type == 3  ){
                  //открытие этапа за валюту соц сети
                  //не позволяем открыть первый этап за валюту соц сети
                  return array("result" => -170, "text" => "first stage in company must be free");
              }
              $flag_stage_start_approved = true;
          }
          
          //-----------------------------------------------------------------------------------------------------------------
          //убираем ключи
          if(is_array($list_stage_key)){
               foreach($list_stage_key as $arr_stage_key){
                   Model::factory("stage_key")->delete(array("id" => $arr_stage_key["id"]));
               }
           }
          //-----------------------------------------------------------------------------------------------------------------
          //убираем таймер
           if(is_array($arr_stage_time) && count($arr_stage_time) != 0 && $arr_stage_time["result"] == 1){
                Model::factory("stage_time")->delete(array("id" => $arr_stage_time["stage_time_id"]));
           }
          //-----------------------------------------------------------------------------------------------------------------
          
          //-----------------------------------------------------------------------------------------------------------------
          //-----------------------------------------------------------------------------------------------------------------
          //если все окей, проверяем первый ли этап в компании, и если да: создаем новую компанию 
          if(true == $flag_first_stage_in_company){
              //$arr_company
              Model::factory("company")->createCompany($user_id, $company_stat_id, $arr_company);  
          } else {
              $list_company = Model::factory("company")->getList(array("user_id" => $user_id, "company_stat_id" => $company_stat_id)); 
              $arr_company  = $list_company[0];
          }
          
          //если все окей, создаем новый этап для этого пользователя
          $new_stage = array( "user_id"        => $user_id, 
                              "stage_stat_id"  => $stage_stat_id,
                              "star"           => 0,
                              "flag_complete"  => 0
                            );
                            
          $obj_new_stage = Model::factory("stage")->create( $new_stage ); 
          $new_stage = $obj_new_stage->get();
          //-----------------------------------------------------------------------------------------------------------------
          //-----------------------------------------------------------------------------------------------------------------
          
          unset($new_stage["user_id"]);
           
          return array("result"        => 1, 
                       "cost_type"     => $cost_type,
                       "company"       => $arr_company,
                       "stage"         => $new_stage 
                       );
                       
       } catch(Exception $e) {
            
            LOG_CRASH::add($e->getCode(), $e->getMessage(), "stageModel", "stageStart", $user_id);
            throw new Exception ($e->getMessage(), $e->getCode());
       }
  }   
    
    public function stageEnd($user_id, $stage_id){
           try{
               if(!Model::factory('user', $user_id)->exist()){
                   //return array();
                    errors::exc(errors::errorIncorrectInput, "user $user_id id not exist");
               }
               
               if(!Model::factory('stage', $stage_id)->exist()){
                   //return array();
                    errors::exc(errors::errorIncorrectInput, "stage id not exist");
               }
               
               $stage      = Model::factory("stage", $stage_id)->get();
               
               //посмотреть в какой компании находится этап
               $stage_stat_id = $stage["stage_stat_id"];
               $stage_stat    = Model::factory("stage_stat",   $stage_stat_id)->get();
               $company_stat  = Model::factory("company_stat", $stage_stat["company_stat_id"])->get();
              
              $stage_star_count = 0;
              //-----------------------------------------------------------------------------------------------------------
              if(1 == $stage["flag_complete"]){
                  return array("result" => -131, "text" => "stage already complete"); 
              }
              
              if(Model::factory("stage")->checkStageMissionComplite( $user_id, $stage_stat_id, $stage_star_count )){
                  //запускаем таймер
                   
                   $next_stage_position    = $stage_stat["position"] + 1;
                   $company_stat_id        = $stage_stat["company_stat_id"];
                   
                   //-------------------------------------------------------------------------------------------------------
                   
                   //в checkStageMissionComplite точное значение количества star, переписываем
                   $stage["star"] = $stage_star_count;
                   
                   $stage["flag_complete"] = 1;
                   
                   $prize = array();
                   $prize["booster_type"] =  0;
                   $prize["booster_count"] = 0;
