django-cfg 1.2.31__py3-none-any.whl → 1.3.1__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 (256) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/api/health/views.py +4 -2
  3. django_cfg/apps/knowbase/config/settings.py +16 -15
  4. django_cfg/apps/payments/README.md +326 -0
  5. django_cfg/apps/payments/admin/__init__.py +20 -10
  6. django_cfg/apps/payments/admin/api_keys_admin.py +521 -237
  7. django_cfg/apps/payments/admin/balance_admin.py +592 -297
  8. django_cfg/apps/payments/admin/currencies_admin.py +526 -222
  9. django_cfg/apps/payments/admin/filters.py +306 -199
  10. django_cfg/apps/payments/admin/payments_admin.py +465 -70
  11. django_cfg/apps/payments/admin/subscriptions_admin.py +578 -128
  12. django_cfg/apps/payments/admin_interface/__init__.py +18 -0
  13. django_cfg/apps/payments/admin_interface/templates/payments/base.html +162 -0
  14. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +38 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/components/loading_spinner.html +16 -0
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/notification.html +27 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_card.html +86 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +39 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/currency_converter.html +382 -0
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +300 -0
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +303 -0
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +382 -0
  23. django_cfg/apps/payments/admin_interface/templates/payments/payment_status.html +500 -0
  24. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +594 -0
  25. django_cfg/apps/payments/admin_interface/views/__init__.py +23 -0
  26. django_cfg/apps/payments/admin_interface/views/payment_views.py +259 -0
  27. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +37 -0
  28. django_cfg/apps/payments/apps.py +34 -9
  29. django_cfg/apps/payments/config/__init__.py +28 -51
  30. django_cfg/apps/payments/config/constance/__init__.py +22 -0
  31. django_cfg/apps/payments/config/constance/config_service.py +123 -0
  32. django_cfg/apps/payments/config/constance/fields.py +69 -0
  33. django_cfg/apps/payments/config/constance/settings.py +160 -0
  34. django_cfg/apps/payments/config/django_cfg_integration.py +202 -0
  35. django_cfg/apps/payments/config/helpers.py +130 -0
  36. django_cfg/apps/payments/management/__init__.py +1 -3
  37. django_cfg/apps/payments/management/commands/__init__.py +1 -3
  38. django_cfg/apps/payments/management/commands/manage_currencies.py +303 -151
  39. django_cfg/apps/payments/management/commands/manage_providers.py +333 -160
  40. django_cfg/apps/payments/middleware/__init__.py +3 -1
  41. django_cfg/apps/payments/middleware/api_access.py +329 -222
  42. django_cfg/apps/payments/middleware/rate_limiting.py +342 -152
  43. django_cfg/apps/payments/middleware/usage_tracking.py +249 -240
  44. django_cfg/apps/payments/migrations/0001_initial.py +708 -536
  45. django_cfg/apps/payments/models/__init__.py +13 -18
  46. django_cfg/apps/payments/models/api_keys.py +121 -43
  47. django_cfg/apps/payments/models/balance.py +150 -115
  48. django_cfg/apps/payments/models/base.py +68 -15
  49. django_cfg/apps/payments/models/currencies.py +172 -148
  50. django_cfg/apps/payments/models/managers/__init__.py +44 -0
  51. django_cfg/apps/payments/models/managers/api_key_managers.py +329 -0
  52. django_cfg/apps/payments/models/managers/balance_managers.py +599 -0
  53. django_cfg/apps/payments/models/managers/currency_managers.py +385 -0
  54. django_cfg/apps/payments/models/managers/payment_managers.py +511 -0
  55. django_cfg/apps/payments/models/managers/subscription_managers.py +641 -0
  56. django_cfg/apps/payments/models/payments.py +235 -285
  57. django_cfg/apps/payments/models/subscriptions.py +257 -177
  58. django_cfg/apps/payments/models/tariffs.py +147 -40
  59. django_cfg/apps/payments/services/__init__.py +209 -56
  60. django_cfg/apps/payments/services/cache/__init__.py +6 -6
  61. django_cfg/apps/payments/services/cache/{simple_cache.py → cache_service.py} +112 -12
  62. django_cfg/apps/payments/services/core/__init__.py +10 -6
  63. django_cfg/apps/payments/services/core/balance_service.py +435 -360
  64. django_cfg/apps/payments/services/core/base.py +166 -0
  65. django_cfg/apps/payments/services/core/currency_service.py +478 -0
  66. django_cfg/apps/payments/services/core/payment_service.py +346 -467
  67. django_cfg/apps/payments/services/core/subscription_service.py +425 -481
  68. django_cfg/apps/payments/services/core/webhook_service.py +410 -0
  69. django_cfg/apps/payments/services/integrations/__init__.py +29 -0
  70. django_cfg/apps/payments/services/integrations/ngrok_service.py +47 -0
  71. django_cfg/apps/payments/services/integrations/providers_config.py +107 -0
  72. django_cfg/apps/payments/services/providers/__init__.py +9 -14
  73. django_cfg/apps/payments/services/providers/base.py +234 -174
  74. django_cfg/apps/payments/services/providers/nowpayments.py +478 -0
  75. django_cfg/apps/payments/services/providers/registry.py +367 -301
  76. django_cfg/apps/payments/services/types/__init__.py +78 -0
  77. django_cfg/apps/payments/services/types/data.py +177 -0
  78. django_cfg/apps/payments/services/types/requests.py +150 -0
  79. django_cfg/apps/payments/services/types/responses.py +156 -0
  80. django_cfg/apps/payments/services/types/webhooks.py +232 -0
  81. django_cfg/apps/payments/signals/__init__.py +33 -8
  82. django_cfg/apps/payments/signals/api_key_signals.py +210 -129
  83. django_cfg/apps/payments/signals/balance_signals.py +174 -0
  84. django_cfg/apps/payments/signals/payment_signals.py +128 -103
  85. django_cfg/apps/payments/signals/subscription_signals.py +194 -142
  86. django_cfg/apps/payments/static/payments/css/components.css +380 -0
  87. django_cfg/apps/payments/static/payments/css/dashboard.css +188 -0
  88. django_cfg/apps/payments/static/payments/js/components.js +545 -0
  89. django_cfg/apps/payments/static/payments/js/utils.js +412 -0
  90. django_cfg/apps/payments/templatetags/__init__.py +1 -1
  91. django_cfg/apps/payments/templatetags/payment_tags.py +466 -0
  92. django_cfg/apps/payments/urls.py +45 -48
  93. django_cfg/apps/payments/urls_admin.py +33 -42
  94. django_cfg/apps/payments/views/api/__init__.py +101 -0
  95. django_cfg/apps/payments/views/api/api_keys.py +387 -0
  96. django_cfg/apps/payments/views/api/balances.py +381 -0
  97. django_cfg/apps/payments/views/api/base.py +298 -0
  98. django_cfg/apps/payments/views/api/currencies.py +402 -0
  99. django_cfg/apps/payments/views/api/payments.py +415 -0
  100. django_cfg/apps/payments/views/api/subscriptions.py +475 -0
  101. django_cfg/apps/payments/views/api/webhooks.py +476 -0
  102. django_cfg/apps/payments/views/serializers/__init__.py +99 -0
  103. django_cfg/apps/payments/views/serializers/api_keys.py +424 -0
  104. django_cfg/apps/payments/views/serializers/balances.py +300 -0
  105. django_cfg/apps/payments/views/serializers/currencies.py +335 -0
  106. django_cfg/apps/payments/views/serializers/payments.py +387 -0
  107. django_cfg/apps/payments/views/serializers/subscriptions.py +429 -0
  108. django_cfg/apps/payments/views/serializers/webhooks.py +137 -0
  109. django_cfg/config.py +1 -1
  110. django_cfg/core/config.py +40 -4
  111. django_cfg/core/generation.py +25 -4
  112. django_cfg/core/integration/README.md +363 -0
  113. django_cfg/core/integration/__init__.py +47 -0
  114. django_cfg/core/integration/commands_collector.py +239 -0
  115. django_cfg/core/integration/display/__init__.py +15 -0
  116. django_cfg/core/integration/display/base.py +157 -0
  117. django_cfg/core/integration/display/ngrok.py +164 -0
  118. django_cfg/core/integration/display/startup.py +815 -0
  119. django_cfg/core/integration/url_integration.py +123 -0
  120. django_cfg/core/integration/version_checker.py +160 -0
  121. django_cfg/management/commands/auto_generate.py +4 -0
  122. django_cfg/management/commands/check_settings.py +6 -0
  123. django_cfg/management/commands/clear_constance.py +5 -2
  124. django_cfg/management/commands/create_token.py +6 -0
  125. django_cfg/management/commands/list_urls.py +6 -0
  126. django_cfg/management/commands/migrate_all.py +6 -0
  127. django_cfg/management/commands/migrator.py +3 -0
  128. django_cfg/management/commands/rundramatiq.py +6 -0
  129. django_cfg/management/commands/runserver_ngrok.py +51 -29
  130. django_cfg/management/commands/script.py +6 -0
  131. django_cfg/management/commands/show_config.py +12 -2
  132. django_cfg/management/commands/show_urls.py +4 -0
  133. django_cfg/management/commands/superuser.py +6 -0
  134. django_cfg/management/commands/task_clear.py +4 -1
  135. django_cfg/management/commands/task_status.py +3 -1
  136. django_cfg/management/commands/test_email.py +3 -0
  137. django_cfg/management/commands/test_telegram.py +6 -0
  138. django_cfg/management/commands/test_twilio.py +6 -0
  139. django_cfg/management/commands/tree.py +6 -0
  140. django_cfg/management/commands/validate_config.py +155 -149
  141. django_cfg/models/constance.py +31 -11
  142. django_cfg/models/payments.py +175 -492
  143. django_cfg/modules/django_logger.py +160 -146
  144. django_cfg/modules/django_unfold/dashboard.py +64 -16
  145. django_cfg/registry/core.py +1 -0
  146. django_cfg/template_archive/django_sample.zip +0 -0
  147. django_cfg/utils/smart_defaults.py +222 -571
  148. django_cfg/utils/toolkit.py +51 -11
  149. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/METADATA +4 -1
  150. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/RECORD +153 -185
  151. django_cfg/apps/payments/__init__.py +0 -8
  152. django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
  153. django_cfg/apps/payments/config/module.py +0 -70
  154. django_cfg/apps/payments/config/providers.py +0 -105
  155. django_cfg/apps/payments/config/settings.py +0 -96
  156. django_cfg/apps/payments/config/utils.py +0 -52
  157. django_cfg/apps/payments/decorators.py +0 -291
  158. django_cfg/apps/payments/management/commands/README.md +0 -146
  159. django_cfg/apps/payments/management/commands/currency_stats.py +0 -304
  160. django_cfg/apps/payments/managers/__init__.py +0 -23
  161. django_cfg/apps/payments/managers/api_key_manager.py +0 -35
  162. django_cfg/apps/payments/managers/balance_manager.py +0 -361
  163. django_cfg/apps/payments/managers/currency_manager.py +0 -306
  164. django_cfg/apps/payments/managers/payment_manager.py +0 -192
  165. django_cfg/apps/payments/managers/subscription_manager.py +0 -37
  166. django_cfg/apps/payments/managers/tariff_manager.py +0 -29
  167. django_cfg/apps/payments/migrations/0002_network_providercurrency_and_more.py +0 -241
  168. django_cfg/apps/payments/migrations/0003_add_usd_rate_cache.py +0 -30
  169. django_cfg/apps/payments/models/events.py +0 -73
  170. django_cfg/apps/payments/serializers/__init__.py +0 -57
  171. django_cfg/apps/payments/serializers/api_keys.py +0 -51
  172. django_cfg/apps/payments/serializers/balance.py +0 -59
  173. django_cfg/apps/payments/serializers/currencies.py +0 -63
  174. django_cfg/apps/payments/serializers/payments.py +0 -62
  175. django_cfg/apps/payments/serializers/subscriptions.py +0 -71
  176. django_cfg/apps/payments/serializers/tariffs.py +0 -56
  177. django_cfg/apps/payments/services/billing/__init__.py +0 -8
  178. django_cfg/apps/payments/services/cache/base.py +0 -30
  179. django_cfg/apps/payments/services/core/fallback_service.py +0 -432
  180. django_cfg/apps/payments/services/internal_types.py +0 -461
  181. django_cfg/apps/payments/services/middleware/__init__.py +0 -8
  182. django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
  183. django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -76
  184. django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
  185. django_cfg/apps/payments/services/providers/cryptapi/__init__.py +0 -4
  186. django_cfg/apps/payments/services/providers/cryptapi/config.py +0 -8
  187. django_cfg/apps/payments/services/providers/cryptapi/models.py +0 -192
  188. django_cfg/apps/payments/services/providers/cryptapi/provider.py +0 -439
  189. django_cfg/apps/payments/services/providers/cryptomus/__init__.py +0 -4
  190. django_cfg/apps/payments/services/providers/cryptomus/models.py +0 -176
  191. django_cfg/apps/payments/services/providers/cryptomus/provider.py +0 -429
  192. django_cfg/apps/payments/services/providers/cryptomus/provider_v2.py +0 -564
  193. django_cfg/apps/payments/services/providers/models/__init__.py +0 -34
  194. django_cfg/apps/payments/services/providers/models/currencies.py +0 -190
  195. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +0 -4
  196. django_cfg/apps/payments/services/providers/nowpayments/models.py +0 -196
  197. django_cfg/apps/payments/services/providers/nowpayments/provider.py +0 -380
  198. django_cfg/apps/payments/services/providers/stripe/__init__.py +0 -4
  199. django_cfg/apps/payments/services/providers/stripe/models.py +0 -184
  200. django_cfg/apps/payments/services/providers/stripe/provider.py +0 -109
  201. django_cfg/apps/payments/services/security/__init__.py +0 -34
  202. django_cfg/apps/payments/services/security/error_handler.py +0 -635
  203. django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
  204. django_cfg/apps/payments/services/security/webhook_validator.py +0 -474
  205. django_cfg/apps/payments/static/payments/css/payments.css +0 -340
  206. django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
  207. django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
  208. django_cfg/apps/payments/static/payments/js/theme.js +0 -86
  209. django_cfg/apps/payments/tasks/__init__.py +0 -12
  210. django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
  211. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +0 -50
  212. django_cfg/apps/payments/templates/payments/base.html +0 -182
  213. django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
  214. django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
  215. django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -43
  216. django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
  217. django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -34
  218. django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -148
  219. django_cfg/apps/payments/templates/payments/dashboard.html +0 -258
  220. django_cfg/apps/payments/templates/payments/dashboard_simple_test.html +0 -35
  221. django_cfg/apps/payments/templates/payments/payment_create.html +0 -579
  222. django_cfg/apps/payments/templates/payments/payment_detail.html +0 -373
  223. django_cfg/apps/payments/templates/payments/payment_list.html +0 -354
  224. django_cfg/apps/payments/templates/payments/stats.html +0 -261
  225. django_cfg/apps/payments/templates/payments/test.html +0 -213
  226. django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
  227. django_cfg/apps/payments/utils/__init__.py +0 -43
  228. django_cfg/apps/payments/utils/billing_utils.py +0 -342
  229. django_cfg/apps/payments/utils/config_utils.py +0 -239
  230. django_cfg/apps/payments/utils/middleware_utils.py +0 -228
  231. django_cfg/apps/payments/utils/validation_utils.py +0 -94
  232. django_cfg/apps/payments/views/__init__.py +0 -63
  233. django_cfg/apps/payments/views/api_key_views.py +0 -164
  234. django_cfg/apps/payments/views/balance_views.py +0 -75
  235. django_cfg/apps/payments/views/currency_views.py +0 -122
  236. django_cfg/apps/payments/views/payment_views.py +0 -149
  237. django_cfg/apps/payments/views/subscription_views.py +0 -135
  238. django_cfg/apps/payments/views/tariff_views.py +0 -131
  239. django_cfg/apps/payments/views/templates/__init__.py +0 -25
  240. django_cfg/apps/payments/views/templates/ajax.py +0 -451
  241. django_cfg/apps/payments/views/templates/base.py +0 -212
  242. django_cfg/apps/payments/views/templates/dashboard.py +0 -60
  243. django_cfg/apps/payments/views/templates/payment_detail.py +0 -102
  244. django_cfg/apps/payments/views/templates/payment_management.py +0 -158
  245. django_cfg/apps/payments/views/templates/qr_code.py +0 -174
  246. django_cfg/apps/payments/views/templates/stats.py +0 -244
  247. django_cfg/apps/payments/views/templates/utils.py +0 -181
  248. django_cfg/apps/payments/views/webhook_views.py +0 -266
  249. django_cfg/apps/payments/viewsets.py +0 -66
  250. django_cfg/core/integration.py +0 -160
  251. django_cfg/template_archive/.gitignore +0 -1
  252. django_cfg/template_archive/__init__.py +0 -0
  253. django_cfg/urls.py +0 -33
  254. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/WHEEL +0 -0
  255. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/entry_points.txt +0 -0
  256. {django_cfg-1.2.31.dist-info → django_cfg-1.3.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,373 +0,0 @@
1
- {% extends 'payments/base.html' %}
2
- {% load static %}
3
- {% load payments_tags %}
4
-
5
- {% block header_title %}Payment Details{% endblock %}
6
- {% block header_subtitle %}Payment {{ payment.internal_payment_id }}{% endblock %}
7
-
8
- {% block content %}
9
- <div class="space-y-6">
10
- <!-- Payment Overview -->
11
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
12
- <div class="p-6 border-b border-base-200 dark:border-base-700">
13
- <div class="flex items-center justify-between">
14
- <div>
15
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Payment Overview</h3>
16
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Complete payment information</p>
17
- </div>
18
- <div class="flex items-center space-x-3">
19
- {% payment_status_badge payment %}
20
- {% if payment.pay_address and payment.pay_amount %}
21
- <a href="{% url 'payments_dashboard:qr_code' payment.pk %}"
22
- class="inline-flex items-center px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
23
- <span class="material-icons text-sm mr-2">qr_code</span>
24
- QR Code
25
- </a>
26
- {% endif %}
27
- </div>
28
- </div>
29
- </div>
30
-
31
- <div class="p-6">
32
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
33
- <!-- Payment Information -->
34
- <div>
35
- <h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Payment Information</h4>
36
- <dl class="space-y-3">
37
- <div class="flex justify-between">
38
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Internal ID:</dt>
39
- <dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.internal_payment_id }}</dd>
40
- </div>
41
- <div class="flex justify-between">
42
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Provider ID:</dt>
43
- <dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.provider_payment_id|default:"N/A" }}</dd>
44
- </div>
45
- <div class="flex justify-between">
46
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Amount:</dt>
47
- <dd class="text-sm font-semibold text-font-important-light dark:text-font-important-dark">${{ payment.amount_usd|floatformat:2 }}</dd>
48
- </div>
49
- <div class="flex justify-between">
50
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Currency:</dt>
51
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.currency_code }}</dd>
52
- </div>
53
- <div class="flex justify-between">
54
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Provider:</dt>
55
- <dd class="text-sm">
56
- <div class="flex items-center">
57
- <div class="w-2 h-2 rounded-full mr-2
58
- {% if payment.provider == 'cryptapi' %}bg-orange-500
59
- {% elif payment.provider == 'cryptomus' %}bg-blue-500
60
- {% elif payment.provider == 'stripe' %}bg-purple-500
61
- {% elif payment.provider == 'nowpayments' %}bg-green-500
62
- {% else %}bg-gray-500{% endif %}">
63
- </div>
64
- <span class="text-font-default-light dark:text-font-default-dark capitalize">{{ payment.provider }}</span>
65
- </div>
66
- </dd>
67
- </div>
68
- </dl>
69
- </div>
70
-
71
- <!-- User Information -->
72
- <div>
73
- <h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">User Information</h4>
74
- <dl class="space-y-3">
75
- <div class="flex justify-between">
76
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Name:</dt>
77
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.user.get_full_name|default:"N/A" }}</dd>
78
- </div>
79
- <div class="flex justify-between">
80
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Email:</dt>
81
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.user.email }}</dd>
82
- </div>
83
- <div class="flex justify-between">
84
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">User ID:</dt>
85
- <dd class="text-sm font-mono text-font-default-light dark:text-font-default-dark">{{ payment.user.id }}</dd>
86
- </div>
87
- </dl>
88
- </div>
89
- </div>
90
- </div>
91
- </div>
92
-
93
- <!-- Crypto Details (if applicable) -->
94
- {% if payment.is_crypto_provider_payment %}
95
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
96
- <div class="p-6 border-b border-base-200 dark:border-base-700">
97
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Cryptocurrency Details</h3>
98
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Blockchain transaction information</p>
99
- </div>
100
-
101
- <div class="p-6">
102
- <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
103
- <!-- Payment Addresses -->
104
- <div>
105
- <h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Payment Addresses</h4>
106
- <dl class="space-y-3">
107
- <div>
108
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Pay Address:</dt>
109
- <dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
110
- {{ payment.pay_address|default:"N/A" }}
111
- </dd>
112
- </div>
113
- <div>
114
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Sender Address:</dt>
115
- <dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
116
- {{ payment.sender_address|default:"N/A" }}
117
- </dd>
118
- </div>
119
- <div>
120
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Receiver Address:</dt>
121
- <dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
122
- {{ payment.receiver_address|default:"N/A" }}
123
- </dd>
124
- </div>
125
- </dl>
126
- </div>
127
-
128
- <!-- Transaction Details -->
129
- <div>
130
- <h4 class="text-md font-semibold text-font-important-light dark:text-font-important-dark mb-4">Transaction Details</h4>
131
- <dl class="space-y-3">
132
- <div class="flex justify-between">
133
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Crypto Amount:</dt>
134
- <dd class="text-sm font-semibold text-font-important-light dark:text-font-important-dark">
135
- {{ payment.crypto_amount|default:"N/A"|floatformat:8 }}
136
- </dd>
137
- </div>
138
- <div class="flex justify-between">
139
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Pay Amount:</dt>
140
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.pay_amount|default:"N/A"|floatformat:8 }}</dd>
141
- </div>
142
- <div class="flex justify-between">
143
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Network:</dt>
144
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.network|default:"N/A" }}</dd>
145
- </div>
146
- <div class="flex justify-between">
147
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Confirmations:</dt>
148
- <dd class="text-sm text-font-default-light dark:text-font-default-dark">{{ payment.confirmations_count|default:"0" }}</dd>
149
- </div>
150
- <div>
151
- <dt class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Transaction Hash:</dt>
152
- <dd class="text-sm font-mono bg-base-50 dark:bg-base-800 p-2 rounded-default border border-base-200 dark:border-base-700 break-all">
153
- {{ payment.transaction_hash|default:"N/A" }}
154
- </dd>
155
- </div>
156
- </dl>
157
- </div>
158
- </div>
159
- </div>
160
- </div>
161
- {% endif %}
162
-
163
- <!-- Timestamps -->
164
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
165
- <div class="p-6 border-b border-base-200 dark:border-base-700">
166
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Timeline</h3>
167
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Payment lifecycle timestamps</p>
168
- </div>
169
-
170
- <div class="p-6">
171
- <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
172
- <div class="text-center">
173
- <div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Created</div>
174
- <div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.created_at|date:"M d, Y" }}</div>
175
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.created_at|time:"H:i:s" }}</div>
176
- </div>
177
- <div class="text-center">
178
- <div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Updated</div>
179
- <div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.updated_at|date:"M d, Y" }}</div>
180
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.updated_at|time:"H:i:s" }}</div>
181
- </div>
182
- <div class="text-center">
183
- <div class="text-sm text-font-subtle-light dark:text-font-subtle-dark mb-1">Processed</div>
184
- {% if payment.processed_at %}
185
- <div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ payment.processed_at|date:"M d, Y" }}</div>
186
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark">{{ payment.processed_at|time:"H:i:s" }}</div>
187
- {% else %}
188
- <div class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Not processed</div>
189
- {% endif %}
190
- </div>
191
- </div>
192
- </div>
193
- </div>
194
-
195
- <!-- Payment Events -->
196
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
197
- <div class="p-6 border-b border-base-200 dark:border-base-700">
198
- <div class="flex items-center justify-between">
199
- <div>
200
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Payment Events</h3>
201
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Event history and logs</p>
202
- </div>
203
- <button id="refresh-events" class="text-primary-600 dark:text-primary-400 hover:text-primary-700 dark:hover:text-primary-300 text-sm font-medium">
204
- <span class="material-icons text-sm mr-1">refresh</span>
205
- Refresh
206
- </button>
207
- </div>
208
- </div>
209
-
210
- <div class="p-6">
211
- <div id="events-container" class="space-y-3">
212
- {% for event in payment.events.all %}
213
- <div class="flex items-start space-x-3 p-3 bg-base-50 dark:bg-base-800 rounded-default border border-base-200 dark:border-base-700">
214
- <div class="flex-shrink-0">
215
- <span class="material-icons text-sm
216
- {% if event.event_type == 'created' %}text-blue-600 dark:text-blue-400
217
- {% elif event.event_type == 'confirmed' %}text-green-600 dark:text-green-400
218
- {% elif event.event_type == 'failed' %}text-red-600 dark:text-red-400
219
- {% else %}text-gray-600 dark:text-gray-400{% endif %}">
220
- {% if event.event_type == 'created' %}add_circle
221
- {% elif event.event_type == 'confirmed' %}check_circle
222
- {% elif event.event_type == 'failed' %}error
223
- {% else %}info{% endif %}
224
- </span>
225
- </div>
226
- <div class="flex-1">
227
- <div class="text-sm font-medium text-font-important-light dark:text-font-important-dark">{{ event.event_type|title }}</div>
228
- <div class="text-sm text-font-default-light dark:text-font-default-dark">{{ event.message }}</div>
229
- <div class="text-xs text-font-subtle-light dark:text-font-subtle-dark mt-1">{{ event.timestamp|date:"M d, Y H:i:s" }}</div>
230
- </div>
231
- </div>
232
- {% empty %}
233
- <p class="text-font-subtle-light dark:text-font-subtle-dark text-center py-4">No events recorded</p>
234
- {% endfor %}
235
- </div>
236
- </div>
237
- </div>
238
-
239
- <!-- Metadata (if available) -->
240
- {% if payment.metadata %}
241
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
242
- <div class="p-6 border-b border-base-200 dark:border-base-700">
243
- <h3 class="text-lg font-semibold text-font-important-light dark:text-font-important-dark">Metadata</h3>
244
- <p class="text-sm text-font-subtle-light dark:text-font-subtle-dark mt-1">Additional payment information</p>
245
- </div>
246
-
247
- <div class="p-6">
248
- <pre class="text-sm font-mono bg-base-50 dark:bg-base-800 p-4 rounded-default border border-base-200 dark:border-base-700 overflow-x-auto">{{ payment.metadata|pprint }}</pre>
249
- </div>
250
- </div>
251
- {% endif %}
252
-
253
- <!-- Actions -->
254
- <div class="bg-white dark:bg-base-900 border border-base-200 dark:border-base-700 rounded-default shadow-xs">
255
- <div class="p-6">
256
- <div class="flex flex-wrap gap-3">
257
- <a href="{% url 'payments_dashboard:list' %}"
258
- class="inline-flex items-center px-4 py-2 bg-gray-600 hover:bg-gray-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
259
- <span class="material-icons text-sm mr-2">arrow_back</span>
260
- Back to List
261
- </a>
262
-
263
- {% if payment.status == 'pending' %}
264
- <button id="check-status" data-payment-id="{{ payment.pk }}"
265
- class="inline-flex items-center px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
266
- <span class="material-icons text-sm mr-2">refresh</span>
267
- Check Status
268
- </button>
269
- {% endif %}
270
-
271
- {% if payment.pay_address and payment.pay_amount %}
272
- <a href="{% url 'payments_dashboard:qr_code' payment.pk %}"
273
- class="inline-flex items-center px-4 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
274
- <span class="material-icons text-sm mr-2">qr_code</span>
275
- View QR Code
276
- </a>
277
- {% endif %}
278
-
279
- <button id="export-details"
280
- class="inline-flex items-center px-4 py-2 bg-green-600 hover:bg-green-700 text-white rounded-default text-sm font-medium transition-colors duration-200">
281
- <span class="material-icons text-sm mr-2">file_download</span>
282
- Export Details
283
- </button>
284
- </div>
285
- </div>
286
- </div>
287
- </div>
288
- {% endblock %}
289
-
290
- {% block extra_js %}
291
- {{ block.super }}
292
- <script>
293
- document.addEventListener('DOMContentLoaded', function() {
294
- console.log('Payment detail loaded');
295
-
296
- // Elements
297
- const checkStatusBtn = document.getElementById('check-status');
298
- const refreshEventsBtn = document.getElementById('refresh-events');
299
- const exportBtn = document.getElementById('export-details');
300
-
301
- // Check payment status
302
- checkStatusBtn?.addEventListener('click', function() {
303
- const paymentId = this.dataset.paymentId;
304
- const originalText = this.innerHTML;
305
-
306
- // Show loading state
307
- this.innerHTML = '<span class="material-icons text-sm mr-2 animate-spin">refresh</span>Checking...';
308
- this.disabled = true;
309
-
310
- // Simulate API call
311
- setTimeout(() => {
312
- console.log('Status checked for payment:', paymentId);
313
- this.innerHTML = originalText;
314
- this.disabled = false;
315
-
316
- // Refresh the page to show updated status
317
- window.location.reload();
318
- }, 2000);
319
- });
320
-
321
- // Refresh events
322
- refreshEventsBtn?.addEventListener('click', function() {
323
- console.log('Refreshing events...');
324
-
325
- // In a real implementation, this would fetch events via AJAX
326
- const eventsContainer = document.getElementById('events-container');
327
- eventsContainer.style.opacity = '0.5';
328
-
329
- setTimeout(() => {
330
- eventsContainer.style.opacity = '1';
331
- console.log('Events refreshed');
332
- }, 1000);
333
- });
334
-
335
- // Export payment details
336
- exportBtn?.addEventListener('click', function() {
337
- console.log('Exporting payment details...');
338
-
339
- // Create export data
340
- const paymentData = {
341
- internal_id: '{{ payment.internal_payment_id }}',
342
- provider_id: '{{ payment.provider_payment_id|default:"N/A" }}',
343
- amount: '{{ payment.amount_usd }}',
344
- currency: '{{ payment.currency_code }}',
345
- provider: '{{ payment.provider }}',
346
- status: '{{ payment.status }}',
347
- user_email: '{{ payment.user.email }}',
348
- created_at: '{{ payment.created_at|date:"Y-m-d H:i:s" }}'
349
- };
350
-
351
- // Download as JSON
352
- const dataStr = JSON.stringify(paymentData, null, 2);
353
- const dataBlob = new Blob([dataStr], {type: 'application/json'});
354
- const url = URL.createObjectURL(dataBlob);
355
-
356
- const link = document.createElement('a');
357
- link.href = url;
358
- link.download = `payment_{{ payment.internal_payment_id }}.json`;
359
- link.click();
360
-
361
- URL.revokeObjectURL(url);
362
- });
363
-
364
- // Auto-refresh for pending payments
365
- {% if payment.status == 'pending' %}
366
- setInterval(() => {
367
- console.log('Auto-checking payment status...');
368
- // In a real implementation, check status via AJAX
369
- }, 30000); // Check every 30 seconds
370
- {% endif %}
371
- });
372
- </script>
373
- {% endblock %}