diff --git a/.env.local.example b/.env.local.example index bfa4bf6..a6882a3 100644 --- a/.env.local.example +++ b/.env.local.example @@ -1,5 +1,5 @@ NEXT_PUBLIC_API_NAME = "Loan Facilities Dashboard" -NEXT_PUBLIC_API_VERSION = "2.7.2" +NEXT_PUBLIC_API_VERSION = "2.8.0" NEXT_PUBLIC_DEFAULT_LANGUAGE = "fa" NEXT_PUBLIC_DEFAULT_DIRECTION = "rtl" diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json index d037a5c..5a23145 100644 --- a/public/locales/fa/app.json +++ b/public/locales/fa/app.json @@ -637,6 +637,35 @@ "button-revise": "ارسال", "description": "توضیحات خود را وارد نمائید" }, + "ComebackLoanDetailDialog": { + "comeback-loan-detail": "علت عودت بانک", + "Table_head_loan_id": "کد یکتا وام", + "Table_head_comeback_name": "علت عودت", + "Table_head_comeback_comment": "توضیحات", + "Table_head_comeback_date": "تاریخ" + }, + "BankPaymentDialog": { + "bank-payment": "پرداخت بانک", + "Table_head_loan_id": "کد یکتا وام", + "Table_head_installment_number": "شماره قسط واریز شده", + "Table_head_remaining_facility": "تسهیلات باقیمانده", + "Table_head_paid_facility": "تسهیلات پرداخت شده", + "button-cancel": "بستن", + "Table_head_paid_date": "تاریخ" + }, + "ApprovedBankLoanDialog": { + "approved-bank-loan": "انعقاد قرارداد بانک", + "Table_head_loan_id": "کد یکتا وام", + "Table_head_approved_date": "تاریخ تصویب بانک", + "Table_head_approved_facility_bank": "مبلغ مصوب تسهیلات سهم بانک", + "Table_head_approved_facility_gov": "مبلغ مصوب تسهیلات سهم دولت", + "Table_head_approved_facility_person": "مبلغ مصوب تسهیلات سهم متقاضی", + "Table_head_contract_date": "تاریخ قرارداد بانک", + "Table_head_contract_facility_bank": "مبلغ قرارداد تسهیلات سهم بانک", + "Table_head_contract_facility_gov": "مبلغ قرارداد تسهیلات سهم دولت", + "Table_head_contract_facility_person": "مبلغ قرارداد تسهیلات سهم متقاضی", + "Table_head_due_date": "تاریخ سررسید اول قسط" + }, "ReferReasonDialog": { "refer_reason": "علت ارجاع", "button-cancel" : "بازگشت", diff --git a/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/ApprovedBankLoanContent.jsx b/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/ApprovedBankLoanContent.jsx new file mode 100644 index 0000000..ee27efe --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/ApprovedBankLoanContent.jsx @@ -0,0 +1,131 @@ +import { + Box, + DialogContent, + LinearProgress, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, +} from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useEffect, useState } from "react"; +import useRequest from "@/lib/app/hooks/useRequest"; +import { GET_APPROVED_BANK_LOAN } from "@/core/data/apiRoutes"; +import moment from "jalali-moment"; + +const ApprovedBankLoanContent = ({ rowId }) => { + const t = useTranslations(); + const requestServer = useRequest({ auth: true, notification: false }); + const [ApprovedBankDetail, setApprovedBankDetail] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(false); + useEffect(() => { + requestServer(`${GET_APPROVED_BANK_LOAN}/${rowId}`, "get") + .then((res) => { + setApprovedBankDetail(res.data.data); + setIsLoading(false); + }) + .catch((error) => { + setError(true); + }); + }, []); + + return ( + + {error ? ( + + {t("LoanHistory.Table_history_error")} + + ) : isLoading ? ( + + ) : ( + + + + + + {t("ApprovedBankLoanDialog.Table_head_approved_date")} + + {t("ApprovedBankLoanDialog.Table_head_approved_facility_bank")} + + + {t("ApprovedBankLoanDialog.Table_head_approved_facility_gov")} + + + {t("ApprovedBankLoanDialog.Table_head_approved_facility_person")} + + {t("ApprovedBankLoanDialog.Table_head_contract_date")} + + {t("ApprovedBankLoanDialog.Table_head_contract_facility_bank")} + + + {t("ApprovedBankLoanDialog.Table_head_contract_facility_gov")} + + + {t("ApprovedBankLoanDialog.Table_head_contract_facility_person")} + + {t("ApprovedBankLoanDialog.Table_head_due_date")} + + + + + + {ApprovedBankDetail.approved_date + ? moment(ApprovedBankDetail.approved_date) + .locale("fa") + .format("HH:mm | yyyy/MM/DD") + : null} + + {ApprovedBankDetail.approved_facility_bank} + {ApprovedBankDetail.approved_facility_gov} + {ApprovedBankDetail.approved_facility_person} + + {ApprovedBankDetail.contract_date + ? moment(ApprovedBankDetail.contract_date) + .locale("fa") + .format("HH:mm | yyyy/MM/DD") + : null} + + {ApprovedBankDetail.contract_facility_bank} + {ApprovedBankDetail.contract_facility_gov} + {ApprovedBankDetail.contract_facility_person} + + {ApprovedBankDetail.due_date + ? moment(ApprovedBankDetail.due_date) + .locale("fa") + .format("HH:mm | yyyy/MM/DD") + : null} + + + +
+
+
+ )} +
+ ); +}; +export default ApprovedBankLoanContent; diff --git a/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/index.jsx b/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/index.jsx new file mode 100644 index 0000000..95aa169 --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/ApprovedBankLoan/index.jsx @@ -0,0 +1,43 @@ +import { Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; +import GavelIcon from "@mui/icons-material/Gavel"; +import ApprovedBankLoanContent from "./ApprovedBankLoanContent"; + +const ApprovedBankLoan = ({ rowId }) => { + const t = useTranslations(); + const [openApprovedBankLoanDialog, setOpenApprovedBankLoanDialog] = useState(false); + return ( + <> + + setOpenApprovedBankLoanDialog(true)}> + + + + + {t("ApprovedBankLoanDialog.approved-bank-loan")} + + + + + + + ); +}; +export default ApprovedBankLoan; diff --git a/src/components/dashboard/loan-followup/Form/BankPayment/BankPaymentContent.jsx b/src/components/dashboard/loan-followup/Form/BankPayment/BankPaymentContent.jsx new file mode 100644 index 0000000..35c3e8c --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/BankPayment/BankPaymentContent.jsx @@ -0,0 +1,97 @@ +import { + Box, + DialogContent, + LinearProgress, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, +} from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useEffect, useState } from "react"; +import useRequest from "@/lib/app/hooks/useRequest"; +import { GET_BANK_PAYMENT } from "@/core/data/apiRoutes"; +import moment from "jalali-moment"; + +const BankPaymentContent = ({ rowId }) => { + const t = useTranslations(); + const requestServer = useRequest({ auth: true, notification: false }); + const [BankPaymentDetail, setBankPaymentDetail] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(false); + useEffect(() => { + requestServer(`${GET_BANK_PAYMENT}/${rowId}`, "get") + .then((res) => { + setBankPaymentDetail(res.data.data); + setIsLoading(false); + }) + .catch((error) => { + setError(true); + }); + }, []); + + return ( + + {error ? ( + + {t("LoanHistory.Table_history_error")} + + ) : isLoading ? ( + + ) : ( + + + + + + {t("BankPaymentDialog.Table_head_installment_number")} + {t("BankPaymentDialog.Table_head_remaining_facility")} + {t("BankPaymentDialog.Table_head_paid_facility")} + {t("BankPaymentDialog.Table_head_paid_date")} + + + + + {BankPaymentDetail.installment_number} + {BankPaymentDetail.paid_facility} + {BankPaymentDetail.remaining_facility} + + {BankPaymentDetail.paid_date + ? moment(BankPaymentDetail.paid_date) + .locale("fa") + .format("HH:mm | yyyy/MM/DD") + : null} + + + +
+
+
+ )} +
+ ); +}; +export default BankPaymentContent; diff --git a/src/components/dashboard/loan-followup/Form/BankPayment/index.jsx b/src/components/dashboard/loan-followup/Form/BankPayment/index.jsx new file mode 100644 index 0000000..8a35acf --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/BankPayment/index.jsx @@ -0,0 +1,43 @@ +import { Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; +import PaidIcon from "@mui/icons-material/Paid"; +import BankPaymentContent from "./BankPaymentContent"; + +const BankPayment = ({ rowId }) => { + const t = useTranslations(); + const [openBankPaymentDialog, setOpenBankPaymentDialog] = useState(false); + return ( + <> + + setOpenBankPaymentDialog(true)}> + + + + + {t("BankPaymentDialog.bank-payment")} + + + + + + + ); +}; +export default BankPayment; diff --git a/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/ComebackLoanDetailContent.jsx b/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/ComebackLoanDetailContent.jsx new file mode 100644 index 0000000..c2badb9 --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/ComebackLoanDetailContent.jsx @@ -0,0 +1,95 @@ +import { + Box, + DialogContent, + LinearProgress, + Paper, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, +} from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useEffect, useState } from "react"; +import useRequest from "@/lib/app/hooks/useRequest"; +import { GET_COMEBACK_LOAN_DETAIL } from "@/core/data/apiRoutes"; +import moment from "jalali-moment"; + +const ComebackLoanDetailContent = ({ rowId }) => { + const t = useTranslations(); + const requestServer = useRequest({ auth: true, notification: false }); + const [ComebackLoanDetail, setComebackLoanDetail] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(false); + useEffect(() => { + requestServer(`${GET_COMEBACK_LOAN_DETAIL}/${rowId}`, "get") + .then((res) => { + setComebackLoanDetail(res.data.data); + setIsLoading(false); + }) + .catch((error) => { + setError(true); + }); + }, []); + + return ( + + {error ? ( + + {t("LoanHistory.Table_history_error")} + + ) : isLoading ? ( + + ) : ( + + + + + + {t("ComebackLoanDetailDialog.Table_head_comeback_name")} + {t("ComebackLoanDetailDialog.Table_head_comeback_comment")} + {t("ComebackLoanDetailDialog.Table_head_comeback_date")} + + + + + {ComebackLoanDetail.comeback_name} + {ComebackLoanDetail.comeback_comment} + + {ComebackLoanDetail.comeback_date + ? moment(ComebackLoanDetail.comeback_date) + .locale("fa") + .format("HH:mm | yyyy/MM/DD") + : null} + + + +
+
+
+ )} +
+ ); +}; +export default ComebackLoanDetailContent; diff --git a/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/index.jsx b/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/index.jsx new file mode 100644 index 0000000..c83895c --- /dev/null +++ b/src/components/dashboard/loan-followup/Form/ComebackLoanDetail/index.jsx @@ -0,0 +1,43 @@ +import { Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; +import SyncAltIcon from "@mui/icons-material/SyncAlt"; +import ComebackLoanDetailContent from "./ComebackLoanDetailContent"; + +const ComebackLoanDetail = ({ rowId }) => { + const t = useTranslations(); + const [openComebackLoanDetailDialog, setOpenComebackLoanDetailDialog] = useState(false); + return ( + <> + + setOpenComebackLoanDetailDialog(true)}> + + + + + {t("ComebackLoanDetailDialog.comeback-loan-detail")} + + + + + + + ); +}; +export default ComebackLoanDetail; diff --git a/src/components/dashboard/loan-followup/TableRowActions.jsx b/src/components/dashboard/loan-followup/TableRowActions.jsx index 20e4b4f..352246d 100644 --- a/src/components/dashboard/loan-followup/TableRowActions.jsx +++ b/src/components/dashboard/loan-followup/TableRowActions.jsx @@ -2,12 +2,26 @@ import { Box } from "@mui/material"; import ReferPassengerBoss from "@/components/dashboard/loan-followup/Form/ReferPassengerBoss"; import UserInfoForm from "./Form/UserInfoForm"; import PlanningCouncilForm from "@/components/dashboard/loan-followup/Form/PlanningCouncilForm"; +import ComebackLoanDetail from "@/components/dashboard/loan-followup/Form/ComebackLoanDetail"; +import BankPayment from "@/components/dashboard/loan-followup/Form/BankPayment"; +import ApprovedBankLoan from "@/components/dashboard/loan-followup/Form/ApprovedBankLoan"; const TableRow = ({ row, mutate }) => { return ( - + {[11, 12, 13, 14, 15, 16].includes(row.original.state_id) && ( + + )} + + {row.original.state_id === 16 && } + + {row.original.state_id === 15 && } + + {row.original.state_id === 14 || row.original.state_id === 15 ? ( + + ) : null} + {row.original.state_id === 11 || row.original.state_id === 16 ? ( ) : null} diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js index 7886e5b..4be881d 100644 --- a/src/core/data/apiRoutes.js +++ b/src/core/data/apiRoutes.js @@ -39,6 +39,9 @@ export const EXPORT_PASSENGER_BOSS_DETAILS = BASE_URL + "/dashboard/province_wor export const GET_LOAN_FOLLOWUP = BASE_URL + "/dashboard/vezarat_loan_tracking/"; export const REFER_LOAN_FOLLOWUP_PASSENGERBOSS = BASE_URL + "/dashboard/vezarat_loan_tracking/refer"; export const GET_HISTORY_COUNCIL = BASE_URL + "/dashboard/vezarat_loan_tracking/planning_council_loan"; +export const GET_COMEBACK_LOAN_DETAIL = BASE_URL + "/dashboard/vezarat_loan_tracking/comeback_loan"; +export const GET_BANK_PAYMENT = BASE_URL + "/dashboard/vezarat_loan_tracking/bank_payment_loan"; +export const GET_APPROVED_BANK_LOAN = BASE_URL + "/dashboard/vezarat_loan_tracking/approved_loan"; //transportation assistance export const GET_TRANSPORTATION_ASSISTANCE = BASE_URL + "/dashboard/transportation_assistant/show"; diff --git a/src/layouts/MuiLayout.jsx b/src/layouts/MuiLayout.jsx index 53fe430..0b4066f 100644 --- a/src/layouts/MuiLayout.jsx +++ b/src/layouts/MuiLayout.jsx @@ -38,10 +38,10 @@ const MuiLayout = ({ children, isBot }) => { borderRadius: "4px", }, " input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button ": - { - "-webkit-appearance": "none", - margin: 0, - }, + { + "-webkit-appearance": "none", + margin: 0, + }, " input[type='number']": { "-moz-appearance": "textfield", },