Bug: [BUG] propagate additional payout method data for recurring payouts using PSP token



### Bug Description

Additional payout method data for recurring payouts (using PSP tokens) is missing in the API and webhook response.

### Expected Behavior

Additional payout method data should be present in both API and webhook response if it's present.

### Actual Behavior

Additional payout method data is missing.

### Steps To Reproduce

1. Create a payout using migrated token for payouts
2. Check the API and webhooks response

### Environment

Are you using hyperswitch hosted version? Yes/No
If yes, please provide the value of the `x-request-id` response header to help us debug your issue.

If not (or if building/running locally), please provide the following details:
1. Operating System or Linux distribution:
2. Rust version (output of `rustc --version`): ``
3. App version (output of `cargo r --features vergen -- --version`): ``


### Have you spent some time checking if this bug has been raised before?

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

### Have you read the Contributing Guidelines?

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

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!
diff --git a/crates/hyperswitch_domain_models/src/payment_method_data.rs b/crates/hyperswitch_domain_models/src/payment_method_data.rs
index 43af1bfa852..59202837dc2 100644
--- a/crates/hyperswitch_domain_models/src/payment_method_data.rs
+++ b/crates/hyperswitch_domain_models/src/payment_method_data.rs
@@ -15,6 +15,7 @@ use common_utils::{
     new_type::{
         MaskedBankAccount, MaskedIban, MaskedRoutingNumber, MaskedSortCode, MaskedUpiVpaId,
     },
+    payout_method_utils,
     pii::{self, Email},
 };
 use masking::{PeekInterface, Secret};
@@ -2299,6 +2300,33 @@ impl PaymentMethodsData {
     pub fn get_co_badged_card_data(&self) -> Option<payment_methods::CoBadgedCardData> {
         todo!()
     }
+
+    #[cfg(feature = "v1")]
+    pub fn get_additional_payout_method_data(
+        &self,
+    ) -> Option<payout_method_utils::AdditionalPayoutMethodData> {
+        match self {
+            Self::Card(card_details) => {
+                router_env::logger::info!("Populating AdditionalPayoutMethodData from Card payment method data for recurring payout");
+                Some(payout_method_utils::AdditionalPayoutMethodData::Card(
+                    Box::new(payout_method_utils::CardAdditionalData {
+                        card_issuer: card_details.card_issuer.clone(),
+                        card_network: card_details.card_network.clone(),
+                        bank_code: None,
+                        card_type: card_details.card_type.clone(),
+                        card_issuing_country: card_details.issuer_country.clone(),
+                        last4: card_details.last4_digits.clone(),
+                        card_isin: card_details.card_isin.clone(),
+                        card_extended_bin: None,
+                        card_exp_month: card_details.expiry_month.clone(),
+                        card_exp_year: card_details.expiry_year.clone(),
+                        card_holder_name: card_details.card_holder_name.clone(),
+                    }),
+                ))
+            }
+            Self::BankDetails(_) | Self::WalletDetails(_) | Self::NetworkToken(_) => None,
+        }
+    }
 }
 
 #[derive(Clone, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
diff --git a/crates/router/src/core/payouts.rs b/crates/router/src/core/payouts.rs
index 491957045c7..e0bb73fd297 100644
--- a/crates/router/src/core/payouts.rs
+++ b/crates/router/src/core/payouts.rs
@@ -2782,7 +2782,15 @@ pub async fn payout_create_db_entries(
             helpers::get_additional_payout_data(&payout_method_data, &*state.store, profile_id)
                 .await
         })
-        .await;
+        .await
+        // If no payout method data in request but we have a stored payment method, populate from it
+        .or_else(|| {
+            payment_method.as_ref().and_then(|payment_method| {
+                payment_method
+                    .get_payment_methods_data()
+                    .and_then(|pmd| pmd.get_additional_payout_method_data())
+            })
+        });
 
     let payout_attempt_req = storage::PayoutAttemptNew {
         payout_attempt_id: payout_attempt_id.to_string(),

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

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

## Description
This PR fixes the missing additional payout method details in the response when using stored payment methods (via PSP tokens) for processing payouts.

### 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
Sends back additional payout method details (if they exist) when using PSP tokens for processing payouts.

## How did you test it?
<details>
    <summary>1. Migrate payment method</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payment_methods/migrate-batch' \
        --header 'api-key: test_admin' \
        --form 'merchant_id="merchant_1758125250"' \
        --form 'merchant_connector_id="mca_k6axPokgVgx67z9hmNkj"' \
        --form 'file=@"tokens__migrate.csv"'

[tokens__migrate.csv](https://github.com/user-attachments/files/22390753/tokens__migrate.csv)

Response

    [
        {
            "line_number": 1,
            "payment_method_id": "pm_YspT9VnuMG0XecrqkhZs",
            "payment_method": "card",
            "payment_method_type": "credit",
            "customer_id": "cus_AdzK04pgB274z931M7JL",
            "migration_status": "Success",
            "card_number_masked": "429318 xxxx 0008",
            "card_migrated": null,
            "network_token_migrated": true,
            "connector_mandate_details_migrated": true,
            "network_transaction_id_migrated": true
        }
    ]

</details>

<details>
    <summary>2. Update token to make it payout eligible</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payment_methods/update-batch' \
        --header 'api-key: test_admin' \
        --form 'merchant_id="merchant_1758125250"' \
        --form 'merchant_connector_id="mca_k6axPokgVgx67z9hmNkj"' \
        --form 'file=@"tokens__update.csv"'

[tokens__update.csv](https://github.com/user-attachments/files/22390755/tokens__update.csv)

Response

    [
        {
            "payment_method_id": "pm_YspT9VnuMG0XecrqkhZs",
            "status": "active",
            "network_transaction_id": "512560415387748",
            "connector_mandate_details": {
                "payouts": {
                    "mca_k6axPokgVgx67z9hmNkj": {
                        "transfer_method_id": "PQJWQCVLMZD3LTT5"
                    }
                },
                "mca_k6axPokgVgx67z9hmNkj": {
                    "mandate_metadata": null,
                    "payment_method_type": "credit",
                    "connector_mandate_id": "PQJWQCVLMZD3LTT5",
                    "connector_mandate_status": null,
                    "original_payment_authorized_amount": null,
                    "original_payment_authorized_currency": null,
                    "connector_mandate_request_reference_id": null
                }
            },
            "update_status": "Success",
            "line_number": 1
        }
    ]

</details>

<details>
    <summary>3. Create payout using payment_method_id</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payouts/create' \
        --header 'Content-Type: application/json' \
        --header 'api-key: dev_1cELx0sYKhaGJNBh3actVbPYXkFnnOxhQbn6JT6APnI2DPqDvncMJndF2vyFuQjs' \
        --data '{"payout_method_id":"pm_YspT9VnuMG0XecrqkhZs","amount":1,"currency":"EUR","customer_id":"cus_AdzK04pgB274z931M7JL","phone_country_code":"+65","description":"Its my first payout request","connector":["adyenplatform"],"entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"confirm":true,"auto_fulfill":true,"profile_id":"pro_kgnfc6bjRh1yoyyCuuYS","billing":{"address":{"line1":"Raadhuisplein","line2":"92","city":"Hoogeveen","state":"FL","zip":"7901 BW","country":"NL","first_name":"John","last_name":"Doe"},"phone":{"number":"0650242319","country_code":"+31"}}}'

Response (must have payout_method_data)

    {"payout_id":"payout_uIYW6dcWF0UESBtvayES","merchant_id":"merchant_1758125250","merchant_order_reference_id":null,"amount":1,"currency":"EUR","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"WESTPAC BANKING CORPORATION","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"AUSTRALIA","bank_code":null,"last4":"0008","card_isin":"429318","card_extended_bin":null,"card_exp_month":"3","card_exp_year":"2030","card_holder_name":"Albert Klaassen"}},"billing":{"address":{"city":"Hoogeveen","country":"NL","line1":"Raadhuisplein","line2":"92","line3":null,"zip":"7901 BW","state":"FL","first_name":"John","last_name":"Doe","origin_zip":null},"phone":{"number":"0650242319","country_code":"+31"},"email":null},"auto_fulfill":true,"customer_id":"cus_AdzK04pgB274z931M7JL","customer":{"id":"cus_AdzK04pgB274z931M7JL","name":"Albert Klaassen","email":null,"phone":null,"phone_country_code":null},"client_secret":"payout_payout_uIYW6dcWF0UESBtvayES_secret_2Rp8hjZfSHFNC7Y7U5eo","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_k6axPokgVgx67z9hmNkj","status":"failed","error_message":"Unauthorized","error_code":"00_401","profile_id":"pro_kgnfc6bjRh1yoyyCuuYS","created":"2025-09-17T16:43:54.344Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":null,"phone_country_code":null,"unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":"pm_YspT9VnuMG0XecrqkhZs"}

Webhooks response (must have payout_method_data)

    {"merchant_id":"merchant_1758125250","event_id":"evt_0199588fabf176d1ad39603c17064d2d","event_type":"payout_failed","content":{"type":"payout_details","object":{"payout_id":"payout_uIYW6dcWF0UESBtvayES","merchant_id":"merchant_1758125250","merchant_order_reference_id":null,"amount":1,"currency":"EUR","connector":"adyenplatform","payout_type":"card","payout_method_data":{"card":{"card_issuer":"WESTPAC BANKING CORPORATION","card_network":"Visa","card_type":"CREDIT","card_issuing_country":"AUSTRALIA","bank_code":null,"last4":"0008","card_isin":"429318","card_extended_bin":null,"card_exp_month":"3","card_exp_year":"2030","card_holder_name":"Albert Klaassen"}},"billing":{"address":{"city":"Hoogeveen","country":"NL","line1":"Raadhuisplein","line2":"92","line3":null,"zip":"7901 BW","state":"FL","first_name":"John","last_name":"Doe","origin_zip":null},"phone":{"number":"0650242319","country_code":"+31"},"email":null},"auto_fulfill":true,"customer_id":"cus_AdzK04pgB274z931M7JL","customer":{"id":"cus_AdzK04pgB274z931M7JL","name":"Albert Klaassen","email":null,"phone":null,"phone_country_code":null},"client_secret":"payout_payout_uIYW6dcWF0UESBtvayES_secret_2Rp8hjZfSHFNC7Y7U5eo","return_url":null,"business_country":null,"business_label":null,"description":"Its my first payout request","entity_type":"Individual","recurring":true,"metadata":{"ref":"123"},"merchant_connector_id":"mca_k6axPokgVgx67z9hmNkj","status":"failed","error_message":"Unauthorized","error_code":"00_401","profile_id":"pro_kgnfc6bjRh1yoyyCuuYS","created":"2025-09-17T16:43:54.344Z","connector_transaction_id":null,"priority":null,"payout_link":null,"email":null,"name":"Albert Klaassen","phone":null,"phone_country_code":null,"unified_code":"UE_9000","unified_message":"Something went wrong","payout_method_id":"pm_YspT9VnuMG0XecrqkhZs"}},"timestamp":"2025-09-17T16:43:54.737Z"}

</details>


## 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