Example #1
0
 public function generate(&$pack, &$order, $quantity, &$serials)
 {
     if (!isset($pack->coupongen)) {
         return;
     }
     parent::pluginParams($pack->coupongen);
     if (empty($this->plugin_params->format) || !preg_match_all('#\\\\[|\\\\]|\\[[^]]+\\]\\{.*\\}|\\[.*\\]|.#iU', $this->plugin_params->format, $matches)) {
         $matches = array(array('[a-zA-Z0-9]{size}'));
     }
     $config = hikaserial::config();
     $fastRandom = (int) $config->get('use_fast_random', 0);
     for ($q = 0; $q < $quantity; $q++) {
         $serial = '';
         $serialObj = new stdClass();
         if (!HIKASHOP_J16 || $fastRandom) {
             $stat = @stat(__FILE__);
             if (empty($stat) || !is_array($stat)) {
                 $stat = array(php_uname());
             }
             mt_srand(crc32(microtime() . implode('|', $stat)));
         } else {
             if (empty($this->plugin_params->size) || $this->plugin_params->size == 0) {
                 $this->plugin_params->size = 15;
             }
             $rndCpt = 1;
             $random = JCrypt::genRandomBytes($this->plugin_params->size + 1);
             $shift = ord($random[0]);
         }
         foreach ($matches[0] as $m) {
             if (strlen($m) == 1) {
                 $serial .= $m;
             } else {
                 $repeat = 1;
                 $format = $m;
                 if (strpos($m, '{') !== false) {
                     list($format, $repeat) = explode('{', $m);
                     $repeat = trim(trim($repeat, '}'));
                     if (empty($repeat) || (int) $repeat == 0) {
                         $repeat = $this->plugin_params->size;
                     } else {
                         $repeat = (int) $repeat;
                     }
                 }
                 $format = substr($format, 1, -1);
                 $list = '';
                 $l = strlen($format);
                 for ($i = 0; $i < $l; $i++) {
                     if ($i + 2 < $l) {
                         if ($format[$i + 1] == '-') {
                             $s = $format[$i];
                             $e = $format[$i + 2];
                             $s1 = $s >= 'a' && $s <= 'z';
                             $s2 = $s >= 'A' && $s <= 'Z';
                             $s3 = $s >= '0' && $s <= '9';
                             $e1 = $e >= 'a' && $e <= 'z';
                             $e2 = $e >= 'A' && $e <= 'Z';
                             $e3 = $e >= '0' && $e <= '9';
                             if (!$s1 && !$s2 && !$s3) {
                                 $list .= $s . '-';
                                 $i++;
                                 // Skip '-'
                                 continue;
                             }
                             if ($s1 && $e1 || $s2 && $e2 || $s3 && $e3) {
                                 if ($s > $e) {
                                     $c = $s;
                                     $s = $e;
                                     $e = $c;
                                 }
                                 for ($c = $s; $c < $e; $c++) {
                                     $list .= $c;
                                 }
                                 $i += 2;
                             } else {
                                 if ($s1 && $e2) {
                                     for ($c = $s; $c < 'z'; $c++) {
                                         $list .= $c;
                                     }
                                     for ($c = 'A'; $c < $e; $c++) {
                                         $list .= $c;
                                     }
                                     $i += 2;
                                 } else {
                                     $list .= $s . '-';
                                     $i++;
                                     // Skip '-'
                                 }
                             }
                         } else {
                             $list .= $format[$i];
                         }
                     } else {
                         $list .= $format[$i];
                     }
                 }
                 $base = strlen($list);
                 if (!HIKASHOP_J16 || $fastRandom) {
                     for ($i = 1; $i <= $repeat; $i++) {
                         $serial .= $list[mt_rand(0, $base - 1)];
                     }
                 } else {
                     for ($i = 1; $i <= $repeat; $i++) {
                         $serial .= $list[($shift + ord($random[$rndCpt])) % $base];
                         $shift += ord($random[$rndCpt++]);
                         if ($rndCpt == $this->plugin_params->size) {
                             $rndCpt = 1;
                             $random = JCrypt::genRandomBytes($this->plugin_params->size + 1);
                             $shift = ord($random[0]);
                         }
                     }
                 }
             }
         }
         $discount_id = (int) $this->plugin_params->discount_id;
         $result = true;
         if (!$this->test && !empty($discount_id)) {
             $discountClass = hikaserial::get('shop.class.discount');
             $data = $discountClass->get($discount_id);
             if ($data) {
                 unset($data->discount_id);
                 $data->discount_code = $serial;
                 $data->discount_published = 1;
                 $data->discount_used_times = 0;
                 if (!empty($this->plugin_params->validity_period) && !empty($this->plugin_params->validity_value) && (int) $this->plugin_params->validity_value > 0) {
                     $date_d = date("d");
                     $date_m = date("m");
                     $date_y = date("Y");
                     $v = (int) $this->plugin_params->validity_value;
                     switch ($this->plugin_params->validity_period) {
                         case 'year':
                             $data->discount_end = mktime(0, 0, 0, $date_m, $date_d, $date_y + $v);
                             break;
                         case 'month':
                             $data->discount_end = mktime(0, 0, 0, $date_m + $v, $date_d, $date_y);
                             break;
                         case 'day':
                             $data->discount_end = mktime(0, 0, 0, $date_m, $date_d + $v, $date_y);
                             break;
                     }
                     if (!isset($serialObj->extradata)) {
                         $serialObj->extradata = array();
                     }
                     $serialObj->extradata['discount_end'] = $data->discount_end;
                 }
                 if (!empty($this->plugin_params->discount_percent)) {
                     $v = hikaserial::toFloat(trim($this->plugin_params->discount_percent));
                     $product_price = 0;
                     if (!empty($order->cart->products)) {
                         foreach ($order->cart->products as $p) {
                             if ($p->product_id == $pack->product_id || isset($pack->order_product_id) && $p->order_product_id == $pack->order_product_id) {
                                 $product_price = hikaserial::toFloat($p->order_product_price);
                                 if (!empty($this->plugin_params->discount_percent_tax)) {
                                     $product_price += hikaserial::toFloat($p->order_product_tax);
                                 }
                                 break;
                             }
                         }
                     }
                     if (!empty($product_price)) {
                         if (!empty($order->order_currency_id)) {
                             $data->discount_currency_id = (int) $order->order_currency_id;
                         } else {
                             $data->discount_currency_id = (int) $order->old->order_currency_id;
                         }
                         $data->discount_flat_amount = $product_price * $v / 100;
                         $data->discount_percent_amount = 0.0;
                     }
                 }
                 if (!$discountClass->save($data)) {
                     $result = false;
                 }
             }
         }
         if (!$result) {
             $app = JFactory::getApplication();
             $app->enqueueMessage(JText::_('ERR_CREATING_DISCOUNT_COUPON'));
         }
         if (!empty($serialObj) && !empty($serialObj->extradata)) {
             $serialObj->data = $serial;
             $serials[] = $serialObj;
         } else {
             $serials[] = $serial;
         }
     }
 }
Example #2
0
 private function generateImage($file_path, $dest_path, $data, $params)
 {
     if (!function_exists('gd_info')) {
         return false;
     }
     $gd = gd_info();
     if (!isset($gd["GD Version"])) {
         return false;
     }
     $realfilepath = HIKASERIAL_ROOT . $file_path;
     if (!JFile::exists($realfilepath)) {
         $realfilepath = null;
     }
     if (empty($realfilepath)) {
         $shopConfig = hikaserial::config(false);
         $uploadFolder = ltrim(JPath::clean(html_entity_decode($shopConfig->get('uploadfolder'))), DS);
         $realfilepath = JPATH_ROOT . DS . rtrim($uploadFolder, DS) . DS . $file_path;
         if (!JFile::exists($realfilepath)) {
             $realfilepath = null;
         }
     }
     if (empty($realfilepath)) {
         $realfilepath = $file_path;
         if (!JFile::exists($file_path)) {
             $realfilepath = null;
         }
     }
     if (empty($realfilepath)) {
         return false;
     }
     $file_path = $realfilepath;
     $currencyClass = null;
     $extension = strtolower(substr($file_path, strrpos($file_path, '.') + 1));
     $img = $this->initializeImage($file_path, $extension);
     if (!$img) {
         return false;
     }
     if (in_array($extension, array('gif', 'png'))) {
         imagesavealpha($img, true);
         imagealphablending($img, false);
     }
     $font = @$params->default_font;
     if (!empty($font) && substr($font, 0, 1) != '.' && substr($font, -4) == '.ttf') {
         $font = HIKASERIAL_MEDIA . 'ttf/' . $font;
     } else {
         $font = '';
     }
     if (empty($font) || !file_exists($font)) {
         $font = HIKASERIAL_MEDIA . 'ttf/opensans-regular.ttf';
     }
     $blackcolor = imagecolorallocatealpha($img, 0, 0, 0, 0);
     foreach ($data as $d) {
         if (!is_array($d)) {
             $d = array('text' => $d);
         }
         if (empty($d['text'])) {
             continue;
         }
         if (!empty($d['format']) && $d['format'] != 'raw') {
             $format = $d['format'];
             if (substr($format, -1) == '.') {
                 $format .= @$d['format_ex'];
             }
             list($format, $format_ex) = explode('.', $format, 2);
             switch ($format) {
                 case 'date':
                     $d['text'] = hikaserial::getDate((int) $d['text'], $format_ex);
                     break;
                 case 'price':
                     if (empty($currencyClass)) {
                         $currencyClass = hikaserial::get('shop.class.currency');
                     }
                     $d['text'] = $currencyClass->format(hikaserial::toFloat($d['text']), $params->order->order_currency_id);
                     break;
                 case 'qrcode':
                     $d['text'] = $this->generateImageQrCode($img, $d);
                     break;
                 case 'barcode':
                     $d['text'] = $this->generateImageBarCode($img, $d);
                     break;
                 case 'image':
                     $d['text'] = $this->includeImage($img, $d);
                     break;
                 default:
                     $d['text'] = null;
                     break;
             }
         }
         $localfont = $font;
         if (!empty($d['font']) && substr($d['font'], 0, 1) != '.' && substr($d['font'], -4) == '.ttf') {
             $localfont = HIKASERIAL_MEDIA . 'ttf/' . $d['font'];
             if (empty($localfont) || !file_exists($localfont)) {
                 $localfont = $font;
             }
         }
         if (!empty($d['text'])) {
             if (!empty($d['color']) && (substr($d['color'], 0, 1) == '#' && strlen(trim($d['color'])) == 7 || strlen(trim($d['color'])) == 6)) {
                 $rgb = str_split(ltrim($d['color'], '#'), 2);
                 $textcolor = imagecolorallocatealpha($img, hexdec($rgb[0]), hexdec($rgb[1]), hexdec($rgb[2]), 0);
             } else {
                 $textcolor = $blackcolor;
             }
             if (empty($d['size'])) {
                 $d['size'] = 12;
             }
             if (empty($d['x'])) {
                 $d['x'] = 0;
             }
             if (empty($d['y'])) {
                 $d['y'] = 0;
             }
             if (empty($d['w'])) {
                 $d['w'] = 0;
             }
             if (empty($d['h'])) {
                 $d['h'] = 0;
             }
             $d['y'] += $d['size'];
             imagealphablending($img, true);
             $this->displayTextBox($img, (int) $d['size'], (int) $d['x'], (int) $d['y'], (int) $d['w'], (int) $d['h'], $textcolor, $localfont, $d['text']);
             imagealphablending($img, false);
         }
     }
     if (empty($dest_path)) {
         ob_start();
         $dest_path = null;
     }
     $imgData = false;
     switch ($extension) {
         case 'gif':
             $imgData = imagegif($img, $dest_path);
             break;
         case 'jpg':
         case 'jpeg':
             $imgData = imagejpeg($img, $dest_path, 90);
             break;
         case 'png':
             $imgData = imagepng($img, $dest_path, 9);
             break;
     }
     imagedestroy($img);
     if (empty($dest_path)) {
         if ($imgData) {
             $imgData = ob_get_clean();
         } else {
             ob_end_clean();
         }
     }
     return $imgData;
 }
Example #3
0
 public function generate(&$pack, &$order, $quantity, &$serials)
 {
     if (!isset($pack->pointsgen)) {
         return;
     }
     parent::pluginParams($pack->pointsgen);
     if (empty($this->plugin_params->format) || !preg_match_all('#\\\\[|\\\\]|\\[[^]]+\\]\\{.*\\}|\\[.*\\]|.#iU', $this->plugin_params->format, $matches)) {
         $matches = array(array('[a-zA-Z0-9]{size}'));
     }
     $config = hikaserial::config();
     $fastRandom = (int) $config->get('use_fast_random', 0);
     for ($q = 0; $q < $quantity; $q++) {
         $serial = '';
         $serialObj = new stdClass();
         if (!HIKASHOP_J16 || $fastRandom) {
             $stat = @stat(__FILE__);
             if (empty($stat) || !is_array($stat)) {
                 $stat = array(php_uname());
             }
             mt_srand(crc32(microtime() . implode('|', $stat)));
         } else {
             if (empty($this->plugin_params->size) || $this->plugin_params->size == 0) {
                 $this->plugin_params->size = 15;
             }
             $rndCpt = 1;
             $random = JCrypt::genRandomBytes($this->plugin_params->size + 1);
             $shift = ord($random[0]);
         }
         foreach ($matches[0] as $m) {
             if (strlen($m) == 1) {
                 $serial .= $m;
             } else {
                 $repeat = 1;
                 $format = $m;
                 if (strpos($m, '{') !== false) {
                     list($format, $repeat) = explode('{', $m);
                     $repeat = trim(trim($repeat, '}'));
                     if (empty($repeat) || (int) $repeat == 0) {
                         $repeat = $this->plugin_params->size;
                     } else {
                         $repeat = (int) $repeat;
                     }
                 }
                 $format = substr($format, 1, -1);
                 $list = '';
                 $l = strlen($format);
                 for ($i = 0; $i < $l; $i++) {
                     if ($i + 2 < $l) {
                         if ($format[$i + 1] == '-') {
                             $s = $format[$i];
                             $e = $format[$i + 2];
                             $s1 = $s >= 'a' && $s <= 'z';
                             $s2 = $s >= 'A' && $s <= 'Z';
                             $s3 = $s >= '0' && $s <= '9';
                             $e1 = $e >= 'a' && $e <= 'z';
                             $e2 = $e >= 'A' && $e <= 'Z';
                             $e3 = $e >= '0' && $e <= '9';
                             if (!$s1 && !$s2 && !$s3) {
                                 $list .= $s . '-';
                                 $i++;
                                 // Skip '-'
                                 continue;
                             }
                             if ($s1 && $e1 || $s2 && $e2 || $s3 && $e3) {
                                 if ($s > $e) {
                                     $c = $s;
                                     $s = $e;
                                     $e = $c;
                                 }
                                 for ($c = $s; $c < $e; $c++) {
                                     $list .= $c;
                                 }
                                 $i += 2;
                             } else {
                                 if ($s1 && $e2) {
                                     for ($c = $s; $c < 'z'; $c++) {
                                         $list .= $c;
                                     }
                                     for ($c = 'A'; $c < $e; $c++) {
                                         $list .= $c;
                                     }
                                     $i += 2;
                                 } else {
                                     $list .= $s . '-';
                                     $i++;
                                     // Skip '-'
                                 }
                             }
                         } else {
                             $list .= $format[$i];
                         }
                     } else {
                         $list .= $format[$i];
                     }
                 }
                 $base = strlen($list);
                 if (!HIKASHOP_J16 || $fastRandom) {
                     for ($i = 1; $i <= $repeat; $i++) {
                         $serial .= $list[mt_rand(0, $base - 1)];
                     }
                 } else {
                     for ($i = 1; $i <= $repeat; $i++) {
                         $serial .= $list[($shift + ord($random[$rndCpt])) % $base];
                         $shift += ord($random[$rndCpt++]);
                         if ($rndCpt == $this->plugin_params->size) {
                             $rndCpt = 1;
                             $random = JCrypt::genRandomBytes($this->plugin_params->size + 1);
                             $shift = ord($random[0]);
                         }
                     }
                 }
             }
         }
         if (!$this->test) {
             if (!isset($serialObj->extradata)) {
                 $serialObj->extradata = array();
             }
             $serialObj->extradata['points_value'] = (int) $this->plugin_params->value;
             if (!empty($this->plugin_params->currency_rate)) {
                 $v = hikaserial::toFloat(trim($this->plugin_params->currency_rate));
                 $product_price = 0;
                 if (!empty($order->cart->products)) {
                     foreach ($order->cart->products as $p) {
                         if ($p->product_id == $pack->product_id || isset($pack->order_product_id) && $p->order_product_id == $pack->order_product_id) {
                             $product_price = hikaserial::toFloat($p->order_product_price);
                             if (!empty($this->plugin_params->discount_percent_tax)) {
                                 $product_price += hikaserial::toFloat($p->order_product_tax);
                             }
                             break;
                         }
                     }
                 }
                 if (!empty($product_price)) {
                     $shopConfig = hikaserial::config(false);
                     $main_currency = $shopConfig->get('main_currency', 1);
                     $currencyClass = hikaserial::get('shop.class.currency');
                     $currency = $currencyClass->get($main_currency);
                     if (isset($order->order_currency_id)) {
                         $order_currency_id = $order->order_currency_id;
                     } else {
                         $order_currency_id = hikashop_getCurrency();
                     }
                     if ($main_currency != $order_currency_id) {
                         $product_price = $currencyClass->convertUniquePrice($product_price, $main_currency, $order_currency_id);
                     }
                     $serialObj->extradata['points_value'] += (int) ($product_price / $v);
                 }
             }
             if (!empty($order->hikaserial->formData['points_value'])) {
                 $serialObj->extradata['points_value'] += (int) $order->hikaserial->formData['points_value'];
             }
         }
         if (!empty($serialObj) && !empty($serialObj->extradata)) {
             $serialObj->data = $serial;
             $serials[] = $serialObj;
         } else {
             $serials[] = $serial;
         }
     }
 }