ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ token = $token; $this->db = new Database(); } // Отправка сообщения с умной клавиатурой public function sendMessage($chatId, $text, $keyboard = null, $oneTime = true) { $data = [ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'HTML' ]; if ($keyboard) { $data['reply_markup'] = json_encode([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => $oneTime ]); } else { $data['reply_markup'] = json_encode([ 'remove_keyboard' => true ]); } return $this->apiRequest('sendMessage', $data); } // Отправка сообщения без клавиатуры public function sendMessageNoKeyboard($chatId, $text) { $data = [ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => 'HTML', 'reply_markup' => json_encode(['remove_keyboard' => true]) ]; return $this->apiRequest('sendMessage', $data); } // Отправка сообщения с постоянной клавиатурой public function sendMessagePersistent($chatId, $text, $keyboard) { return $this->sendMessage($chatId, $text, $keyboard, false); } // Отправка фото public function sendPhoto($chatId, $photo, $caption = '', $keyboard = null) { $data = [ 'chat_id' => $chatId, 'photo' => $photo, 'caption' => $caption ]; if ($keyboard) { $data['reply_markup'] = json_encode([ 'inline_keyboard' => $keyboard ]); } return $this->apiRequest('sendPhoto', $data); } // API запрос public function apiRequest($method, $data) { $url = "https://api.telegram.org/bot{$this->token}/{$method}"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $result = curl_exec($ch); curl_close($ch); return json_decode($result, true); } // Получение курса BTC public function getBTCRate() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, BTC_RATE_API); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $result = curl_exec($ch); curl_close($ch); $data = json_decode($result, true); return isset($data['bitcoin']['rub']) ? $data['bitcoin']['rub'] : 0; } // Генерация уникального реферального кода public function generateReferralCode() { do { $code = 'REF' . strtoupper(substr(md5(uniqid()), 0, 6)); $sql = "SELECT id FROM users WHERE referral_code = ?"; $existing = $this->db->fetch($sql, [$code]); } while ($existing); return $code; } // Регистрация пользователя с реферальным кодом public function registerUser($telegramId, $username, $firstName, $referralCode = null) { // Проверяем, существует ли пользователь $existingUser = $this->getUser($telegramId); if ($existingUser) { return; // Пользователь уже существует } $userReferralCode = $this->generateReferralCode(); $referrerId = null; // Если указан реферальный код, находим реферера if ($referralCode) { $referrer = $this->getUserByReferralCode($referralCode); if ($referrer && $referrer['telegram_id'] != $telegramId) { $referrerId = $referrer['telegram_id']; } } $sql = "INSERT IGNORE INTO users (telegram_id, username, first_name, referrer_id, referral_code) VALUES (?, ?, ?, ?, ?)"; return $this->db->query($sql, [$telegramId, $username, $firstName, $referrerId, $userReferralCode]); } // Получение пользователя по реферальному коду public function getUserByReferralCode($referralCode) { $sql = "SELECT * FROM users WHERE referral_code = ?"; return $this->db->fetch($sql, [$referralCode]); } // Получение статистики рефералов public function getReferralStats($telegramId) { $sql = "SELECT COUNT(*) as total_referrals, COUNT(CASE WHEN successful_deals > 0 THEN 1 END) as active_referrals FROM users WHERE referrer_id = ?"; return $this->db->fetch($sql, [$telegramId]); } // Начисление реферального бонуса public function addReferralCommission($orderId, $orderAmount) { // Получаем информацию о заказе $order = $this->getOrder($orderId); if (!$order) return; // Получаем пользователя, который сделал заказ $user = $this->getUser($order['user_id']); if (!$user || !$user['referrer_id']) return; // Рассчитываем комиссию (0.5%) $commissionRate = 0.005; $commissionAmount = $orderAmount * $commissionRate; // Начисляем комиссию рефереру $sql = "UPDATE users SET referral_balance = referral_balance + ?, total_earned = total_earned + ? WHERE telegram_id = ?"; $this->db->query($sql, [$commissionAmount, $commissionAmount, $user['referrer_id']]); // Записываем транзакцию $sql = "INSERT INTO referral_transactions (referrer_id, referred_id, order_id, order_amount, commission_amount, commission_rate) VALUES (?, ?, ?, ?, ?, ?)"; $this->db->query($sql, [$user['referrer_id'], $order['user_id'], $orderId, $orderAmount, $commissionAmount, $commissionRate]); // Уведомляем реферера $this->sendMessage($user['referrer_id'], "💰 Новый реферальный доход!\n\n₽ Сумма: +" . $this->formatNumber($commissionAmount, 2) . " ₽\n📋 От заказа: " . ($order['order_number'] ?? "№{$orderId}") . "\n\n💳 Баланс пополнен!"); } // Создание заявки на вывод public function createWithdrawal($telegramId, $amount, $method, $details) { $user = $this->getUser($telegramId); if (!$user || $user['referral_balance'] < $amount) { return false; // Недостаточно средств } if ($amount < 500) { return false; // Минимальная сумма вывода } // Списываем средства с баланса $sql = "UPDATE users SET referral_balance = referral_balance - ? WHERE telegram_id = ?"; $this->db->query($sql, [$amount, $telegramId]); // Создаем заявку на вывод $sql = "INSERT INTO withdrawals (user_id, amount, withdrawal_method, withdrawal_details) VALUES (?, ?, ?, ?)"; $this->db->query($sql, [$telegramId, $amount, $method, $details]); $withdrawalId = $this->db->lastInsertId(); // Уведомляем админов $this->notifyAdmins("💸 Новая заявка на вывод!\n\n📋 ID: {$withdrawalId}\n👤 Пользователь: {$user['first_name']}\n💰 Сумма: {$amount} ₽\n💳 Способ: {$method}\n📞 Реквизиты: {$details}"); return $withdrawalId; } // Получение реферальных транзакций пользователя public function getReferralTransactions($telegramId, $limit = 10) { $sql = "SELECT rt.*, u.first_name, o.order_number FROM referral_transactions rt JOIN users u ON rt.referred_id = u.telegram_id LEFT JOIN orders o ON rt.order_id = o.id WHERE rt.referrer_id = ? ORDER BY rt.created_at DESC LIMIT ?"; return $this->db->query($sql, [$telegramId, $limit])->fetchAll(); } // Получение пользователя public function getUser($telegramId) { $sql = "SELECT * FROM users WHERE telegram_id = ?"; return $this->db->fetch($sql, [$telegramId]); } // Установка состояния пользователя public function setState($telegramId, $state, $data = null) { $sql = "INSERT INTO user_states (telegram_id, state, data) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE state = ?, data = ?"; return $this->db->query($sql, [$telegramId, $state, $data, $state, $data]); } // Получение состояния пользователя public function getState($telegramId) { $sql = "SELECT * FROM user_states WHERE telegram_id = ?"; return $this->db->fetch($sql, [$telegramId]); } // Очистка состояния пользователя public function clearState($telegramId) { $sql = "DELETE FROM user_states WHERE telegram_id = ?"; return $this->db->query($sql, [$telegramId]); } // Генерация уникального номера заказа public function generateOrderNumber() { do { $year = date('y'); $month = date('m'); $random = str_pad(rand(1000, 9999), 4, '0', STR_PAD_LEFT); $orderNumber = "BTC{$year}{$month}{$random}"; $sql = "SELECT id FROM orders WHERE order_number = ?"; $existing = $this->db->fetch($sql, [$orderNumber]); } while ($existing); return $orderNumber; } // Создание заказа public function createOrder($userId, $btcAddress, $rubAmount, $btcAmount, $btcRate, $paymentMethod, $paymentDetails) { $orderNumber = $this->generateOrderNumber(); $sql = "INSERT INTO orders (user_id, order_number, btc_address, rub_amount, btc_amount, btc_rate, payment_method, payment_details) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; $this->db->query($sql, [$userId, $orderNumber, $btcAddress, $rubAmount, $btcAmount, $btcRate, $paymentMethod, $paymentDetails]); return [ 'id' => $this->db->lastInsertId(), 'order_number' => $orderNumber ]; } // Получение заказа по ID public function getOrder($orderId) { $sql = "SELECT * FROM orders WHERE id = ?"; return $this->db->fetch($sql, [$orderId]); } // Получение заказа по номеру public function getOrderByNumber($orderNumber) { $sql = "SELECT * FROM orders WHERE order_number = ?"; return $this->db->fetch($sql, [$orderNumber]); } // Получение заказа пользователя по номеру public function getUserOrderByNumber($orderNumber, $telegramId) { $sql = "SELECT * FROM orders WHERE order_number = ? AND user_id = ?"; return $this->db->fetch($sql, [$orderNumber, $telegramId]); } // Обновление статуса заказа public function updateOrderStatus($orderId, $status) { $sql = "UPDATE orders SET status = ? WHERE id = ?"; return $this->db->query($sql, [$status, $orderId]); } // Обновление чека заказа public function updateOrderReceipt($orderId, $receiptPhoto) { $sql = "UPDATE orders SET receipt_photo = ? WHERE id = ?"; return $this->db->query($sql, [$receiptPhoto, $orderId]); } // Получение случайного способа оплаты public function getRandomPaymentMethod($type) { $sql = "SELECT * FROM payment_methods WHERE type = ? AND is_active = 1 ORDER BY RAND() LIMIT 1"; return $this->db->fetch($sql, [$type]); } // Увеличение счетчика успешных сделок public function incrementUserDeals($telegramId) { $sql = "UPDATE users SET successful_deals = successful_deals + 1 WHERE telegram_id = ?"; return $this->db->query($sql, [$telegramId]); } // Валидация BTC адреса public function isValidBTCAddress($address) { $length = strlen($address); if ($length < 26 || $length > 62) { return false; } if (!preg_match('/^[a-zA-Z0-9]+$/', $address)) { return false; } if (preg_match('/^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$/', $address) || preg_match('/^bc1[a-z0-9]{39,59}$/', $address)) { return true; } return false; } // Форматирование числа public function formatNumber($number, $decimals = 2) { return number_format($number, $decimals, '.', ' '); } // Отправка уведомления админам public function notifyAdmins($message, $keyboard = null) { $this->sendMessage(ADMIN_ID, $message, $keyboard); if (defined('ENABLE_GROUP_NOTIFICATIONS') && ENABLE_GROUP_NOTIFICATIONS && defined('NOTIFICATIONS_CHAT_ID')) { $this->sendMessage(NOTIFICATIONS_CHAT_ID, $message); } } // Отправка фото админам public function notifyAdminsWithPhoto($photo, $caption = '', $keyboard = null) { $this->sendPhoto(ADMIN_ID, $photo, $caption, $keyboard); if (defined('ENABLE_GROUP_NOTIFICATIONS') && ENABLE_GROUP_NOTIFICATIONS && defined('NOTIFICATIONS_CHAT_ID')) { $this->sendPhoto(NOTIFICATIONS_CHAT_ID, $photo, $caption); } } // Проверка, является ли чат чатом уведомлений public function isNotificationChat($chatId) { return defined('NOTIFICATIONS_CHAT_ID') && $chatId == NOTIFICATIONS_CHAT_ID; } // Получение истории заказов пользователя public function getUserOrders($telegramId, $limit = 10) { $sql = "SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC LIMIT ?"; return $this->db->query($sql, [$telegramId, $limit])->fetchAll(); } // Получение активных заказов пользователя public function getUserActiveOrders($telegramId) { $sql = "SELECT * FROM orders WHERE user_id = ? AND status IN ('pending', 'waiting_payment') ORDER BY created_at DESC"; return $this->db->fetchAll($sql, [$telegramId]); } // Форматирование статуса заказа public function formatOrderStatus($status) { $statuses = [ 'pending' => '🟡 Создан', 'waiting_payment' => '🔵 Ожидает проверки', 'completed' => '🟢 Выполнен', 'rejected' => '🔴 Отклонен', 'cancelled' => '⚫ Отменен' ]; return $statuses[$status] ?? $status; } // Получение краткой информации о заказе public function getOrderSummary($order) { $orderDisplay = isset($order['order_number']) ? $order['order_number'] : "№{$order['id']}"; $summary = "📋 Заказ {$orderDisplay}\n"; $summary .= "💰 {$order['rub_amount']} ₽ → {$order['btc_amount']} BTC\n"; $summary .= "📅 " . date('d.m.Y H:i', strtotime($order['created_at'])) . "\n"; $summary .= $this->formatOrderStatus($order['status']); return $summary; } // Получение детальной информации о заказе public function getOrderDetails($order) { $orderDisplay = isset($order['order_number']) ? $order['order_number'] : "№{$order['id']}"; $details = "📋 Заказ {$orderDisplay}\n\n"; $details .= "💰 Сумма: {$order['rub_amount']} ₽\n"; $details .= "₿ BTC: {$order['btc_amount']}\n"; $details .= "📊 Курс: " . $this->formatNumber($order['btc_rate'], 0) . " ₽\n"; $details .= "📍 Адрес:\n{$order['btc_address']}\n"; $details .= "💳 Способ оплаты: " . ($order['payment_method'] === 'card' ? 'Карта' : 'СБП') . "\n"; $details .= "📅 Создан: " . date('d.m.Y H:i', strtotime($order['created_at'])) . "\n"; $details .= "📊 Статус: " . $this->formatOrderStatus($order['status']) . "\n"; if ($order['status'] === 'waiting_payment') { $details .= "\n⏰ Ожидается подтверждение администратора"; } elseif ($order['status'] === 'completed') { $details .= "\n✅ BTC отправлен на указанный адрес"; } elseif ($order['status'] === 'rejected') { $details .= "\n❌ Заказ отклонен администратором"; } return $details; } // Получение ожидающих заказов для админа public function getPendingOrders() { $sql = "SELECT o.*, u.username, u.first_name FROM orders o JOIN users u ON o.user_id = u.telegram_id WHERE o.status = 'waiting_payment' AND o.receipt_photo IS NOT NULL ORDER BY o.created_at DESC"; return $this->db->fetchAll($sql); } } ?>