import { Base } from './base'; import { MembershipInvoiceResponse, MembershipSingleInvoiceResponse } from './types/invoice'; export enum InvoiceStatus { Posted = 'Posted', Draft = 'Draft', Cancelled = 'Cancelled' } export enum BalanceType { Outstanding = 'Outstanding', Paid='Paid', NonZero='NonZero', Refunded='Refunded', Negative='Negative' } export class Invoice extends Base { private membershipApi = this.config.get('membershipApi'); private invoiceApiKey = this.config.get('invoiceApiKey'); /** * This function is the public method for retrieving the list of invoices for a given subscription number. * @param number Required. subscription number. * @param sessionToken Required. user's session FT secure session token. * @param status Optional. Status of the invoices requested - can be 'Posted', 'Draft' or 'Cancelled'. * @returns list of invoices */ public async getInvoicesBySubscriptionNumber(number: string, sessionToken: string, status?: string): Promise { const url = `${this.membershipApi}/invoice/invoices?subscriptionNumber=${number}${status ? `&invoiceStatus=${status}` : ''}`; const additionalHeaders = { 'FTSession-s': `${sessionToken}` }; return await this.requestGet({ url, key: this.invoiceApiKey, additionalHeaders, targetApiSystemCode: 'invoice-svc' }); } /** * This function is the public method for retrieving the list of invoices for a given subscription number. * @param number Required. subscription number. * @param sessionToken Required. user's session FT secure session token. * @param balance optional for now - the balance to look up for in membership for the customer e.g outstanding from the balanceType enum * @returns list of invoices */ public async getInvoicesByBalance(number: string, sessionToken: string, balance:BalanceType): Promise { const url = `${this.membershipApi}/invoice/invoices?subscriptionNumber=${number}&balance=${balance}`; const additionalHeaders = { 'FTSession-s': `${sessionToken}` }; return await this.requestGet({ url, key: this.invoiceApiKey, additionalHeaders, targetApiSystemCode: 'invoice-svc' }); } /** * This function is the public method for retrieving an invoice based on the invoice id given. * @param invoiceId Required. id of the requested invoice * @param sessionToken Required. user's session FT secure session token. * @returns invoice */ public async getInvoiceById(invoiceId: string, sessionToken: string): Promise { const url = `${this.membershipApi}/invoice/invoices/${invoiceId}`; const additionalHeaders = { 'FTSession-s': `${sessionToken}`, 'Accept': 'application/json', }; return await this.requestGet({ url, key: this.invoiceApiKey, additionalHeaders, targetApiSystemCode: 'invoice-svc' }); } /** * Get the binary invoice file for the given invoice id * @param invoiceId Required. id of the requested invoice * @param sessionToken Required. user's session FT secure session token */ public async download(invoiceId: string, sessionToken: string) { const url = `${this.membershipApi}/invoice/invoices/download/${invoiceId}`; const additionalHeaders = { 'FTSession-s': `${sessionToken}`, 'Accept': 'application/pdf', }; return await this.requestGet({ url, key: this.invoiceApiKey, additionalHeaders, targetApiSystemCode: 'invoice-svc' }); } }