251208:0010 Backend & Frontend Debug
Some checks failed
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled

This commit is contained in:
2025-12-08 00:10:37 +07:00
parent 32d820ea6b
commit dcd126d704
99 changed files with 2775 additions and 1480 deletions

View File

@@ -1,85 +0,0 @@
import { Correspondence, CreateCorrespondenceDto } from "@/types/correspondence";
// Mock Data
const mockCorrespondences: Correspondence[] = [
{
correspondence_id: 1,
document_number: "LCBP3-COR-001",
subject: "Submission of Monthly Report - Jan 2025",
description: "Please find attached the monthly progress report.",
status: "PENDING",
importance: "NORMAL",
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
from_organization_id: 1,
to_organization_id: 2,
document_type_id: 1,
from_organization: { id: 1, org_name: "Contractor A", org_code: "CON-A" },
to_organization: { id: 2, org_name: "Owner", org_code: "OWN" },
},
{
correspondence_id: 2,
document_number: "LCBP3-COR-002",
subject: "Request for Information regarding Foundation",
description: "Clarification needed on drawing A-101.",
status: "IN_REVIEW",
importance: "HIGH",
created_at: new Date(Date.now() - 86400000).toISOString(),
updated_at: new Date(Date.now() - 86400000).toISOString(),
from_organization_id: 2,
to_organization_id: 1,
document_type_id: 1,
from_organization: { id: 2, org_name: "Owner", org_code: "OWN" },
to_organization: { id: 1, org_name: "Contractor A", org_code: "CON-A" },
},
];
export const correspondenceApi = {
getAll: async (params?: { page?: number; status?: string; search?: string }) => {
// Simulate API delay
await new Promise((resolve) => setTimeout(resolve, 500));
let filtered = [...mockCorrespondences];
if (params?.status) {
filtered = filtered.filter((c) => c.status === params.status);
}
if (params?.search) {
const lowerSearch = params.search.toLowerCase();
filtered = filtered.filter((c) =>
c.subject.toLowerCase().includes(lowerSearch) ||
c.document_number.toLowerCase().includes(lowerSearch)
);
}
return {
items: filtered,
total: filtered.length,
page: params?.page || 1,
totalPages: 1,
};
},
getById: async (id: number) => {
await new Promise((resolve) => setTimeout(resolve, 500));
return mockCorrespondences.find((c) => c.correspondence_id === id);
},
create: async (data: CreateCorrespondenceDto) => {
await new Promise((resolve) => setTimeout(resolve, 1000));
const newId = Math.max(...mockCorrespondences.map((c) => c.correspondence_id)) + 1;
const newCorrespondence: Correspondence = {
correspondence_id: newId,
document_number: `LCBP3-COR-00${newId}`,
...data,
status: "DRAFT",
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
// Mock organizations for display
from_organization: { id: data.from_organization_id, org_name: "Mock Org From", org_code: "MOCK" },
to_organization: { id: data.to_organization_id, org_name: "Mock Org To", org_code: "MOCK" },
} as Correspondence; // Casting for simplicity in mock
mockCorrespondences.unshift(newCorrespondence);
return newCorrespondence;
},
};

View File

@@ -1,119 +0,0 @@
import { Drawing, CreateDrawingDto, DrawingRevision } from "@/types/drawing";
// Mock Data
const mockDrawings: Drawing[] = [
{
drawing_id: 1,
drawing_number: "A-101",
title: "Ground Floor Plan",
type: "CONTRACT",
discipline_id: 2,
discipline: { id: 2, discipline_code: "ARC", discipline_name: "Architecture" },
sheet_number: "01",
scale: "1:100",
current_revision: "0",
issue_date: new Date(Date.now() - 100000000).toISOString(),
revision_count: 1,
revisions: [
{
revision_id: 1,
revision_number: "0",
revision_date: new Date(Date.now() - 100000000).toISOString(),
revision_description: "Issued for Construction",
revised_by_name: "John Doe",
file_url: "/mock-drawing.pdf",
is_current: true,
},
],
},
{
drawing_id: 2,
drawing_number: "S-201",
title: "Foundation Details",
type: "SHOP",
discipline_id: 1,
discipline: { id: 1, discipline_code: "STR", discipline_name: "Structure" },
sheet_number: "05",
scale: "1:50",
current_revision: "B",
issue_date: new Date().toISOString(),
revision_count: 2,
revisions: [
{
revision_id: 3,
revision_number: "B",
revision_date: new Date().toISOString(),
revision_description: "Updated reinforcement",
revised_by_name: "Jane Smith",
file_url: "/mock-drawing-v2.pdf",
is_current: true,
},
{
revision_id: 2,
revision_number: "A",
revision_date: new Date(Date.now() - 50000000).toISOString(),
revision_description: "First Submission",
revised_by_name: "Jane Smith",
file_url: "/mock-drawing-v1.pdf",
is_current: false,
},
],
},
];
export const drawingApi = {
getAll: async (params?: { type?: "CONTRACT" | "SHOP"; search?: string }) => {
await new Promise((resolve) => setTimeout(resolve, 500));
let filtered = [...mockDrawings];
if (params?.type) {
filtered = filtered.filter((d) => d.type === params.type);
}
if (params?.search) {
const lowerSearch = params.search.toLowerCase();
filtered = filtered.filter((d) =>
d.drawing_number.toLowerCase().includes(lowerSearch) ||
d.title.toLowerCase().includes(lowerSearch)
);
}
return filtered;
},
getById: async (id: number) => {
await new Promise((resolve) => setTimeout(resolve, 500));
return mockDrawings.find((d) => d.drawing_id === id);
},
create: async (data: CreateDrawingDto) => {
await new Promise((resolve) => setTimeout(resolve, 1000));
const newId = Math.max(...mockDrawings.map((d) => d.drawing_id)) + 1;
const newDrawing: Drawing = {
drawing_id: newId,
drawing_number: data.drawing_number,
title: data.title,
type: data.drawing_type,
discipline_id: data.discipline_id,
discipline: { id: data.discipline_id, discipline_code: "MOCK", discipline_name: "Mock Discipline" },
sheet_number: data.sheet_number,
scale: data.scale,
current_revision: "0",
issue_date: new Date().toISOString(),
revision_count: 1,
revisions: [
{
revision_id: newId * 10,
revision_number: "0",
revision_date: new Date().toISOString(),
revision_description: "Initial Upload",
revised_by_name: "Current User",
file_url: "#",
is_current: true,
}
]
};
mockDrawings.unshift(newDrawing);
return newDrawing;
},
};

View File

@@ -1,98 +0,0 @@
import { RFA, CreateRFADto, RFAItem } from "@/types/rfa";
// Mock Data
const mockRFAs: RFA[] = [
{
rfa_id: 1,
rfa_number: "LCBP3-RFA-001",
subject: "Approval for Concrete Mix Design",
description: "Requesting approval for the proposed concrete mix design for foundations.",
contract_id: 1,
discipline_id: 1,
status: "PENDING",
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
contract_name: "Main Construction Contract",
discipline_name: "Civil",
items: [
{ id: 1, item_no: "1.1", description: "Concrete Mix Type A", quantity: 1, unit: "Lot", status: "PENDING" },
{ id: 2, item_no: "1.2", description: "Concrete Mix Type B", quantity: 1, unit: "Lot", status: "PENDING" },
],
},
{
rfa_id: 2,
rfa_number: "LCBP3-RFA-002",
subject: "Approval for Steel Reinforcement Shop Drawings",
description: "Shop drawings for Zone A foundations.",
contract_id: 1,
discipline_id: 2,
status: "APPROVED",
created_at: new Date(Date.now() - 172800000).toISOString(),
updated_at: new Date(Date.now() - 86400000).toISOString(),
contract_name: "Main Construction Contract",
discipline_name: "Structural",
items: [
{ id: 3, item_no: "1", description: "Shop Drawing Set A", quantity: 1, unit: "Set", status: "APPROVED" },
],
},
];
export const rfaApi = {
getAll: async (params?: { page?: number; status?: string; search?: string }) => {
await new Promise((resolve) => setTimeout(resolve, 500));
let filtered = [...mockRFAs];
if (params?.status) {
filtered = filtered.filter((r) => r.status === params.status);
}
if (params?.search) {
const lowerSearch = params.search.toLowerCase();
filtered = filtered.filter((r) =>
r.subject.toLowerCase().includes(lowerSearch) ||
r.rfa_number.toLowerCase().includes(lowerSearch)
);
}
return {
items: filtered,
total: filtered.length,
page: params?.page || 1,
totalPages: 1,
};
},
getById: async (id: number) => {
await new Promise((resolve) => setTimeout(resolve, 500));
return mockRFAs.find((r) => r.rfa_id === id);
},
create: async (data: CreateRFADto) => {
await new Promise((resolve) => setTimeout(resolve, 1000));
const newId = Math.max(...mockRFAs.map((r) => r.rfa_id)) + 1;
const newRFA: RFA = {
rfa_id: newId,
rfa_number: `LCBP3-RFA-00${newId}`,
...data,
status: "DRAFT",
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
contract_name: "Mock Contract",
discipline_name: "Mock Discipline",
items: data.items.map((item, index) => ({ ...item, id: index + 1, status: "PENDING" })),
};
mockRFAs.unshift(newRFA);
return newRFA;
},
updateStatus: async (id: number, status: RFA['status'], comments?: string) => {
await new Promise((resolve) => setTimeout(resolve, 800));
const rfa = mockRFAs.find((r) => r.rfa_id === id);
if (rfa) {
rfa.status = status;
rfa.updated_at = new Date().toISOString();
// In a real app, we'd log the comments and history
}
return rfa;
},
};

View File

@@ -1,79 +0,0 @@
import { SearchResult, SearchFilters } from "@/types/search";
// Mock Data
const mockResults: SearchResult[] = [
{
id: 1,
type: "correspondence",
title: "Submission of Monthly Report - Jan 2025",
description: "Please find attached the monthly progress report.",
status: "PENDING",
documentNumber: "LCBP3-COR-001",
createdAt: new Date().toISOString(),
highlight: "Submission of <b>Monthly Report</b> - Jan 2025",
},
{
id: 1,
type: "rfa",
title: "Approval for Concrete Mix Design",
description: "Requesting approval for the proposed concrete mix design.",
status: "PENDING",
documentNumber: "LCBP3-RFA-001",
createdAt: new Date().toISOString(),
highlight: "Approval for <b>Concrete Mix</b> Design",
},
{
id: 1,
type: "drawing",
title: "Ground Floor Plan",
description: "Architectural ground floor plan.",
status: "APPROVED",
documentNumber: "A-101",
createdAt: new Date(Date.now() - 100000000).toISOString(),
highlight: "Ground Floor <b>Plan</b>",
},
{
id: 2,
type: "correspondence",
title: "Request for Information regarding Foundation",
description: "Clarification needed on drawing A-101.",
status: "IN_REVIEW",
documentNumber: "LCBP3-COR-002",
createdAt: new Date(Date.now() - 86400000).toISOString(),
},
];
export const searchApi = {
search: async (filters: SearchFilters) => {
await new Promise((resolve) => setTimeout(resolve, 600));
let results = [...mockResults];
if (filters.query) {
const lowerQuery = filters.query.toLowerCase();
results = results.filter((r) =>
r.title.toLowerCase().includes(lowerQuery) ||
r.documentNumber.toLowerCase().includes(lowerQuery) ||
r.description?.toLowerCase().includes(lowerQuery)
);
}
if (filters.types && filters.types.length > 0) {
results = results.filter((r) => filters.types?.includes(r.type));
}
if (filters.statuses && filters.statuses.length > 0) {
results = results.filter((r) => filters.statuses?.includes(r.status));
}
return results;
},
suggest: async (query: string) => {
await new Promise((resolve) => setTimeout(resolve, 300));
const lowerQuery = query.toLowerCase();
return mockResults
.filter((r) => r.title.toLowerCase().includes(lowerQuery))
.slice(0, 5);
},
};