Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(router): add support for cost based debit routing #7542

Open
wants to merge 10 commits into
base: debit-routing/db-interface
Choose a base branch
from

Conversation

ShankarSinghC
Copy link
Contributor

@ShankarSinghC ShankarSinghC commented Mar 18, 2025

Type of Change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring
  • Dependency updates
  • Documentation
  • CI/CD

Description

This pull request introduces a new configuration for debit routing, including fees for fraud checks, network processing, and interchange. It also adds methods to calculate these fees and integrates them into the existing system.

For every payment that occurs, there are three fees associated with the network:

  1. Network Fee
    Every network has its own network fee structure, which typically includes both a percentage (% of the amount) and a fixed fee. For each payment, the respective network will charge a specific percentage and a fixed amount.

  2. Interchange Fee
    If the bank is a regulated bank, it can charge only a specified percentage and fixed amount for the transaction. If the bank is not a regulated bank, then, similar to the network fee, the bank can charge different amounts depending on the network.

  3. Fraud Check Fee
    When a bank is regulated under an exemption for fraud checks, it may charge an additional fee only if a fraud check is conducted.

When a payment is being performed all this factors should be taken in consideration and a network should be chosen according to merchant's configuration

Additional Changes

  • This PR modifies the API contract
  • This PR modifies the database schema
  • This PR modifies application configuration/environment variables

Motivation and Context

How did you test it?

Checklist

  • 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

@ShankarSinghC ShankarSinghC added A-core Area: Core flows M-configuration-changes Metadata: This PR involves configuration changes A-routing Area: Routing labels Mar 18, 2025
@ShankarSinghC ShankarSinghC self-assigned this Mar 18, 2025
@ShankarSinghC ShankarSinghC requested review from a team as code owners March 18, 2025 05:47
Copy link

semanticdiff-com bot commented Mar 18, 2025

Review changes with  SemanticDiff

Changed Files
File Status
  crates/router/src/core/co_badged_cards_info.rs  1% smaller
  config/development.toml Unsupported file format
  crates/router/src/configs/secrets_transformers.rs  0% smaller
  crates/router/src/configs/settings.rs  0% smaller

@ShankarSinghC ShankarSinghC changed the title feat(router): add support for cost based dynamic routing feat(router): add support for cost based debit routing Mar 18, 2025
@ShankarSinghC ShankarSinghC added the C-feature Category: Feature request or enhancement label Mar 18, 2025
@ShankarSinghC ShankarSinghC linked an issue Mar 18, 2025 that may be closed by this pull request
Comment on lines 903 to 904
[debit_routing_config]
fraud_check_fee = "0.01"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible to have these values as numbers in the config? With strings, there's a chance of a non-numeric value sneaking in somewhere.

Suggested change
[debit_routing_config]
fraud_check_fee = "0.01"
[debit_routing_config]
fraud_check_fee = 0.01

Comment on lines 158 to 160
pub struct NoneRegulatedNetworkProcessingData {
pub merchant_category_code_0001: HashMap<enums::CardNetwork, NetworkProcessingData>,
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How many category codes can there be? If it's more than 20, we should consider making this a HashMap instead.

.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Failed to convert fixed amount to f64 in interchange fee calculation")?;

let mut total_interchange_fee = (amount * percentage / 100.0) + fixed_amount;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better to use .checked_mul() and .checked_div() to account for edge cases.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-core Area: Core flows A-routing Area: Routing C-feature Category: Feature request or enhancement M-configuration-changes Metadata: This PR involves configuration changes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

add support for cost based debit routing
2 participants