/** * Get an activation record by its location. * * @api * * @since 1.0 * * @param string $location * @param \ITELIC\Key $key * * @return \ITELIC\Activation|null */ function itelic_get_activation_by_location($location, \ITELIC\Key $key) { $activations = itelic_get_activations(array('location' => $key->is_online_product() ? itelic_normalize_url($location) : $location, 'key' => $key->get_key(), 'items_per_page' => 1)); if (empty($activations)) { return null; } return reset($activations); }
/** * Create an activation. * * @param Key $key * @param string $location * @param \DateTime $activation * @param Release $release * @param string $status * * @return Activation * * @throws \LogicException|DB_Exception */ public static function create(Key $key, $location, \DateTime $activation = null, Release $release = null, $status = '') { if (empty($key) || empty($location)) { throw new \InvalidArgumentException(__("The license key and install location are required.", Plugin::SLUG)); } if (strlen($location) > 191) { throw new \LengthException("The location field has a max length of 191 characters."); } if ($key->get_max() && $key->get_active_count() >= $key->get_max()) { throw new \OverflowException(__("This license key has reached it's maximum number of activations.", Plugin::SLUG)); } if ($activation === null) { $activation = make_date_time()->format('Y-m-d H:i:s'); } else { $activation = $activation->format('Y-m-d H:i:s'); } if (empty($status)) { $status = self::ACTIVE; } if ($key->is_online_product()) { $location = itelic_normalize_url($location); } $data = array('lkey' => $key->get_key(), 'location' => $location, 'activation' => $activation, 'deactivation' => null, 'status' => $status); if ($release) { $data['release_id'] = $release->get_pk(); } $db = Manager::make_simple_query_object('itelic-activations'); $existing_activation = itelic_get_activation_by_location($location, $key); if ($existing_activation) { throw new \InvalidArgumentException(__("An activation with this same location already exists.", Plugin::SLUG)); } $id = $db->insert($data); if (!$id) { return null; } $activation = self::get($id); Cache::add($activation); if (!$release) { $latest = $key->get_product()->get_latest_release_for_activation($activation); if ($latest) { $activation->set_release($latest); } } /** * Fires when an activation record is created. * * @since 1.0 * * @param Activation $activation */ do_action('itelic_create_activation', $activation); return $activation; }
/** * Render the view. */ public function render() { if (!$this->key) { return; } wp_enqueue_style('itelic-admin-license-detail'); wp_enqueue_script('itelic-admin-license-detail'); wp_localize_script('itelic-admin-license-detail', 'ITELIC', array('ajax' => admin_url('admin-ajax.php'), 'key' => $this->key->get_key(), 'disabling' => __("Deactivating", Plugin::SLUG), 'df' => it_exchange_php_date_format_to_jquery_datepicker_format($this->get_short_df()), 'update_nonce' => wp_create_nonce('itelic-update-key-' . $this->key->get_key()), 'statuses' => json_encode(Key::get_statuses()))); $jdf = it_exchange_php_date_format_to_jquery_datepicker_format($this->get_short_df()); $online = $this->key->is_online_product(); $disable_activate = $this->key->get_status() != Key::ACTIVE; $disable_tip = __("Disabled or expired licenses cannot be activated.", Plugin::SLUG); $disable_title = $disable_activate ? "title=\"{$disable_tip}\"" : ''; $disable_class = $disable_activate ? 'button-disabled' : ''; $disabled_input = $disable_activate ? ' disabled' : ''; ?> <div id="it-exchange-license-details"> <div class="spacing-wrapper bottom-border header-block"> <div class="status status-<?php echo esc_attr($this->key->get_status()); ?> "> <span data-value="<?php echo esc_attr($this->key->get_status()); ?> " title="<?php esc_attr_e("Click to edit", Plugin::SLUG); ?> "> <?php echo $this->key->get_status(true); ?> </span> </div> <div class="name-block"> <h2 class="customer-name"><?php echo $this->key->get_customer()->wp_user->display_name; ?> </h2> <h2 class="product-name"><?php echo $this->key->get_product()->post_title; ?> </h2> </div> <div class="key-block"> <p> <label for="license-key" class="screen-reader-text"><?php _e("License Key", Plugin::SLUG); ?> </label> <input type="text" id="license-key" size="<?php echo strlen($this->key->get_key()); ?> " readonly value="<?php echo esc_attr($this->key->get_key()); ?> "> </p> </div> </div> <div class="spacing-wrapper bottom-border third-row misc-block"> <div class="third expires"> <h4><?php _e("Expires", Plugin::SLUG); ?> </h4> <h3 title="<?php esc_attr_e("Click to edit", Plugin::SLUG); ?> " data-df="<?php echo $jdf; ?> "> <?php if (null === ($d = $this->key->get_expires())) { ?> <?php _e("Never", Plugin::SLUG); ?> <?php } else { ?> <?php echo \ITELIC\convert_gmt_to_local($d)->format($this->get_short_df()); ?> <?php } ?> </h3> </div> <div class="third transaction"> <h4><?php _e("Transaction", Plugin::SLUG); ?> </h4> <h3> <a href="<?php echo esc_url(get_edit_post_link($this->key->get_transaction()->ID)); ?> "> <?php echo it_exchange_get_transaction_order_number($this->key->get_transaction()); ?> </a> </h3> </div> <div class="third max-activations"> <h4><?php _e("Max Activations", Plugin::SLUG); ?> </h4> <h3 title="<?php esc_attr_e("Click to edit", Plugin::SLUG); ?> "> <?php echo $this->key->get_max() ? $this->key->get_max() : __('Unlimited', Plugin::SLUG); ?> </h3> </div> </div> <div class="spacing-wrapper activations<?php echo count($this->renewals) ? ' bottom-border' : ''; ?> "> <h3><?php _e("Activations", Plugin::SLUG); ?> </h3> <table id="activations-table" class="widefat"> <thead> <tr> <th class="location-col"><?php _e("Location", Plugin::SLUG); ?> </th> <th class="status-col"><?php _e("Status", Plugin::SLUG); ?> </th> <th class="activation-col"><?php _e("Activation", Plugin::SLUG); ?> </th> <th class="deactivation-col"><?php _e("Deactivation", Plugin::SLUG); ?> </th> <th class="version-col"><?php _e("Version", Plugin::SLUG); ?> </th> <th class="delete-col"> <span class="screen-reader-text"><?php _e("Delete", Plugin::SLUG); ?> </span></th> </tr> </thead> <tbody> <?php foreach ($this->key->get_activations() as $activation) { ?> <?php echo $this->get_activation_row_html($activation); ?> <?php } ?> </tbody> </table> <h4><?php _e("Remote Activate", Plugin::SLUG); ?> </h4> <label for="remote-activate-location" class="screen-reader-text"><?php _e("Install Location", Plugin::SLUG); ?> </label> <input type="<?php echo $online ? 'url' : 'text'; ?> " id="remote-activate-location" placeholder="<?php _e("Install Location", Plugin::SLUG); ?> "<?php echo $disabled_input; ?> > <input type="submit" id="remote-activate-submit" class="it-exchange-button <?php echo $disable_class; ?> " value="<?php esc_attr_e("Activate", Plugin::SLUG); ?> " data-tip="<?php echo $disable_tip; ?> "<?php echo $disable_title; ?> > <input type="hidden" id="remote-activate-key" value="<?php echo esc_attr($this->key->get_key()); ?> "> <?php wp_nonce_field('itelic-remote-activate-key-' . $this->key->get_key()); ?> </div> <?php if (count($this->renewals)) { ?> <div class="spacing-wrapper renewals"> <h3><?php _e("Renewal History", Plugin::SLUG); ?> </h3> <ul> <?php foreach ($this->renewals as $renewal) { ?> <li> <?php echo $renewal->get_renewal_date()->format(get_option('date_format')); ?> — <?php if ($renewal->get_transaction()) { ?> <a href="<?php echo get_edit_post_link($renewal->get_transaction()->ID); ?> "> <?php echo it_exchange_get_transaction_order_number($renewal->get_transaction()); ?> </a> <?php } else { ?> <?php _e("Manual Renewal", Plugin::SLUG); ?> <?php } ?> </li> <?php } ?> </ul> </div> <?php } ?> <?php /** * Fires at the end of the single license screen. * * @since 1.0 * * @param Key $key */ do_action('itelic_single_license_screen_end', $this->key); ?> </div> <?php /** * Fires after the main single license screen. * * @since 1.0 * * @param Key $key */ do_action('itelic_single_license_screen_after', $this->key); }