Bläddra i källkod

update report & access right

tags/Baseline_30082024_FRONTEND_UAT
cyril.tsui 1 år sedan
förälder
incheckning
7c5fdda7f8
9 ändrade filer med 36 tillägg och 33 borttagningar
  1. +1
    -1
      src/components/CompanySearch/CompanySearch.tsx
  2. +2
    -0
      src/components/GenerateProjectPandLReport/GenerateProjectPandLReport.tsx
  3. +3
    -2
      src/components/GenerateProjectPandLReport/GenerateProjectPandLReportWrapper.tsx
  4. +3
    -1
      src/components/NavigationContent/NavigationContent.tsx
  5. +4
    -2
      src/components/Report/FinancialStatusReportGen/FinancialStatusReportGen.tsx
  6. +3
    -2
      src/components/Report/FinancialStatusReportGen/FinancialStatusReportGenWrapper.tsx
  7. +9
    -20
      src/components/Report/LateStartReportGen/LateStartReportGen.tsx
  8. +10
    -4
      src/components/Report/LateStartReportGen/LateStartReportGenWrapper.tsx
  9. +1
    -1
      src/middleware.ts

+ 1
- 1
src/components/CompanySearch/CompanySearch.tsx Visa fil

@@ -65,7 +65,7 @@ const CompanySearch: React.FC<Props> = ({ companys }) => {
},
{ name: "companyCode", label: t("Company Code") },
{ name: "name", label: t("Company Name") },
{ name: "brNo", label: t("brNo") },
{ name: "brNo", label: t("Br No.") },
{ name: "contactName", label: t("Contact Name") },
{ name: "phone", label: t("Contact No.") },
{ name: "email", label: t("Contact Email") },


+ 2
- 0
src/components/GenerateProjectPandLReport/GenerateProjectPandLReport.tsx Visa fil

@@ -10,6 +10,8 @@ import { downloadFile } from "@/app/utils/commonUtil";
import { dateTypeCombo } from "@/app/utils/comboUtil";
import { FormHelperText } from "@mui/material";
import { errorDialog, errorDialogWithContent } from "../Swal/CustomAlerts";
import { TeamResult } from "@/app/api/team";
import { SessionStaff } from "@/config/authConfig";

interface Props {
projects: ProjectResult[];


+ 3
- 2
src/components/GenerateProjectPandLReport/GenerateProjectPandLReportWrapper.tsx Visa fil

@@ -2,15 +2,16 @@ import React from "react";
import GenerateProjectPandLReportLoading from "./GenerateProjectPandLReportLoading";
import { fetchProjects } from "@/app/api/projects";
import GenerateProjectPandLReport from "./GenerateProjectPandLReport";
import { getUserStaff } from "@/app/utils/commonUtil";

interface SubComponents {
Loading: typeof GenerateProjectPandLReportLoading;
}

const GenerateProjectPandLReportWrapper: React.FC & SubComponents = async () => {
const projects = await fetchProjects();
const [projects, userStaff] = await Promise.all([fetchProjects(), getUserStaff()]);

return <GenerateProjectPandLReport projects={projects} />;
return <GenerateProjectPandLReport projects={userStaff?.teamId ? projects.filter(project => project.teamId === userStaff.teamId) : projects}/>;
};

GenerateProjectPandLReportWrapper.Loading = GenerateProjectPandLReportLoading;


+ 3
- 1
src/components/NavigationContent/NavigationContent.tsx Visa fil

@@ -36,6 +36,8 @@ import ManageAccountsIcon from "@mui/icons-material/ManageAccounts";
import EmojiEventsIcon from "@mui/icons-material/EmojiEvents";
import {
GENERATE_REPORTS,
IMPORT_INVOICE,
IMPORT_RECEIPT,
MAINTAIN_MASTERDATA,
MAINTAIN_PROJECT,
MAINTAIN_TASK_TEMPLATE,
@@ -140,7 +142,7 @@ const NavigationContent: React.FC<Props> = ({ abilities }) => {
icon: <Payments />,
label: "Invoice",
path: "/invoice",
isHidden: ![VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) =>
isHidden: ![IMPORT_INVOICE, IMPORT_RECEIPT].some((ability) =>
abilities!.includes(ability),
),
},


+ 4
- 2
src/components/Report/FinancialStatusReportGen/FinancialStatusReportGen.tsx Visa fil

@@ -9,22 +9,24 @@ import { FinancialStatusReportFilter } from "@/app/api/reports";
import { fetchAllClientSubsidiaryProjects } from "@/app/api/clientprojects/actions";
import { fetchProjectsFinancialStatusReport } from "@/app/api/reporte1/action";
import { downloadFile } from "@/app/utils/commonUtil";
import { SessionStaff } from "@/config/authConfig";
//import { DownloadReportButton } from './DownloadReportButton';
interface Props {
projects: FinancialStatus[];
teamCombo : TeamCombo[];
userStaff: SessionStaff;
}
type SearchQuery = Partial<Omit<TeamCombo, "id">>;
type SearchParamNames = keyof SearchQuery;

const GenFinancialStatusReport: React.FC<Props> = ({ projects, teamCombo }) => {
const GenFinancialStatusReport: React.FC<Props> = ({ projects, teamCombo, userStaff }) => {
const { t } = useTranslation("projects");

const combo = teamCombo.map(combo => {return `${combo.code} - ${combo.name}`})

const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
() => [
{ label: t("Team"), paramName: "code", type: "select", options: combo, },
{ label: t("Team"), paramName: "code", type: "select", options: combo, needAll: !Boolean(userStaff.isTeamLead) },
// {
// label: "Status",
// label2: "Remained Date To",


+ 3
- 2
src/components/Report/FinancialStatusReportGen/FinancialStatusReportGenWrapper.tsx Visa fil

@@ -3,6 +3,7 @@ import { fetchProjectsFinancialStatus, fetchTeamCombo } from "@/app/api/reporte1
import React from "react";
import FinancialStatusReportGen from "./FinancialStatusReportGen";
import FinancialStatusReportGenLoading from "./FinancialStatusReportGenLoading";
import { getUserStaff } from "@/app/utils/commonUtil";

interface SubComponents {
Loading: typeof FinancialStatusReportGenLoading;
@@ -11,9 +12,9 @@ interface SubComponents {
const FinancialStatusReportGenWrapper: React.FC & SubComponents = async () => {
const clentprojects = await fetchProjectsFinancialStatus();

const teamCombo = await fetchTeamCombo()
const [teamCombo, userStaff] = await Promise.all([fetchTeamCombo(), getUserStaff()])

return <FinancialStatusReportGen projects={clentprojects} teamCombo={teamCombo}/>;
return <FinancialStatusReportGen projects={clentprojects} userStaff={userStaff} teamCombo={!Boolean(userStaff?.isTeamLead) ? teamCombo : teamCombo.filter(team => team.id === userStaff?.teamId)}/>;
};

FinancialStatusReportGenWrapper.Loading = FinancialStatusReportGenLoading;


+ 9
- 20
src/components/Report/LateStartReportGen/LateStartReportGen.tsx Visa fil

@@ -8,37 +8,30 @@ import { LateStart } from "@/app/api/report";
import { apiPath } from '../../../auth/utils';
import { fetchTeamCombo } from "@/app/api/team/actions";
import SearchBox, { Criterion } from "@/components/SearchBox";
import { combo, comboProp } from "@/app/api/team";
import { TeamResult, combo, comboProp } from "@/app/api/team";
import { Customer } from "@/app/api/customer";
import { downloadFile } from "@/app/utils/commonUtil";
import { fetchLateStartReport } from "@/app/api/reports/actions";
import { LateStartReportRequest } from "@/app/api/reports";
import { Subsidiary } from "@/app/api/subsidiary";
import { SessionStaff } from "@/config/authConfig";
//import { GET_QC_CATEGORY_COMBO } from 'utils/ApiPathConst';
interface Props {
teams: TeamResult[];
projects: LateStart[];
clients: Customer[];
subsidiaries: Subsidiary[];
userStaff: SessionStaff;
}
type SearchQuery = Partial<Omit<LateStartReportRequest, "id">>;
type SearchParamNames = keyof SearchQuery;

const ProgressByClientSearch: React.FC<Props> = ({ projects, clients,subsidiaries }) => {
const ProgressByClientSearch: React.FC<Props> = ({ teams, userStaff, projects, clients,subsidiaries }) => {
//console.log(customers)
const { t } = useTranslation("projects");
const [teamCombo, setteamCombo] = useState<comboProp[]>([])
const teamCombo = teams.map(team => `${team.code} - ${team.name}`)
const [isLoading, setIsLoading] = useState(true)

const getTeamCombo = async() => {
try {
const response = await fetchTeamCombo()
console.log(response.records)
setteamCombo(response.records)
setIsLoading(false)
} catch (err) {
console.log(err)
}
}
const clientCombo = clients.map(client => ({
value: `client: ${client.id}` ,
label: `${client.code} - ${client.name}`,
@@ -51,13 +44,9 @@ const subsidiaryCombo = subsidiaries.map(subsidiary => ({
group: t("Subsidiary")
}))

useEffect(() => {
getTeamCombo()
}, [])

const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
() => [
{ label: "Team", paramName: "teamId", type: "select", options: teamCombo.map(team => team.label) },
{ label: "Team", paramName: "teamId", type: "select", options: teamCombo, needAll: !Boolean(userStaff?.isTeamLead) },
//{ label: "Client", paramName: "clientId", type: "autocomplete", options: clients.map(customer => `${customer.code}-${customer.name}`) },
{ label: t("Client"), paramName: "clientId", type: "autocomplete", options: [...subsidiaryCombo, ...clientCombo] },
{
@@ -67,7 +56,7 @@ const subsidiaryCombo = subsidiaries.map(subsidiary => ({
type: "dateRange",
},
],
[t, teamCombo, clients],
[t, teamCombo, clients, userStaff],
);

return (
@@ -81,7 +70,7 @@ const subsidiaryCombo = subsidiaries.map(subsidiary => ({
try {
// const teamId = teamCombo.find(team => team.label === query.teamId)?.id!!
// const clientId = customers.find(customer => `${customer.code}-${customer.name}` === query.clientId)?.id!!
const teamId = teamCombo.find(team => team.label === query.teamId)?.id || 0;
const teamId = teams.find(team => `${team.code} - ${team.name}` === query.teamId)?.id || 0;
const clientId = clients.find(customer => `${customer.code}-${customer.name}` === query.clientId)?.id || 0;
const remainedDate = query.remainedDate || "1900-01-01";
const remainedDateTo = query.remainedDateTo || "2100-12-31";


+ 10
- 4
src/components/Report/LateStartReportGen/LateStartReportGenWrapper.tsx Visa fil

@@ -4,17 +4,23 @@ import LateStartReportGen from "./LateStartReportGen";
import LateStartReportGenLoading from "./LateStartReportGenLoading";
import { fetchAllCustomers } from "@/app/api/customer";
import { fetchAllSubsidiaries } from "@/app/api/subsidiary";
import { getUserStaff } from "@/app/utils/commonUtil";
import { fetchTeam } from "@/app/api/team";

interface SubComponents {
Loading: typeof LateStartReportGenLoading;
}

const LateStartReportGenWrapper: React.FC & SubComponents = async () => {
const clentprojects = await fetchProjectsLateStart();
const customers = await fetchAllCustomers();
const subsidiaries = await fetchAllSubsidiaries();
const [clentprojects, customers, subsidiaries, userStaff, teams] = await Promise.all([
fetchProjectsLateStart(),
fetchAllCustomers(),
fetchAllSubsidiaries(),
getUserStaff(),
fetchTeam(),
]);

return <LateStartReportGen projects={clentprojects} clients={customers} subsidiaries={subsidiaries}/>;
return <LateStartReportGen userStaff={userStaff} teams={!Boolean(userStaff?.isTeamLead) ? teams : teams.filter(team => team.id === userStaff?.teamId)} projects={clentprojects} clients={customers} subsidiaries={subsidiaries}/>;
};

LateStartReportGenWrapper.Loading = LateStartReportGenLoading;


+ 1
- 1
src/middleware.ts Visa fil

@@ -124,7 +124,7 @@ export default async function middleware(
isAuth = [VIEW_STAFF_PROFILE].some((ability) => abilities.includes(ability));
}
if (req.nextUrl.pathname.startsWith('/invoice')) {
isAuth = [IMPORT_INVOICE].some((ability) => abilities.includes(ability));
isAuth = [IMPORT_INVOICE, IMPORT_RECEIPT].some((ability) => abilities.includes(ability));
}
if (req.nextUrl.pathname.startsWith('/dashboard')) {
isAuth = [VIEW_DASHBOARD_ALL, VIEW_DASHBOARD_SELF].some((ability) => abilities.includes(ability));


Laddar…
Avbryt
Spara