django-cfg 1.3.7__py3-none-any.whl → 1.3.11__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 (246) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +24 -8
  3. django_cfg/apps/accounts/admin/activity_admin.py +146 -0
  4. django_cfg/apps/accounts/admin/filters.py +98 -22
  5. django_cfg/apps/accounts/admin/group_admin.py +86 -0
  6. django_cfg/apps/accounts/admin/inlines.py +42 -13
  7. django_cfg/apps/accounts/admin/otp_admin.py +115 -0
  8. django_cfg/apps/accounts/admin/registration_admin.py +173 -0
  9. django_cfg/apps/accounts/admin/resources.py +123 -19
  10. django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
  11. django_cfg/apps/accounts/admin/user_admin.py +362 -0
  12. django_cfg/apps/agents/admin/__init__.py +17 -4
  13. django_cfg/apps/agents/admin/execution_admin.py +204 -183
  14. django_cfg/apps/agents/admin/registry_admin.py +230 -255
  15. django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
  16. django_cfg/apps/agents/core/__init__.py +1 -1
  17. django_cfg/apps/agents/core/django_agent.py +221 -0
  18. django_cfg/apps/agents/core/exceptions.py +14 -0
  19. django_cfg/apps/agents/core/orchestrator.py +18 -3
  20. django_cfg/apps/knowbase/admin/__init__.py +1 -1
  21. django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
  22. django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
  23. django_cfg/apps/knowbase/admin/document_admin.py +269 -262
  24. django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
  25. django_cfg/apps/knowbase/config/settings.py +21 -4
  26. django_cfg/apps/knowbase/views/chat_views.py +3 -0
  27. django_cfg/apps/leads/admin/__init__.py +3 -1
  28. django_cfg/apps/leads/admin/leads_admin.py +235 -35
  29. django_cfg/apps/maintenance/admin/__init__.py +2 -2
  30. django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
  31. django_cfg/apps/maintenance/admin/log_admin.py +143 -61
  32. django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
  33. django_cfg/apps/maintenance/admin/site_admin.py +213 -352
  34. django_cfg/apps/newsletter/admin/__init__.py +29 -2
  35. django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
  36. django_cfg/apps/payments/admin/__init__.py +18 -27
  37. django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
  38. django_cfg/apps/payments/admin/balance_admin.py +166 -632
  39. django_cfg/apps/payments/admin/currencies_admin.py +235 -607
  40. django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
  41. django_cfg/apps/payments/admin/filters.py +83 -3
  42. django_cfg/apps/payments/admin/networks_admin.py +269 -0
  43. django_cfg/apps/payments/admin/payments_admin.py +183 -460
  44. django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
  45. django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
  46. django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +153 -34
  47. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_card.html +121 -0
  48. django_cfg/apps/payments/admin_interface/templates/payments/components/payment_qr_code.html +95 -0
  49. django_cfg/apps/payments/admin_interface/templates/payments/components/progress_bar.html +37 -0
  50. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_stats.html +60 -0
  51. django_cfg/apps/payments/admin_interface/templates/payments/components/status_badge.html +41 -0
  52. django_cfg/apps/payments/admin_interface/templates/payments/components/status_overview.html +83 -0
  53. django_cfg/apps/payments/admin_interface/templates/payments/payment_detail.html +363 -0
  54. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +43 -17
  55. django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
  56. django_cfg/apps/payments/admin_interface/views/api/payments.py +102 -0
  57. django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +109 -63
  58. django_cfg/apps/payments/admin_interface/views/forms.py +5 -1
  59. django_cfg/apps/payments/config/__init__.py +14 -15
  60. django_cfg/apps/payments/config/django_cfg_integration.py +59 -1
  61. django_cfg/apps/payments/config/helpers.py +8 -13
  62. django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
  63. django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
  64. django_cfg/apps/payments/middleware/api_access.py +32 -6
  65. django_cfg/apps/payments/migrations/0001_initial.py +33 -46
  66. django_cfg/apps/payments/migrations/0002_rename_payments_un_user_id_7f6e79_idx_payments_un_user_id_8ce187_idx_and_more.py +46 -0
  67. django_cfg/apps/payments/migrations/0003_universalpayment_status_changed_at.py +25 -0
  68. django_cfg/apps/payments/models/balance.py +12 -0
  69. django_cfg/apps/payments/models/currencies.py +106 -32
  70. django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
  71. django_cfg/apps/payments/models/managers/payment_managers.py +142 -25
  72. django_cfg/apps/payments/models/payments.py +94 -0
  73. django_cfg/apps/payments/services/core/base.py +4 -4
  74. django_cfg/apps/payments/services/core/currency_service.py +35 -28
  75. django_cfg/apps/payments/services/core/payment_service.py +266 -39
  76. django_cfg/apps/payments/services/providers/__init__.py +3 -0
  77. django_cfg/apps/payments/services/providers/base.py +303 -41
  78. django_cfg/apps/payments/services/providers/models/__init__.py +42 -0
  79. django_cfg/apps/payments/services/providers/models/base.py +145 -0
  80. django_cfg/apps/payments/services/providers/models/providers.py +87 -0
  81. django_cfg/apps/payments/services/providers/models/universal.py +48 -0
  82. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
  83. django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
  84. django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
  85. django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
  86. django_cfg/apps/payments/services/providers/nowpayments/provider.py +557 -0
  87. django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
  88. django_cfg/apps/payments/services/providers/registry.py +9 -37
  89. django_cfg/apps/payments/services/providers/sync_service.py +277 -0
  90. django_cfg/apps/payments/services/types/requests.py +19 -7
  91. django_cfg/apps/payments/signals/payment_signals.py +31 -2
  92. django_cfg/apps/payments/static/payments/js/api-client.js +29 -6
  93. django_cfg/apps/payments/static/payments/js/payment-detail.js +167 -0
  94. django_cfg/apps/payments/static/payments/js/payment-form.js +98 -32
  95. django_cfg/apps/payments/tasks/__init__.py +39 -0
  96. django_cfg/apps/payments/tasks/types.py +73 -0
  97. django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
  98. django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
  99. django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
  100. django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
  101. django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
  102. django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
  103. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
  104. django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
  105. django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
  106. django_cfg/apps/payments/templatetags/payment_tags.py +8 -0
  107. django_cfg/apps/payments/urls.py +3 -2
  108. django_cfg/apps/payments/urls_admin.py +1 -1
  109. django_cfg/apps/payments/views/api/currencies.py +8 -5
  110. django_cfg/apps/payments/views/overview/services.py +2 -2
  111. django_cfg/apps/payments/views/serializers/currencies.py +22 -8
  112. django_cfg/apps/support/admin/__init__.py +10 -1
  113. django_cfg/apps/support/admin/support_admin.py +338 -141
  114. django_cfg/apps/tasks/admin/__init__.py +11 -0
  115. django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
  116. django_cfg/apps/tasks/static/tasks/css/dashboard.css +68 -217
  117. django_cfg/apps/tasks/static/tasks/js/api.js +40 -84
  118. django_cfg/apps/tasks/static/tasks/js/components/DataManager.js +24 -0
  119. django_cfg/apps/tasks/static/tasks/js/components/TabManager.js +85 -0
  120. django_cfg/apps/tasks/static/tasks/js/components/TaskRenderer.js +216 -0
  121. django_cfg/apps/tasks/static/tasks/js/dashboard/main.mjs +245 -0
  122. django_cfg/apps/tasks/static/tasks/js/dashboard/overview.mjs +123 -0
  123. django_cfg/apps/tasks/static/tasks/js/dashboard/queues.mjs +120 -0
  124. django_cfg/apps/tasks/static/tasks/js/dashboard/tasks.mjs +350 -0
  125. django_cfg/apps/tasks/static/tasks/js/dashboard/workers.mjs +169 -0
  126. django_cfg/apps/tasks/tasks/__init__.py +10 -0
  127. django_cfg/apps/tasks/tasks/demo_tasks.py +133 -0
  128. django_cfg/apps/tasks/templates/tasks/components/management_actions.html +42 -45
  129. django_cfg/apps/tasks/templates/tasks/components/{status_cards.html → overview_content.html} +30 -11
  130. django_cfg/apps/tasks/templates/tasks/components/queues_content.html +19 -0
  131. django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html +16 -10
  132. django_cfg/apps/tasks/templates/tasks/components/tasks_content.html +51 -0
  133. django_cfg/apps/tasks/templates/tasks/components/workers_content.html +30 -0
  134. django_cfg/apps/tasks/templates/tasks/layout/base.html +117 -0
  135. django_cfg/apps/tasks/templates/tasks/pages/dashboard.html +82 -0
  136. django_cfg/apps/tasks/templates/tasks/partials/task_row_template.html +40 -0
  137. django_cfg/apps/tasks/templates/tasks/widgets/task_filters.html +37 -0
  138. django_cfg/apps/tasks/templates/tasks/widgets/task_footer.html +41 -0
  139. django_cfg/apps/tasks/templates/tasks/widgets/task_table.html +50 -0
  140. django_cfg/apps/tasks/urls.py +2 -2
  141. django_cfg/apps/tasks/urls_admin.py +2 -2
  142. django_cfg/apps/tasks/utils/__init__.py +1 -0
  143. django_cfg/apps/tasks/utils/simulator.py +356 -0
  144. django_cfg/apps/tasks/views/__init__.py +16 -0
  145. django_cfg/apps/tasks/views/api.py +569 -0
  146. django_cfg/apps/tasks/views/dashboard.py +58 -0
  147. django_cfg/config.py +1 -1
  148. django_cfg/core/config.py +10 -5
  149. django_cfg/core/generation.py +1 -1
  150. django_cfg/core/integration/__init__.py +21 -0
  151. django_cfg/management/commands/__init__.py +13 -1
  152. django_cfg/management/commands/migrate_all.py +9 -3
  153. django_cfg/management/commands/migrator.py +11 -6
  154. django_cfg/management/commands/rundramatiq.py +3 -2
  155. django_cfg/management/commands/rundramatiq_simulator.py +430 -0
  156. django_cfg/middleware/__init__.py +0 -2
  157. django_cfg/models/api_keys.py +115 -0
  158. django_cfg/models/constance.py +0 -11
  159. django_cfg/models/payments.py +137 -3
  160. django_cfg/modules/django_admin/__init__.py +64 -0
  161. django_cfg/modules/django_admin/decorators/__init__.py +13 -0
  162. django_cfg/modules/django_admin/decorators/actions.py +106 -0
  163. django_cfg/modules/django_admin/decorators/display.py +106 -0
  164. django_cfg/modules/django_admin/mixins/__init__.py +14 -0
  165. django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
  166. django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
  167. django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
  168. django_cfg/modules/django_admin/models/__init__.py +20 -0
  169. django_cfg/modules/django_admin/models/action_models.py +33 -0
  170. django_cfg/modules/django_admin/models/badge_models.py +20 -0
  171. django_cfg/modules/django_admin/models/base.py +26 -0
  172. django_cfg/modules/django_admin/models/display_models.py +31 -0
  173. django_cfg/modules/django_admin/utils/badges.py +159 -0
  174. django_cfg/modules/django_admin/utils/displays.py +247 -0
  175. django_cfg/modules/django_currency/__init__.py +2 -2
  176. django_cfg/modules/django_currency/clients/__init__.py +2 -2
  177. django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
  178. django_cfg/modules/django_currency/core/converter.py +12 -12
  179. django_cfg/modules/django_currency/database/__init__.py +2 -2
  180. django_cfg/modules/django_currency/database/database_loader.py +93 -42
  181. django_cfg/modules/django_llm/llm/client.py +10 -2
  182. django_cfg/modules/django_tasks.py +54 -21
  183. django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
  184. django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
  185. django_cfg/modules/django_unfold/dashboard.py +14 -13
  186. django_cfg/modules/django_unfold/models/config.py +1 -1
  187. django_cfg/registry/core.py +7 -9
  188. django_cfg/registry/third_party.py +2 -2
  189. django_cfg/template_archive/django_sample.zip +0 -0
  190. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/METADATA +2 -1
  191. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/RECORD +198 -160
  192. django_cfg/apps/accounts/admin/activity.py +0 -96
  193. django_cfg/apps/accounts/admin/group.py +0 -17
  194. django_cfg/apps/accounts/admin/otp.py +0 -59
  195. django_cfg/apps/accounts/admin/registration_source.py +0 -97
  196. django_cfg/apps/accounts/admin/twilio_response.py +0 -227
  197. django_cfg/apps/accounts/admin/user.py +0 -300
  198. django_cfg/apps/agents/core/agent.py +0 -281
  199. django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
  200. django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
  201. django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
  202. django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
  203. django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
  204. django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
  205. django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
  206. django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
  207. django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
  208. django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
  209. django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
  210. django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
  211. django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
  212. django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
  213. django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
  214. django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
  215. django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
  216. django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
  217. django_cfg/apps/payments/config/constance/__init__.py +0 -22
  218. django_cfg/apps/payments/config/constance/config_service.py +0 -123
  219. django_cfg/apps/payments/config/constance/fields.py +0 -69
  220. django_cfg/apps/payments/config/constance/settings.py +0 -160
  221. django_cfg/apps/payments/services/providers/nowpayments.py +0 -478
  222. django_cfg/apps/tasks/admin.py +0 -320
  223. django_cfg/apps/tasks/static/tasks/js/dashboard.js +0 -614
  224. django_cfg/apps/tasks/static/tasks/js/modals.js +0 -452
  225. django_cfg/apps/tasks/static/tasks/js/notifications.js +0 -144
  226. django_cfg/apps/tasks/static/tasks/js/task-monitor.js +0 -454
  227. django_cfg/apps/tasks/static/tasks/js/theme.js +0 -77
  228. django_cfg/apps/tasks/templates/tasks/base.html +0 -96
  229. django_cfg/apps/tasks/templates/tasks/components/info_cards.html +0 -85
  230. django_cfg/apps/tasks/templates/tasks/components/overview_tab.html +0 -22
  231. django_cfg/apps/tasks/templates/tasks/components/queues_tab.html +0 -19
  232. django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html +0 -103
  233. django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html +0 -32
  234. django_cfg/apps/tasks/templates/tasks/components/workers_tab.html +0 -29
  235. django_cfg/apps/tasks/templates/tasks/dashboard.html +0 -29
  236. django_cfg/apps/tasks/views.py +0 -461
  237. django_cfg/management/commands/auto_generate.py +0 -486
  238. django_cfg/middleware/static_nocache.py +0 -55
  239. django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
  240. /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
  241. /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
  242. /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
  243. /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
  244. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/WHEEL +0 -0
  245. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/entry_points.txt +0 -0
  246. {django_cfg-1.3.7.dist-info → django_cfg-1.3.11.dist-info}/licenses/LICENSE +0 -0
@@ -1,500 +0,0 @@
1
- {% extends 'payments/base.html' %}
2
- {% load static %}
3
-
4
- {% block title %}Payment Status - Universal Payment System{% endblock %}
5
-
6
- {% block page_title %}Payment Status{% endblock %}
7
- {% block page_subtitle %}Track your payment progress in real-time{% endblock %}
8
-
9
- {% block extra_css %}
10
- <style>
11
- .status-timeline {
12
- position: relative;
13
- }
14
-
15
- .status-timeline::before {
16
- content: '';
17
- position: absolute;
18
- left: 16px;
19
- top: 0;
20
- bottom: 0;
21
- width: 2px;
22
- background: linear-gradient(to bottom, #3b82f6, #e5e7eb);
23
- }
24
-
25
- .timeline-item {
26
- position: relative;
27
- padding-left: 48px;
28
- padding-bottom: 24px;
29
- }
30
-
31
- .timeline-item:last-child {
32
- padding-bottom: 0;
33
- }
34
-
35
- .timeline-icon {
36
- position: absolute;
37
- left: 0;
38
- top: 0;
39
- width: 32px;
40
- height: 32px;
41
- border-radius: 50%;
42
- display: flex;
43
- align-items: center;
44
- justify-content: center;
45
- z-index: 1;
46
- }
47
-
48
- .timeline-icon.completed {
49
- background-color: #10b981;
50
- color: white;
51
- }
52
-
53
- .timeline-icon.current {
54
- background-color: #3b82f6;
55
- color: white;
56
- animation: pulse 2s infinite;
57
- }
58
-
59
- .timeline-icon.pending {
60
- background-color: #e5e7eb;
61
- color: #6b7280;
62
- }
63
-
64
- @keyframes pulse {
65
- 0%, 100% { transform: scale(1); }
66
- 50% { transform: scale(1.1); }
67
- }
68
-
69
- .payment-qr {
70
- max-width: 200px;
71
- margin: 0 auto;
72
- }
73
-
74
- .countdown {
75
- font-variant-numeric: tabular-nums;
76
- }
77
- </style>
78
- {% endblock %}
79
-
80
- {% block content %}
81
- <div x-data="paymentStatus('{{ payment.id }}')" x-init="init()" class="max-w-4xl mx-auto">
82
- <!-- Payment Header -->
83
- <div class="payment-card mb-8">
84
- <div class="flex items-center justify-between">
85
- <div class="flex items-center">
86
- <div class="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-4">
87
- <span class="material-icons-outlined text-blue-600 dark:text-blue-400">receipt_long</span>
88
- </div>
89
- <div>
90
- <h1 class="text-2xl font-bold text-gray-900 dark:text-white">Payment #{{ payment.external_id|default:payment.id|truncatechars:8 }}</h1>
91
- <p class="text-gray-600 dark:text-gray-400">Created {{ payment.created_at|date:"M d, Y H:i" }}</p>
92
- </div>
93
- </div>
94
-
95
- <div class="text-right">
96
- <div class="text-2xl font-bold text-gray-900 dark:text-white">
97
- ${{ payment.amount_usd|floatformat:2 }}
98
- </div>
99
- <div class="text-sm text-gray-600 dark:text-gray-400">
100
- {{ payment.currency.code }}
101
- </div>
102
- </div>
103
- </div>
104
- </div>
105
-
106
- <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
107
- <!-- Status Timeline -->
108
- <div class="lg:col-span-2">
109
- <div class="payment-card">
110
- <div class="payment-card-header">
111
- <h2 class="payment-card-title">
112
- <span class="material-icons-outlined">timeline</span>
113
- Payment Progress
114
- </h2>
115
- <div class="flex items-center">
116
- <span class="status-indicator" :class="getStatusIndicatorClass(payment.status)"></span>
117
- <span class="status-badge" :class="getStatusBadgeClass(payment.status)" x-text="payment.status_display"></span>
118
- </div>
119
- </div>
120
-
121
- <div class="payment-card-content">
122
- <div class="status-timeline">
123
- <!-- Created -->
124
- <div class="timeline-item">
125
- <div class="timeline-icon completed">
126
- <span class="material-icons-outlined text-sm">add_circle</span>
127
- </div>
128
- <div>
129
- <h3 class="font-medium text-gray-900 dark:text-white">Payment Created</h3>
130
- <p class="text-sm text-gray-600 dark:text-gray-400">
131
- Payment request initiated
132
- </p>
133
- <p class="text-xs text-gray-500 dark:text-gray-500 mt-1">
134
- {{ payment.created_at|date:"M d, Y H:i:s" }}
135
- </p>
136
- </div>
137
- </div>
138
-
139
- <!-- Processing -->
140
- <div class="timeline-item">
141
- <div class="timeline-icon" :class="payment.status === 'pending' || payment.status === 'processing' ? 'current' : (payment.status === 'completed' || payment.status === 'confirmed' ? 'completed' : 'pending')">
142
- <span class="material-icons-outlined text-sm">sync</span>
143
- </div>
144
- <div>
145
- <h3 class="font-medium text-gray-900 dark:text-white">Processing</h3>
146
- <p class="text-sm text-gray-600 dark:text-gray-400">
147
- <span x-show="payment.status === 'pending' || payment.status === 'processing'">
148
- Payment is being processed by {{ payment.provider|title }}
149
- </span>
150
- <span x-show="payment.status === 'completed' || payment.status === 'confirmed'">
151
- Payment processed successfully
152
- </span>
153
- <span x-show="payment.status === 'failed' || payment.status === 'cancelled'">
154
- Payment processing failed
155
- </span>
156
- </p>
157
- <p x-show="payment.updated_at" class="text-xs text-gray-500 dark:text-gray-500 mt-1" x-text="formatDate(payment.updated_at)"></p>
158
- </div>
159
- </div>
160
-
161
- <!-- Confirmation -->
162
- <div class="timeline-item">
163
- <div class="timeline-icon" :class="payment.status === 'completed' || payment.status === 'confirmed' ? 'completed' : 'pending'">
164
- <span class="material-icons-outlined text-sm">check_circle</span>
165
- </div>
166
- <div>
167
- <h3 class="font-medium text-gray-900 dark:text-white">Confirmation</h3>
168
- <p class="text-sm text-gray-600 dark:text-gray-400">
169
- <span x-show="payment.status === 'completed' || payment.status === 'confirmed'">
170
- Payment confirmed and completed
171
- </span>
172
- <span x-show="payment.status !== 'completed' && payment.status !== 'confirmed'">
173
- Waiting for confirmation
174
- </span>
175
- </p>
176
- <p x-show="payment.confirmed_at" class="text-xs text-gray-500 dark:text-gray-500 mt-1" x-text="formatDate(payment.confirmed_at)"></p>
177
- </div>
178
- </div>
179
- </div>
180
- </div>
181
- </div>
182
-
183
- <!-- Transaction Details -->
184
- <div class="payment-card mt-8">
185
- <div class="payment-card-header">
186
- <h2 class="payment-card-title">
187
- <span class="material-icons-outlined">info</span>
188
- Transaction Details
189
- </h2>
190
- </div>
191
-
192
- <div class="payment-card-content">
193
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
194
- <div>
195
- <h4 class="font-medium text-gray-900 dark:text-white mb-3">Payment Information</h4>
196
- <div class="space-y-2 text-sm">
197
- <div class="flex justify-between">
198
- <span class="text-gray-600 dark:text-gray-400">Payment ID:</span>
199
- <span class="font-mono" data-copy="{{ payment.id }}">{{ payment.id|truncatechars:12 }}</span>
200
- </div>
201
- <div class="flex justify-between">
202
- <span class="text-gray-600 dark:text-gray-400">External ID:</span>
203
- <span class="font-mono" x-text="payment.external_id || 'N/A'"></span>
204
- </div>
205
- <div class="flex justify-between">
206
- <span class="text-gray-600 dark:text-gray-400">Provider:</span>
207
- <span x-text="payment.provider"></span>
208
- </div>
209
- <div class="flex justify-between">
210
- <span class="text-gray-600 dark:text-gray-400">Network:</span>
211
- <span x-text="payment.network || 'N/A'"></span>
212
- </div>
213
- </div>
214
- </div>
215
-
216
- <div>
217
- <h4 class="font-medium text-gray-900 dark:text-white mb-3">Amount Details</h4>
218
- <div class="space-y-2 text-sm">
219
- <div class="flex justify-between">
220
- <span class="text-gray-600 dark:text-gray-400">USD Amount:</span>
221
- <span class="font-medium">${{ payment.amount_usd|floatformat:2 }}</span>
222
- </div>
223
- <div class="flex justify-between">
224
- <span class="text-gray-600 dark:text-gray-400">Crypto Amount:</span>
225
- <span class="font-mono" x-text="payment.amount_crypto || 'N/A'"></span>
226
- </div>
227
- <div class="flex justify-between">
228
- <span class="text-gray-600 dark:text-gray-400">Currency:</span>
229
- <span x-text="payment.currency_code"></span>
230
- </div>
231
- <div class="flex justify-between">
232
- <span class="text-gray-600 dark:text-gray-400">Exchange Rate:</span>
233
- <span x-text="payment.exchange_rate || 'N/A'"></span>
234
- </div>
235
- </div>
236
- </div>
237
- </div>
238
- </div>
239
- </div>
240
- </div>
241
-
242
- <!-- Payment Actions Sidebar -->
243
- <div class="space-y-6">
244
- <!-- Quick Actions -->
245
- <div class="payment-card">
246
- <div class="payment-card-header">
247
- <h3 class="payment-card-title">
248
- <span class="material-icons-outlined">bolt</span>
249
- Quick Actions
250
- </h3>
251
- </div>
252
-
253
- <div class="payment-card-content space-y-3">
254
- <button @click="refreshPayment()"
255
- :disabled="loading"
256
- class="btn-primary w-full">
257
- <span x-show="!loading" class="material-icons-outlined">refresh</span>
258
- <span x-show="loading" class="loading-spinner sm mr-2"></span>
259
- <span x-text="loading ? 'Refreshing...' : 'Refresh Status'"></span>
260
- </button>
261
-
262
- <button @click="copyPaymentUrl()" class="btn-outline w-full">
263
- <span class="material-icons-outlined">share</span>
264
- Share Payment
265
- </button>
266
-
267
- <button @click="downloadReceipt()"
268
- x-show="payment.status === 'completed' || payment.status === 'confirmed'"
269
- class="btn-outline w-full">
270
- <span class="material-icons-outlined">download</span>
271
- Download Receipt
272
- </button>
273
- </div>
274
- </div>
275
-
276
- <!-- Payment QR Code -->
277
- <div x-show="payment.qr_code_url || payment.payment_url" class="payment-card">
278
- <div class="payment-card-header">
279
- <h3 class="payment-card-title">
280
- <span class="material-icons-outlined">qr_code</span>
281
- Payment QR Code
282
- </h3>
283
- </div>
284
-
285
- <div class="payment-card-content text-center">
286
- <div class="payment-qr mb-4">
287
- <div x-show="payment.qr_code_url" class="bg-white p-4 rounded-lg inline-block">
288
- <img :src="payment.qr_code_url" alt="Payment QR Code" class="w-full h-auto">
289
- </div>
290
- <div x-show="!payment.qr_code_url" class="bg-gray-100 dark:bg-gray-700 p-8 rounded-lg">
291
- <span class="material-icons-outlined text-gray-400 text-4xl">qr_code</span>
292
- <p class="text-sm text-gray-500 mt-2">QR Code not available</p>
293
- </div>
294
- </div>
295
-
296
- <button x-show="payment.payment_url"
297
- @click="copyToClipboard(payment.payment_url)"
298
- class="btn-outline w-full text-sm">
299
- <span class="material-icons-outlined">content_copy</span>
300
- Copy Payment URL
301
- </button>
302
- </div>
303
- </div>
304
-
305
- <!-- Auto-refresh Settings -->
306
- <div class="payment-card">
307
- <div class="payment-card-header">
308
- <h3 class="payment-card-title">
309
- <span class="material-icons-outlined">settings</span>
310
- Auto-refresh
311
- </h3>
312
- </div>
313
-
314
- <div class="payment-card-content">
315
- <div class="flex items-center justify-between">
316
- <span class="text-sm text-gray-600 dark:text-gray-400">Enable auto-refresh</span>
317
- <label class="relative inline-flex items-center cursor-pointer">
318
- <input type="checkbox" x-model="autoRefresh" @change="toggleAutoRefresh()" class="sr-only peer">
319
- <div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-blue-300 dark:peer-focus:ring-blue-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-blue-600"></div>
320
- </label>
321
- </div>
322
-
323
- <div x-show="autoRefresh" class="mt-3">
324
- <div class="flex items-center justify-between text-sm">
325
- <span class="text-gray-600 dark:text-gray-400">Next refresh in:</span>
326
- <span class="countdown font-mono" x-text="formatCountdown(refreshCountdown)"></span>
327
- </div>
328
- <div class="w-full bg-gray-200 rounded-full h-1 mt-2">
329
- <div class="bg-blue-600 h-1 rounded-full transition-all duration-1000"
330
- :style="`width: ${(refreshCountdown / refreshInterval) * 100}%`"></div>
331
- </div>
332
- </div>
333
- </div>
334
- </div>
335
-
336
- <!-- Support -->
337
- <div class="payment-card">
338
- <div class="payment-card-header">
339
- <h3 class="payment-card-title">
340
- <span class="material-icons-outlined">support_agent</span>
341
- Need Help?
342
- </h3>
343
- </div>
344
-
345
- <div class="payment-card-content space-y-3">
346
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
347
- <span class="material-icons-outlined mr-2 text-sm">help</span>
348
- Payment FAQ
349
- </a>
350
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
351
- <span class="material-icons-outlined mr-2 text-sm">chat</span>
352
- Contact Support
353
- </a>
354
- <a href="#" class="flex items-center text-sm text-blue-600 hover:text-blue-800">
355
- <span class="material-icons-outlined mr-2 text-sm">bug_report</span>
356
- Report Issue
357
- </a>
358
- </div>
359
- </div>
360
- </div>
361
- </div>
362
- </div>
363
- {% endblock %}
364
-
365
- {% block extra_js %}
366
- <script>
367
- function paymentStatus(paymentId) {
368
- return {
369
- payment: {
370
- id: '{{ payment.id }}',
371
- external_id: '{{ payment.external_id|default:"" }}',
372
- status: '{{ payment.status }}',
373
- status_display: '{{ payment.get_status_display }}',
374
- amount_usd: {{ payment.amount_usd }},
375
- currency_code: '{{ payment.currency.code }}',
376
- provider: '{{ payment.provider }}',
377
- created_at: '{{ payment.created_at|date:"c" }}',
378
- updated_at: '{{ payment.updated_at|date:"c" }}',
379
- payment_url: '{{ payment.payment_url|default:"" }}',
380
- qr_code_url: '{{ payment.qr_code_url|default:"" }}'
381
- },
382
- loading: false,
383
- autoRefresh: false,
384
- refreshInterval: 30000, // 30 seconds
385
- refreshCountdown: 30,
386
- refreshTimer: null,
387
- countdownTimer: null,
388
-
389
- async init() {
390
- // Auto-enable refresh for pending payments
391
- if (this.payment.status === 'pending' || this.payment.status === 'processing') {
392
- this.autoRefresh = true;
393
- this.toggleAutoRefresh();
394
- }
395
- },
396
-
397
- async refreshPayment() {
398
- this.loading = true;
399
- try {
400
- const response = await fetch(`/payments/api/payments/${this.payment.id}/`);
401
- const data = await response.json();
402
-
403
- if (response.ok) {
404
- this.payment = { ...this.payment, ...data };
405
- PaymentSystem.Utils.showNotification('Payment status updated', 'success', 'refresh');
406
-
407
- // Disable auto-refresh if payment is completed
408
- if (this.payment.status === 'completed' || this.payment.status === 'failed') {
409
- this.autoRefresh = false;
410
- this.toggleAutoRefresh();
411
- }
412
- } else {
413
- throw new Error(data.error || 'Failed to refresh payment');
414
- }
415
- } catch (error) {
416
- console.error('Failed to refresh payment:', error);
417
- PaymentSystem.Utils.showNotification('Failed to refresh payment status', 'error', 'error');
418
- } finally {
419
- this.loading = false;
420
- }
421
- },
422
-
423
- toggleAutoRefresh() {
424
- if (this.autoRefresh) {
425
- this.startAutoRefresh();
426
- } else {
427
- this.stopAutoRefresh();
428
- }
429
- },
430
-
431
- startAutoRefresh() {
432
- this.refreshCountdown = this.refreshInterval / 1000;
433
-
434
- this.refreshTimer = setInterval(() => {
435
- this.refreshPayment();
436
- this.refreshCountdown = this.refreshInterval / 1000;
437
- }, this.refreshInterval);
438
-
439
- this.countdownTimer = setInterval(() => {
440
- this.refreshCountdown--;
441
- if (this.refreshCountdown <= 0) {
442
- this.refreshCountdown = this.refreshInterval / 1000;
443
- }
444
- }, 1000);
445
- },
446
-
447
- stopAutoRefresh() {
448
- if (this.refreshTimer) {
449
- clearInterval(this.refreshTimer);
450
- this.refreshTimer = null;
451
- }
452
- if (this.countdownTimer) {
453
- clearInterval(this.countdownTimer);
454
- this.countdownTimer = null;
455
- }
456
- },
457
-
458
- copyPaymentUrl() {
459
- const url = window.location.href;
460
- PaymentSystem.Utils.copyToClipboard(url, 'Payment URL copied to clipboard!');
461
- },
462
-
463
- copyToClipboard(text) {
464
- PaymentSystem.Utils.copyToClipboard(text);
465
- },
466
-
467
- downloadReceipt() {
468
- // This would generate and download a PDF receipt
469
- PaymentSystem.Utils.showNotification('Receipt download started', 'info', 'download');
470
- },
471
-
472
- getStatusIndicatorClass(status) {
473
- const statusMap = {
474
- 'completed': 'status-active',
475
- 'confirmed': 'status-active',
476
- 'pending': 'status-warning',
477
- 'processing': 'status-warning',
478
- 'failed': 'status-inactive',
479
- 'cancelled': 'status-inactive'
480
- };
481
- return statusMap[status] || 'status-warning';
482
- },
483
-
484
- getStatusBadgeClass(status) {
485
- return PaymentSystem.Utils.getStatusBadgeClass(status);
486
- },
487
-
488
- formatDate(dateString) {
489
- return PaymentSystem.Utils.formatDate(dateString);
490
- },
491
-
492
- formatCountdown(seconds) {
493
- const mins = Math.floor(seconds / 60);
494
- const secs = seconds % 60;
495
- return `${mins}:${secs.toString().padStart(2, '0')}`;
496
- }
497
- }
498
- }
499
- </script>
500
- {% endblock %}