dana-python 1.1.0__tar.gz → 1.1.1__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.
- {dana_python-1.1.0/dana_python.egg-info → dana_python-1.1.1}/PKG-INFO +6 -6
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/enum.py +1 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/dana_account_inquiry_response.py +4 -4
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_response.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_response.py +3 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/enum.py +1 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/api/payment_gateway_api.py +4 -4
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/enum.py +1 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/actor_context.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_by_api_request.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_by_redirect_request.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/goods.py +3 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/pay_option_detail.py +3 -3
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/pay_option_info.py +3 -3
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/models.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/open_api_configuration.py +8 -6
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/snap_configuration.py +7 -6
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/snap_header.py +144 -15
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/api/widget_api.py +12 -10
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/enum.py +5 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/balance_inquiry_request.py +1 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/balance_inquiry_request_additional_info.py +34 -6
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/goods.py +3 -1
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/oauth2_url_data.py +15 -3
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/pay_option_info.py +3 -3
- dana_python-1.1.1/dana/widget/v1/util.py +261 -0
- {dana_python-1.1.0 → dana_python-1.1.1/dana_python.egg-info}/PKG-INFO +6 -6
- {dana_python-1.1.0 → dana_python-1.1.1}/dana_python.egg-info/SOURCES.txt +4 -1
- dana_python-1.1.1/dana_python.egg-info/requires.txt +10 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/pyproject.toml +6 -6
- dana_python-1.1.1/tests/test_disbursement_api.py +218 -0
- dana_python-1.1.1/tests/test_payment_gateway_api.py +67 -0
- dana_python-1.1.1/tests/test_payment_gateway_with_automation.py +198 -0
- dana_python-1.1.1/tests/test_widget_api.py +93 -0
- dana_python-1.1.1/tests/test_widget_with_automation.py +265 -0
- dana_python-1.1.0/dana_python.egg-info/requires.txt +0 -10
- dana_python-1.1.0/tests/test_disbursement_api.py +0 -209
- dana_python-1.1.0/tests/test_payment_gateway_api.py +0 -136
- dana_python-1.1.0/tests/test_widget_api.py +0 -100
- {dana_python-1.1.0 → dana_python-1.1.1}/LICENSE +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/README.md +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/api_client.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/api_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/base/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/base/configuration.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/base/model.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/base/types.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/api/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/api/disbursement_api.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/bank_account_inquiry_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/bank_account_inquiry_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/bank_account_inquiry_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/bank_account_inquiry_response_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/dana_account_inquiry_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/dana_account_inquiry_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/money.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/exceptions.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/api/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/api/merchant_management_api.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/address_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/business_docs.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_request_ext_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_division_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_shop_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_shop_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_shop_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_shop_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/create_shop_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/division_resource_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/merchant_resource_information.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/mobile_no_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/pic_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_division_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_division_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_division_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_division_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_division_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_merchant_resource_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_merchant_resource_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_merchant_resource_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_merchant_resource_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_merchant_resource_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_shop_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_shop_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_shop_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_shop_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/query_shop_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/result_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/shop_resource_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_division_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_division_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_division_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_division_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_division_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_shop_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_shop_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_shop_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/update_shop_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/merchant_management/v1/models/user_name.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/api/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/amount_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/audit_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/buyer.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/cancel_order_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/cancel_order_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/consult_pay_payment_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/consult_pay_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/consult_pay_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/consult_pay_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_by_api_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_by_redirect_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/create_order_response_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/env_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/money.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/order_api_object.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/order_redirect_object.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/pay_option_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/payment_view.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/promo_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/query_payment_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/query_payment_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/query_payment_response_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/refund_option_bill.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/refund_order_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/refund_order_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/refund_order_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/seller.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/shipping_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/status_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/time_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/url_param.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/payment_gateway/v1/models/virtual_account_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/rest.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/open_api_header.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/script.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/utils/url.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/finish_notify_payment_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/finish_notify_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/finish_notify_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/finish_notify_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/money.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/pay_option_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/shop_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/webhook/webhook.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/api/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/__init__.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/account_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/account_unbinding_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/account_unbinding_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/account_unbinding_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/amount_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_ott_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_ott_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_ott_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_ott_response_user_resources_inner.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_token_authorization_code_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_token_refresh_token_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_token_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_token_response_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/apply_token_response_additional_info_user_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/balance_inquiry_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/buyer.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/cancel_order_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/cancel_order_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/env_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/international_order_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/international_order_info_exchange_rate.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/money.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/oauth2_url_data_seamless_data.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/order.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/pay_option_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/pay_option_detail_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/payment_promo_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/payment_view.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_payment_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_payment_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_payment_response_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_user_profile_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_user_profile_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_user_profile_response_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_user_profile_response_response_body.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/query_user_profile_response_response_head.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/refund_order_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/refund_order_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/refund_order_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/refund_promo_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/result_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/seller.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/service_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/shipping_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/status_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/time_detail.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/url_param.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/user_resource_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/virtual_account_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/widget_payment_request.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/widget_payment_request_additional_info.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana/widget/v1/models/widget_payment_response.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana_python.egg-info/dependency_links.txt +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/dana_python.egg-info/top_level.txt +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/setup.cfg +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/tests/test_merchant_management_api.py +0 -0
- {dana_python-1.1.0 → dana_python-1.1.1}/tests/test_webhook.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dana-python
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.1
|
|
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>
|
|
@@ -13,14 +13,14 @@ Description-Content-Type: text/markdown
|
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: annotated-types==0.7.0
|
|
15
15
|
Requires-Dist: cffi==1.17.1
|
|
16
|
-
Requires-Dist: cryptography
|
|
16
|
+
Requires-Dist: cryptography<46.0.0,>=44.0.2
|
|
17
17
|
Requires-Dist: pycparser==2.22
|
|
18
|
-
Requires-Dist: pydantic
|
|
19
|
-
Requires-Dist: pydantic-core
|
|
18
|
+
Requires-Dist: pydantic<3.0.0,>=2.10.6
|
|
19
|
+
Requires-Dist: pydantic-core<3.0.0,>=2.27.2
|
|
20
20
|
Requires-Dist: python-dateutil==2.9.0.post0
|
|
21
21
|
Requires-Dist: six==1.17.0
|
|
22
|
-
Requires-Dist: typing-extensions
|
|
23
|
-
Requires-Dist: urllib3
|
|
22
|
+
Requires-Dist: typing-extensions<5.0.0,>=4.12.2
|
|
23
|
+
Requires-Dist: urllib3<3.0.0,>=2.3.0
|
|
24
24
|
Dynamic: license-file
|
|
25
25
|
|
|
26
26
|
# dana-python
|
{dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/dana_account_inquiry_response.py
RENAMED
|
@@ -34,7 +34,7 @@ import json
|
|
|
34
34
|
from dana.base.model import BaseSdkModel
|
|
35
35
|
|
|
36
36
|
from pydantic import BaseModel, ConfigDict, Field
|
|
37
|
-
from typing import Any, ClassVar, Dict, List, Optional
|
|
37
|
+
from typing import Any, ClassVar, Dict, List, Optional
|
|
38
38
|
from typing_extensions import Annotated
|
|
39
39
|
from dana.disbursement.v1.models.money import Money
|
|
40
40
|
from typing import Optional, Set
|
|
@@ -53,14 +53,14 @@ class DanaAccountInquiryResponse(BaseModel, BaseSdkModel):
|
|
|
53
53
|
session_id: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="Session identifier")
|
|
54
54
|
customer_number: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Customer account number, in format 628xxx")
|
|
55
55
|
customer_name: Annotated[str, Field(strict=True, max_length=255)] = Field(description="Customer account name")
|
|
56
|
-
|
|
56
|
+
customer_monthly_in_limit: Optional[Annotated[str, Field(strict=True, max_length=17)]] = Field(default=None, description="Limitation of transfer to DANA balance for customer per month")
|
|
57
57
|
min_amount: Money = Field(description="Minimal amount. Contains two sub-fields:<br> 1. Value: Amount, including the cents<br> 2. Currency: Currency code based on ISO ")
|
|
58
58
|
max_amount: Money = Field(description="Maximal amount. Contains two sub-fields:<br> 1. Value: Amount, including the cents<br> 2. Currency: Currency code based on ISO ")
|
|
59
59
|
amount: Money = Field(description="Amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO ")
|
|
60
60
|
fee_amount: Money = Field(description="Fee amount. Contains two sub-fields:<br> 1. Value: Amount, including the cents<br> 2. Currency: Currency code based on ISO ")
|
|
61
61
|
fee_type: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="Type of fee for each transfer to DANA transaction. Such as admin fee")
|
|
62
62
|
additional_info: Optional[Dict[str, Any]] = Field(default=None, description="Additional information")
|
|
63
|
-
__properties: ClassVar[List[str]] = ["responseCode", "responseMessage", "referenceNo", "partnerReferenceNo", "sessionId", "customerNumber", "customerName", "
|
|
63
|
+
__properties: ClassVar[List[str]] = ["responseCode", "responseMessage", "referenceNo", "partnerReferenceNo", "sessionId", "customerNumber", "customerName", "customerMonthlyInLimit", "minAmount", "maxAmount", "amount", "feeAmount", "feeType", "additionalInfo"]
|
|
64
64
|
|
|
65
65
|
model_config = ConfigDict(
|
|
66
66
|
populate_by_name=True,
|
|
@@ -133,7 +133,7 @@ class DanaAccountInquiryResponse(BaseModel, BaseSdkModel):
|
|
|
133
133
|
"sessionId": obj.get("sessionId"),
|
|
134
134
|
"customerNumber": obj.get("customerNumber"),
|
|
135
135
|
"customerName": obj.get("customerName"),
|
|
136
|
-
"
|
|
136
|
+
"customerMonthlyInLimit": obj.get("customerMonthlyInLimit"),
|
|
137
137
|
"minAmount": Money.from_dict(obj["minAmount"]) if obj.get("minAmount") is not None else None,
|
|
138
138
|
"maxAmount": Money.from_dict(obj["maxAmount"]) if obj.get("maxAmount") is not None else None,
|
|
139
139
|
"amount": Money.from_dict(obj["amount"]) if obj.get("amount") is not None else None,
|
{dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_bank_response.py
RENAMED
|
@@ -50,7 +50,7 @@ class TransferToBankResponse(BaseModel, BaseSdkModel):
|
|
|
50
50
|
reference_no: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Transaction identifier on DANA system")
|
|
51
51
|
partner_reference_no: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Unique transaction identifier on partner system which assigned to each transaction<br> Notes:<br> If the partner receives a timeout or an unexpected response from DANA and partner expects to perform retry request to DANA, please use the partnerReferenceNo that is the same as the one used in the transaction request process before ")
|
|
52
52
|
transaction_date: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="Transaction date, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
|
|
53
|
-
reference_number: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Reference number")
|
|
53
|
+
reference_number: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Reference number")
|
|
54
54
|
additional_info: Optional[Dict[str, Any]] = Field(default=None, description="Additional information")
|
|
55
55
|
__properties: ClassVar[List[str]] = ["responseCode", "responseMessage", "referenceNo", "partnerReferenceNo", "transactionDate", "referenceNumber", "additionalInfo"]
|
|
56
56
|
|
{dana_python-1.1.0 → dana_python-1.1.1}/dana/disbursement/v1/models/transfer_to_dana_response.py
RENAMED
|
@@ -52,9 +52,10 @@ class TransferToDanaResponse(BaseModel, BaseSdkModel):
|
|
|
52
52
|
partner_reference_no: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Unique transaction identifier on partner system which assigned to each transaction<br> Notes:<br> If the partner receives a timeout or an unexpected response from DANA and partner expects to perform retry request to DANA, please use the partnerReferenceNo that is the same as the one used in the transaction request process before ")
|
|
53
53
|
session_id: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="Session identifier")
|
|
54
54
|
customer_number: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Customer account number, in format 628xxx")
|
|
55
|
+
customer_name: Optional[Annotated[str, Field(strict=True, max_length=255)]] = Field(default=None, description="Customer account name")
|
|
55
56
|
amount: Money = Field(description="Amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO ")
|
|
56
57
|
additional_info: Optional[Dict[str, Any]] = Field(default=None, description="Additional information")
|
|
57
|
-
__properties: ClassVar[List[str]] = ["responseCode", "responseMessage", "referenceNo", "partnerReferenceNo", "sessionId", "customerNumber", "amount", "additionalInfo"]
|
|
58
|
+
__properties: ClassVar[List[str]] = ["responseCode", "responseMessage", "referenceNo", "partnerReferenceNo", "sessionId", "customerNumber", "customerName", "amount", "additionalInfo"]
|
|
58
59
|
|
|
59
60
|
model_config = ConfigDict(
|
|
60
61
|
populate_by_name=True,
|
|
@@ -117,6 +118,7 @@ class TransferToDanaResponse(BaseModel, BaseSdkModel):
|
|
|
117
118
|
"partnerReferenceNo": obj.get("partnerReferenceNo"),
|
|
118
119
|
"sessionId": obj.get("sessionId"),
|
|
119
120
|
"customerNumber": obj.get("customerNumber"),
|
|
121
|
+
"customerName": obj.get("customerName"),
|
|
120
122
|
"amount": Money.from_dict(obj["amount"]) if obj.get("amount") is not None else None,
|
|
121
123
|
"additionalInfo": obj.get("additionalInfo")
|
|
122
124
|
})
|
|
@@ -539,12 +539,12 @@ class PaymentGatewayApi:
|
|
|
539
539
|
_header_params['Content-Type'] = _default_content_type
|
|
540
540
|
# authentication setting
|
|
541
541
|
_auth_settings: List[str] = [
|
|
542
|
+
'DANA_ENV',
|
|
542
543
|
'ORIGIN',
|
|
543
544
|
'X_PARTNER_ID',
|
|
544
545
|
'CHANNEL_ID',
|
|
545
546
|
'PRIVATE_KEY',
|
|
546
|
-
'PRIVATE_KEY_PATH'
|
|
547
|
-
'ENV'
|
|
547
|
+
'PRIVATE_KEY_PATH'
|
|
548
548
|
]
|
|
549
549
|
# merge list of auth settings
|
|
550
550
|
# with list of auth generated at runtime for headers
|
|
@@ -798,12 +798,12 @@ class PaymentGatewayApi:
|
|
|
798
798
|
_header_params['Content-Type'] = _default_content_type
|
|
799
799
|
# authentication setting
|
|
800
800
|
_auth_settings: List[str] = [
|
|
801
|
+
'DANA_ENV',
|
|
801
802
|
'ORIGIN',
|
|
802
803
|
'X_PARTNER_ID',
|
|
803
804
|
'CHANNEL_ID',
|
|
804
805
|
'PRIVATE_KEY',
|
|
805
|
-
'PRIVATE_KEY_PATH'
|
|
806
|
-
'ENV'
|
|
806
|
+
'PRIVATE_KEY_PATH'
|
|
807
807
|
]
|
|
808
808
|
# merge list of auth settings
|
|
809
809
|
# with list of auth generated at runtime for headers
|
|
@@ -46,7 +46,7 @@ class ActorContext(BaseModel, BaseSdkModel):
|
|
|
46
46
|
ActorContext
|
|
47
47
|
""" # noqa: E501
|
|
48
48
|
actor_id: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Actor identifier")
|
|
49
|
-
actor_type: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Actor type. The enums:<br> * USER - User<br> * MERCHANT - Merchant<br * MERCHANT_OPERATOR - Merchant operator<br> * BACK_OFFICE - Back office<br> * SYSTEM - System<br> ")
|
|
49
|
+
actor_type: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Actor type. The enums:<br> * USER - User<br> * MERCHANT - Merchant<br> * MERCHANT_OPERATOR - Merchant operator<br> * BACK_OFFICE - Back office<br> * SYSTEM - System<br> ")
|
|
50
50
|
__properties: ClassVar[List[str]] = ["actorId", "actorType"]
|
|
51
51
|
|
|
52
52
|
@field_validator('actor_type')
|
|
@@ -56,7 +56,7 @@ class CreateOrderByApiRequest(BaseModel, BaseSdkModel):
|
|
|
56
56
|
sub_merchant_id: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Information of sub merchant identifier")
|
|
57
57
|
amount: Money = Field(description="Amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
|
|
58
58
|
external_store_id: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Store identifier to indicate to which store this payment belongs to")
|
|
59
|
-
valid_up_to: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="The time when the payment will be automatically expired, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
|
|
59
|
+
valid_up_to: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="The time when the payment will be automatically expired, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time) and cannot be more than one week in the future.")
|
|
60
60
|
disabled_pay_methods: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment method(s) that cannot be used for this")
|
|
61
61
|
url_params: List[UrlParam] = Field(description="Notify URL that DANA must send the payment notification to")
|
|
62
62
|
__properties: ClassVar[List[str]] = ["partnerReferenceNo", "merchantId", "subMerchantId", "amount", "externalStoreId", "validUpTo", "disabledPayMethods", "urlParams"]
|
|
@@ -54,7 +54,7 @@ class CreateOrderByRedirectRequest(BaseModel, BaseSdkModel):
|
|
|
54
54
|
sub_merchant_id: Optional[Annotated[str, Field(strict=True, max_length=32)]] = Field(default=None, description="Information of sub merchant identifier")
|
|
55
55
|
amount: Money = Field(description="Amount. Contains two sub-fields:<br> 1. Value: Transaction amount, including the cents<br> 2. Currency: Currency code based on ISO<br> ")
|
|
56
56
|
external_store_id: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Store identifier to indicate to which store this payment belongs to")
|
|
57
|
-
valid_up_to: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="The time when the payment will be automatically expired, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time)")
|
|
57
|
+
valid_up_to: Optional[Annotated[str, Field(strict=True, max_length=25)]] = Field(default=None, description="The time when the payment will be automatically expired, in format YYYY-MM-DDTHH:mm:ss+07:00. Time must be in GMT+7 (Jakarta time) and cannot be more than one week in the future.")
|
|
58
58
|
disabled_pay_methods: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Payment method(s) that cannot be used for this")
|
|
59
59
|
url_params: List[UrlParam] = Field(description="Notify URL that DANA must send the payment notification to")
|
|
60
60
|
__properties: ClassVar[List[str]] = ["partnerReferenceNo", "merchantId", "subMerchantId", "amount", "externalStoreId", "validUpTo", "disabledPayMethods", "urlParams"]
|
|
@@ -46,6 +46,7 @@ class Goods(BaseModel, BaseSdkModel):
|
|
|
46
46
|
"""
|
|
47
47
|
Goods
|
|
48
48
|
""" # noqa: E501
|
|
49
|
+
name: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Goods name")
|
|
49
50
|
merchant_goods_id: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Goods identifier provided by merchant")
|
|
50
51
|
description: Annotated[str, Field(strict=True, max_length=1024)] = Field(description="Goods description")
|
|
51
52
|
category: Annotated[str, Field(strict=True, max_length=64)] = Field(description="Goods category")
|
|
@@ -55,7 +56,7 @@ class Goods(BaseModel, BaseSdkModel):
|
|
|
55
56
|
merchant_shipping_id: Optional[Annotated[str, Field(strict=True, max_length=64)]] = Field(default=None, description="Shipment identifier provided by merchant")
|
|
56
57
|
snapshot_url: Optional[Annotated[str, Field(strict=True, max_length=512)]] = Field(default=None, description="The URL of good's snapshot web page")
|
|
57
58
|
extend_info: Optional[Annotated[str, Field(strict=True, max_length=4096)]] = Field(default=None, description="Extend information")
|
|
58
|
-
__properties: ClassVar[List[str]] = ["merchantGoodsId", "description", "category", "price", "unit", "quantity", "merchantShippingId", "snapshotUrl", "extendInfo"]
|
|
59
|
+
__properties: ClassVar[List[str]] = ["name", "merchantGoodsId", "description", "category", "price", "unit", "quantity", "merchantShippingId", "snapshotUrl", "extendInfo"]
|
|
59
60
|
|
|
60
61
|
model_config = ConfigDict(
|
|
61
62
|
populate_by_name=True,
|
|
@@ -112,6 +113,7 @@ class Goods(BaseModel, BaseSdkModel):
|
|
|
112
113
|
return cls.model_validate(obj)
|
|
113
114
|
|
|
114
115
|
_obj = cls.model_validate({
|
|
116
|
+
"name": obj.get("name"),
|
|
115
117
|
"merchantGoodsId": obj.get("merchantGoodsId"),
|
|
116
118
|
"description": obj.get("description"),
|
|
117
119
|
"category": obj.get("category"),
|
|
@@ -47,7 +47,7 @@ class PayOptionDetail(BaseModel, BaseSdkModel):
|
|
|
47
47
|
"""
|
|
48
48
|
PayOptionDetail
|
|
49
49
|
""" # noqa: E501
|
|
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> ")
|
|
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
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> ")
|
|
52
52
|
trans_amount: Money = Field()
|
|
53
53
|
fee_amount: Optional[Money] = Field(default=None)
|
|
@@ -61,8 +61,8 @@ class PayOptionDetail(BaseModel, BaseSdkModel):
|
|
|
61
61
|
"""Validates the enum"""
|
|
62
62
|
if value == "":
|
|
63
63
|
return value
|
|
64
|
-
if value not in set(['BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY']):
|
|
65
|
-
raise ValueError("must be one of enum values ('BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY')")
|
|
64
|
+
if value not in set(['BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY', 'CARD']):
|
|
65
|
+
raise ValueError("must be one of enum values ('BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY', 'CARD')")
|
|
66
66
|
return value
|
|
67
67
|
|
|
68
68
|
@field_validator('pay_option')
|
|
@@ -46,7 +46,7 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
|
|
|
46
46
|
"""
|
|
47
47
|
PayOptionInfo
|
|
48
48
|
""" # noqa: E501
|
|
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 ")
|
|
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
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> ")
|
|
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> ")
|
|
@@ -61,8 +61,8 @@ class PayOptionInfo(BaseModel, BaseSdkModel):
|
|
|
61
61
|
"""Validates the enum"""
|
|
62
62
|
if value == "":
|
|
63
63
|
return value
|
|
64
|
-
if value not in set(['BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY']):
|
|
65
|
-
raise ValueError("must be one of enum values ('BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY')")
|
|
64
|
+
if value not in set(['BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY', 'CARD']):
|
|
65
|
+
raise ValueError("must be one of enum values ('BALANCE', 'COUPON', 'NET_BANKING', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'OTC', 'DIRECT_DEBIT_CREDIT_CARD', 'DIRECT_DEBIT_DEBIT_CARD', 'ONLINE_CREDIT', 'LOAN_CREDIT', 'NETWORK_PAY', 'CARD')")
|
|
66
66
|
return value
|
|
67
67
|
|
|
68
68
|
@field_validator('pay_option')
|
|
@@ -46,6 +46,7 @@ OpenApiAuthSettings = TypedDict(
|
|
|
46
46
|
{
|
|
47
47
|
"CLIENT_SECRET": APIKeyAuthSetting,
|
|
48
48
|
"CLIENT_ID": APIKeyAuthSetting,
|
|
49
|
+
"DANA_ENV": APIKeyAuthSetting,
|
|
49
50
|
"ENV": APIKeyAuthSetting,
|
|
50
51
|
"ACCESS_TOKEN": APIKeyAuthSetting,
|
|
51
52
|
"PRIVATE_KEY": APIKeyAuthSetting,
|
|
@@ -96,6 +97,7 @@ class OpenApiConfiguration(BaseConfiguration):
|
|
|
96
97
|
auth_settings = OpenApiAuthSettings(
|
|
97
98
|
CLIENT_SECRET=os.getenv("CLIENT_SECRET"),
|
|
98
99
|
CLIENT_ID=os.getenv("CLIENT_ID"),
|
|
100
|
+
DANA_ENV=os.getenv("DANA_ENV"),
|
|
99
101
|
ENV=Env.SANDBOX
|
|
100
102
|
)
|
|
101
103
|
config = OpenApiConfiguration(api_key=auth_settings)
|
|
@@ -132,9 +134,9 @@ class OpenApiConfiguration(BaseConfiguration):
|
|
|
132
134
|
self.ignore_operation_servers = ignore_operation_servers
|
|
133
135
|
|
|
134
136
|
# Set host based on environment
|
|
135
|
-
if api_key and "ENV" in api_key:
|
|
136
|
-
self.host = "https://api.sandbox.dana.id" if api_key["ENV"] == Env.SANDBOX else \
|
|
137
|
-
"https://api.saas.dana.id" if api_key["ENV"] == Env.PRODUCTION else None
|
|
137
|
+
if api_key and ("DANA_ENV" in api_key or "ENV" in api_key):
|
|
138
|
+
self.host = "https://api.sandbox.dana.id" if (api_key["DANA_ENV"] == Env.SANDBOX or api_key["ENV"] == Env.SANDBOX) else \
|
|
139
|
+
"https://api.saas.dana.id" if (api_key["DANA_ENV"] == Env.PRODUCTION or api_key["ENV"] == Env.PRODUCTION) else None
|
|
138
140
|
self._base_path = self.host
|
|
139
141
|
else:
|
|
140
142
|
self.host = host or "https://api.sandbox.dana.id"
|
|
@@ -329,10 +331,10 @@ class OpenApiConfiguration(BaseConfiguration):
|
|
|
329
331
|
|
|
330
332
|
def get_host_settings(self) -> List[HostSetting]:
|
|
331
333
|
"""Gets an array of host settings"""
|
|
332
|
-
if self.api_key and "ENV" in self.api_key:
|
|
333
|
-
if self.api_key["ENV"] == Env.SANDBOX:
|
|
334
|
+
if self.api_key and ("DANA_ENV" in self.api_key or "ENV" in self.api_key):
|
|
335
|
+
if self.api_key["DANA_ENV"] == Env.SANDBOX or self.api_key["ENV"] == Env.SANDBOX:
|
|
334
336
|
return [{'url': "https://api.sandbox.dana.id", 'description': "Sandbox server"}]
|
|
335
|
-
elif self.api_key["ENV"] == Env.PRODUCTION:
|
|
337
|
+
elif self.api_key["DANA_ENV"] == Env.PRODUCTION or self.api_key["ENV"] == Env.PRODUCTION:
|
|
336
338
|
return [{'url': "https://api.saas.dana.id", 'description': "Production server"}]
|
|
337
339
|
|
|
338
340
|
return [{'url': "https://api.sandbox.dana.id", 'description': "Default sandbox server"}]
|
|
@@ -130,6 +130,7 @@ AuthSettings = TypedDict(
|
|
|
130
130
|
"X_PARTNER_ID": APIKeyAuthSetting,
|
|
131
131
|
"CHANNEL_ID": APIKeyAuthSetting,
|
|
132
132
|
"ENV": APIKeyAuthSetting,
|
|
133
|
+
"DANA_ENV": APIKeyAuthSetting,
|
|
133
134
|
},
|
|
134
135
|
total=False,
|
|
135
136
|
)
|
|
@@ -229,10 +230,10 @@ class SnapConfiguration(BaseConfiguration):
|
|
|
229
230
|
) -> None:
|
|
230
231
|
"""Constructor
|
|
231
232
|
"""
|
|
232
|
-
self.host = "http://api.sandbox.dana.id" if api_key["ENV"] == Env.SANDBOX else \
|
|
233
|
-
"https://api.saas.dana.id" if api_key["ENV"] == Env.PRODUCTION else None
|
|
234
|
-
self._base_path = "http://api.sandbox.dana.id" if api_key["ENV"] == Env.SANDBOX else \
|
|
235
|
-
"https://api.saas.dana.id" if api_key["ENV"] == Env.PRODUCTION else None
|
|
233
|
+
self.host = "http://api.sandbox.dana.id" if (api_key["DANA_ENV"] == Env.SANDBOX or api_key["ENV"] == Env.SANDBOX) else \
|
|
234
|
+
"https://api.saas.dana.id" if (api_key["DANA_ENV"] == Env.PRODUCTION or api_key["ENV"] == Env.PRODUCTION) else None
|
|
235
|
+
self._base_path = "http://api.sandbox.dana.id" if (api_key["DANA_ENV"] == Env.SANDBOX or api_key["ENV"] == Env.SANDBOX) else \
|
|
236
|
+
"https://api.saas.dana.id" if (api_key["DANA_ENV"] == Env.PRODUCTION or api_key["ENV"] == Env.PRODUCTION) else None
|
|
236
237
|
"""Default Base url
|
|
237
238
|
"""
|
|
238
239
|
self.server_index = 0 if server_index is None and host is None else server_index
|
|
@@ -587,12 +588,12 @@ class SnapConfiguration(BaseConfiguration):
|
|
|
587
588
|
'url': "http://api.sandbox.dana.id",
|
|
588
589
|
'description': "No description provided",
|
|
589
590
|
}
|
|
590
|
-
] if self.api_key["ENV"] == Env.SANDBOX else [
|
|
591
|
+
] if (self.api_key["DANA_ENV"] == Env.SANDBOX or self.api_key["ENV"] == Env.SANDBOX) else [
|
|
591
592
|
{
|
|
592
593
|
'url': "https://api.saas.dana.id",
|
|
593
594
|
'description': "No description provided",
|
|
594
595
|
}
|
|
595
|
-
] if self.api_key["ENV"] == Env.PRODUCTION else None
|
|
596
|
+
] if (self.api_key["DANA_ENV"] == Env.PRODUCTION or self.api_key["ENV"] == Env.PRODUCTION) else None
|
|
596
597
|
|
|
597
598
|
return host_settings
|
|
598
599
|
|
|
@@ -14,11 +14,13 @@
|
|
|
14
14
|
|
|
15
15
|
from cryptography.hazmat.primitives import hashes, serialization
|
|
16
16
|
from cryptography.hazmat.primitives.asymmetric import padding
|
|
17
|
-
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
|
17
|
+
from cryptography.hazmat.primitives.serialization import load_pem_private_key, load_pem_public_key
|
|
18
18
|
from cryptography.hazmat.backends import default_backend
|
|
19
|
+
import re
|
|
19
20
|
import base64
|
|
20
21
|
from hashlib import sha256
|
|
21
22
|
import uuid
|
|
23
|
+
import os
|
|
22
24
|
import json
|
|
23
25
|
from typing import Any, List, Mapping
|
|
24
26
|
from datetime import datetime, timedelta, timezone
|
|
@@ -56,6 +58,10 @@ class SnapHeader:
|
|
|
56
58
|
X_PARTNER_ID, X_EXTERNALID, X_IP_ADDRESS,
|
|
57
59
|
X_DEVICE_ID, X_LATITUDE, X_LONGITUDE, CHANNEL_ID
|
|
58
60
|
]
|
|
61
|
+
SnapBalanceInquiryRuntimeHeaders: List[str] = [
|
|
62
|
+
AUTHORIZATION_CUSTOMER, X_TIMESTAMP, X_SIGNATURE,
|
|
63
|
+
X_PARTNER_ID, X_EXTERNALID, X_DEVICE_ID, CHANNEL_ID
|
|
64
|
+
]
|
|
59
65
|
|
|
60
66
|
@staticmethod
|
|
61
67
|
def merge_with_snap_runtime_headers(auth_from_users: List[str], scenario: str="") -> List[str]:
|
|
@@ -79,9 +85,132 @@ class SnapHeader:
|
|
|
79
85
|
elif scenario == "apply_ott" or scenario == "unbinding_account":
|
|
80
86
|
return list(set(filtered_auth).union(SnapHeader.SnapApplyOTTRuntimeHeaders))
|
|
81
87
|
|
|
88
|
+
elif scenario == "balance_inquiry":
|
|
89
|
+
return list(set(filtered_auth).union(SnapHeader.SnapBalanceInquiryRuntimeHeaders))
|
|
90
|
+
|
|
82
91
|
else:
|
|
83
92
|
return list(set(filtered_auth).union(SnapHeader.SnapRuntimeHeaders))
|
|
84
93
|
|
|
94
|
+
@staticmethod
|
|
95
|
+
def convert_to_pem(key: str, key_type: str) -> str:
|
|
96
|
+
"""
|
|
97
|
+
Convert a key to PEM format
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
key: The key as a string
|
|
101
|
+
key_type: Type of key ("PRIVATE" or "PUBLIC")
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
The key in PEM format
|
|
105
|
+
"""
|
|
106
|
+
# Determine if this is an RSA key or generic private key format
|
|
107
|
+
possible_headers = [
|
|
108
|
+
f"-----BEGIN {key_type} KEY-----",
|
|
109
|
+
f"-----BEGIN RSA {key_type} KEY-----"
|
|
110
|
+
]
|
|
111
|
+
possible_footers = [
|
|
112
|
+
f"-----END {key_type} KEY-----",
|
|
113
|
+
f"-----END RSA {key_type} KEY-----"
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
delimiter = "\n"
|
|
117
|
+
header_found = None
|
|
118
|
+
footer_found = None
|
|
119
|
+
|
|
120
|
+
# Clean up the key first
|
|
121
|
+
key = key.strip()
|
|
122
|
+
|
|
123
|
+
# Replace escaped newlines with actual newlines
|
|
124
|
+
key = key.replace('\\n', "\n")
|
|
125
|
+
|
|
126
|
+
# Check if key already has headers/footers
|
|
127
|
+
for index, header in enumerate(possible_headers):
|
|
128
|
+
if header in key and possible_footers[index] in key:
|
|
129
|
+
header_found = header
|
|
130
|
+
footer_found = possible_footers[index]
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
# If headers/footers found, extract and clean the body
|
|
134
|
+
if header_found is not None and footer_found is not None:
|
|
135
|
+
# Extract body between header and footer
|
|
136
|
+
parts = key.split(header_found, 1)
|
|
137
|
+
parts = parts[1].split(footer_found, 1)
|
|
138
|
+
body = parts[0].strip()
|
|
139
|
+
|
|
140
|
+
# Keep the original format but ensure proper line breaks
|
|
141
|
+
body = re.sub(r'\s+', '', body) # Remove all whitespace
|
|
142
|
+
# Format with proper line breaks - chunk into 64-character lines
|
|
143
|
+
formatted_body = ''
|
|
144
|
+
for i in range(0, len(body), 64):
|
|
145
|
+
formatted_body += body[i:i+64] + delimiter
|
|
146
|
+
|
|
147
|
+
return header_found + delimiter + formatted_body + footer_found
|
|
148
|
+
|
|
149
|
+
# For keys without headers/footers - try both RSA and standard formats
|
|
150
|
+
# Remove all whitespace
|
|
151
|
+
clean_key = re.sub(r'\s+', '', key)
|
|
152
|
+
# Format with proper line breaks
|
|
153
|
+
formatted_body = ''
|
|
154
|
+
for i in range(0, len(clean_key), 64):
|
|
155
|
+
formatted_body += clean_key[i:i+64] + delimiter
|
|
156
|
+
|
|
157
|
+
# First attempt standard key format
|
|
158
|
+
standard_header = f"-----BEGIN {key_type} KEY-----"
|
|
159
|
+
standard_footer = f"-----END {key_type} KEY-----"
|
|
160
|
+
formatted_key = standard_header + delimiter + formatted_body + standard_footer
|
|
161
|
+
|
|
162
|
+
# Try to validate the key using cryptography library
|
|
163
|
+
try:
|
|
164
|
+
# For private keys
|
|
165
|
+
if key_type == "PRIVATE":
|
|
166
|
+
load_pem_private_key(formatted_key.encode(), password=None, backend=default_backend())
|
|
167
|
+
return formatted_key
|
|
168
|
+
# For public keys
|
|
169
|
+
elif key_type == "PUBLIC":
|
|
170
|
+
load_pem_public_key(formatted_key.encode(), backend=default_backend())
|
|
171
|
+
return formatted_key
|
|
172
|
+
except Exception:
|
|
173
|
+
# If standard format fails, try RSA format
|
|
174
|
+
pass
|
|
175
|
+
|
|
176
|
+
# Try RSA format
|
|
177
|
+
rsa_header = f"-----BEGIN RSA {key_type} KEY-----"
|
|
178
|
+
rsa_footer = f"-----END RSA {key_type} KEY-----"
|
|
179
|
+
rsa_formatted_key = rsa_header + delimiter + formatted_body + rsa_footer
|
|
180
|
+
|
|
181
|
+
return rsa_formatted_key
|
|
182
|
+
|
|
183
|
+
@staticmethod
|
|
184
|
+
def get_usable_private_key(private_key: str = None, private_key_path: str = None) -> str:
|
|
185
|
+
"""
|
|
186
|
+
Get usable private key from either file path or string content
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
private_key: Optional private key content as string
|
|
190
|
+
private_key_path: Optional path to private key file
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
str: Properly formatted private key as PEM
|
|
194
|
+
|
|
195
|
+
Raises:
|
|
196
|
+
ValueError: If neither private_key nor private_key_path is provided or valid
|
|
197
|
+
"""
|
|
198
|
+
# If private_key_path is provided and exists, it takes precedence over private_key
|
|
199
|
+
if private_key_path and os.path.exists(private_key_path):
|
|
200
|
+
with open(private_key_path, 'rb') as pem_in:
|
|
201
|
+
pemlines = pem_in.read()
|
|
202
|
+
key = pemlines.decode('utf-8')
|
|
203
|
+
return SnapHeader.convert_to_pem(key, "PRIVATE")
|
|
204
|
+
|
|
205
|
+
# Handle direct private key string
|
|
206
|
+
if private_key:
|
|
207
|
+
# Replace escaped newlines with actual newlines
|
|
208
|
+
key = private_key.replace("\\n", "\n")
|
|
209
|
+
return SnapHeader.convert_to_pem(key, "PRIVATE")
|
|
210
|
+
|
|
211
|
+
# Throw exception if neither key is provided
|
|
212
|
+
raise ValueError("Provide one of private_key or private_key_path")
|
|
213
|
+
|
|
85
214
|
@staticmethod
|
|
86
215
|
def get_snap_generated_auth(
|
|
87
216
|
method: str,
|
|
@@ -100,22 +229,11 @@ class SnapHeader:
|
|
|
100
229
|
'type': 'api_key',
|
|
101
230
|
'value': value
|
|
102
231
|
}
|
|
103
|
-
|
|
104
|
-
def get_usable_private_key(private_key: str, private_key_path: str) -> str:
|
|
105
232
|
|
|
106
|
-
if private_key_path:
|
|
107
|
-
with open(private_key_path, 'rb') as pem_in:
|
|
108
|
-
pemlines = pem_in.read()
|
|
109
|
-
private_key = load_pem_private_key(pemlines, None, default_backend())
|
|
110
|
-
return private_key
|
|
111
|
-
elif private_key:
|
|
112
|
-
private_key = private_key.replace("\\n", "\n")
|
|
113
|
-
return private_key
|
|
114
|
-
else:
|
|
115
|
-
raise ValueError("Provide one of private_key or private_key_path")
|
|
116
233
|
|
|
117
|
-
|
|
118
|
-
|
|
234
|
+
# Use the class method to get the usable private key
|
|
235
|
+
private_key = SnapHeader.get_usable_private_key(private_key=private_key,
|
|
236
|
+
private_key_path=private_key_path)
|
|
119
237
|
|
|
120
238
|
jakarta_time = datetime.now(timezone.utc) + timedelta(hours=7)
|
|
121
239
|
timestamp = jakarta_time.strftime('%Y-%m-%dT%H:%M:%S+07:00')
|
|
@@ -164,6 +282,17 @@ class SnapHeader:
|
|
|
164
282
|
X_LONGITUDE: generateApiKeyAuthSetting(key=X_LONGITUDE, value=body_dict.get('additionalInfo', {}).get('longitude', '')),
|
|
165
283
|
CHANNEL_ID: generateApiKeyAuthSetting(key=CHANNEL_ID, value='95221')
|
|
166
284
|
}
|
|
285
|
+
elif scenario == "balance_inquiry":
|
|
286
|
+
external_id = str(uuid.uuid4())
|
|
287
|
+
body_dict: dict = json.loads(body)
|
|
288
|
+
return {
|
|
289
|
+
AUTHORIZATION_CUSTOMER: generateApiKeyAuthSetting(key=AUTHORIZATION_CUSTOMER, value=f"Bearer {body_dict.get('additionalInfo', {}).get('accessToken', '')}"),
|
|
290
|
+
X_TIMESTAMP: generateApiKeyAuthSetting(key=X_TIMESTAMP, value=timestamp),
|
|
291
|
+
X_SIGNATURE: generateApiKeyAuthSetting(key=X_SIGNATURE, value=encoded_signature),
|
|
292
|
+
X_EXTERNALID: generateApiKeyAuthSetting(key=X_EXTERNALID, value=external_id),
|
|
293
|
+
X_DEVICE_ID: generateApiKeyAuthSetting(key=X_DEVICE_ID, value=body_dict.get('additionalInfo', {}).get('deviceId', '')),
|
|
294
|
+
CHANNEL_ID: generateApiKeyAuthSetting(key=CHANNEL_ID, value='95221')
|
|
295
|
+
}
|
|
167
296
|
else:
|
|
168
297
|
external_id = str(uuid.uuid4())
|
|
169
298
|
return {
|
|
@@ -287,10 +287,10 @@ class WidgetApi:
|
|
|
287
287
|
_header_params['Content-Type'] = _default_content_type
|
|
288
288
|
# authentication setting
|
|
289
289
|
_auth_settings: List[str] = [
|
|
290
|
+
'DANA_ENV',
|
|
290
291
|
'X_PARTNER_ID',
|
|
291
292
|
'PRIVATE_KEY',
|
|
292
|
-
'PRIVATE_KEY_PATH'
|
|
293
|
-
'ENV'
|
|
293
|
+
'PRIVATE_KEY_PATH'
|
|
294
294
|
]
|
|
295
295
|
# merge list of auth settings
|
|
296
296
|
# with list of auth generated at runtime for headers
|
|
@@ -546,12 +546,12 @@ class WidgetApi:
|
|
|
546
546
|
_header_params['Content-Type'] = _default_content_type
|
|
547
547
|
# authentication setting
|
|
548
548
|
_auth_settings: List[str] = [
|
|
549
|
+
'DANA_ENV',
|
|
549
550
|
'ORIGIN',
|
|
550
551
|
'X_PARTNER_ID',
|
|
551
552
|
'CHANNEL_ID',
|
|
552
553
|
'PRIVATE_KEY',
|
|
553
|
-
'PRIVATE_KEY_PATH'
|
|
554
|
-
'ENV'
|
|
554
|
+
'PRIVATE_KEY_PATH'
|
|
555
555
|
]
|
|
556
556
|
# merge list of auth settings
|
|
557
557
|
# with list of auth generated at runtime for headers
|
|
@@ -807,10 +807,10 @@ class WidgetApi:
|
|
|
807
807
|
_header_params['Content-Type'] = _default_content_type
|
|
808
808
|
# authentication setting
|
|
809
809
|
_auth_settings: List[str] = [
|
|
810
|
+
'DANA_ENV',
|
|
810
811
|
'X_PARTNER_ID',
|
|
811
812
|
'PRIVATE_KEY',
|
|
812
|
-
'PRIVATE_KEY_PATH'
|
|
813
|
-
'ENV'
|
|
813
|
+
'PRIVATE_KEY_PATH'
|
|
814
814
|
]
|
|
815
815
|
# merge list of auth settings
|
|
816
816
|
# with list of auth generated at runtime for headers
|
|
@@ -1074,13 +1074,15 @@ class WidgetApi:
|
|
|
1074
1074
|
]
|
|
1075
1075
|
# merge list of auth settings
|
|
1076
1076
|
# with list of auth generated at runtime for headers
|
|
1077
|
-
_auth_settings = SnapHeader.merge_with_snap_runtime_headers(_auth_settings)
|
|
1077
|
+
_auth_settings = SnapHeader.merge_with_snap_runtime_headers(_auth_settings, scenario="balance_inquiry")
|
|
1078
1078
|
_generated_auth = SnapHeader.get_snap_generated_auth(
|
|
1079
1079
|
method='POST',
|
|
1080
1080
|
resource_path='/v1.0/balance-inquiry.htm',
|
|
1081
1081
|
body=balance_inquiry_request.to_json(),
|
|
1082
1082
|
private_key=self.api_client.configuration.get_api_key_with_prefix('PRIVATE_KEY'),
|
|
1083
|
-
private_key_path=self.api_client.configuration.get_api_key_with_prefix('PRIVATE_KEY_PATH')
|
|
1083
|
+
private_key_path=self.api_client.configuration.get_api_key_with_prefix('PRIVATE_KEY_PATH'),
|
|
1084
|
+
scenario="balance_inquiry",
|
|
1085
|
+
client_key=self.api_client.configuration.get_api_key_with_prefix('X_PARTNER_ID')
|
|
1084
1086
|
)
|
|
1085
1087
|
return self.api_client.param_serialize(
|
|
1086
1088
|
method='POST',
|
|
@@ -2326,12 +2328,12 @@ class WidgetApi:
|
|
|
2326
2328
|
_header_params['Content-Type'] = _default_content_type
|
|
2327
2329
|
# authentication setting
|
|
2328
2330
|
_auth_settings: List[str] = [
|
|
2331
|
+
'DANA_ENV',
|
|
2329
2332
|
'ORIGIN',
|
|
2330
2333
|
'X_PARTNER_ID',
|
|
2331
2334
|
'CHANNEL_ID',
|
|
2332
2335
|
'PRIVATE_KEY',
|
|
2333
|
-
'PRIVATE_KEY_PATH'
|
|
2334
|
-
'ENV'
|
|
2336
|
+
'PRIVATE_KEY_PATH'
|
|
2335
2337
|
]
|
|
2336
2338
|
# merge list of auth settings
|
|
2337
2339
|
# with list of auth generated at runtime for headers
|