From e9346bfee2b504fa38606895fd1a62fd3dacf17f Mon Sep 17 00:00:00 2001 From: Atuldubey98 Date: Sun, 31 Mar 2024 15:44:03 +0530 Subject: [PATCH] feature : dashboard --- .../src/controllers/dashboard.controller.js | 7 ++ backend/src/mock-database/api/bills.js | 74 ------------------- backend/src/mock-database/api/customers.js | 26 ------- backend/src/mock-database/api/esimates.js | 0 backend/src/mock-database/api/organization.js | 12 --- backend/src/mock-database/api/products.js | 31 -------- backend/src/mock-database/api/users.js | 27 ------- backend/src/mock-database/index.js | 53 ------------- .../raw-data/{customers.csv => parties.csv} | 0 .../common/form-drawer-layout/index.jsx | 8 +- .../common/main-layout/AvatarProfile.jsx | 2 +- .../features/common/main-layout/Header.jsx | 12 ++- .../src/features/common/main-layout/index.jsx | 2 +- .../src/features/dashboard/DashboardTable.jsx | 2 +- frontend/src/features/dashboard/index.jsx | 24 +++++- frontend/src/features/expenses/index.jsx | 6 ++ .../invoices/create/PartySelectBill.jsx | 38 ++++++---- .../src/features/organizations/OrgItem.jsx | 2 +- frontend/src/features/organizations/index.jsx | 7 +- .../products/ProductCategoryAsyncSelect.jsx | 37 ++++++---- .../features/products/ProductFormDrawer.jsx | 34 +++++---- 21 files changed, 125 insertions(+), 279 deletions(-) delete mode 100644 backend/src/mock-database/api/bills.js delete mode 100644 backend/src/mock-database/api/customers.js delete mode 100644 backend/src/mock-database/api/esimates.js delete mode 100644 backend/src/mock-database/api/organization.js delete mode 100644 backend/src/mock-database/api/products.js delete mode 100644 backend/src/mock-database/api/users.js delete mode 100644 backend/src/mock-database/index.js rename backend/src/mock-database/raw-data/{customers.csv => parties.csv} (100%) diff --git a/backend/src/controllers/dashboard.controller.js b/backend/src/controllers/dashboard.controller.js index b427e7b..d38b498 100644 --- a/backend/src/controllers/dashboard.controller.js +++ b/backend/src/controllers/dashboard.controller.js @@ -140,10 +140,17 @@ exports.getDashboard = requestAsyncHandler(async (req, res) => { .populate("party", "name") .limit(5) .exec(); + const recentPurchases = await Purchase.find({ org: orgId }) + .sort({ createdAt: -1 }) + .select("name purchaseNo total totalTax status party date") + .populate("party", "name") + .limit(5) + .exec(); return res.status(200).json({ data: { invoiceThisMonth, quotesThisMonth, + recentPurchases, expensesThisMonth, partysThisMonth, recentInvoices, diff --git a/backend/src/mock-database/api/bills.js b/backend/src/mock-database/api/bills.js deleted file mode 100644 index c5fbfe2..0000000 --- a/backend/src/mock-database/api/bills.js +++ /dev/null @@ -1,74 +0,0 @@ -module.exports = ({ axios, cookie, orgId, entity }) => { - function getRandomInt(min, max) { - const minCeiled = Math.ceil(min); - const maxFloored = Math.floor(max); - return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled); // The maximum is exclusive and the minimum is inclusive - } - function getRandomDate() { - const today = new Date(); - const oneMonthAgo = new Date(today.getTime() - 30 * 24 * 60 * 60 * 1000); - const randomTimestamp = oneMonthAgo.getTime() + Math.random() * (today.getTime() - oneMonthAgo.getTime()); - const randomDate = new Date(randomTimestamp); - return randomDate - } - - function createBill(bill) { - return axios.post(`/api/v1/organizations/${orgId}/${entity}`, bill, { - headers: { - Cookie: cookie, - }, - }); - } - async function getBills() { - const partysResponse = await axios.get( - `/api/v1/organizations/${orgId}/parties`, - { - headers: { - Cookie: cookie, - }, - } - ); - const productsReponse = await axios.get( - `/api/v1/organizations/${orgId}/products`, - { - headers: { - Cookie: cookie, - }, - } - ); - const idMapper = (item) => item._id; - const partyIds = partysResponse.data.data.map(idMapper); - const products = productsReponse.data.data; - const bills = new Array(1000).fill(0).map((_, index) => { - const party = partyIds[getRandomInt(0, partyIds.length)]; - const items = new Array(5).fill(0).map(() => { - const product = products[getRandomInt(0, products.length)]; - return { - name: product.name, - quantity: getRandomInt(0, 5), - um: "kg", - gst: "GST:18", - price: product.sellingPrice, - }; - }); - return { - num: index, - date: new Date().toISOString().split("T")[0], - status: "draft", - party, - items, - invoiceNo: index, - terms: "", - description: "", - }; - }); - return bills; - } - async function createManyBills() { - const bills = await getBills(); - await Promise.all(bills.map((bill) => createBill(bill))); - } - return { - createManyBills, - }; -}; diff --git a/backend/src/mock-database/api/customers.js b/backend/src/mock-database/api/customers.js deleted file mode 100644 index 60ef262..0000000 --- a/backend/src/mock-database/api/customers.js +++ /dev/null @@ -1,26 +0,0 @@ -const read = require("../read"); - -module.exports = ({ axios, cookie, orgId }) => { - function createParty(party) { - return axios.post(`/api/v1/organizations/${orgId}/parties`, party, { - headers: { - Cookie: cookie, - }, - }); - } - async function getPartys() { - const data = await read( - "/home/atul/Development/erp_mern/backend/src/mock-database/raw-data/parties.csv" - ); - return data; - } - async function createManyPartys() { - const parties = await getPartys(); - await Promise.all(parties.map((party) => createParty(party))); - } - return { - createParty, - getPartys, - createManyPartys, - }; -}; diff --git a/backend/src/mock-database/api/esimates.js b/backend/src/mock-database/api/esimates.js deleted file mode 100644 index e69de29..0000000 diff --git a/backend/src/mock-database/api/organization.js b/backend/src/mock-database/api/organization.js deleted file mode 100644 index cbf7045..0000000 --- a/backend/src/mock-database/api/organization.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = (axios, cookie) => { - function createOrganization(organization) { - return axios.post(`/api/v1/organizations`, organization, { - headers: { - Cookie: cookie, - }, - }); - } - return { - createOrganization, - }; -}; diff --git a/backend/src/mock-database/api/products.js b/backend/src/mock-database/api/products.js deleted file mode 100644 index a0b7ed8..0000000 --- a/backend/src/mock-database/api/products.js +++ /dev/null @@ -1,31 +0,0 @@ -const read = require("../read"); - -module.exports = ({ axios, cookie, orgId }) => { - function createProduct(product) { - return axios.post(`/api/v1/organizations/${orgId}/products`, product, { - headers: { - Cookie: cookie, - }, - }); - } - async function getProducts() { - const data = await read( - "/home/atul/Development/erp_mern/backend/src/mock-database/raw-data/products.csv" - ); - const products = data.map((product) => ({ - ...product, - costPrice: Number(product.costPrice), - sellingPrice: Number(product.sellingPrice), - })); - return products; - } - async function createManyProducts() { - const products = await getProducts(); - await Promise.all(products.map((product) => createProduct(product))); - } - return { - createProduct, - getProducts, - createManyProducts, - }; -}; diff --git a/backend/src/mock-database/api/users.js b/backend/src/mock-database/api/users.js deleted file mode 100644 index d58fd18..0000000 --- a/backend/src/mock-database/api/users.js +++ /dev/null @@ -1,27 +0,0 @@ -const read = require("../read"); -module.exports = (axios) => { - function registerUser(user) { - return axios.post(`/api/v1/users/register`, user); - } - function loginUser(user) { - return axios.post(`/api/v1/users/login`, user); - } - async function getAllUsers() { - const data = await read( - `/home/atul/Development/erp_mern/backend/src/mock-database/raw-data/users.csv` - ); - return data; - } - async function registerManyUsers() { - const users = await getAllUsers(); - await Promise.all( - users.map((user) => registerUser(user)) - ); - } - return { - registerUser, - loginUser, - getAllUsers, - registerManyUsers, - }; -}; diff --git a/backend/src/mock-database/index.js b/backend/src/mock-database/index.js deleted file mode 100644 index d55f340..0000000 --- a/backend/src/mock-database/index.js +++ /dev/null @@ -1,53 +0,0 @@ -const axios = require("axios").default; - -const instance = axios.create({ - baseURL: `http://127.0.0.1:9000`, -}); -const userApi = require("./api/users"); -const orgApi = require("./api/organization"); -const productApi = require("./api/products"); -const partysApi = require("./api/parties"); -const billsApi = require("./api/bills"); -const users = userApi(instance); -(async () => { - await users.registerManyUsers(); - const cookie = await users - .loginUser({ - email: "pcurnock0@cpanel.net", - password: "12345678", - }) - .then((data) => { - return data.headers["set-cookie"]; - }); - const org = orgApi(instance, cookie); - - const { data } = await org.createOrganization({ - name: "S R Refrigeration and Electricals", - address: "6-G Nyaykhand-1 GZB Noida UP", - gstNo: "89899JHAJKSH78", - panNo: "AHSJAS87897", - financialYear: { - start: "2023-04-01", - end: "2024-03-31", - }, - }); - const products = productApi({ - axios: instance, - cookie, - orgId: data.data._id, - }); - const parties = partysApi({ - axios: instance, - cookie, - orgId: data.data._id, - }); - const invoices = billsApi({ - axios: instance, - cookie, - orgId: data.data._id, - entity: "invoices", - }); - await products.createManyProducts(); - await parties.createManyPartys(); - await invoices.createManyBills(); -})(); diff --git a/backend/src/mock-database/raw-data/customers.csv b/backend/src/mock-database/raw-data/parties.csv similarity index 100% rename from backend/src/mock-database/raw-data/customers.csv rename to backend/src/mock-database/raw-data/parties.csv diff --git a/frontend/src/features/common/form-drawer-layout/index.jsx b/frontend/src/features/common/form-drawer-layout/index.jsx index 6cf1a95..84219e7 100644 --- a/frontend/src/features/common/form-drawer-layout/index.jsx +++ b/frontend/src/features/common/form-drawer-layout/index.jsx @@ -22,8 +22,8 @@ export default function FormDrawerLayout({ return ( - -
+ + {formHeading} @@ -36,8 +36,8 @@ export default function FormDrawerLayout({ {formBtnLabel} - -
+
+
); } diff --git a/frontend/src/features/common/main-layout/AvatarProfile.jsx b/frontend/src/features/common/main-layout/AvatarProfile.jsx index 1bada83..20aea07 100644 --- a/frontend/src/features/common/main-layout/AvatarProfile.jsx +++ b/frontend/src/features/common/main-layout/AvatarProfile.jsx @@ -13,7 +13,7 @@ export default function AvatarProfile() { user?.name } (${role.toLocaleUpperCase()})`} - + ); } diff --git a/frontend/src/features/common/main-layout/Header.jsx b/frontend/src/features/common/main-layout/Header.jsx index 60b0fb8..f90170a 100644 --- a/frontend/src/features/common/main-layout/Header.jsx +++ b/frontend/src/features/common/main-layout/Header.jsx @@ -2,6 +2,7 @@ import { Box, Button, Flex, + IconButton, Show, Text, useColorMode, @@ -33,6 +34,7 @@ export default function Header({ onSideNavOpen }) { alignItems={"center"} > - {colorMode === "dark" ? ( + : } + onClick={toggleColorMode} + /> + {/* {colorMode === "dark" ? ( ) : ( - )} + )} */} diff --git a/frontend/src/features/common/main-layout/index.jsx b/frontend/src/features/common/main-layout/index.jsx index 53f3d8f..d80c108 100644 --- a/frontend/src/features/common/main-layout/index.jsx +++ b/frontend/src/features/common/main-layout/index.jsx @@ -17,7 +17,7 @@ export default function MainLayout({ children }) {
- {children} + {children} diff --git a/frontend/src/features/dashboard/DashboardTable.jsx b/frontend/src/features/dashboard/DashboardTable.jsx index 21a5d76..bc349be 100644 --- a/frontend/src/features/dashboard/DashboardTable.jsx +++ b/frontend/src/features/dashboard/DashboardTable.jsx @@ -16,7 +16,7 @@ export default function DashboardTable({ heading, tableHeads, tableRows }) { return ( - {heading} + {heading} diff --git a/frontend/src/features/dashboard/index.jsx b/frontend/src/features/dashboard/index.jsx index 541935b..af88d7b 100644 --- a/frontend/src/features/dashboard/index.jsx +++ b/frontend/src/features/dashboard/index.jsx @@ -19,6 +19,7 @@ import Status from "../estimates/list/Status"; import DashboardTable from "./DashboardTable"; import Dashcard from "./Dashcard"; import GuideTourModal from "./GuideTourModal"; +import { purchaseStatusList } from "../../constants/purchase"; export default function DashboardPage() { const [dashboard, setDashboard] = useState({ invoiceThisMonth: 0, @@ -28,6 +29,7 @@ export default function DashboardPage() { expensesThisMonth: 0, recentInvoices: [], recentQuotes: [], + recentPurchases: [], }); const { orgId } = useParams(); const { requestAsyncHandler } = useAsyncCall(); @@ -80,7 +82,7 @@ export default function DashboardPage() { return ( - Dashboard + Dashboard um.value === formik.values.um)} + onChange={({ value }) => { + formik.setFieldValue(`um`, value); + }} + options={ums} + /> + {formik.errors.um} + {formik.errors.sellingPrice} - - Unit of Measurement - {formik.errors.description} + );