task h.1 adn fix permission

This commit is contained in:
phaichayon
2026-06-16 15:13:14 +07:00
parent 9ae41e4f2c
commit 90ee59d388
29 changed files with 3807 additions and 119 deletions

View File

@@ -1,15 +1,21 @@
import { mutationOptions } from '@tanstack/react-query';
import { getQueryClient } from '@/lib/query-client';
import {
assignEnquiry,
createEnquiry,
createEnquiryFollowup,
deleteEnquiry,
deleteEnquiryFollowup,
reassignEnquiry,
updateEnquiry,
updateEnquiryFollowup
} from './service';
import { enquiryKeys } from './queries';
import type { EnquiryFollowupMutationPayload, EnquiryMutationPayload } from './types';
import type {
EnquiryAssignmentMutationPayload,
EnquiryFollowupMutationPayload,
EnquiryMutationPayload
} from './types';
async function invalidateEnquiryLists() {
await getQueryClient().invalidateQueries({ queryKey: enquiryKeys.lists() });
@@ -65,6 +71,26 @@ export const deleteEnquiryMutation = mutationOptions({
}
});
export const assignEnquiryMutation = mutationOptions({
mutationFn: ({ id, values }: { id: string; values: EnquiryAssignmentMutationPayload }) =>
assignEnquiry(id, values),
onSettled: async (_data, error, variables) => {
if (!error) {
await invalidateEnquiryMutationQueries(variables.id);
}
}
});
export const reassignEnquiryMutation = mutationOptions({
mutationFn: ({ id, values }: { id: string; values: EnquiryAssignmentMutationPayload }) =>
reassignEnquiry(id, values),
onSettled: async (_data, error, variables) => {
if (!error) {
await invalidateEnquiryMutationQueries(variables.id);
}
}
});
export const createEnquiryFollowupMutation = mutationOptions({
mutationFn: ({
enquiryId,

View File

@@ -1,5 +1,6 @@
import { apiClient } from '@/lib/api-client';
import type {
EnquiryAssignmentMutationPayload,
EnquiryDetailResponse,
EnquiryFilters,
EnquiryFollowupMutationPayload,
@@ -51,6 +52,20 @@ export async function deleteEnquiry(id: string) {
});
}
export async function assignEnquiry(id: string, data: EnquiryAssignmentMutationPayload) {
return apiClient<MutationSuccessResponse>(`/crm/enquiries/${id}/assign`, {
method: 'POST',
body: JSON.stringify(data)
});
}
export async function reassignEnquiry(id: string, data: EnquiryAssignmentMutationPayload) {
return apiClient<MutationSuccessResponse>(`/crm/enquiries/${id}/reassign`, {
method: 'POST',
body: JSON.stringify(data)
});
}
export async function getEnquiryFollowups(id: string): Promise<EnquiryFollowupsResponse> {
return apiClient<EnquiryFollowupsResponse>(`/crm/enquiries/${id}/followups`);
}

View File

@@ -28,6 +28,13 @@ export interface EnquiryContactLookup {
isPrimary: boolean;
}
export interface EnquiryAssignableUserLookup {
id: string;
name: string;
membershipRole: 'admin' | 'user';
businessRole: string;
}
export interface EnquiryRecord {
id: string;
organizationId: string;
@@ -52,6 +59,12 @@ export interface EnquiryRecord {
notes: string | null;
isHotProject: boolean;
isActive: boolean;
assignedToUserId: string | null;
assignedToName: string | null;
assignedAt: string | null;
assignedBy: string | null;
assignedByName: string | null;
assignmentRemark: string | null;
createdAt: string;
updatedAt: string;
deletedAt: string | null;
@@ -102,6 +115,7 @@ export interface EnquiryReferenceData {
followupTypes: EnquiryOption[];
customers: EnquiryCustomerLookup[];
contacts: EnquiryContactLookup[];
assignableUsers: EnquiryAssignableUserLookup[];
}
export interface EnquiryFilters {
@@ -174,6 +188,11 @@ export interface EnquiryFollowupMutationPayload {
nextAction?: string;
}
export interface EnquiryAssignmentMutationPayload {
assignedToUserId: string;
remark?: string;
}
export interface EnquiryCustomerRelationItem {
id: string;
code: string;