@@ -66,9 +66,6 @@ type InvoiceItemRefAndDescriptionType = {
6666export 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