defmodule DaProductApp.QRProviders.Aani do @behaviour DaProductApp.QRProvider require Logger alias HTTPoison alias DaProductApp.Repo alias DaProductApp.Transactions.Transaction # Add environment configuration @environment "simulator" # Change this to "prod" for production # Define URLs for different environments @urls %{ "simulator" => %{ generate: "https://demo.ctrmv.com/prasanna/aani/aanigenerateqr.php", status: "https://demo.ctrmv.com/prasanna/aani/statusQR.php" }, "prod" => %{ generate: "/business-payment-ms/services/groups/{groupCode}/banks/{bankCode}/bank-user/{bankUserId}/tag/{merchantTag}/qr-code", status: "/business-payment-ms/services/groups/{groupCode}/banks/{bankCode}/qr-code/{qrCodeId}/status" } } @impl true def generate(%{ transaction_refid: transaction_refid, merchant_id: merchant_id, merchant_name: merchant_name, amount: amount, additional_data: additional_data, device_id: device_id, m_ref_num: m_ref_num }) do Logger.info("Entering Aani.generate function") Logger.debug(""" Aani.generate called with: transaction_refid: #{transaction_refid}, merchant_id: #{merchant_id}, merchant_name: #{merchant_name}, amount: #{amount}, additional_data: #{inspect(additional_data)}, device_id: #{device_id}, m_ref_num: #{m_ref_num} """) case register_qr(%{ bankUserId: "AA123467890", merchantTag: merchant_id, payment: %{ amount: amount, currency: "AED", reason: "Test Payment", shopId: "10001", cashDeskId: "1000001", category: "01", type: "PAG", qrCodeTransactionId: transaction_refid, categoryPurpose: "CCP" } }) do {:ok, response} -> Logger.info("QR Code registered successfully in Aani.generate: #{inspect(response)}") {:ok, response} {:error, reason} -> Logger.error("Failed to register QR Code in Aani.generate: #{inspect(reason)}") {:error, reason} end end defp register_qr(params) do Logger.info("Entering Aani.register_qr function") url = get_url() Logger.info("Using #{@environment} environment with URL: #{url}") headers = [ {"Content-Type", "application/json"} ] body = Jason.encode!(params) Logger.info("Sending request to Aani registerQR: #{url} with body: #{body}") case HTTPoison.post(url, body, headers) do {:ok, %HTTPoison.Response{status_code: 200, body: response_body}} -> Logger.info("Received response from Aani.register_qr: #{response_body}") {:ok, Jason.decode!(response_body)} {:ok, %HTTPoison.Response{status_code: status_code, body: response_body}} -> Logger.error("Error response from Aani.register_qr: #{status_code} - #{response_body}") {:error, %{status_code: status_code, body: response_body}} {:error, %HTTPoison.Error{reason: reason}} -> Logger.error("Failed to connect to Aani.register_qr: #{inspect(reason)}") {:error, reason} end end # Helper function to get the URL based on environment defp get_url do Logger.info("Fetching generate URL for Aani") @urls[@environment][:generate] end @doc """ Check QR code status Returns {:ok, status_response} or {:error, reason} """ def check_status(qr_code_id) do Logger.info("Entering Aani.check_status function") url = get_status_url() headers = [ {"Content-Type", "application/json"} ] body = Jason.encode!(%{ qrCodeId: qr_code_id }) Logger.info("Checking QR status for #{qr_code_id} at URL: #{url}") case HTTPoison.post(url, body, headers) do {:ok, %HTTPoison.Response{status_code: 200, body: response_body}} -> Logger.info("Received status response from Aani.check_status: #{response_body}") {:ok, Jason.decode!(response_body)} {:ok, %HTTPoison.Response{status_code: status_code, body: response_body}} -> Logger.error("Error response from Aani.check_status: #{status_code} - #{response_body}") {:error, %{status_code: status_code, body: response_body}} {:error, %HTTPoison.Error{reason: reason}} -> Logger.error("Failed to connect for status check in Aani.check_status: #{inspect(reason)}") {:error, reason} end end # Helper function to get the status URL based on environment defp get_status_url do Logger.info("Fetching status URL for Aani") @urls[@environment][:status] end end