license = new amzFulfillment_Feature(); $this->options = new amzFulfillment_Options(); $this->rules = new AmzFulfillment_Rules(); if(!isset($_REQUEST['tab']) || empty($_REQUEST['tab'])) { $this->tab = $this->tabs[0]; } else { $this->tab = $_REQUEST['tab']; } $this->loadResources(); $this->options->load(); $this->rules->load(); $this->checkActions(); $this->options->load(); $this->rules->load(); AmzFulfillment_Core::instance()->showAdminMessages(); $this->addTabs(); } /** * loadResources * * Add js and css files to wordpress */ private function loadResources() { wp_register_script('jquery-1.12.4.js', "https://code.jquery.com/jquery-1.12.4.min.js"); wp_enqueue_script('jquery-1.12.4.js'); wp_register_script('jquery-ui.js', "https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"); wp_enqueue_script('jquery-ui.js'); wp_register_style('jquery-ui.css', "https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"); wp_enqueue_style('jquery-ui.css'); wp_enqueue_style('datatables.min.css', 'https://cdn.datatables.net/v/dt/dt-1.10.15/datatables.min.css'); wp_enqueue_script('datatables.min.js', 'https://cdn.datatables.net/v/dt/dt-1.10.15/datatables.min.js'); wp_register_style('amzFulfillment.css', $this->getResource('css/amzFulfillment.css')); wp_enqueue_style('amzFulfillment.css'); wp_register_script('amzFulfillment.js', $this->getResource('js/amzFulfillment.js')); wp_enqueue_script('amzFulfillment.js'); wp_enqueue_script('amzFulfillmentData.js', $this->getResource('js/amzFulfillmentData.js')); wp_localize_script('amzFulfillmentData.js', 'amzFulfillmentLogs', array('ajax_url' => admin_url('admin-ajax.php'))); wp_localize_script('amzFulfillmentData.js', 'amzFulfillmentFulfillments', array('ajax_url' => admin_url('admin-ajax.php'))); } /** * checkActions * * Check for submitted admin panel actions */ private function checkActions() { if (isset($_REQUEST[self::SAVE_SETTINGS_ACTION])) { $this->saveSettings(); } elseif (isset($_REQUEST[self::SAVE_RULES_ACTION])) { $this->saveRules(); } elseif (isset($_REQUEST[self::RESET_RULES_ACTION])) { $this->resetRules(); } elseif (isset($_REQUEST[self::TEST_AMAZON_API_ACTION])) { $this->saveSettings(); AmzFulfillment_Core::instance()->testAmazonApi(); } elseif(isset($_REQUEST[self::UPDATE_ACTION])) { $this->update(); } elseif(isset($_REQUEST[self::SUPPORT_ACTION])) { $this->openSupportCase(); } elseif (isset($_REQUEST[self::LICENSE_ACTIVATE_ACTION])) { AmzFulfillment_Core::instance()->getFeature()->activate(); } elseif (isset($_REQUEST[self::LICENSE_DEACTIVATE_ACTION])) { AmzFulfillment_Core::instance()->getFeature()->deactivate(); } } /** * saveRules */ private function saveRules() { if(!isset($_REQUEST['events']) || !isset($_REQUEST['actions'])) { return; } try { $this->rules->setByArrays($_REQUEST['events'], $_REQUEST['actions']); $this->rules->save(); $message = 'Rules updated'; $level = AmzFulfillment_Core::SUCCESS; } catch(InvalidArgumentException $e) { $message = 'Failed to update rules: ' . $e->getMessage(); $level = AmzFulfillment_Core::ERROR; } AmzFulfillment_Core::instance()->addAdminMessage($level, $message); } /** * resetRules */ private function resetRules() { $this->rules->defaults(); $this->rules->save(); AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::SUCCESS, "Defaults restored"); } /** * saveSettings */ private function saveSettings() { $this->options->load(); if(isset($_REQUEST['accessKeyId'])) { try { $this->options->setAccessKeyId($_REQUEST['accessKeyId']); } catch(InvalidArgumentException $e) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::ERROR, $e->getMessage()); } } if(isset($_REQUEST['secretAccessKeyId'])) { try { $this->options->setSecretAccessKeyId($_REQUEST['secretAccessKeyId']); } catch(InvalidArgumentException $e) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::ERROR, $e->getMessage()); } } if(isset($_REQUEST['marketplace'])) { try { $this->options->setMarketplace($_REQUEST['marketplace']); } catch(InvalidArgumentException $e) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::ERROR, $e->getMessage()); } } if(isset($_REQUEST['merchantId'])) { try { $this->options->setMerchantId($_REQUEST['merchantId']); } catch(InvalidArgumentException $e) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::ERROR, $e->getMessage()); } } if(isset($_REQUEST['hold'])) { $this->options->setHold(true); } else { $this->options->setHold(false); } if(isset($_REQUEST['schedulingInterval'])) { $this->options->setSchedulingInterval(intval($_REQUEST['schedulingInterval']) * 60); } if(isset($_REQUEST['automation'])) { $this->options->setAutomation(true); } else { $this->options->setAutomation(false); } $this->options->save(); } /** * update * * Update selected products and run sync */ private function update() { if(isset($_REQUEST['syncSkus']) && is_array($_REQUEST['syncSkus'])) { $this->options->load(); $this->options->setSyncSkus($_REQUEST['syncSkus']); $this->options->save(); AmzFulfillment_Core::instance()->getLog()->add(sprintf('Updated sync skus: %s', implode(', ', $this->options->getSyncSkus()))); } AmzFulfillment_Core::instance()->getWorker()->syncInventoryTask(); wp_safe_redirect($_SERVER['HTTP_REFERER']); } /** * openSupportCase */ private function openSupportCase() { if(!isset($_REQUEST['email']) || empty($_REQUEST['email'])) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::WARN, 'Email address is required'); return; } elseif(!isset($_REQUEST['description']) || empty($_REQUEST['description'])) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::WARN, 'Please provide a description'); return; } elseif(!preg_match(self::EMAIL_PATTERN, $_REQUEST['email'])) { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::WARN, 'Please provide a real email address'); return; } $replyEmail = $_REQUEST['email']; $description = $_REQUEST['description']; $caseId = uniqid(); $supportSubject = sprintf('[%s] Support request %s', $caseId, AMZFULFILLMENT_PLUGIN_ID); apply_filters('wp_mail_from', $replyEmail); $supportMessage = ''; $supportMessage .= sprintf('Reply-Email: %s', $replyEmail) . PHP_EOL; $supportMessage .= sprintf('License: %s', $this->options->getLicenseKey()) . PHP_EOL; $supportMessage .= sprintf('Expire: %s', date('d.m.Y', $this->options->getLicenseExpireDate())) . PHP_EOL; $supportMessage .= sprintf('Description: %s', $description) . PHP_EOL; if(isset($_REQUEST['allowAddSupportData'])) { $supportMessage .= sprintf('Server: %s', $_SERVER['SERVER_NAME']). PHP_EOL; $supportMessage .= sprintf('Site: %s', site_url()). PHP_EOL; $supportMessage .= sprintf('PHP: %s', phpversion()). PHP_EOL; $supportMessage .= sprintf('Plugin: %s %s', AMZFULFILLMENT_PLUGIN_ID, AmzFulfillment_Core::getPluginVersion()) . PHP_EOL; $supportMessage .= sprintf('Wordpress: %s', get_bloginfo('version')) . PHP_EOL; $supportMessage .= sprintf('Language: %s', get_bloginfo('language')) . PHP_EOL; $supportMessage .= sprintf('Plugins:') . PHP_EOL; foreach(get_plugins() as $plugin) { $supportMessage .= sprintf(' %s %s (%s)', $plugin['Name'], $plugin['Version'], $plugin['PluginURI']) . PHP_EOL; } $supportMessage .= sprintf('Plugin-Log:'). PHP_EOL; foreach(AmzFulfillment_Core::instance()->getLog()->get(500) as $log) { $supportMessage .= sprintf('%19s %s',$log->logTime, $log->logMessage) . PHP_EOL; } } if(wp_mail(base64_decode(self::ENCODED_SUPPORT_ADDRESS), $supportSubject, $supportMessage)) { AmzFulfillment_Core::instance()->getLog()->add(sprintf('Support case %s created', $caseId)); $_REQUEST['supportCaseId'] = $caseId; } else { AmzFulfillment_Core::instance()->addAdminMessage(AmzFulfillment_Core::ERROR, 'Wordpress hat failed to send an email. Please check the email settings of your wordpress installation and try again'); } } /** * addTabs * * Adds tabs using templates to admin menu */ private function addTabs() { ob_start(); $this->loadTemplate('Tabs'); echo ob_get_clean(); } /** * loadTemplate * * @param string $name Template name without file extension */ private function loadTemplate($name) { $file = sprintf('%s/AmzFulfillment/template/%s.php', AMZFULFILLMENT_PLUGIN_DIR, $name); if(!is_readable($file)) { AmzFulfillment_Core::debug('Template file not found: ' . $file); } else { include $file; } } /** * getResource * * @param string $file with relative path including file extension * @param string $plugin name of plugin, default this * @return string */ private function getResource($file, $plugin = NULL) { if($plugin == NULL) { return AMZFULFILLMENT_PLUGIN_URL . '/assets/' . $file; } else { return replace(AMZFULFILLMENT_PLUGIN_ID, $plugin, AMZFULFILLMENT_PLUGIN_URL) . $file; } } /** * getInventoryItems * * Items for rows in inventory tab table * * @return array */ private function getInventoryItems() { $items = array(); $this->options->load(); $products = AmzFulfillment_Core::instance()->getWooCommerce()->getProducts(); $amazonItems = AmzFulfillment_Core::instance()->getInventory()->get(); foreach($products as $product) { $sku = $product['sku']; if(!isset($amazonItems[$sku])) { continue; } $amazonItem = $amazonItems[$sku]; $items[] = array( 'productId' => $product['productId'], 'sku' => $sku, 'title' => $product['title'], 'amazonStock' => $amazonItem['amazonStock'], 'shopStock' => $product['stock'], 'selected' => $this->options->isSyncSku($sku), 'updatedTime' => $amazonItem['updatedTime'] ); } return $items; } /** * getOption * * @param string $key option name * @param string $default return if not found or not set * @return string option value */ private function getOption($key, $default = '') { $a = $this->options->getAsArray(); if(!isset($a[$key]) || $a[$key] === false) { return $default; } else { return $a[$key]; } } /** * getOptions * * @return amzFulfillment_Options */ private function getOptions() { return $this->options; } /** * getRules * * @return AmzFulfillment_Rules */ private function getRules() { return $this->rules; } /** * getLicenseData * * For license tab * * @return array */ private function getLicenseData() { $hasPro = AmzFulfillment_Core::instance()->getFeature()->hasPro(); $key = $this->options->getLicenseKey(); if($hasPro) { $valid = get_date_from_gmt(date('Y-m-d H:i:s', $this->options->getLicenseExpireDate()), 'j. F Y'); } else { $valid = __('Free version'); } return array('hasPro' => $hasPro, 'key' => $key, 'valid' => $valid); } /** * getFulfillmentDetails * * For fulfillment detils in fulfillments tab * * @return NULL|array */ private function getFulfillmentDetails() { if(!isset($_REQUEST['show']) || empty($_REQUEST['show'])) { return NULL; } $orderId = intval($_REQUEST['show']); $details = array( 'order' => array( 'orderId' => $orderId, 'orderStatus' => '-', 'fulfillmentStatus' => '-', 'address' => '-' ), 'items' => array(), 'packages' => array() ); if(AmzFulfillment_Core::instance()->getWooCommerce()->existOrder($orderId)) { $order = AmzFulfillment_Core::instance()->getWooCommerce()->getOrder($orderId); $details['order']['address'] = $order->get_formatted_shipping_address(); $details['order']['orderStatus'] = ucfirst(strtolower($order->get_status())); foreach($order->get_items() as $item) { $details['items'][] = array( 'id' => $item->get_product_id(), 'name' => $item->get_name(), 'quantity' => $item->get_quantity() ); } } if(AmzFulfillment_Core::instance()->getFulfillment()->exist($orderId)) { $fulfillment = AmzFulfillment_Core::instance()->getFulfillment()->getByOrderId($orderId); $details['order']['fulfillmentStatus'] = ucfirst(strtolower($fulfillment->fulfillmentStatus)); if(!empty($fulfillment->packages)) { foreach(explode(',', $fulfillment->packages) as $packageNumber) { $details['packages'][] = AmzFulfillment_Core::instance()->getPackage()->get($packageNumber); } } } return $details; } private function formatDate($date) { return AmzFulfillment_Core::instance()->getFormatedDate($date); } private function translateFulfillmentTrackingEvent($eventId) { if(isset(AmzFulfillment_AmazonPackage::$trackingEvent[$eventId])) { return AmzFulfillment_AmazonPackage::$trackingEvent[$eventId]; } else { return $eventId; } } }