Bläddra i källkod

update invoice & P&L Report for HO Team

main
cyril.tsui 1 månad sedan
förälder
incheckning
4168d008ba
3 ändrade filer med 41 tillägg och 16 borttagningar
  1. +7
    -1
      src/components/GenerateProjectPandLReport/GenerateProjectPandLReportWrapper.tsx
  2. +34
    -14
      src/components/InvoiceSearch/InvoiceSearch.tsx
  3. +0
    -1
      src/components/InvoiceSearch/InvoiceTable.tsx

+ 7
- 1
src/components/GenerateProjectPandLReport/GenerateProjectPandLReportWrapper.tsx Visa fil

@@ -11,7 +11,13 @@ interface SubComponents {
const GenerateProjectPandLReportWrapper: React.FC & SubComponents = async () => { const GenerateProjectPandLReportWrapper: React.FC & SubComponents = async () => {
const [projects, userStaff] = await Promise.all([fetchProjects(), fetchUserStaff()]); const [projects, userStaff] = await Promise.all([fetchProjects(), fetchUserStaff()]);


return <GenerateProjectPandLReport projects={userStaff?.teamId ? projects.filter(project => project.teamId === userStaff.teamId) : projects}/>;
// console.log(userStaff?.teamId)
// Skip HO Team (id = 7)
const filteredProjects = userStaff?.teamId && userStaff?.teamId !== 7 ?
projects.filter(project => project.teamId === userStaff.teamId)
: projects

return <GenerateProjectPandLReport projects={filteredProjects}/>;
}; };


GenerateProjectPandLReportWrapper.Loading = GenerateProjectPandLReportLoading; GenerateProjectPandLReportWrapper.Loading = GenerateProjectPandLReportLoading;


+ 34
- 14
src/components/InvoiceSearch/InvoiceSearch.tsx Visa fil

@@ -5,7 +5,7 @@ import SearchBox, { Criterion } from "../SearchBox";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import SearchResults, { Column } from "../SearchResults"; import SearchResults, { Column } from "../SearchResults";
import EditNote from "@mui/icons-material/EditNote"; import EditNote from "@mui/icons-material/EditNote";
import { moneyFormatter } from "@/app/utils/formatUtil"
import { moneyFormatter, timestampToDateStringV2 } from "@/app/utils/formatUtil"
import { Button, ButtonGroup, Stack, Tab, Tabs, TabsProps, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, TextField, CardContent, Typography, Divider, Card, ThemeProvider } from "@mui/material"; import { Button, ButtonGroup, Stack, Tab, Tabs, TabsProps, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, TextField, CardContent, Typography, Divider, Card, ThemeProvider } from "@mui/material";
import FileUploadIcon from '@mui/icons-material/FileUpload'; import FileUploadIcon from '@mui/icons-material/FileUpload';
import AddIcon from '@mui/icons-material/Add'; import AddIcon from '@mui/icons-material/Add';
@@ -62,6 +62,8 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
const { t } = useTranslation("Invoice"); const { t } = useTranslation("Invoice");


const [filteredIvoices, setFilterInovices] = useState(invoices); const [filteredIvoices, setFilterInovices] = useState(invoices);
const apiRef = useGridApiRef();
const [autoRedirectToFirstPage, setAutoRedirectToFirstPage] = useState(true);


const searchCriteria: Criterion<SearchParamNames>[] = useMemo( const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
() => [ () => [
@@ -87,6 +89,7 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab


const onReset = useCallback(() => { const onReset = useCallback(() => {
// setFilteredIssuedInvoices(issuedInvoice); // setFilteredIssuedInvoices(issuedInvoice);
setAutoRedirectToFirstPage(() => true)
setFilterInovices(invoices) setFilterInovices(invoices)
}, [invoices]); }, [invoices]);


@@ -282,12 +285,29 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab


const handleSaveDialog = async () => { const handleSaveDialog = async () => {
// setDialogOpen(false); // setDialogOpen(false);
await updateInvoice(selectedRow[0])
const response = await updateInvoice(selectedRow[0])
setDialogOpen(false); setDialogOpen(false);

setAutoRedirectToFirstPage(() => false)
successDialog(t("Update Success"), t).then(() => { successDialog(t("Update Success"), t).then(() => {
window.location.reload()
// window.location.reload()

setFilterInovices((prev) => {
const tempInvoices = [...prev]
const invoiceId = tempInvoices.findIndex((invoice) => invoice.id === response.id)
if (invoiceId >= 0) {
const updatedInvoice = tempInvoices[invoiceId]
updatedInvoice.invoiceNo = response?.invoiceNo
updatedInvoice.issuedAmount = response?.issuedAmount
updatedInvoice.issuedDate = timestampToDateStringV2(response.issuedDate)!!
updatedInvoice.receiptDate = timestampToDateStringV2(response.receiptDate)!!
updatedInvoice.receivedAmount = response?.receivedAmount
tempInvoices[invoiceId] = updatedInvoice
}
return tempInvoices
})
}) })

// console.log(selectedRow[0]) // console.log(selectedRow[0])
// setSelectedRow([]); // setSelectedRow([]);
}; };
@@ -361,7 +381,7 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
{ field: "invoiceNo", headerName: t("Invoice No"), editable: true, flex: 0.5 }, { field: "invoiceNo", headerName: t("Invoice No"), editable: true, flex: 0.5 },
{ field: "projectCode", headerName: t("Project Code"), editable: false, flex: 0.3 }, { field: "projectCode", headerName: t("Project Code"), editable: false, flex: 0.3 },
{ field: "projectName", headerName: t("Project Name"), flex: 1 }, { field: "projectName", headerName: t("Project Name"), flex: 1 },
{ field: "team", headerName: t("Team"), flex: 0.2 },
{ field: "team", headerName: t("Team"), flex: 0.4 },
{ field: "issuedDate", { field: "issuedDate",
headerName: t("Issue Date"), headerName: t("Issue Date"),
editable: true, editable: true,
@@ -450,7 +470,6 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
} }


const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({}); const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({});
const apiRef = useGridApiRef();


const validateInvoiceEntry = ( const validateInvoiceEntry = (
entry: Partial<invoiceList>, entry: Partial<invoiceList>,
@@ -496,18 +515,18 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
(params, event) => { (params, event) => {
// console.log(params.id) // console.log(params.id)
if (validateRow(params.id) !== undefined || !validateRow(params.id)) { if (validateRow(params.id) !== undefined || !validateRow(params.id)) {
setRowModesModel((model) => ({
...model,
[params.id]: { mode: GridRowModes.View},
}));
const row = apiRef.current.getRowWithUpdatedValues( const row = apiRef.current.getRowWithUpdatedValues(
params.id, params.id,
"", "",
) )
console.log(row) console.log(row)
setSelectedRow([{...row}] as invoiceList[])
setSelectedRow(() => [{...row}] as invoiceList[])

setRowModesModel((model) => ({
...model,
[params.id]: { mode: GridRowModes.View},
}));

event.defaultMuiPrevented = true; event.defaultMuiPrevented = true;
} }
// console.log(row) // console.log(row)
@@ -586,6 +605,7 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
&& (query.settled === "All" || (query.settled === t("Settled")) === s.settled) && (query.settled === "All" || (query.settled === t("Settled")) === s.settled)
), ),
); );
setAutoRedirectToFirstPage(() => true)
}} }}
onReset={onReset} onReset={onReset}
/> />
@@ -620,7 +640,7 @@ const InvoiceSearch: React.FC<Props> & SubComponents = ({ invoices, projects, ab
<SearchResults<invoiceList> <SearchResults<invoiceList>
items={filteredIvoices} items={filteredIvoices}
columns={combinedColumns} columns={combinedColumns}
autoRedirectToFirstPage
autoRedirectToFirstPage={autoRedirectToFirstPage}
/> />
</ThemeProvider> </ThemeProvider>
} }


+ 0
- 1
src/components/InvoiceSearch/InvoiceTable.tsx Visa fil

@@ -144,7 +144,6 @@ const InvoiceTable: React.FC<Props> = ({ projects, invoices }) => {
[params.id]: { mode: GridRowModes.View}, [params.id]: { mode: GridRowModes.View},
})); }));
console.log(row)
setSelectedRow((row) => [...row] as any[]) setSelectedRow((row) => [...row] as any[])
event.defaultMuiPrevented = true; event.defaultMuiPrevented = true;
} else { } else {


Laddar…
Avbryt
Spara