From 479116c591f73f35f07add58b0a18328242818c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Fri, 3 Jun 2022 17:05:09 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B2=D1=83=D1=85=20=D1=87=D0=B5=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.rst | 13 ++ README.md | 10 +- README_DEV.md | 49 +++- .../class-komtetkassa-admin-settings.php | 29 ++- src/includes/class-komtetkassa-report.php | 63 +++-- src/includes/libs/komtet-kassa-php-sdk | 2 +- src/includes/views/html-admin-settings.php | 195 ++++++++++------ src/komtetkassa.php | 220 +++++++++++++----- 8 files changed, 426 insertions(+), 155 deletions(-) create mode 100644 CHANGELOG.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst new file mode 100644 index 0000000..e61540c --- /dev/null +++ b/CHANGELOG.rst @@ -0,0 +1,13 @@ +Changelog +========= + +Unreleased +---------- + +1.3.0 (01.06.2022) +------------------- + +- Корректное отображение ошибки при создании чека в таблицах с отчётами +- Версия php-sdk 9.0.2 +- Возможность создания двух чеков (Полная предоплата и Полный расчёт) +- В настройки добавлена возможность указания ставки НДС для товаров и Доставки \ No newline at end of file diff --git a/README.md b/README.md index 6643fcf..ffb8efa 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Важно! 54-ФЗ обязует выдать электронный чек клиенту, для того чтобы электронный чек был выслан клиенту на электронную почту необходимо сделать обязательным поле email на форме оформления заказа. -Так же статус заказа «Обработка» возникает, когда в разделе администратора магазина для заказа вы устанвливате статус «Обработка» и нажимаете кнопкк «Обновить». Это позволит провести фискализацию вручную. +Так же статус заказа «Обработка» возникает, когда в разделе администратора магазина для заказа вы устанвливате статус «Обработка» и нажимаете кнопку «Обновить». Это позволит провести фискализацию вручную. Таким образом вы можете использовать раздел администратора магазина для печати чека по любому заказу. @@ -44,8 +44,12 @@ 2. Секретный ключ магазина. Аналогично предыдущему (Secret). 3. Включить или отключить печать бумажного чека. 4. Указать систему налогообложения вашей компании. Данные о системе налогообложения будут использованы при формировании чека. -5. Выбрать статус заказа, при при котором формируется и отправляется запрос на фискализацию платежа в систему КОМТЕТ Касса. -6. Скопировать в настройках плагина данные из полей Success url (http://your_domain/?komtet-kassa=success) и Failure url (http://your_domain/?komtet-kassa=fail), и записать их в соответствующие поля в настройках магазина в личном кабинете КОМТЕТ Касса +5. Указать ставку НДС для товаров. +6. Указать ставку НДС для доставки. +7. Указать платёжные системы для которых будет происходить фомирование чеков. +8. Выбрать статус заказа, при при котором формируется и отправляется запрос на фискализацию чека полной предоплаты в систему КОМТЕТ Касса. +9. Выбрать статус заказа, при при котором формируется и отправляется запрос на фискализацию чека полного расчета в систему КОМТЕТ Касса. +10. Скопировать в настройках плагина данные из полей Success url (http://your_domain/?komtet-kassa=success) и Failure url (http://your_domain/?komtet-kassa=fail), и записать их в соответствующие поля в настройках магазина в личном кабинете КОМТЕТ Касса ### Будет сделано diff --git a/README_DEV.md b/README_DEV.md index 9536ab7..48df66d 100644 --- a/README_DEV.md +++ b/README_DEV.md @@ -6,7 +6,54 @@ * Скачать установщик WordPress - https://wordpress.org/download/ * Cоздать в корневом каталоге папку php * Распаковать архив WP CMS в папку php -* В файл /php/.htaccess добавить строчку: *php_value date.timezone 'Europe/Moscow* +* Добавить файл .htaccess в папку php со следующим содержимым: +```sh + + Deny from all + + +DirectoryIndex index.php +Options -Indexes +# Comment the following line, if option Multiviews not allowed here +Options -MultiViews + +AddDefaultCharset utf-8 + + + RewriteEngine On + + # Uncomment the following line, if you are having trouble + #RewriteBase / + + # if request js file from ROOT + RewriteCond %{REQUEST_URI} ^\/?[^\/]+\.js$ [or] + # or if NOT request certain static file from anywhere + RewriteCond %{REQUEST_URI} !\.(js|css|jpg|jpeg|gif|png|svg|ttf|eot|otf|woff|woff2)$ [or] + # or if request apple-touch-icon.png icon + RewriteCond %{REQUEST_URI} apple-touch-icon\.png$ [or] + + # or if other conditions for webdav and caldav are passed + RewriteCond %{REQUEST_METHOD} ^(POST|PUT|COPY|MOVE|DELETE|PROPFIND|OPTIONS|MKCOL)$ [or] + RewriteCond %{HTTP:Translate} ^.+$ [or] + RewriteCond %{HTTP_USER_AGENT} ^(DavClnt|litmus|gvfs|davfs|wdfs|WebDAV|cadaver|Cyberduck) + + # or if file doesnt' exist + RewriteCond %{REQUEST_FILENAME} !-f + # or if directory doesnt' exist + RewriteCond %{REQUEST_FILENAME} !-d + + # dispatch it to index.php + RewriteRule ^(.*)$ index.php [L,QSA] + + + + + Header set Cache-Control "max-age=3153600, public" + + + +php_value date.timezone 'Europe/Moscow +``` * Запустить сборку проекта ```sh diff --git a/src/includes/class-komtetkassa-admin-settings.php b/src/includes/class-komtetkassa-admin-settings.php index 07abece..12501fa 100644 --- a/src/includes/class-komtetkassa-admin-settings.php +++ b/src/includes/class-komtetkassa-admin-settings.php @@ -1,6 +1,7 @@ 'string', @@ -8,17 +9,23 @@ final class KomtetKassa_AdminSettings { 'komtetkassa_should_print' => 'bool', 'komtetkassa_queue_id' => 'string', 'komtetkassa_tax_system' => 'integer', - 'komtetkassa_fiscalize_on_order_status' => 'string' + 'komtetkassa_product_vat_rate' => 'string', + 'komtetkassa_delivery_vat_rate' => 'string', + 'komtet_kassa_payment_systems' => 'array', + 'komtetkassa_fiscalize_pre_payment_full' => 'string', + 'komtetkassa_fiscalize_full_payment' => 'string' ); - public static function out() { + public static function out() + { if (!empty($_POST)) { self::save(); } include(KOMTETKASSA_ABSPATH_VIEWS . 'html-admin-settings.php'); } - public static function save() { + public static function save() + { foreach (self::$options as $key => $type) { $value = filter_input(INPUT_POST, $key); @@ -29,7 +36,19 @@ public static function save() { update_option($key, $value === "1" ? "1" : "0"); } else if ($type == 'integer') { update_option($key, intval($value)); + } else if ($type == 'array') { + // var_dump($_POST[$key]); die(); + // update_option($key, $value); + if (isset($_POST[$key]) && array_key_exists($key, $_POST)) { + // $new_arr = array(); + // foreach ($_POST[$key] as $val) { + // $new_arr[] = sanitize_text_field( + // strip_tags(stripslashes($val)) + // ); + // } + update_option($key, $_POST[$key]); + } } } } -} \ No newline at end of file +} diff --git a/src/includes/class-komtetkassa-report.php b/src/includes/class-komtetkassa-report.php index eda3838..2786fb7 100644 --- a/src/includes/class-komtetkassa-report.php +++ b/src/includes/class-komtetkassa-report.php @@ -1,10 +1,11 @@ prefix . KomtetKassa_Report::REPORT_TABLE_NAME; } - public static function get_reports_data($per_page=5, $page_number=1) + public static function get_reports_data($per_page = 5, $page_number = 1) { global $wpdb; $sql = "SELECT * FROM " . self::$table_name; - if (!empty($_REQUEST['orderby']) ) { + if (!empty($_REQUEST['orderby'])) { $sql .= ' ORDER BY ' . esc_sql($_REQUEST['orderby']); $sql .= !empty($_REQUEST['order']) ? ' ' . esc_sql($_REQUEST['order']) : ' ASC'; } @@ -40,7 +41,8 @@ public static function get_reports_data($per_page=5, $page_number=1) return $result; } - public static function record_count() { + public static function record_count() + { global $wpdb; $sql = "SELECT COUNT(*) FROM " . self::$table_name; @@ -48,20 +50,22 @@ public static function record_count() { return $wpdb->get_var($sql); } - public function no_items() { + public function no_items() + { echo '
Список пуст
'; } - public function column_default($item, $column_name) { - switch ( $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': @@ -75,7 +79,8 @@ public function column_default($item, $column_name) { } } - function get_columns() { + function get_columns() + { $columns = array( 'report_id' => "#", 'created_at' => "Задача создана", @@ -93,7 +98,7 @@ public function get_sortable_columns() { $columns = array( 'report_id' => array('report_id', true), - 'order_id' => array( 'order_id', false ) + 'order_id' => array('order_id', false) ); return $columns; } @@ -113,12 +118,13 @@ public function prepare_items() } -final class KomtetKassa_Report { +final class KomtetKassa_Report +{ const REPORT_TABLE_NAME = 'komtetkassa_reports'; - public function create($order_id, $request_check_data, $response_data, $error="") + public function create($order_id, $request_check_data, $response_data, $error = "") { global $wpdb; @@ -130,7 +136,7 @@ public function create($order_id, $request_check_data, $response_data, $error="" 'response_data' => $response_data != null ? json_encode($response_data) : null, 'error' => empty($error) ? null : $error ), - array('%d', '%s', '%s') + array('%d', '%s', '%s', '%s') ); } @@ -140,7 +146,7 @@ public function update($order_id, $state, $report_data) $table_name = $wpdb->prefix . self::REPORT_TABLE_NAME; - $report = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$table_name} WHERE `order_id` = %d LIMIT 1;", $order_id ) ); + $report = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$table_name} WHERE `order_id` = %d LIMIT 1;", $order_id)); if ($report === null) { status_header(422); @@ -149,7 +155,8 @@ public function update($order_id, $state, $report_data) exit; } - $wpdb->update($table_name, + $wpdb->update( + $table_name, array( 'status' => $state, 'report_data' => json_encode($report_data), @@ -160,4 +167,22 @@ public function update($order_id, $state, $report_data) array('%d') ); } + + public function get_check_calculation_method($order_id) + { + global $wpdb; + + $table_name = $wpdb->prefix . self::REPORT_TABLE_NAME; + + $order_report_data = $wpdb->get_row( + $wpdb->prepare( + "SELECT report_data FROM {$table_name} WHERE `order_id` = %d and `error` IS NULL LIMIT 1;", + $order_id + ) + ); + + // var_dump(json_decode($order_report_data->report_data, true)); die(); + // return json_decode($order_report_data->report_data, true); + return json_decode($order_report_data->report_data, true)['positions'][0]['calculation_method']; + } } diff --git a/src/includes/libs/komtet-kassa-php-sdk b/src/includes/libs/komtet-kassa-php-sdk index 9dde819..242c3fb 160000 --- a/src/includes/libs/komtet-kassa-php-sdk +++ b/src/includes/libs/komtet-kassa-php-sdk @@ -1 +1 @@ -Subproject commit 9dde819818eb64055f5482158a587c74ad583268 +Subproject commit 242c3fb967a82bde24ce48ad3eb0a7a75fba097f diff --git a/src/includes/views/html-admin-settings.php b/src/includes/views/html-admin-settings.php index 8e13a5d..7ce9fba 100644 --- a/src/includes/views/html-admin-settings.php +++ b/src/includes/views/html-admin-settings.php @@ -1,77 +1,140 @@

Настройки

-
- - - - - - - - - - - - - - - - - - - - - - - - - + +
- - - " /> -
- - - " /> -
- - - /> -
- - - " /> -
- - - -
- - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + " /> +
+ + + " /> +
+ + + /> +
+ + + " /> +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +

-
-
+ + \ No newline at end of file diff --git a/src/komtetkassa.php b/src/komtetkassa.php index 18cd26f..f2d6523 100644 --- a/src/komtetkassa.php +++ b/src/komtetkassa.php @@ -4,31 +4,36 @@ Description: Фискализация платежей с помощью сервиса КОМТЕТ Касса для плагина WooCommerce Plugin URI: http://wordpress.org/plugins/komtetkassa/ Author: Komtet -Version: 1.2.0 +Version: 1.3.0 Author URI: http://kassa.komtet.ru/ */ -use Komtet\KassaSdk\Client; -use Komtet\KassaSdk\QueueManager; -use Komtet\KassaSdk\Check; -use Komtet\KassaSdk\Payment; -use Komtet\KassaSdk\Position; -use Komtet\KassaSdk\Vat; -use Komtet\KassaSdk\TaxSystem; +use Komtet\KassaSdk\v1\CalculationMethod; +use Komtet\KassaSdk\v1\CalculationSubject; +use Komtet\KassaSdk\v1\Check; +use Komtet\KassaSdk\v1\Client; +use Komtet\KassaSdk\v1\QueueManager; +use Komtet\KassaSdk\v1\Payment; +use Komtet\KassaSdk\v1\Position; +use Komtet\KassaSdk\v1\TaxSystem; +use Komtet\KassaSdk\v1\Vat; +use Komtet\KassaSdk\Exception\ApiValidationException; use Komtet\KassaSdk\Exception\ClientException; use Komtet\KassaSdk\Exception\SdkException; -final class KomtetKassa { +final class KomtetKassa +{ - public $version = '1.2.0'; + public $version = '1.3.0'; const DEFAULT_QUEUE_NAME = 'default'; const DISCOUNT_NOT_AVAILABLE = 0; private static $_instance = null; - public static function instance() { - if (is_null(self::$_instance) ) { + public static function instance() + { + if (is_null(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; @@ -36,9 +41,9 @@ public static function 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->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(); @@ -50,8 +55,9 @@ public function __construct() public function wp_hooks() { - register_activation_hook( __FILE__, array('KomtetKassa_Install', 'activation')); - add_action('woocommerce_order_status_' . get_option('komtetkassa_fiscalize_on_order_status'), array($this, 'fiscalize')); + register_activation_hook(__FILE__, array('KomtetKassa_Install', 'activation')); + add_action('woocommerce_order_status_' . get_option('komtetkassa_fiscalize_pre_payment_full'), array($this, 'fiscalize')); + add_action('woocommerce_order_status_' . get_option('komtetkassa_fiscalize_full_payment'), array($this, 'fiscalize')); } public function wp_endpoints() @@ -77,18 +83,19 @@ public function includes() if (is_admin()) { require_once(KOMTETKASSA_ABSPATH . 'includes/class-komtetkassa-admin.php'); - add_action('init', array( 'KomtetKassa_Admin', 'init')); + add_action('init', array('KomtetKassa_Admin', 'init')); } } private function define($name, $value) { - if (!defined( $name )) { - define( $name, $value ); + if (!defined($name)) { + define($name, $value); } } - public function load_options() { + public function load_options() + { $this->shop_id = get_option('komtetkassa_shop_id'); $this->secret_key = get_option('komtetkassa_secret_key'); $this->queue_id = get_option('komtetkassa_queue_id'); @@ -105,27 +112,91 @@ public function init() do_action('komtetkassa_init'); } - public function taxSystems() { - return array( - TaxSystem::COMMON => 'ОСН', - TaxSystem::SIMPLIFIED_IN => 'УСН доход', - TaxSystem::SIMPLIFIED_IN_OUT => 'УСН доход - расход', - TaxSystem::UTOII => 'ЕНВД', - TaxSystem::UST => 'ЕСН', - TaxSystem::PATENT => 'Патент' - ); - } + public function taxSystems() + { + return array( + TaxSystem::COMMON => 'ОСН', + TaxSystem::SIMPLIFIED_IN => 'УСН доход', + TaxSystem::SIMPLIFIED_IN_OUT => 'УСН доход - расход', + TaxSystem::UST => 'ЕСХН', + TaxSystem::PATENT => 'Патент' + ); + } + + public function vatRates() + { + return array( + Vat::RATE_NO => 'Без НДС', + Vat::RATE_0 => 'НДС 0%', + Vat::RATE_10 => 'НДС 10%', + Vat::RATE_20 => 'НДС 20%', + Vat::RATE_110 => 'НДС 10/110%', + Vat::RATE_120 => 'НДС 20/120%' + ); + } + + # Собираем позиции для чека, если параметры соответствуют условиям, иначе прерываем процесс фискализации + public function setPositionProps($order, $order_id, $position, $calculation_subject = CalculationSubject::PRODUCT) + { + // var_dump($this->report->get_check_calculation_method($order_id)); + // die(); + if ($order->get_status() == get_option('komtetkassa_fiscalize_pre_payment_full')) { + $position->setCalculationSubject(CalculationSubject::PAYMENT); + $position->setCalculationMethod(CalculationMethod::PRE_PAYMENT_FULL); + + return $position; + } elseif ($order->get_status() == get_option('komtetkassa_fiscalize_full_payment')) { + if ((get_option('komtetkassa_fiscalize_pre_payment_full') == 'no_check') || + ($this->report->get_check_calculation_method($order_id) == CalculationMethod::PRE_PAYMENT_FULL) + ) { + $position->setCalculationSubject($calculation_subject); + $position->setCalculationMethod(CalculationMethod::FULL_PAYMENT); + + return $position; + } + } else { + return; + } + } + + public function setPaymentProps($order) + { + if ( + ($order->get_status() == get_option('komtetkassa_fiscalize_pre_payment_full')) || + ($order->get_status() == get_option('komtetkassa_fiscalize_full_payment') and + (get_option('komtetkassa_fiscalize_pre_payment_full') == 'no_check')) + ) { + $payment = new Payment(Payment::TYPE_CARD, floatval($order->get_total())); + } elseif ( + $order->get_status() == get_option('komtetkassa_fiscalize_full_payment') + ) { + $payment = new Payment(Payment::TYPE_PREPAYMENT, floatval($order->get_total())); + } + + return $payment; + } public function fiscalize($order_id) { $order = wc_get_order($order_id); + if (!$order) { return; } + // var_dump($order->get_payment_method() == true); + // die(); + + if (!in_array($order->get_payment_method(), get_option("komtet_kassa_payment_systems"))) { + return; + } + $tax_system = intval(get_option('komtetkassa_tax_system')); + $product_vat_rate = intval(get_option('komtetkassa_product_vat_rate')); + $delivery_vat_rate = intval(get_option('komtetkassa_delivery_vat_rate')); $clientContact = ""; + if ($order->get_billing_email()) { $clientContact = $order->get_billing_email(); } else { @@ -137,60 +208,87 @@ public function fiscalize($order_id) $check->setShouldPrint(get_option('komtetkassa_should_print')); - if (sizeof($order->get_items()) > 0 ) { + if (sizeof($order->get_items()) > 0) { foreach ($order->get_items('line_item') as $item) { - $check->addPosition(new Position( - $item->get_name(), - $order->get_item_total($item, true, true), - $item->get_quantity(), - $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) - )); + $position = new Position( + $item->get_name(), + $order->get_item_total($item, true, true), + $item->get_quantity(), + $order->get_line_total($item, true, true), + new Vat($product_vat_rate) + ); + + $position = self::setPositionProps($order, $order_id, $position); + + if ($position) { + $check->addPosition($position); + } else { + return; + } } + // shipping foreach ($order->get_items('shipping') as $item) { - $check->addPosition(new Position( + $deliveryPosition = new Position( $item->get_name(), $order->get_item_total($item, true, true), $item->get_quantity(), $order->get_line_total($item, true, true), - self::DISCOUNT_NOT_AVAILABLE, - new Vat(Vat::RATE_NO) - )); + new Vat($delivery_vat_rate) + ); + + $deliveryPosition = self::setPositionProps( + $order, + $order_id, + $deliveryPosition, + $calculation_subject = CalculationSubject::SERVICE + ); + + if ($deliveryPosition) { + $check->addPosition($deliveryPosition); + } else { + return; + } } } - $payment = new Payment(Payment::TYPE_CARD, floatval($order->get_total())); + $payment = self::setPaymentProps($order); $check->addPayment($payment); $error_message = ""; $response = null; try { $response = $this->queueManager->putCheck($check); + } catch (ApiValidationException $e) { + $error_message = $e->getMessage() . " " . $e->getDescription(); } catch (SdkException $e) { $error_message = $e->getMessage(); + } catch (ClientException $e) { + $error_message = $e->getMessage(); } do_action('komtet_kassa_report_create', $order_id, $check->asArray(), $response, $error_message); } - public function add_query_vars($vars) { + public function add_query_vars($vars) + { $vars[] = 'komtet-kassa'; return $vars; } - public static function add_endpoint() { - add_rewrite_endpoint('komtet-kassa', EP_ALL); + public static function add_endpoint() + { + add_rewrite_endpoint('komtet-kassa', EP_ALL); } - public function handle_requests() { + public function handle_requests() + { global $wp; if (empty($wp->query_vars['komtet-kassa'])) { - return; + return; } - $komtet_kassa_action = strtolower(wc_clean( $wp->query_vars['komtet-kassa'])); + $komtet_kassa_action = strtolower(wc_clean($wp->query_vars['komtet-kassa'])); do_action('komtet_kassa_action_' . $komtet_kassa_action); die(-1); } @@ -205,7 +303,8 @@ public function action_fail() $this->handle_action('fail'); } - public function handle_action($action) { + public function handle_action($action) + { global $wp; if (!array_key_exists('HTTP_X_HMAC_SIGNATURE', $_SERVER)) { @@ -220,8 +319,8 @@ public function handle_action($action) { } if (empty($this->secret_key)) { - error_log('Unable to handle request: komtetkassa_secret_key is not defined'); - status_header(500); + error_log('Unable to handle request: komtetkassa_secret_key is not defined'); + status_header(500); } $scheme = array_key_exists('HTTPS', $_SERVER) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http'; @@ -230,9 +329,9 @@ public function handle_action($action) { $signature = hash_hmac('md5', $_SERVER['REQUEST_METHOD'] . $url . $data, $this->secret_key); - if ($signature != $this->request->server['HTTP_X_HMAC_SIGNATURE']) { + if ($signature != $this->request->server['HTTP_X_HMAC_SIGNATURE']) { status_header(403); - exit(); + exit(); } $data = json_decode($data, true); @@ -241,14 +340,14 @@ public function handle_action($action) { if (!array_key_exists($key, $data)) { status_header(422); header('Content-Type: text/plain'); - echo $key." is required\n"; + echo $key . " is required\n"; exit(); } } do_action('komtet_kassa_report_update', intval($data['external_id']), $data['state'], $data); } - public function report_create($order_id, $request_check_data, $response_data, $error="") + public function report_create($order_id, $request_check_data, $response_data, $error = "") { $this->report->create($order_id, $request_check_data, $response_data, $error); } @@ -259,8 +358,9 @@ public function report_update($order_id, $state, $report_data) } } -function Komtet_Kassa() { - return KomtetKassa::instance(); +function Komtet_Kassa() +{ + return KomtetKassa::instance(); } $GLOBALS['komtetkassa'] = Komtet_Kassa(); From a5c77392878b877534b6e00867b10dd1097a6234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Tue, 7 Jun 2022 15:32:34 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BC=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=20=D1=80=D0=B0=D1=81=D1=87=D1=91=D1=82=D0=B0=20=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.rst | 5 +- src/includes/views/html-admin-settings.php | 124 +++++++++++++++++++-- src/komtetkassa.php | 10 +- 3 files changed, 129 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e61540c..b05e637 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,4 +10,7 @@ Unreleased - Корректное отображение ошибки при создании чека в таблицах с отчётами - Версия php-sdk 9.0.2 - Возможность создания двух чеков (Полная предоплата и Полный расчёт) -- В настройки добавлена возможность указания ставки НДС для товаров и Доставки \ No newline at end of file +- В настройки добавлена возможность указания ставки НДС для товаров и Доставки +- В настройки добавлена инструкция по указанию предмета расчёта для товара +- Теперь номер телефона приводится к формату +7, 7 или 8 в начале +- Обработка предмета расчёта установленного в атрибуте товара \ No newline at end of file diff --git a/src/includes/views/html-admin-settings.php b/src/includes/views/html-admin-settings.php index 7ce9fba..f8547d8 100644 --- a/src/includes/views/html-admin-settings.php +++ b/src/includes/views/html-admin-settings.php @@ -6,7 +6,7 @@ ?>

Настройки

-
+
@@ -15,6 +15,7 @@ @@ -23,22 +24,24 @@ @@ -133,8 +136,115 @@
" /> +

Скопируйте из раздела Магазины

" /> +

Скопируйте из раздела Магазины

- + - /> + " /> +

Скопируйте из раздела Кассы

- + - " /> + />
-

+

-
\ No newline at end of file +
+ +
+ + + + +
+
+ Инструкция по изменению признака предмета расчёта: +
+

+ По 54-ФЗ, при продаже в кассовый чек должна попадать информация о признаке предмета расчета. + По умолчанию, из Wordpress в Комтет Кассу этот признак передается как "Товар" для всех товаров из каталога. +

+ +

+ Если продаёте в своём онлайн-магазине не товары, а, например, услуги и.т.д., то вы можете указать это в настройках + товара в Wordpress, чтобы в чек передавалась правильная информация. Это настраивается при помощи атрибутов. +

+

Порядок добавления атрибута к товару:

+ +
    +
  1. В панеле управления Wordpress перейдите в Товары(Products)-->Все товары(All Products);
  2. +
  3. Выберите необходимый товар --> Нажмите "Изменить"
  4. +
  5. В разделе "Данные товара" выберите "Артибуты" --> "Добавить";
  6. +
  7. В качестве имени аттрибута задайте komtet_kassa_product_type
  8. +
  9. В качестве значения аттрибута задайте одно значение из списка "Списка поддерживаемых признаков расчёта" ниже
  10. +
  11. Нажмите Сохранить(Save);
  12. +
+ +

Список поддерживаемых признаков расчёта:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ЗначениеОписание
productТовар, за исключением подакцизного товара
product_practicalПодакцизный товар
workРабота
serviceУслуга
lottery_bet + Прием денежных средств при реализации лотерейных билетов, электронных лотерейных билетов, приеме лотерейных ставок при осуществлении деятельности по проведению лотерей +
lottery_win + Выплате денежных средств в виде выигрыша при осуществлении деятельности по проведению лотерей +
rid + Предоставление прав на использование результатов интеллектуальной деятельности или средств индивидуализации «ПРЕДОСТАВЛЕНИЕ РИД» или «РИД» +
payment + Об авансе, задатке, предоплате, кредите, взносе в счет оплаты, пени, штрафе, вознаграждении, бонусе и ином аналогичном предмете расчета +
commission + Вознаграждении пользователя, являющегося платежным агентом (субагентом), банковским платежным агентом (субагентом), комиссионером, поверенным или иным агентом +
property_rightПередача имущественного права
non_operatingВнереализационный доход
insuranceСтраховые взносы
sales_taxТорговый сбор
resort_feeКурортный сбор
+
+
+
+
diff --git a/src/komtetkassa.php b/src/komtetkassa.php index f2d6523..6f332fb 100644 --- a/src/komtetkassa.php +++ b/src/komtetkassa.php @@ -201,7 +201,7 @@ public function fiscalize($order_id) $clientContact = $order->get_billing_email(); } else { $clientContact = $order->get_billing_phone(); - $clientContact = mb_eregi_replace("[^0-9]", '', $clientContact); + $clientContact = mb_eregi_replace("[^+0-9]", '', $clientContact); } $check = new Check($order_id, $clientContact, Check::INTENT_SELL, $tax_system); @@ -218,7 +218,13 @@ public function fiscalize($order_id) new Vat($product_vat_rate) ); - $position = self::setPositionProps($order, $order_id, $position); + $product = wc_get_product($item->get_product_id()); + + if ($komtet_kassa_product_type = $product->get_attribute('komtet_kassa_product_type')) { + $position = self::setPositionProps($order, $order_id, $position, $calculation_subject = $komtet_kassa_product_type); + } else { + $position = self::setPositionProps($order, $order_id, $position); + } if ($position) { $check->addPosition($position); From 1b11981cfa6c76a495ab13096ef6f30d85d8b670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Tue, 7 Jun 2022 15:55:01 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8,?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D0=BD=D1=8F=D0=BB=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.rst | 2 +- src/includes/class-komtetkassa-admin-settings.php | 8 -------- src/includes/views/html-admin-settings.php | 11 +++-------- src/komtetkassa.php | 4 ++-- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b05e637..ca3d85f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,7 +4,7 @@ Changelog Unreleased ---------- -1.3.0 (01.06.2022) +1.4.0 (01.06.2022) ------------------- - Корректное отображение ошибки при создании чека в таблицах с отчётами diff --git a/src/includes/class-komtetkassa-admin-settings.php b/src/includes/class-komtetkassa-admin-settings.php index 12501fa..133cc53 100644 --- a/src/includes/class-komtetkassa-admin-settings.php +++ b/src/includes/class-komtetkassa-admin-settings.php @@ -37,15 +37,7 @@ public static function save() } else if ($type == 'integer') { update_option($key, intval($value)); } else if ($type == 'array') { - // var_dump($_POST[$key]); die(); - // update_option($key, $value); if (isset($_POST[$key]) && array_key_exists($key, $_POST)) { - // $new_arr = array(); - // foreach ($_POST[$key] as $val) { - // $new_arr[] = sanitize_text_field( - // strip_tags(stripslashes($val)) - // ); - // } update_option($key, $_POST[$key]); } } diff --git a/src/includes/views/html-admin-settings.php b/src/includes/views/html-admin-settings.php index f8547d8..3641ee8 100644 --- a/src/includes/views/html-admin-settings.php +++ b/src/includes/views/html-admin-settings.php @@ -87,13 +87,8 @@