Compare commits

...

4 Commits

Author SHA1 Message Date
Ahmed Bouhuolia
5df454dd30 chore: bump packages version to v0.10.2 2023-10-02 23:29:21 +02:00
Ahmed Bouhuolia
07628ddc37 fix(server): add missing method in ItemEntry model. 2023-10-02 23:27:19 +02:00
Ahmed Bouhuolia
69afa07e3b fix(webapp): Disable tax rates from item entries editor table on services do not support tax rates 2023-10-02 23:27:05 +02:00
Ahmed Bouhuolia
b1a043f699 chore(server): add package-lock.json file 2023-09-27 19:16:02 +02:00
13 changed files with 13737 additions and 23 deletions

13663
packages/server/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bigcapital/server", "name": "@bigcapital/server",
"version": "0.10.0", "version": "0.10.2",
"description": "", "description": "",
"main": "src/server.ts", "main": "src/server.ts",
"scripts": { "scripts": {

View File

@@ -99,6 +99,13 @@ export default class ItemEntry extends TenantModel {
: getExlusiveTaxAmount(this.amount, this.taxRate); : getExlusiveTaxAmount(this.amount, this.taxRate);
} }
static calcAmount(itemEntry) {
const { discount, quantity, rate } = itemEntry;
const total = quantity * rate;
return discount ? total - total * discount * 0.01 : total;
}
/** /**
* Item entry relations. * Item entry relations.
*/ */

View File

@@ -1,6 +1,6 @@
{ {
"name": "@bigcapital/webapp", "name": "@bigcapital/webapp",
"version": "0.10.1", "version": "0.10.2",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@blueprintjs-formik/core": "^0.3.4", "@blueprintjs-formik/core": "^0.3.4",

View File

@@ -17,11 +17,21 @@ import {
useItemEntriesTableContext, useItemEntriesTableContext,
} from './ItemEntriesTableProvider'; } from './ItemEntriesTableProvider';
import { useUncontrolled } from '@/hooks/useUncontrolled'; import { useUncontrolled } from '@/hooks/useUncontrolled';
import { ItemEntry } from '@/interfaces/ItemEntries';
interface ItemsEntriesTableProps {
initialValue?: ItemEntry;
value?: ItemEntry[];
onChange?: (entries: ItemEntry[]) => void;
taxRates?: any[];
minLinesNumber?: number;
enableTaxRates?: boolean;
}
/** /**
* Items entries table. * Items entries table.
*/ */
function ItemsEntriesTable(props) { function ItemsEntriesTable(props: ItemsEntriesTableProps) {
const { value, initialValue, onChange } = props; const { value, initialValue, onChange } = props;
const [localValue, handleChange] = useUncontrolled({ const [localValue, handleChange] = useUncontrolled({
@@ -119,8 +129,11 @@ ItemsEntriesTable.defaultProps = {
discount: '', discount: '',
}, },
initialEntries: [], initialEntries: [],
taxRates: [],
items: [],
linesNumber: 1, linesNumber: 1,
minLinesNumber: 1, minLinesNumber: 1,
enableTaxRates: true,
}; };
export default ItemsEntriesTable; export default ItemsEntriesTable;

View File

@@ -92,7 +92,7 @@ const LandedCostHeaderCell = () => {
*/ */
export function useEditableItemsEntriesColumns() { export function useEditableItemsEntriesColumns() {
const { featureCan } = useFeatureCan(); const { featureCan } = useFeatureCan();
const { landedCost } = useItemEntriesTableContext(); const { landedCost, enableTaxRates } = useItemEntriesTableContext();
const isProjectsFeatureEnabled = featureCan(Features.Projects); const isProjectsFeatureEnabled = featureCan(Features.Projects);
@@ -132,13 +132,17 @@ export function useEditableItemsEntriesColumns() {
width: 70, width: 70,
align: Align.Right, align: Align.Right,
}, },
{ ...(enableTaxRates
Header: 'Tax rate', ? [
accessor: 'tax_rate_id', {
Cell: TaxRatesSuggestInputCell, Header: 'Tax rate',
disableSortBy: true, accessor: 'tax_rate_id',
width: 110, Cell: TaxRatesSuggestInputCell,
}, disableSortBy: true,
width: 110,
},
]
: []),
{ {
Header: intl.get('discount'), Header: intl.get('discount'),
accessor: 'discount', accessor: 'discount',

View File

@@ -27,8 +27,8 @@ export default function BillFormBody({ defaultBill }) {
meta: { error, touched }, meta: { error, touched },
}) => ( }) => (
<ItemsEntriesTable <ItemsEntriesTable
entries={value} value={value}
onUpdateData={(entries) => { onChange={(entries) => {
setFieldValue('entries', entries); setFieldValue('entries', entries);
}} }}
items={items} items={items}
@@ -37,6 +37,7 @@ export default function BillFormBody({ defaultBill }) {
currencyCode={values.currency_code} currencyCode={values.currency_code}
itemType={ITEM_TYPE.PURCHASABLE} itemType={ITEM_TYPE.PURCHASABLE}
landedCost={true} landedCost={true}
enableTaxRates={false}
/> />
)} )}
</FastField> </FastField>

View File

@@ -22,14 +22,15 @@ export default function VendorCreditNoteItemsEntriesEditor() {
meta: { error, touched }, meta: { error, touched },
}) => ( }) => (
<ItemsEntriesTable <ItemsEntriesTable
entries={value} value={value}
onUpdateData={(entries) => { onChange={(entries) => {
setFieldValue('entries', entries); setFieldValue('entries', entries);
}} }}
items={items} items={items}
errors={error} errors={error}
linesNumber={4} linesNumber={4}
currencyCode={values.currency_code} currencyCode={values.currency_code}
enableTaxRates={false}
/> />
)} )}
</FastField> </FastField>

View File

@@ -26,14 +26,15 @@ export default function CreditNoteItemsEntriesEditorField() {
meta: { error, touched }, meta: { error, touched },
}) => ( }) => (
<ItemsEntriesTable <ItemsEntriesTable
entries={value} value={value}
onUpdateData={(entries) => { onChange={(entries) => {
setFieldValue('entries', entries); setFieldValue('entries', entries);
}} }}
items={items} items={items}
errors={error} errors={error}
linesNumber={4} linesNumber={4}
currencyCode={values.currency_code} currencyCode={values.currency_code}
enableTaxRates={false}
/> />
)} )}
</FastField> </FastField>

View File

@@ -26,14 +26,15 @@ export default function EstimateFormItemsEntriesField() {
meta: { error, touched }, meta: { error, touched },
}) => ( }) => (
<ItemsEntriesTable <ItemsEntriesTable
entries={value} value={value}
onUpdateData={(entries) => { onChange={(entries) => {
setFieldValue('entries', entries); setFieldValue('entries', entries);
}} }}
items={items} items={items}
errors={error} errors={error}
linesNumber={4} linesNumber={4}
currencyCode={values.currency_code} currencyCode={values.currency_code}
enableTaxRates={false}
/> />
)} )}
</FastField> </FastField>

View File

@@ -31,6 +31,15 @@ export const defaultEstimateEntry = {
amount: '', amount: '',
}; };
const defaultEstimateEntryReq = {
index: 0,
item_id: '',
rate: '',
discount: '',
quantity: '',
description: '',
};
export const defaultEstimate = { export const defaultEstimate = {
customer_id: '', customer_id: '',
estimate_date: moment(new Date()).format('YYYY-MM-DD'), estimate_date: moment(new Date()).format('YYYY-MM-DD'),
@@ -148,7 +157,9 @@ export const transfromsFormValuesToRequest = (values) => {
...(values.estimate_number_manually && { ...(values.estimate_number_manually && {
estimate_number: values.estimate_number, estimate_number: values.estimate_number,
}), }),
entries: entries.map((entry) => ({ ...omit(entry, ['amount']) })), entries: entries.map((entry) => ({
...transformToForm(entry, defaultEstimateEntryReq),
})),
}; };
}; };

View File

@@ -19,14 +19,15 @@ export default function ReceiptItemsEntriesEditor({ defaultReceipt }) {
meta: { error, touched }, meta: { error, touched },
}) => ( }) => (
<ItemsEntriesTable <ItemsEntriesTable
entries={value} value={value}
onUpdateData={(entries) => { onChange={(entries) => {
setFieldValue('entries', entries); setFieldValue('entries', entries);
}} }}
items={items} items={items}
errors={error} errors={error}
linesNumber={4} linesNumber={4}
currencyCode={values.currency_code} currencyCode={values.currency_code}
enableTaxRates={false}
/> />
)} )}
</FastField> </FastField>

View File

@@ -32,6 +32,15 @@ export const defaultReceiptEntry = {
amount: '', amount: '',
}; };
const defaultReceiptEntryReq = {
index: 0,
item_id: '',
rate: '',
discount: '',
quantity: '',
description: '',
};
export const defaultReceipt = { export const defaultReceipt = {
customer_id: '', customer_id: '',
deposit_account_id: '', deposit_account_id: '',
@@ -140,7 +149,9 @@ export const transformFormValuesToRequest = (values) => {
...(values.receipt_number_manually && { ...(values.receipt_number_manually && {
receipt_number: values.receipt_number, receipt_number: values.receipt_number,
}), }),
entries: entries.map((entry) => ({ ...omit(entry, ['amount']) })), entries: entries.map((entry) => ({
...transformToForm(entry, defaultReceiptEntryReq),
})),
closed: false, closed: false,
}; };
}; };