Exemple #1
0
 public function __construct()
 {
     parent::__construct();
     $this->name = __('Database', 'Shopp');
     $this->_table = ShoppDatabaseObject::tablename($this->_table);
     $this->_metatable = ShoppDatabaseObject::tablename($this->_metatable);
 }
Exemple #2
0
 public function screen()
 {
     if (!current_user_can('shopp_promotions')) {
         wp_die(__('You do not have sufficient permissions to access this page.'));
     }
     $table = ShoppDatabaseObject::tablename(ShoppPromo::$table);
     $defaults = array('page' => false, 'status' => false, 'type' => false, 'paged' => 1, 'per_page' => 20, 's' => '');
     $args = array_merge($defaults, $_GET);
     extract($args, EXTR_SKIP);
     $url = add_query_arg(array_merge($_GET, array('page' => $this->page)), admin_url('admin.php'));
     $f = array('action', 'selected', 's');
     $url = remove_query_arg($f, $url);
     $pagenum = absint($paged);
     $start = $per_page * ($pagenum - 1);
     $where = array();
     if (!empty($s)) {
         $where[] = "name LIKE '%{$s}%'";
     }
     if ($status) {
         $datesql = ShoppPromo::activedates();
         switch (strtolower($status)) {
             case 'active':
                 $where[] = "status='enabled' AND {$datesql}";
                 break;
             case 'inactive':
                 $where[] = "status='enabled' AND NOT {$datesql}";
                 break;
             case 'enabled':
                 $where[] = "status='enabled'";
                 break;
             case 'disabled':
                 $where[] = "status='disabled'";
                 break;
         }
     }
     if ($type) {
         switch (strtolower($type)) {
             case 'catalog':
                 $where[] = "target='Catalog'";
                 break;
             case 'cart':
                 $where[] = "target='Cart'";
                 break;
             case 'cartitem':
                 $where[] = "target='Cart Item'";
                 break;
         }
     }
     $select = sDB::select(array('table' => $table, 'columns' => 'SQL_CALC_FOUND_ROWS *', 'where' => $where, 'orderby' => 'created DESC', 'limit' => "{$start},{$per_page}"));
     $Promotions = sDB::query($select, 'array');
     $count = sDB::found();
     $num_pages = ceil($count / $per_page);
     $ListTable = ShoppUI::table_set_pagination($this->id, $count, $num_pages, $per_page);
     $states = array('active' => __('Active', 'Shopp'), 'inactive' => __('Not Active', 'Shopp'), 'enabled' => __('Enabled', 'Shopp'), 'disabled' => __('Disabled', 'Shopp'));
     $types = array('catalog' => __('Catalog Discounts', 'Shopp'), 'cart' => __('Cart Discounts', 'Shopp'), 'cartitem' => __('Cart Item Discounts', 'Shopp'));
     $num_pages = ceil($count / $per_page);
     $page_links = paginate_links(array('base' => add_query_arg('pagenum', '%#%'), 'format' => '', 'total' => $num_pages, 'current' => $pagenum));
     include $this->ui('discounts.php');
 }
 /**
  * Overloads the default load to update location details after load
  *
  * @author Jonathan Davis
  * @since 1.2
  *
  * @param integer $id The ID to lookup the record by
  * @param string $key The column to use for matching the ID against
  * @return boolean True if successfully loaded, false otherwise
  **/
 public function load($id = false, $key = 'id')
 {
     if ('customer' == $key) {
         $loaded = parent::load(array('customer' => $id, 'type' => $this->type));
     } else {
         $loaded = parent::load($id, $key);
     }
     $this->locate();
     return $loaded;
 }
Exemple #4
0
 function query()
 {
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where = join(" AND ", $where);
     $id = $this->timecolumn('o.created');
     $orders_table = ShoppDatabaseObject::tablename('purchase');
     $purchased_table = ShoppDatabaseObject::tablename('purchased');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) as period,\n\t\t\t\t\t\t\tSUM( ( SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase ) ) AS items,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) as subtotal,\n\t\t\t\t\t\t\tSUM(o.discount) as discounts\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})";
     return $query;
 }
Exemple #5
0
 function query()
 {
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where[] = "o.txnstatus IN ('authed', 'captured', 'CHARGED')";
     $where = join(" AND ", $where);
     $id = $this->timecolumn('o.created');
     $orders_table = ShoppDatabaseObject::tablename('purchase');
     $purchased_table = ShoppDatabaseObject::tablename('purchased');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) AS period,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) AS subtotal,\n\t\t\t\t\t\t\tSUM(o.tax) AS tax,\n\t\t\t\t\t\t\tSUM(o.freight) AS shipping,\n\t\t\t\t\t\t\tSUM(o.discount) AS discounts,\n\t\t\t\t\t\t\tSUM(o.total) AS total,\n\t\t\t\t\t\t\tAVG(o.total) AS orderavg,\n\t\t\t\t\t\t\tSUM( (SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase) ) AS items,\n\t\t\t\t\t\t\t(SELECT AVG(p.unitprice) FROM {$purchased_table} AS p WHERE o.id = p.purchase) AS itemavg\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})";
     return $query;
 }
Exemple #6
0
 public function query()
 {
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where[] = "o.txnstatus IN ('authed', 'captured', 'CHARGED')";
     $where = join(" AND ", $where);
     $id = $this->timecolumn('o.created');
     $orders_table = ShoppDatabaseObject::tablename('purchase');
     $purchased_table = ShoppDatabaseObject::tablename('purchased');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tUNIX_TIMESTAMP(o.created) as period,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.subtotal) as subtotal,\n\t\t\t\t\t\t\tSUM(o.tax) as tax,\n\t\t\t\t\t\t\tSUM(p1.taxable) as taxable,\n\t\t\t\t\t\t\tAVG(p2.rate) as rate\n\t\t\t\t\tFROM {$orders_table} AS o\n\t\t\t\t\tLEFT JOIN (SELECT purchase, SUM(p.total) as taxable FROM {$purchased_table} AS p WHERE p.unittax > 0 GROUP BY purchase) p1 ON p1.purchase = o.id\n\t\t\t\t\tLEFT JOIN (SELECT purchase, AVG(p.unittax/p.unitprice) as rate FROM {$purchased_table} AS p WHERE p.unittax > 0 GROUP BY purchase) p2 ON p2.purchase = o.id\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id})";
     return $query;
 }
Exemple #7
0
 public function screen()
 {
     $Shopp = Shopp::object();
     if (!current_user_can('shopp_settings_checkout')) {
         wp_die(__('You do not have sufficient permissions to access this page.'));
     }
     $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
     $next = sDB::query("SELECT IF ((MAX(id)) > 0,(MAX(id)+1),1) AS id FROM {$purchasetable} LIMIT 1");
     $next_setting = shopp_setting('next_order_id');
     if ($next->id > $next_setting) {
         $next_setting = $next->id;
     }
     $term_recount = false;
     if (!empty($_POST['save'])) {
         check_admin_referer('shopp-setup-management');
         $next_order_id = $_POST['settings']['next_order_id'] = intval($_POST['settings']['next_order_id']);
         if ($next_order_id >= $next->id) {
             if (sDB::query("ALTER TABLE {$purchasetable} AUTO_INCREMENT=" . sDB::escape($next_order_id))) {
                 $next_setting = $next_order_id;
             }
         }
         $_POST['settings']['order_shipfee'] = Shopp::floatval($_POST['settings']['order_shipfee']);
         // Recount terms when this setting changes
         if (isset($_POST['settings']['inventory']) && $_POST['settings']['inventory'] != shopp_setting('inventory')) {
             $term_recount = true;
         }
         shopp_set_formsettings();
         $this->notice(Shopp::__('Management settings saved.'), 'notice', 20);
     }
     if ($term_recount) {
         $taxonomy = ProductCategory::$taxon;
         $terms = get_terms($taxonomy, array('hide_empty' => 0, 'fields' => 'ids'));
         if (!empty($terms)) {
             wp_update_term_count_now($terms, $taxonomy);
         }
     }
     $states = array(__('Map the label to an order state:', 'Shopp') => array_merge(array('' => ''), Lookup::txnstatus_labels()));
     $statusLabels = shopp_setting('order_status');
     $statesLabels = shopp_setting('order_states');
     $reasonLabels = shopp_setting('cancel_reasons');
     if (empty($reasonLabels)) {
         $reasonLabels = array(__('Not as described or expected', 'Shopp'), __('Wrong size', 'Shopp'), __('Found better prices elsewhere', 'Shopp'), __('Product is missing parts', 'Shopp'), __('Product is defective or damaaged', 'Shopp'), __('Took too long to deliver', 'Shopp'), __('Item out of stock', 'Shopp'), __('Customer request to cancel', 'Shopp'), __('Item discontinued', 'Shopp'), __('Other reason', 'Shopp'));
     }
     $promolimit = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20', '25');
     $lowstock = shopp_setting('lowstock_level');
     if (empty($lowstock)) {
         $lowstock = 0;
     }
     include $this->ui('management.php');
 }
Exemple #8
0
/**
 * shopp_orders - get a list of purchases
 *
 * @api
 * @since 1.2
 *
 * @param mixed $from (optional) mktime or SQL datetime, get purchases after this date/time.
 * @param mixed $to (optional) mktime or SQL datetime, get purchased before this date/time.
 * @param bool $items (optional default:true) load purchased items into the records, slightly slower operation
 * @param array $customers (optional) list of int customer ids to limit the purchases to.  All customers by default.
 * @param int $limit (optional default:false) maximimum number of results to get, false for no limit
 * @param string $order (optional default:DESC) DESC or ASC, for sorting in ascending or descending order.
 * @param string $orderby (optional) The column used to sort records
 * @param bool $paidonly (optional) Restrict to orders where payment has been completed
 * @param bool $downloads (optional) Restrict to orders that have downloads
 * @return array of Purchase objects
 **/
function shopp_orders($from = false, $to = false, $items = true, array $customers = array(), $limit = false, $order = 'DESC', $orderby = 'id', $paidonly = false, $downloads = false)
{
    $pt = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
    $pd = ShoppDatabaseObject::tablename(ShoppPurchased::$table);
    $op = '<';
    $where = array();
    $dateregex = '/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/';
    foreach (array($from, $to) as $datetime) {
        if (!$datetime) {
            continue;
        }
        if (1 == preg_match($dateregex, $datetime)) {
            $where[] = "'{$datetime}' {$op} p.created";
        } else {
            if (is_int($datetime)) {
                $where[] = "FROM_UNIXTIME({$datetime}) {$op} p.created";
            }
        }
        $op = '>=';
    }
    if (!empty($customers)) {
        $set = sDB::escape(implode(',', $customers));
        $where[] = "0 < FIND_IN_SET(p.customer,'" . $set . "')";
    }
    if ($paidonly) {
        $where[] = "p.txnstatus='captured'";
    }
    if ($items && $downloads) {
        $where[] = " pd.download > 0";
    }
    $where = empty($where) ? '' : 'WHERE ' . implode(' AND ', $where);
    if ((int) $limit > 0) {
        $limit = " LIMIT {$limit}";
    } else {
        $limit = '';
    }
    if (!in_array(strtolower($orderby), array('id', 'created', 'modified'))) {
        $orderby = 'id';
    }
    if ($items) {
        $query = "SELECT pd.* FROM {$pd} AS pd INNER JOIN {$pt} AS p ON pd.purchase = p.id {$where} " . $limit;
        $purchased = sDB::query($query, 'array', '_shopp_order_purchased');
        $orders = sDB::query("SELECT * FROM {$pt} WHERE FIND_IN_SET(id,'" . join(',', array_keys($purchased)) . "') ORDER BY {$orderby} " . ('DESC' == $order ? 'DESC' : 'ASC'), 'array', '_shopp_order_purchase', $purchased);
    } else {
        $query = "SELECT * FROM {$pt} AS p {$where} ORDER BY {$orderby} " . ('DESC' == $order ? 'DESC' : 'ASC') . $limit;
        $orders = sDB::query($query, 'array', '_shopp_order_purchase');
    }
    return $orders;
}
Exemple #9
0
 function query()
 {
     $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options);
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where[] = "o.txnstatus IN ('authed','captured')";
     $where = join(" AND ", $where);
     if (!in_array($order, array('asc', 'desc'))) {
         $order = 'desc';
     }
     if (!in_array($orderby, array('orders', 'sold', 'grossed'))) {
         $orderby = 'orders';
     }
     $ordercols = "{$orderby} {$order}";
     $id = "o.cardtype";
     $purchase_table = ShoppDatabaseObject::tablename('purchase');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchase_table} AS o\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}";
     return $query;
 }
Exemple #10
0
 function query()
 {
     $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options);
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where = join(" AND ", $where);
     if (!in_array($order, array('asc', 'desc'))) {
         $order = 'desc';
     }
     if (!in_array($orderby, array('orders', 'sold', 'grossed'))) {
         $orderby = 'orders';
     }
     $ordercols = "{$orderby} {$order}";
     $id = 'c.id';
     $purchase_table = ShoppDatabaseObject::tablename('purchase');
     $purchased_table = ShoppDatabaseObject::tablename('purchased');
     $customer_table = ShoppDatabaseObject::tablename('customer');
     $query = "SELECT {$id} AS id,\n\t\t\t\t\t\t\tCONCAT(c.firstname,' ',c.lastname) AS customer,\n\t\t\t\t\t\t\tSUM( (SELECT SUM(p.quantity) FROM {$purchased_table} AS p WHERE o.id = p.purchase) ) AS sold,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.id) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchase_table} as o\n\t\t\t\t\tINNER JOIN {$customer_table} AS c ON c.id=o.customer\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY {$id} ORDER BY {$ordercols}";
     return $query;
 }
Exemple #11
0
 function query()
 {
     $this->options = array_merge(array('orderby' => '(pr.stock/pr.stocked)', 'order' => 'ASC'), $this->options);
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "pr.inventory='on'";
     $where = join(" AND ", $where);
     if (!in_array(strtoupper($order), array('ASC', 'DESC'))) {
         $order = 'DESC';
     }
     if (!in_array(strtolower($orderby), array('inventory'))) {
         $orderby = '(pr.stock/pr.stocked)';
     }
     $ordercols = "{$orderby} {$order}";
     $id = "pr.product,' ',pr.id";
     $product_table = WPDatabaseObject::tablename(ShoppProduct::$table);
     $summary_table = ShoppDatabaseObject::tablename(ProductSummary::$table);
     $price_table = ShoppDatabaseObject::tablename('price');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCONCAT(p.post_title,' ',pr.label) AS product,\n\t\t\t\t\t\t\tpr.stock AS inventory,\n\t\t\t\t\t\t\tpr.stocked AS stocked,\n\t\t\t\t\t\t\t(pr.stock/pr.stocked)*100 AS level\n\t\t\t\t\tFROM {$price_table} AS pr\n\t\t\t\t\tJOIN {$product_table} AS p ON p.ID=pr.product\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}";
     return $query;
 }
Exemple #12
0
 public function query()
 {
     $this->options = array_merge(array('orderby' => 'orders', 'order' => 'desc'), $this->options);
     extract($this->options, EXTR_SKIP);
     $where = array();
     $where[] = "o.created BETWEEN '" . sDB::mkdatetime($starts) . "' AND '" . sDB::mkdatetime($ends) . "'";
     $where[] = "orders.txnstatus IN ('authed','captured')";
     $where = join(" AND ", $where);
     if (!in_array($order, array('asc', 'desc'))) {
         $order = 'desc';
     }
     if (!in_array($orderby, array('orders', 'sold', 'grossed'))) {
         $orderby = 'orders';
     }
     $ordercols = "{$orderby} {$order}";
     $id = "o.product,' ',o.price";
     $purchase_table = ShoppDatabaseObject::tablename('purchase');
     $purchased_table = ShoppDatabaseObject::tablename('purchased');
     $product_table = WPDatabaseObject::tablename(ShoppProduct::$table);
     $price_table = ShoppDatabaseObject::tablename('price');
     $query = "SELECT CONCAT({$id}) AS id,\n\t\t\t\t\t\t\tCONCAT(p.post_title,' ', IF(pr.context != 'product',pr.label,'')) AS product,\n\t\t\t\t\t\t\tpr.sku as sku,\n\t\t\t\t\t\t\tSUM(o.quantity) AS sold,\n\t\t\t\t\t\t\tCOUNT(DISTINCT o.purchase) AS orders,\n\t\t\t\t\t\t\tSUM(o.total) AS grossed\n\t\t\t\t\tFROM {$purchased_table} AS o INNER JOIN {$purchase_table} AS orders ON orders.id=o.purchase\n\t\t\t\t\tJOIN {$product_table} AS p ON p.ID=o.product\n\t\t\t\t\tJOIN {$price_table} AS pr ON pr.id=o.price\n\t\t\t\t\tWHERE {$where}\n\t\t\t\t\tGROUP BY CONCAT({$id}) ORDER BY {$ordercols}";
     return $query;
 }
Exemple #13
0
 public function query($request = array())
 {
     $defaults = array('status' => false, 's' => false, 'start' => false, 'end' => false);
     $request = array_merge($defaults, $_GET);
     extract($request);
     if (!empty($start)) {
         list($month, $day, $year) = explode('/', $start);
         $start = mktime(0, 0, 0, $month, $day, $year);
     }
     if (!empty($end)) {
         list($month, $day, $year) = explode('/', $end);
         $end = mktime(23, 59, 59, $month, $day, $year);
     }
     $where = array();
     $joins = array();
     if (!empty($status) || $status === '0') {
         $where[] = "status='" . sDB::escape($status) . "'";
     }
     if (!empty($s)) {
         $s = stripslashes($s);
         $search = array();
         if (preg_match_all('/(\\w+?)\\:(?="(.+?)"|(.+?)\\b)/', $s, $props, PREG_SET_ORDER) > 0) {
             foreach ($props as $query) {
                 $keyword = sDB::escape(!empty($query[2]) ? $query[2] : $query[3]);
                 switch (strtolower($query[1])) {
                     case "txn":
                         $search[] = "txnid='{$keyword}'";
                         break;
                     case "company":
                         $search[] = "company LIKE '%{$keyword}%'";
                         break;
                     case "gateway":
                         $search[] = "gateway LIKE '%{$keyword}%'";
                         break;
                     case "cardtype":
                         $search[] = "cardtype LIKE '%{$keyword}%'";
                         break;
                     case "address":
                         $search[] = "(address LIKE '%{$keyword}%' OR xaddress='%{$keyword}%')";
                         break;
                     case "city":
                         $search[] = "city LIKE '%{$keyword}%'";
                         break;
                     case "province":
                     case "state":
                         $search[] = "state='{$keyword}'";
                         break;
                     case "zip":
                     case "zipcode":
                     case "postcode":
                         $search[] = "postcode='{$keyword}'";
                         break;
                     case "country":
                         $search[] = "country='{$keyword}'";
                         break;
                     case "promo":
                     case "discount":
                         $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table);
                         $joins[$meta_table] = "INNER JOIN {$meta_table} AS discounts ON discounts.parent = o.id AND discounts.name='discounts' AND discounts.context='purchase'";
                         $search[] = "discounts.value LIKE '%{$keyword}%'";
                         break;
                 }
             }
             if (empty($search)) {
                 $search[] = "(o.id='{$s}' OR CONCAT(firstname,' ',lastname) LIKE '%{$s}%')";
             }
             $where[] = "(" . join(' OR ', $search) . ")";
         } elseif (strpos($s, '@') !== false) {
             $where[] = "email='" . sDB::escape($s) . "'";
         } else {
             $where[] = "(o.id='{$s}' OR CONCAT(firstname,' ',lastname) LIKE '%" . sDB::escape($s) . "%')";
         }
     }
     if (!empty($start) && !empty($end)) {
         $where[] = '(UNIX_TIMESTAMP(o.created) >= ' . $start . ' AND UNIX_TIMESTAMP(o.created) <= ' . $end . ')';
     }
     if (!empty($customer)) {
         $where[] = "customer=" . intval($customer);
     }
     $where = !empty($where) ? "WHERE " . join(' AND ', $where) : '';
     $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
     $purchasedtable = ShoppDatabaseObject::tablename(ShoppPurchased::$table);
     $offset = $this->set * $this->limit;
     $c = 0;
     $columns = array();
     $purchasedcols = false;
     $discountcols = false;
     $addoncols = false;
     foreach ($this->selected as $column) {
         $columns[] = "{$column} AS col" . $c++;
         if (false !== strpos($column, 'p.')) {
             $purchasedcols = true;
         }
         if (false !== strpos($column, 'discounts')) {
             $discountcols = true;
         }
         if (false !== strpos($column, 'addons')) {
             $addoncols = true;
         }
     }
     if ($purchasedcols) {
         $FROM = "FROM {$purchasedtable} AS p INNER JOIN {$purchasetable} AS o ON o.id=p.purchase";
     } else {
         $FROM = "FROM {$purchasetable} AS o";
     }
     if ($discountcols) {
         $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table);
         $joins[$meta_table] = "LEFT JOIN {$meta_table} AS discounts ON discounts.parent = o.id AND discounts.name='discounts' AND discounts.context='purchase'";
     }
     if ($addoncols) {
         $meta_table = ShoppDatabaseObject::tablename(ShoppMetaObject::$table);
         $joins[$meta_table . '_2'] = "LEFT JOIN {$meta_table} AS addons ON addons.parent = p.id AND addons.type='addon' AND addons.context='purchased'";
     }
     $joins = join(' ', $joins);
     $query = "SELECT " . join(",", $columns) . " {$FROM} {$joins} {$where} ORDER BY o.created ASC LIMIT {$offset},{$this->limit}";
     $this->data = sDB::query($query, 'array');
 }
Exemple #14
0
 /**
  * Adds the save_post event to Shopp custom post saves
  *
  * @author Jonathan Davis
  * @since 1.2
  *
  * @return void
  **/
 function save()
 {
     parent::save();
     do_action('save_post', $this->id, get_post($this->id));
 }
Exemple #15
0
    /**
     * Renders the bestselling products dashboard widget
     *
     * @author Jonathan Davis
     * @since 1.0
     *
     * @return void
     **/
    public static function inventory_widget($args = false)
    {
        $warnings = array('none' => __('OK', 'Shopp'), 'warning' => __('warning', 'Shopp'), 'critical' => __('critical', 'Shopp'), 'backorder' => __('backorder', 'Shopp'));
        $defaults = array('before_widget' => '', 'before_title' => '', 'widget_name' => '', 'after_title' => '', 'after_widget' => '');
        $args = array_merge($defaults, (array) $args);
        extract($args, EXTR_SKIP);
        $pt = ShoppDatabaseObject::tablename(ShoppPrice::$table);
        $setting = shopp_setting('lowstock_level');
        $where = array();
        $where[] = "pt.stock < pt.stocked AND pt.stock/pt.stocked < {$setting}";
        $where[] = "(pt.context='product' OR pt.context='variation') AND pt.type != 'N/A'";
        $loading = array('columns' => "pt.id AS stockid,IF(pt.context='variation',CONCAT(p.post_title,': ',pt.label),p.post_title) AS post_title,pt.sku AS sku,pt.stock,pt.stocked", 'joins' => array($pt => "LEFT JOIN {$pt} AS pt ON p.ID=pt.product"), 'where' => $where, 'groupby' => 'pt.id', 'orderby' => '(pt.stock/pt.stocked) ASC', 'published' => false, 'pagination' => false, 'limit' => 25);
        $Collection = new ProductCollection();
        $Collection->load($loading);
        $productscreen = add_query_arg(array('page' => ShoppAdmin::pagename('products')), admin_url('admin.php'));
        echo $before_widget;
        echo $before_title;
        echo $widget_name;
        echo $after_title;
        ?>
		<table><tbody>
		<?php 
        foreach ($Collection->products as $product) {
            $product->lowstock($product->stock, $product->stocked);
            ?>
		<tr>
			<td class="amount"><?php 
            echo abs($product->stock);
            ?>
</td>
			<td><span class="stock lowstock <?php 
            echo $product->lowstock;
            ?>
"><?php 
            echo $warnings[$product->lowstock];
            ?>
</span></td>
			<td><a href="<?php 
            echo esc_url(add_query_arg('id', $product->id, $productscreen));
            ?>
"><?php 
            echo $product->name;
            ?>
</a></td>
			<td><a href="<?php 
            echo esc_url(add_query_arg('view', 'inventory', $productscreen));
            ?>
"><?php 
            echo $product->sku;
            ?>
</a></td>
		</tr>
		<?php 
        }
        ?>
		</tbody></table>

		<?php 
        echo $after_widget;
    }
Exemple #16
0
 public function management()
 {
     $Shopp = Shopp::object();
     if (!current_user_can('shopp_settings_checkout')) {
         wp_die(__('You do not have sufficient permissions to access this page.'));
     }
     $purchasetable = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
     $next = sDB::query("SELECT IF ((MAX(id)) > 0,(MAX(id)+1),1) AS id FROM {$purchasetable} LIMIT 1");
     $next_setting = shopp_setting('next_order_id');
     if ($next->id > $next_setting) {
         $next_setting = $next->id;
     }
     if (!empty($_POST['save'])) {
         check_admin_referer('shopp-setup-management');
         $next_order_id = $_POST['settings']['next_order_id'] = intval($_POST['settings']['next_order_id']);
         if ($next_order_id >= $next->id) {
             if (sDB::query("ALTER TABLE {$purchasetable} AUTO_INCREMENT=" . sDB::escape($next_order_id))) {
                 $next_setting = $next_order_id;
             }
         }
         shopp_set_formsettings();
         $this->notice(Shopp::__('Management settings saved.'), 'notice', 20);
     }
     $states = array(__('Map the label to an order state:', 'Shopp') => array_merge(array('' => ''), Lookup::txnstatus_labels()));
     $statusLabels = shopp_setting('order_status');
     $statesLabels = shopp_setting('order_states');
     $reasonLabels = shopp_setting('cancel_reasons');
     if (empty($reasonLabels)) {
         $reasonLabels = array(__('Not as described or expected', 'Shopp'), __('Wrong size', 'Shopp'), __('Found better prices elsewhere', 'Shopp'), __('Product is missing parts', 'Shopp'), __('Product is defective or damaaged', 'Shopp'), __('Took too long to deliver', 'Shopp'), __('Item out of stock', 'Shopp'), __('Customer request to cancel', 'Shopp'), __('Item discontinued', 'Shopp'), __('Other reason', 'Shopp'));
     }
     include $this->ui('management.php');
 }
Exemple #17
0
 public function loadby_dkey($key)
 {
     $pricetable = ShoppDatabaseObject::tablename(ShoppPrice::$table);
     $Purchased = new ShoppPurchased($key, 'dkey');
     if (!empty($Purchased->id)) {
         // Handle purchased line-item downloads
         $Purchase = new ShoppPurchase($Purchased->purchase);
         $record = sDB::query("SELECT download.* FROM {$this->_table} AS download INNER JOIN {$pricetable} AS pricing ON pricing.id=download.parent WHERE pricing.id={$Purchased->price} AND download.context='price' AND download.type='download' ORDER BY modified DESC LIMIT 1");
         $this->populate($record);
         $this->expopulate();
         $this->purchased = $Purchased->id;
     } else {
         // Handle purchased line-item meta downloads (addon downloads)
         $this->load(array('context' => 'purchased', 'type' => 'download', 'name' => $key));
         $this->expopulate();
         $this->purchased = $this->parent;
     }
     $this->etag = $key;
 }
Exemple #18
0
 function __construct($parent = false, $context = 'product', $type = false, $sort = 'sortorder')
 {
     $this->_table = ShoppDatabaseObject::tablename(self::$table);
     $params = array('parent' => $parent, 'context' => $context);
     if ($type !== false) {
         $params['type'] = $type;
     }
     if ($parent !== false) {
         $this->load($params);
     }
 }
Exemple #19
0
 public function loader($workflow = false)
 {
     if (!current_user_can('shopp_products')) {
         return;
     }
     add_screen_option('per_page', array('label' => __('Products Per Page', 'Shopp'), 'default' => 20, 'option' => 'edit_' . ShoppProduct::$posttype . '_per_page'));
     $per_page_option = get_current_screen()->get_option('per_page');
     $defaults = array('cat' => false, 'paged' => 1, 'per_page' => $per_page_option['default'], 's' => '', 'sl' => '', 'matchcol' => '', 'view' => $this->view, 'is_inventory' => false, 'is_trash' => false, 'is_bestselling' => false, 'categories_menu' => false, 'inventory_menu' => false, 'lowstock' => 0, 'columns' => '', 'orderby' => '', 'order' => '', 'where' => array(), 'joins' => array());
     $args = array_merge($defaults, $_GET);
     if (false !== ($user_per_page = get_user_option($per_page_option['option']))) {
         $args['per_page'] = $user_per_page;
     }
     extract($args, EXTR_SKIP);
     $url = ShoppAdminController::url($_GET);
     $subs = array('all' => array('label' => Shopp::__('All'), 'where' => array("p.post_status!='trash'")), 'published' => array('label' => Shopp::__('Published'), 'where' => array("p.post_status='publish'")), 'drafts' => array('label' => Shopp::__('Drafts'), 'where' => array("p.post_status='draft'")), 'onsale' => array('label' => Shopp::__('On Sale'), 'where' => array("s.sale='on' AND p.post_status != 'trash'")), 'featured' => array('label' => Shopp::__('Featured'), 'where' => array("s.featured='on' AND p.post_status != 'trash'")), 'bestselling' => array('label' => Shopp::__('Bestselling'), 'where' => array("p.post_status!='trash'", BestsellerProducts::threshold() . " < s.sold"), 'order' => 'bestselling'), 'inventory' => array('label' => Shopp::__('Inventory'), 'where' => array("s.inventory='on' AND p.post_status != 'trash'")), 'trash' => array('label' => Shopp::__('Trash'), 'where' => array("p.post_status='trash'")));
     if (!shopp_setting_enabled('inventory')) {
         unset($subs['inventory']);
     }
     switch ($view) {
         case 'inventory':
             if (shopp_setting_enabled('inventory')) {
                 $is_inventory = true;
             } else {
                 Shopp::redirect(add_query_arg('view', null, $url), true);
             }
             break;
         case 'trash':
             $is_trash = true;
             break;
         case 'bestselling':
             $is_bestselling = true;
             break;
     }
     if ($is_inventory) {
         $per_page = 50;
     }
     $pagenum = absint($paged);
     $start = $per_page * ($pagenum - 1);
     $where = $subs[$this->view]['where'];
     if (!empty($s)) {
         $SearchResults = new SearchResults(array('search' => $s, 'nostock' => 'on', 'published' => 'off', 'paged' => -1));
         $SearchResults->load();
         $ids = array_keys($SearchResults->products);
         $where[] = "p.ID IN (" . join(',', $ids) . ")";
     }
     if (!empty($cat)) {
         global $wpdb;
         $joins[$wpdb->term_relationships] = "INNER JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)";
         $joins[$wpdb->term_taxonomy] = "INNER JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id=tt.term_taxonomy_id AND tt.term_id={$cat})";
         if (-1 == $cat) {
             unset($joins[$wpdb->term_taxonomy]);
             $joins[$wpdb->term_relationships] = "LEFT JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)";
             $where[] = 'tr.object_id IS NULL';
         }
     }
     // Detect custom taxonomies
     $taxonomies = array_intersect(get_object_taxonomies(ShoppProduct::$posttype), array_keys($_GET));
     if (!empty($taxonomies)) {
         foreach ($taxonomies as $n => $taxonomy) {
             global $wpdb;
             $term = get_term_by('slug', $_GET[$taxonomy], $taxonomy);
             if (!empty($term->term_id)) {
                 $joins[$wpdb->term_relationships . '_' . $n] = "INNER JOIN {$wpdb->term_relationships} AS tr{$n} ON (p.ID=tr{$n}.object_id)";
                 $joins[$wpdb->term_taxonomy . '_' . $n] = "INNER JOIN {$wpdb->term_taxonomy} AS tt{$n} ON (tr{$n}.term_taxonomy_id=tt{$n}.term_taxonomy_id AND tt{$n}.term_id={$term->term_id})";
             }
         }
     }
     if (!empty($sl) && shopp_setting_enabled('inventory')) {
         switch ($sl) {
             case "ns":
                 foreach ($where as &$w) {
                     $w = str_replace("s.inventory='on'", "s.inventory='off'", $w);
                 }
                 $where[] = "s.inventory='off'";
                 break;
             case "oos":
                 $where[] = "(s.inventory='on' AND s.stock = 0)";
                 break;
             case "ls":
                 $ls = shopp_setting('lowstock_level');
                 if (empty($ls)) {
                     $ls = '0';
                 }
                 $where[] = "(s.inventory='on' AND s.lowstock != 'none')";
                 break;
             case "is":
                 $where[] = "(s.inventory='on' AND s.stock > 0)";
         }
     }
     $lowstock = shopp_setting('lowstock_level');
     // Setup queries
     $pd = WPDatabaseObject::tablename(ShoppProduct::$table);
     $pt = ShoppDatabaseObject::tablename(ShoppPrice::$table);
     $ps = ShoppDatabaseObject::tablename(ProductSummary::$table);
     $orderdirs = array('asc', 'desc');
     if (in_array($order, $orderdirs)) {
         $orderd = strtolower($order);
     } else {
         $orderd = 'asc';
     }
     if (isset($subs[$this->view]['order'])) {
         $order = $subs[$this->view]['order'];
     }
     $ordercols = '';
     switch ($orderby) {
         case 'name':
             $order = 'title';
             if ('desc' == $orderd) {
                 $order = 'reverse';
             }
             break;
         case 'price':
             $order = 'lowprice';
             if ('desc' == $orderd) {
                 $order = 'highprice';
             }
             break;
         case 'date':
             $order = 'newest';
             if ('desc' == $orderd) {
                 $order = 'oldest';
             }
             break;
         case 'sold':
             $ordercols = 's.sold ' . $orderd;
             break;
         case 'gross':
             $ordercols = 's.grossed ' . $orderd;
             break;
         case 'inventory':
             $ordercols = 's.stock ' . $orderd;
             break;
         case 'sku':
             $ordercols = 'pt.sku ' . $orderd;
             break;
     }
     if (in_array($this->view, array('onsale', 'featured', 'inventory'))) {
         $joins[$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product";
     }
     $loading = array('where' => $where, 'joins' => $joins, 'limit' => "{$start},{$per_page}", 'load' => array('categories', 'coverimages'), 'published' => false, 'order' => $order, 'nostock' => true);
     if (!empty($ordercols)) {
         unset($loading['order']);
         $loading['orderby'] = $ordercols;
     }
     if ($is_inventory) {
         // Override for inventory products
         $where[] = "(pt.context='product' OR pt.context='variation') AND pt.type != 'N/A'";
         $loading = array('columns' => "pt.id AS stockid,IF(pt.context='variation',CONCAT(p.post_title,': ',pt.label),p.post_title) AS post_title,pt.sku AS sku,pt.stock AS stock", 'joins' => array_merge(array($pt => "LEFT JOIN {$pt} AS pt ON p.ID=pt.product"), $joins), 'where' => $where, 'groupby' => 'pt.id', 'orderby' => str_replace('s.', 'pt.', $ordercols), 'limit' => "{$start},{$per_page}", 'nostock' => true, 'published' => false);
     }
     // Override loading product meta and limiting by pagination in the workflow list
     if ($workflow) {
         unset($loading['limit']);
         $loading['ids'] = true;
         $loading['pagination'] = false;
         $loading['load'] = array();
     }
     $this->products = new ProductCollection();
     $this->products->load($loading);
     // Overpagination protection, redirect to page 1 if the requested page doesn't exist
     $num_pages = ceil($this->products->total / $per_page);
     if ($paged > 1 && $paged > $num_pages) {
         Shopp::redirect(add_query_arg('paged', null, $url));
     }
     // Return a list of product keys for workflow list requests
     if ($workflow) {
         return $this->products->worklist();
     }
     // Get sub-screen counts
     $subcounts = Shopp::cache_get('shopp_product_subcounts', 'shopp_admin');
     if ($subcounts) {
         foreach ($subcounts as $name => $total) {
             if (isset($subs[$name])) {
                 $subs[$name]['total'] = $total;
             }
         }
     } else {
         $subcounts = array();
         foreach ($subs as $name => &$subquery) {
             $subquery['total'] = 0;
             $query = array('columns' => "count(*) AS total", 'table' => "{$pd} as p", 'joins' => array(), 'where' => array());
             $query = array_merge($query, $subquery);
             $query['where'][] = "p.post_type='shopp_product'";
             if (in_array($name, array('onsale', 'bestselling', 'featured', 'inventory'))) {
                 $query['joins'][$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product";
             }
             $query = sDB::select($query);
             $subquery['total'] = sDB::query($query, 'auto', 'col', 'total');
             $subcounts[$name] = $subquery['total'];
         }
         Shopp::cache_set('shopp_product_subcounts', $subcounts, 'shopp_admin');
     }
     $this->subs = $subs;
 }
Exemple #20
0
/**
 * Destroy the entire product search index
 *
 * @api
 * @since 1.3
 *
 * @return void
 **/
function shopp_empty_search_index()
{
    $index_table = ShoppDatabaseObject::tablename(ContentIndex::$table);
    if (sDB::query("DELETE FROM {$index_table}")) {
        return true;
    }
    return false;
}
Exemple #21
0
 public function storage()
 {
     $Shopp = Shopp::object();
     $Storage = $Shopp->Storage;
     $Storage->settings();
     // Load all installed storage engines for settings UIs
     if (!empty($_POST['save'])) {
         check_admin_referer('shopp-system-storage');
         shopp_set_formsettings();
         // Re-initialize Storage Engines with new settings
         $Storage->settings();
         $this->notice(Shopp::__('Shopp system settings saved.'));
     } elseif (!empty($_POST['rebuild'])) {
         $assets = ShoppDatabaseObject::tablename(ProductImage::$table);
         $query = "DELETE FROM {$assets} WHERE context='image' AND type='image'";
         if (sDB::query($query)) {
             $updated = __('All cached images have been cleared.', 'Shopp');
         }
     }
     // Build the storage options menu
     $storage = $engines = $storageset = array();
     foreach ($Storage->active as $module) {
         $storage[$module->module] = $module->name;
         $engines[$module->module] = sanitize_title_with_dashes($module->module);
         $storageset[$module->module] = $Storage->get($module->module)->settings;
     }
     $Storage->ui();
     // Setup setting UIs
     $ImageStorage = false;
     $DownloadStorage = false;
     if (isset($_POST['image-settings'])) {
         $ImageStorage = $Storage->get(shopp_setting('image_storage'));
     }
     if (isset($_POST['download-settings'])) {
         $DownloadStorage = $Storage->get(shopp_setting('product_storage'));
     }
     add_action('shopp_storage_engine_settings', array($Storage, 'templates'));
     include $this->ui('storage.php');
 }
Exemple #22
0
 /**
  * Interface processor for the customer list screen
  *
  * Handles processing customer list actions and displaying the
  * customer list screen
  *
  * @author Jonathan Davis
  * @return void
  **/
 function memeberships()
 {
     $Shopp = Shopp::object();
     $defaults = array('page' => false, 'deleting' => false, 'delete' => false, 'pagenum' => 1, 'per_page' => 20, 's' => '');
     $args = array_merge($defaults, $_GET);
     extract($args, EXTR_SKIP);
     if ($page == $this->Admin->pagename('memberships') && !empty($deleting) && !empty($delete) && is_array($delete)) {
         foreach ($delete as $deletion) {
             $MemberPlan = new MemberPlan($deletion);
             $MemberPlan->delete();
         }
     }
     if (!empty($_POST['save'])) {
         check_admin_referer('shopp-save-membership');
         if ($_POST['id'] != "new") {
             $MemberPlan = new MemberPlan($_POST['id']);
         } else {
             $MemberPlan = new MemberPlan();
         }
         $MemberPlan->updates($_POST);
         $MemberPlan->save();
         $MemberPlan->load_stages();
         $stages = array_keys($MemberPlan->stages);
         // Process updates
         foreach ($_POST['stages'] as $i => $stage) {
             if (empty($stage['id'])) {
                 $Stage = new MemberStage($MemberPlan->id);
                 $stage['parent'] = $MemberPlan->id;
             } else {
                 $Stage = new MemberStage($MemberPlan->id, $stage['id']);
             }
             $Stage->updates($stage);
             $Stage->sortorder = $i;
             $Stage->save();
             $Stage->content = array();
             $stage_updates[] = $Stage->id;
             // If the stage data did not save, go to the next stage record
             if (empty($Stage->id)) {
                 continue;
             }
             foreach ($stage['rules'] as $type => $rules) {
                 foreach ($rules as $rule) {
                     $AccessRule = new MemberAccess($Stage->id, $type, $rule['access']);
                     if (empty($AccessRule->id)) {
                         $AccessRule->save();
                     }
                     // If access rule applies to all content, skip content cataloging
                     if (strpos($AccessRule->value, '-all') !== false) {
                         continue;
                     }
                     // Catalog content access rules for this access taxonomy
                     foreach ($rule['content'] as $id => $name) {
                         $CatalogEntry = new MemberContent($id, $AccessRule->id, $Stage->id);
                         if (empty($CatalogEntry->id)) {
                             $CatalogEntry->save();
                         }
                         $Stage->content[$AccessRule->id][$id] = $name;
                     }
                     // endforeach $rule['content']
                 }
                 // endforeach $rules
             }
             // endforeach $stage['rules']
             $Stage->save();
             // Secondary save for specific content rules
         }
         // endforeach $_POST['stages']
     }
     $stageids = array_diff($stages, $stage_updates);
     if (!empty($stageids)) {
         $stagelist = join(',', $stageids);
         // Delete Catalog entries
         $ContentRemoval = new MemberContent();
         sDB::query("DELETE FROM {$ContentRemoval->_table} WHERE 0 < FIND_IN_SET(parent,'{$stagelist}')");
         // Delete Access taxonomies
         $AccessRemoval = new MemberAccess();
         sDB::query("DELETE FROM {$AccessRemoval->_table} WHERE 0 < FIND_IN_SET(parent,'{$stagelist}')");
         // Remove old stages
         $StageRemoval = new MemberStage();
         sDB::query("DELETE FROM {$StageRemoval->_table} WHERE 0 < FIND_IN_SET(id,'{$stagelist}')");
     }
     $pagenum = absint($pagenum);
     if (empty($pagenum)) {
         $pagenum = 1;
     }
     if (!$per_page || $per_page < 0) {
         $per_page = 20;
     }
     $index = $per_page * ($pagenum - 1);
     if (!empty($start)) {
         $startdate = $start;
         list($month, $day, $year) = explode("/", $startdate);
         $starts = mktime(0, 0, 0, $month, $day, $year);
     }
     if (!empty($end)) {
         $enddate = $end;
         list($month, $day, $year) = explode("/", $enddate);
         $ends = mktime(23, 59, 59, $month, $day, $year);
     }
     $membership_table = ShoppDatabaseObject::tablename(MemberPlan::$table);
     $MemberPlan = new MemberPlan();
     $where = '';
     // if (!empty($s)) {
     // 	$s = stripslashes($s);
     // 	if (preg_match_all('/(\w+?)\:(?="(.+?)"|(.+?)\b)/',$s,$props,PREG_SET_ORDER)) {
     // 		foreach ($props as $search) {
     // 			$keyword = !empty($search[2])?$search[2]:$search[3];
     // 			switch(strtolower($search[1])) {
     // 				case "company": $where .= ((empty($where))?"WHERE ":" AND ")."c.company LIKE '%$keyword%'"; break;
     // 				case "login": $where .= ((empty($where))?"WHERE ":" AND ")."u.user_login LIKE '%$keyword%'"; break;
     // 				case "address": $where .= ((empty($where))?"WHERE ":" AND ")."(b.address LIKE '%$keyword%' OR b.xaddress='%$keyword%')"; break;
     // 				case "city": $where .= ((empty($where))?"WHERE ":" AND ")."b.city LIKE '%$keyword%'"; break;
     // 				case "province":
     // 				case "state": $where .= ((empty($where))?"WHERE ":" AND ")."b.state='$keyword'"; break;
     // 				case "zip":
     // 				case "zipcode":
     // 				case "postcode": $where .= ((empty($where))?"WHERE ":" AND ")."b.postcode='$keyword'"; break;
     // 				case "country": $where .= ((empty($where))?"WHERE ":" AND ")."b.country='$keyword'"; break;
     // 			}
     // 		}
     // 	} elseif (strpos($s,'@') !== false) {
     // 		 $where .= ((empty($where))?"WHERE ":" AND ")."c.email='$s'";
     // 	} else $where .= ((empty($where))?"WHERE ":" AND ")." (c.id='$s' OR CONCAT(c.firstname,' ',c.lastname) LIKE '%$s%' OR c.company LIKE '%$s%')";
     //
     // }
     // if (!empty($starts) && !empty($ends)) $where .= ((empty($where))?"WHERE ":" AND ").' (UNIX_TIMESTAMP(c.created) >= '.$starts.' AND UNIX_TIMESTAMP(c.created) <= '.$ends.')';
     $count = sDB::query("SELECT count(*) as total FROM {$MemberPlan->_table} AS c {$where}");
     $query = "SELECT *\n\t\t\t\t\tFROM {$MemberPlan->_table}\n\t\t\t\t\tWHERE parent='{$MemberPlan->parent}'\n\t\t\t\t\t\tAND context='{$MemberPlan->context}'\n\t\t\t\t\t\tAND type='{$MemberPlan->type}'\n\t\t\t\t\tLIMIT {$index},{$per_page}";
     $MemberPlans = sDB::query($query, 'array');
     $num_pages = ceil($count->total / $per_page);
     $page_links = paginate_links(array('base' => add_query_arg('pagenum', '%#%'), 'format' => '', 'total' => $num_pages, 'current' => $pagenum));
     $authentication = shopp_setting('account_system');
     include SHOPP_ADMIN_PATH . "/memberships/memberships.php";
 }
 public function query($request = array())
 {
     if (empty($request)) {
         $request = $_GET;
     }
     if (!empty($request['start'])) {
         list($month, $day, $year) = explode("/", $request['start']);
         $starts = mktime(0, 0, 0, $month, $day, $year);
     }
     if (!empty($request['end'])) {
         list($month, $day, $year) = explode("/", $request['end']);
         $ends = mktime(0, 0, 0, $month, $day, $year);
     }
     $where = "WHERE c.id IS NOT NULL ";
     if (isset($request['s']) && !empty($request['s'])) {
         $where .= " AND (id='{$request['s']}' OR firstname LIKE '%{$request['s']}%' OR lastname LIKE '%{$request['s']}%' OR CONCAT(firstname,' ',lastname) LIKE '%{$request['s']}%' OR transactionid LIKE '%{$request['s']}%')";
     }
     if (!empty($request['start']) && !empty($request['end'])) {
         $where .= " AND  (UNIX_TIMESTAMP(c.created) >= {$starts} AND UNIX_TIMESTAMP(c.created) <= {$ends})";
     }
     $customer_table = ShoppDatabaseObject::tablename(Customer::$table);
     $billing_table = ShoppDatabaseObject::tablename(BillingAddress::$table);
     $shipping_table = ShoppDatabaseObject::tablename(ShippingAddress::$table);
     $offset = $this->set * $this->limit;
     $c = 0;
     $columns = array();
     foreach ($this->selected as $column) {
         $columns[] = "{$column} AS col" . $c++;
     }
     $query = "SELECT " . join(",", $columns) . " FROM {$customer_table} AS c LEFT JOIN {$billing_table} AS b ON c.id=b.customer LEFT JOIN {$shipping_table} AS s ON c.id=s.customer {$where} GROUP BY c.id ORDER BY c.created ASC LIMIT {$offset},{$this->limit}";
     $this->data = sDB::query($query, 'array');
 }
Exemple #24
0
 /**
  * Provides markup for a unordered list widget of recent shoppers
  *
  * @api `shopp('storefront.recent-shoppers')`
  * @since 1.1
  *
  * @param string          $result  The output
  * @param array           $options The options
  * - **abbr**: `firstname` (firstname,lastname) Choose which name to abbreviate to maintain customer privacy
  * - **city**: `on` (on,off) Include the customer's city name
  * - **state**: `on` (on,off) Include the customer's state abbreviation
  * - **avatar**: `on` (on,off) Include the customer's avatar
  * - **size**: `48` Set the size of the customer avatar shown
  * - **show**: `5` Set the limit of the number of recent shoppers to show
  * @param ShoppStorefront $O       The working object
  * @return string The markup for the widget
  **/
 public static function recent_shoppers($result, $options, $O)
 {
     $defaults = array('abbr' => 'firstname', 'city' => true, 'state' => true, 'avatar' => true, 'size' => 48, 'show' => 5);
     $options = array_merge($defaults, $options);
     extract($options);
     $pt = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
     $shoppers = sDB::query("SELECT firstname,lastname,email,city,state FROM {$pt} AS pt GROUP BY customer ORDER BY created DESC LIMIT {$show}", 'array');
     if (empty($shoppers)) {
         return '';
     }
     $_ = array();
     $_[] = '<ul>';
     foreach ($shoppers as $shopper) {
         if ('' == $shopper->firstname . $shopper->lastname) {
             continue;
         }
         if ('lastname' == $abbr) {
             $name = "{$shopper->firstname} " . $shopper->lastname[0] . ".";
         } else {
             $name = $shopper->firstname[0] . ". {$shopper->lastname}";
         }
         $img = '';
         if ($avatar) {
             $img = get_avatar($shopper->email, $size, '', $name);
         }
         $loc = '';
         if ($state || $province) {
             $loc = $shopper->state;
         }
         if ($city) {
             $loc = "{$shopper->city}, {$loc}";
         }
         $_[] = "<li><div>{$img}</div>{$name} <em>{$loc}</em></li>";
     }
     $_[] = '</ul>';
     return join('', $_);
 }
Exemple #25
0
 /**
  * Retrieves the number of orders in each customized order status label
  *
  * @author Jonathan Davis
  * @return void
  **/
 public function status_counts()
 {
     $table = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
     $labels = shopp_setting('order_status');
     if (empty($labels)) {
         return false;
     }
     $status = array();
     $alltotal = sDB::query("SELECT count(*) AS total FROM {$table}", 'auto', 'col', 'total');
     $r = sDB::query("SELECT status,COUNT(status) AS total FROM {$table} GROUP BY status ORDER BY status ASC", 'array', 'index', 'status');
     $all = array('' => __('All Orders', 'Shopp'));
     $labels = $all + $labels;
     foreach ($labels as $id => $label) {
         $_ = new StdClass();
         $_->label = $label;
         $_->id = $id;
         $_->total = 0;
         if (isset($r[$id])) {
             $_->total = (int) $r[$id]->total;
         }
         if ('' === $id) {
             $_->total = $alltotal;
         }
         $status[$id] = $_;
     }
     return $status;
 }
Exemple #26
0
 public function smart(array $options = array())
 {
     $id = urldecode($options['id']);
     $Promo = new ShoppPromo($id);
     $this->name = $Promo->name;
     $this->slug = $this->uri = sanitize_title_with_dashes($this->name);
     $pricetable = ShoppDatabaseObject::tablename(ShoppPrice::$table);
     $this->loading['where'] = array("p.id IN (SELECT product FROM {$pricetable} WHERE 0 < FIND_IN_SET({$Promo->id},discounts))");
 }
Exemple #27
0
 function populate($data)
 {
     // Populate normally
     parent::populate($data);
     // Remap values data to real properties
     $values = $this->value;
     foreach ($values as $property => $data) {
         $this->{$property} = stripslashes_deep($data);
     }
     unset($this->value);
 }
Exemple #28
0
 /**
  * Marks an individual product for summary recalculation
  *
  * Recalculating t
  *
  * @author Jonathan Davis
  * @since 1.3
  *
  * @param integer $id The product ID to update
  * @return boolean True if successful, false otherwise
  **/
 public static function rebuild($id)
 {
     $id = intval($id);
     $table = ShoppDatabaseObject::tablename(ProductSummary::$table);
     return sDB::query("UPDATE {$table} SET modified='" . self::RECALCULATE . "' WHERE product={$id} LIMIT 1");
 }
Exemple #29
0
 /**
  * Interface processor for the customer editor
  *
  * Handles rendering the interface, processing updated customer details
  * and handing saving them back to the database
  *
  * @author Jonathan Davis
  * @return void
  **/
 public function screen()
 {
     if (!current_user_can('shopp_customers')) {
         wp_die(__('You do not have sufficient permissions to access this page.'));
     }
     $Customer = $this->load();
     if ($Customer->exists()) {
         $purchase_table = ShoppDatabaseObject::tablename(ShoppPurchase::$table);
         $r = sDB::query("SELECT count(id) AS purchases,SUM(total) AS total FROM {$purchase_table} WHERE customer='{$Customer->id}' LIMIT 1");
         $Customer->orders = $r->purchases;
         $Customer->total = $r->total;
     }
     $regions = ShoppLookup::country_zones();
     include $this->ui('editor.php');
 }
Exemple #30
0
 /**
  * Determines the minimum stock level of the item and its addons
  *
  * @author Jonathan Davis
  * @since 1.1
  *
  * @return int The amount of stock available
  **/
 public function getstock()
 {
     $stock = apply_filters('shopp_cartitem_stock', false, $this);
     if ($stock !== false) {
         return $stock;
     }
     $table = ShoppDatabaseObject::tablename(ShoppPrice::$table);
     $ids = array($this->priceline);
     if (!empty($this->addons)) {
         foreach ($this->addons as $addon) {
             if (Shopp::str_true($addon->inventory)) {
                 $ids[] = $addon->id;
             }
         }
     }
     $result = db::query("SELECT min(stock) AS stock FROM {$table} WHERE 0 < FIND_IN_SET(id,'" . join(',', $ids) . "')");
     if (isset($result->stock)) {
         return $result->stock;
     }
     return $this->option->stock;
 }