django-cfg 1.3.3__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.
Files changed (101) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/payments/admin_interface/old/payments/base.html +175 -0
  3. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +125 -0
  4. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +113 -0
  5. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +35 -0
  6. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +309 -0
  7. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +303 -0
  8. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +382 -0
  9. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +518 -0
  10. django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/components.css +248 -9
  11. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +163 -0
  12. django_cfg/apps/payments/admin_interface/serializers/__init__.py +39 -0
  13. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +149 -0
  14. django_cfg/apps/payments/admin_interface/serializers/webhook_serializers.py +114 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/base.html +55 -90
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/dialog.html +81 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_help_dialog.html +112 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/ngrok_status.html +175 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +21 -17
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +123 -250
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +170 -269
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +152 -355
  23. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +202 -551
  24. django_cfg/apps/payments/admin_interface/views/__init__.py +25 -14
  25. django_cfg/apps/payments/admin_interface/views/api/__init__.py +20 -0
  26. django_cfg/apps/payments/admin_interface/views/api/payments.py +191 -0
  27. django_cfg/apps/payments/admin_interface/views/api/stats.py +206 -0
  28. django_cfg/apps/payments/admin_interface/views/api/users.py +60 -0
  29. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +257 -0
  30. django_cfg/apps/payments/admin_interface/views/api/webhook_public.py +70 -0
  31. django_cfg/apps/payments/admin_interface/views/base.py +114 -0
  32. django_cfg/apps/payments/admin_interface/views/dashboard.py +60 -0
  33. django_cfg/apps/payments/admin_interface/views/forms.py +94 -0
  34. django_cfg/apps/payments/config/helpers.py +2 -2
  35. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +16 -6
  36. django_cfg/apps/payments/management/commands/currency_stats.py +72 -5
  37. django_cfg/apps/payments/management/commands/manage_currencies.py +9 -20
  38. django_cfg/apps/payments/management/commands/manage_providers.py +5 -5
  39. django_cfg/apps/payments/middleware/api_access.py +35 -34
  40. django_cfg/apps/payments/migrations/0001_initial.py +1 -1
  41. django_cfg/apps/payments/models/managers/api_key_managers.py +4 -0
  42. django_cfg/apps/payments/models/managers/payment_managers.py +5 -0
  43. django_cfg/apps/payments/models/subscriptions.py +0 -24
  44. django_cfg/apps/payments/services/cache/__init__.py +1 -1
  45. django_cfg/apps/payments/services/core/balance_service.py +13 -2
  46. django_cfg/apps/payments/services/integrations/ngrok_service.py +3 -3
  47. django_cfg/apps/payments/services/providers/registry.py +20 -0
  48. django_cfg/apps/payments/signals/balance_signals.py +7 -4
  49. django_cfg/apps/payments/static/payments/js/api-client.js +385 -0
  50. django_cfg/apps/payments/static/payments/js/ngrok-status.js +58 -0
  51. django_cfg/apps/payments/static/payments/js/payment-dashboard.js +50 -0
  52. django_cfg/apps/payments/static/payments/js/payment-form.js +175 -0
  53. django_cfg/apps/payments/static/payments/js/payment-list.js +95 -0
  54. django_cfg/apps/payments/static/payments/js/webhook-dashboard.js +154 -0
  55. django_cfg/apps/payments/urls.py +4 -0
  56. django_cfg/apps/payments/urls_admin.py +37 -18
  57. django_cfg/apps/payments/views/api/api_keys.py +14 -0
  58. django_cfg/apps/payments/views/api/base.py +1 -0
  59. django_cfg/apps/payments/views/api/currencies.py +2 -2
  60. django_cfg/apps/payments/views/api/payments.py +11 -5
  61. django_cfg/apps/payments/views/api/subscriptions.py +36 -31
  62. django_cfg/apps/payments/views/overview/__init__.py +40 -0
  63. django_cfg/apps/payments/views/overview/serializers.py +205 -0
  64. django_cfg/apps/payments/views/overview/services.py +439 -0
  65. django_cfg/apps/payments/views/overview/urls.py +27 -0
  66. django_cfg/apps/payments/views/overview/views.py +231 -0
  67. django_cfg/apps/payments/views/serializers/api_keys.py +20 -6
  68. django_cfg/apps/payments/views/serializers/balances.py +5 -8
  69. django_cfg/apps/payments/views/serializers/currencies.py +2 -6
  70. django_cfg/apps/payments/views/serializers/payments.py +37 -32
  71. django_cfg/apps/payments/views/serializers/subscriptions.py +4 -26
  72. django_cfg/apps/urls.py +2 -1
  73. django_cfg/core/config.py +25 -15
  74. django_cfg/core/generation.py +12 -12
  75. django_cfg/core/integration/display/startup.py +1 -1
  76. django_cfg/core/validation.py +4 -4
  77. django_cfg/management/commands/show_config.py +2 -2
  78. django_cfg/management/commands/tree.py +1 -3
  79. django_cfg/middleware/__init__.py +2 -0
  80. django_cfg/middleware/static_nocache.py +55 -0
  81. django_cfg/models/payments.py +13 -15
  82. django_cfg/models/security.py +15 -0
  83. django_cfg/modules/django_ngrok.py +6 -0
  84. django_cfg/modules/django_unfold/dashboard.py +1 -3
  85. django_cfg/utils/smart_defaults.py +41 -1
  86. {django_cfg-1.3.3.dist-info → django_cfg-1.3.5.dist-info}/METADATA +1 -1
  87. {django_cfg-1.3.3.dist-info → django_cfg-1.3.5.dist-info}/RECORD +98 -65
  88. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +0 -38
  89. django_cfg/apps/payments/admin_interface/views/payment_views.py +0 -259
  90. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +0 -37
  91. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/loading_spinner.html +0 -0
  92. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/notification.html +0 -0
  93. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/components/provider_card.html +0 -0
  94. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/currency_converter.html +0 -0
  95. /django_cfg/apps/payments/admin_interface/{templates → old}/payments/payment_status.html +0 -0
  96. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/css/dashboard.css +0 -0
  97. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/components.js +0 -0
  98. /django_cfg/apps/payments/{static → admin_interface/old/static}/payments/js/utils.js +0 -0
  99. {django_cfg-1.3.3.dist-info → django_cfg-1.3.5.dist-info}/WHEEL +0 -0
  100. {django_cfg-1.3.3.dist-info → django_cfg-1.3.5.dist-info}/entry_points.txt +0 -0
  101. {django_cfg-1.3.3.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 - Universal Payment System{% endblock %}
4
+ {% block title %}Create Payment - Payment Admin{% endblock %}
5
5
 
6
6
  {% block page_title %}Create New Payment{% endblock %}
7
- {% block page_subtitle %}Process a payment through our universal payment system{% endblock %}
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()" class="max-w-4xl mx-auto">
54
- <!-- Progress Steps -->
55
- <div class="mb-8">
56
- <div class="flex items-center justify-center space-x-4">
57
- <div class="flex items-center">
58
- <div class="w-8 h-8 bg-blue-600 text-white rounded-full flex items-center justify-center">
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
- <div class="payment-card-content">
93
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
94
- <!-- Amount -->
95
- <div class="form-group">
96
- <label class="form-label">
97
- <span class="material-icons-outlined mr-1 text-sm">attach_money</span>
98
- Amount
99
- </label>
100
- <div class="relative">
101
- <input type="number"
102
- x-model="formData.amount"
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
- <div x-show="errors.amount" class="form-error" x-text="errors.amount"></div>
114
- <div class="form-help">Minimum amount: $0.01</div>
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
- <!-- Currency -->
118
- <div class="form-group">
119
- <label class="form-label">
120
- <span class="material-icons-outlined mr-1 text-sm">currency_exchange</span>
121
- Currency
122
- </label>
123
- <select x-model="formData.currency"
124
- class="form-select"
125
- :class="{ 'border-red-500': errors.currency }"
126
- required>
127
- <option value="">Select currency...</option>
128
- <template x-for="currency in currencies" :key="currency.code">
129
- <option :value="currency.code" x-text="`${currency.code} - ${currency.name}`"></option>
130
- </template>
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
- <!-- Callback URL (Optional) -->
138
- <div class="form-group">
139
- <label class="form-label">
140
- <span class="material-icons-outlined mr-1 text-sm">webhook</span>
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
- <input type="url"
144
- x-model="formData.callback_url"
145
- class="form-input"
146
- :class="{ 'border-red-500': errors.callback_url }"
147
- placeholder="https://your-site.com/webhook">
148
- <div x-show="errors.callback_url" class="form-error" x-text="errors.callback_url"></div>
149
- <div class="form-help">URL to receive payment status updates</div>
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
- <!-- Provider Selection Card -->
155
- <div class="payment-card">
156
- <div class="payment-card-header">
157
- <h2 class="payment-card-title">
158
- <span class="material-icons-outlined">account_balance</span>
159
- Payment Provider
160
- </h2>
161
- </div>
162
-
163
- <div class="payment-card-content">
164
- <div x-show="providers.length === 0" class="text-center py-8">
165
- <div class="material-icons-outlined text-gray-400 text-4xl mb-4">account_balance</div>
166
- <p class="text-gray-500 dark:text-gray-400">Loading providers...</p>
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
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
170
- <template x-for="provider in providers" :key="provider.name">
171
- <div class="provider-card payment-card p-4"
172
- :class="{ 'selected': formData.provider === provider.name }"
173
- @click="formData.provider = provider.name">
174
- <div class="flex items-center mb-3">
175
- <div class="w-10 h-10 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-3">
176
- <span class="material-icons-outlined text-blue-600 dark:text-blue-400 text-sm" x-text="provider.icon || 'account_balance'"></span>
177
- </div>
178
- <div>
179
- <h3 class="font-medium text-gray-900 dark:text-white" x-text="provider.display_name"></h3>
180
- <p class="text-xs text-gray-500 dark:text-gray-400">Payment Gateway</p>
181
- </div>
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
- <div class="space-y-2 text-xs text-gray-600 dark:text-gray-400">
185
- <div class="flex items-center">
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
- <div class="mt-3 pt-3 border-t border-gray-200 dark:border-gray-600">
200
- <div class="flex items-center justify-between">
201
- <span class="text-xs text-gray-500">Status:</span>
202
- <span class="status-badge success text-xs">Active</span>
203
- </div>
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
- </template>
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
- <!-- Summary Card -->
215
- <div x-show="formData.amount && formData.currency && formData.provider" class="payment-card">
216
- <div class="payment-card-header">
217
- <h2 class="payment-card-title">
218
- <span class="material-icons-outlined">receipt</span>
219
- Payment Summary
220
- </h2>
221
- </div>
222
-
223
- <div class="payment-card-content">
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
- <!-- Action Buttons -->
246
- <div class="flex justify-between items-center">
247
- <a href="{% url 'cfg_payments_admin:webhook-dashboard' %}" class="btn-outline">
248
- <span class="material-icons-outlined">arrow_back</span>
249
- Back to Dashboard
250
- </a>
251
-
252
- <button type="submit"
253
- :disabled="loading || !formData.amount || !formData.currency || !formData.provider"
254
- class="btn-primary"
255
- :class="{ 'opacity-50 cursor-not-allowed': loading || !formData.amount || !formData.currency || !formData.provider }">
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
- <!-- Loading Overlay -->
264
- <div x-show="loading"
265
- x-transition:enter="transition ease-out duration-300"
266
- x-transition:enter-start="opacity-0"
267
- x-transition:enter-end="opacity-100"
268
- x-transition:leave="transition ease-in duration-200"
269
- x-transition:leave-start="opacity-100"
270
- x-transition:leave-end="opacity-0"
271
- class="fixed inset-0 bg-gray-600 bg-opacity-50 flex items-center justify-center z-50">
272
- <div class="bg-white dark:bg-gray-800 rounded-lg p-6 flex items-center space-x-4">
273
- <div class="loading-spinner lg"></div>
274
- <span class="text-gray-900 dark:text-white">Processing payment...</span>
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 %}