first commit

This commit is contained in:
O K
2025-06-17 14:01:03 +03:00
commit 7f951e6c23
11 changed files with 1754 additions and 0 deletions

View File

@@ -0,0 +1,258 @@
{{ header }}{{ column_left }}
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="pull-right"> {# Bootstrap 3 uses pull-right #}
<button type="submit" form="form-payment-hutko" data-toggle="tooltip" title="{{ button_save }}" class="btn btn-primary"><i class="fa fa-save"></i></button> {# Font Awesome icons common in OC3 #}
<a href="{{ cancel }}" data-toggle="tooltip" title="{{ button_cancel }}" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
<h1>{{ heading_title }}</h1>
<ul class="breadcrumb"> {# Bootstrap 3 breadcrumb structure #}
{% for breadcrumb in breadcrumbs %}
<li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="container-fluid">
{% if error_warning %}
<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}
<button type="button" class="close" data-dismiss="alert">×</button> {# Bootstrap 3 dismiss #}
</div>
{% endif %}
<div class="panel panel-default"> {# Bootstrap 3 panel #}
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-pencil"></i> {{ text_edit }}</h3>
</div>
<div class="panel-body">
<form action="{{ action }}" method="post" enctype="multipart/form-data" id="form-payment-hutko" class="form-horizontal"> {# Bootstrap 3 form-horizontal common #}
{# Tab Navigation for Bootstrap 3 #}
<ul class="nav nav-tabs">
<li class="active"><a href="#tab-general" data-toggle="tab">{{ tab_general }}</a></li>
<li><a href="#tab-order-statuses" data-toggle="tab">{{ tab_order_statuses }}</a></li>
<li><a href="#tab-fiscalization" data-toggle="tab">{{ tab_fiscalization }}</a></li>
<li><a href="#tab-advanced" data-toggle="tab">{{ tab_advanced }}</a></li>
<li><a href="#tab-logs" data-toggle="tab">{{ tab_logs }}</a></li>
</ul>
{# Tab Content for Bootstrap 3 #}
<div class="tab-content">
<div class="tab-pane active" id="tab-general">
{# General Settings Fields - Bootstrap 3 form-group structure #}
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-merchant-id">{{ entry_merchant_id }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_merchant_id" value="{{ payment_hutko_merchant_id }}" placeholder="{{ entry_merchant_id }}" id="input-merchant-id" class="form-control"/>
<span class="help-block">{{ text_info_merchant }}</span> {# Bootstrap 3 help-block #}
{% if error_merchant_id %}
<div class="text-danger">{{ error_merchant_id }}</div>
{% endif %}
</div>
</div>
<div class="form-group required">
<label class="col-sm-2 control-label" for="input-secret-key">{{ entry_secret_key }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_secret_key" value="{{ payment_hutko_secret_key }}" placeholder="{{ entry_secret_key }}" id="input-secret-key" class="form-control"/>
<span class="help-block">{{ text_info_secret }}</span>
{% if error_secret_key %}
<div class="text-danger">{{ error_secret_key }}</div>
{% endif %}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-total">{{ entry_total }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_total" value="{{ payment_hutko_total }}" placeholder="{{ entry_total }}" id="input-total" class="form-control"/>
<span class="help-block">{{ help_total }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-geo-zone">{{ entry_geo_zone }}</label>
<div class="col-sm-10">
<select name="payment_hutko_geo_zone_id" id="input-geo-zone" class="form-control">
<option value="0">{{ text_all_zones }}</option>
{% for geo_zone in geo_zones %}
{% if geo_zone.geo_zone_id == payment_hutko_geo_zone_id %}
<option value="{{ geo_zone.geo_zone_id }}" selected="selected">{{ geo_zone.name }}</option>
{% else %}
<option value="{{ geo_zone.geo_zone_id }}">{{ geo_zone.name }}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-status">{{ entry_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_status" id="input-status" class="form-control">
{% if payment_hutko_status %}
<option value="1" selected="selected">{{ text_enabled }}</option>
<option value="0">{{ text_disabled }}</option>
{% else %}
<option value="1">{{ text_enabled }}</option>
<option value="0" selected="selected">{{ text_disabled }}</option>
{% endif %}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-sort-order">{{ entry_sort_order }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_sort_order" value="{{ payment_hutko_sort_order }}" placeholder="{{ entry_sort_order }}" id="input-sort-order" class="form-control"/>
</div>
</div>
</div>
<div class="tab-pane" id="tab-order-statuses">
{# Order Statuses Fields #}
<div class="form-group">
<label class="col-sm-2 control-label" for="input-new-order-status">{{ entry_new_order_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_new_order_status_id" id="input-new-order-status" class="form-control">
{% for order_status in order_statuses %}
{% if order_status.order_status_id == payment_hutko_new_order_status_id %}
<option value="{{ order_status.order_status_id }}" selected="selected">{{ order_status.name }}</option>
{% else %}
<option value="{{ order_status.order_status_id }}">{{ order_status.name }}</option>
{% endif %}
{% endfor %}
</select>
<span class="help-block">{{ help_new_order_status }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-success-status">{{ entry_success_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_success_status_id" id="input-success-status" class="form-control">
{% for order_status in order_statuses %}
{% if order_status.order_status_id == payment_hutko_success_status_id %}
<option value="{{ order_status.order_status_id }}" selected="selected">{{ order_status.name }}</option>
{% else %}
<option value="{{ order_status.order_status_id }}">{{ order_status.name }}</option>
{% endif %}
{% endfor %}
</select>
<span class="help-block">{{ help_success_status }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-declined-status">{{ entry_declined_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_declined_status_id" id="input-declined-status" class="form-control">
{% for order_status in order_statuses %}
{% if order_status.order_status_id == payment_hutko_declined_status_id %}
<option value="{{ order_status.order_status_id }}" selected="selected">{{ order_status.name }}</option>
{% else %}
<option value="{{ order_status.order_status_id }}">{{ order_status.name }}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-expired-status">{{ entry_expired_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_expired_status_id" id="input-expired-status" class="form-control">
{% for order_status in order_statuses %}
{% if order_status.order_status_id == payment_hutko_expired_status_id %}
<option value="{{ order_status.order_status_id }}" selected="selected">{{ order_status.name }}</option>
{% else %}
<option value="{{ order_status.order_status_id }}">{{ order_status.name }}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-refunded-status">{{ entry_refunded_status }}</label>
<div class="col-sm-10">
<select name="payment_hutko_refunded_status_id" id="input-refunded-status" class="form-control">
{% for order_status in order_statuses %}
{% if order_status.order_status_id == payment_hutko_refunded_status_id %}
<option value="{{ order_status.order_status_id }}" selected="selected">{{ order_status.name }}</option>
{% else %}
<option value="{{ order_status.order_status_id }}">{{ order_status.name }}</option>
{% endif %}
{% endfor %}
</select>
</div>
</div>
</div>
<div class="tab-pane" id="tab-fiscalization">
{# Fiscalization Fields #}
<div class="form-group">
<label class="col-sm-2 control-label">{{ entry_shipping_include }}</label>
<div class="col-sm-10">
<label class="radio-inline"> {# Bootstrap 3 radio-inline #}
<input type="radio" name="payment_hutko_shipping_include" value="1" {% if payment_hutko_shipping_include == '1' %}checked="checked"{% endif %} />
{{ text_yes }}
</label>
<label class="radio-inline">
<input type="radio" name="payment_hutko_shipping_include" value="0" {% if payment_hutko_shipping_include == '0' or payment_hutko_shipping_include == '' %}checked="checked"{% endif %} />
{{ text_no }}
</label>
<span class="help-block">{{ help_shipping_include }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-shipping-product-name">{{ entry_shipping_product_name }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_shipping_product_name" value="{{ payment_hutko_shipping_product_name }}" placeholder="{{ entry_shipping_product_name }}" id="input-shipping-product-name" class="form-control"/>
<span class="help-block">{{ help_shipping_product_name }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-shipping-product-code">{{ entry_shipping_product_code }}</label>
<div class="col-sm-10">
<input type="text" name="payment_hutko_shipping_product_code" value="{{ payment_hutko_shipping_product_code }}" placeholder="{{ entry_shipping_product_code }}" id="input-shipping-product-code" class="form-control"/>
<span class="help-block">{{ help_shipping_product_code }}</span>
</div>
</div>
</div>
<div class="tab-pane" id="tab-advanced">
{# Advanced Settings Fields #}
<div class="form-group">
<label class="col-sm-2 control-label">{{ entry_include_discount_to_total }}</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="payment_hutko_include_discount_to_total" value="1" {% if payment_hutko_include_discount_to_total == '1' %}checked="checked"{% endif %} />
{{ text_yes }}
</label>
<label class="radio-inline">
<input type="radio" name="payment_hutko_include_discount_to_total" value="0" {% if payment_hutko_include_discount_to_total == '0' or payment_hutko_include_discount_to_total == '' %}checked="checked"{% endif %} />
{{ text_no }}
</label>
<span class="help-block">{{ help_include_discount_to_total }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">{{ entry_save_logs }}</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="payment_hutko_save_logs" value="1" {% if payment_hutko_save_logs == '1' %}checked="checked"{% endif %} />
{{ text_yes }}
</label>
<label class="radio-inline">
<input type="radio" name="payment_hutko_save_logs" value="0" {% if payment_hutko_save_logs == '0' or payment_hutko_save_logs == '' %}checked="checked"{% endif %} />
{{ text_no }}
</label>
<span class="help-block">{{ help_save_logs }}</span>
</div>
</div>
</div>
<div class="tab-pane" id="tab-logs">
{# Logs Content #}
<h4>{{ heading_title }} - {{ tab_logs }}</h4>
<div id="log-viewer">
{{ log_content|raw }}
</div>
</div>
</div> {# End tab-content #}
</form>
</div> {# End panel-body #}
</div> {# End panel #}
</div> {# End container-fluid #}
</div> {# End content #}
{{ footer }}

View File

@@ -0,0 +1,129 @@
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
<i class="fa fa-credit-card"></i>
{{ text_payment_information }}
(Hutko)</h3>
</div>
<div class="panel-body">
<table class="table table-bordered">
<tr>
<td>{{ text_hutko_transaction_ref_label }}</td>
<td id="hutko-transaction-id-cell">{{ hutko_transaction_ref_display }}</td>
</tr>
</table>
{# Refund Section #}
{% if hutko_transaction_ref_display != text_not_available %}
<div id="hutko-refund-section" style="margin-top:15px; padding-top:15px; border-top: 1px solid #eee;">
<h4>{{ text_hutko_refund_title }}</h4>
<div class="form-horizontal">
<div class="form-group">
<label class="col-sm-3 control-label" for="input-refund-amount">{{ entry_refund_amount }}</label>
<div class="col-sm-9">
<input type="text" name="hutko_refund_amount" value="" placeholder="{{ entry_refund_amount }}" id="input-refund-amount" class="form-control"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="input-refund-comment">{{ entry_refund_comment }}</label>
<div class="col-sm-9">
<textarea name="hutko_refund_comment" placeholder="{{ entry_refund_comment }}" id="input-refund-comment" class="form-control" rows="3"></textarea>
</div>
</div>
<div class="form-group">
<div class="col-sm-9 col-sm-offset-3">
<button type="button" id="button-hutko-refund" data-loading-text="{{ text_loading }}" class="btn btn-primary">{{ button_hutko_refund }}</button>
</div>
</div>
</div>
<div id="hutko-refund-response" style="margin-top:10px;"></div>
</div>
{% endif %}
{# Status Check Section #}
{% if hutko_transaction_ref_display != text_not_available %}
<div id="hutko-status-check-section" style="margin-top:15px; padding-top:15px; border-top: 1px solid #eee;">
<h4>{{ text_hutko_status_title }}</h4>
<button type="button" id="button-hutko-status" data-loading-text="{{ text_loading }}" class="btn btn-info">{{ button_hutko_status_check }}</button>
<div id="hutko-status-response" style="margin-top:10px; white-space: pre-wrap; max-height: 300px; overflow-y: auto; background: #f5f5f5; padding: 10px; border: 1px solid #ddd;"></div>
</div>
{% endif %}
<script
type="text/javascript">
<!--
$(document).ready(function () { // Ensure DOM is ready for these bindings
$('#button-hutko-refund').on('click', function () {
if (confirm('{{ text_confirm_refund }}')) {
$.ajax({
url: '{{ hutko_refund_action_url|raw }}&user_token={{ user_token_value|raw }}',
type: 'post',
dataType: 'json',
data: {
'refund_amount': $('#input-refund-amount').val(),
'refund_comment': $('#input-refund-comment').val(),
'hutko_transaction_ref': '{{ hutko_transaction_ref_display }}',
'order_id': {{ order_id }}
},
beforeSend: function () {
$('#button-hutko-refund').button('loading');
$('#hutko-refund-response').html('');
},
complete: function () {
$('#button-hutko-refund').button('reset');
},
success: function (json) {
$('#hutko-refund-response').parent().find('.alert-dismissible').remove(); // Clear previous alerts in this section
if (json['error']) {
$('#hutko-refund-response').html('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '<button type="button" class="close" data-dismiss="alert">×</button></div>');
}
if (json['success']) {
$('#hutko-refund-response').html('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + '<button type="button" class="close" data-dismiss="alert">×</button></div>');
setTimeout(function () { // More targeted reload if history is in a specific container
if ($('#history').length) {
$('#history').load('index.php?route=sale/order/history&user_token={{ user_token }}&order_id={{ order_id }}');
} else {
location.reload();
}
}, 2000);
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
}
});
$('#button-hutko-status').on('click', function () {
$.ajax({
url: '{{ hutko_status_action_url|raw }}&user_token={{ user_token_value|raw }}&order_id={{ order_id|raw }}',
type: 'post', // Your status function in controller expects POST if order_id is not enough
dataType: 'json',
data: {'hutko_transaction_ref': '{{ hutko_transaction_ref_display }}'}, // If order_id in URL is sufficient, otherwise pass {'hutko_transaction_ref': '{{ hutko_transaction_ref_display }}' }
beforeSend: function () {
$('#button-hutko-status').button('loading');
$('#hutko-status-response').html('');
},
complete: function () {
$('#button-hutko-status').button('reset');
},
success: function (json) {
$('#hutko-status-response').parent().find('.alert-dismissible').remove(); // Clear previous alerts
if (json['error']) {
$('#hutko-status-response').html('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '<button type="button" class="close" data-dismiss="alert">×</button></div>');
}
if (json['success']) {
let responseData = json['data'] ? JSON.stringify(json['data'], null, 2) : 'No additional data.';
$('#hutko-status-response').html('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + '<button type="button" class="close" data-dismiss="alert">×</button><br><pre style="max-height: 200px; overflow-y:auto; word-wrap: break-word;">' + responseData.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + '</pre></div>');
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
});
});
//--></script>
</div>
</div>