dana-python 1.1.3__tar.gz → 1.1.5__tar.gz

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 (226) hide show
  1. {dana_python-1.1.3/dana_python.egg-info → dana_python-1.1.5}/PKG-INFO +1 -1
  2. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/enum.py +3 -0
  3. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/consult_pay_payment_info.py +3 -3
  4. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_response_additional_info.py +2 -3
  5. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/pay_option_additional_info.py +2 -2
  6. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/pay_option_detail.py +3 -3
  7. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/pay_option_info.py +5 -5
  8. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/open_api_header.py +1 -1
  9. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/snap_header.py +1 -3
  10. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/finish_notify_payment_info.py +7 -7
  11. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/finish_notify_request.py +0 -14
  12. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/finish_notify_request_additional_info.py +7 -2
  13. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/pay_option_info.py +1 -1
  14. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/webhook.py +24 -9
  15. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/enum.py +3 -0
  16. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/pay_option_info.py +5 -5
  17. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/util.py +1 -1
  18. {dana_python-1.1.3 → dana_python-1.1.5/dana_python.egg-info}/PKG-INFO +1 -1
  19. {dana_python-1.1.3 → dana_python-1.1.5}/pyproject.toml +1 -1
  20. dana_python-1.1.5/tests/test_webhook.py +66 -0
  21. dana_python-1.1.3/tests/test_webhook.py +0 -60
  22. {dana_python-1.1.3 → dana_python-1.1.5}/LICENSE +0 -0
  23. {dana_python-1.1.3 → dana_python-1.1.5}/README.md +0 -0
  24. {dana_python-1.1.3 → dana_python-1.1.5}/dana/__init__.py +0 -0
  25. {dana_python-1.1.3 → dana_python-1.1.5}/dana/api_client.py +0 -0
  26. {dana_python-1.1.3 → dana_python-1.1.5}/dana/api_response.py +0 -0
  27. {dana_python-1.1.3 → dana_python-1.1.5}/dana/base/__init__.py +0 -0
  28. {dana_python-1.1.3 → dana_python-1.1.5}/dana/base/configuration.py +0 -0
  29. {dana_python-1.1.3 → dana_python-1.1.5}/dana/base/model.py +0 -0
  30. {dana_python-1.1.3 → dana_python-1.1.5}/dana/base/types.py +0 -0
  31. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/__init__.py +0 -0
  32. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/__init__.py +0 -0
  33. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/api/__init__.py +0 -0
  34. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/api/disbursement_api.py +0 -0
  35. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/enum.py +0 -0
  36. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/__init__.py +0 -0
  37. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/bank_account_inquiry_request.py +0 -0
  38. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/bank_account_inquiry_request_additional_info.py +0 -0
  39. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/bank_account_inquiry_response.py +0 -0
  40. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/bank_account_inquiry_response_additional_info.py +0 -0
  41. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/dana_account_inquiry_request.py +0 -0
  42. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/dana_account_inquiry_request_additional_info.py +0 -0
  43. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/dana_account_inquiry_response.py +0 -0
  44. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/money.py +0 -0
  45. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_request.py +0 -0
  46. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_response.py +0 -0
  47. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_bank_request.py +0 -0
  48. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_bank_request_additional_info.py +0 -0
  49. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_bank_response.py +0 -0
  50. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_request.py +0 -0
  51. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_response.py +0 -0
  52. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_dana_request.py +0 -0
  53. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_dana_request_additional_info.py +0 -0
  54. {dana_python-1.1.3 → dana_python-1.1.5}/dana/disbursement/v1/models/transfer_to_dana_response.py +0 -0
  55. {dana_python-1.1.3 → dana_python-1.1.5}/dana/exceptions.py +0 -0
  56. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/__init__.py +0 -0
  57. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/__init__.py +0 -0
  58. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/api/__init__.py +0 -0
  59. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/api/merchant_management_api.py +0 -0
  60. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/enum.py +0 -0
  61. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/__init__.py +0 -0
  62. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/address_info.py +0 -0
  63. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/business_docs.py +0 -0
  64. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_request.py +0 -0
  65. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_request_ext_info.py +0 -0
  66. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_response.py +0 -0
  67. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_response_response.py +0 -0
  68. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_response_response_body.py +0 -0
  69. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_division_response_response_head.py +0 -0
  70. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_shop_request.py +0 -0
  71. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_shop_response.py +0 -0
  72. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_shop_response_response.py +0 -0
  73. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_shop_response_response_body.py +0 -0
  74. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/create_shop_response_response_head.py +0 -0
  75. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/division_resource_info.py +0 -0
  76. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/merchant_resource_information.py +0 -0
  77. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/mobile_no_info.py +0 -0
  78. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/pic_info.py +0 -0
  79. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_division_request.py +0 -0
  80. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_division_response.py +0 -0
  81. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_division_response_response.py +0 -0
  82. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_division_response_response_body.py +0 -0
  83. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_division_response_response_head.py +0 -0
  84. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_merchant_resource_request.py +0 -0
  85. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_merchant_resource_response.py +0 -0
  86. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_merchant_resource_response_response.py +0 -0
  87. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_merchant_resource_response_response_body.py +0 -0
  88. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_merchant_resource_response_response_head.py +0 -0
  89. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_shop_request.py +0 -0
  90. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_shop_response.py +0 -0
  91. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_shop_response_response.py +0 -0
  92. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_shop_response_response_body.py +0 -0
  93. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/query_shop_response_response_head.py +0 -0
  94. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/result_info.py +0 -0
  95. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/shop_resource_info.py +0 -0
  96. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_division_request.py +0 -0
  97. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_division_response.py +0 -0
  98. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_division_response_response.py +0 -0
  99. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_division_response_response_body.py +0 -0
  100. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_division_response_response_head.py +0 -0
  101. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_shop_request.py +0 -0
  102. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_shop_response.py +0 -0
  103. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_shop_response_response.py +0 -0
  104. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/update_shop_response_response_head.py +0 -0
  105. {dana_python-1.1.3 → dana_python-1.1.5}/dana/merchant_management/v1/models/user_name.py +0 -0
  106. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/__init__.py +0 -0
  107. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/__init__.py +0 -0
  108. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/api/__init__.py +0 -0
  109. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/api/payment_gateway_api.py +0 -0
  110. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/__init__.py +0 -0
  111. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/actor_context.py +0 -0
  112. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/amount_detail.py +0 -0
  113. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/audit_info.py +0 -0
  114. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/buyer.py +0 -0
  115. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/cancel_order_request.py +0 -0
  116. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/cancel_order_response.py +0 -0
  117. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/consult_pay_request.py +0 -0
  118. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/consult_pay_request_additional_info.py +0 -0
  119. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/consult_pay_response.py +0 -0
  120. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_by_api_additional_info.py +0 -0
  121. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_by_api_request.py +0 -0
  122. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_by_redirect_additional_info.py +0 -0
  123. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_by_redirect_request.py +0 -0
  124. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/create_order_response.py +0 -0
  125. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/env_info.py +0 -0
  126. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/goods.py +0 -0
  127. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/money.py +0 -0
  128. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/order_api_object.py +0 -0
  129. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/order_redirect_object.py +0 -0
  130. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/payment_view.py +0 -0
  131. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/promo_info.py +0 -0
  132. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/query_payment_request.py +0 -0
  133. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/query_payment_response.py +0 -0
  134. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/query_payment_response_additional_info.py +0 -0
  135. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/refund_option_bill.py +0 -0
  136. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/refund_order_request.py +0 -0
  137. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/refund_order_request_additional_info.py +0 -0
  138. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/refund_order_response.py +0 -0
  139. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/seller.py +0 -0
  140. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/shipping_info.py +0 -0
  141. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/status_detail.py +0 -0
  142. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/time_detail.py +0 -0
  143. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/url_param.py +0 -0
  144. {dana_python-1.1.3 → dana_python-1.1.5}/dana/payment_gateway/v1/models/virtual_account_info.py +0 -0
  145. {dana_python-1.1.3 → dana_python-1.1.5}/dana/rest.py +0 -0
  146. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/models.py +0 -0
  147. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/open_api_configuration.py +0 -0
  148. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/script.py +0 -0
  149. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/snap_configuration.py +0 -0
  150. {dana_python-1.1.3 → dana_python-1.1.5}/dana/utils/url.py +0 -0
  151. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/__init__.py +0 -0
  152. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/finish_notify_response.py +0 -0
  153. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/money.py +0 -0
  154. {dana_python-1.1.3 → dana_python-1.1.5}/dana/webhook/shop_info.py +0 -0
  155. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/__init__.py +0 -0
  156. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/__init__.py +0 -0
  157. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/api/__init__.py +0 -0
  158. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/api/widget_api.py +0 -0
  159. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/__init__.py +0 -0
  160. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/account_info.py +0 -0
  161. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/account_unbinding_request.py +0 -0
  162. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/account_unbinding_request_additional_info.py +0 -0
  163. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/account_unbinding_response.py +0 -0
  164. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/amount_detail.py +0 -0
  165. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_ott_request.py +0 -0
  166. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_ott_request_additional_info.py +0 -0
  167. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_ott_response.py +0 -0
  168. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_ott_response_user_resources_inner.py +0 -0
  169. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_token_authorization_code_request.py +0 -0
  170. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_token_refresh_token_request.py +0 -0
  171. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_token_response.py +0 -0
  172. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_token_response_additional_info.py +0 -0
  173. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/apply_token_response_additional_info_user_info.py +0 -0
  174. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/balance_inquiry_request.py +0 -0
  175. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/balance_inquiry_request_additional_info.py +0 -0
  176. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/balance_inquiry_response.py +0 -0
  177. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/buyer.py +0 -0
  178. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/cancel_order_request.py +0 -0
  179. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/cancel_order_response.py +0 -0
  180. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/env_info.py +0 -0
  181. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/goods.py +0 -0
  182. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/international_order_info.py +0 -0
  183. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/international_order_info_exchange_rate.py +0 -0
  184. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/money.py +0 -0
  185. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/oauth2_url_data.py +0 -0
  186. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/oauth2_url_data_seamless_data.py +0 -0
  187. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/order.py +0 -0
  188. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/pay_option_detail.py +0 -0
  189. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/pay_option_detail_additional_info.py +0 -0
  190. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/payment_promo_info.py +0 -0
  191. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/payment_view.py +0 -0
  192. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_payment_request.py +0 -0
  193. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_payment_response.py +0 -0
  194. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_payment_response_additional_info.py +0 -0
  195. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_user_profile_request.py +0 -0
  196. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_user_profile_response.py +0 -0
  197. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_user_profile_response_response.py +0 -0
  198. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_user_profile_response_response_body.py +0 -0
  199. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/query_user_profile_response_response_head.py +0 -0
  200. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/refund_order_request.py +0 -0
  201. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/refund_order_request_additional_info.py +0 -0
  202. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/refund_order_response.py +0 -0
  203. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/refund_promo_info.py +0 -0
  204. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/result_info.py +0 -0
  205. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/seller.py +0 -0
  206. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/service_info.py +0 -0
  207. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/shipping_info.py +0 -0
  208. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/status_detail.py +0 -0
  209. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/time_detail.py +0 -0
  210. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/url_param.py +0 -0
  211. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/user_resource_info.py +0 -0
  212. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/virtual_account_info.py +0 -0
  213. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/widget_payment_request.py +0 -0
  214. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/widget_payment_request_additional_info.py +0 -0
  215. {dana_python-1.1.3 → dana_python-1.1.5}/dana/widget/v1/models/widget_payment_response.py +0 -0
  216. {dana_python-1.1.3 → dana_python-1.1.5}/dana_python.egg-info/SOURCES.txt +0 -0
  217. {dana_python-1.1.3 → dana_python-1.1.5}/dana_python.egg-info/dependency_links.txt +0 -0
  218. {dana_python-1.1.3 → dana_python-1.1.5}/dana_python.egg-info/requires.txt +0 -0
  219. {dana_python-1.1.3 → dana_python-1.1.5}/dana_python.egg-info/top_level.txt +0 -0
  220. {dana_python-1.1.3 → dana_python-1.1.5}/setup.cfg +0 -0
  221. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_disbursement_api.py +0 -0
  222. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_merchant_management_api.py +0 -0
  223. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_payment_gateway_api.py +0 -0
  224. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_payment_gateway_with_automation.py +0 -0
  225. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_widget_api.py +0 -0
  226. {dana_python-1.1.3 → dana_python-1.1.5}/tests/test_widget_with_automation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dana-python
3
- Version: 1.1.3
3
+ Version: 1.1.5
4
4
  Summary: API Client (SDK) for DANA APIs based on https://dashboard.dana.id/api-docs
5
5
  Author-email: DANA Package Manager <package-manager@dana.id>
6
6
  Maintainer-email: DANA Package Manager <package-manager@dana.id>
@@ -33,6 +33,8 @@ class PayOption(str, Enum):
33
33
  NETWORK_PAY_PG_GOPAY = "NETWORK_PAY_PG_GOPAY"
34
34
  NETWORK_PAY_PG_LINKAJA = "NETWORK_PAY_PG_LINKAJA"
35
35
  NETWORK_PAY_PG_CARD = "NETWORK_PAY_PG_CARD"
36
+ NETWORK_PAY_PC_INDOMARET = "NETWORK_PAY_PC_INDOMARET"
37
+ NETWORK_PAY_PG_QRIS = "NETWORK_PAY_PG_QRIS"
36
38
  VIRTUAL_ACCOUNT_BCA = "VIRTUAL_ACCOUNT_BCA"
37
39
  VIRTUAL_ACCOUNT_BNI = "VIRTUAL_ACCOUNT_BNI"
38
40
  VIRTUAL_ACCOUNT_MANDIRI = "VIRTUAL_ACCOUNT_MANDIRI"
@@ -40,6 +42,7 @@ class PayOption(str, Enum):
40
42
  VIRTUAL_ACCOUNT_BTPN = "VIRTUAL_ACCOUNT_BTPN"
41
43
  VIRTUAL_ACCOUNT_CIMB = "VIRTUAL_ACCOUNT_CIMB"
42
44
  VIRTUAL_ACCOUNT_PERMATA = "VIRTUAL_ACCOUNT_PERMATA"
45
+ VIRTUAL_ACCOUNT_PANIN = "VIRTUAL_ACCOUNT_PANIN"
43
46
 
44
47
  class AcquirementStatus(str, Enum):
45
48
  INIT = "INIT"
@@ -47,7 +47,7 @@ class ConsultPayPaymentInfo(BaseModel, BaseSdkModel):
47
47
  ConsultPayPaymentInfo
48
48
  """ # noqa: E501
49
49
  pay_method: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment method that used to payment. The enums:<br> * BALANCE - Payment method with balance<br> * COUPON - Payment method with coupon<br> * NET_BANKING - Payment method with internet banking<br> * CREDIT_CARD - Payment method with credit card<br> * DEBIT_CARD - Payment method with debit card<br> * VIRTUAL_ACCOUNT - Payment method with virtual account<br> * OTC - Payment method with OTC<br> * DIRECT_DEBIT_CREDIT_CARD - Payment method with direct debit of credit card<br> * DIRECT_DEBIT_DEBIT_CARD - Payment method with direct debit of debit card<br> * ONLINE_CREDIT - Payment method with online Credit<br> * LOAN_CREDIT - Payment method with DANA Cicil<br> * NETWORK_PAY - Payment method with e-wallet<br> * CARD - Payment method with card<br> ")
50
- pay_option: Optional[Annotated[str, Field(strict=True, max_length=128)]] = Field(default=None, description="Payment option that available to used to payment, depends on the payment method. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> ")
50
+ pay_option: Optional[Annotated[str, Field(strict=True, max_length=128)]] = Field(default=None, description="Payment option that available to used to payment, depends on the payment method. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * NETWORK_PAY_PC_INDOMARET - Payment method with Indomaret<br> * NETWORK_PAY_PG_QRIS - Payment method with QRIS<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> * VIRTUAL_ACCOUNT_PANIN - Payment method with Panin virtual account<br> ")
51
51
  promo_infos: Optional[List[PromoInfo]] = Field(default=None, description="Additional Information of promotion")
52
52
  __properties: ClassVar[List[str]] = ["payMethod", "payOption", "promoInfos"]
53
53
 
@@ -66,8 +66,8 @@ class ConsultPayPaymentInfo(BaseModel, BaseSdkModel):
66
66
  if not value:
67
67
  return value
68
68
 
69
- if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA']):
70
- raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA')")
69
+ if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN']):
70
+ raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN')")
71
71
  return value
72
72
 
73
73
  model_config = ConfigDict(
@@ -33,9 +33,8 @@ import json
33
33
 
34
34
  from dana.base.model import BaseSdkModel
35
35
 
36
- from pydantic import BaseModel, ConfigDict, Field
36
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
37
37
  from typing import Any, ClassVar, Dict, List, Optional
38
- from typing_extensions import Annotated
39
38
  from typing import Optional, Set
40
39
  from typing_extensions import Self
41
40
  from pydantic import AliasGenerator
@@ -45,7 +44,7 @@ class CreateOrderResponseAdditionalInfo(BaseModel, BaseSdkModel):
45
44
  """
46
45
  CreateOrderResponseAdditionalInfo
47
46
  """ # noqa: E501
48
- payment_code: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Additional information of payment code. Only use for Payment Gateway service. Present if payment using Virtual Account/QRIS")
47
+ payment_code: Optional[StrictStr] = Field(default=None, description="Additional information of payment code. Only use for Payment Gateway service. Present if payment using Virtual Account/QRIS")
49
48
  __properties: ClassVar[List[str]] = ["paymentCode"]
50
49
 
51
50
  model_config = ConfigDict(
@@ -33,7 +33,7 @@ import json
33
33
 
34
34
  from dana.base.model import BaseSdkModel
35
35
 
36
- from pydantic import BaseModel, ConfigDict, Field
36
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr
37
37
  from typing import Any, ClassVar, Dict, List, Optional
38
38
  from typing_extensions import Annotated
39
39
  from dana.payment_gateway.v1.models.promo_info import PromoInfo
@@ -47,7 +47,7 @@ class PayOptionAdditionalInfo(BaseModel, BaseSdkModel):
47
47
  PayOptionAdditionalInfo
48
48
  """ # noqa: E501
49
49
  phone_number: Optional[Annotated[str, Field(strict=True, max_length=15)]] = Field(default=None, description="User's phone number")
50
- payment_code: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment code that used for payment with virtual account")
50
+ payment_code: Optional[StrictStr] = Field(default=None, description="Payment code that used for payment with virtual account")
51
51
  promo_infos: Optional[List[PromoInfo]] = Field(default=None)
52
52
  __properties: ClassVar[List[str]] = ["phoneNumber", "paymentCode", "promoInfos"]
53
53
 
@@ -48,7 +48,7 @@ class PayOptionDetail(BaseModel, BaseSdkModel):
48
48
  PayOptionDetail
49
49
  """ # noqa: E501
50
50
  pay_method: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment method that used to payment. The enums:<br> * BALANCE - Payment method with balance<br> * COUPON - Payment method with coupon<br> * NET_BANKING - Payment method with internet banking<br> * CREDIT_CARD - Payment method with credit card<br> * DEBIT_CARD - Payment method with debit card<br> * VIRTUAL_ACCOUNT - Payment method with virtual account<br> * OTC - Payment method with OTC<br> * DIRECT_DEBIT_CREDIT_CARD - Payment method with direct debit of credit card<br> * DIRECT_DEBIT_DEBIT_CARD - Payment method with direct debit of debit card<br> * ONLINE_CREDIT - Payment method with online Credit<br> * LOAN_CREDIT - Payment method with DANA Cicil<br> * NETWORK_PAY - Payment method with e-wallet<br> * CARD - Payment method with card<br> ")
51
- pay_option: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment option that available to used to payment, depends on the payment method. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * NETWORK_PAY_PG_QRIS - Payment method with QRIS<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> ")
51
+ pay_option: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment option that available to used to payment, depends on the payment method. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * NETWORK_PAY_PG_QRIS - Payment method with QRIS<br> * NETWORK_PAY_PC_INDOMARET - Payment method with Indomaret<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> * VIRTUAL_ACCOUNT_PANIN - Payment method with Panin virtual account<br> ")
52
52
  trans_amount: Money = Field()
53
53
  fee_amount: Optional[Money] = Field(default=None)
54
54
  card_token: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Token that used for payment with card")
@@ -70,8 +70,8 @@ class PayOptionDetail(BaseModel, BaseSdkModel):
70
70
  """Validates the enum"""
71
71
  if value == "":
72
72
  return value
73
- if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA']):
74
- raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA')")
73
+ if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PG_QRIS', 'NETWORK_PAY_PC_INDOMARET', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN']):
74
+ raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PG_QRIS', 'NETWORK_PAY_PC_INDOMARET', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN')")
75
75
  return value
76
76
 
77
77
  model_config = ConfigDict(
@@ -33,7 +33,7 @@ import json
33
33
 
34
34
  from dana.base.model import BaseSdkModel
35
35
 
36
- from pydantic import BaseModel, ConfigDict, Field, field_validator
36
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator
37
37
  from typing import Any, ClassVar, Dict, List, Optional
38
38
  from typing_extensions import Annotated
39
39
  from dana.payment_gateway.v1.models.money import Money
@@ -47,13 +47,13 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
47
47
  PayOptionInfo
48
48
  """ # noqa: E501
49
49
  pay_method: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment method name. The enums:<br> * BALANCE - Payment method with balance<br> * COUPON - Payment method with coupon<br> * NET_BANKING - Payment method with internet banking<br> * CREDIT_CARD - Payment method with credit card<br> * DEBIT_CARD - Payment method with debit card<br> * VIRTUAL_ACCOUNT - Payment method with virtual account<br> * OTC - Payment method with OTC<br> * DIRECT_DEBIT_CREDIT_CARD - Payment method with direct debit of credit card<br> * DIRECT_DEBIT_DEBIT_CARD - Payment method with direct debit of debit card<br> * ONLINE_CREDIT - Payment method with online Credit<br> * LOAN_CREDIT - Payment method with DANA Cicil<br> * NETWORK_PAY - Payment method with e-wallet * CARD - Payment method with Card ")
50
- pay_option: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment option which shows the provider of this payment. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> ")
50
+ pay_option: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment option which shows the provider of this payment. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * NETWORK_PAY_PC_INDOMARET - Payment method with Indomaret<br> * NETWORK_PAY_PG_QRIS - Payment method with QRIS<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> * VIRTUAL_ACCOUNT_PANIN - Payment method with Panin virtual account<br> ")
51
51
  pay_amount: Optional[Money] = Field(default=None, description="Pay amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
52
52
  trans_amount: Optional[Money] = Field(default=None, description="Trans amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
53
53
  charge_amount: Optional[Money] = Field(default=None, description="Charge amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
54
54
  pay_option_bill_extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information of pay option bill")
55
55
  extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information")
56
- payment_code: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment code")
56
+ payment_code: Optional[StrictStr] = Field(default=None, description="Payment code")
57
57
  __properties: ClassVar[List[str]] = ["payMethod", "payOption", "payAmount", "transAmount", "chargeAmount", "payOptionBillExtendInfo", "extendInfo", "paymentCode"]
58
58
 
59
59
  @field_validator('pay_method')
@@ -71,8 +71,8 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
71
71
  if not value:
72
72
  return value
73
73
 
74
- if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA']):
75
- raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA')")
74
+ if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN']):
75
+ raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN')")
76
76
  return value
77
77
 
78
78
  model_config = ConfigDict(
@@ -153,7 +153,7 @@ class OpenApiHeader:
153
153
  timestamp = jakarta_time.strftime('%Y-%m-%dT%H:%M:%S+07:00')
154
154
 
155
155
  # Generate unique request message ID
156
- req_msg_id = str(uuid.uuid4())
156
+ req_msg_id = "sdk" + str(uuid.uuid4())[3:]
157
157
 
158
158
  # Return auth settings following snap_header pattern
159
159
  return {
@@ -259,6 +259,7 @@ class SnapHeader:
259
259
  )
260
260
 
261
261
  encoded_signature = base64.b64encode(signature).decode()
262
+ external_id = "sdk" + str(uuid.uuid4())[3:]
262
263
 
263
264
  if scenario == "apply_token":
264
265
  return {
@@ -268,7 +269,6 @@ class SnapHeader:
268
269
  CHANNEL_ID: generateApiKeyAuthSetting(key=CHANNEL_ID, value='95221')
269
270
  }
270
271
  elif scenario == "apply_ott" or scenario == "unbinding_account":
271
- external_id = str(uuid.uuid4())
272
272
  body_dict: dict = json.loads(body)
273
273
 
274
274
  return {
@@ -283,7 +283,6 @@ class SnapHeader:
283
283
  CHANNEL_ID: generateApiKeyAuthSetting(key=CHANNEL_ID, value='95221')
284
284
  }
285
285
  elif scenario == "balance_inquiry":
286
- external_id = str(uuid.uuid4())
287
286
  body_dict: dict = json.loads(body)
288
287
  return {
289
288
  AUTHORIZATION_CUSTOMER: generateApiKeyAuthSetting(key=AUTHORIZATION_CUSTOMER, value=f"Bearer {body_dict.get('additionalInfo', {}).get('accessToken', '')}"),
@@ -294,7 +293,6 @@ class SnapHeader:
294
293
  CHANNEL_ID: generateApiKeyAuthSetting(key=CHANNEL_ID, value='95221')
295
294
  }
296
295
  else:
297
- external_id = str(uuid.uuid4())
298
296
  return {
299
297
  X_TIMESTAMP: generateApiKeyAuthSetting(key=X_TIMESTAMP, value=timestamp),
300
298
  X_SIGNATURE: generateApiKeyAuthSetting(key=X_SIGNATURE, value=encoded_signature),
@@ -46,8 +46,8 @@ class FinishNotifyPaymentInfo(BaseModel, BaseSdkModel):
46
46
  """
47
47
  FinishNotifyPaymentInfo
48
48
  """ # noqa: E501
49
- cashier_request_id: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Cashier request identifier")
50
- paid_time: Annotated[str, Field(strict=True, max_length=25)] = Field(description="Information of paid time, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
49
+ cashier_request_id: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(description="Cashier request identifier")
50
+ paid_time: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(description="Information of paid time, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
51
51
  pay_option_infos: List[PayOptionInfo] = Field(description="Information of pay option. Refer to payOptionInfos for the detailed")
52
52
  pay_request_extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information of pay request")
53
53
  extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information")
@@ -56,7 +56,7 @@ class FinishNotifyPaymentInfo(BaseModel, BaseSdkModel):
56
56
  @field_validator('paid_time')
57
57
  def paid_time_validate_regular_expression(cls, value):
58
58
  """Validates the regular expression"""
59
- if not re.match(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$", value):
59
+ if value is not None and not re.match(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$", value):
60
60
  raise ValueError(r"must validate the regular expression /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$/")
61
61
  return value
62
62
 
@@ -119,11 +119,11 @@ class FinishNotifyPaymentInfo(BaseModel, BaseSdkModel):
119
119
  return cls.model_validate(obj)
120
120
 
121
121
  _obj = cls.model_validate({
122
- "cashierRequestId": obj.get("cashierRequestId"),
123
- "paidTime": obj.get("paidTime"),
122
+ "cashierRequestId": obj.get("cashierRequestId") if obj.get("cashierRequestId") is not None else None,
123
+ "paidTime": obj.get("paidTime") if obj.get("paidTime") is not None else None,
124
124
  "payOptionInfos": [PayOptionInfo.from_dict(_item) for _item in obj["payOptionInfos"]] if obj.get("payOptionInfos") is not None else None,
125
- "payRequestExtendInfo": obj.get("payRequestExtendInfo"),
126
- "extendInfo": obj.get("extendInfo")
125
+ "payRequestExtendInfo": obj.get("payRequestExtendInfo") if obj.get("payRequestExtendInfo") is not None else None,
126
+ "extendInfo": obj.get("extendInfo") if obj.get("extendInfo") is not None else None
127
127
  })
128
128
  return _obj
129
129
 
@@ -61,20 +61,6 @@ class FinishNotifyRequest(BaseModel, BaseSdkModel):
61
61
  additional_info: Optional[FinishNotifyRequestAdditionalInfo] = Field(default=None, description="Additional information")
62
62
  __properties: ClassVar[List[str]] = ["originalPartnerReferenceNo", "originalReferenceNo", "originalExternalId", "merchantId", "subMerchantId", "amount", "latestTransactionStatus", "transactionStatusDesc", "createdTime", "finishedTime", "externalStoreId", "additionalInfo"]
63
63
 
64
- @field_validator('created_time')
65
- def created_time_validate_regular_expression(cls, value):
66
- """Validates the regular expression"""
67
- if not re.match(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$", value):
68
- raise ValueError(r"must validate the regular expression /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$/")
69
- return value
70
-
71
- @field_validator('finished_time')
72
- def finished_time_validate_regular_expression(cls, value):
73
- """Validates the regular expression"""
74
- if not re.match(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$", value):
75
- raise ValueError(r"must validate the regular expression /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+07:00$/")
76
- return value
77
-
78
64
  model_config = ConfigDict(
79
65
  populate_by_name=True,
80
66
  validate_assignment=True,
@@ -52,6 +52,7 @@ class FinishNotifyRequestAdditionalInfo(BaseModel, BaseSdkModel):
52
52
  extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Additional information of extend (As a JSON string)")
53
53
  extend_info_closed_reason: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Additional information of closed reason. Required if order is closed")
54
54
  __properties: ClassVar[List[str]] = ["paymentInfo", "shopInfo", "extendInfo", "extendInfo.closedReason"]
55
+ paid_time: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="Information of paid time, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
55
56
 
56
57
  model_config = ConfigDict(
57
58
  populate_by_name=True,
@@ -99,6 +100,9 @@ class FinishNotifyRequestAdditionalInfo(BaseModel, BaseSdkModel):
99
100
  # override the default output from pydantic by calling `to_dict()` of shop_info
100
101
  if self.shop_info:
101
102
  _dict['shopInfo'] = self.shop_info.to_dict()
103
+ # override the default output from pydantic by calling `to_dict()` of paid_time
104
+ if self.paid_time:
105
+ _dict['paidTime'] = self.paid_time
102
106
  return _dict
103
107
 
104
108
  @classmethod
@@ -113,8 +117,9 @@ class FinishNotifyRequestAdditionalInfo(BaseModel, BaseSdkModel):
113
117
  _obj = cls.model_validate({
114
118
  "paymentInfo": FinishNotifyPaymentInfo.from_dict(obj["paymentInfo"]) if obj.get("paymentInfo") is not None else None,
115
119
  "shopInfo": ShopInfo.from_dict(obj["shopInfo"]) if obj.get("shopInfo") is not None else None,
116
- "extendInfo": obj.get("extendInfo"),
117
- "extendInfo.closedReason": obj.get("extendInfo.closedReason")
120
+ "paidTime": obj.get("paidTime") if obj.get("paidTime") is not None else None,
121
+ "extendInfo": obj.get("extendInfo") if obj.get("extendInfo") is not None else None,
122
+ "extendInfo.closedReason": obj.get("extendInfo.closedReason") if obj.get("extendInfo.closedReason") is not None else None,
118
123
  })
119
124
  return _obj
120
125
 
@@ -41,7 +41,7 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
41
41
  charge_amount: Optional[Money] = Field(default=None, description="Charge amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
42
42
  pay_option_bill_extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information of pay option bill")
43
43
  extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information")
44
- payment_code: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment code")
44
+ payment_code: Optional[Annotated[str, Field(strict=True)]] = Field(default=None, description="Payment code")
45
45
  __properties: ClassVar[List[str]] = ["payMethod", "payOption", "payAmount", "transAmount", "chargeAmount", "payOptionBillExtendInfo", "extendInfo", "paymentCode"]
46
46
 
47
47
  @field_validator('pay_method')
@@ -98,9 +98,19 @@ class WebhookParser:
98
98
  )
99
99
 
100
100
  @staticmethod
101
- def _minify_json(json_str: str) -> str:
102
- obj = json.loads(json_str)
103
- return json.dumps(obj, separators=(",", ":"))
101
+ def _ensure_minified_json(json_str: str) -> tuple[str, Exception]:
102
+ """
103
+ Ensures JSON string is minified
104
+ Returns tuple of (minified_json, error)
105
+ """
106
+ try:
107
+ obj = json.loads(json_str)
108
+ minified = json.dumps(obj, separators=(",", ":"))
109
+ return minified, None
110
+ except json.JSONDecodeError as e:
111
+ return "", e
112
+ except Exception as e:
113
+ return "", e
104
114
 
105
115
  @staticmethod
106
116
  def _sha256_lower_hex(data: str) -> str:
@@ -112,10 +122,13 @@ class WebhookParser:
112
122
  relative_path_url: str,
113
123
  body: str,
114
124
  x_timestamp: str
115
- ) -> str:
116
- minified_body = self._minify_json(body)
125
+ ) -> tuple[str, Exception]:
126
+ minified_body, err = self._ensure_minified_json(body)
127
+ if err:
128
+ return "", Exception(f"_construct_string_to_verify: failed to ensure JSON is minified: {err}")
129
+
117
130
  body_hash = self._sha256_lower_hex(minified_body)
118
- return f"{http_method}:{relative_path_url}:{body_hash}:{x_timestamp}"
131
+ return f"{http_method}:{relative_path_url}:{body_hash}:{x_timestamp}", None
119
132
 
120
133
  def parse_webhook(
121
134
  self,
@@ -124,18 +137,20 @@ class WebhookParser:
124
137
  headers: dict,
125
138
  body: str
126
139
  ) -> FinishNotifyRequest:
127
- x_signature = headers.get("X-SIGNATURE")
128
- x_timestamp = headers.get("X-TIMESTAMP")
140
+ x_signature = headers.get("X-SIGNATURE") or headers.get("X-Signature") or headers.get("X-signature") or headers.get("x-signature")
141
+ x_timestamp = headers.get("X-TIMESTAMP") or headers.get("X-Timestamp") or headers.get("X-timestamp") or headers.get("x-timestamp")
129
142
 
130
143
  if not x_signature or not x_timestamp:
131
144
  raise ValueError("Missing X-SIGNATURE or X-TIMESTAMP header.")
132
145
 
133
- string_to_verify = self._construct_string_to_verify(
146
+ string_to_verify, err = self._construct_string_to_verify(
134
147
  http_method=http_method,
135
148
  relative_path_url=relative_path_url,
136
149
  body=body,
137
150
  x_timestamp=x_timestamp
138
151
  )
152
+ if err:
153
+ raise ValueError(str(err))
139
154
  signature_bytes = base64.b64decode(x_signature)
140
155
 
141
156
  try:
@@ -88,6 +88,8 @@ class PayOption(str, Enum):
88
88
  NETWORK_PAY_PG_GOPAY = "NETWORK_PAY_PG_GOPAY"
89
89
  NETWORK_PAY_PG_LINKAJA = "NETWORK_PAY_PG_LINKAJA"
90
90
  NETWORK_PAY_PG_CARD = "NETWORK_PAY_PG_CARD"
91
+ NETWORK_PAY_PC_INDOMARET = "NETWORK_PAY_PC_INDOMARET"
92
+ NETWORK_PAY_PG_QRIS = "NETWORK_PAY_PG_QRIS"
91
93
  VIRTUAL_ACCOUNT_BCA = "VIRTUAL_ACCOUNT_BCA"
92
94
  VIRTUAL_ACCOUNT_BNI = "VIRTUAL_ACCOUNT_BNI"
93
95
  VIRTUAL_ACCOUNT_MANDIRI = "VIRTUAL_ACCOUNT_MANDIRI"
@@ -95,6 +97,7 @@ class PayOption(str, Enum):
95
97
  VIRTUAL_ACCOUNT_BTPN = "VIRTUAL_ACCOUNT_BTPN"
96
98
  VIRTUAL_ACCOUNT_CIMB = "VIRTUAL_ACCOUNT_CIMB"
97
99
  VIRTUAL_ACCOUNT_PERMATA = "VIRTUAL_ACCOUNT_PERMATA"
100
+ VIRTUAL_ACCOUNT_PANIN = "VIRTUAL_ACCOUNT_PANIN"
98
101
 
99
102
  class Type(str, Enum):
100
103
  PAY_RETURN = "PAY_RETURN"
@@ -33,7 +33,7 @@ import json
33
33
 
34
34
  from dana.base.model import BaseSdkModel
35
35
 
36
- from pydantic import BaseModel, ConfigDict, Field, field_validator
36
+ from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator
37
37
  from typing import Any, ClassVar, Dict, List, Optional
38
38
  from typing_extensions import Annotated
39
39
  from dana.widget.v1.models.money import Money
@@ -47,13 +47,13 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
47
47
  PayOptionInfo
48
48
  """ # noqa: E501
49
49
  pay_method: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Payment method name. The enums:<br> * BALANCE - Payment method with balance<br> * COUPON - Payment method with coupon<br> * NET_BANKING - Payment method with internet banking<br> * CREDIT_CARD - Payment method with credit card<br> * DEBIT_CARD - Payment method with debit card<br> * VIRTUAL_ACCOUNT - Payment method with virtual account<br> * OTC - Payment method with OTC<br> * DIRECT_DEBIT_CREDIT_CARD - Payment method with direct debit of credit card<br> * DIRECT_DEBIT_DEBIT_CARD - Payment method with direct debit of debit card<br> * ONLINE_CREDIT - Payment method with online Credit<br> * LOAN_CREDIT - Payment method with DANA Cicil<br> * NETWORK_PAY - Payment method with e-wallet * CARD - Payment method with Card ")
50
- pay_option: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment option which shows the provider of this payment. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> ")
50
+ pay_option: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment option which shows the provider of this payment. The enums:<br> * NETWORK_PAY_PG_SPAY - Payment method with ShopeePay e-wallet<br> * NETWORK_PAY_PG_OVO - Payment method with OVO e-wallet<br> * NETWORK_PAY_PG_GOPAY - Payment method with GoPay e-wallet<br> * NETWORK_PAY_PG_LINKAJA - Payment method with LinkAja e-wallet<br> * NETWORK_PAY_PG_CARD - Payment method with Card<br> * NETWORK_PAY_PC_INDOMARET - Payment method with Indomaret<br> * NETWORK_PAY_PG_QRIS - Payment method with QRIS<br> * VIRTUAL_ACCOUNT_BCA - Payment method with BCA virtual account<br> * VIRTUAL_ACCOUNT_BNI - Payment method with BNI virtual account<br> * VIRTUAL_ACCOUNT_MANDIRI - Payment method with Mandiri virtual account<br> * VIRTUAL_ACCOUNT_BRI - Payment method with BRI virtual account<br> * VIRTUAL_ACCOUNT_BTPN - Payment method with BTPN virtual account<br> * VIRTUAL_ACCOUNT_CIMB - Payment method with CIMB virtual account<br> * VIRTUAL_ACCOUNT_PERMATA - Payment method with Permata virtual account<br> * VIRTUAL_ACCOUNT_PANIN - Payment method with Panin virtual account<br> ")
51
51
  pay_amount: Optional[Money] = Field(default=None, description="Pay amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
52
52
  trans_amount: Optional[Money] = Field(default=None, description="Trans amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
53
53
  charge_amount: Optional[Money] = Field(default=None, description="Charge amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
54
54
  pay_option_bill_extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information of pay option bill")
55
55
  extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information")
56
- payment_code: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment code")
56
+ payment_code: Optional[StrictStr] = Field(default=None, description="Payment code")
57
57
  __properties: ClassVar[List[str]] = ["payMethod", "payOption", "payAmount", "transAmount", "chargeAmount", "payOptionBillExtendInfo", "extendInfo", "paymentCode"]
58
58
 
59
59
  @field_validator('pay_method')
@@ -69,8 +69,8 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
69
69
  if value is None:
70
70
  return value
71
71
 
72
- if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA']):
73
- raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA')")
72
+ if value not in set(['NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN']):
73
+ raise ValueError("must be one of enum values ('NETWORK_PAY_PG_SPAY', 'NETWORK_PAY_PG_OVO', 'NETWORK_PAY_PG_GOPAY', 'NETWORK_PAY_PG_LINKAJA', 'NETWORK_PAY_PG_CARD', 'NETWORK_PAY_PC_INDOMARET', 'NETWORK_PAY_PG_QRIS', 'VIRTUAL_ACCOUNT_BCA', 'VIRTUAL_ACCOUNT_BNI', 'VIRTUAL_ACCOUNT_MANDIRI', 'VIRTUAL_ACCOUNT_BRI', 'VIRTUAL_ACCOUNT_BTPN', 'VIRTUAL_ACCOUNT_CIMB', 'VIRTUAL_ACCOUNT_PERMATA', 'VIRTUAL_ACCOUNT_PANIN')")
74
74
  return value
75
75
 
76
76
  model_config = ConfigDict(
@@ -90,7 +90,7 @@ class Util:
90
90
 
91
91
  # Get scopes based on environment
92
92
  if hasattr(data, 'scopes') and data.scopes:
93
- scopes = data.scopes
93
+ scopes = ','.join(data.scopes)
94
94
  else:
95
95
  if env.lower() != 'production':
96
96
  scopes = 'CASHIER,AGREEMENT_PAY,QUERY_BALANCE,DEFAULT_BASIC_PROFILE,MINI_DANA'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dana-python
3
- Version: 1.1.3
3
+ Version: 1.1.5
4
4
  Summary: API Client (SDK) for DANA APIs based on https://dashboard.dana.id/api-docs
5
5
  Author-email: DANA Package Manager <package-manager@dana.id>
6
6
  Maintainer-email: DANA Package Manager <package-manager@dana.id>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dana-python"
3
- version = "1.1.3"
3
+ version = "1.1.5"
4
4
  readme = "README.md"
5
5
  description = "API Client (SDK) for DANA APIs based on https://dashboard.dana.id/api-docs"
6
6
  license = "Apache-2.0"
@@ -0,0 +1,66 @@
1
+ # Copyright 2025 PT Espay Debit Indonesia Koe
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import json
16
+ import os
17
+ from dana.webhook.finish_notify_request import FinishNotifyRequest
18
+ from dana.webhook import WebhookParser
19
+ from dana.utils.snap_header import SnapHeader
20
+ # Import fixtures directly from their modules to avoid circular imports
21
+ from tests.fixtures.api_client import api_instance_payment_gateway
22
+ from tests.fixtures.payment_gateway import webhook_key_pair
23
+
24
+ class TestWebhookParser:
25
+ def test_webhook_signature_and_parsing_success(self):
26
+ # Load keys from environment variables
27
+ public_key = os.getenv("WEBHOOK_PUBLIC_KEY")
28
+
29
+ webhook_http_method = "POST"
30
+ webhook_relative_url = "/api/v2/test-notif/dana"
31
+
32
+ webhook_body_str = '{"amount":{"currency":"IDR","value":"100000.00"},"originalReferenceNo":"20250916111230999500166191900293793","merchantId":"216620080007039826152","latestTransactionStatus":"00","additionalInfo":{"paidTime":"1757998714761","paymentInfo":{"payOptionInfos":[{"transAmount":{"currency":"IDR","value":"100000.00"},"payAmount":{"currency":"IDR","value":"100000.00"},"payMethod":"NETWORK_PAY","payOption":"NETWORK_PAY_PG_LINKAJA"}],"extendInfo":"{\\"externalPromoInfos\\":[]}"}},"originalPartnerReferenceNo":"LINKIT25091757998646","createdTime":"1757998647000","finishedTime":"1757998714761","transactionStatusDesc":"SUCCESS"}'
33
+
34
+ x_timestamp = "2025-09-16T12:11:30+07:00"
35
+ signature = "d/7mle7A+FCl4zvBZ2dMr3s7TVbbaK+toMtZwoev4OmLhn6Ctz/ynMaL3m3vHjAmV3UL3Fq5xp9thZFsO8BY74Vehqr1N9LQblV6i3TfMwT6lMvvhzWr0Fjbasyj23c5nFu1MOxpBiZFMMDNh8GQNLBAehHbjOmNldXSL6OQYRrK/TN9tdDyYFK6ltnKf4BN6bZa2ViAlI/np/U3QBW2LnDL82+8ZK7tYVF5bZyLLUSLXeWXBGQFTSDWqN+JdUHSnxGdQr3hZ7Y9Vqm/7G6rj6NrCxLPiEJYq1DQO3DjokMsORA2lOxzuo53bwqmhmD1mFhJKWF1JmyJuFdo2HB9JA=="
36
+
37
+ headers = {
38
+ "Channel-Id": "DANA",
39
+ "Charset": "UTF-8",
40
+ "Content-Type": "application/json",
41
+ "User-Agent": "Jakarta Commons-HttpClient/3.1",
42
+ "X-External-Id": "cFQ0PK5yS9wkMTMOVem4fIoUuyuA28jg",
43
+ "X-Partner-Id": "2025090110410957288340",
44
+ "X-Signature": signature,
45
+ "X-Timestamp": x_timestamp
46
+ }
47
+
48
+ # Create the parser with the public key
49
+ parser = WebhookParser(public_key=public_key)
50
+
51
+ # Verify and parse
52
+ result = parser.parse_webhook(
53
+ http_method=webhook_http_method,
54
+ relative_path_url=webhook_relative_url,
55
+ headers=headers,
56
+ body=webhook_body_str
57
+ )
58
+
59
+ # Verify specific fields like in the Go test
60
+ assert result is not None
61
+ assert result.original_partner_reference_no == "LINKIT25091757998646"
62
+ assert result.original_reference_no == "20250916111230999500166191900293793"
63
+ assert result.merchant_id == "216620080007039826152"
64
+ assert result.amount.value == "100000.00"
65
+ assert result.amount.currency == "IDR"
66
+ assert result.latest_transaction_status == "00"
@@ -1,60 +0,0 @@
1
- # Copyright 2025 PT Espay Debit Indonesia Koe
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import json
16
- import os
17
- from dana.webhook.finish_notify_request import FinishNotifyRequest
18
- from dana.webhook import WebhookParser
19
- from dana.utils.snap_header import SnapHeader
20
- # Import fixtures directly from their modules to avoid circular imports
21
- from tests.fixtures.api_client import api_instance_payment_gateway
22
- from tests.fixtures.payment_gateway import webhook_key_pair
23
-
24
- class TestWebhookParser:
25
- def test_webhook_signature_and_parsing_success(self):
26
- public_key, private_key = os.getenv("WEBHOOK_PUBLIC_KEY"), os.getenv("WEBHOOK_PRIVATE_KEY")
27
- parser = WebhookParser(public_key=public_key)
28
- webhook_http_method = "POST"
29
- webhook_relative_url = "/v1.0/debit/notify"
30
- webhook_body_dict = {
31
- "originalPartnerReferenceNo": "TESTPN20240101001",
32
- "originalReferenceNo": "TESTREF20240101001",
33
- "merchantId": "TESTMERCH001",
34
- "subMerchantId": "TESTSUBMERCH001",
35
- "amount": {"value": "15000.00", "currency": "IDR"},
36
- "latestTransactionStatus": "00",
37
- "transactionStatusDesc": "Success",
38
- "createdTime": "2024-01-01T10:00:00+07:00",
39
- "finishedTime": "2024-01-01T10:00:05+07:00"
40
- }
41
- webhook_body_str = json.dumps(webhook_body_dict, separators=(",", ":"))
42
- # Generate signature headers with SnapHeader
43
- generated_headers = SnapHeader.get_snap_generated_auth(
44
- method=webhook_http_method,
45
- resource_path=webhook_relative_url,
46
- body=webhook_body_str,
47
- private_key=private_key
48
- )
49
- headers = {
50
- "X-TIMESTAMP": generated_headers["X-TIMESTAMP"]["value"],
51
- "X-SIGNATURE": generated_headers["X-SIGNATURE"]["value"]
52
- }
53
- result = parser.parse_webhook(
54
- http_method=webhook_http_method,
55
- relative_path_url=webhook_relative_url,
56
- headers=headers,
57
- body=webhook_body_str
58
- )
59
- assert isinstance(result, FinishNotifyRequest)
60
- assert result.to_dict() == webhook_body_dict
File without changes
File without changes