Bug: [FEATURE] expiration for Pix payments



### Feature Description

Pix is a payment method in Brazil where customers can scan a QR and pay.

This QR code generation usually has an expiry which can be specified during payment intent creation with the underlying payment processors. Currently, there isn't a way to create a Pix QR code specifying the expiry date using HS payments. This needs to be accepted in the `/payments` create API for Pix payment method data and consumed in the connector integration during integration.

Flows to keep in mind

- ✅ S2S API integrations - `expiry_date` will be specified explicitly
- ✅ Payment links - `expiry_date` will depend on the `session_expiry` which dictates the expiration of the payment links

### Possible Implementation

For S2S API integrations - accept a new field in Pix bank transfer for specifying the expiration date (`expiry_date`).

ToDos
- Accept a new optional field in PixBankTransfer
- Consume in Adyen integration - https://docs.adyen.com/payment-methods/pix/api-only/#make-payment

### 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/api_models/src/payments.rs b/crates/api_models/src/payments.rs
index cef094a98d5..f7d8a808a71 100644
--- a/crates/api_models/src/payments.rs
+++ b/crates/api_models/src/payments.rs
@@ -3438,6 +3438,11 @@ pub enum BankTransferData {
         /// Destination bank account number
         #[schema(value_type = Option<String>, example = "9b95f84e-de61-460b-a14b-f23b4e71c97b")]
         destination_bank_account_id: Option<MaskedBankAccount>,
+
+        /// The expiration date and time for the Pix QR code in ISO 8601 format
+        #[schema(value_type = Option<String>, example = "2025-09-10T10:11:12Z")]
+        #[serde(default, with = "common_utils::custom_serde::iso8601::option")]
+        expiry_date: Option<PrimitiveDateTime>,
     },
     Pse {},
     LocalBankTransfer {
diff --git a/crates/api_models/src/payments/additional_info.rs b/crates/api_models/src/payments/additional_info.rs
index ab143975ea4..099e055980a 100644
--- a/crates/api_models/src/payments/additional_info.rs
+++ b/crates/api_models/src/payments/additional_info.rs
@@ -177,6 +177,11 @@ pub struct PixBankTransferAdditionalData {
     /// Partially masked destination bank account number
     #[schema(value_type = Option<String>, example = "********-****-460b-****-f23b4e71c97b")]
     pub destination_bank_account_id: Option<MaskedBankAccount>,
+
+    /// The expiration date and time for the Pix QR code in ISO 8601 format
+    #[schema(value_type = Option<String>, example = "2025-09-10T10:11:12Z")]
+    #[serde(default, with = "common_utils::custom_serde::iso8601::option")]
+    pub expiry_date: Option<time::PrimitiveDateTime>,
 }
 
 #[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
diff --git a/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs
index d972c958b71..5a47dec7cdd 100644
--- a/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs
+++ b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs
@@ -291,6 +291,8 @@ pub struct AdyenPaymentRequest<'a> {
     splits: Option<Vec<AdyenSplitData>>,
     store: Option<String>,
     device_fingerprint: Option<Secret<String>>,
+    #[serde(with = "common_utils::custom_serde::iso8601::option")]
+    session_validity: Option<PrimitiveDateTime>,
 }
 
 #[derive(Debug, Clone, Serialize, Deserialize)]
@@ -2922,6 +2924,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -3005,6 +3008,7 @@ impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &Card)> for AdyenP
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -3092,6 +3096,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         };
         Ok(request)
     }
@@ -3167,6 +3172,7 @@ impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &VoucherData)>
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         };
         Ok(request)
     }
@@ -3213,6 +3219,46 @@ impl
         let delivery_address =
             get_address_info(item.router_data.get_optional_shipping()).and_then(Result::ok);
         let telephone_number = item.router_data.get_optional_billing_phone_number();
+        let (session_validity, social_security_number) = match bank_transfer_data {
+            BankTransferData::Pix {
+                cpf,
+                cnpj,
+                expiry_date,
+                ..
+            } => {
+                // Validate expiry_date doesn't exceed 5 days from now
+                if let Some(expiry) = expiry_date {
+                    let now = OffsetDateTime::now_utc();
+                    let max_expiry = now + Duration::days(5);
+                    let max_expiry_primitive =
+                        PrimitiveDateTime::new(max_expiry.date(), max_expiry.time());
+
+                    if *expiry > max_expiry_primitive {
+                        return Err(report!(errors::ConnectorError::InvalidDataFormat {
+                            field_name: "expiry_date cannot be more than 5 days from now",
+                        }));
+                    }
+                }
+
+                (*expiry_date, cpf.as_ref().or(cnpj.as_ref()).cloned())
+            }
+            BankTransferData::LocalBankTransfer { .. } => (None, None),
+            BankTransferData::AchBankTransfer {}
+            | BankTransferData::SepaBankTransfer {}
+            | BankTransferData::BacsBankTransfer {}
+            | BankTransferData::MultibancoBankTransfer {}
+            | BankTransferData::PermataBankTransfer {}
+            | BankTransferData::BcaBankTransfer {}
+            | BankTransferData::BniVaBankTransfer {}
+            | BankTransferData::BriVaBankTransfer {}
+            | BankTransferData::CimbVaBankTransfer {}
+            | BankTransferData::DanamonVaBankTransfer {}
+            | BankTransferData::MandiriVaBankTransfer {}
+            | BankTransferData::Pse {}
+            | BankTransferData::InstantBankTransfer {}
+            | BankTransferData::InstantBankTransferFinland {}
+            | BankTransferData::InstantBankTransferPoland {} => (None, None),
+        };
 
         let request = AdyenPaymentRequest {
             amount,
@@ -3228,7 +3274,7 @@ impl
             shopper_name: None,
             shopper_locale: None,
             shopper_email: item.router_data.get_optional_billing_email(),
-            social_security_number: None,
+            social_security_number,
             telephone_number,
             billing_address,
             delivery_address,
@@ -3243,6 +3289,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity,
         };
         Ok(request)
     }
@@ -3319,6 +3366,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         };
         Ok(request)
     }
@@ -3399,6 +3447,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -3529,6 +3578,7 @@ impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &WalletData)>
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -3618,6 +3668,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -3699,6 +3750,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
@@ -5945,6 +5997,7 @@ impl
             store,
             splits,
             device_fingerprint,
+            session_validity: None,
         })
     }
 }
diff --git a/crates/hyperswitch_domain_models/src/payment_method_data.rs b/crates/hyperswitch_domain_models/src/payment_method_data.rs
index f2f86479362..b273ec4569c 100644
--- a/crates/hyperswitch_domain_models/src/payment_method_data.rs
+++ b/crates/hyperswitch_domain_models/src/payment_method_data.rs
@@ -710,6 +710,8 @@ pub enum BankTransferData {
         source_bank_account_id: Option<MaskedBankAccount>,
         /// Destination bank account UUID.
         destination_bank_account_id: Option<MaskedBankAccount>,
+        /// The expiration date and time for the Pix QR code
+        expiry_date: Option<time::PrimitiveDateTime>,
     },
     Pse {},
     LocalBankTransfer {
@@ -1618,12 +1620,14 @@ impl From<api_models::payments::BankTransferData> for BankTransferData {
                 cnpj,
                 source_bank_account_id,
                 destination_bank_account_id,
+                expiry_date,
             } => Self::Pix {
                 pix_key,
                 cpf,
                 cnpj,
                 source_bank_account_id,
                 destination_bank_account_id,
+                expiry_date,
             },
             api_models::payments::BankTransferData::Pse {} => Self::Pse {},
             api_models::payments::BankTransferData::LocalBankTransfer { bank_code } => {
@@ -1662,6 +1666,7 @@ impl From<BankTransferData> for api_models::payments::additional_info::BankTrans
                 cnpj,
                 source_bank_account_id,
                 destination_bank_account_id,
+                expiry_date,
             } => Self::Pix(Box::new(
                 api_models::payments::additional_info::PixBankTransferAdditionalData {
                     pix_key: pix_key.map(MaskedBankAccount::from),
@@ -1669,6 +1674,7 @@ impl From<BankTransferData> for api_models::payments::additional_info::BankTrans
                     cnpj: cnpj.map(MaskedBankAccount::from),
                     source_bank_account_id,
                     destination_bank_account_id,
+                    expiry_date,
                 },
             )),
             BankTransferData::Pse {} => Self::Pse {},

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

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

## Description
<!-- Describe your changes in detail -->

Enhanced Pix payment support for Adyen connector with two changes:

1. **Expiry Date Support**: Added `expiry_date` field to `BankTransferData::Pix` variant in API and domain models and mapped it to Adyen's `sessionValidity`
2. **CPF/CNPJ Mapping**: Map CPF or CNPJ from Pix payment data to Adyen's `socialSecurityNumber` field

### Additional Changes

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

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

Enables merchants to specify expiry dates for Pix QR codes and ensures proper customer identification through CPF/CNPJ mapping as per Adyen's Pix API requirements.

## 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)?
-->
<details>
    <summary>1. Create a Pix payment using custom SSN and expiry date</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payments' \
        --header 'Content-Type: application/json' \
        --header 'Accept: application/json' \
        --header 'api-key: dev_uXENxlgLNNVyGVRpR0D4S1om0k65a6X3nyc5WfAXjwUlVWmBSl3ZPGJHhywazTN6' \
        --data-raw '{"amount":4500,"currency":"BRL","confirm":true,"profile_id":"pro_U1KoDSmwFwzKn649yraI","capture_on":"2022-09-10T10:11:12Z","connector":["adyen"],"customer_id":"cus_6vLys2IeaGT4xVbFj2U9","email":"abc@example.com","return_url":"https://google.com","payment_method":"bank_transfer","payment_method_type":"pix","payment_method_data":{"bank_transfer":{"pix":{"pix_key":"test","cpf":"test","cnpj":"test","expiry_date":"2025-07-23T10:11:12Z"}}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","line3":"Harrison Street","city":"San Fransico","state":"California","zip":"94122","country":"BR","first_name":"joseph","last_name":"Doe"},"phone":{"number":"8056594427","country_code":"+91"},"email":"guest@example.com"},"metadata":{"Force-PSP":"Adyen","udf1":"value1","new_customer":"true","login_date":"2019-09-10T10:11:12Z"},"browser_info":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","accept_header":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","language":"en-US","color_depth":32,"screen_height":1117,"screen_width":1728,"time_zone":-330,"java_enabled":true,"java_script_enabled":true,"ip_address":"127.0.0.1"},"customer_acceptance":{"acceptance_type":"online","accepted_at":"1963-05-03T04:07:52.723Z","online":{"ip_address":"127.0.0.1","user_agent":"amet irure esse"}},"session_expiry":60}'

Response

    {"payment_id":"pay_iB7uN0kUtp51wVHpLhQF","merchant_id":"merchant_1753076715","status":"requires_customer_action","amount":4500,"net_amount":4500,"shipping_cost":null,"amount_capturable":4500,"amount_received":null,"connector":"adyen","client_secret":"pay_iB7uN0kUtp51wVHpLhQF_secret_6kerLIBddt2ShUGKwXcP","created":"2025-07-21T08:12:53.420Z","currency":"BRL","customer_id":"cus_6vLys2IeaGT4xVbFj2U9","customer":{"id":"cus_6vLys2IeaGT4xVbFj2U9","name":"John Nether","email":"abc@example.com","phone":"6168205362","phone_country_code":"+1"},"description":null,"refunds":null,"disputes":null,"mandate_id":null,"mandate_data":null,"setup_future_usage":null,"off_session":null,"capture_on":null,"capture_method":null,"payment_method":"bank_transfer","payment_method_data":{"bank_transfer":{"pix":{"pix_key":"test","cpf":"test","cnpj":"test","source_bank_account_id":null,"destination_bank_account_id":null,"expiry_date":"2025-07-23T10:11:12.000Z"}},"billing":null},"payment_token":null,"shipping":null,"billing":{"address":{"city":"San Fransico","country":"BR","line1":"1467","line2":"Harrison Street","line3":"Harrison Street","zip":"94122","state":"California","first_name":"joseph","last_name":"Doe"},"phone":{"number":"8056594427","country_code":"+91"},"email":"guest@example.com"},"order_details":null,"email":"abc@example.com","name":"John Nether","phone":"6168205362","return_url":"https://google.com/","authentication_type":"no_three_ds","statement_descriptor_name":null,"statement_descriptor_suffix":null,"next_action":{"type":"qr_code_information","image_data_url":"data:image/png;base64,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","display_to_timestamp":1753265472000,"qr_code_url":"https://test.adyen.com/hpp/generateQRCodeImage.shtml?url=TestQRCodeEMVToken","display_text":null,"border_color":null},"cancellation_reason":null,"error_code":null,"error_message":null,"unified_code":null,"unified_message":null,"payment_experience":null,"payment_method_type":"pix","connector_label":null,"business_country":null,"business_label":"default","business_sub_label":null,"allowed_payment_method_types":null,"ephemeral_key":{"customer_id":"cus_6vLys2IeaGT4xVbFj2U9","created_at":1753085573,"expires":1753089173,"secret":"epk_e1db82c9ea524cfba83011c631f34bf9"},"manual_retry_allowed":null,"connector_transaction_id":"DVB7NMC4DVHVLD75","frm_message":null,"metadata":{"udf1":"value1","Force-PSP":"Adyen","login_date":"2019-09-10T10:11:12Z","new_customer":"true"},"connector_metadata":null,"feature_metadata":null,"reference_id":"DVB7NMC4DVHVLD75","payment_link":null,"profile_id":"pro_U1KoDSmwFwzKn649yraI","surcharge_details":null,"attempt_count":1,"merchant_decision":null,"merchant_connector_id":"mca_lBjLVbnnprul6b7CLyQE","incremental_authorization_allowed":null,"authorization_count":null,"incremental_authorizations":null,"external_authentication_details":null,"external_3ds_authentication_attempted":false,"expires_on":"2025-07-21T08:13:53.420Z","fingerprint":null,"browser_info":{"language":"en-US","time_zone":-330,"ip_address":"127.0.0.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","color_depth":32,"java_enabled":true,"screen_width":1728,"accept_header":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","screen_height":1117,"java_script_enabled":true},"payment_method_id":null,"payment_method_status":null,"updated":"2025-07-21T08:12:53.932Z","split_payments":null,"frm_metadata":null,"extended_authorization_applied":null,"capture_before":null,"merchant_order_reference_id":null,"order_tax_amount":null,"connector_mandate_id":null,"card_discovery":null,"force_3ds_challenge":false,"force_3ds_challenge_trigger":false,"issuer_error_code":null,"issuer_error_message":null,"is_iframe_redirection_enabled":null,"whole_connector_response":null}

Things to verify
1. Expiry time in response (display_to_timestamp) - should be same as the one sent in request
2. Social security number must be sent to Adyen

<img width="1223" height="618" alt="Screenshot 2025-07-21 at 1 53 44 PM" src="https://github.com/user-attachments/assets/643fb36c-0b60-44fa-91ff-4702114747f6" />

</details>

<details>
    <summary>2. Create a Pix payment using a expiry date > 5 days in future from now</summary>

cURL

    curl --location --request POST 'http://localhost:8080/payments' \
        --header 'Content-Type: application/json' \
        --header 'Accept: application/json' \
        --header 'api-key: dev_uXENxlgLNNVyGVRpR0D4S1om0k65a6X3nyc5WfAXjwUlVWmBSl3ZPGJHhywazTN6' \
        --data-raw '{"amount":4500,"currency":"BRL","confirm":true,"profile_id":"pro_U1KoDSmwFwzKn649yraI","capture_on":"2022-09-10T10:11:12Z","connector":["adyen"],"customer_id":"cus_6vLys2IeaGT4xVbFj2U9","email":"abc@example.com","return_url":"https://google.com","payment_method":"bank_transfer","payment_method_type":"pix","payment_method_data":{"bank_transfer":{"pix":{"pix_key":"test","cpf":"test","cnpj":"test","expiry_date":"2025-08-23T10:11:12Z"}}},"billing":{"address":{"line1":"1467","line2":"Harrison Street","line3":"Harrison Street","city":"San Fransico","state":"California","zip":"94122","country":"BR","first_name":"joseph","last_name":"Doe"},"phone":{"number":"8056594427","country_code":"+91"},"email":"guest@example.com"},"metadata":{"Force-PSP":"Adyen","udf1":"value1","new_customer":"true","login_date":"2019-09-10T10:11:12Z"},"browser_info":{"user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36","accept_header":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","language":"en-US","color_depth":32,"screen_height":1117,"screen_width":1728,"time_zone":-330,"java_enabled":true,"java_script_enabled":true,"ip_address":"127.0.0.1"},"customer_acceptance":{"acceptance_type":"online","accepted_at":"1963-05-03T04:07:52.723Z","online":{"ip_address":"127.0.0.1","user_agent":"amet irure esse"}},"session_expiry":60}'

Response

    {
        "error": {
            "type": "invalid_request",
            "message": "Invalid value provided: expiry_date cannot be more than 5 days from now",
            "code": "IR_07"
        }
    }

</details>

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

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