From 7eb3228c1faa974c03d94348b9cc1121a00abcd9 Mon Sep 17 00:00:00 2001 From: SandipBajracharya Date: Tue, 22 Jul 2025 16:29:26 +0545 Subject: [PATCH] fix(OUT-2052): Amount-related issues - [X] Mapped product price fix - [X] Invoice payment sync with tax amount issue fix - [X] Correct log amount for invoice paid --- .../api/quickbooks/invoice/invoice.service.ts | 20 +++++++++---------- .../sections/product/ProductMappingTable.tsx | 2 +- src/hook/useQuickbooks.ts | 4 ++-- src/utils/intuitAPI.ts | 2 +- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/app/api/quickbooks/invoice/invoice.service.ts b/src/app/api/quickbooks/invoice/invoice.service.ts index 28abee6b..6d9a43e6 100644 --- a/src/app/api/quickbooks/invoice/invoice.service.ts +++ b/src/app/api/quickbooks/invoice/invoice.service.ts @@ -451,6 +451,7 @@ export class InvoiceService extends BaseService { await this.createQBInvoice(invoicePayload) // update/ create the record in sync log table + const totalWithTax = actualTotalAmount + totalTax await this.logSync( invoiceResource.id, { @@ -459,7 +460,7 @@ export class InvoiceService extends BaseService { }, EventType.CREATED, { - amount: (actualTotalAmount * 100).toFixed(2), // convert to cents for logs + amount: (totalWithTax * 100).toFixed(2), taxAmount: (totalTax * 100).toFixed(2), // convert to cents for logs customerName: recipientInfo.displayName, customerEmail: recipientInfo.email, @@ -473,13 +474,13 @@ export class InvoiceService extends BaseService { if (invoiceResource.status === InvoiceStatus.PAID) { const paymentService = new PaymentService(this.user) const qbPaymentPayload = { - TotalAmt: actualTotalAmount, + TotalAmt: totalWithTax, CustomerRef: { value: customerRefValue, }, Line: [ { - Amount: actualTotalAmount, + Amount: totalWithTax, LinkedTxn: [ { TxnId: invoiceRes.Invoice.Id, @@ -638,15 +639,11 @@ export class InvoiceService extends BaseService { ) } - const syncLog = await this.syncLogService.getOneByCopilotIdAndEventType( - payload.data.id, - EventType.VOIDED, - ) - - if (syncLog?.status === LogStatus.SUCCESS) { - console.info( - 'WebhookService#webhookInvoiceVoided | Invoice already voided', + if (invoiceSync.status !== InvoiceStatus.OPEN) { + console.error( + 'WebhookService#handleInvoiceVoided | Invoices void was requested for non-open record', ) + return // return early if invoice is not open } // get invoice sync log @@ -726,6 +723,7 @@ export class InvoiceService extends BaseService { console.error( 'WebhookService#handleInvoiceDeleted | Invoices delete was requested for non-voided record', ) + return // return early if invoice is not voided } // get invoice sync log diff --git a/src/components/dashboard/settings/sections/product/ProductMappingTable.tsx b/src/components/dashboard/settings/sections/product/ProductMappingTable.tsx index 745b9c81..5f802293 100644 --- a/src/components/dashboard/settings/sections/product/ProductMappingTable.tsx +++ b/src/components/dashboard/settings/sections/product/ProductMappingTable.tsx @@ -30,7 +30,7 @@ const MapItemComponent = ({ currency: 'USD', }).format( currentlyMapped.unitPrice - ? parseFloat(currentlyMapped.unitPrice) + ? parseFloat(currentlyMapped.unitPrice) / 100 : 0, )} diff --git a/src/hook/useQuickbooks.ts b/src/hook/useQuickbooks.ts index 1f9c317e..6ce1f97b 100644 --- a/src/hook/useQuickbooks.ts +++ b/src/hook/useQuickbooks.ts @@ -16,7 +16,7 @@ export const useQuickbooks = ( ) => { const [loading, setLoading] = useState(false) const [isReconnecting, setIsReconnecting] = useState(reconnect) - const { setAppParams } = useApp() + const { setAppParams, portalConnectionStatus } = useApp() useEffect(() => { const supabase = SupabaseClient.getInstance() @@ -128,7 +128,7 @@ export const useQuickbooks = ( // set time-out in case if user closes the popped up window. This will prevent the app from the infinite "connecting" state const timeout = setTimeout(() => { - if (!hasConnection) { + if (!portalConnectionStatus) { setLoading(false) } }, 120000) // timeout after 2 minutes diff --git a/src/utils/intuitAPI.ts b/src/utils/intuitAPI.ts index e5e5e7b7..4aed9968 100644 --- a/src/utils/intuitAPI.ts +++ b/src/utils/intuitAPI.ts @@ -412,7 +412,7 @@ export default class IntuitAPI { async _voidInvoice(payload: QBDestructiveInvoicePayloadSchema) { console.info( - `IntuitAPI#voidInvoice | invoice void creation start for realmId: ${this.tokens.intuitRealmId}. Payload: `, + `IntuitAPI#voidInvoice | invoice void start for realmId: ${this.tokens.intuitRealmId}. Payload: `, payload, ) const url = `${intuitBaseUrl}/v3/company/${this.tokens.intuitRealmId}/invoice?operation=void&minorversion=${intuitApiMinorVersion}`