fix(QuickBooks Online Node): Add qty to quickbooks invoice line details (#13602)

This commit is contained in:
Shireen Missi 2025-03-03 12:58:27 +00:00 committed by GitHub
parent bd87728215
commit 7c4e2f014c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 87 additions and 0 deletions

View file

@ -329,9 +329,14 @@ export function processLines(this: IExecuteFunctions, lines: IDataObject[], reso
TaxCodeRef: { TaxCodeRef: {
value: line.TaxCodeRef, value: line.TaxCodeRef,
}, },
Qty: line.Qty,
}; };
if (line.Qty === undefined) {
delete (line.SalesItemLineDetail as IDataObject).Qty;
}
delete line.itemId; delete line.itemId;
delete line.TaxCodeRef; delete line.TaxCodeRef;
delete line.Qty;
} }
} }
}); });

View file

@ -0,0 +1,75 @@
import type { IExecuteFunctions } from 'n8n-workflow';
import { processLines } from '../GenericFunctions';
describe('processLines', () => {
const mockExecuteFunctions: Partial<IExecuteFunctions> = {
getNodeParameter: jest.fn(),
};
test('should process AccountBasedExpenseLineDetail for bill resource', () => {
const lines = [{ DetailType: 'AccountBasedExpenseLineDetail', accountId: '123' }];
const result = processLines.call(mockExecuteFunctions as IExecuteFunctions, lines, 'bill');
expect(result).toEqual([
{
DetailType: 'AccountBasedExpenseLineDetail',
AccountBasedExpenseLineDetail: { AccountRef: { value: '123' } },
},
]);
});
test('should process ItemBasedExpenseLineDetail for bill resource', () => {
const lines = [{ DetailType: 'ItemBasedExpenseLineDetail', itemId: '456' }];
const result = processLines.call(mockExecuteFunctions as IExecuteFunctions, lines, 'bill');
expect(result).toEqual([
{
DetailType: 'ItemBasedExpenseLineDetail',
ItemBasedExpenseLineDetail: { ItemRef: { value: '456' } },
},
]);
});
test('should process SalesItemLineDetail for estimate resource', () => {
const lines = [{ DetailType: 'SalesItemLineDetail', itemId: '789', TaxCodeRef: 'TAX1' }];
const result = processLines.call(mockExecuteFunctions as IExecuteFunctions, lines, 'estimate');
expect(result).toEqual([
{
DetailType: 'SalesItemLineDetail',
SalesItemLineDetail: { ItemRef: { value: '789' }, TaxCodeRef: { value: 'TAX1' } },
},
]);
});
test('should process SalesItemLineDetail for invoice resource with Qty', () => {
const lines = [
{ DetailType: 'SalesItemLineDetail', itemId: '101', TaxCodeRef: 'TAX2', Qty: 10 },
];
const result = processLines.call(mockExecuteFunctions as IExecuteFunctions, lines, 'invoice');
expect(result).toEqual([
{
DetailType: 'SalesItemLineDetail',
SalesItemLineDetail: { ItemRef: { value: '101' }, TaxCodeRef: { value: 'TAX2' }, Qty: 10 },
},
]);
});
test('should process SalesItemLineDetail for invoice resource without Qty', () => {
const lines = [{ DetailType: 'SalesItemLineDetail', itemId: '202', TaxCodeRef: 'TAX3' }];
const result = processLines.call(mockExecuteFunctions as IExecuteFunctions, lines, 'invoice');
expect(result).toEqual([
{
DetailType: 'SalesItemLineDetail',
SalesItemLineDetail: { ItemRef: { value: '202' }, TaxCodeRef: { value: 'TAX3' } },
},
]);
});
});

View file

@ -148,6 +148,13 @@ export const invoiceFields: INodeProperties[] = [
loadOptionsMethod: 'getTaxCodeRefs', loadOptionsMethod: 'getTaxCodeRefs',
}, },
}, },
{
displayName: 'Quantity',
name: 'Qty',
description: 'Number of units of the line item',
type: 'number',
default: 0,
},
], ],
}, },
{ {