12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118 |
- <?php
- /**
- * Basic OpenPayz implementation
- */
- class OpenPayz {
- /**
- * Contains available virtualid=>realid mappings
- *
- * @var array
- */
- protected $allCustomers = array();
- /**
- * Contains existing transactions data
- *
- * @var array
- */
- protected $allTransactions = array();
- /**
- * Existing payment systems names
- *
- * @var array
- */
- protected $allPaySys = array();
- /**
- * Contains system alter.ini config as key=>value
- *
- * @var array
- */
- protected $altCfg = array();
- /**
- * Contains available users address data as login=>address
- *
- * @var array
- */
- protected $allAddress = array();
- /**
- * Contains available users realnames as login=>realname
- *
- * @var array
- */
- protected $allRealnames = array();
- /**
- * System message helper object placeholder
- *
- * @var object
- */
- protected $messages = '';
- /**
- * Placeholder for UbillingConfig object
- *
- * @var object
- */
- protected $ubConfig = '';
- /**
- * Placeholder for OP_SMS_NOTIFY_PAYMENTS_PULL_INTERVAL alter.ini option
- *
- * @var int
- */
- protected $smsNotysPullInterval = 10;
- /**
- * Placeholder for OP_SMS_NOTIFY_USE_EXTMOBILES alter.ini option
- *
- * @var bool
- */
- protected $smsUseExtMobiles = false;
- /**
- * Placeholder for OP_SMS_NOTIFY_FORCED_TRANSLIT alter.ini option
- *
- * @var bool
- */
- protected $smsForceTranslit = false;
- /**
- * Placeholder for OP_SMS_NOTIFY_DEBUG_ON alter.ini option
- *
- * @var bool
- */
- protected $smsDebugON = false;
- /**
- * Placeholder for OP_SMS_NOTIFY_TEXT alter.ini option
- *
- * @var string
- */
- protected $smsNotysText = '';
- /**
- * Placeholder for OP_SMS_NOTIFY_RESPECT_REMINDER_TAGID alter.ini option
- *
- * @var bool
- */
- protected $smsRespectReminderTagID = false;
- /**
- * Placeholder for REMINDER_TAGID alter.ini option
- *
- * @var int
- */
- protected $smsReminderTagID = 0;
- /**
- * All users tags to use if $smsRespectReminderTagID is true
- *
- * @var array
- */
- protected $allUsersTags = array();
- /**
- * Customers database abstraction layer placeholder
- *
- * @var object
- */
- protected $customersDb = '';
- /**
- * Transactions database abstraction layer placeholder
- *
- * @var object
- */
- protected $transactionsDb = '';
- /**
- * Static customers database abstraction layer placeholder
- *
- * @var object
- */
- protected $staticDb = '';
- /**
- * Length of generated static payment ID
- *
- * @var int
- */
- protected $payidStaticLen = 0;
- /**
- * Prefix for newly generated static payment IDs
- *
- * @var string
- */
- protected $payIdStaticPrefix = '';
- /**
- * Funds flow instance placeholder
- *
- * @var object
- */
- protected $fundsFlow = '';
- /**
- * System caching object placeholder
- *
- * @var object
- */
- protected $cache = '';
- /**
- * Default cached data timeout. May be configurable in future?
- *
- * @var int
- */
- protected $cacheTimeout = 86400;
- /**
- * Transactions list ajax callback URL
- */
- const URL_AJAX_SOURCE = '?module=openpayz&ajax=true';
- /**
- * Payment systems charts URL
- */
- const URL_CHARTS = '?module=openpayz&graphs=true';
- /**
- * Default module URL
- */
- const URL_ME = '?module=openpayz';
- /**
- * Some other predefined stuff
- */
- const TABLE_CUSTOMERS = 'op_customers';
- const TABLE_TRANSACTIONS = 'op_transactions';
- const TABLE_STATIC = 'op_static';
- const KEY_PSYS = 'OPPAYSYS';
- const KEY_CHARTS = 'OPCHARTS_';
- /**
- * Creates new OpenPayz instance
- *
- * @param bool $loadPaySys
- * @param bool $loadCustomers
- *
- * @return void
- */
- public function __construct($loadPaySys = false, $loadCustomers = false) {
- global $ubillingConfig;
- $this->ubConfig = $ubillingConfig;
- $this->loadAlter();
- $this->loadOptions();
- $this->initMessages();
- $this->initDbLayers();
- $this->initCache();
- //preloading some optional data
- if ($loadPaySys) {
- $this->loadPaySys();
- }
- if ($loadCustomers) {
- $this->loadCustomers();
- }
- if ($this->smsRespectReminderTagID) {
- $this->allUsersTags = zb_UserGetAllTags();
- }
- }
- /**
- * Loads global alter config into protected property
- *
- * @global object $ubillingConfig
- *
- * @return void
- */
- protected function loadAlter() {
- global $ubillingConfig;
- $this->altCfg = $ubillingConfig->getAlter();
- }
- /**
- * Getting an alter.ini options
- */
- protected function loadOptions() {
- $this->smsNotysPullInterval = ubRouting::filters($this->ubConfig->getAlterParam('OP_SMS_NOTIFY_PAYMENTS_PULL_INTERVAL', 5), 'int');
- $this->smsUseExtMobiles = ubRouting::filters($this->ubConfig->getAlterParam('OP_SMS_NOTIFY_USE_EXTMOBILES'), 'fi', FILTER_VALIDATE_BOOLEAN);
- $this->smsForceTranslit = ubRouting::filters($this->ubConfig->getAlterParam('OP_SMS_NOTIFY_FORCED_TRANSLIT'), 'fi', FILTER_VALIDATE_BOOLEAN);
- $this->smsDebugON = ubRouting::filters($this->ubConfig->getAlterParam('OP_SMS_NOTIFY_DEBUG_ON'), 'fi', FILTER_VALIDATE_BOOLEAN);
- $this->smsNotysText = $this->ubConfig->getAlterParam('OP_SMS_NOTIFY_TEXT', '');
- $this->smsRespectReminderTagID = ubRouting::filters($this->ubConfig->getAlterParam('OP_SMS_NOTIFY_RESPECT_REMINDER_TAGID'), 'fi', FILTER_VALIDATE_BOOLEAN);
- $this->smsReminderTagID = ubRouting::filters($this->ubConfig->getAlterParam('REMINDER_TAGID', 0), 'int');
- $this->payidStaticLen = ubRouting::filters($this->ubConfig->getAlterParam('OPENPAYZ_STATIC_ID', 0), 'int');
- $this->payIdStaticPrefix = $this->ubConfig->getAlterParam('OPENPAYZ_STATIC_ID_PREFIX', '');
- }
- /**
- * Inits all required database abstraction layers
- *
- * @return void
- */
- protected function initDbLayers() {
- $this->customersDb = new NyanORM(self::TABLE_CUSTOMERS);
- $this->transactionsDb = new NyanORM(self::TABLE_TRANSACTIONS);
- $this->staticDb = new NyanORM(self::TABLE_STATIC);
- }
- /**
- * Inits Ubilling caching engine for further usage
- *
- * @return void
- */
- protected function initCache() {
- $this->cache = new UbillingCache();
- }
- /**
- * Loads users address list into protected property
- *
- * @return void
- */
- protected function loadAddress() {
- $this->allAddress = zb_AddressGetFulladdresslistCached();
- }
- /**
- * Loads users realnames list into protected property
- *
- * @return void
- */
- protected function loadRealname() {
- $this->allRealnames = zb_UserGetAllRealnames();
- }
- /**
- * Loads all op_customers from database into protected prop
- *
- * @return void
- */
- protected function loadCustomers() {
- $allCustomers = $this->customersDb->getAll();
- if (!empty($allCustomers)) {
- foreach ($allCustomers as $io => $eachcustomer) {
- $this->allCustomers[$eachcustomer['virtualid']] = $eachcustomer['realid'];
- }
- }
- }
- /**
- * Loads available openpayz transactions into private data property
- *
- * @param int $year
- * @param int $transactionId
- *
- * @return void
- */
- protected function loadTransactions($year = '', $transactionId = 0) {
- $year = ubRouting::filters($year, 'int');
- $transactionId = ubRouting::filters($transactionId, 'int');
- if (!empty($year) and $year != '1488') {
- $this->transactionsDb->where('date', 'LIKE', $year . '-%');
- }
- if ($transactionId) {
- //only one transaction
- $this->transactionsDb->where('id', '=', $transactionId);
- } else {
- //or natural ordering?
- $this->transactionsDb->orderBy('id', 'ASC');
- }
- $this->allTransactions = $this->transactionsDb->getAll('id');
- }
- /**
- * Public getter of preloaded users mappings as paymentId=>userLogin
- *
- * @return array
- */
- public function getCustomers() {
- if (empty($this->allCustomers)) {
- $this->loadCustomers();
- }
- return ($this->allCustomers);
- }
- /**
- * Public getter of preloaded users mappings as userLogin=>paymentId
- *
- * @return array
- */
- public function getCustomersPaymentIds() {
- $result = array();
- if (empty($this->allCustomers)) {
- $this->loadCustomers();
- }
- if (!empty($this->allCustomers)) {
- $result = array_flip($this->allCustomers);
- }
- return ($result);
- }
- /**
- * Returns some specified user paymentId
- *
- * @param string $userLogin
- *
- * @return string
- */
- public function getCustomerPaymentId($userLogin) {
- $result = '';
- $userLogin = ubRouting::filters($userLogin, 'mres');
- if (!empty($this->allCustomers)) {
- //already preloaded from database
- $tmp = array_flip($this->allCustomers);
- if (isset($tmp[$userLogin])) {
- $result = $tmp[$userLogin];
- }
- } else {
- //not loaded at start, performing database query
- $this->customersDb->where('realid', '=', $userLogin);
- $rawData = $this->customersDb->getAll();
- if (!empty($rawData)) {
- $result = $rawData[0]['virtualid'];
- }
- }
- return ($result);
- }
- /**
- * Loads array of available payment systems
- *
- * @return void
- */
- protected function loadPaySys() {
- $paySysCached = $this->cache->get(self::KEY_PSYS, $this->cacheTimeout);
- if (empty($paySysCached)) {
- $all = $this->transactionsDb->getAll('', true, 'paysys');
- if (!empty($all)) {
- foreach ($all as $io => $each) {
- $this->allPaySys[$each['paysys']] = $each['paysys'];
- }
- }
- $this->cache->set(self::KEY_PSYS, $this->allPaySys, $this->cacheTimeout);
- } else {
- $this->allPaySys = $paySysCached;
- }
- }
- /**
- * Inits system messages helper
- *
- * @return voids
- */
- protected function initMessages() {
- $this->messages = new UbillingMessageHelper();
- }
- /**
- * Generates unique payment ID of configurable length
- *
- * @return int
- */
- protected function generateUniquePaymentId() {
- $result = 0;
- if ($this->payidStaticLen > 0) {
- $result = $this->payIdStaticPrefix . zb_rand_digits($this->payidStaticLen);
- while (isset($this->allCustomers[$result])) {
- $result = $this->payIdStaticPrefix . zb_rand_digits($this->payidStaticLen);
- }
- }
- return ($result);
- }
- /**
- * Creates new static payment ID in database for some user
- *
- * @param string $userLogin
- *
- * @return int
- */
- public function registerStaticPaymentId($userLogin) {
- $result = '';
- $userLoginF = ubRouting::filters($userLogin, 'mres');
- if ($this->payidStaticLen > 0) {
- $noPaymentId = true; //payment ID registered flag
- $existingPayId = ''; //contains existing payment ID if it exists now
- if (!empty($this->allCustomers)) {
- foreach ($this->allCustomers as $eachPayId => $eachLogin) {
- if ($eachLogin == $userLogin) {
- $noPaymentId = false;
- $existingPayId = $eachPayId;
- break;
- }
- }
- }
- //user have no payment ID yet?
- if ($noPaymentId) {
- $newPaymentId = $this->generateUniquePaymentId();
- $this->staticDb->data('realid', $userLoginF);
- $this->staticDb->data('virtualid', $newPaymentId);
- $this->staticDb->create();
- log_register('OPENPAYZ STATIC REGISTER (' . $userLogin . ') PAYID `' . $newPaymentId . '`');
- $result = $newPaymentId;
- } else {
- log_register('OPENPAYZ STATIC REGISTER FAIL (' . $userLogin . ') ALREADY `' . $existingPayId . '`');
- }
- }
- return ($result);
- }
- /**
- * Deregisters static payment ID by username
- *
- * @param string $userLogin
- *
- * @return void
- */
- public function degisterStaticPaymentId($userLogin) {
- $userLoginF = ubRouting::filters($userLogin, 'mres');
- $this->staticDb->where('realid', '=', $userLoginF);
- $this->staticDb->delete();
- log_register('OPENPAYZ STATIC DELETE (' . $userLogin . ')');
- }
- /**
- * Returns openpayz search form
- *
- * @return string
- */
- public function renderSearchForm() {
- $result = '';
- $curYear = (ubRouting::checkPost('searchyear')) ? ubRouting::post('searchyear', 'int') : date("Y");
- $curMonth = (ubRouting::checkPost('searchmonth')) ? ubRouting::post('searchmonth', 'int') : date("m");
- $curPaysys = (ubRouting::checkPost('searchpaysys')) ? ubRouting::post('searchpaysys', 'mres') : '';
- /**
- * No lights, no sights, every fright, every night
- * Alone, hurt and cold, she‘s shackled to the pipes
- */
- $paySysSelector['ANY'] = __('All');
- $paySysSelector += $this->allPaySys;
- $inputs = wf_YearSelectorPreset('searchyear', __('Year'), false, $curYear) . ' ';
- $inputs .= wf_MonthSelector('searchmonth', __('Month'), $curMonth, false) . ' ';
- $inputs .= wf_Selector('searchpaysys', $paySysSelector, __('Payment system'), $curPaysys, false) . ' ';
- $inputs .= wf_Submit(__('Search'));
- $result .= wf_BackLink(self::URL_ME);
- $result .= wf_delimiter();
- $result .= wf_Form("", 'POST', $inputs, 'glamour');
- return ($result);
- }
- /**
- * Performs openpayz search in database and shows result
- *
- * @param int $year
- * @param string $month
- * @param string $paysys
- *
- * @return void
- */
- public function doSearch($year, $month, $paysys) {
- $this->loadTransactions();
- $this->loadRealname();
- $this->loadAddress();
- $this->loadCustomers();
- $csvdata = '';
- $totalsumm = 0;
- $totalcount = 0;
- $cells = wf_TableCell(__('ID'));
- $cells .= wf_TableCell(__('Date'));
- $cells .= wf_TableCell(__('Cash'));
- $cells .= wf_TableCell(__('Payment ID'));
- $cells .= wf_TableCell(__('Real Name'));
- $cells .= wf_TableCell(__('Full address'));
- $cells .= wf_TableCell(__('Payment system'));
- $cells .= wf_TableCell(__('Processed'));
- $cells .= wf_TableCell(__('Actions'));
- $rows = wf_TableRow($cells, 'row1');
- if (!empty($this->allTransactions)) {
- $csvdata = __('ID') . ';' . __('Date') . ';' . __('Cash') . ';' . __('Payment ID') . ';' . __('Real Name') . ';' . __('Full address') . ';' . __('Payment system') . "\n";
- foreach ($this->allTransactions as $io => $eachtransaction) {
- if (ispos($eachtransaction['date'], $year . '-' . $month)) {
- if (($eachtransaction['paysys'] == $paysys) or (($paysys == 'ANY'))) {
- @$user_login = $this->allCustomers[$eachtransaction['customerid']];
- @$user_realname = $this->allRealnames[$user_login];
- @$user_address = $this->allAddress[$user_login];
- $cells = wf_TableCell($eachtransaction['id']);
- $cells .= wf_TableCell($eachtransaction['date']);
- $cells .= wf_TableCell($eachtransaction['summ']);
- $cells .= wf_TableCell($eachtransaction['customerid']);
- $cells .= wf_TableCell($user_realname);
- $cells .= wf_TableCell($user_address);
- $cells .= wf_TableCell($eachtransaction['paysys']);
- $cells .= wf_TableCell(web_bool_led($eachtransaction['processed']));
- $cells .= wf_TableCell(wf_Link('?module=userprofile&username=' . $user_login, web_profile_icon()));
- $rows .= wf_TableRow($cells, 'row3');
- if ($eachtransaction['summ'] > 0) {
- $totalsumm = $totalsumm + $eachtransaction['summ'];
- $totalcount = $totalcount + 1;
- }
- $csvSumm = str_replace('.', ',', $eachtransaction['summ']);
- $csvdata .= $eachtransaction['id'] . ';' . $eachtransaction['date'] . ';' . $csvSumm . ';' . $eachtransaction['customerid'] . ';' . $user_realname . ';' . $user_address . ';' . $eachtransaction['paysys'] . "\n";
- }
- }
- }
- }
- $result = wf_TableBody($rows, '100%', '0', 'sortable');
- $result .= __('Total') . ': ' . $totalcount . ' ' . __('payments') . ' ' . __('with total amount') . ' ' . $totalsumm;
- if (!empty($csvdata)) {
- $exportFilename = 'exports/opsearch_' . $paysys . '_' . $year . '-' . $month . '.csv';
- file_put_contents($exportFilename, $csvdata);
- $exportLink = wf_Link(self::URL_ME . '&dload=' . base64_encode($exportFilename), wf_img('skins/excel.gif', __('Export')), false, '');
- } else {
- $exportLink = '';
- }
- show_window(__('Search results') . ' ' . $paysys . ': ' . $year . '-' . $month . ' ' . $exportLink, $result);
- }
- /**
- * Inits funds flow object instance
- *
- * @return void
- */
- protected function initFundsFlow() {
- $this->fundsFlow = new FundsFlow();
- $this->fundsFlow->runDataLoders();
- }
- /**
- * Returns user online left days without additional DB queries
- * runDataLoaders() must be run once, before usage
- *
- * @param string $login existing users login
- *
- * @return int >=0: days left, -1: debt, -2: zero tariff price
- */
- protected function getUserOnlineLeftDayCount($login) {
- $result = 0;
- $onlineLeftCount = $this->fundsFlow->getOnlineLeftCountFast($login);
- if ($onlineLeftCount >= 0) {
- $result = $onlineLeftCount;
- }
- return ($result);
- }
- /**
- * Returns user online to date
- *
- * @param string $login existing users login
- *
- * @return string
- */
- protected function getUserOnlineToDate($login) {
- $result = date("d.m.Y");
- $daysOnLine = $this->fundsFlow->getOnlineLeftCountFast($login);
- if ($daysOnLine >= 0) {
- $result = date("d.m.Y", time() + ($daysOnLine * 24 * 60 * 60));
- }
- return ($result);
- }
- /**
- * Renders year selection form for charts
- *
- * @return string
- */
- protected function renderChartsYearForm() {
- $result = '';
- $curYear = ubRouting::checkPost('chartsyear') ? ubRouting::post('chartsyear', 'int') : curyear();
- $inputs = wf_YearSelectorPreset('chartsyear', __('Year'), false, $curYear, true) . ' ';
- $inputs .= wf_Submit(__('Show'));
- $result .= wf_Form('', 'POST', $inputs, 'glamour');
- return ($result);
- }
- /**
- * Renders per-payment system openpayz transaction charts
- *
- * @return string
- */
- public function renderGraphs() {
- $showYear = ubRouting::checkPost('chartsyear') ? ubRouting::post('chartsyear', 'int') : curyear();
- $curMonth = curmonth();
- $curDay = curdate();
- $curYear = curyear();
- $psysdata = array();
- $gcAllData = array();
- $gcYearData = array();
- $gcMonthData = array();
- $gcDayData = array();
- $gchartsData = array();
- $chartsOptions = "
- 'focusTarget': 'category',
- 'hAxis': {
- 'color': 'none',
- 'baselineColor': 'none',
- },
- 'vAxis': {
- 'color': 'none',
- 'baselineColor': 'none',
- },
- 'curveType': 'function',
- 'pointSize': 5,
- 'crosshair': {
- trigger: 'none'
- },";
- $result = wf_BackLink(self::URL_ME, '', true);
- //cahche data extraction
- $cacheKeyName = self::KEY_CHARTS . $showYear;
- $cacheDataRaw = $this->cache->get($cacheKeyName, $this->cacheTimeout);
- //something in cache
- if (!empty($cacheDataRaw)) {
- $psysdata = $cacheDataRaw['psysdata'];
- $gcYearData = $cacheDataRaw['gcYearData'];
- $gcMonthData = $cacheDataRaw['gcMonthData'];
- $gcDayData = $cacheDataRaw['gcDayData'];
- } else {
- $cacheDataRaw = array();
- //real data loading
- $this->loadTransactions($showYear);
- if (!empty($this->allTransactions)) {
- foreach ($this->allTransactions as $io => $each) {
- $timestamp = strtotime($each['date']);
- $date = date("Y-m", $timestamp);
- $dateFull = date("Y-m-d", $timestamp);
- if (isset($psysdata[$each['paysys']][$date]['count'])) {
- $psysdata[$each['paysys']][$date]['count']++;
- $psysdata[$each['paysys']][$date]['summ'] = $psysdata[$each['paysys']][$date]['summ'] + $each['summ'];
- } else {
- $psysdata[$each['paysys']][$date]['count'] = 1;
- $psysdata[$each['paysys']][$date]['summ'] = $each['summ'];
- }
- //current year stats
- if (ispos($date, $curYear)) {
- if (isset($gcYearData[$each['paysys']])) {
- $gcYearData[$each['paysys']]++;
- } else {
- $gcYearData[$each['paysys']] = 1;
- }
- }
- //current month stats
- if (ispos($date, $curMonth)) {
- if (isset($gcMonthData[$each['paysys']])) {
- $gcMonthData[$each['paysys']]++;
- } else {
- $gcMonthData[$each['paysys']] = 1;
- }
- }
- //current day stats
- if (ispos($dateFull, $curDay)) {
- if (isset($gcDayData[$each['paysys']])) {
- $gcDayData[$each['paysys']]++;
- } else {
- $gcDayData[$each['paysys']] = 1;
- }
- }
- }
- }
- //store in cache
- $cacheDataRaw['psysdata'] = $psysdata;
- $cacheDataRaw['gcYearData'] = $gcYearData;
- $cacheDataRaw['gcMonthData'] = $gcMonthData;
- $cacheDataRaw['gcDayData'] = $gcDayData;
- $this->cache->set($cacheKeyName, $cacheDataRaw, $this->cacheTimeout);
- }
- $chartOpts = "chartArea: { width: '90%', height: '90%' }, legend : {position: 'right'}, ";
- $fixedColors = @$this->altCfg['OPENPAYZ_PALETTE'];
- if (!empty($gcDayData)) {
- $gcDayPie = wf_gcharts3DPie($gcDayData, __('Today'), '300px', '300px', $chartOpts, $fixedColors);
- } else {
- $gcDayPie = '';
- }
- if (!empty($gcMonthData)) {
- $gcMonthPie = wf_gcharts3DPie($gcMonthData, __('Current month'), '300px', '300px', $chartOpts, $fixedColors);
- } else {
- $gcMonthPie = '';
- }
- if (!empty($gcYearData)) {
- $gcYearPie = wf_gcharts3DPie($gcYearData, __('Current year'), '300px', '300px', $chartOpts, $fixedColors);
- } else {
- $gcYearPie = '';
- }
- $gcells = wf_TableCell($gcYearPie);
- $gcells .= wf_TableCell($gcMonthPie);
- $gcells .= wf_TableCell($gcDayPie);
- $grows = wf_TableRow($gcells);
- $result .= wf_tag('br');
- $result .= $this->renderChartsYearForm();
- $result .= wf_CleanDiv();
- $result .= wf_TableBody($grows, '100%', 0, '');
- if (!empty($psysdata)) {
- foreach ($psysdata as $psys => $opdate) {
- $gchartsData[] = array(__('Date'), __('Count'), __('Cash'));
- foreach ($opdate as $datestamp => $optrans) {
- $gchartsData[] = array($datestamp, $optrans['count'], $optrans['summ']);
- }
- $result .= wf_gchartsLine($gchartsData, $psys, '100%', '300px;', $chartsOptions);
- $gchartsData = array();
- }
- }
- return ($result);
- }
- /**
- * Sets openpayz transaction as processed in database
- *
- * @param int $transactionId
- *
- * @return void
- */
- public function transactionSetProcessed($transactionId) {
- $transactionId = ubRouting::filters($transactionId, 'int');
- $this->transactionsDb->where('id', '=', $transactionId);
- $this->transactionsDb->data('processed', '1');
- $this->transactionsDb->save();
- log_register('OPENPAYZ PROCESSED [' . $transactionId . ']');
- }
- /**
- * Pushes user payment with some payment system
- *
- * @param string $login
- * @param float $cash
- * @param string $paysys
- *
- * @return void
- */
- public function cashAdd($login, $cash, $paysys) {
- $note = 'OP:' . $paysys;
- zb_CashAdd($login, $cash, 'add', $this->altCfg['OPENPAYZ_CASHTYPEID'], $note);
- }
- /**
- * Returns openpayz transaction data by its ID
- *
- * @param int $transactionid
- *
- * @return array
- */
- function transactionGetData($transactionid) {
- $result = array();
- if (empty($this->allTransactions)) {
- $this->loadTransactions();
- }
- if (isset($this->allTransactions[$transactionid])) {
- $result = $this->allTransactions[$transactionid];
- }
- return ($result);
- }
- /**
- * Retruns json data for jquery data tables with transactions list
- *
- * @global object $ubillingConfig
- *
- * @return void
- */
- public function transactionAjaxSource() {
- $this->loadCustomers();
- $this->loadAddress();
- $this->loadRealname();
- $curYear = curyear();
- $manual_mode = $this->altCfg['OPENPAYZ_MANUAL'];
- //loading current year transactions
- $this->loadTransactions($curYear);
- $json = new wf_JqDtHelper();
- if (!empty($this->allTransactions)) {
- foreach ($this->allTransactions as $io => $eachtransaction) {
- $control = '';
- if ($manual_mode) {
- if ($eachtransaction['processed'] == 0) {
- $control .= ' ' . wf_Link(self::URL_ME . '&process=' . $eachtransaction['id'], web_add_icon('Payment'));
- }
- }
- @$user_login = $this->allCustomers[$eachtransaction['customerid']];
- @$user_realname = $this->allRealnames[$user_login];
- @$user_address = $this->allAddress[$user_login];
- if (!empty($user_login)) {
- $profileLink = wf_Link('?module=userprofile&username=' . $user_login, web_profile_icon() . ' ' . @$user_address);
- } else {
- $profileLink = '';
- }
- $stateIcon = web_bool_led($eachtransaction['processed']);
- $detailsControl = ' ' . wf_Link(self::URL_ME . '&showtransaction=' . $eachtransaction['id'], $eachtransaction['id']);
- $data[] = $detailsControl;
- $data[] = $eachtransaction['date'];
- $data[] = $eachtransaction['summ'];
- $data[] = $eachtransaction['customerid'];
- $data[] = $user_realname;
- $data[] = $profileLink;
- $data[] = $eachtransaction['paysys'];
- $data[] = $stateIcon . $control;
- $json->addRow($data);
- unset($data);
- }
- }
- $json->getJson();
- }
- /**
- * Renders transaction list container
- *
- * @return void
- */
- public function renderTransactionList() {
- $opts = '"order": [[ 0, "desc" ]]';
- $columns = array('ID', 'Date', 'Cash', 'Payment ID', 'Real Name', 'Full address', 'Payment system', 'Processed');
- $graphsUrl = wf_Link(self::URL_CHARTS, wf_img('skins/icon_stats.gif', __('Graphs')), false, '') . ' ';
- $searchUrl = wf_Link(self::URL_ME . '&transactionsearch=true', web_icon_search(), false, '');
- show_window(__('OpenPayz transactions') . ' ' . $graphsUrl . $searchUrl, wf_JqDtLoader($columns, self::URL_AJAX_SOURCE, false, 'payments', 100, $opts));
- }
- /**
- * Renders transaction details
- *
- * @param int $transactionId
- *
- * @return void
- */
- public function renderTransactionDetails($transactionId) {
- $transactionId = ubRouting::filters($transactionId, 'int');
- $this->loadTransactions('', $transactionId);
- $result = '';
- $result .= wf_BackLink(self::URL_ME, '', true);
- if (isset($this->allTransactions[$transactionId])) {
- $result .= wf_tag('pre', false, 'floatpanelswide', '') . print_r($this->allTransactions[$transactionId], true) . wf_tag('pre', true);
- $result .= wf_CleanDiv();
- } else {
- $result .= $this->messages->getStyledMessage(__('Non existent transaction ID'), 'error');
- }
- show_window(__('Transaction') . ': ' . $transactionId, $result);
- }
- /**
- * Pulls payments from payment DB for further SMS notifications processing
- *
- * @throws Exception
- *
- * @return void
- */
- public function pullNotysPayments() {
- $paymentsFound = array();
- $paymentsFoundCnt = 0;
- $tabPayments = new NyanORM('payments');
- $tabNotifications = new NyanORM('op_sms_notifications');
- if ($this->smsDebugON) {
- $tabPayments->setDebug(true, true);
- $tabNotifications->setDebug(true, true);
- }
- // trying to get timestamp of the very last pulled payment
- // if nothing was pulled yet - current datetime used
- $tabNotifications->selectable('MAX(date) AS max_date');
- $pullDateTimeLast = $tabNotifications->getAll();
- if (!empty($pullDateTimeLast[0]['max_date'])) {
- $pullDateTimeLast = $pullDateTimeLast[0]['max_date'];
- } else {
- $pullDateTimeLast = curdatetime();
- }
- $pullDateTimeFrom = date('Y:m:d H:i:s', strtotime($pullDateTimeLast . '-' . $this->smsNotysPullInterval . 'min'));
- $tabPayments->where('date', '>=', $pullDateTimeFrom);
- $tabPayments->where('admin', '=', 'openpayz');
- $paymentsFound = $tabPayments->getAll('id');
- if (!empty($paymentsFound)) {
- // get the payments IDs
- $tmpPaymIDs = array_keys($paymentsFound);
- $tmpPaymIDs = implode(',', $tmpPaymIDs);
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: found payments IDs: ' . $tmpPaymIDs);
- }
- // try to select those IDs from 'op_sms_notifications'
- $tabNotifications->whereRaw(' `payment_id` IN (' . $tmpPaymIDs . ') ');
- $tabNotifications->selectable(array('payment_id'));
- $tmpNotysFound = $tabNotifications->getAll('payment_id');
- // exclude found payments IDs
- if (!empty($tmpNotysFound)) {
- $paymentsFound = array_diff_key($paymentsFound, $tmpNotysFound);
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: found payments IDs with already sent notifications: ' . print_r($tmpNotysFound, true));
- log_register('OPAYZ SMS NOTIFY: found payments IDs after exclusion of IDs with already sent notifications: ' . print_r($paymentsFound, true));
- }
- }
- if (!empty($paymentsFound)) {
- foreach ($paymentsFound as $eachID => $eachRec) {
- $tmpLogin = $eachRec['login'];
- // check logins for REMINDER_TAGID presence if $this->smsRespectReminderTagID is true
- if ($this->smsRespectReminderTagID and !empty($this->allUsersTags)) {
- // skip this payment if login doesn't have REMINDER_TAGID assigned
- if (empty($this->allUsersTags[$tmpLogin][$this->smsReminderTagID])) {
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: skipping payment with ID: ' . $eachID . ' for login: (' . $tmpLogin . ') as it doesn\'t have REMINDER_TAGID [' . $this->smsReminderTagID . '] assigned');
- }
- continue;
- }
- }
- $tmpRec = array(
- 'payment_id' => $eachID,
- 'date' => $eachRec['date'],
- 'login' => $tmpLogin,
- 'balance' => $eachRec['balance'] + $eachRec['summ'],
- 'summ' => $eachRec['summ']
- );
- $tabNotifications->dataArr($tmpRec);
- $tabNotifications->create();
- $paymentsFoundCnt++;
- }
- }
- }
- if (!empty($paymentsFoundCnt) or $this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: pulled ' . $paymentsFoundCnt . ' payment records, starting from: ' . $pullDateTimeFrom);
- }
- }
- /**
- * Handles notifications processing for collected payments
- *
- * @throws Exception
- *
- * @return void
- */
- public function processNotys() {
- $sentCount = 0;
- $tabNotifications = new NyanORM('op_sms_notifications');
- if ($this->smsDebugON) {
- $tabNotifications->setDebug(true, true);
- }
- $tabNotifications->where('processed', '=', '0');
- $notysToPush = $tabNotifications->getAll('id');
- if (!empty($notysToPush)) {
- $ubSMS = new UbillingSMS();
- $allPhones = zb_GetAllAllPhonesCache();
- $this->initFundsFlow();
- // init SMS directions cache
- if ($this->ubConfig->getAlterParam('SMS_SERVICES_ADVANCED_ENABLED')) {
- $smsDirections = new SMSDirections();
- }
- foreach ($notysToPush as $eachID => $eachRec) {
- $login = $eachRec['login'];
- $noMobilesfound = false;
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: sending message for payment: ' . print_r($eachRec, true));
- }
- if (isset($allPhones[$login])) {
- $usrMobiles = array($allPhones[$login]['mobile']);
- if ($this->smsUseExtMobiles) {
- $usrMobiles = array_merge($usrMobiles, $allPhones[$login]['mobiles']);
- }
- if (!empty($usrMobiles)) {
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: found cell numbers: ' . implode(',', $usrMobiles) . ' for user (' . $login . ')');
- }
- $msgText = $this->smsNotysText;
- $msgText = str_ireplace('{LOGIN}', $login, $msgText);
- $msgText = str_ireplace('{USERONLINELEFTDAY}', $this->getUserOnlineLeftDayCount($login), $msgText);
- $msgText = str_ireplace('{USERONLINETODATE}', $this->getUserOnlineToDate($login), $msgText);
- $msgText = str_ireplace('{ROUNDBALANCE}', round($eachRec['balance'], 2), $msgText);
- $msgText = str_ireplace('{ROUNDPAYMENTAMOUNT}', round($eachRec['summ'], 2), $msgText);
- foreach ($usrMobiles as $mobile) {
- $mobile = zb_CleanMobileNumber($mobile);
- $queueFile = $ubSMS->sendSMS($mobile, $msgText, $this->smsForceTranslit, 'OPENPAYZ');
- $ubSMS->setDirection($queueFile, 'user_login', $login);
- if ($this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: sent message for user (' . $login . ') to ' . $mobile);
- }
- }
- $tabNotifications->where('id', '=', $eachID);
- $tabNotifications->data('processed', '1');
- $tabNotifications->save();
- $sentCount++;
- } else {
- $noMobilesfound = true;
- }
- } else {
- $noMobilesfound = true;
- }
- if ($this->smsDebugON and $noMobilesfound) {
- log_register('OPAYZ SMS NOTIFY: unable to send message for user (' . $login . ') - no assigned cell phone numbers found');
- }
- }
- }
- if ($sentCount > 0 or $this->smsDebugON) {
- log_register('OPAYZ SMS NOTIFY: sent ' . $sentCount . ' messages');
- }
- }
- }
|