Class MulticloudLinkQuote
getSideA() is what getProviderA()
charges, getSideZ() is what getProviderZ() charges. Either side may be
unpriced.
Beta: models products that reached general availability in 2026; see
MulticloudLinkRequest.
Units
Both providers publish flat hourly rates. The rest of the value layer works in
monthly recurring charges, so rate cards convert with the named constant
HOURS_PER_MONTH (730 h = 365 d x 24 h / 12, the figure AWS uses
in its own pricing examples) and state the conversion in the side's
PriceQuote.getNote(). A 31-day month has 744 h, so a real invoice can exceed the
modelled figure by up to 1.9 %.
Unpriced sides
A side with no verifiable price is absent (Optional.empty()), never zero, and
getSideAUnpricedReason() / getSideZUnpricedReason() names what is missing.
A present side with a zero amount is a known price of zero (for example the AWS free tier,
which a card applies only on request).
Combined figure
combinedMonthly() is present only when both sides are priced and share one known
currency. It runs through CurrencyReconciler: sides in different currencies are never
summed and no FX rate is applied. monthlySubtotalsByCurrency() exposes the
per-currency figures for reporting when the combined figure is withheld. A side whose
monthly and one-time charges are both zero does not take part in the currency check, because
zero is the same amount in every currency: a free-tier side quoted in USD combines with a
negotiated side quoted in EUR.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intThe path tier assumed when a request does not state one: 1, local connectivity scope.static final intHours per month used to convert an hourly rate to a monthly recurring charge: 365 x 24 / 12 = 730.static final intThe highest AWS connectivity-scope tier.static final intThe lowest AWS connectivity-scope tier. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionThe ISO 4217 codecombinedMonthly()is expressed in: the currency of the non-zero sides, or of side A when both sides are zero.The link's total monthly recurring charge: side A plus side Z.The link's total one-time charge: side A plus side Z.Fills this quote's unpriced sides from another quote for the same link and returns the result; this instance is unchanged.getSideA()The monthly recurring and one-time charge billed bygetProviderA().getSideZ()The monthly recurring and one-time charge billed bygetProviderZ().booleanWhether both sides are priced.booleanWhether both sides are priced, both carry a non-zero charge, and their known currencies differ.static BigDecimalmonthlyFromHourly(BigDecimal hourly) Converts a flat hourly rate to a monthly recurring charge atHOURS_PER_MONTHhours per month, rounded half-up to two decimal places.The priced sides' monthly charges grouped by currency, for example"USD 9000.90, EUR 12000.00".side(CloudProviderType provider) The side billed by the given provider.A one-sentence description of what is unpriced, naming each empty side's provider and reason.
-
Field Details
-
HOURS_PER_MONTH
public static final int HOURS_PER_MONTHHours per month used to convert an hourly rate to a monthly recurring charge: 365 x 24 / 12 = 730.- See Also:
-
DEFAULT_PATH_TIER
public static final int DEFAULT_PATH_TIERThe path tier assumed when a request does not state one: 1, local connectivity scope.- See Also:
-
MIN_PATH_TIER
public static final int MIN_PATH_TIERThe lowest AWS connectivity-scope tier.- See Also:
-
MAX_PATH_TIER
public static final int MAX_PATH_TIERThe highest AWS connectivity-scope tier.- See Also:
-
-
Constructor Details
-
MulticloudLinkQuote
public MulticloudLinkQuote()
-
-
Method Details
-
getSideA
The monthly recurring and one-time charge billed bygetProviderA().- Returns:
- the side's quote, or empty when it could not be priced
-
getSideZ
The monthly recurring and one-time charge billed bygetProviderZ().- Returns:
- the side's quote, or empty when it could not be priced
-
side
The side billed by the given provider.- Parameters:
provider- one of the link's two providers- Returns:
- that provider's side; empty when the provider is not an end of this link or its side is unpriced
-
isFullyPriced
public boolean isFullyPriced()Whether both sides are priced. A fully priced quote can still have nocombinedMonthly()when the two sides are in different currencies.- Returns:
truewhen neither side is empty
-
combinedMonthly
The link's total monthly recurring charge: side A plus side Z.- Returns:
- the sum, or empty when a side is unpriced, a side has no currency, or the two sides are in different currencies
-
combinedSetup
The link's total one-time charge: side A plus side Z.- Returns:
- the sum, or empty under the same conditions as
combinedMonthly()
-
combinedCurrency
The ISO 4217 codecombinedMonthly()is expressed in: the currency of the non-zero sides, or of side A when both sides are zero.- Returns:
- the currency code, or empty whenever
combinedMonthly()is empty
-
isMixedCurrency
public boolean isMixedCurrency()Whether both sides are priced, both carry a non-zero charge, and their known currencies differ.- Returns:
truewhen a combined figure is withheld because of a currency mismatch
-
monthlySubtotalsByCurrency
The priced sides' monthly charges grouped by currency, for example"USD 9000.90, EUR 12000.00". Intended for the message that explains a withheld combined figure.- Returns:
- the per-currency subtotals, or an empty string when neither side is priced
-
unpricedSummary
-
fillUnpricedSidesFrom
Fills this quote's unpriced sides from another quote for the same link and returns the result; this instance is unchanged. A side already priced here is kept, so when quotes are merged in rate-card precedence order the earliest card that prices a side wins. Sides are matched by provider, soothermay list the two providers in either order. Notes are concatenated without duplicates. A side neither quote prices keeps both reasons.- Parameters:
other- a quote for the same provider pair;nullreturns this quote- Returns:
- the merged quote
- Throws:
IllegalArgumentException- ifotheris for a different provider pair
-
monthlyFromHourly
Converts a flat hourly rate to a monthly recurring charge atHOURS_PER_MONTHhours per month, rounded half-up to two decimal places.- Parameters:
hourly- the hourly rate; must not benullor negative- Returns:
hourly x 730- Throws:
IllegalArgumentException- ifhourlyisnullor negative
-