Files
cfw-autumn/server/src/internal/billing/v2/subscriptionUpdate/compute/computeSubscriptionUpdateCustomPlan/computeSubscriptionUpdateCustomPlanInvoiceAction.ts
John Yeo 7ee92f4e88 wip
2025-12-22 10:45:49 +00:00

61 lines
1.9 KiB
TypeScript

import {
type FullCusProduct,
type SubscriptionUpdateV0Params,
secondsToMs,
} from "@autumn/shared";
import type { AutumnContext } from "@server/honoUtils/HonoEnv";
import { buildAutumnLineItems } from "../../../compute/computeAutumnUtils/buildAutumnLineItems";
import type { UpdateSubscriptionContext } from "../../fetch/updateSubscriptionContextSchema";
import { computeSubscriptionUpdateCustomPlanInvoiceRequired } from "./computeSubscriptionUpdateICustomPlanInvoiceRequired";
/**
* Computes the invoice action for a custom subscription update.
*
* Determines what invoice operations (create, prorate, void, etc.) are needed
* when a subscription is updated with custom item configurations.
*
* @param ctx - The Autumn request context
* @param updateSubscriptionContext - Context containing customer product and subscription details
* @param params - The subscription update parameters from the API request
* @returns The computed invoice action to be executed
*/
export const computeSubscriptionUpdateCustomPlanInvoiceAction = ({
ctx,
updateSubscriptionContext,
params,
newFullCustomerProduct,
}: {
ctx: AutumnContext;
updateSubscriptionContext: UpdateSubscriptionContext;
params: SubscriptionUpdateV0Params;
newFullCustomerProduct: FullCusProduct;
}) => {
// 1. Early return and don't create an invoice
const invoiceRequired = computeSubscriptionUpdateCustomPlanInvoiceRequired({
ctx,
updateSubscriptionContext,
params,
});
if (!invoiceRequired) return undefined;
const { customerProduct, stripeSubscription, testClockFrozenTime } =
updateSubscriptionContext;
// 2. Calculate line items
const lineItems = buildAutumnLineItems({
ctx,
newCusProducts: [newFullCustomerProduct],
ongoingCustomerProduct: customerProduct,
billingCycleAnchor: secondsToMs(stripeSubscription?.billing_cycle_anchor),
testClockFrozenTime,
});
// 3.
console.log("New line items", lineItems);
return {};
};