Skip to content

Commit d3b4057

Browse files
fix(OUT-2880): remove global variable in class and pass as arguments
1 parent 95480b3 commit d3b4057

1 file changed

Lines changed: 56 additions & 33 deletions

File tree

src/app/api/quickbooks/invoice/invoice.service.ts

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ type InvoiceItemRefAndDescriptionType = {
6666
export class InvoiceService extends BaseService {
6767
private copilot: CopilotAPI
6868
private syncLogService: SyncLogService
69-
private intuitApiService!: IntuitAPI
70-
private oneOffItem!: OneOffItemType
71-
private incomeAccountRef!: string
7269

7370
constructor(user: User) {
7471
super(user)
@@ -185,6 +182,8 @@ export class InvoiceService extends BaseService {
185182
productId: string,
186183
priceId: string,
187184
intuitApi: IntuitAPI,
185+
oneOffItem: OneOffItemType,
186+
incomeAccRef: string,
188187
): Promise<InvoiceItemRefAndDescriptionType> {
189188
const productService = new ProductService(this.user)
190189
const mapping = await productService.ensureProductExistsAndSyncToken(
@@ -196,7 +195,7 @@ export class InvoiceService extends BaseService {
196195
if (mapping.isExcluded) {
197196
// if excluded, do not include in invoice and send as one-off item
198197
console.info('InvoiceService#getInvoiceItemRef | Product is excluded')
199-
return { ref: this.oneOffItem }
198+
return { ref: oneOffItem }
200199
}
201200
if (mapping.qbItemId) {
202201
console.info('InvoiceService#getInvoiceItemRef | Product map found')
@@ -213,7 +212,7 @@ export class InvoiceService extends BaseService {
213212
undefined,
214213
mapping.qbItemId,
215214
)
216-
if (!intuitItem) return { ref: this.oneOffItem } // if item is not present in Intuit, return one-off item
215+
if (!intuitItem) return { ref: oneOffItem } // if item is not present in Intuit, return one-off item
217216

218217
return {
219218
ref: { value: mapping.qbItemId },
@@ -235,7 +234,7 @@ export class InvoiceService extends BaseService {
235234
console.info(
236235
'InvoiceService#getInvoiceItemRef | Create new product flag is false',
237236
)
238-
return { ref: this.oneOffItem }
237+
return { ref: oneOffItem }
239238
}
240239

241240
// 2. create a new product in QB company
@@ -252,7 +251,7 @@ export class InvoiceService extends BaseService {
252251
}
253252

254253
const productDescription = convert(productInfo.description)
255-
const incomeAccRefVal = this.incomeAccountRef
254+
const incomeAccRefVal = incomeAccRef
256255

257256
// total products with the same product id
258257
const itemsCount = await productService.getProductCount(
@@ -333,11 +332,13 @@ export class InvoiceService extends BaseService {
333332
private async prepareLineItemPayload(
334333
lineItem: InvoiceLineItemSchemaType,
335334
intuitApi: IntuitAPI,
335+
oneOffItem: OneOffItemType,
336+
incomeAccRef: string,
336337
) {
337338
const actualAmount = lineItem.amount / 100 // Convert to dollar. amount received in cents.
338339

339340
let itemRef: InvoiceItemRefAndDescriptionType = {
340-
ref: this.oneOffItem,
341+
ref: oneOffItem,
341342
productDescription: lineItem.description,
342343
}
343344

@@ -346,6 +347,8 @@ export class InvoiceService extends BaseService {
346347
lineItem.productId,
347348
lineItem.priceId,
348349
intuitApi,
350+
oneOffItem,
351+
incomeAccRef,
349352
)
350353
}
351354
return {
@@ -371,8 +374,10 @@ export class InvoiceService extends BaseService {
371374
}
372375
}
373376

374-
async manageClientFeeRef(): Promise<string> {
375-
const intuitService = this.intuitApiService
377+
async manageClientFeeRef(
378+
intuitService: IntuitAPI,
379+
incomeAccRefVal: string,
380+
): Promise<string> {
376381
const productName = 'Assembly Fees paid by Client'
377382
const tokenService = new TokenService(this.user)
378383

@@ -389,7 +394,7 @@ export class InvoiceService extends BaseService {
389394
{
390395
productName,
391396
unitPrice: 0,
392-
incomeAccRefVal: this.incomeAccountRef,
397+
incomeAccRefVal,
393398
},
394399
intuitService,
395400
false, // flag that this item is non-taxable
@@ -412,8 +417,10 @@ export class InvoiceService extends BaseService {
412417
return clientFeeRef
413418
}
414419

415-
async manageServiceItemRef(): Promise<string> {
416-
const intuitService = this.intuitApiService
420+
async manageServiceItemRef(
421+
intuitService: IntuitAPI,
422+
incomeAccRefVal: string,
423+
): Promise<string> {
417424
const productName = 'Services'
418425
const tokenService = new TokenService(this.user)
419426

@@ -430,7 +437,7 @@ export class InvoiceService extends BaseService {
430437
{
431438
productName,
432439
unitPrice: 0,
433-
incomeAccRefVal: this.incomeAccountRef,
440+
incomeAccRefVal,
434441
},
435442
intuitService,
436443
)
@@ -455,6 +462,7 @@ export class InvoiceService extends BaseService {
455462
async handleFeePaidByClient(
456463
invoiceResource: InvoiceCreatedResponseType,
457464
intuitAPI: IntuitAPI,
465+
incomeAccRef: string,
458466
): Promise<QBInvoiceLineItemSchemaType | undefined> {
459467
const invoice = invoiceResource.data
460468
// check invoice fee is paid by client
@@ -474,7 +482,8 @@ export class InvoiceService extends BaseService {
474482
intuitApi: intuitAPI,
475483
updateMappingTable: false,
476484
})
477-
} else clientFeeRef = await this.manageClientFeeRef() // manage client fee ref (create new item in QB and store it into our DB)
485+
} else
486+
clientFeeRef = await this.manageClientFeeRef(intuitAPI, incomeAccRef) // manage client fee ref (create new item in QB and store it into our DB)
478487

479488
// get payment via invoice id
480489
const payments = await this.copilot.getPayments(invoice.id)
@@ -499,7 +508,7 @@ export class InvoiceService extends BaseService {
499508
}
500509
}
501510

502-
async handleServiceItem(intuitAPI: IntuitAPI) {
511+
async handleServiceItem(intuitAPI: IntuitAPI, incomeAccRef: string) {
503512
let serviceItemRef = this.user.qbConnection?.serviceItemRef
504513
let serviceItem: ProductSyncTokenResponse | undefined
505514
if (serviceItemRef) {
@@ -512,9 +521,9 @@ export class InvoiceService extends BaseService {
512521
}
513522

514523
if (!serviceItemRef || !serviceItem?.id) {
515-
serviceItemRef = await this.manageServiceItemRef()
524+
serviceItemRef = await this.manageServiceItemRef(intuitAPI, incomeAccRef)
516525
}
517-
this.oneOffItem = { value: serviceItemRef }
526+
return { value: serviceItemRef }
518527
}
519528

520529
/**
@@ -541,8 +550,11 @@ export class InvoiceService extends BaseService {
541550
return
542551
}
543552

544-
this.intuitApiService = new IntuitAPI(qbTokenInfo)
545-
await this.handleIncomeAccountRef(qbTokenInfo)
553+
const intuitApiService = new IntuitAPI(qbTokenInfo)
554+
const incomeAccRef = await this.handleIncomeAccountRef(
555+
qbTokenInfo,
556+
intuitApiService,
557+
)
546558

547559
const customerService = new CustomerService(this.user)
548560
// 1. get client (retrieve receipentId from invoice resource). Copilot: Retrieve client. If not found, retrieve company and get first client from the company
@@ -556,14 +568,14 @@ export class InvoiceService extends BaseService {
556568
const existingCustomer =
557569
await customerService.ensureCustomerExistsAndSyncToken(
558570
recipientInfo.clientCompanyId,
559-
this.intuitApiService,
571+
intuitApiService,
560572
)
561573

562574
let customer,
563575
existingCustomerMapId = existingCustomer?.id
564576
if (!existingCustomer) {
565577
// 2.1. search client in qb using client's given name and family name
566-
customer = await this.intuitApiService.getACustomer(
578+
customer = await intuitApiService.getACustomer(
567579
replaceSpecialCharsForQB(recipientInfo.displayName),
568580
undefined,
569581
true,
@@ -593,7 +605,7 @@ export class InvoiceService extends BaseService {
593605
}
594606

595607
const customerRes =
596-
await this.intuitApiService.createCustomer(customerPayload)
608+
await intuitApiService.createCustomer(customerPayload)
597609
customer = customerRes.Customer
598610

599611
console.info(
@@ -662,7 +674,7 @@ export class InvoiceService extends BaseService {
662674
sparse: true as const,
663675
}
664676

665-
const customerRes = await this.intuitApiService.customerSparseUpdate(
677+
const customerRes = await intuitApiService.customerSparseUpdate(
666678
customerSparsePayload,
667679
)
668680
customer = customerRes.Customer
@@ -687,14 +699,22 @@ export class InvoiceService extends BaseService {
687699

688700
// Check if service item ref ID is present in our DB. If not create new
689701
// in QB and store the id in our DB
690-
await this.handleServiceItem(this.intuitApiService)
702+
const oneOffItem = await this.handleServiceItem(
703+
intuitApiService,
704+
incomeAccRef,
705+
)
691706

692707
// bottleneck implementation (rate limiting)
693708
const lineItemPromises = []
694709
for (const lineItem of invoiceResource.lineItems) {
695710
lineItemPromises.push(
696711
bottleneck.schedule(() => {
697-
return this.prepareLineItemPayload(lineItem, this.intuitApiService)
712+
return this.prepareLineItemPayload(
713+
lineItem,
714+
intuitApiService,
715+
oneOffItem,
716+
incomeAccRef,
717+
)
698718
}),
699719
)
700720
}
@@ -715,7 +735,8 @@ export class InvoiceService extends BaseService {
715735
if (invoiceResource.status === InvoiceStatus.PAID) {
716736
const clientFeeLineItem = await this.handleFeePaidByClient(
717737
payload,
718-
this.intuitApiService,
738+
intuitApiService,
739+
incomeAccRef,
719740
)
720741
if (clientFeeLineItem) {
721742
lineItems.push(clientFeeLineItem)
@@ -748,8 +769,7 @@ export class InvoiceService extends BaseService {
748769
}
749770

750771
// 6. create invoice in QB
751-
const invoiceRes =
752-
await this.intuitApiService.createInvoice(qbInvoicePayload)
772+
const invoiceRes = await intuitApiService.createInvoice(qbInvoicePayload)
753773

754774
const invoicePayload = {
755775
portalId: this.user.workspaceId,
@@ -803,7 +823,7 @@ export class InvoiceService extends BaseService {
803823
],
804824
}
805825
await paymentService.createPaymentAndSync(
806-
this.intuitApiService,
826+
intuitApiService,
807827
qbPaymentPayload,
808828
{
809829
invoiceNumber: invoiceResource.number,
@@ -1133,14 +1153,17 @@ export class InvoiceService extends BaseService {
11331153
})
11341154
}
11351155

1136-
private async handleIncomeAccountRef(qbTokenInfo: IntuitAPITokensType) {
1156+
private async handleIncomeAccountRef(
1157+
qbTokenInfo: IntuitAPITokensType,
1158+
intuitApiService: IntuitAPI,
1159+
) {
11371160
const tokenService = new TokenService(this.user)
11381161
const incomeAccountRef = await tokenService.checkAndUpdateAccountStatus(
11391162
AccountTypeObj.Income,
11401163
qbTokenInfo.intuitRealmId,
1141-
this.intuitApiService,
1164+
intuitApiService,
11421165
qbTokenInfo.incomeAccountRef,
11431166
)
1144-
this.incomeAccountRef = z.string().parse(incomeAccountRef)
1167+
return z.string().parse(incomeAccountRef)
11451168
}
11461169
}

0 commit comments

Comments
 (0)