django-cfg 1.3.1__py3-none-any.whl → 1.3.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +1 -1
- django_cfg/apps/payments/admin_interface/old/payments/base.html +175 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +125 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +113 -0
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +35 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +309 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +303 -0
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +382 -0
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +518 -0
- django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/components.css +248 -9
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +163 -0
- django_cfg/apps/payments/admin_interface/serializers/__init__.py +39 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +149 -0
- django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +114 -0
- django_cfg/apps/payments/admin_interface/templates/payments/base.html +55 -90
- django_cfg/apps/payments/admin_interface/templates/payments/components/dialog.html +81 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_help_dialog.html +112 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +175 -0
- django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +21 -17
- django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +123 -250
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +170 -269
- django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +152 -355
- django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +202 -551
- django_cfg/apps/payments/admin_interface/views/__init__.py +25 -14
- django_cfg/apps/payments/admin_interface/views/api/__init__.py +20 -0
- django_cfg/apps/payments/admin_interface/views/api/payments.py +191 -0
- django_cfg/apps/payments/admin_interface/views/api/stats.py +206 -0
- django_cfg/apps/payments/admin_interface/views/api/users.py +60 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +257 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +70 -0
- django_cfg/apps/payments/admin_interface/views/base.py +114 -0
- django_cfg/apps/payments/admin_interface/views/dashboard.py +60 -0
- django_cfg/apps/payments/admin_interface/views/forms.py +94 -0
- django_cfg/apps/payments/config/helpers.py +2 -2
- django_cfg/apps/payments/management/commands/cleanup_expired_data.py +429 -0
- django_cfg/apps/payments/management/commands/currency_stats.py +443 -0
- django_cfg/apps/payments/management/commands/manage_currencies.py +9 -20
- django_cfg/apps/payments/management/commands/manage_providers.py +5 -5
- django_cfg/apps/payments/management/commands/process_pending_payments.py +357 -0
- django_cfg/apps/payments/management/commands/test_providers.py +434 -0
- django_cfg/apps/payments/middleware/api_access.py +35 -34
- django_cfg/apps/payments/migrations/0001_initial.py +1 -1
- django_cfg/apps/payments/models/balance.py +5 -2
- django_cfg/apps/payments/models/managers/api_key_managers.py +6 -2
- django_cfg/apps/payments/models/managers/balance_managers.py +3 -3
- django_cfg/apps/payments/models/managers/payment_managers.py +5 -0
- django_cfg/apps/payments/models/managers/subscription_managers.py +3 -3
- django_cfg/apps/payments/models/subscriptions.py +0 -24
- django_cfg/apps/payments/services/cache/__init__.py +1 -1
- django_cfg/apps/payments/services/cache_service/__init__.py +143 -0
- django_cfg/apps/payments/services/cache_service/api_key_cache.py +37 -0
- django_cfg/apps/payments/services/cache_service/interfaces.py +32 -0
- django_cfg/apps/payments/services/cache_service/keys.py +49 -0
- django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +47 -0
- django_cfg/apps/payments/services/cache_service/simple_cache.py +101 -0
- django_cfg/apps/payments/services/core/balance_service.py +13 -2
- django_cfg/apps/payments/services/core/payment_service.py +49 -22
- django_cfg/apps/payments/services/integrations/ngrok_service.py +3 -3
- django_cfg/apps/payments/services/providers/registry.py +20 -0
- django_cfg/apps/payments/signals/api_key_signals.py +2 -2
- django_cfg/apps/payments/signals/balance_signals.py +8 -5
- django_cfg/apps/payments/static/payments/js/api-client.js +385 -0
- django_cfg/apps/payments/static/payments/js/ngrok-status.js +58 -0
- django_cfg/apps/payments/static/payments/js/payment-dashboard.js +50 -0
- django_cfg/apps/payments/static/payments/js/payment-form.js +175 -0
- django_cfg/apps/payments/static/payments/js/payment-list.js +95 -0
- django_cfg/apps/payments/static/payments/js/webhook-dashboard.js +154 -0
- django_cfg/apps/payments/urls.py +4 -0
- django_cfg/apps/payments/urls_admin.py +37 -18
- django_cfg/apps/payments/views/api/api_keys.py +14 -0
- django_cfg/apps/payments/views/api/base.py +1 -0
- django_cfg/apps/payments/views/api/currencies.py +2 -2
- django_cfg/apps/payments/views/api/payments.py +11 -5
- django_cfg/apps/payments/views/api/subscriptions.py +36 -31
- django_cfg/apps/payments/views/overview/__init__.py +40 -0
- django_cfg/apps/payments/views/overview/serializers.py +205 -0
- django_cfg/apps/payments/views/overview/services.py +439 -0
- django_cfg/apps/payments/views/overview/urls.py +27 -0
- django_cfg/apps/payments/views/overview/views.py +231 -0
- django_cfg/apps/payments/views/serializers/api_keys.py +20 -6
- django_cfg/apps/payments/views/serializers/balances.py +5 -8
- django_cfg/apps/payments/views/serializers/currencies.py +2 -6
- django_cfg/apps/payments/views/serializers/payments.py +37 -32
- django_cfg/apps/payments/views/serializers/subscriptions.py +4 -26
- django_cfg/apps/urls.py +2 -1
- django_cfg/core/config.py +25 -15
- django_cfg/core/generation.py +12 -12
- django_cfg/core/integration/display/startup.py +1 -1
- django_cfg/core/validation.py +4 -4
- django_cfg/management/commands/show_config.py +2 -2
- django_cfg/management/commands/tree.py +1 -3
- django_cfg/middleware/__init__.py +2 -0
- django_cfg/middleware/static_nocache.py +55 -0
- django_cfg/models/payments.py +13 -15
- django_cfg/models/security.py +15 -0
- django_cfg/modules/django_ngrok.py +6 -0
- django_cfg/modules/django_unfold/dashboard.py +1 -3
- django_cfg/utils/smart_defaults.py +51 -5
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/METADATA +1 -1
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/RECORD +111 -69
- django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +0 -38
- django_cfg/apps/payments/admin_interface/views/payment_views.py +0 -259
- django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +0 -37
- django_cfg/apps/payments/services/cache/cache_service.py +0 -235
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/loading_spinner.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/notification.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/provider_card.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/currency_converter.html +0 -0
- /django_cfg/apps/payments/admin_interface/{templates → old}/payments/payment_status.html +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/dashboard.css +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/components.js +0 -0
- /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/utils.js +0 -0
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.1.dist-info → django_cfg-1.3.5.dist-info}/licenses/LICENSE +0 -0
@@ -1,303 +1,204 @@
|
|
1
1
|
{% extends 'payments/base.html' %}
|
2
2
|
{% load static %}
|
3
3
|
|
4
|
-
{% block title %}Create Payment -
|
4
|
+
{% block title %}Create Payment - Payment Admin{% endblock %}
|
5
5
|
|
6
6
|
{% block page_title %}Create New Payment{% endblock %}
|
7
|
-
{% block page_subtitle %}
|
8
|
-
|
9
|
-
{% block extra_css %}
|
10
|
-
<style>
|
11
|
-
.currency-option {
|
12
|
-
display: flex;
|
13
|
-
align-items: center;
|
14
|
-
padding: 8px 12px;
|
15
|
-
border-radius: 6px;
|
16
|
-
transition: all 0.2s ease;
|
17
|
-
}
|
18
|
-
|
19
|
-
.currency-option:hover {
|
20
|
-
background-color: rgba(59, 130, 246, 0.1);
|
21
|
-
}
|
22
|
-
|
23
|
-
.currency-icon {
|
24
|
-
width: 24px;
|
25
|
-
height: 24px;
|
26
|
-
border-radius: 50%;
|
27
|
-
margin-right: 8px;
|
28
|
-
display: flex;
|
29
|
-
align-items: center;
|
30
|
-
justify-content: center;
|
31
|
-
font-size: 12px;
|
32
|
-
}
|
33
|
-
|
34
|
-
.provider-card {
|
35
|
-
border: 2px solid transparent;
|
36
|
-
cursor: pointer;
|
37
|
-
transition: all 0.2s ease;
|
38
|
-
}
|
39
|
-
|
40
|
-
.provider-card:hover {
|
41
|
-
border-color: rgba(59, 130, 246, 0.3);
|
42
|
-
transform: translateY(-1px);
|
43
|
-
}
|
44
|
-
|
45
|
-
.provider-card.selected {
|
46
|
-
border-color: #3b82f6;
|
47
|
-
background-color: rgba(59, 130, 246, 0.05);
|
48
|
-
}
|
49
|
-
</style>
|
50
|
-
{% endblock %}
|
7
|
+
{% block page_subtitle %}Create a new payment request{% endblock %}
|
51
8
|
|
52
9
|
{% block content %}
|
53
|
-
<div x-data="paymentForm()" x-init="init()"
|
54
|
-
|
55
|
-
|
56
|
-
<div class="
|
57
|
-
<div class="
|
58
|
-
<
|
59
|
-
<span class="material-icons-outlined text-sm">payment</span>
|
60
|
-
</div>
|
61
|
-
<span class="ml-2 text-sm font-medium text-blue-600">Payment Details</span>
|
62
|
-
</div>
|
63
|
-
<div class="w-16 h-0.5 bg-gray-300"></div>
|
64
|
-
<div class="flex items-center">
|
65
|
-
<div class="w-8 h-8 bg-gray-300 text-gray-500 rounded-full flex items-center justify-center">
|
66
|
-
<span class="material-icons-outlined text-sm">account_balance</span>
|
67
|
-
</div>
|
68
|
-
<span class="ml-2 text-sm font-medium text-gray-500">Provider Selection</span>
|
69
|
-
</div>
|
70
|
-
<div class="w-16 h-0.5 bg-gray-300"></div>
|
71
|
-
<div class="flex items-center">
|
72
|
-
<div class="w-8 h-8 bg-gray-300 text-gray-500 rounded-full flex items-center justify-center">
|
73
|
-
<span class="material-icons-outlined text-sm">check_circle</span>
|
74
|
-
</div>
|
75
|
-
<span class="ml-2 text-sm font-medium text-gray-500">Confirmation</span>
|
76
|
-
</div>
|
77
|
-
</div>
|
78
|
-
</div>
|
79
|
-
|
80
|
-
<form @submit.prevent="submitForm()" class="space-y-8">
|
81
|
-
{% csrf_token %}
|
82
|
-
|
83
|
-
<!-- Payment Details Card -->
|
84
|
-
<div class="payment-card">
|
85
|
-
<div class="payment-card-header">
|
86
|
-
<h2 class="payment-card-title">
|
87
|
-
<span class="material-icons-outlined">payments</span>
|
88
|
-
Payment Details
|
89
|
-
</h2>
|
10
|
+
<div x-data="paymentForm()" x-init="init()">
|
11
|
+
<div class="max-w-2xl mx-auto">
|
12
|
+
<!-- Form Card -->
|
13
|
+
<div class="bg-white dark:bg-gray-800 shadow rounded-lg">
|
14
|
+
<div class="px-6 py-4 border-b border-gray-200 dark:border-gray-700">
|
15
|
+
<h3 class="text-lg font-medium text-gray-900 dark:text-white">Payment Details</h3>
|
90
16
|
</div>
|
91
17
|
|
92
|
-
<
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
step="0.01"
|
104
|
-
min="0.01"
|
105
|
-
class="form-input pl-10"
|
106
|
-
:class="{ 'border-red-500': errors.amount }"
|
107
|
-
placeholder="0.00"
|
108
|
-
required>
|
109
|
-
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
|
110
|
-
<span class="text-gray-500 text-sm">$</span>
|
111
|
-
</div>
|
18
|
+
<form @submit.prevent="submitForm()" class="p-6 space-y-6">
|
19
|
+
{% csrf_token %}
|
20
|
+
|
21
|
+
<!-- Amount -->
|
22
|
+
<div>
|
23
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
24
|
+
Amount (USD)
|
25
|
+
</label>
|
26
|
+
<div class="relative">
|
27
|
+
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
|
28
|
+
<span class="text-gray-500 text-sm">$</span>
|
112
29
|
</div>
|
113
|
-
<
|
114
|
-
|
30
|
+
<input type="number"
|
31
|
+
x-model="form.amount_usd"
|
32
|
+
@input="onAmountOrCurrencyChange()"
|
33
|
+
step="0.01"
|
34
|
+
min="0.01"
|
35
|
+
class="block w-full pl-7 pr-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
|
36
|
+
placeholder="0.00"
|
37
|
+
required>
|
115
38
|
</div>
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
</select>
|
132
|
-
<div x-show="errors.currency" class="form-error" x-text="errors.currency"></div>
|
133
|
-
<div class="form-help">Choose the currency for your payment</div>
|
39
|
+
<p class="mt-1 text-sm text-gray-500">Minimum amount: $0.01</p>
|
40
|
+
|
41
|
+
<!-- Currency Conversion Result -->
|
42
|
+
<div x-show="conversionResult" class="mt-2 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md">
|
43
|
+
<div class="flex items-center text-sm">
|
44
|
+
<span class="material-icons-outlined text-blue-600 dark:text-blue-400 mr-2">currency_exchange</span>
|
45
|
+
<span class="text-blue-800 dark:text-blue-200">
|
46
|
+
$<span x-text="form.amount_usd"></span> USD =
|
47
|
+
<span x-text="conversionResult?.amount"></span>
|
48
|
+
<span x-text="conversionResult?.currency"></span>
|
49
|
+
</span>
|
50
|
+
</div>
|
51
|
+
<div class="text-xs text-blue-600 dark:text-blue-400 mt-1">
|
52
|
+
Rate: 1 USD = <span x-text="conversionResult?.rate"></span> <span x-text="conversionResult?.currency"></span>
|
53
|
+
</div>
|
134
54
|
</div>
|
135
55
|
</div>
|
136
56
|
|
137
|
-
<!--
|
138
|
-
<div
|
139
|
-
<label class="
|
140
|
-
|
141
|
-
Callback URL (Optional)
|
57
|
+
<!-- User Selection -->
|
58
|
+
<div>
|
59
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
60
|
+
User
|
142
61
|
</label>
|
143
|
-
<
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
62
|
+
<select x-model="form.user"
|
63
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
|
64
|
+
required>
|
65
|
+
<option value="">Select user...</option>
|
66
|
+
<template x-for="user in users" :key="user.id">
|
67
|
+
<option :value="user.id" x-text="`${user.username} (${user.email})`"></option>
|
68
|
+
</template>
|
69
|
+
</select>
|
150
70
|
</div>
|
151
|
-
</div>
|
152
|
-
</div>
|
153
71
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
72
|
+
<!-- Provider Selection -->
|
73
|
+
<div>
|
74
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
75
|
+
Payment Provider
|
76
|
+
</label>
|
77
|
+
<select x-model="form.provider"
|
78
|
+
@change="onProviderChange()"
|
79
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
|
80
|
+
required>
|
81
|
+
<template x-for="provider in providers" :key="provider.value">
|
82
|
+
<option :value="provider.value" x-text="provider.display_name"></option>
|
83
|
+
</template>
|
84
|
+
</select>
|
167
85
|
</div>
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
86
|
+
|
87
|
+
<!-- Currency Selection -->
|
88
|
+
<div>
|
89
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
90
|
+
Currency
|
91
|
+
<span x-show="loadingCurrencies" class="text-sm text-gray-500">(Loading...)</span>
|
92
|
+
</label>
|
93
|
+
<select x-model="form.currency_code"
|
94
|
+
@change="onAmountOrCurrencyChange()"
|
95
|
+
:disabled="loadingCurrencies || currencies.length === 0"
|
96
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white disabled:opacity-50"
|
97
|
+
required>
|
98
|
+
<option value="">Select currency...</option>
|
99
|
+
<template x-for="currency in currencies" :key="currency.code">
|
100
|
+
<option :value="currency.code">
|
101
|
+
<span x-text="currency.code"></span> -
|
102
|
+
<span x-text="currency.name"></span>
|
103
|
+
<span x-show="currency.type === 'crypto'" class="text-blue-600"> (Crypto)</span>
|
104
|
+
<span x-show="currency.network_name" class="text-gray-500" x-text="`[${currency.network_name}]`"></span>
|
105
|
+
</option>
|
106
|
+
</template>
|
107
|
+
</select>
|
108
|
+
<div x-show="currencies.length === 0 && !loadingCurrencies && form.provider"
|
109
|
+
class="mt-1 text-sm text-red-600">
|
110
|
+
No currencies available for selected provider
|
111
|
+
</div>
|
112
|
+
|
113
|
+
<!-- Currency Info -->
|
114
|
+
<div x-show="form.currency_code && getCurrencyInfo(form.currency_code)"
|
115
|
+
class="mt-2 p-3 bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-md">
|
116
|
+
<div class="text-sm text-gray-700 dark:text-gray-300">
|
117
|
+
<div class="flex items-center justify-between">
|
118
|
+
<span class="font-medium">Currency Details:</span>
|
119
|
+
<span x-text="getCurrencyInfo(form.currency_code)?.type === 'crypto' ? '🪙 Crypto' : '💵 Fiat'"></span>
|
182
120
|
</div>
|
183
|
-
|
184
|
-
|
185
|
-
<
|
186
|
-
<span class="material-icons-outlined mr-1" style="font-size: 14px;">security</span>
|
187
|
-
<span>Secure Processing</span>
|
188
|
-
</div>
|
189
|
-
<div class="flex items-center">
|
190
|
-
<span class="material-icons-outlined mr-1" style="font-size: 14px;">speed</span>
|
191
|
-
<span>Fast Confirmation</span>
|
192
|
-
</div>
|
193
|
-
<div class="flex items-center">
|
194
|
-
<span class="material-icons-outlined mr-1" style="font-size: 14px;">support</span>
|
195
|
-
<span>24/7 Support</span>
|
196
|
-
</div>
|
121
|
+
<div x-show="getCurrencyInfo(form.currency_code)?.network_name" class="mt-1">
|
122
|
+
<span class="text-gray-500">Network:</span>
|
123
|
+
<span x-text="getCurrencyInfo(form.currency_code)?.network_name"></span>
|
197
124
|
</div>
|
198
|
-
|
199
|
-
|
200
|
-
<
|
201
|
-
|
202
|
-
|
203
|
-
|
125
|
+
<div x-show="getCurrencyInfo(form.currency_code)?.min_amount || getCurrencyInfo(form.currency_code)?.max_amount" class="mt-1">
|
126
|
+
<span class="text-gray-500">Limits:</span>
|
127
|
+
<span x-show="getCurrencyInfo(form.currency_code)?.min_amount">
|
128
|
+
Min: $<span x-text="getCurrencyInfo(form.currency_code)?.min_amount"></span>
|
129
|
+
</span>
|
130
|
+
<span x-show="getCurrencyInfo(form.currency_code)?.max_amount">
|
131
|
+
Max: $<span x-text="getCurrencyInfo(form.currency_code)?.max_amount"></span>
|
132
|
+
</span>
|
133
|
+
</div>
|
134
|
+
<div x-show="getCurrencyInfo(form.currency_code)?.fee_percentage > 0 || getCurrencyInfo(form.currency_code)?.fixed_fee > 0" class="mt-1">
|
135
|
+
<span class="text-gray-500">Fees:</span>
|
136
|
+
<span x-show="getCurrencyInfo(form.currency_code)?.fee_percentage > 0">
|
137
|
+
<span x-text="(getCurrencyInfo(form.currency_code)?.fee_percentage * 100).toFixed(2)"></span>%
|
138
|
+
</span>
|
139
|
+
<span x-show="getCurrencyInfo(form.currency_code)?.fixed_fee > 0">
|
140
|
+
+ $<span x-text="getCurrencyInfo(form.currency_code)?.fixed_fee"></span>
|
141
|
+
</span>
|
204
142
|
</div>
|
205
143
|
</div>
|
206
|
-
</
|
144
|
+
</div>
|
207
145
|
</div>
|
208
|
-
|
209
|
-
<div x-show="errors.provider" class="form-error mt-4" x-text="errors.provider"></div>
|
210
|
-
<div class="form-help mt-4">Select a payment provider to process your transaction</div>
|
211
|
-
</div>
|
212
|
-
</div>
|
213
146
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
<div class="space-y-3">
|
225
|
-
<div class="flex justify-between items-center">
|
226
|
-
<span class="text-gray-600 dark:text-gray-400">Amount:</span>
|
227
|
-
<span class="font-medium" x-text="PaymentSystem.Utils.formatCurrency(formData.amount, formData.currency)"></span>
|
228
|
-
</div>
|
229
|
-
<div class="flex justify-between items-center">
|
230
|
-
<span class="text-gray-600 dark:text-gray-400">Currency:</span>
|
231
|
-
<span class="font-medium" x-text="formData.currency"></span>
|
232
|
-
</div>
|
233
|
-
<div class="flex justify-between items-center">
|
234
|
-
<span class="text-gray-600 dark:text-gray-400">Provider:</span>
|
235
|
-
<span class="font-medium" x-text="providers.find(p => p.name === formData.provider)?.display_name"></span>
|
236
|
-
</div>
|
237
|
-
<div x-show="formData.callback_url" class="flex justify-between items-center">
|
238
|
-
<span class="text-gray-600 dark:text-gray-400">Callback URL:</span>
|
239
|
-
<span class="font-medium text-xs break-all" x-text="formData.callback_url"></span>
|
240
|
-
</div>
|
147
|
+
|
148
|
+
<!-- Description -->
|
149
|
+
<div>
|
150
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
151
|
+
Description
|
152
|
+
</label>
|
153
|
+
<textarea x-model="form.description"
|
154
|
+
placeholder="Payment description..."
|
155
|
+
rows="3"
|
156
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"></textarea>
|
241
157
|
</div>
|
242
|
-
</div>
|
243
|
-
</div>
|
244
158
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
class="
|
255
|
-
|
256
|
-
<span x-show="!loading" class="material-icons-outlined">payment</span>
|
257
|
-
<span x-show="loading" class="loading-spinner sm mr-2"></span>
|
258
|
-
<span x-text="loading ? 'Creating Payment...' : 'Create Payment'"></span>
|
259
|
-
</button>
|
260
|
-
</div>
|
261
|
-
</form>
|
159
|
+
<!-- Callback URL (Optional) -->
|
160
|
+
<div>
|
161
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
162
|
+
Callback URL (Optional)
|
163
|
+
</label>
|
164
|
+
<input type="url"
|
165
|
+
x-model="form.callback_url"
|
166
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
|
167
|
+
placeholder="https://your-site.com/webhook">
|
168
|
+
<p class="mt-1 text-sm text-gray-500">URL to receive payment status updates</p>
|
169
|
+
</div>
|
262
170
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
171
|
+
<!-- Cancel URL (Optional) -->
|
172
|
+
<div>
|
173
|
+
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
174
|
+
Cancel URL (Optional)
|
175
|
+
</label>
|
176
|
+
<input type="url"
|
177
|
+
x-model="form.cancel_url"
|
178
|
+
class="block w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:text-white"
|
179
|
+
placeholder="https://your-site.com/cancel">
|
180
|
+
<p class="mt-1 text-sm text-gray-500">URL to redirect user if payment is cancelled</p>
|
181
|
+
</div>
|
182
|
+
|
183
|
+
<!-- Actions -->
|
184
|
+
<div class="flex justify-between pt-6">
|
185
|
+
<a href="{% url 'cfg_payments_admin:payment-list' %}"
|
186
|
+
class="px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 dark:bg-gray-700 dark:text-gray-300 dark:border-gray-600 dark:hover:bg-gray-600">
|
187
|
+
Cancel
|
188
|
+
</a>
|
189
|
+
<button type="submit"
|
190
|
+
:disabled="loading || !form.amount || !form.currency || !form.provider"
|
191
|
+
class="px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transparent rounded-md hover:bg-blue-700 focus:ring-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed">
|
192
|
+
<span x-show="!loading">Create Payment</span>
|
193
|
+
<span x-show="loading">Creating...</span>
|
194
|
+
</button>
|
195
|
+
</div>
|
196
|
+
</form>
|
275
197
|
</div>
|
276
198
|
</div>
|
277
199
|
</div>
|
278
200
|
{% endblock %}
|
279
201
|
|
280
202
|
{% block extra_js %}
|
281
|
-
<script>
|
282
|
-
// Add provider health check functions
|
283
|
-
function checkProviderHealth(providerName) {
|
284
|
-
PaymentSystem.Utils.showNotification(`Checking ${providerName} health...`, 'info', 'health_and_safety');
|
285
|
-
|
286
|
-
fetch(`/payments/api/providers/${providerName}/health/`)
|
287
|
-
.then(response => response.json())
|
288
|
-
.then(data => {
|
289
|
-
const message = data.healthy ? `${providerName} is healthy` : `${providerName} has issues`;
|
290
|
-
const type = data.healthy ? 'success' : 'error';
|
291
|
-
PaymentSystem.Utils.showNotification(message, type, data.healthy ? 'check_circle' : 'error');
|
292
|
-
})
|
293
|
-
.catch(error => {
|
294
|
-
PaymentSystem.Utils.showNotification('Health check failed', 'error', 'error');
|
295
|
-
});
|
296
|
-
}
|
297
|
-
|
298
|
-
function testProvider(providerName) {
|
299
|
-
PaymentSystem.Utils.showNotification(`Testing ${providerName}...`, 'info', 'play_arrow');
|
300
|
-
// This would trigger the test modal or direct test
|
301
|
-
}
|
302
|
-
</script>
|
203
|
+
<script src="{% static 'payments/js/payment-form.js' %}"></script>
|
303
204
|
{% endblock %}
|