Bug: [FEATURE] allow wallet data migration



### Feature Description

Currently, migration API is card-centric and performs validation assuming all the entries are for migrating cards. These validations make the wallet migration fail. 


### Possible Implementation

Make card expiry validation optional per payment method type. For now it should be optional for - `PayPal` and `SamsungPay`.

### Have you spent some time checking if this feature request 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?

None
diff --git a/crates/payment_methods/src/core/migration/payment_methods.rs b/crates/payment_methods/src/core/migration/payment_methods.rs
index 5c30698f615..494e1987e21 100644
--- a/crates/payment_methods/src/core/migration/payment_methods.rs
+++ b/crates/payment_methods/src/core/migration/payment_methods.rs
@@ -51,8 +51,12 @@ pub async fn migrate_payment_method(
     let card_number_validation_result =
         cards::CardNumber::from_str(card_details.card_number.peek());
 
-    let card_bin_details =
-        populate_bin_details_for_masked_card(card_details, &*state.store).await?;
+    let card_bin_details = populate_bin_details_for_masked_card(
+        card_details,
+        &*state.store,
+        req.payment_method_type.as_ref(),
+    )
+    .await?;
 
     req.card = Some(api_models::payment_methods::MigrateCardDetail {
         card_issuing_country: card_bin_details.issuer_country.clone(),
@@ -176,8 +180,23 @@ pub async fn migrate_payment_method(
 pub async fn populate_bin_details_for_masked_card(
     card_details: &api_models::payment_methods::MigrateCardDetail,
     db: &dyn state::PaymentMethodsStorageInterface,
+    payment_method_type: Option<&enums::PaymentMethodType>,
 ) -> CustomResult<pm_api::CardDetailFromLocker, errors::ApiErrorResponse> {
-    migration::validate_card_expiry(&card_details.card_exp_month, &card_details.card_exp_year)?;
+    if let Some(
+            // Cards
+            enums::PaymentMethodType::Credit
+            | enums::PaymentMethodType::Debit
+
+            // Wallets
+            | enums::PaymentMethodType::ApplePay
+            | enums::PaymentMethodType::GooglePay,
+        ) = payment_method_type {
+        migration::validate_card_expiry(
+            &card_details.card_exp_month,
+            &card_details.card_exp_year,
+        )?;
+    }
+
     let card_number = card_details.card_number.clone();
 
     let (card_isin, _last4_digits) = get_card_bin_and_last4_digits_for_masked_card(

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

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

## Description
This PR updates the migration flow around card validation to skip card expiry validation for `PayPal` and `SamsungPay` - these payment methods do not have the linked card's expiry details.

### 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
Allows migration of `PayPal` and `SamsungPay` PSP tokens.

## How did you test it?
Performing PayPal migration without specifying card details.

<details>
    <summary>Run migration</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payment_methods/migrate-batch' \
        --header 'api-key: test_admin' \
        --form 'merchant_id="merchant_1756723897"' \
        --form 'merchant_connector_ids="mca_0HKNtxio5DvoSuELXkRm"' \
        --form 'file=@"sample.csv"'

Response

    [
        {
            "line_number": 40,
            "payment_method_id": "pm_cy7Xo2En9vh9vqZydXO2",
            "payment_method": "wallet",
            "payment_method_type": "paypal",
            "customer_id": "ef57377bf54cd4ff3bfc26e1e60dbebf",
            "migration_status": "Success",
            "card_number_masked": "",
            "card_migrated": null,
            "network_token_migrated": true,
            "connector_mandate_details_migrated": true,
            "network_transaction_id_migrated": null
        },
        {
            "line_number": 41,
            "payment_method_id": "pm_GPmSXeoPxhEtAxSC4uDD",
            "payment_method": "wallet",
            "payment_method_type": "paypal",
            "customer_id": "pet-5cda4ebb25e102e30043f14425915b58",
            "migration_status": "Success",
            "card_number_masked": "",
            "card_migrated": null,
            "network_token_migrated": true,
            "connector_mandate_details_migrated": true,
            "network_transaction_id_migrated": null
        },
        {
            "line_number": 42,
            "payment_method_id": "pm_gB4DmNbBNqWsfKru9ZkE",
            "payment_method": "wallet",
            "payment_method_type": "paypal",
            "customer_id": "088e36d3b9ef09533b77d086497a8dc4",
            "migration_status": "Success",
            "card_number_masked": "",
            "card_migrated": null,
            "network_token_migrated": true,
            "connector_mandate_details_migrated": true,
            "network_transaction_id_migrated": null
        }
    ]

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