From 928e903fe0190d24c66cdbf60b2df9dfcfb79b1e Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Sun, 20 Mar 2022 19:00:50 +0200 Subject: [PATCH] fix(WarehouseTransfer): set item cost to form entries. --- .../WarehouseTransferEditorField.js | 5 ++- .../WarehouseTransferForm.js | 1 - .../WarehouseTransferFormEntriesTable.js | 13 +++++- .../WarehouseTransferFormProvider.js | 11 ++++- .../WarehouseTransferForm/components.js | 13 +++--- .../WarehouseTransferForm/utils.js | 42 ++++++++++++++++++- src/containers/WarehouseTransfers/utils.js | 9 ++-- 7 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/containers/WarehouseTransfers/WarehouseTransferForm/WarehouseTransferEditorField.js b/src/containers/WarehouseTransfers/WarehouseTransferForm/WarehouseTransferEditorField.js index 8f24bbcee..e023afa01 100644 --- a/src/containers/WarehouseTransfers/WarehouseTransferForm/WarehouseTransferEditorField.js +++ b/src/containers/WarehouseTransfers/WarehouseTransferForm/WarehouseTransferEditorField.js @@ -7,15 +7,18 @@ import WarehouseTransferFormEntriesTable from './WarehouseTransferFormEntriesTab import { entriesFieldShouldUpdate, defaultWarehouseTransferEntry, + useWatchItemsCostSetCostEntries } from './utils'; - /** * Warehouse transafer editor field. */ export default function WarehouseTransferEditorField() { const { items } = useWarehouseTransferFormContext(); + // Watches inventory items cost and sets cost to form entries. + useWatchItemsCostSetCostEntries(); + return (
{ - const itemsIds = values.entries + const { date } = values; + const itemsIds = chain(values.entries) .filter((e) => e.item_id) - .map((e) => e.item_id); + .map((e) => e.item_id) + .uniq() + .value(); - setItemCostQuery({ - date: values.date, - itemsIds, - }); + setItemCostQuery({ date, itemsIds }); }; return ; } diff --git a/src/containers/WarehouseTransfers/WarehouseTransferForm/utils.js b/src/containers/WarehouseTransfers/WarehouseTransferForm/utils.js index 37a58b62c..a652f2145 100644 --- a/src/containers/WarehouseTransfers/WarehouseTransferForm/utils.js +++ b/src/containers/WarehouseTransfers/WarehouseTransferForm/utils.js @@ -2,10 +2,13 @@ import React from 'react'; import moment from 'moment'; import intl from 'react-intl-universal'; import { Intent } from '@blueprintjs/core'; -import { omit } from 'lodash'; +import { keyBy, omit } from 'lodash'; import { useFormikContext } from 'formik'; import * as R from 'ramda'; +import { useWatch } from 'hooks/utils'; +import { useWarehouseTransferFormContext } from './WarehouseTransferFormProvider'; + import { AppToaster } from 'components'; import { orderingLinesIndexes, @@ -119,6 +122,7 @@ export function transformValueToRequest(values) { 'warehouses', 'destination_warehouse', 'source_warehouse', + 'cost', ]), })), }; @@ -178,3 +182,39 @@ export const deleteTableRow = R.curry((rowIndex, defaultEntry, rows) => { updateRemoveLineByIndex(rowIndex), )(rows); }); + +/** + * Watches the inventory items cost and sets the cost to form entries. + */ +export function useWatchItemsCostSetCostEntries() { + const { isItemsCostSuccess, inventoryItemsCost } = + useWarehouseTransferFormContext(); + + const { + setFieldValue, + values: { entries }, + } = useFormikContext(); + + // Transformes items cost map by item id. + const itemsCostByItemId = React.useMemo( + () => keyBy(inventoryItemsCost, 'item_id'), + [inventoryItemsCost], + ); + + // Observes the inventory items cost and set form entries with cost. + useWatch(() => { + if (!isItemsCostSuccess) return; + + const newEntries = entries.map((entry) => { + const costEntry = itemsCostByItemId[entry.item_id]; + + return entry.item_id + ? { + ...entry, + cost: costEntry?.average, + } + : entry; + }); + setFieldValue('entries', newEntries); + }, inventoryItemsCost); +} diff --git a/src/containers/WarehouseTransfers/utils.js b/src/containers/WarehouseTransfers/utils.js index e64fe3d41..f25e663a2 100644 --- a/src/containers/WarehouseTransfers/utils.js +++ b/src/containers/WarehouseTransfers/utils.js @@ -98,7 +98,7 @@ export const useWarehouseTransferTableColumns = () => { disableSortBy: true, Cell: SourceWarehouseAccessorCell, align: 'right', - width: 120, + width: 100, }, { id: 'destination_warehouse', @@ -107,7 +107,7 @@ export const useWarehouseTransferTableColumns = () => { Cell: DistentionWarehouseAccessorCell, disableSortBy: true, align: 'right', - width: 120, + width: 100, }, { Header: intl.get('warehouse_transfer.column.transfer_quantity'), @@ -120,10 +120,9 @@ export const useWarehouseTransferTableColumns = () => { { Header: intl.get('warehouse_transfer.column.cost_price'), accessor: 'cost', - Cell: MoneyFieldCell, disableSortBy: true, align: 'right', - width: 100, + width: 80, }, { Header: '', @@ -136,4 +135,4 @@ export const useWarehouseTransferTableColumns = () => { ], [], ); -}; +}; \ No newline at end of file