diff --git a/packages/backend/src/graphql/queries/get-billing-and-usage.ee.ts b/packages/backend/src/graphql/queries/get-billing-and-usage.ee.ts index cb4f7f71..81ace599 100644 --- a/packages/backend/src/graphql/queries/get-billing-and-usage.ee.ts +++ b/packages/backend/src/graphql/queries/get-billing-and-usage.ee.ts @@ -59,7 +59,7 @@ const getBillingAndUsage = async ( .andWhere( 'created_at', '>=', - DateTime.now().minus({ days: 30 }).toFormat('D') + DateTime.now().minus({ days: 30 }).toISODate() ) .count() .first(); diff --git a/packages/backend/src/graphql/queries/get-invoices.ee.ts b/packages/backend/src/graphql/queries/get-invoices.ee.ts new file mode 100644 index 00000000..527eed08 --- /dev/null +++ b/packages/backend/src/graphql/queries/get-invoices.ee.ts @@ -0,0 +1,17 @@ +import Context from '../../types/express/context'; +import Billing from '../../helpers/billing/index.ee'; + +const getInvoices = async ( + _parent: unknown, + _params: unknown, + context: Context +) => { + const subscription = await context.currentUser.$relatedQuery('subscription'); + const invoices = await Billing.paddleClient.getInvoices( + Number(subscription.paddleSubscriptionId) + ); + + return invoices; +}; + +export default getInvoices; diff --git a/packages/backend/src/graphql/query-resolvers.ts b/packages/backend/src/graphql/query-resolvers.ts index 6facb01f..b7263799 100644 --- a/packages/backend/src/graphql/query-resolvers.ts +++ b/packages/backend/src/graphql/query-resolvers.ts @@ -15,6 +15,7 @@ import getUsageData from './queries/get-usage-data.ee'; import getPaymentPlans from './queries/get-payment-plans.ee'; import getPaddleInfo from './queries/get-paddle-info.ee'; import getBillingAndUsage from './queries/get-billing-and-usage.ee'; +import getInvoices from './queries/get-invoices.ee'; import getAutomatischInfo from './queries/get-automatisch-info'; import healthcheck from './queries/healthcheck'; @@ -36,6 +37,7 @@ const queryResolvers = { getPaymentPlans, getPaddleInfo, getBillingAndUsage, + getInvoices, getAutomatischInfo, healthcheck, }; diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 02443725..41d8cb1e 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -38,6 +38,7 @@ type Query { getPaymentPlans: [PaymentPlan] getPaddleInfo: GetPaddleInfo getBillingAndUsage: GetBillingAndUsage + getInvoices: [Invoice] getAutomatischInfo: GetAutomatischInfo healthcheck: AppHealth } @@ -504,6 +505,14 @@ type GetPaddleInfo { vendorId: Int } +type Invoice { + id: Int + amount: Float + currency: String + payout_date: String + receipt_url: String +} + type PaymentPlan { name: String limit: String diff --git a/packages/backend/src/helpers/billing/paddle.ee.ts b/packages/backend/src/helpers/billing/paddle.ee.ts index 671370d2..40594016 100644 --- a/packages/backend/src/helpers/billing/paddle.ee.ts +++ b/packages/backend/src/helpers/billing/paddle.ee.ts @@ -1,5 +1,6 @@ import axios from 'axios'; import appConfig from '../../config/app'; +import { DateTime } from 'luxon'; const PADDLE_VENDOR_URL = appConfig.isDev ? 'https://sandbox-vendors.paddle.com' @@ -22,8 +23,29 @@ const getSubscription = async (subscriptionId: number) => { return subscription; }; +const getInvoices = async (subscriptionId: number) => { + const data = { + vendor_id: appConfig.paddleVendorId, + vendor_auth_code: appConfig.paddleVendorAuthCode, + subscription_id: subscriptionId, + is_paid: 1, + from: DateTime.now().minus({ years: 3 }).toISODate(), + to: DateTime.now().plus({ days: 3 }).toISODate(), + }; + + const response = await axiosInstance.post( + '/api/2.0/subscription/payments', + data + ); + + const invoices = response.data.response; + + return invoices; +}; + const paddleClient = { getSubscription, + getInvoices, }; export default paddleClient; diff --git a/packages/backend/src/models/user.ts b/packages/backend/src/models/user.ts index caa55c48..3815e693 100644 --- a/packages/backend/src/models/user.ts +++ b/packages/backend/src/models/user.ts @@ -148,7 +148,7 @@ class User extends Base { } async startTrialPeriod() { - this.trialExpiryDate = DateTime.now().plus({ days: 30 }).toFormat('D'); + this.trialExpiryDate = DateTime.now().plus({ days: 30 }).toISODate(); } async $beforeInsert(queryContext: QueryContext) {