use crate::client::Client;
use crate::error::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrefixSetup {
pub user_name: String,
pub prefix: String,
pub currency: String,
pub base_url: String,
pub name_enquiry_uri: String,
pub trans_notify_uri: String,
pub auth_type: String,
pub auth_key: String,
pub settle_account: String,
pub is_active: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VirtualAccountTransaction {
#[serde(rename = "originatoraccountnumber")]
pub originator_account_number: Option<String>,
pub amount: Option<String>,
#[serde(rename = "originatorname")]
pub originator_name: Option<String>,
pub narration: Option<String>,
#[serde(rename = "craccountname")]
pub cr_account_name: Option<String>,
#[serde(rename = "paymentreference")]
pub payment_reference: Option<String>,
#[serde(rename = "bankname")]
pub bank_name: Option<String>,
#[serde(rename = "sessionid")]
pub session_id: Option<String>,
#[serde(rename = "craccount")]
pub cr_account: Option<String>,
#[serde(rename = "bankcode")]
pub bank_code: Option<String>,
#[serde(rename = "requestdate")]
pub request_date: Option<String>,
#[serde(rename = "nibssresponse")]
pub nibss_response: Option<String>,
#[serde(rename = "sendstatus")]
pub send_status: Option<String>,
#[serde(rename = "sendresponse")]
pub send_response: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransQueryRequest {
#[serde(rename = "sessionid")]
pub session_id: String,
#[serde(rename = "craccount")]
pub cr_account: String,
pub amount: f64,
#[serde(rename = "txndate")]
pub txn_date: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransQueryResponse {
pub status: Option<String>,
pub status_desc: Option<String>,
#[serde(default)]
pub transactions: Vec<VirtualAccountTransaction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountLookupRequest {
#[serde(rename = "accountnumber")]
pub account_number: String,
#[serde(rename = "bankcode")]
pub bank_code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountLookupResponse {
#[serde(rename = "accountname")]
pub account_name: String,
#[serde(rename = "accountnumber", skip_serializing_if = "Option::is_none")]
pub account_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransNotifyRequest {
#[serde(rename = "originatoraccountnumber")]
pub originator_account_number: String,
pub amount: String,
pub currency: String,
#[serde(rename = "originatorname")]
pub originator_name: String,
pub narration: String,
#[serde(rename = "craccountname")]
pub cr_account_name: String,
#[serde(rename = "paymentreference")]
pub payment_reference: String,
pub reference: String,
#[serde(rename = "bankname")]
pub bank_name: String,
#[serde(rename = "sessionid")]
pub session_id: String,
#[serde(rename = "craccount")]
pub cr_account: String,
#[serde(rename = "bankcode")]
pub bank_code: String,
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransNotifyResponse {
#[serde(rename = "ref")]
pub ack_ref: String,
#[serde(rename = "transactionreference")]
pub transaction_reference: String,
pub status: String,
pub status_desc: String,
}
pub fn compose_virtual_account_number(prefix: &str, suffix: &str) -> String {
format!("{prefix}{suffix}")
}
impl Client {
pub async fn create_prefix(&self, setup: &PrefixSetup) -> Result<String> {
self.post_json::<_, String>("VirtualAccount/api/v1/Prefix/CreateNew", setup, &[])
.await
}
pub async fn modify_prefix(&self, setup: &PrefixSetup) -> Result<String> {
self.post_json::<_, String>("VirtualAccount/api/v1/Prefix/Modify", setup, &[])
.await
}
pub async fn list_prefixes(&self) -> Result<Vec<PrefixSetup>> {
self.get_json::<Vec<PrefixSetup>>("VirtualAccount/api/v1/Prefix", &[], &[])
.await
}
pub async fn get_prefix(&self, prefix: &str) -> Result<PrefixSetup> {
let path = format!("VirtualAccount/api/v1/Prefix/{prefix}");
self.get_json::<PrefixSetup>(&path, &[], &[]).await
}
pub async fn query_transactions(
&self,
request: &TransQueryRequest,
) -> Result<TransQueryResponse> {
self.post_json::<_, TransQueryResponse>("VirtualAccount/api/v1/Trans/TransQuery", request, &[])
.await
}
}