Skip to content
4 changes: 4 additions & 0 deletions crates/api_models/src/enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ impl Connector {
matches!((self, payout_method), (_, PayoutType::Card))
}
#[cfg(feature = "payouts")]
pub fn is_payout_quote_call_required(&self) -> bool {
matches!(self, Self::Wise)
}
#[cfg(feature = "payouts")]
pub fn supports_access_token_for_payout(&self, payout_method: PayoutType) -> bool {
matches!((self, payout_method), (Self::Paypal, _))
}
Expand Down
40 changes: 0 additions & 40 deletions crates/router/src/connector/wise.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ use crate::{
},
utils::BytesExt,
};
#[cfg(feature = "payouts")]
use crate::{core::payments, routes, types::transformers::ForeignFrom};

#[derive(Debug, Clone)]
pub struct Wise;
Expand Down Expand Up @@ -503,44 +501,6 @@ impl
impl services::ConnectorIntegration<api::PoCreate, types::PayoutsData, types::PayoutsResponseData>
for Wise
{
async fn execute_pretasks(
&self,
router_data: &mut types::PayoutsRouterData<api::PoCreate>,
app_state: &routes::SessionState,
) -> CustomResult<(), errors::ConnectorError> {
// Create a quote
let quote_router_data =
&types::PayoutsRouterData::foreign_from((&router_data, router_data.request.clone()));
let quote_connector_integration: Box<
&(dyn services::ConnectorIntegration<
api::PoQuote,
types::PayoutsData,
types::PayoutsResponseData,
> + Send
+ Sync
+ 'static),
> = Box::new(self);
let quote_router_resp = services::execute_connector_processing_step(
app_state,
quote_connector_integration,
quote_router_data,
payments::CallConnectorAction::Trigger,
None,
)
.await?;

match quote_router_resp.response.to_owned() {
Ok(resp) => {
router_data.quote_id = resp.connector_payout_id;
Ok(())
}
Err(_err) => {
router_data.response = quote_router_resp.response;
Ok(())
}
}
}

fn get_url(
&self,
_req: &types::PayoutsRouterData<api::PoCreate>,
Expand Down
59 changes: 48 additions & 11 deletions crates/router/src/core/payouts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use super::{
payments::customers,
};
#[cfg(feature = "olap")]
use crate::types::{domain::behaviour::Conversion, transformers::ForeignFrom};
use crate::types::domain::behaviour::Conversion;
use crate::{
core::{
errors::{self, CustomResult, RouterResponse, RouterResult},
Expand All @@ -41,6 +41,7 @@ use crate::{
api::{self, payouts},
domain,
storage::{self, PaymentRoutingInfo},
transformers::ForeignFrom,
},
utils::{self, OptionExt},
};
Expand Down Expand Up @@ -160,13 +161,13 @@ pub async fn make_connector_decision(
) -> RouterResult<()> {
match connector_call_type {
api::ConnectorCallType::PreDetermined(connector_data) => {
call_connector_payout(
Box::pin(call_connector_payout(
state,
merchant_account,
key_store,
&connector_data,
payout_data,
)
))
.await?;

#[cfg(feature = "payout_retry")]
Expand Down Expand Up @@ -197,13 +198,13 @@ pub async fn make_connector_decision(

let connector_data = get_next_connector(&mut connectors)?;

call_connector_payout(
Box::pin(call_connector_payout(
state,
merchant_account,
key_store,
&connector_data,
payout_data,
)
))
.await?;

#[cfg(feature = "payout_retry")]
Expand Down Expand Up @@ -933,13 +934,13 @@ pub async fn call_connector_payout(
.await?;

// Payout creation flow
complete_create_payout(
Box::pin(complete_create_payout(
state,
merchant_account,
key_store,
connector_data,
payout_data,
)
))
.await?;
};

Expand Down Expand Up @@ -1380,10 +1381,7 @@ pub async fn create_payout(
> = connector_data.connector.get_connector_integration();

// 4. Execute pretasks
connector_integration
.execute_pretasks(&mut router_data, state)
.await
.to_payout_failed_response()?;
complete_payout_quote_steps_if_required(state, connector_data, &mut router_data).await?;

// 5. Call connector service
let router_data_resp = services::execute_connector_processing_step(
Expand Down Expand Up @@ -1474,6 +1472,45 @@ pub async fn create_payout(
Ok(())
}

async fn complete_payout_quote_steps_if_required<F>(
state: &SessionState,
connector_data: &api::ConnectorData,
router_data: &mut types::RouterData<F, types::PayoutsData, types::PayoutsResponseData>,
) -> RouterResult<()> {
if connector_data
.connector_name
.is_payout_quote_call_required()
{
let quote_router_data =
types::PayoutsRouterData::foreign_from((router_data, router_data.request.clone()));
let connector_integration: services::BoxedConnectorIntegration<
'_,
api::PoQuote,
types::PayoutsData,
types::PayoutsResponseData,
> = connector_data.connector.get_connector_integration();
let router_data_resp = services::execute_connector_processing_step(
state,
connector_integration,
&quote_router_data,
payments::CallConnectorAction::Trigger,
None,
)
.await
.to_payout_failed_response()?;

match router_data_resp.response.to_owned() {
Ok(resp) => {
router_data.quote_id = resp.connector_payout_id;
}
Err(_err) => {
router_data.response = router_data_resp.response;
}
};
}
Ok(())
}

pub async fn complete_create_recipient_disburse_account(
state: &SessionState,
merchant_account: &domain::MerchantAccount,
Expand Down
9 changes: 8 additions & 1 deletion crates/router/src/core/payouts/retry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,14 @@ pub async fn do_retry(

modify_trackers(state, &connector, merchant_account, payout_data).await?;

call_connector_payout(state, merchant_account, key_store, &connector, payout_data).await
Box::pin(call_connector_payout(
state,
merchant_account,
key_store,
&connector,
payout_data,
))
.await
}

#[instrument(skip_all)]
Expand Down
4 changes: 2 additions & 2 deletions crates/router/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -842,13 +842,13 @@ impl<F1, F2, T1, T2> ForeignFrom<(&RouterData<F1, T1, PaymentsResponseData>, T2)
#[cfg(feature = "payouts")]
impl<F1, F2>
ForeignFrom<(
&&mut RouterData<F1, PayoutsData, PayoutsResponseData>,
&RouterData<F1, PayoutsData, PayoutsResponseData>,
PayoutsData,
)> for RouterData<F2, PayoutsData, PayoutsResponseData>
{
fn foreign_from(
item: (
&&mut RouterData<F1, PayoutsData, PayoutsResponseData>,
&RouterData<F1, PayoutsData, PayoutsResponseData>,
PayoutsData,
),
) -> Self {
Expand Down