diff --git a/src/services/api/production/transfer-to-laying.ts b/src/services/api/production/transfer-to-laying.ts index 69b4db73..00bf8080 100644 --- a/src/services/api/production/transfer-to-laying.ts +++ b/src/services/api/production/transfer-to-laying.ts @@ -2,8 +2,594 @@ import { sleep } from '@/lib/helper'; import { BaseApiService } from '@/services/api/base'; import { BaseApiResponse } from '@/types/api/api-general'; +import { + CreateTransferToLayingPayload, + TransferToLaying, + UpdateTransferToLayingPayload, +} from '@/types/api/production/transfer-to-laying'; import { FlockWithKandangs } from '@/types/api/master-data/flock'; +// TODO: delete this dummy data +const GET_ALL_TRANSFER_TO_LAYING_DUMMY_DATA: BaseApiResponse< + TransferToLaying[] +> = { + code: 200, + status: 'success', + message: 'Successfully get all transfer to laying data!', + meta: { + page: 1, + limit: 10, + total_pages: 1, + total_results: 8, + }, + data: [ + { + id: 201, + transfer_date: '2025-10-10', + flock_source: { id: 1, name: 'Flock A' }, + flock_destination: { id: 10, name: 'Laying House 1' }, + quantity: 1200, + kandangs: [ + { + kandang: { + id: 11, + name: 'KDG-11', + status: 'ACTIVE', + location: { + id: 101, + name: 'Farm Alpha', + address: 'Jl. Raya Alpha No. 1', + area: { id: 1001, name: 'Area Utara' }, + }, + pic: { + id: 501, + id_user: 501, + email: 'rina@farm.co', + name: 'Rina Setiawan', + }, + created_user: { + id: 9001, + id_user: 9001, + email: 'admin@farm.co', + name: 'System Admin', + }, + created_at: '2025-09-01T08:00:00Z', + updated_at: '2025-10-01T08:00:00Z', + }, + quantity: 600, + }, + { + kandang: { + id: 12, + name: 'KDG-12', + status: 'ACTIVE', + location: { + id: 101, + name: 'Farm Alpha', + address: 'Jl. Raya Alpha No. 1', + area: { id: 1001, name: 'Area Utara' }, + }, + pic: { + id: 502, + id_user: 502, + email: 'budi@farm.co', + name: 'Budi Hartono', + }, + created_user: { + id: 9002, + id_user: 9002, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-08-25T08:00:00Z', + updated_at: '2025-09-20T08:00:00Z', + }, + quantity: 600, + }, + ], + reason: 'Start laying cycle', + created_user: { + id: 9100, + id_user: 9100, + email: 'planner@farm.co', + name: 'Planning', + }, + created_at: '2025-10-10T06:00:00Z', + updated_at: '2025-10-10T06:00:00Z', + }, + { + id: 202, + transfer_date: '2025-10-11', + flock_source: { id: 2, name: 'Flock B' }, + flock_destination: { id: 10, name: 'Laying House 1' }, + quantity: 950, + kandangs: [ + { + kandang: { + id: 13, + name: 'KDG-13', + status: 'ACTIVE', + location: { + id: 102, + name: 'Farm Beta', + address: 'Jl. Melati 2', + area: { id: 1002, name: 'Area Selatan' }, + }, + pic: { + id: 503, + id_user: 503, + email: 'sari@farm.co', + name: 'Sari Wulandari', + }, + created_user: { + id: 9003, + id_user: 9003, + email: 'system@farm.co', + name: 'System', + }, + created_at: '2025-09-05T08:00:00Z', + updated_at: '2025-10-02T08:00:00Z', + }, + quantity: 500, + }, + { + kandang: { + id: 14, + name: 'KDG-14', + status: 'MAINTENANCE', + location: { + id: 102, + name: 'Farm Beta', + address: 'Jl. Melati 2', + area: { id: 1002, name: 'Area Selatan' }, + }, + pic: { + id: 504, + id_user: 504, + email: 'agus@farm.co', + name: 'Agus Pratama', + }, + created_user: { + id: 9003, + id_user: 9003, + email: 'system@farm.co', + name: 'System', + }, + created_at: '2025-07-15T08:00:00Z', + updated_at: '2025-09-15T08:00:00Z', + }, + quantity: 450, + }, + ], + reason: 'Capacity balancing', + created_user: { + id: 9101, + id_user: 9101, + email: 'planner@farm.co', + name: 'Planning', + }, + created_at: '2025-10-11T06:00:00Z', + updated_at: '2025-10-11T06:00:00Z', + }, + { + id: 203, + transfer_date: '2025-10-12', + flock_source: { id: 3, name: 'Flock C' }, + flock_destination: { id: 11, name: 'Laying House 2' }, + quantity: 1100, + kandangs: [ + { + kandang: { + id: 21, + name: 'KDG-21', + status: 'ACTIVE', + location: { + id: 103, + name: 'Farm Gamma', + address: 'Dusun Gamma', + area: { id: 1003, name: 'Area Timur' }, + }, + pic: { + id: 505, + id_user: 505, + email: 'dewi@farm.co', + name: 'Dewi Lestari', + }, + created_user: { + id: 9004, + id_user: 9004, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-10T08:00:00Z', + updated_at: '2025-10-05T08:00:00Z', + }, + quantity: 700, + }, + { + kandang: { + id: 22, + name: 'KDG-22', + status: 'ACTIVE', + location: { + id: 103, + name: 'Farm Gamma', + address: 'Dusun Gamma', + area: { id: 1003, name: 'Area Timur' }, + }, + pic: { + id: 506, + id_user: 506, + email: 'hadi@farm.co', + name: 'Hadi Santoso', + }, + created_user: { + id: 9004, + id_user: 9004, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-12T08:00:00Z', + updated_at: '2025-10-06T08:00:00Z', + }, + quantity: 400, + }, + ], + reason: 'Align age group', + created_user: { + id: 9102, + id_user: 9102, + email: 'scheduler@farm.co', + name: 'Scheduler', + }, + created_at: '2025-10-12T06:00:00Z', + updated_at: '2025-10-12T06:00:00Z', + }, + { + id: 204, + transfer_date: '2025-10-13', + flock_source: { id: 1, name: 'Flock A' }, + flock_destination: { id: 12, name: 'Laying House 3' }, + quantity: 800, + kandangs: [ + { + kandang: { + id: 15, + name: 'KDG-15', + status: 'ACTIVE', + location: { + id: 101, + name: 'Farm Alpha', + address: 'Jl. Raya Alpha No. 1', + area: { id: 1001, name: 'Area Utara' }, + }, + pic: { + id: 507, + id_user: 507, + email: 'nadia@farm.co', + name: 'Nadia Putri', + }, + created_user: { + id: 9001, + id_user: 9001, + email: 'admin@farm.co', + name: 'System Admin', + }, + created_at: '2025-08-01T08:00:00Z', + updated_at: '2025-09-28T08:00:00Z', + }, + quantity: 800, + }, + ], + reason: 'Open capacity in LH3', + created_user: { + id: 9103, + id_user: 9103, + email: 'opslead@farm.co', + name: 'Ops Lead', + }, + created_at: '2025-10-13T06:00:00Z', + updated_at: '2025-10-13T06:00:00Z', + }, + { + id: 205, + transfer_date: '2025-10-14', + flock_source: { id: 4, name: 'Flock D' }, + flock_destination: { id: 11, name: 'Laying House 2' }, + quantity: 650, + kandangs: [ + { + kandang: { + id: 23, + name: 'KDG-23', + status: 'ACTIVE', + location: { + id: 104, + name: 'Farm Delta', + address: 'Jl. Delta 4', + area: { id: 1004, name: 'Area Barat' }, + }, + pic: { + id: 508, + id_user: 508, + email: 'yoga@farm.co', + name: 'Yoga Prabowo', + }, + created_user: { + id: 9005, + id_user: 9005, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-20T08:00:00Z', + updated_at: '2025-10-10T08:00:00Z', + }, + quantity: 350, + }, + { + kandang: { + id: 24, + name: 'KDG-24', + status: 'ACTIVE', + location: { + id: 104, + name: 'Farm Delta', + address: 'Jl. Delta 4', + area: { id: 1004, name: 'Area Barat' }, + }, + pic: { + id: 509, + id_user: 509, + email: 'mega@farm.co', + name: 'Mega Anggraini', + }, + created_user: { + id: 9005, + id_user: 9005, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-21T08:00:00Z', + updated_at: '2025-10-10T08:00:00Z', + }, + quantity: 300, + }, + ], + reason: 'Fill remaining LH2 slots', + created_user: { + id: 9104, + id_user: 9104, + email: 'scheduler@farm.co', + name: 'Scheduler', + }, + created_at: '2025-10-14T06:00:00Z', + updated_at: '2025-10-14T06:00:00Z', + }, + { + id: 206, + transfer_date: '2025-10-15', + flock_source: { id: 2, name: 'Flock B' }, + flock_destination: { id: 12, name: 'Laying House 3' }, + quantity: 720, + kandangs: [ + { + kandang: { + id: 16, + name: 'KDG-16', + status: 'ACTIVE', + location: { + id: 102, + name: 'Farm Beta', + address: 'Jl. Melati 2', + area: { id: 1002, name: 'Area Selatan' }, + }, + pic: { + id: 510, + id_user: 510, + email: 'rizky@farm.co', + name: 'Rizky Maulana', + }, + created_user: { + id: 9003, + id_user: 9003, + email: 'system@farm.co', + name: 'System', + }, + created_at: '2025-08-12T08:00:00Z', + updated_at: '2025-10-01T08:00:00Z', + }, + quantity: 420, + }, + { + kandang: { + id: 17, + name: 'KDG-17', + status: 'ACTIVE', + location: { + id: 102, + name: 'Farm Beta', + address: 'Jl. Melati 2', + area: { id: 1002, name: 'Area Selatan' }, + }, + pic: { + id: 511, + id_user: 511, + email: 'tia@farm.co', + name: 'Tia Safitri', + }, + created_user: { + id: 9003, + id_user: 9003, + email: 'system@farm.co', + name: 'System', + }, + created_at: '2025-08-18T08:00:00Z', + updated_at: '2025-10-01T08:00:00Z', + }, + quantity: 300, + }, + ], + reason: 'Stage-by-stage transfer', + created_user: { + id: 9105, + id_user: 9105, + email: 'opslead@farm.co', + name: 'Ops Lead', + }, + created_at: '2025-10-15T06:00:00Z', + updated_at: '2025-10-15T06:00:00Z', + }, + { + id: 207, + transfer_date: '2025-10-16', + flock_source: { id: 5, name: 'Flock E' }, + flock_destination: { id: 10, name: 'Laying House 1' }, + quantity: 500, + kandangs: [ + { + kandang: { + id: 18, + name: 'KDG-18', + status: 'ACTIVE', + location: { + id: 105, + name: 'Farm Epsilon', + address: 'Kp. Epsilon', + area: { id: 1005, name: 'Area Tengah' }, + }, + pic: { + id: 512, + id_user: 512, + email: 'lukas@farm.co', + name: 'Lukas Aditya', + }, + created_user: { + id: 9006, + id_user: 9006, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-01T08:00:00Z', + updated_at: '2025-10-12T08:00:00Z', + }, + quantity: 250, + }, + { + kandang: { + id: 19, + name: 'KDG-19', + status: 'ACTIVE', + location: { + id: 105, + name: 'Farm Epsilon', + address: 'Kp. Epsilon', + area: { id: 1005, name: 'Area Tengah' }, + }, + pic: { + id: 513, + id_user: 513, + email: 'maya@farm.co', + name: 'Maya Kartika', + }, + created_user: { + id: 9006, + id_user: 9006, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-03T08:00:00Z', + updated_at: '2025-10-12T08:00:00Z', + }, + quantity: 250, + }, + ], + reason: 'Trial batch', + created_user: { + id: 9106, + id_user: 9106, + email: 'planner@farm.co', + name: 'Planning', + }, + created_at: '2025-10-16T06:00:00Z', + updated_at: '2025-10-16T06:00:00Z', + }, + { + id: 208, + transfer_date: '2025-10-17', + flock_source: { id: 6, name: 'Flock F' }, + flock_destination: { id: 13, name: 'Laying House 4' }, + quantity: 1300, + kandangs: [ + { + kandang: { + id: 25, + name: 'KDG-25', + status: 'ACTIVE', + location: { + id: 106, + name: 'Farm Zeta', + address: 'Jl. Zeta 6', + area: { id: 1006, name: 'Area Tenggara' }, + }, + pic: { + id: 514, + id_user: 514, + email: 'rara@farm.co', + name: 'Rara Pertiwi', + }, + created_user: { + id: 9007, + id_user: 9007, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-07T08:00:00Z', + updated_at: '2025-10-13T08:00:00Z', + }, + quantity: 700, + }, + { + kandang: { + id: 26, + name: 'KDG-26', + status: 'ACTIVE', + location: { + id: 106, + name: 'Farm Zeta', + address: 'Jl. Zeta 6', + area: { id: 1006, name: 'Area Tenggara' }, + }, + pic: { + id: 515, + id_user: 515, + email: 'doni@farm.co', + name: 'Doni Firmansyah', + }, + created_user: { + id: 9007, + id_user: 9007, + email: 'ops@farm.co', + name: 'Ops Bot', + }, + created_at: '2025-09-09T08:00:00Z', + updated_at: '2025-10-13T08:00:00Z', + }, + quantity: 600, + }, + ], + reason: 'Open new house', + created_user: { + id: 9107, + id_user: 9107, + email: 'scheduler@farm.co', + name: 'Scheduler', + }, + created_at: '2025-10-17T06:00:00Z', + updated_at: '2025-10-17T06:00:00Z', + }, + ], +}; + // TODO: delete this dummy data const FLOCK_SOURCE_DUMMY_DATA: BaseApiResponse = { code: 200, @@ -149,15 +735,26 @@ const FLOCK_SOURCE_DUMMY_DATA: BaseApiResponse = { ], }; -export class TransferToLayingService< - T, - CreatePayloadGeneric, - UpdatePayloadGeneric -> extends BaseApiService { +export class TransferToLayingService extends BaseApiService< + TransferToLaying, + CreateTransferToLayingPayload, + UpdateTransferToLayingPayload +> { constructor(basePath: string = '') { super(basePath); } + // TODO: remove dummy data and integrate to real API + override async getAllFetcher( + endpoint: string + ): Promise> { + // return await httpClientFetcher>(endpoint); + + await sleep(750); + + return GET_ALL_TRANSFER_TO_LAYING_DUMMY_DATA; + } + // TODO: remove dummy data and integrate to real API async getFlockSource(): Promise< BaseApiResponse | undefined @@ -178,10 +775,54 @@ export class TransferToLayingService< return undefined; } } + + // TODO: remove dummy data and integrate to real API + async bulkApprove( + ids: number[] + ): Promise | undefined> { + try { + await sleep(750); + + return { + code: 200, + status: 'success', + message: 'Berhasil approve data transfer ke laying!', + data: { + message: 'Berhasil approve data transfer ke laying!', + }, + }; + } catch (error) { + // if (axios.isAxiosError>(error)) { + // return error.response?.data; + // } + + return undefined; + } + } + + // TODO: remove dummy data and integrate to real API + async bulkReject( + ids: number[] + ): Promise | undefined> { + try { + await sleep(750); + + return { + code: 200, + status: 'success', + message: 'Berhasil reject data transfer ke laying!', + data: { + message: 'Berhasil reject data transfer ke laying!', + }, + }; + } catch (error) { + // if (axios.isAxiosError>(error)) { + // return error.response?.data; + // } + + return undefined; + } + } } -export const TransferToLayingApi = new TransferToLayingService< - unknown, - unknown, - unknown ->(''); +export const TransferToLayingApi = new TransferToLayingService('');