Bug: [REFACTOR]: [WISE] Add amount conversion framework to Wise



### :memo: Feature Description

Currently, amounts are represented as `i64` values throughout the application. We want to introduce a `Unit` struct that explicitly states the denomination. A new type, `MinorUnit`, has been added to standardize the flow of amounts across the application. This type will now be used by all the connector flows.

Rather than handling conversions in each connector, we will centralize the conversion logic in one place within the core of the application.

### :hammer: Possible Implementation

- For each connector, we need to create an amount conversion function. Connectors will specify the format they require, and the core framework will handle the conversion accordingly.
- Connectors should invoke the `convert` function to receive the amount in their required format.
- Refer to the [connector documentation](https://docs.wise.com/api-docs/api-reference/card) to determine the required amount format for each connector.
- You can refer [this PR](https://github.com/juspay/hyperswitch/pull/4825) for more context.


🔖 Note: All the changes needed should be contained within `hyperswitch/crates/router/src/connector/` , `crates/router/src/types/api.rs` , `crates/router/tests/connectors/`


### :package: Have you spent some time checking if this feature request has been raised before?

- [ ] I checked and didn't find a similar issue

### :package: Have you read the Contributing Guidelines?

- [ ] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### :package: Submission Process:
- Ask the maintainers for assignment of the issue, you can request for assignment by commenting on the issue itself.
- Once assigned, submit a pull request (PR).
- Maintainers will review and provide feedback, if any. 
- Maintainers can unassign issues due to inactivity, [read more here](https://github.com/juspay/hyperswitch/wiki/Hacktoberfest-Contribution-Rules).

Refer [here](https://github.com/juspay/hyperswitch/blob/main/docs/TERMS_OF_CONTEST.md) for Terms and conditions for the contest.

###  :sparkles: Are you willing to submit a PR?

diff --git a/crates/router/src/connector/wise.rs b/crates/router/src/connector/wise.rs
index 8123ae7ec79..9f41651b2f9 100644
--- a/crates/router/src/connector/wise.rs
+++ b/crates/router/src/connector/wise.rs
@@ -1,8 +1,8 @@
 pub mod transformers;
-use std::fmt::Debug;
 
 #[cfg(feature = "payouts")]
 use common_utils::request::RequestContent;
+use common_utils::types::{AmountConvertor, MinorUnit, MinorUnitForConnector};
 use error_stack::{report, ResultExt};
 #[cfg(feature = "payouts")]
 use masking::PeekInterface;
@@ -10,6 +10,7 @@ use masking::PeekInterface;
 use router_env::{instrument, tracing};
 
 use self::transformers as wise;
+use super::utils::convert_amount;
 use crate::{
     configs::settings,
     core::errors::{self, CustomResult},
@@ -27,8 +28,18 @@ use crate::{
     utils::BytesExt,
 };
 
-#[derive(Debug, Clone)]
-pub struct Wise;
+#[derive(Clone)]
+pub struct Wise {
+    amount_converter: &'static (dyn AmountConvertor<Output = MinorUnit> + Sync),
+}
+
+impl Wise {
+    pub fn new() -> &'static Self {
+        &Self {
+            amount_converter: &MinorUnitForConnector,
+        }
+    }
+}
 
 impl<Flow, Request, Response> ConnectorCommonExt<Flow, Request, Response> for Wise
 where
@@ -362,7 +373,13 @@ impl services::ConnectorIntegration<api::PoQuote, types::PayoutsData, types::Pay
         req: &types::PayoutsRouterData<api::PoQuote>,
         _connectors: &settings::Connectors,
     ) -> CustomResult<RequestContent, errors::ConnectorError> {
-        let connector_req = wise::WisePayoutQuoteRequest::try_from(req)?;
+        let amount = convert_amount(
+            self.amount_converter,
+            req.request.minor_amount,
+            req.request.source_currency,
+        )?;
+        let connector_router_data = wise::WiseRouterData::from((amount, req));
+        let connector_req = wise::WisePayoutQuoteRequest::try_from(&connector_router_data)?;
         Ok(RequestContent::Json(Box::new(connector_req)))
     }
 
@@ -441,7 +458,13 @@ impl
         req: &types::PayoutsRouterData<api::PoRecipient>,
         _connectors: &settings::Connectors,
     ) -> CustomResult<RequestContent, errors::ConnectorError> {
-        let connector_req = wise::WiseRecipientCreateRequest::try_from(req)?;
+        let amount = convert_amount(
+            self.amount_converter,
+            req.request.minor_amount,
+            req.request.source_currency,
+        )?;
+        let connector_router_data = wise::WiseRouterData::from((amount, req));
+        let connector_req = wise::WiseRecipientCreateRequest::try_from(&connector_router_data)?;
         Ok(RequestContent::Json(Box::new(connector_req)))
     }
 
diff --git a/crates/router/src/connector/wise/transformers.rs b/crates/router/src/connector/wise/transformers.rs
index fe82ffa5954..94849f2b1ca 100644
--- a/crates/router/src/connector/wise/transformers.rs
+++ b/crates/router/src/connector/wise/transformers.rs
@@ -2,6 +2,7 @@
 use api_models::payouts::PayoutMethodData;
 #[cfg(feature = "payouts")]
 use common_utils::pii::Email;
+use common_utils::types::MinorUnit;
 use masking::Secret;
 use serde::{Deserialize, Serialize};
 
@@ -16,6 +17,20 @@ use crate::{
     },
 };
 use crate::{core::errors, types};
+#[derive(Debug, Serialize)]
+pub struct WiseRouterData<T> {
+    pub amount: MinorUnit,
+    pub router_data: T,
+}
+
+impl<T> From<(MinorUnit, T)> for WiseRouterData<T> {
+    fn from((amount, router_data): (MinorUnit, T)) -> Self {
+        Self {
+            amount,
+            router_data,
+        }
+    }
+}
 
 pub struct WiseAuthType {
     pub(super) api_key: Secret<String>,
@@ -156,8 +171,8 @@ pub struct WiseRecipientCreateResponse {
 pub struct WisePayoutQuoteRequest {
     source_currency: String,
     target_currency: String,
-    source_amount: Option<i64>,
-    target_amount: Option<i64>,
+    source_amount: Option<MinorUnit>,
+    target_amount: Option<MinorUnit>,
     pay_out: WisePayOutOption,
 }
 
@@ -348,9 +363,12 @@ fn get_payout_bank_details(
 
 // Payouts recipient create request transform
 #[cfg(feature = "payouts")]
-impl<F> TryFrom<&types::PayoutsRouterData<F>> for WiseRecipientCreateRequest {
+impl<F> TryFrom<&WiseRouterData<&types::PayoutsRouterData<F>>> for WiseRecipientCreateRequest {
     type Error = Error;
-    fn try_from(item: &types::PayoutsRouterData<F>) -> Result<Self, Self::Error> {
+    fn try_from(
+        item_data: &WiseRouterData<&types::PayoutsRouterData<F>>,
+    ) -> Result<Self, Self::Error> {
+        let item = item_data.router_data;
         let request = item.request.to_owned();
         let customer_details = request.customer_details.to_owned();
         let payout_method_data = item.get_payout_method_data()?;
@@ -420,14 +438,17 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, WiseRecipientCreateResponse>
 
 // Payouts quote request transform
 #[cfg(feature = "payouts")]
-impl<F> TryFrom<&types::PayoutsRouterData<F>> for WisePayoutQuoteRequest {
+impl<F> TryFrom<&WiseRouterData<&types::PayoutsRouterData<F>>> for WisePayoutQuoteRequest {
     type Error = Error;
-    fn try_from(item: &types::PayoutsRouterData<F>) -> Result<Self, Self::Error> {
+    fn try_from(
+        item_data: &WiseRouterData<&types::PayoutsRouterData<F>>,
+    ) -> Result<Self, Self::Error> {
+        let item = item_data.router_data;
         let request = item.request.to_owned();
         let payout_type = request.get_payout_type()?;
         match payout_type {
             storage_enums::PayoutType::Bank => Ok(Self {
-                source_amount: Some(request.amount),
+                source_amount: Some(item_data.amount),
                 source_currency: request.source_currency.to_string(),
                 target_amount: None,
                 target_currency: request.destination_currency.to_string(),
diff --git a/crates/router/src/types/api.rs b/crates/router/src/types/api.rs
index a3046213272..681dd8ee2b0 100644
--- a/crates/router/src/types/api.rs
+++ b/crates/router/src/types/api.rs
@@ -480,7 +480,7 @@ impl ConnectorData {
                 enums::Connector::Stripe => {
                     Ok(ConnectorEnum::Old(Box::new(connector::Stripe::new())))
                 }
-                enums::Connector::Wise => Ok(ConnectorEnum::Old(Box::new(&connector::Wise))),
+                enums::Connector::Wise => Ok(ConnectorEnum::Old(Box::new(connector::Wise::new()))),
                 enums::Connector::Worldline => {
                     Ok(ConnectorEnum::Old(Box::new(&connector::Worldline)))
                 }
diff --git a/crates/router/tests/connectors/wise.rs b/crates/router/tests/connectors/wise.rs
index 76167804670..984a43d48a7 100644
--- a/crates/router/tests/connectors/wise.rs
+++ b/crates/router/tests/connectors/wise.rs
@@ -28,7 +28,7 @@ impl utils::Connector for WiseTest {
     fn get_payout_data(&self) -> Option<api::ConnectorData> {
         use router::connector::Wise;
         Some(utils::construct_connector_data_old(
-            Box::new(&Wise),
+            Box::new(Wise::new()),
             types::Connector::Wise,
             api::GetToken::Connector,
             None,

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [ ] New feature
- [ ] Enhancement
- [x] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
This pull request introduces significant changes to the Wise connector in the `crates/router` module, focusing on the integration of a new amount conversion utility and refactoring to utilize a new `WiseRouterData` struct. The changes enhance how amounts are handled and improve the overall structure and clarity of the code.

### Refactoring and Enhancements:

* **Amount Conversion Utility Integration:**
  - Added `amount_converter` to the `Wise` struct and integrated it into the `new` method.
  - Updated `convert_amount` usage in `WisePayoutQuoteRequest` and `WiseRecipientCreateRequest` implementations to use the new `amount_converter`. [[1]](diffhunk://#diff-a149ab1c35f89dd3b0eed2fca15df170708e81962550226b958ae6c367515043L365-R382) [[2]](diffhunk://#diff-a149ab1c35f89dd3b0eed2fca15df170708e81962550226b958ae6c367515043L444-R467)

* **Introduction of `WiseRouterData` Struct:**
  - Added `WiseRouterData` struct to encapsulate amount and router data, and implemented conversion from a tuple.
  - Modified `WisePayoutQuoteRequest` and `WiseRecipientCreateRequest` to use `WiseRouterData` for transformations. [[1]](diffhunk://#diff-1e46db110c015ea743fbbe850bf756011b4311a1ef56fe5ee75c911bb4960b15L351-R371) [[2]](diffhunk://#diff-1e46db110c015ea743fbbe850bf756011b4311a1ef56fe5ee75c911bb4960b15L423-R451)

### Codebase Simplification:

* **Removal of Unnecessary Debug Trait:**
  - Removed the `Debug` trait from the `Wise` struct.

* **Update in Connector Initialization:**
  - Updated the initialization of the `Wise` connector to use the `new` method in `api.rs` and test files. [[1]](diffhunk://#diff-71935350b305eb696195bc45f26e6f2a16097fb17bd5ac55192eb1d03558bf9aL483-R483) [[2]](diffhunk://#diff-0177b5efcc163c3f657a8c60b0162bf272a68a5e22beb13f6eb309bd34d54166L31-R31)

### Minor Enhancements:

* **Type Adjustments:**
  - Changed various fields in `WiseRecipientCreateRequest` and `WisePayoutQuoteRequest` to use `StringMajorUnit` instead of `String` or `i64`. [[1]](diffhunk://#diff-1e46db110c015ea743fbbe850bf756011b4311a1ef56fe5ee75c911bb4960b15L64-R79) [[2]](diffhunk://#diff-1e46db110c015ea743fbbe850bf756011b4311a1ef56fe5ee75c911bb4960b15L159-R175)

These changes collectively improve the robustness and maintainability of the Wise connector, ensuring better handling of amount conversions and a cleaner code structure.


### Additional Changes

- [ ] This PR modifies the API contract
- [ ] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->

Fixes #6121 
## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [x] I formatted the code `cargo +nightly fmt --all`
- [x] I addressed lints thrown by `cargo clippy`
- [x] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
