From e671d8fc910f59191b6525a4c8da0e9412b2bb00 Mon Sep 17 00:00:00 2001 From: pawan-dot <71133473+pawan-dot@users.noreply.github.com> Date: Fri, 27 Jan 2023 17:55:07 +0530 Subject: [PATCH] product complete --- package.json | 2 + src/_nav.js | 46 +++ src/components/AppSidebar.js | 2 - src/index.js | 2 +- src/routes.js | 17 +- src/views/orders/CancelledOrders.js | 274 ++++++++++++++ src/views/orders/DeliveredOrders.js | 273 ++++++++++++++ src/views/orders/DispatchedOrders.js | 274 ++++++++++++++ src/views/orders/NewOrders.js | 275 ++++++++++++++ src/views/orders/PrintOrderDetails.js | 239 ++++++++++++ src/views/orders/ProcessingOrders.js | 274 ++++++++++++++ src/views/orders/ReturnedOrders.js | 274 ++++++++++++++ src/views/orders/ViewOrder.js | 522 ++++++++++++++++++++++++++ 13 files changed, 2470 insertions(+), 4 deletions(-) create mode 100644 src/views/orders/CancelledOrders.js create mode 100644 src/views/orders/DeliveredOrders.js create mode 100644 src/views/orders/DispatchedOrders.js create mode 100644 src/views/orders/NewOrders.js create mode 100644 src/views/orders/PrintOrderDetails.js create mode 100644 src/views/orders/ProcessingOrders.js create mode 100644 src/views/orders/ReturnedOrders.js create mode 100644 src/views/orders/ViewOrder.js diff --git a/package.json b/package.json index eedbba6..fc22d67 100644 --- a/package.json +++ b/package.json @@ -58,10 +58,12 @@ "react-datepicker": "^4.8.0", "react-dom": "^18.0.0", "react-paginate": "^8.1.3", + "react-qr-code": "^2.0.11", "react-redux": "^7.2.6", "react-router-dom": "^6.7.0", "react-spinners": "^0.11.0", "react-time-picker": "^4.5.0", + "react-to-print": "^2.14.11", "redux": "4.1.2", "serve": "^13.0.2", "simplebar-react": "^2.3.6", diff --git a/src/_nav.js b/src/_nav.js index 95574c7..c3267c7 100644 --- a/src/_nav.js +++ b/src/_nav.js @@ -5,6 +5,7 @@ import { cilAppsSettings, cilBell, cilCalculator, + cilCart, cilChartPie, cilClipboard, cilCommand, @@ -51,6 +52,51 @@ const _nav = [ icon: , to: '/temples', }, + { + component: CNavGroup, + name: 'Franchisee Orders', + icon: , + items: [ + { + component: CNavItem, + name: 'New', + icon: , + to: '/orders/new', + }, + { + component: CNavItem, + name: 'Paid', + icon: , + to: '/orders/returned', + }, + { + component: CNavItem, + name: 'Processing', + icon: , + to: '/orders/processing', + }, + { + component: CNavItem, + name: 'Dispatched', + icon: , + to: '/orders/dispatched', + }, + { + component: CNavItem, + name: 'Delivered', + icon: , + to: '/orders/delivered', + }, + { + component: CNavItem, + name: 'Cancelled', + icon: , + to: '/orders/cancelled', + }, + + ], + }, + { component: CNavItem, diff --git a/src/components/AppSidebar.js b/src/components/AppSidebar.js index 6f0481e..20908da 100644 --- a/src/components/AppSidebar.js +++ b/src/components/AppSidebar.js @@ -41,7 +41,6 @@ const AppSidebar = () => { Authorization: `Bearer ${token}`, }, }) - console.log(configDetails.data.result) configDetails.data.result.map((item) => { setHeaderlogoUrl(item?.logo[0]?.Headerlogo) setFooterlogoUrl(item?.logo[0]?.Footerlogo) @@ -51,7 +50,6 @@ const AppSidebar = () => { getConfiguration() }, []) - console.log(HeaderlogoUrl) //---------------------------// return ( { axios.defaults.baseURL = 'https://atpapi.checkapp.one' - //axios.defaults.baseURL = 'http://localhost:5000' + // axios.defaults.baseURL = 'http://localhost:5000' axios.defaults.headers = { 'Cache-Control': 'no-cache,no-store', 'Pragma': 'no-cache', diff --git a/src/routes.js b/src/routes.js index 9062e71..483b6aa 100644 --- a/src/routes.js +++ b/src/routes.js @@ -32,6 +32,14 @@ import AddProduct from './views/Products/AddProduct' import EditProduct from './views/Products/EditProduct' import ViewProduct from './views/Products/ViewProduct' +//Order Management +import NewOrders from './views/orders/NewOrders.js' +import ProcessingOrders from './views/orders/ProcessingOrders.js' +import DispatchedOrders from './views/orders/DispatchedOrders.js' +import DeliveredOrders from './views/orders/DeliveredOrders.js' +import CancelledOrders from './views/orders/CancelledOrders.js' +import ReturnedOrders from './views/orders/ReturnedOrders.js' +import ViewOrder from './views/orders/ViewOrder.js' const routes = [ { path: '/', exact: true, name: 'Home' }, @@ -45,7 +53,14 @@ const routes = [ { path: '/product/add', name: 'Add products', element: AddProduct }, { path: '/product/edit/:id', name: 'Edit products', element: EditProduct }, { path: '/product/view/:id', name: 'view products', element: ViewProduct }, - + //Order Management + { path: '/orders/new', name: 'New Orders', element: NewOrders }, + // { path: '/orders/processing', name: 'Processing Orders', element: ProcessingOrders }, + // { path: '/orders/dispatched', name: 'Dispatched Orders', element: DispatchedOrders }, + // { path: '/orders/delivered', name: 'Delivered Orders', element: DeliveredOrders }, + // { path: '/orders/cancelled', name: 'Cancelled Orders', element: CancelledOrders }, + // { path: '/orders/returned', name: 'Returned Orders', element: ReturnedOrders }, + // { path: '/orders/:status/:id', name: 'View Order', element: ViewOrder }, //Temple diff --git a/src/views/orders/CancelledOrders.js b/src/views/orders/CancelledOrders.js new file mode 100644 index 0000000..5da95f2 --- /dev/null +++ b/src/views/orders/CancelledOrders.js @@ -0,0 +1,274 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + + +function CancelledOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [cancelledOrdersData, setCancelledOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(cancelledOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getProcessingOrder() { + axios + .get(`/api/order/list/cancelled`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setCancelledOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getProcessingOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(cancelledOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, cancelledOrdersData]) + + return ( +
+
+
+
+
+
+
+ Cancelled Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDParent NameAmountPlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, cancelledOrdersData.length)} of{' '} + {cancelledOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + cancelledOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + cancelledOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default CancelledOrders diff --git a/src/views/orders/DeliveredOrders.js b/src/views/orders/DeliveredOrders.js new file mode 100644 index 0000000..d3a3eff --- /dev/null +++ b/src/views/orders/DeliveredOrders.js @@ -0,0 +1,273 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + +function DeliveredOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [deliveredOrdersData, setDeliveredOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(deliveredOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getProcessingOrder() { + axios + .get(`/api/order/list/delivered`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setDeliveredOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getProcessingOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(deliveredOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, deliveredOrdersData]) + + return ( +
+
+
+
+
+
+
+ Delivered Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDParent NameAmountPlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, deliveredOrdersData.length)} of{' '} + {deliveredOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + deliveredOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + deliveredOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default DeliveredOrders diff --git a/src/views/orders/DispatchedOrders.js b/src/views/orders/DispatchedOrders.js new file mode 100644 index 0000000..6b4ebca --- /dev/null +++ b/src/views/orders/DispatchedOrders.js @@ -0,0 +1,274 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + + +function DispatchedOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [dispatchedOrdersData, setDispatchedOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(dispatchedOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getDispatchedOrder() { + axios + .get(`/api/order/list/dispatched`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setDispatchedOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getDispatchedOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(dispatchedOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, dispatchedOrdersData]) + + return ( +
+
+
+
+
+
+
+ Dispatched Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDParent NameAmountPlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, dispatchedOrdersData.length)} of{' '} + {dispatchedOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + dispatchedOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + dispatchedOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default DispatchedOrders diff --git a/src/views/orders/NewOrders.js b/src/views/orders/NewOrders.js new file mode 100644 index 0000000..dc70807 --- /dev/null +++ b/src/views/orders/NewOrders.js @@ -0,0 +1,275 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' + +import { isAutheticated } from 'src/auth' + +function NewOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [newOrdersData, setNewOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(newOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getNewOrder() { + axios + .get(`/api/order/list/new`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setNewOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getNewOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(newOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, newOrdersData]) + + return ( +
+
+
+
+
+
+
+ New Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + {/* */} + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDFranchiseeOrder valuePlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, newOrdersData.length)} of{' '} + {newOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + newOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + newOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default NewOrders diff --git a/src/views/orders/PrintOrderDetails.js b/src/views/orders/PrintOrderDetails.js new file mode 100644 index 0000000..6de0179 --- /dev/null +++ b/src/views/orders/PrintOrderDetails.js @@ -0,0 +1,239 @@ +import React, { useEffect, useState } from 'react' +import QRCode from 'react-qr-code' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + + +const PrintOrderDetails = React.forwardRef(({ orderData }, ref) => { + const token = isAutheticated() + const [company, setCompany] = useState({}) + const [logo, setLogo] = useState('') + + useEffect(() => { + function getConfig() { + axios + .get(`/api/config`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }) + .then((res) => { + setCompany(res.data?.result[0]?.address[0]) + setLogo(res.data?.result[0]?.logo[0]?.Headerlogo) + }) + } + getConfig() + }, []) + + return ( +
+
+
+

Order Confirmation

+
+
+ + + + + + + + + + +
+ {logo && ( +
+ {company?.company} +
+ )} +
+ {company?.company} +
+ {company?.address} +
+ {company?.city + ' ' + company?.state + ' ' + company?.pincode} +
+ {company?.country} +
+ GSTIN {company?.gstin} +
+
+
+
+ + +
+
+ +
+
+ + + + + + + + + + + + + +
Bill ToShip To
+ {orderData?.address?.full_name} +
+ {orderData.address?.flat_house_no_apartment} +
+ {orderData.address?.area_street_sector_village} +
+ {orderData.address?.landmark && ( + <> + {orderData.address?.landmark} +
+ + )} + {orderData.address?.address_line && ( + <> + {orderData.address?.address_line} +
+ + )} + {orderData.address?.city} +
+ {orderData.address?.pincode + ' ' + orderData.address?.state} +
+ {orderData?.address?.full_name} +
+ {orderData.address?.flat_house_no_apartment} +
+ {orderData.address?.area_street_sector_village} +
+ {orderData.address?.landmark && ( + <> + {orderData.address?.landmark} +
+ + )} + {orderData.address?.address_line && ( + <> + {orderData.address?.address_line} +
+ + )} + {orderData.address?.city} +
+ {orderData.address?.pincode + ' ' + orderData.address?.state} +
+ + + + + + + + + + + + + + + + + {orderData?.items && + orderData?.items?.length > 0 && + orderData.items.map((e, i) => ( + + + + + + + + + + + + ))} + + + + +
#HSN CodeProduct NameSizeQntyTax TypeGross AmountTax RateNet Amount
{i + 1}{e.product?.hsn_code}{e.product.name}{e.variant.size}{e.quantity}{e?.igst ? 'IGST' : 'CGST, SGST'}{e.price} + {(e?.igst ? Number(e?.igst) : Number(e?.sgst) + Number(e?.cgst)).toFixed(2) + + '%'} + + {e?.igst + ? ((e.price + (e.price * e.igst) / 100) * e.quantity).toFixed(2) + : ( + (e.price + (e.price * e.cgst) / 100 + (e.price * e.sgst) / 100) * + e.quantity + ).toFixed(2)} +
+
+
+ Total Gross Amount +
+ Rs.{orderData?.total_gross_amount} +
+
+ Tax Amount +
+ Rs.{orderData?.tax_amount} +
+
+ Shipping Charge +
+ Rs.{orderData?.shipping_charge} +
+
+ Final Net Amount +
+ Rs.{orderData?.total_amount} +
+
+
+

+ Note: Tax Invoice will be sent along with the goods. +

+

+ Thanks for your business. +

+ +
+
+ ) +}) + +export default PrintOrderDetails diff --git a/src/views/orders/ProcessingOrders.js b/src/views/orders/ProcessingOrders.js new file mode 100644 index 0000000..8aa763d --- /dev/null +++ b/src/views/orders/ProcessingOrders.js @@ -0,0 +1,274 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + + +function ProcessingOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [processingOrdersData, setProcessingOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(processingOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getProcessingOrder() { + axios + .get(`/api/order/list/processing`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setProcessingOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getProcessingOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(processingOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, processingOrdersData]) + + return ( +
+
+
+
+
+
+
+ Processing Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDParent NameAmountPlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, processingOrdersData.length)} of{' '} + {processingOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + processingOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + processingOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default ProcessingOrders diff --git a/src/views/orders/ReturnedOrders.js b/src/views/orders/ReturnedOrders.js new file mode 100644 index 0000000..f6e6e17 --- /dev/null +++ b/src/views/orders/ReturnedOrders.js @@ -0,0 +1,274 @@ +import React, { useState, useEffect } from 'react' +import { Link } from 'react-router-dom' +import axios from 'axios' +import { isAutheticated } from 'src/auth' + + +function ReturnedOrders() { + const token = isAutheticated() + const [loading, setLoading] = useState(true) + const [success, setSuccess] = useState(true) + const [returnedOrdersData, setReturnedOrdersData] = useState([]) + + const [currentPage, setCurrentPage] = useState(1) + const [itemPerPage, setItemPerPage] = useState(10) + const [showData, setShowData] = useState(returnedOrdersData) + + const handleShowEntries = (e) => { + setCurrentPage(1) + setItemPerPage(e.target.value) + } + + useEffect(() => { + function getProcessingOrder() { + axios + .get(`/api/order/list/returned`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setReturnedOrdersData(res.data.data) + setLoading(false) + }) + .catch((err) => { + console.log(err) + setLoading(false) + }) + } + getProcessingOrder() + }, []) + + useEffect(() => { + const loadData = () => { + const indexOfLastPost = currentPage * itemPerPage + const indexOfFirstPost = indexOfLastPost - itemPerPage + setShowData(returnedOrdersData.slice(indexOfFirstPost, indexOfLastPost)) + } + loadData() + }, [currentPage, itemPerPage, returnedOrdersData]) + + return ( +
+
+
+
+
+
+
+ Returned Orders +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + + + + + + + + + {!loading && showData.length === 0 && ( + + + + )} + {loading ? ( + + + + ) : ( + showData.map((order, i) => { + return ( + + + + + + + + + ) + }) + )} + +
Order IDParent NameAmountPlaced OnStatusActions
+
No Data Available
+
+ Loading... +
{order.order_id}{order.parent.name}{order?.total_amount} + {new Date(order?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} + + + {order?.status} + + + + + +
+
+ +
+
+
+ Showing {currentPage * itemPerPage - itemPerPage + 1} to{' '} + {Math.min(currentPage * itemPerPage, returnedOrdersData.length)} of{' '} + {returnedOrdersData.length} entries +
+
+ +
+
+
    +
  • + setCurrentPage((prev) => prev - 1)} + > + Previous + +
  • + + {!(currentPage - 1 < 1) && ( +
  • + setCurrentPage((prev) => prev - 1)} + > + {currentPage - 1} + +
  • + )} + +
  • + + {currentPage} + +
  • + + {!( + (currentPage + 1) * itemPerPage - itemPerPage > + returnedOrdersData.length - 1 + ) && ( +
  • + { + setCurrentPage((prev) => prev + 1) + }} + > + {currentPage + 1} + +
  • + )} + +
  • + returnedOrdersData.length - 1 + ) + ? 'paginate_button page-item next' + : 'paginate_button page-item next disabled' + } + > + setCurrentPage((prev) => prev + 1)} + > + Next + +
  • +
+
+
+
+
+
+
+
+
+
+
+ ) +} + +export default ReturnedOrders diff --git a/src/views/orders/ViewOrder.js b/src/views/orders/ViewOrder.js new file mode 100644 index 0000000..06447f0 --- /dev/null +++ b/src/views/orders/ViewOrder.js @@ -0,0 +1,522 @@ +import React, { useState, useEffect, useRef } from 'react' +import axios from 'axios' +import { useNavigate, useParams } from 'react-router-dom' +import QRCode from 'react-qr-code' +import ReactToPrint from 'react-to-print' +import { isAutheticated } from 'src/auth' + +import PrintOrderDetails from './PrintOrderDetails.js' + +function ViewOrder() { + const { status, id } = useParams() + const navigate = useNavigate() + const printOrderRef = useRef() + const token = isAutheticated() + const [orderData, setOrderData] = useState({}) + const [loading, setLoading] = useState(true) + const [orderStatus, setOrderStatus] = useState('') + const [data, setData] = useState({ + courier_name: '', + tracking_id: '', + }) + + useEffect(() => { + function getOrderDetails() { + setLoading(true) + axios + .get(`/api/order/${id}`, { + headers: { 'Access-Control-Allow-Origin': '*', Authorization: `Bearer ${token}` }, + }) + .then((res) => { + setLoading(false) + setOrderData(res.data.data) + }) + .catch((err) => { + setLoading(false) + getBack() + }) + } + getOrderDetails() + }, []) + + const handleChange = (e) => { + if (e.target.type === 'text') { + setData((prev) => ({ ...prev, [e.target.id]: e.target.value })) + } else { + setOrderStatus(e.target.value) + } + } + + function handleSubmit() { + if (orderStatus === '') return + if (orderData.status === 'processing') { + if (data.courier_name.trim() === '' || data.tracking_id.trim() === '') { + swal({ + title: 'Warning', + text: 'Enter Courier Name And Tracking ID!', + icon: 'error', + button: 'Retry', + dangerMode: true, + }) + return + } + } + setLoading(true) + axios + .patch( + `/api/order/${id}`, + { ...data, status: orderStatus }, + { + headers: { + 'Access-Control-Allow-Origin': '*', + Authorization: `Bearer ${token}`, + }, + }, + ) + .then((res) => { + swal({ + title: 'Updated', + text: 'Order updated!', + icon: 'success', + button: 'Return', + }) + setLoading(false) + getBack() + }) + .catch((err) => { + setLoading(false) + swal({ + title: 'Warning', + text: 'Something went wrong!', + icon: 'error', + button: 'Retry', + dangerMode: true, + }) + }) + } + + function getBack() { + navigate(`/orders/${status}`, { replace: true }) + } + + return ( + <> + {' '} +
+
+
+
+
+
+
+ Order Details +
+
+ {(orderData?.status === 'new' || orderData?.status === 'processing') && ( + ( + + )} + content={() => printOrderRef.current} + /> + )} + + {orderData?.status !== 'cancelled' && + orderData?.status !== 'returned' && + orderData?.status !== 'delivered' && ( + + )} + +
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + {orderData?.items && + orderData?.items?.length > 0 && + orderData.items.map((e, i) => ( +
+
+
+ {e.product.name} +
+
+
{e.product.name}
+
+
+

+ SKU: {e.product?.sku} +

+

+ Variant: {e.variant.size} +

+

+ Quantity: {e.quantity} +

+
+
+ {' '} +

+ Price: Rs.{e.price} +

+ {e?.igst && ( +

+ IGST: {e.igst}% +

+ )} + {e?.cgst && ( +

+ CGST: {e.cgst}% +

+ )} + {e?.sgst && ( +

+ SGST: {e.sgst}% +

+ )} +

+ Total: Rs.{e.amount} +

+
+
+
+
+
+
+ ))} +
+
+
+
+
+
+
+ {status !== 'cancelled' && status !== 'returned' && status !== 'delivered' && ( +
+ + +
+ )} +
+ {orderData?.order_id && ( +
+

Order ID QR Code:

+ +
+ )} +
+ {orderData.status === 'processing' && ( + <> +
+ + +
+
+ + +
+ + )} +
+ +
+ {orderData?.address && ( + <> +
+ +
+
+ +
+ + )} + {orderData?.courier_name && ( +
+ +
+ )} + {orderData?.tracking_id && ( +
+ +
+ )} + {/*
+ +
*/} +
+ +
{' '} +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Order Placed On : + {orderData?.status_timeline?.new + ? new Date(orderData?.status_timeline?.new).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }) + : new Date(orderData?.placed_on).toLocaleString('en-IN', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + })} +
Processing Started : + {orderData?.status_timeline?.processing + ? new Date(orderData?.status_timeline?.processing).toLocaleString( + 'en-IN', + { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }, + ) + : '-'} +
Dispatched On : + {orderData?.status_timeline?.dispatched + ? new Date(orderData?.status_timeline?.dispatched).toLocaleString( + 'en-IN', + { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }, + ) + : '-'} +
Delivered On : + {orderData?.status_timeline?.delivered + ? new Date(orderData?.status_timeline?.delivered).toLocaleString( + 'en-IN', + { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }, + ) + : '-'} +
Cancelled On : + {orderData?.status_timeline?.cancelled + ? new Date(orderData?.status_timeline?.cancelled).toLocaleString( + 'en-IN', + { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }, + ) + : '-'} +
Returned On : + {orderData?.status_timeline?.returned + ? new Date(orderData?.status_timeline?.returned).toLocaleString( + 'en-IN', + { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: '2-digit', + minute: 'numeric', + hour12: true, + }, + ) + : '-'} +
+
+
+
+
+
+
+
+
+ +
+ + ) +} + +export default ViewOrder