Files
cfw-autumn/server/src/internal/customers/attach/attachFunctions/upgradeSameIntFlow/updateSubsSameInt.ts
2025-08-14 15:54:18 -07:00

95 lines
2.4 KiB
TypeScript

import { getStripeSubs } from "@/external/stripe/stripeSubUtils.js";
import { getStripeSubItems } from "@/external/stripe/stripeSubUtils/getStripeSubItems.js";
import { subToAutumnInterval } from "@/external/stripe/utils.js";
import { AttachParams } from "@/internal/customers/cusProducts/AttachParams.js";
import { ExtendedRequest } from "@/utils/models/Request.js";
import {
AttachConfig,
FullCusProduct,
intervalsSame,
Replaceable,
} from "@autumn/shared";
import { addSubItemsToRemove } from "../attachFuncUtils.js";
import { updateStripeSub } from "../../attachUtils/updateStripeSub/updateStripeSub.js";
import { insertInvoiceFromAttach } from "@/internal/invoices/invoiceUtils.js";
import Stripe from "stripe";
import { getContUseInvoiceItems } from "../../attachUtils/getContUseItems/getContUseInvoiceItems.js";
export const updateSubsByInt = async ({
req,
curCusProduct,
attachParams,
config,
stripeSubs,
}: {
req: ExtendedRequest;
curCusProduct: FullCusProduct;
attachParams: AttachParams;
config: AttachConfig;
stripeSubs: Stripe.Subscription[];
}) => {
const { db, logtail: logger } = req;
let { replaceables, newItems } = await getContUseInvoiceItems({
attachParams,
cusProduct: curCusProduct!,
stripeSubs,
logger,
});
attachParams.replaceables = replaceables;
const itemSets = await getStripeSubItems({ attachParams });
const invoices: Stripe.Invoice[] = [];
for (const sub of stripeSubs) {
let subInterval = subToAutumnInterval(sub);
let itemSet = itemSets.find((itemSet) => {
return intervalsSame({
intervalA: itemSet,
intervalB: subInterval,
});
})!;
await addSubItemsToRemove({
sub,
cusProduct: curCusProduct,
itemSet,
});
const { latestInvoice } = await updateStripeSub({
db,
attachParams,
config,
stripeSubs: [sub],
itemSet,
logger,
interval: itemSet.interval,
intervalCount: itemSet.intervalCount,
});
if (latestInvoice) {
invoices.push(latestInvoice);
}
logger.info(
`Updated sub ${sub.id}, interval ${itemSet.interval}, intervalCount ${itemSet.intervalCount}`
);
}
const batchInvUpdate = [];
for (const invoice of invoices) {
batchInvUpdate.push(
insertInvoiceFromAttach({
db,
attachParams,
stripeInvoice: invoice,
logger,
})
);
}
return { replaceables, invoices };
};