vindi/vindi-woocommerce

View on GitHub
src/includes/admin/Settings.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace VindiPaymentGateways;

use WC_Settings_API;

class VindiSettings extends WC_Settings_API
{

  /**
   * @var WooCommerce
   **/
  public $woocommerce;

  /**
   * @var VindiDependencies
   **/
  public $dependencies;

  /**
   * @var string
   **/
  private $token;

  /**
   * @var WcVindiPayment
   **/
  private $plugin;

  /**
   * @var VindiLogger
   **/
  public $logger;

  /**
   * @var VindiApi
   **/
  public $api;

  /**
   * @var VindiRoutes
   **/
  public $routes;

  /**
   * @var boolean
   **/
  private $debug;

  /**
   * @var boolean
   **/
  private $invalidApiKey;

  function __construct()
  {
    global $woocommerce;
    $this->token = sanitize_file_name(wp_hash(VINDI));
    $this->init_settings();
    $this->init_form_fields();
    $this->debug = $this->get_option('debug') == 'yes' ? true : false;
    $this->logger = new VindiLogger(VINDI, $this->debug);
    $this->api = new VindiApi($this->get_api_key(), $this->logger, $this->get_is_active_sandbox());
    $this->routes = new VindiRoutes($this);
    $this->woocommerce = $woocommerce;
    $this->dependencies  = new VindiDependencies;
    $this->invalidApiKey = get_option( 'vindi_invalid_api_key', false );
    
    if (is_admin()) {
            $this->call_actions();
    }
  }

    public function call_actions()
    {
        add_filter('woocommerce_settings_tabs_array', array($this, 'add_settings_tab'), 50);
        add_action('woocommerce_settings_tabs_settings_vindi', array(&$this, 'settings_tab'));
        add_action('woocommerce_update_options_settings_vindi', array(&$this, 'process_admin_options'), 10);
        add_action('woocommerce_update_options_settings_vindi', array($this, 'api_key_field'), 11);
        add_action('woocommerce_settings_tabs_settings_vindi', array($this, 'is_api_key_valid'));
        add_action('woocommerce_coupon_options', 'VindiPaymentGateways\CouponsMetaBox::output', 40, 2);
        add_action('woocommerce_coupon_options_save', 'VindiPaymentGateways\CouponsMetaBox::save', 10, 2);
        add_action(
            'woocommerce_coupon_discount_types',
            'VindiPaymentGateways\CouponsMetaBox::remove_ws_recurring_discount',
            10,
            1
        );
        add_action('admin_notices', array(&$this, 'wcs_automatic_payment_settings'));
    }

  /**
   * Create settings tab
   */
  public static function add_settings_tab($settings_tabs)
  {
    $settings_tabs['settings_vindi'] = __('Vindi', VINDI);

    return $settings_tabs;
  }

  /**
   * Include Settings View
   */
  public function settings_tab()
  {
    $this->get_template('admin-settings.html.php', array('settings' => $this));
  }

  /**
   * WC Get Template helper.
   *
   * @param string    $name
   * @param array     $args
   */
  public function get_template($name, $args = array())
  {
    wc_get_template(
      $name,
      $args,
      '',
      sprintf(
          '%s/../../%s',
          dirname(__FILE__),
          WcVindiPayment::TEMPLATE_DIR
      )
    );
  }

  /**
   * Initialize Gateway Settings Form Fields
   */
  function init_form_fields()
  {
    $url           = admin_url(sprintf('admin.php?page=wc-status&tab=logs&log_file=%s-%s-log', VINDI, $this->get_token()));
    $logs_url      = '<a href="' . $url . '" target="_blank">' . __('Ver Logs', VINDI) . '</a>';
    $nfe_know_more = '<a href="http://atendimento.vindi.com.br/hc/pt-br/articles/204450944-Notas-fiscais" target="_blank">' . __('Saiba mais', VINDI) . '</a>';

    $prospects_url = '<a href="https://app.vindi.com.br/prospects/new" target="_blank">' . __('Não possui uma conta?', VINDI) . '</a>';

    $sand_box_article = '<a href="https://atendimento.vindi.com.br/hc/pt-br/articles/115012242388-Sandbox" target="_blank">' . __('Dúvidas?', VINDI) . '</a>';

    $this->form_fields = array(
      'api_key'              => array(
        'title'            => __('Chave da API Vindi', VINDI),
        'type'             => $this->checkKey(),
        'description'      => __('A Chave da API de sua conta na Vindi. ' . $prospects_url, VINDI),
        'default'          => '',
      ),
      'send_nfe_information' => array(
        'title'            => __('Emissão de NFe\'s', VINDI),
        'label'            => __('Enviar informações para emissão de NFe\'s', VINDI),
        'type'             => 'checkbox',
        'description'      => sprintf(__('Envia informações de RG e Inscrição Estadual para Emissão de NFe\'s com nossos parceiros. %s', VINDI), $nfe_know_more),
        'default'          => 'no',
      ),
      'return_status'        => array(
        'title'            => __('Status de conclusão do pedido', VINDI),
        'type'             => 'select',
        'description'      => __('Status que o pedido deverá ter após receber a confirmação de pagamento da Vindi.', VINDI),
        'default'          => 'processing',
        'options'          => array(
          'processing'   => 'Processando',
          'on-hold'      => 'Aguardando',
          'completed'    => 'Concluído',
        ),
      ),
      'vindi_synchronism'        => array(
        'title'            => __('Sincronismo de Status das Assinaturas', VINDI),
        'type'             => 'checkbox',
        'label'      => __('Enviar alterações de status nas assinaturas do WooCommerce', VINDI),
        'description'      => __('Envia as alterações de status nas assinaturas do WooCommerce para Vindi.', VINDI),
        'default'          => 'no',
      ),
      'shipping_and_tax_config'  => array(
        'title'            => __('Cobrança única', VINDI),
        'type'             => 'checkbox',
        'label'      => __('Ativar cobrança única para fretes e taxas', VINDI),
        'description'      => __('Fretes e Taxas serão cobrados somente no primeiro ciclo de uma assinatura', VINDI),
        'default'          => 'no',
      ),
      'testing'              => array(
        'title'            => __('Testes', VINDI),
        'type'             => 'title',
      ),
      'sandbox'             => array(
        'title'            => __('Ambiente Sandbox', VINDI),
        'label'            => __('Ativar Sandbox', VINDI),
        'type'             => 'checkbox',
        'description'      => __('Ative esta opção para habilitar a comunicação com o ambiente Sandbox da Vindi.', VINDI),
        'default'          => 'no',
      ),
      'debug'                => array(
        'title'            => __('Log de Depuração', VINDI),
        'label'            => __('Ativar Logs', VINDI),
        'type'             => 'checkbox',
        'description'      => sprintf(__('Ative esta opção para habilitar logs de depuração do servidor. %s', VINDI), $logs_url),
        'default'          => 'no',
      ),
    );
  }


  /**
   * Get Uniq Token Access
   *
   * @return string
   **/
  public function get_token()
  {
    return $this->token;
  }

  /**
   * Ocult valid token
   *
   * @return string
   **/
  function checkKey()
  {

    return 'text';
  }

  /**
   * Get Vindi API Key
   * @return string
   **/
  public function get_api_key()
  {
    return $this->settings['api_key'];
  }

  /**
   * Return
   * @return boolean
   **/
  public function get_is_active_sandbox()
  {
    return $this->settings['sandbox'];
  }

  /**
   * Check if SSL is enabled when merchant is not in sandbox.
   * @return boolean
   */
  public function check_ssl()
  {
    if ($this->get_is_active_sandbox()) {
      return true;
    } else {
      return is_ssl();
    }
  }

  /**
   * Validate API key field
   * @param string $text
   * @return string $text
   */

  public function api_key_field()
  {
    $api_key = $this->get_api_key();
    $this->api = new VindiApi($api_key, $this->logger, $this->get_is_active_sandbox());

    if (!$api_key) {
      return;
    }
    if ('unauthorized' === $this->api->test_api_key($api_key)) {
      update_option('vindi_invalid_api_key', true);
      $this->invalidApiKey = true;

      include_once VINDI_SRC . 'views/invalid-api-key.php';
    } else {
      update_option('vindi_invalid_api_key', false);
      $this->invalidApiKey = false;
    }
  }

  /**
   * Check if invalidApiKey is true
   * @return mixed includes the invalid-api-key view
   */
  public function is_api_key_valid()
  {
    if($this->invalidApiKey) {
      include_once VINDI_SRC . 'views/invalid-api-key.php';
    }
  }

  /**
   * Get Vindi Shipping and Tax config
   * @return string
   */
  public function get_shipping_and_tax_config()
  {
    return 'yes' === $this->settings['shipping_and_tax_config'];
  }

  public function get_return_status()
  {
    if(isset($this->settings['return_status'])) {
      return $this->settings['return_status'];
    } else {
      return 'processing';
    }
  }

    public function get_webhooks_url() {
        return sprintf('%s/index.php/wc-api/%s?token=%s',
            get_site_url(),
            WcVindiPayment::WC_API_CALLBACK,
            $this->get_token()
    );
  }
  
  /**
   * Get Vindi Synchronism status
   * @return string
   */
  public function get_synchronism_status()
  {
    return 'yes' === $this->settings['vindi_synchronism'];
  }
  
  /**
   * Verify if the user wants to send nfe information
   * @return bool
   */
  public function send_nfe_information()
  {
    return 'yes' === $this->settings['send_nfe_information'];
  }

    /**
    * Warning if WCS automatic payments settings are disabled
    **/
    public function wcs_automatic_payment_settings()
    {
        $opt = get_option('woocommerce_subscriptions_turn_off_automatic_payments');

        if ('yes' !== $opt) {
            $this->get_template(
                'wcs-automatic-payment-deactivated-message.html.php'
            );
        }
        
        return;
    }
}