126 lines
5.7 KiB
TypeScript
126 lines
5.7 KiB
TypeScript
import { CrudClient } from "../infra/crud-client"
|
|
import type { ApiClientOptions } from "../infra/client"
|
|
import type { ApiOperationResponse, ApiPath, ApiRequestBody, ApiResponse } from "../infra/types"
|
|
import { ApiBaseResponse } from "src/contracts/types"
|
|
|
|
export const JOB_CARD_ROUTES = {
|
|
INDEX: "/api/job-cards",
|
|
BY_ID: "/api/job-cards/{id}",
|
|
CHANGE_DATE: "/api/job-cards/{id}/change-date",
|
|
CHANGE_STATUS: "/api/job-cards/{id}/change-status",
|
|
CHECK_IN: "/api/job-cards/{id}/check-in",
|
|
DELIVERY: "/api/job-cards/{id}/delivery",
|
|
ADD_CUSTOMER_REMARK: "/api/job-cards/{id}/add-customer-remark",
|
|
EDIT_CUSTOMER_REMARK: "/api/job-cards/{id}/edit-customer-remark",
|
|
DELETE_CUSTOMER_REMARK: "/api/job-cards/{id}/delete-customer-remark",
|
|
ADD_SHOP_RECOMMENDATION: "/api/job-cards/{id}/add-shop-recommendation",
|
|
EDIT_SHOP_RECOMMENDATION: "/api/job-cards/{id}/edit-shop-recommendation",
|
|
DELETE_SHOP_RECOMMENDATION: "/api/job-cards/{id}/delete-shop-recommendation",
|
|
ADD_ATTACHMENT: "/api/job-cards/{id}/add-attachment",
|
|
DELETE_ATTACHMENT: "/api/job-cards/{id}/delete-attachment",
|
|
CHANGE_SERVICE_WRITER: "/api/job-cards/{id}/change-service-writer-id",
|
|
CHANGE_SALES_PERSON: "/api/job-cards/{id}/change-sales-person-id",
|
|
GET_PARTS: "/api/job-cards/{id}/get-parts",
|
|
ADD_PART: "/api/job-cards/{id}/add-part",
|
|
UPDATE_PART: "/api/job-cards/{id}/update-part",
|
|
DELETE_PART: "/api/job-cards/{id}/delete-part",
|
|
} as const satisfies Record<string, ApiPath>
|
|
|
|
|
|
export type JobCardShowData = ApiResponse<typeof JOB_CARD_ROUTES.BY_ID, "get">['data'] & {
|
|
purchase_orders_count: number
|
|
bills_count: number
|
|
expenses_count: number
|
|
tasks_count: number
|
|
appointments_count: number
|
|
parts_count: number
|
|
}
|
|
|
|
export class JobCardsClient extends CrudClient<
|
|
typeof JOB_CARD_ROUTES.INDEX,
|
|
typeof JOB_CARD_ROUTES.BY_ID,
|
|
{
|
|
showResponse: ApiBaseResponse<JobCardShowData>
|
|
}
|
|
> {
|
|
constructor(baseUrl?: string, defaultOptions?: ApiClientOptions) {
|
|
super(baseUrl, defaultOptions, JOB_CARD_ROUTES.INDEX, JOB_CARD_ROUTES.BY_ID)
|
|
}
|
|
|
|
async changeDate(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.CHANGE_DATE, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.CHANGE_DATE, payload, { params: { id } })
|
|
}
|
|
|
|
async changeStatus(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.CHANGE_STATUS, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.CHANGE_STATUS, payload, { params: { id } })
|
|
}
|
|
|
|
async checkIn(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.CHECK_IN, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.CHECK_IN, payload, { params: { id } })
|
|
}
|
|
|
|
async delivery(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.DELIVERY, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.DELIVERY, payload, { params: { id } })
|
|
}
|
|
|
|
async addCustomerRemark(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.ADD_CUSTOMER_REMARK, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.ADD_CUSTOMER_REMARK, payload, { params: { id } })
|
|
}
|
|
|
|
async editCustomerRemark(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.EDIT_CUSTOMER_REMARK, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.EDIT_CUSTOMER_REMARK, payload, { params: { id } })
|
|
}
|
|
|
|
async deleteCustomerRemark(id: string, customerRemarkId: number) {
|
|
return this.delete(JOB_CARD_ROUTES.DELETE_CUSTOMER_REMARK, { params: { id }, body: { customer_remark_id: customerRemarkId } } as never)
|
|
}
|
|
|
|
async addShopRecommendation(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.ADD_SHOP_RECOMMENDATION, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.ADD_SHOP_RECOMMENDATION, payload, { params: { id } })
|
|
}
|
|
|
|
async editShopRecommendation(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.EDIT_SHOP_RECOMMENDATION, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.EDIT_SHOP_RECOMMENDATION, payload, { params: { id } })
|
|
}
|
|
|
|
async deleteShopRecommendation(id: string, shopRecommendationId: number) {
|
|
return this.delete(JOB_CARD_ROUTES.DELETE_SHOP_RECOMMENDATION, { params: { id }, body: { shop_recommendation_id: shopRecommendationId } } as never)
|
|
}
|
|
|
|
async addAttachment(id: string, files: File[]) {
|
|
const fd = new FormData()
|
|
for (const file of files) {
|
|
fd.append("attachments[]", file)
|
|
}
|
|
return this.postFormData(`/api/job-cards/${id}/add-attachment`, fd)
|
|
}
|
|
|
|
async deleteAttachment(id: string, attachmentId: number) {
|
|
return this.post(JOB_CARD_ROUTES.DELETE_ATTACHMENT, { attachment_id: attachmentId } as never, { params: { id } })
|
|
}
|
|
|
|
async changeServiceWriter(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.CHANGE_SERVICE_WRITER, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.CHANGE_SERVICE_WRITER, payload, { params: { id } })
|
|
}
|
|
|
|
async changeSalesPerson(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.CHANGE_SALES_PERSON, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.CHANGE_SALES_PERSON, payload, { params: { id } })
|
|
}
|
|
|
|
async getParts(id: string, params?: Record<string, unknown>) {
|
|
return this.get(JOB_CARD_ROUTES.GET_PARTS, { params: { id }, query: params as any })
|
|
}
|
|
|
|
async addPart(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.ADD_PART, "post">) {
|
|
return this.post(JOB_CARD_ROUTES.ADD_PART, payload, { params: { id } })
|
|
}
|
|
|
|
async updatePart(id: string, payload: ApiRequestBody<typeof JOB_CARD_ROUTES.UPDATE_PART, "put">) {
|
|
return this.put(JOB_CARD_ROUTES.UPDATE_PART, payload, { params: { id } })
|
|
}
|
|
|
|
async deletePart(id: string, jobCardPartId: number) {
|
|
return this.delete(JOB_CARD_ROUTES.DELETE_PART, { params: { id }, body: { job_card_part_id: jobCardPartId } } as never)
|
|
}
|
|
}
|