Skip to content

Commit

Permalink
Добавлен README.md.
Browse files Browse the repository at this point in the history
Добавлена возможность в настройках плагина указать на какой статус заказа реагировать для фискализации.
  • Loading branch information
Potalius committed Sep 19, 2017
1 parent 564eac8 commit 6af19ad
Show file tree
Hide file tree
Showing 8 changed files with 121 additions and 46 deletions.
63 changes: 61 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,61 @@
# komtet-kassa-woocommerce
Модуль КОМТЕТ Кассы для WordPress и WooCommerce 3.x
# КОМТЕТ Касса для WooCommerce

Данное решение позволяет подключить Ваш интернет-магазин к облачному сервису КОМТЕТ Касса с целью соответствия требованиям 54-ФЗ для регистрации расчетов с использованием электронного средства платежа в сети Интернет.

Возможности плагина

- автоматическая фискализация платежей;
- фискализация в ручном режиме.

Описание работы

Плагин реагирует на событие статуса заказа, которое возникает, когда клиент совершает оплату через один из подключенных плагинов приема платежей, например, PayPal или Robokassa.

По событию «Заказ оплачен» статус заказа изменяется на «Обработка» после чего информации о заказе формируется и отправляется запрос на фискализацию платежа в систему КОМТЕТ Касса. Вы сможете увидеть список всех запросов на фискализацию в личном кабинете на сайте КОМТЕТ Касса в разделе «История».

Как только данные по заказу появляются в системе КОМТЕТ Касса, формируется чек, который записывается на фискальный накопитель кассового аппарата и он же отправляется в ОФД (Оператор Фискальных Данных). Если указано в настройках, аппарат может распечатать бланк чека.

Важно! 54-ФЗ обязует выдать электронный чек клиенту, для того чтобы электронный чек был выслан клиенту на электронную почту необходимо сделать обязательным поле email на форме оформления заказа.

Так же статус заказа «Обработка» возникает, когда в разделе администратора магазина для заказа вы устанвливате статус «Обработка» и нажимаете кнопкк «Обновить». Это позволит провести фискализацию вручную.

Таким образом вы можете использовать разделе администратора магазина для печати чека по любому заказу.

### Установка
Для установки плагина нужно выполнить слудующие действия:
1. Войти в админ панель WordPress и открыть вкладку Плагины — Добавить новый (Plugins tab — Add New):
2. Вверху нажать кнопку Загрузить плагин (Upload plugin).
3. Кликнуть Обзор (Browse) и выбрать .zip архив плагина. Когда вы нашли необходимый архив плагина, нужно нажать кнопку Открыть (Open), а затем кликнуть Установить сейчас (Install Now).
4. Когда плагин будет загружен, нужно активировать его, кликнув по ссылке Активировать плагин (Activate Plugin):

Также можно установить плагин через админ панель, используя форму поиска плагинов.
1. Откройте вкладку Плагины (Plugins), кликните Добавить новый (Add New), в строке поиска введите название плагина, КОМТЕТ Касса, и нажмите кнопку Enter на клавиатуре:
2. Вы можете видеть плагин КОМТЕТ Касса в списке результатов поиска. Чтобы установить данный плагин, нажмите кнопку Установить сейчас (Install now).
3. Когда плагин будет установлен, кликните ссылку Активировать плагин (Activate Plugin).

### Настройка плагина

Прежде чем приступить к настройке плагина вам потребуется зарегистрировать в [личном кабинете на сайте КОМТЕТ Касса](https://kassa.komtet.ru/signup).

Для настройки плагин нужно открыть вкладку КОМТЕТ Касса - Настройки

В настройках плагина необходимо указать:
1. URL по которому система КОМТЕТ Касса принимает данные для фискализации. Актуальный адрес указан по умолчанию.
2. Идентификатор магазина. В личном кабинете на сайте КОМТЕТ Касса зайдите в меню «Магазины» (слева), далее выберете нужный магазин и зайдите в его настройки, там вы и найдете необходимое значение (ShopId).
3. Секретный ключ магазина. Аналогично предыдущему (Secret).
4. Включить или отключить печать бумажного чека.
5. Указать систему налогообложения вашей компании. Данные о системе налогообложения будут использованы при формировании чека.
6. Выбрать статус заказа, при при котором формируется и отправляется запрос на фискализацию платежа в систему КОМТЕТ Касса.
7. Скопировать в настройках плагина данные из полей Success url (http://your_domain/?komtet-kassa=success) и Failure url (http://your_domain/?komtet-kassa=fail), и записать их в соответствующие поля в настройках магазина в личном кабинете КОМТЕТ Касса

### Будет сделано

- Возврат чека
- Локализация
- Логирование

License
----

MIT

3 changes: 2 additions & 1 deletion includes/class-komtetkassa-admin-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ final class KomtetKassa_AdminSettings {
'komtetkassa_secret_key' => 'string',
'komtetkassa_should_print' => 'bool',
'komtetkassa_queue_id' => 'string',
'komtetkassa_tax_system' => 'integer'
'komtetkassa_tax_system' => 'integer',
'komtetkassa_fiscalize_on_order_status' => 'string'
);

public static function out() {
Expand Down
4 changes: 2 additions & 2 deletions includes/class-komtetkassa-admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public static function add_menu() {
array(__CLASS__, 'settings_page'),
null,
'56.2'
);
);
}

public static function add_menu_settings() {
Expand Down Expand Up @@ -61,4 +61,4 @@ public static function settings_page() {
public static function reports_page() {
KomtetKassa_AdminReports::out();
}
}
}
15 changes: 7 additions & 8 deletions includes/class-komtetkassa-install.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ final class KomtetKassa_Install {
const OPTION_DB_VERSION_KEY = 'komtetkassa_db_version';

private static $db_migrations = array(
'1.0.0' => 'komtetkassa_0001_create_tables',
'1.0.1' => 'komtetkassa_0002_create_tables'
'1.0.0' => 'komtetkassa_0001_create_tables'
);

public static function init()
Expand All @@ -17,15 +16,15 @@ public static function init()
public static function activation()
{
self::db_migrations();
}
}

public static function db_migrations()
{
$current_db_version = get_option(self::OPTION_DB_VERSION_KEY, null);

if (!is_null($db_version) && version_compare($db_version, max(array_keys(self::$db_migrations)), '<' ) ) {
return;
}
return;
}

include_once(dirname(__FILE__) . '/db-migrations.php');

Expand All @@ -39,8 +38,8 @@ public static function db_migrations()
}

public static function update_db_version($version=null) {
delete_option(self::OPTION_DB_VERSION_KEY);
add_option(self::OPTION_DB_VERSION_KEY, is_null($version) ? Komtet_Kassa()->version : $version);
delete_option(self::OPTION_DB_VERSION_KEY);
add_option(self::OPTION_DB_VERSION_KEY, is_null($version) ? Komtet_Kassa()->version : $version);
}

public static function plugin_action_links($links)
Expand All @@ -53,4 +52,4 @@ public static function plugin_action_links($links)
}
}

KomtetKassa_Install::init();
KomtetKassa_Install::init();
9 changes: 5 additions & 4 deletions includes/class-komtetkassa-report.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,16 @@ public function no_items() {
echo '<div align="center">Список пуст</div>';
}

public function column_default( $item, $column_name ) {
public function column_default($item, $column_name) {
switch ( $column_name ) {
case 'report_id':
case 'order_id':
return $item[$column_name];
case 'status':
$statuses = array(
'new' => "Новая",
'error' => "Ошибка",
'done' => "Выполнена"
'new' => "Новая",
'error' => "Ошибка",
'done' => "Выполнена"
);
return $statuses[$item[$column_name]];
case 'created_at':
Expand Down
16 changes: 16 additions & 0 deletions includes/views/html-admin-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,22 @@
</select>
</td>
</tr>
<tr>
<th>
<label for="tax_system">Статус заказа при котором будет фискализирован чек:</label>
</th>
<td>
<select id="order_status" name="komtetkassa_fiscalize_on_order_status">
<?php
$statuses = wc_get_order_statuses();
foreach ($statuses as $status => $status_name):
$status = str_replace( 'wc-', '', $status);
?>
<option value="<?php echo esc_attr($status) ?>" <?php echo selected($status, get_option("komtetkassa_fiscalize_on_order_status"), false) ?>><?php echo esc_html($status_name) ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
</table>
<p class="submit">
<input class="button button-primary" type="submit" value="Cохранить" name="submit">
Expand Down
52 changes: 26 additions & 26 deletions komtetkassa.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<?php
/*
Plugin Name: KOMTET Kassa
Plugin Name: WooCommerce - КОМТЕТ Касса
Description: Фискализация платежей с помощью сервиса КОМТЕТ Касса для плагина WooCommerce
Plugin URI: http://wordpress.org/plugins/komtetkassa/
Author: Potalius
Author: Komtet
Version: 1.0.0
Author URI: http://kassa.komtet.ru/
*/
Expand All @@ -26,18 +27,18 @@ final class KomtetKassa {
private static $_instance = null;

public static function instance() {
if (is_null(self::$_instance) ) {
self::$_instance = new self();
}
return self::$_instance;
}
if (is_null(self::$_instance) ) {
self::$_instance = new self();
}
return self::$_instance;
}

public function __construct()
{
$this->define('KOMTETKASSA_ABSPATH', plugin_dir_path( __FILE__));
$this->define('KOMTETKASSA_ABSPATH_VIEWS', plugin_dir_path( __FILE__) . 'includes/views/');
$this->define('KOMTETKASSA_BASENAME', plugin_basename( __FILE__ ));

$this->includes();
$this->hooks();
$this->wp_hooks();
Expand All @@ -49,7 +50,7 @@ public function __construct()
public function wp_hooks()
{
register_activation_hook( __FILE__, array('KomtetKassa_Install', 'activation'));
add_action('woocommerce_order_status_completed', array($this, 'fiscalize'));
add_action('woocommerce_order_status_' . get_option('komtetkassa_fiscalize_on_order_status'), array($this, 'fiscalize'));
}

public function wp_endpoints()
Expand All @@ -61,7 +62,7 @@ public function wp_endpoints()

public function hooks()
{
add_action('komtet_kassa_action_success', array($this, 'action_success'));
add_action('komtet_kassa_action_success', array($this, 'action_success'));
add_action('komtet_kassa_action_fail', array($this, 'action_fail'));
add_action('komtet_kassa_report_create', array($this, 'report_create'), 10, 4);
add_action('komtet_kassa_report_update', array($this, 'report_update'), 10, 3);
Expand All @@ -72,7 +73,7 @@ public function includes()
require_once(KOMTETKASSA_ABSPATH . 'includes/class-komtetkassa-install.php');
require_once(KOMTETKASSA_ABSPATH . 'includes/class-komtetkassa-report.php');
require_once(KOMTETKASSA_ABSPATH . 'includes/libs/komtet-kassa-php-sdk/autoload.php');

if (is_admin()) {
require_once(KOMTETKASSA_ABSPATH . 'includes/class-komtetkassa-admin.php');
add_action('init', array( 'KomtetKassa_Admin', 'init'));
Expand All @@ -81,9 +82,9 @@ public function includes()

private function define($name, $value)
{
if (!defined( $name )) {
define( $name, $value );
}
if (!defined( $name )) {
define( $name, $value );
}
}

public function load_options() {
Expand All @@ -92,7 +93,7 @@ public function load_options() {
$this->secret_key = get_option('komtetkassa_secret_key');
$this->queue_id = get_option('komtetkassa_queue_id');
}

public function init()
{
do_action('before_komtetkassa_init');
Expand Down Expand Up @@ -130,24 +131,23 @@ public function fiscalize($order_id)
$check->setShouldPrint(get_option('komtetkassa_should_print'));

if (sizeof($order->get_items()) > 0 ) {
// products
foreach ($order->get_items('line_item') as $item) {
$check->addPosition(new Position(
$item->get_name(),
$order->get_item_total($item, false, true),
$order->get_item_total($item, true, true),
$item->get_quantity(),
$item->get_total(),
$order->get_item_subtotal($item, false, true) - $order->get_item_total($item, false, true),
$order->get_line_total($item, true, true),
$order->get_line_subtotal($item, false, true) - $order->get_item_total($item, false, true),
new Vat(Vat::RATE_NO)
));
}
// shipping
foreach ($order->get_items('shipping') as $item) {
$check->addPosition(new Position(
$item->get_name(),
$order->get_item_total($item, false, true),
$order->get_item_total($item, true, true),
$item->get_quantity(),
floatval($item->get_total()),
$order->get_line_total($item, true, true),
self::DISCOUNT_NOT_AVAILABLE,
new Vat(Vat::RATE_NO)
));
Expand All @@ -174,7 +174,7 @@ public function add_query_vars($vars) {
public static function add_endpoint() {
add_rewrite_endpoint('komtet-kassa', EP_ALL);
}

public function handle_requests() {
global $wp;

Expand Down Expand Up @@ -219,14 +219,14 @@ public function handle_action($action) {
$scheme = array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$url = sprintf('%s://%s%s', $scheme, $_SERVER['SERVER_NAME'], $_SERVER['REQUEST_URI']);
$data = file_get_contents('php://input');

$signature = hash_hmac('md5', $_SERVER['REQUEST_METHOD'] . $url . $data, $this->secret_key);

if ($signature != $this->request->server['HTTP_X_HMAC_SIGNATURE']) {
// status_header(403);
// exit();
status_header(403);
exit();
}

$data = json_decode($data, true);

foreach (array('external_id', 'state') as $key) {
Expand Down
5 changes: 2 additions & 3 deletions uninstall.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

global $wpdb;

include_once(dirname( __FILE__ ).'/includes/class-komtetkassa-install.php');
$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}komtetkassa_reports");



delete_option(KomtetKassa_Install::OPTION_DB_VERSION_KEY);

0 comments on commit 6af19ad

Please sign in to comment.