From b8ff92deb94cc9459a07ff63d7dfc51965df4fd3 Mon Sep 17 00:00:00 2001 From: ROSHAN GARG Date: Sat, 21 Sep 2024 20:55:43 +0530 Subject: [PATCH] invoice and pendind --- src/_nav.js | 8 ++ src/assets/incoicedata.json | 97 +++++++++++++++ src/routes.js | 13 +- src/views/orders/ViewOrders.js | 21 +++- src/views/orders/invoiceTable.js | 74 +++++++++++ src/views/orders/pendingOrders.js | 199 ++++++++++++++++++++++++++++++ 6 files changed, 408 insertions(+), 4 deletions(-) create mode 100644 src/assets/incoicedata.json create mode 100644 src/views/orders/invoiceTable.js create mode 100644 src/views/orders/pendingOrders.js diff --git a/src/_nav.js b/src/_nav.js index a0851ed..722b502 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -165,6 +165,13 @@ const _nav = [ to: "/orders/delivered", group: "Orders", }, + { + component: CNavItem, + name: "Pending", + icon: , + to: "/orders/Pending", + group: "Orders", + }, { component: CNavItem, name: "Cancelled", @@ -172,6 +179,7 @@ const _nav = [ to: "/orders/cancelled", group: "Orders", }, + // { // component: CNavItem, // name: "In Store Cash Orders", diff --git a/src/assets/incoicedata.json b/src/assets/incoicedata.json new file mode 100644 index 0000000..3769955 --- /dev/null +++ b/src/assets/incoicedata.json @@ -0,0 +1,97 @@ +[ + { + "invoiceId": "INV-001234", + "orderId": "ORDER-987654", + "items": [ + { + "productId": "5f8d0d55b54764421b7156b1", + "SKU": "PRD-0001", + "name": "Wireless Mouse", + "categoryName": "Electronics", + "brandName": "Logitech", + "price": 1499, + "GST": 18, + "HSN_Code": 847160, + "processquantity": 2 + }, + { + "productId": "5f8d0d55b54764421b7156b2", + "SKU": "PRD-0002", + "name": "Keyboard", + "categoryName": "Electronics", + "brandName": "Dell", + "price": 2499, + "GST": 18, + "HSN_Code": 847160, + "processquantity": 1 + } + ], + "subtotal": 5497, + "gstTotal": 989.46, + "invoiceAmount": 6486.46, + "courier_name": "FedEx", + "courier_tracking_id": "TRK-123456789", + "courierStatus": "processing", + "courierstatus_timeline": { + "processing": "2023-09-18T09:00:00", + "dispatched": null, + "delivered": null + } + }, + { + "invoiceId": "INV-001235", + "orderId": "ORDER-987655", + "items": [ + { + "productId": "5f8d0d55b54764421b7156b3", + "SKU": "PRD-0003", + "name": "Smartphone", + "categoryName": "Mobile Phones", + "brandName": "Samsung", + "price": 19999, + "GST": 12, + "HSN_Code": 851712, + "processquantity": 1 + } + ], + "subtotal": 19999, + "gstTotal": 2399.88, + "invoiceAmount": 22398.88, + "courier_name": "DHL", + "courier_tracking_id": "TRK-987654321", + "courierStatus": "dispatched", + "courierstatus_timeline": { + "processing": "2023-09-15T10:00:00", + "dispatched": "2023-09-16T12:30:00", + "delivered": null + } + }, + { + "invoiceId": "INV-001236", + "orderId": "ORDER-987656", + "items": [ + { + "productId": "5f8d0d55b54764421b7156b4", + "SKU": "PRD-0004", + "name": "Laptop", + "categoryName": "Computers", + "brandName": "HP", + "price": 59999, + "GST": 18, + "HSN_Code": 847130, + "processquantity": 1 + } + ], + "subtotal": 59999, + "gstTotal": 10799.82, + "invoiceAmount": 70798.82, + "courier_name": "Blue Dart", + "courier_tracking_id": "TRK-1122334455", + "courierStatus": "delivered", + "courierstatus_timeline": { + "processing": "2023-09-10T08:00:00", + "dispatched": "2023-09-11T11:00:00", + "delivered": "2023-09-13T14:45:00" + } + } +] diff --git a/src/routes.js b/src/routes.js index 2105a1b..a0d441d 100644 --- a/src/routes.js +++ b/src/routes.js @@ -152,6 +152,7 @@ import ViewPrincipalDistributorSC from "./views/SalesCoOrdinators/ViewPrincipalD import ViewRetailDistributorSC from "./views/SalesCoOrdinators/ViewRetailDistributorSC"; import ViewRetailDistributorPD from "./views/PrincipalDistributors/ViewRetailDistributorPD"; import MapRD from "./views/RetailDistributors/MapRD"; +import PendingOrders from "./views/orders/pendingOrders"; const routes = [ //dashboard @@ -224,7 +225,7 @@ const routes = [ element: ViewProductManual, navName: "Product Management", }, -//SalesCoOrdinator + //SalesCoOrdinator { path: "/salescoordinator/edit/:id", name: "Edit SalesCoOrdinator", @@ -292,7 +293,7 @@ const routes = [ element: ViewRetailDistributorTM, navName: "TerritoryManagers", }, - // Attendence + // Attendence { path: "/attendance/today", name: "Today's Attendance", @@ -317,7 +318,7 @@ const routes = [ element: SingleUserAttendance, navName: "Attendance", }, - // Leaves + // Leaves { path: "/leaves/today", name: "Today's leaves", @@ -644,6 +645,12 @@ const routes = [ element: DeliveredOrders, navName: "Orders", }, + { + path: "/orders/pending", + name: "Pending Orders", + element: PendingOrders, + navName: "Orders", + }, { path: "/orders/cancelled", name: "Cancelled Orders", diff --git a/src/views/orders/ViewOrders.js b/src/views/orders/ViewOrders.js index ee49c2f..2cf1c15 100644 --- a/src/views/orders/ViewOrders.js +++ b/src/views/orders/ViewOrders.js @@ -19,12 +19,14 @@ import { TextField, Divider, } from "@mui/material"; +import onvoicesData from "../../assets/incoicedata.json"; import { useNavigate, useParams } from "react-router-dom"; import { TableContainer } from "@material-ui/core"; import axios from "axios"; // Import axios for HTTP requests import { isAutheticated } from "src/auth"; import Swal from "sweetalert2"; import OrderDetailsDialog from "./partialOrderModal"; +import InvoiceTable from "./invoiceTable"; const ViewOrders = () => { const [order, setOrder] = useState(null); // State to store order details @@ -295,7 +297,15 @@ const ViewOrders = () => { - + {onvoicesData.length > 0 && ( + <> + + Invoices + + + + )} + Order Summary @@ -506,6 +516,15 @@ const ViewOrders = () => { )} + {status === "pending" && ( + <> + + + + + )} {status === "processing" && ( <> diff --git a/src/views/orders/invoiceTable.js b/src/views/orders/invoiceTable.js new file mode 100644 index 0000000..f0c4220 --- /dev/null +++ b/src/views/orders/invoiceTable.js @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from "react"; +import { + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + Button, + Chip, +} from "@mui/material"; +import axios from "axios"; +import { Typography } from "@material-ui/core"; + +const InvoiceTable = ({ invoices }) => { + return ( + + + + + Invoice ID + + Items + Subtotal + GST Total + Invoice Amount + Courier Status + + + + {false ? ( + + + Loading... + + + ) : ( + invoices.map((invoice) => ( + + {invoice.invoiceId} + + + {invoice.items.map((item) => ( +
+ {item.name} ({item.SKU}) x {item.processquantity} +
+ ))} +
+ {invoice.subtotal} + {invoice.gstTotal} + {invoice.invoiceAmount} + + + +
+ )) + )} +
+
+
+ ); +}; + +export default InvoiceTable; diff --git a/src/views/orders/pendingOrders.js b/src/views/orders/pendingOrders.js new file mode 100644 index 0000000..fd73c96 --- /dev/null +++ b/src/views/orders/pendingOrders.js @@ -0,0 +1,199 @@ +import React, { useState, useEffect } from "react"; +import { + Box, + Button, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, + TablePagination, + TextField, + MenuItem, + FormControl, + InputLabel, + Select, + Skeleton, +} from "@mui/material"; +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +import { isAutheticated } from "src/auth"; + +const PendingOrders = () => { + const [orders, setOrders] = useState([]); + const [loading, setLoading] = useState(true); + const [page, setPage] = useState(0); + const [rowsPerPage, setRowsPerPage] = useState(5); + const [totalOrders, setTotalOrders] = useState(0); + const [searchField, setSearchField] = useState("Order ID"); + const [searchText, setSearchText] = useState(""); + const navigate = useNavigate(); + const token = isAutheticated(); + + // Fetch orders with pagination + const fetchOrders = async (page, limit) => { + setLoading(true); + try { + const response = await axios.get("/api/get-pending-order-admin", { + headers: { + Authorization: `Bearer ${token}`, + }, + params: { + page: page + 1, // Adjusting for zero-based index in the UI + limit, + searchField, + searchText, + }, + }); + // console.log(response); + setOrders(response?.data?.placedOrders); + setTotalOrders(response?.data?.totalOrders); + } catch (error) { + console.error("Error fetching orders:", error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + fetchOrders(page, rowsPerPage); + }, [page, rowsPerPage, searchField, searchText]); + + const handleSearchChange = (event) => { + setSearchText(event.target.value); + }; + + const handleSearchFieldChange = (event) => { + setSearchField(event.target.value); + }; + + const handleChangePage = (event, newPage) => { + setPage(newPage); + }; + + const handleChangeRowsPerPage = (event) => { + setRowsPerPage(parseInt(event.target.value, 10)); + setPage(0); + }; + + const filteredOrders = orders?.filter((order) => { + if (searchField === "Order ID") { + return order.uniqueId.toLowerCase().includes(searchText.toLowerCase()); + } + if (searchField === "Status") { + return order.status.toLowerCase().includes(searchText.toLowerCase()); + } + return true; + }); + + return ( + + + Pending Order List + + + + Search By + + + + + + + + + Order ID + Order Date + Items + Order Value + Status + Action + + + + {loading ? ( + Array.from(new Array(rowsPerPage)).map((_, index) => ( + + + + + + )) + ) : filteredOrders.length > 0 ? ( + filteredOrders.map((order) => ( + + {order.uniqueId} + + {new Date(order.createdAt).toDateString()} + , {formatAMPM(order.createdAt)} + + {order.orderItem.length} + {order.grandTotal.toFixed(2)} + {order.status} + + + + + )) + ) : ( + + + Data not found + + + )} + +
+ +
+
+ ); +}; + +// Helper function to format time as AM/PM +const formatAMPM = (date) => { + var hours = new Date(date).getHours(); + var minutes = new Date(date).getMinutes(); + var ampm = hours >= 12 ? "PM" : "AM"; + hours = hours % 12; + hours = hours ? hours : 12; + minutes = minutes < 10 ? "0" + minutes : minutes; + var strTime = hours + ":" + minutes + " " + ampm; + return strTime; +}; + +export default PendingOrders;