diff --git a/CHANGELOG.md b/CHANGELOG.md index 128448da..0984c604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ 7.0.13-SNAPSHOT / WIP ================== +New functionalities that are backwards-compatible: +* [OLMIS-7987](https://openlmis.atlassian.net/browse/OLMIS-7987): Move Submit Requisitionless Orders functionalities from Angola to Core instance Bug fixes: * [OLMIS-7992](https://openlmis.atlassian.net/browse/OLMIS-7992): Fix passing parameter to hasRoleWithRightForProgramAndSupervisoryNode function diff --git a/src/requisition-order-create/messages_en.json b/src/requisition-order-create/messages_en.json index 66153cb4..330c22e9 100644 --- a/src/requisition-order-create/messages_en.json +++ b/src/requisition-order-create/messages_en.json @@ -1,8 +1,39 @@ { - "requisition.orderCreate": "Create Order", - "requisition.orderCreate.submitted": "Order created successfully", + "requisition.orderCreate": "Create Orders", + "requisition.orderCreate.cancel": "Cancel", + "requisition.orderCreate.loading": "Loading", + "requisition.orderCreate.view": "View", + "requisition.orderCreate.printOrder": "Print Order", + "requisition.orderCreate.edit": "Edit", + "requisition.orderCreate.create": "Create Order", + "requisition.orderCreate.saveDraft": "Save Draft", + "requisition.orderCreate.submitted": "Orders created successfully", "requisition.orderCreate.createdOrderSent.success": "Offline created order sent successfully.", "requisition.orderCreate.createdOrderSent.error": "Error occurred while sending offline created order.", "requisition.orderCreate.draftUpdate.success": "Draft order update success.", - "requisition.orderCreate.draftUpdate.error": "Error occurred while updating draft order." + "requisition.orderCreate.draftUpdate.error": "Error occurred while updating draft order.", + "requisition.orderCreate.delete": "Delete", + "requisition.orderCreate.deleteBatch": "Delete Batch", + "requisition.orderCreate.delete.prompt": "Are you sure you want to delete this order?", + "requisition.orderCreate.delete.prompt.batch": "Are you sure you want to delete available orders?", + "requisition.orderCreate.delete.error": "Error occurred while deleting order(s).", + "requisition.orderCreate.delete.success": "Order(s) deleted successfully.", + "requisition.orderCreate.program": "Program", + "requisition.orderCreate.program.placeholder": "Select Program", + "requisition.orderCreate.reqFacility": "Requesting Facility", + "requisition.orderCreate.reqFacility.placeholder": "Select Requesting Facility", + "requisition.orderCreate.supFacility": "Supplying Facility", + "requisition.orderCreate.supFacility.placeholder": "Select Supplying Facility", + "requisition.orderCreate.table.productCode": "Product Code", + "requisition.orderCreate.table.product": "Product", + "requisition.orderCreate.table.soh": "SOH", + "requisition.orderCreate.table.quantity": "Quantity", + "requisition.orderCreate.table.actions": "Actions", + "requisition.orderCreate.table.facility": "Facility", + "requisition.orderCreate.table.addProduct": "Add", + "requisition.orderCreate.table.productAlreadyAdded": "This product was already added to the table", + "requisition.orderCreate.requisistionInfo.status": "Status", + "requisition.orderCreate.requisistionInfo.dateCreated": "Date Created", + "requisition.orderCreate.searchSelect.placeholder": "Select an option", + "requisition.orderCreate.searchSelect.empty.message": "Not found" } diff --git a/src/requisition-order-create/order-create-form-helper-functions.jsx b/src/requisition-order-create/order-create-form-helper-functions.jsx new file mode 100644 index 00000000..dee9c98b --- /dev/null +++ b/src/requisition-order-create/order-create-form-helper-functions.jsx @@ -0,0 +1,93 @@ +export const getMappedRequestingFacilities = (facilities, userId, selectedProgram, selectedSupplyingFacility) => { + return facilities.map((facilityId) => ({ + emergency: true, + createdBy: { id: userId }, + program: { id: selectedProgram }, + requestingFacility: { id: facilityId }, + receivingFacility: { id: facilityId }, + supplyingFacility: { id: selectedSupplyingFacility }, + facility: { id: facilityId } + })); +}; + +export const goToOrderEdit = (orders, orderService, history) => { + const orderCreationPromises = orders.map(order => orderService.create(order)); + Promise.all(orderCreationPromises).then((createdOrders) => { + const ordersIds = createdOrders.map(order => order.id).join(','); + history.push(`/requisitions/orderCreate/${ordersIds}`); + }); +}; + +const getSupervisoryNodes = (selectedRequestingFacilities, selectedProgram, supervisoryNodeResource) => { + const supervisoryNodeResourcePromisses = selectedRequestingFacilities.map(facilityId => supervisoryNodeResource.query({ + programId: selectedProgram, + facilityId: facilityId + })); + + return Promise.all(supervisoryNodeResourcePromisses); +} + +const assignNodeToArray = (acc, obj, mappedPages) => { + if (!acc.some(existingObj => existingObj.id === obj.id)) { + if (mappedPages.every(page => page.some(item => item.id === obj.id))) { + acc.push(obj); + } + } +}; + +const getNodesValue = (pages) => { + const mappedPages = pages.map(page => page.content); + const nodes = mappedPages.reduce((acc, arr) => { + arr.forEach(obj => { + assignNodeToArray(acc, obj, mappedPages); + }); + return acc; + }, []); + return nodes; +} + +const getSupplyLines = (nodes, supplyLineResource, selectedProgram) => { + return Promise.all(nodes.map((node) => ( + supplyLineResource.query({ + programId: selectedProgram, + supervisoryNodeId: node.id + }) + ))) +} + +const setSupplyingFacilities = (supplyLinesResources, facilityService, setSupplyingFacilityOptions) => { + const supplyLines = _.flatten(supplyLinesResources.map((it) => (it.content))); + const facilityIds = _.uniq(supplyLines.map((it) => (it.supplyingFacility.id))); + + if (facilityIds.length > 0) { + facilityService.query({ + id: facilityIds + }) + .then((resp) => { + const facilities = resp.content; + setSupplyingFacilityOptions(facilities.map(facility => ({ name: facility.name, value: facility.id }))); + }); + } else { + setSupplyingFacilityOptions([]); + } +} + +export const updateSupplyingFacilitiesValue = (selectedProgram, selectedRequestingFacilities, supervisoryNodeResource, supplyLineResource, facilityService, setSupplyingFacilityOptions) => { + if (selectedProgram && selectedRequestingFacilities) { + getSupervisoryNodes(selectedRequestingFacilities, selectedProgram, supervisoryNodeResource) + .then((pages) => { + const nodes = getNodesValue(pages); + + if (nodes.length > 0) { + getSupplyLines(nodes, supplyLineResource, selectedProgram) + .then((supplyLinesResources) => { + setSupplyingFacilities(supplyLinesResources, facilityService, setSupplyingFacilityOptions); + }); + } else { + setSupplyingFacilityOptions([]); + } + }); + } else { + setSupplyingFacilityOptions([]); + } +} \ No newline at end of file diff --git a/src/requisition-order-create/order-create-form.jsx b/src/requisition-order-create/order-create-form.jsx index 057246dc..8f593903 100644 --- a/src/requisition-order-create/order-create-form.jsx +++ b/src/requisition-order-create/order-create-form.jsx @@ -17,6 +17,10 @@ import React, { useState, useEffect, useMemo } from 'react'; import { useHistory } from 'react-router-dom'; import getService from '../react-components/utils/angular-utils'; import { SearchSelect } from './search-select'; +import EditableTable from '../react-components/table/editable-table'; +import { getMappedRequestingFacilities, goToOrderEdit, updateSupplyingFacilitiesValue } from './order-create-form-helper-functions'; +import { orderCreateFormTableColumns } from './order-create.constant'; + const OrderCreateForm = () => { @@ -25,62 +29,64 @@ const OrderCreateForm = () => { const [programOptions, setProgramOptions] = useState([]); const [requestingFacilityOptions, setRequestingFacilityOptions] = useState([]); const [supplyingFacilityOptions, setSupplyingFacilityOptions] = useState([]); - const [selectedProgram, selectProgram] = useState(''); - const [selectedRequestingFacility, selectRequestingFacility] = useState(''); - const [selectedSupplyingFacility, selectSupplyingFacility] = useState(''); + const [selectedProgram, setSelectedProgram] = useState(''); + const [selectedRequestingFacilities, setSelectedRequestingFacilities] = useState([]); + const [selectedSupplyingFacility, setSelectedSupplyingFacility] = useState(''); + const [filteredRequestingFacilities, setFilteredRequestingFacilities] = useState([]); - const ADMINISTRATION_RIGHTS = useMemo( - () => { - return getService('ADMINISTRATION_RIGHTS'); - }, - [] - ); + const ADMINISTRATION_RIGHTS = useMemo(() => getService('ADMINISTRATION_RIGHTS'), []); + const programService = useMemo(() => getService('programService'), []); + const facilityService = useMemo(() => getService('facilityService'), []); + const orderService = useMemo(() => getService('orderCreateService'), []); + const columns = useMemo(() => orderCreateFormTableColumns, []); const userId = useMemo( () => { const authorizationService = getService('authorizationService'); return authorizationService.getUser().user_id; - }, - [] - ); - - const programService = useMemo( - () => { - return getService('programService'); - }, - [] - ); - - const facilityService = useMemo( - () => { - return getService('facilityService'); - }, - [] - ); - - const orderService = useMemo( - () => { - return getService('orderCreateService'); - }, - [] + }, [] ); const supervisoryNodeResource = useMemo( () => { const resource = getService('SupervisoryNodeResource'); return new resource(); - }, - [] + }, [] ); const supplyLineResource = useMemo( () => { const resource = getService('SupplyLineResource'); return new resource(); - }, - [] + }, [] ); + const createOrders = () => { + const orders = getMappedRequestingFacilities(selectedRequestingFacilities, userId, selectedProgram, selectedSupplyingFacility); + goToOrderEdit(orders, orderService, history); + }; + + const updateFilteredFacilities = () => { + const facilities = requestingFacilityOptions + .filter(facility => selectedRequestingFacilities.includes(facility.value)); + + setFilteredRequestingFacilities(facilities); + } + + const updateTableData = (updatedData) => { + setFilteredRequestingFacilities(updatedData); + const updatedDataIds = updatedData.map(facility => facility.value) + + setSelectedRequestingFacilities(prevState => { + return prevState.filter(id => updatedDataIds.includes(id)); + }); + } + + const updateSupplyingFacilities = () => { + setSelectedSupplyingFacility(''); + updateSupplyingFacilitiesValue(selectedProgram, selectedRequestingFacilities, supervisoryNodeResource, supplyLineResource, facilityService, setSupplyingFacilityOptions); + }; + useEffect( () => { programService.getUserPrograms(userId) @@ -101,99 +107,34 @@ const OrderCreateForm = () => { [facilityService] ); - const updateSupplyingFacilities = () => { - selectSupplyingFacility(''); - - if (selectedProgram && selectedRequestingFacility) { - supervisoryNodeResource.query({ - programId: selectedProgram, - facilityId: selectedRequestingFacility - }) - .then((page) => { - const nodes = page.content; - - if (nodes.length > 0) { - Promise.all(nodes.map((node) => ( - supplyLineResource.query({ - programId: selectedProgram, - supervisoryNodeId: node.id - }) - ))) - .then((results) => { - const supplyLines = _.flatten(results.map((it) => (it.content))); - const facilityIds = _.uniq(supplyLines.map((it) => (it.supplyingFacility.id))); - - if (facilityIds.length > 0) { - facilityService.query({ - id: facilityIds - }) - .then((resp) => { - const facilities = resp.content; - setSupplyingFacilityOptions(_.map(facilities, facility => ({ name: facility.name, value: facility.id }))); - }); - } else { - setSupplyingFacilityOptions([]); - } - }); - } else { - setSupplyingFacilityOptions([]); - } - }); - } else { - setSupplyingFacilityOptions([]); - } - }; - useEffect( () => { updateSupplyingFacilities(); }, - [selectedProgram, selectedRequestingFacility] + [selectedProgram, selectedRequestingFacilities] ); useEffect( () => { if (programOptions && programOptions.length === 1) { - selectProgram(programOptions[0].value); + setSelectedProgram(programOptions[0].value); } }, [programOptions] ); - useEffect( - () => { - if (requestingFacilityOptions && requestingFacilityOptions.length === 1) { - selectRequestingFacility(requestingFacilityOptions[0].value); - } - }, - [requestingFacilityOptions] - ); - useEffect( () => { if (supplyingFacilityOptions && supplyingFacilityOptions.length === 1) { - selectSupplyingFacility(supplyingFacilityOptions[0].value); + setSelectedSupplyingFacility(supplyingFacilityOptions[0].value); } }, [supplyingFacilityOptions] ); - const createOrder = () => { - const order = { - emergency: true, - createdBy: { id: userId }, - program: { id: selectedProgram }, - requestingFacility: { id: selectedRequestingFacility }, - receivingFacility: { id: selectedRequestingFacility }, - supplyingFacility: { id: selectedSupplyingFacility }, - facility: { id: selectedRequestingFacility } - }; - - orderService.create(order) - .then((createdOrder) => { - history.push(`/requisitions/orderCreate/${createdOrder.id}`); - }); - }; + useEffect(() => { + updateFilteredFacilities(); + }, [selectedRequestingFacilities]); return (
Loading...
+ )}