feat: update contract handling to include customer contract number and improve status filtering

This commit is contained in:
2025-12-03 22:04:48 +01:00
parent 5b794a59bc
commit 5abacdc8e1
2 changed files with 18 additions and 14 deletions

View File

@@ -10,6 +10,7 @@ async function getContractsHandler() {
contract_id, contract_id,
contract_number, contract_number,
contract_name, contract_name,
customer_contract_number,
customer, customer,
investor, investor,
date_signed, date_signed,

View File

@@ -19,8 +19,8 @@ export default function ContractsMainPage() {
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [searchTerm, setSearchTerm] = useState(""); const [searchTerm, setSearchTerm] = useState("");
const [filteredContracts, setFilteredContracts] = useState([]); const [filteredContracts, setFilteredContracts] = useState([]);
const [sortBy, setSortBy] = useState("contract_number"); const [sortBy, setSortBy] = useState("date_signed");
const [sortOrder, setSortOrder] = useState("asc"); const [sortOrder, setSortOrder] = useState("desc");
const [statusFilter, setStatusFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all");
useEffect(() => { useEffect(() => {
@@ -53,6 +53,9 @@ export default function ContractsMainPage() {
contract.contract_name contract.contract_name
?.toLowerCase() ?.toLowerCase()
.includes(searchTerm.toLowerCase()) || .includes(searchTerm.toLowerCase()) ||
contract.customer_contract_number
?.toLowerCase()
.includes(searchTerm.toLowerCase()) ||
contract.customer?.toLowerCase().includes(searchTerm.toLowerCase()) || contract.customer?.toLowerCase().includes(searchTerm.toLowerCase()) ||
contract.investor?.toLowerCase().includes(searchTerm.toLowerCase()) contract.investor?.toLowerCase().includes(searchTerm.toLowerCase())
); );
@@ -64,9 +67,9 @@ export default function ContractsMainPage() {
filtered = filtered.filter((contract) => { filtered = filtered.filter((contract) => {
if (statusFilter === "active" && contract.finish_date) { if (statusFilter === "active" && contract.finish_date) {
return new Date(contract.finish_date) >= currentDate; return new Date(contract.finish_date) >= currentDate;
} else if (statusFilter === "completed" && contract.finish_date) { } else if (statusFilter === "expired" && contract.finish_date) {
return new Date(contract.finish_date) < currentDate; return new Date(contract.finish_date) < currentDate;
} else if (statusFilter === "no_end_date") { } else if (statusFilter === "ongoing") {
return !contract.finish_date; return !contract.finish_date;
} }
return true; return true;
@@ -117,27 +120,27 @@ export default function ContractsMainPage() {
const active = contracts.filter( const active = contracts.filter(
(c) => !c.finish_date || new Date(c.finish_date) >= currentDate (c) => !c.finish_date || new Date(c.finish_date) >= currentDate
).length; ).length;
const completed = contracts.filter( const expired = contracts.filter(
(c) => c.finish_date && new Date(c.finish_date) < currentDate (c) => c.finish_date && new Date(c.finish_date) < currentDate
).length; ).length;
const withoutEndDate = contracts.filter((c) => !c.finish_date).length; const withoutEndDate = contracts.filter((c) => !c.finish_date).length;
return { total, active, completed, withoutEndDate }; return { total, active, expired, withoutEndDate };
}; };
const getContractStatus = (contract) => { const getContractStatus = (contract) => {
if (!contract.finish_date) return "ongoing"; if (!contract.finish_date) return "ongoing";
const currentDate = new Date(); const currentDate = new Date();
const finishDate = new Date(contract.finish_date); const finishDate = new Date(contract.finish_date);
return finishDate >= currentDate ? "active" : "completed"; return finishDate >= currentDate ? "active" : "expired";
}; };
const getStatusBadge = (status) => { const getStatusBadge = (status) => {
switch (status) { switch (status) {
case "active": case "active":
return <Badge variant="success">{t('contracts.active')}</Badge>; return <Badge variant="success">{t('contracts.active')}</Badge>;
case "completed": case "expired":
return <Badge variant="secondary">{t('common.completed')}</Badge>; return <Badge variant="danger">{t('contracts.expired')}</Badge>;
case "ongoing": case "ongoing":
return <Badge variant="primary">{t('contracts.withoutEndDate')}</Badge>; return <Badge variant="primary">{t('contracts.withoutEndDate')}</Badge>;
default: default:
@@ -209,8 +212,8 @@ export default function ContractsMainPage() {
options: [ options: [
{ value: "all", label: "Wszystkie" }, { value: "all", label: "Wszystkie" },
{ value: "active", label: "Aktywne" }, { value: "active", label: "Aktywne" },
{ value: "completed", label: "Zakończone" }, { value: "expired", label: "Przeterminowane" },
{ value: "no_end_date", label: "Bez daty końca" }, { value: "ongoing", label: "W trakcie" },
], ],
}, },
{ {
@@ -221,7 +224,7 @@ export default function ContractsMainPage() {
{ value: "contract_number", label: "Numer umowy" }, { value: "contract_number", label: "Numer umowy" },
{ value: "contract_name", label: "Nazwa umowy" }, { value: "contract_name", label: "Nazwa umowy" },
{ value: "customer", label: "Klient" }, { value: "customer", label: "Klient" },
{ value: "start_date", label: "Data rozpoczęcia" }, { value: "date_signed", label: "Data podpisania" },
{ value: "finish_date", label: "Data zakończenia" }, { value: "finish_date", label: "Data zakończenia" },
], ],
}, },
@@ -338,9 +341,9 @@ export default function ContractsMainPage() {
</svg> </svg>
</div> </div>
<div className="ml-4"> <div className="ml-4">
<p className="text-sm font-medium text-gray-600">Zakończone</p> <p className="text-sm font-medium text-gray-600">Przeterminowane</p>
<p className="text-2xl font-bold text-gray-900"> <p className="text-2xl font-bold text-gray-900">
{stats.completed} {stats.expired}
</p> </p>
</div> </div>
</div> </div>