/** * Dummy Data untuk Closing API * * File ini berisi dummy data untuk testing API Closing sebelum backend siap. * * Struktur data mengikuti tipe yang didefinisikan di @/types/api/closing.d.ts * * @example * // 1. Menggunakan getAllFetcher dengan SWR: * import useSWR from 'swr'; * import { ClosingApi } from '@/services/api/closing'; * * const { data, error, isLoading } = useSWR( * '/closings', * ClosingApi.getAllFetcher.bind(ClosingApi) * ); * * if (data?.status === 'success') { * console.log(data.data); // Array of Closing objects * } * * @example * // 2. Menggunakan getSingle: * import { ClosingApi } from '@/services/api/closing'; * * const response = await ClosingApi.getSingle(1); * if (response?.status === 'success') { * console.log(response.data); // Single Closing object * } else if (response?.status === 'error') { * console.error(response.message); // Error message * } * * @example * // 3. Menggunakan getGeneralInfo dengan SWR: * import useSWR from 'swr'; * import { ClosingApi } from '@/services/api/closing'; * * const closingId = 1; * const { data, error, isLoading } = useSWR( * closingId, * (id: number) => ClosingApi.getGeneralInfo(id) * ); * * if (data?.status === 'success') { * console.log(data.data); // ClosingGeneralInformation object * } * * @example * // 4. Menggunakan getAllIncomingSapronakFetcher dengan SWR: * import useSWR from 'swr'; * import { ClosingApi } from '@/services/api/closing'; * * const { data, error, isLoading } = useSWR( * `${ClosingApi.basePath}/1/sapronak/incoming`, * ClosingApi.getAllIncomingSapronakFetcher.bind(ClosingApi) * ); * * if (data?.status === 'success') { * console.log(data.data); // Array of ClosingIncomingSapronak * } * * @example * // 5. Menggunakan getAllOutgoingSapronakFetcher dengan SWR: * import useSWR from 'swr'; * import { ClosingApi } from '@/services/api/closing'; * * const { data, error, isLoading } = useSWR( * `${ClosingApi.basePath}/1/sapronak/outgoing`, * ClosingApi.getAllOutgoingSapronakFetcher.bind(ClosingApi) * ); * * if (data?.status === 'success') { * console.log(data.data); // Array of ClosingOutgoingSapronak * } * * @see {@link /home/sweetpotet/Documents/projects/lti-web-client/src/types/api/closing.d.ts} */ import { format } from 'date-fns'; import { Closing, ClosingGeneralInformation, ClosingIncomingSapronak, ClosingOutgoingSapronak, ClosingOverhead, ClosingSapronakCalculation, } from '@/types/api/closing'; import { CreatedUser, BaseApiResponse } from '@/types/api/api-general'; // Waktu saat ini untuk created_at/updated_at const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss'); const today = format(new Date(), 'yyyy-MM-dd'); const yesterday = format( new Date().setDate(new Date().getDate() - 1), 'yyyy-MM-dd' ); const lastWeek = format( new Date().setDate(new Date().getDate() - 7), 'yyyy-MM-dd' ); const lastMonth = format( new Date().setMonth(new Date().getMonth() - 1), 'yyyy-MM-dd' ); // ====================== // 👤 Created User // ====================== export const createdUser: CreatedUser = { id: 1, id_user: 1, email: 'admin@example.com', name: 'Admin Utama', }; // ====================== // 📊 Closing Dummy Data // ====================== export const dummyClosings: Closing[] = [ // 1. Closing dengan status Pengajuan - GROWING { id: 1, location_id: 1, location_name: 'Farm Sukajadi', project_category: 'GROWING', period: 1, closing_date: today, shed_label: 'Kandang A1, A2, A3', shed_count: 3, sales_paid_amount: 150000000, sales_remaining_amount: 50000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Pengajuan', created_user: createdUser, created_at: now, updated_at: now, }, // 2. Closing dengan status Aktif - LAYING { id: 2, location_id: 2, location_name: 'Farm Cihampelas', project_category: 'LAYING', period: 2, closing_date: yesterday, shed_label: 'Kandang B1, B2', shed_count: 2, sales_paid_amount: 200000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Aktif', created_user: createdUser, created_at: lastWeek, updated_at: yesterday, }, // 3. Closing dengan status Selesai - GROWING { id: 3, location_id: 3, location_name: 'Farm Pasteur', project_category: 'GROWING', period: 3, closing_date: lastWeek, shed_label: 'Kandang C1, C2, C3, C4', shed_count: 4, sales_paid_amount: 300000000, sales_remaining_amount: 25000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Selesai', created_user: createdUser, created_at: lastMonth, updated_at: lastWeek, }, // 4. Closing dengan status Aktif - LAYING { id: 4, location_id: 4, location_name: 'Farm Setiabudi', project_category: 'LAYING', period: 1, closing_date: today, shed_label: 'Kandang D1', shed_count: 1, sales_paid_amount: 75000000, sales_remaining_amount: 75000000, sales_payment_status: 'Belum Lunas', project_status: 'Aktif', created_user: createdUser, created_at: yesterday, updated_at: now, }, // 5. Closing dengan status Selesai - GROWING { id: 5, location_id: 5, location_name: 'Farm Dago', project_category: 'GROWING', period: 4, closing_date: lastMonth, shed_label: 'Kandang E1, E2, E3, E4, E5', shed_count: 5, sales_paid_amount: 500000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Selesai', created_user: createdUser, created_at: lastMonth, updated_at: lastMonth, }, // 6. Closing dengan status Pengajuan - LAYING { id: 6, location_id: 6, location_name: 'Farm Lembang', project_category: 'LAYING', period: 2, closing_date: undefined, // Belum ada tanggal closing shed_label: 'Kandang F1, F2', shed_count: 2, sales_paid_amount: 0, sales_remaining_amount: 180000000, sales_payment_status: 'Belum Lunas', project_status: 'Pengajuan', created_user: createdUser, created_at: now, updated_at: now, }, // 7. Closing dengan status Aktif - GROWING { id: 7, location_id: 7, location_name: 'Farm Ciwidey', project_category: 'GROWING', period: 1, closing_date: yesterday, shed_label: 'Kandang G1, G2, G3', shed_count: 3, sales_paid_amount: 120000000, sales_remaining_amount: 30000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Aktif', created_user: createdUser, created_at: lastWeek, updated_at: yesterday, }, // 8. Closing dengan status Selesai - LAYING { id: 8, location_id: 8, location_name: 'Farm Bandung Timur', project_category: 'LAYING', period: 3, closing_date: lastMonth, shed_label: 'Kandang H1, H2, H3, H4, H5, H6', shed_count: 6, sales_paid_amount: 600000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Selesai', created_user: createdUser, created_at: lastMonth, updated_at: lastMonth, }, ]; // ====================== // 📊 Closing General Information Dummy Data // ====================== export const dummyClosingGeneralInformations: ClosingGeneralInformation[] = [ // 1. General Info - GROWING - Pengajuan { id: 1, location_id: 1, location_name: 'Farm Sukajadi', project_category: 'GROWING', period: 1, closing_date: today, shed_label: 'Kandang A1, A2, A3', shed_count: 3, sales_paid_amount: 150000000, sales_remaining_amount: 50000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Pengajuan', flock_id: 101, project_type: 'GROWING', population: 15000, active_house_count: 3, closing_status: 'Draft', created_user: createdUser, created_at: now, updated_at: now, }, // 2. General Info - LAYING - Aktif { id: 2, location_id: 2, location_name: 'Farm Cihampelas', project_category: 'LAYING', period: 2, closing_date: yesterday, shed_label: 'Kandang B1, B2', shed_count: 2, sales_paid_amount: 200000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Aktif', flock_id: 102, project_type: 'LAYING', population: 10000, active_house_count: 2, closing_status: 'In Progress', created_user: createdUser, created_at: lastWeek, updated_at: yesterday, }, // 3. General Info - GROWING - Selesai { id: 3, location_id: 3, location_name: 'Farm Pasteur', project_category: 'GROWING', period: 3, closing_date: lastWeek, shed_label: 'Kandang C1, C2, C3, C4', shed_count: 4, sales_paid_amount: 300000000, sales_remaining_amount: 25000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Selesai', flock_id: 103, project_type: 'GROWING', population: 20000, active_house_count: 4, closing_status: 'Completed', created_user: createdUser, created_at: lastMonth, updated_at: lastWeek, }, // 4. General Info - LAYING - Aktif { id: 4, location_id: 4, location_name: 'Farm Setiabudi', project_category: 'LAYING', period: 1, closing_date: today, shed_label: 'Kandang D1', shed_count: 1, sales_paid_amount: 75000000, sales_remaining_amount: 75000000, sales_payment_status: 'Belum Lunas', project_status: 'Aktif', flock_id: 104, project_type: 'LAYING', population: 5000, active_house_count: 1, closing_status: 'In Progress', created_user: createdUser, created_at: yesterday, updated_at: now, }, // 5. General Info - GROWING - Selesai { id: 5, location_id: 5, location_name: 'Farm Dago', project_category: 'GROWING', period: 4, closing_date: lastMonth, shed_label: 'Kandang E1, E2, E3, E4, E5', shed_count: 5, sales_paid_amount: 500000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Selesai', flock_id: 105, project_type: 'GROWING', population: 25000, active_house_count: 5, closing_status: 'Completed', created_user: createdUser, created_at: lastMonth, updated_at: lastMonth, }, // 6. General Info - LAYING - Pengajuan { id: 6, location_id: 6, location_name: 'Farm Lembang', project_category: 'LAYING', period: 2, closing_date: undefined, shed_label: 'Kandang F1, F2', shed_count: 2, sales_paid_amount: 0, sales_remaining_amount: 180000000, sales_payment_status: 'Belum Lunas', project_status: 'Pengajuan', flock_id: 106, project_type: 'LAYING', population: 12000, active_house_count: 2, closing_status: 'Draft', created_user: createdUser, created_at: now, updated_at: now, }, // 7. General Info - GROWING - Aktif { id: 7, location_id: 7, location_name: 'Farm Ciwidey', project_category: 'GROWING', period: 1, closing_date: yesterday, shed_label: 'Kandang G1, G2, G3', shed_count: 3, sales_paid_amount: 120000000, sales_remaining_amount: 30000000, sales_payment_status: 'Sebagian Lunas', project_status: 'Aktif', flock_id: 107, project_type: 'GROWING', population: 18000, active_house_count: 3, closing_status: 'In Progress', created_user: createdUser, created_at: lastWeek, updated_at: yesterday, }, // 8. General Info - LAYING - Selesai { id: 8, location_id: 8, location_name: 'Farm Bandung Timur', project_category: 'LAYING', period: 3, closing_date: lastMonth, shed_label: 'Kandang H1, H2, H3, H4, H5, H6', shed_count: 6, sales_paid_amount: 600000000, sales_remaining_amount: 0, sales_payment_status: 'Lunas', project_status: 'Selesai', flock_id: 108, project_type: 'LAYING', population: 30000, active_house_count: 6, closing_status: 'Completed', created_user: createdUser, created_at: lastMonth, updated_at: lastMonth, }, ]; // ====================== // 📦 Incoming Sapronak Dummy Data // ====================== export const dummyIncomingSapronaks: ClosingIncomingSapronak[] = [ { id: 1, date: today, reference_number: 'IN-2025-001', transaction_type: 'Pembelian', product_name: 'DOC Broiler Cobb 500', product_category: 'DOC', product_sub_category: 'DOC Broiler', source_warehouse: 'Gudang Pusat', destination_warehouse: 'Kandang A1', quantity: 5000, unit: 'Ekor', formatted_quantity: '5,000 Ekor', notes: 'DOC berkualitas tinggi dari supplier terpercaya', }, { id: 2, date: yesterday, reference_number: 'IN-2025-002', transaction_type: 'Transfer Masuk', product_name: 'Pakan Starter BR-1', product_category: 'Pakan', product_sub_category: 'Starter', source_warehouse: 'Gudang Area Bandung', destination_warehouse: 'Kandang B1', quantity: 100, unit: 'Sak', formatted_quantity: '100 Sak (5,000 Kg)', notes: 'Pakan starter untuk periode awal', }, { id: 3, date: lastWeek, reference_number: 'IN-2025-003', transaction_type: 'Pembelian', product_name: 'Vitamin B Complex', product_category: 'OVK', product_sub_category: 'Vitamin', source_warehouse: 'Supplier Medion', destination_warehouse: 'Gudang Farmasi', quantity: 50, unit: 'Botol', formatted_quantity: '50 Botol', notes: 'Vitamin untuk meningkatkan daya tahan tubuh', }, { id: 4, date: today, reference_number: 'IN-2025-004', transaction_type: 'Pembelian', product_name: 'Pakan Finisher BR-2', product_category: 'Pakan', product_sub_category: 'Finisher', source_warehouse: 'Gudang Pusat', destination_warehouse: 'Kandang C1', quantity: 200, unit: 'Sak', formatted_quantity: '200 Sak (10,000 Kg)', notes: 'Pakan finisher untuk periode akhir', }, { id: 5, date: yesterday, reference_number: 'IN-2025-005', transaction_type: 'Transfer Masuk', product_name: 'Antibiotik Enrofloxacin', product_category: 'OVK', product_sub_category: 'Obat', source_warehouse: 'Gudang Area Jakarta', destination_warehouse: 'Gudang Farmasi', quantity: 30, unit: 'Box', formatted_quantity: '30 Box', notes: 'Antibiotik untuk pencegahan penyakit', }, ]; // ====================== // 📤 Outgoing Sapronak Dummy Data // ====================== export const dummyOutgoingSapronaks: ClosingOutgoingSapronak[] = [ { id: 1, date: today, reference_number: 'OUT-2025-001', transaction_type: 'Pemakaian', product_name: 'Pakan Starter BR-1', product_category: 'Pakan', product_sub_category: 'Starter', source_warehouse: 'Kandang A1', destination_warehouse: 'Konsumsi Kandang A1', quantity: 50, unit: 'Sak', formatted_quantity: '50 Sak (2,500 Kg)', notes: 'Pemakaian pakan harian periode starter', }, { id: 2, date: yesterday, reference_number: 'OUT-2025-002', transaction_type: 'Transfer Keluar', product_name: 'DOC Broiler Cobb 500', product_category: 'DOC', product_sub_category: 'DOC Broiler', source_warehouse: 'Kandang B1', destination_warehouse: 'Kandang B2', quantity: 1000, unit: 'Ekor', formatted_quantity: '1,000 Ekor', notes: 'Transfer DOC ke kandang baru', }, { id: 3, date: lastWeek, reference_number: 'OUT-2025-003', transaction_type: 'Pemakaian', product_name: 'Vitamin B Complex', product_category: 'OVK', product_sub_category: 'Vitamin', source_warehouse: 'Gudang Farmasi', destination_warehouse: 'Konsumsi Kandang C1', quantity: 10, unit: 'Botol', formatted_quantity: '10 Botol', notes: 'Pemberian vitamin untuk meningkatkan kesehatan', }, { id: 4, date: today, reference_number: 'OUT-2025-004', transaction_type: 'Pemakaian', product_name: 'Pakan Finisher BR-2', product_category: 'Pakan', product_sub_category: 'Finisher', source_warehouse: 'Kandang C1', destination_warehouse: 'Konsumsi Kandang C1', quantity: 80, unit: 'Sak', formatted_quantity: '80 Sak (4,000 Kg)', notes: 'Pemakaian pakan harian periode finisher', }, { id: 5, date: yesterday, reference_number: 'OUT-2025-005', transaction_type: 'Pemakaian', product_name: 'Antibiotik Enrofloxacin', product_category: 'OVK', product_sub_category: 'Obat', source_warehouse: 'Gudang Farmasi', destination_warehouse: 'Konsumsi Kandang D1', quantity: 5, unit: 'Box', formatted_quantity: '5 Box', notes: 'Pengobatan untuk ayam yang sakit', }, { id: 6, date: lastWeek, reference_number: 'OUT-2025-006', transaction_type: 'Transfer Keluar', product_name: 'Pakan Starter BR-1', product_category: 'Pakan', product_sub_category: 'Starter', source_warehouse: 'Kandang E1', destination_warehouse: 'Kandang E2', quantity: 30, unit: 'Sak', formatted_quantity: '30 Sak (1,500 Kg)', notes: 'Transfer pakan antar kandang', }, ]; // ====================== // 📊 Perhitungan Sapronak Dummy Data // ====================== export const dummySapronakCalculation: ClosingSapronakCalculation = { // DOC Broiler Calculation doc_broiler: { rows: [ { id: 1, tanggal: today, no_referensi: 'IN-2025-001', qty_masuk: 5000, qty_keluar: 0, qty_pakai: 0, uraian: 'DOC Broiler Cobb 500', kategori_produk: 'DOC Broiler', harga_beli_per_qty: 8000, total_harga: 40000000, keterangan: 'Pembelian DOC dari supplier', }, { id: 2, tanggal: yesterday, no_referensi: 'OUT-2025-002', qty_masuk: 0, qty_keluar: 1000, qty_pakai: 0, uraian: 'DOC Broiler Cobb 500', kategori_produk: 'DOC Broiler', harga_beli_per_qty: 8000, total_harga: 8000000, keterangan: 'Transfer DOC ke kandang lain', }, { id: 3, tanggal: lastWeek, no_referensi: 'USE-2025-001', qty_masuk: 0, qty_keluar: 0, qty_pakai: 50, uraian: 'DOC Broiler Cobb 500', kategori_produk: 'DOC Broiler', harga_beli_per_qty: 8000, total_harga: 400000, keterangan: 'Mortalitas DOC', }, ], total: { label: 'Total DOC Broiler', qty_masuk: 5000, qty_keluar: 1000, qty_pakai: 50, harga_beli_per_qty: 8000, total_harga: 48400000, }, }, // OVK Calculation ovk: { rows: [ { id: 1, tanggal: today, no_referensi: 'IN-2025-003', qty_masuk: 50, qty_keluar: 0, qty_pakai: 0, uraian: 'Vitamin B Complex', kategori_produk: 'Vitamin', harga_beli_per_qty: 150000, total_harga: 7500000, keterangan: 'Pembelian vitamin', }, { id: 2, tanggal: yesterday, no_referensi: 'IN-2025-005', qty_masuk: 30, qty_keluar: 0, qty_pakai: 0, uraian: 'Antibiotik Enrofloxacin', kategori_produk: 'Obat', harga_beli_per_qty: 250000, total_harga: 7500000, keterangan: 'Pembelian antibiotik', }, { id: 3, tanggal: lastWeek, no_referensi: 'OUT-2025-003', qty_masuk: 0, qty_keluar: 0, qty_pakai: 10, uraian: 'Vitamin B Complex', kategori_produk: 'Vitamin', harga_beli_per_qty: 150000, total_harga: 1500000, keterangan: 'Pemakaian vitamin', }, { id: 4, tanggal: yesterday, no_referensi: 'OUT-2025-005', qty_masuk: 0, qty_keluar: 0, qty_pakai: 5, uraian: 'Antibiotik Enrofloxacin', kategori_produk: 'Obat', harga_beli_per_qty: 250000, total_harga: 1250000, keterangan: 'Pemakaian antibiotik', }, ], total: { label: 'Total OVK', qty_masuk: 80, qty_keluar: 0, qty_pakai: 15, harga_beli_per_qty: 200000, total_harga: 17750000, }, }, // Pakan Calculation pakan: { rows: [ { id: 1, tanggal: yesterday, no_referensi: 'IN-2025-002', qty_masuk: 100, qty_keluar: 0, qty_pakai: 0, uraian: 'Pakan Starter BR-1', kategori_produk: 'Starter', harga_beli_per_qty: 450000, total_harga: 45000000, keterangan: 'Pembelian pakan starter', }, { id: 2, tanggal: today, no_referensi: 'IN-2025-004', qty_masuk: 200, qty_keluar: 0, qty_pakai: 0, uraian: 'Pakan Finisher BR-2', kategori_produk: 'Finisher', harga_beli_per_qty: 480000, total_harga: 96000000, keterangan: 'Pembelian pakan finisher', }, { id: 3, tanggal: today, no_referensi: 'OUT-2025-001', qty_masuk: 0, qty_keluar: 0, qty_pakai: 50, uraian: 'Pakan Starter BR-1', kategori_produk: 'Starter', harga_beli_per_qty: 450000, total_harga: 22500000, keterangan: 'Pemakaian pakan starter', }, { id: 4, tanggal: today, no_referensi: 'OUT-2025-004', qty_masuk: 0, qty_keluar: 0, qty_pakai: 80, uraian: 'Pakan Finisher BR-2', kategori_produk: 'Finisher', harga_beli_per_qty: 480000, total_harga: 38400000, keterangan: 'Pemakaian pakan finisher', }, { id: 5, tanggal: lastWeek, no_referensi: 'OUT-2025-006', qty_masuk: 0, qty_keluar: 30, qty_pakai: 0, uraian: 'Pakan Starter BR-1', kategori_produk: 'Starter', harga_beli_per_qty: 450000, total_harga: 13500000, keterangan: 'Transfer pakan ke kandang lain', }, ], total: { label: 'Total Pakan', qty_masuk: 300, qty_keluar: 30, qty_pakai: 130, harga_beli_per_qty: 465000, total_harga: 215400000, }, }, }; // ====================== // 💰 Overhead Dummy Data // ====================== export const dummyOverhead: ClosingOverhead = { overheads: [ { item_name: 'Expedisi DOC', uom_name: 'Ekor', budget_quantity: 500, budget_unit_price: 8000, budget_total_amount: 4000000, actual_date: '', actual_quantity: 0, actual_unit_price: 0, actual_total_amount: 0, cost_per_bird: 0, }, { item_name: 'Solar', uom_name: 'Liter', budget_quantity: 0, budget_unit_price: 0, budget_total_amount: 0, actual_date: today, actual_quantity: 20, actual_unit_price: 10000, actual_total_amount: 200000, cost_per_bird: 200, }, { item_name: 'Gaji Karyawan Kandang', uom_name: 'Orang', budget_quantity: 3, budget_unit_price: 3000000, budget_total_amount: 9000000, actual_date: today, actual_quantity: 3, actual_unit_price: 3200000, actual_total_amount: 9600000, cost_per_bird: 640, }, { item_name: 'Listrik Kandang', uom_name: 'Bulan', budget_quantity: 1, budget_unit_price: 2500000, budget_total_amount: 2500000, actual_date: today, actual_quantity: 1, actual_unit_price: 2800000, actual_total_amount: 2800000, cost_per_bird: 187, }, { item_name: 'Air Bersih', uom_name: 'Bulan', budget_quantity: 1, budget_unit_price: 500000, budget_total_amount: 500000, actual_date: today, actual_quantity: 1, actual_unit_price: 450000, actual_total_amount: 450000, cost_per_bird: 30, }, { item_name: 'Perbaikan Kandang', uom_name: 'Paket', budget_quantity: 1, budget_unit_price: 3000000, budget_total_amount: 3000000, actual_date: yesterday, actual_quantity: 1, actual_unit_price: 3500000, actual_total_amount: 3500000, cost_per_bird: 233, }, { item_name: 'Service Peralatan', uom_name: 'Kali', budget_quantity: 2, budget_unit_price: 500000, budget_total_amount: 1000000, actual_date: lastWeek, actual_quantity: 2, actual_unit_price: 550000, actual_total_amount: 1100000, cost_per_bird: 73, }, { item_name: 'ATK & Supplies', uom_name: 'Paket', budget_quantity: 1, budget_unit_price: 500000, budget_total_amount: 500000, actual_date: today, actual_quantity: 1, actual_unit_price: 450000, actual_total_amount: 450000, cost_per_bird: 30, }, { item_name: 'Biaya Komunikasi', uom_name: 'Bulan', budget_quantity: 1, budget_unit_price: 300000, budget_total_amount: 300000, actual_date: today, actual_quantity: 1, actual_unit_price: 320000, actual_total_amount: 320000, cost_per_bird: 21, }, { item_name: 'BBM Kendaraan Operasional', uom_name: 'Liter', budget_quantity: 200, budget_unit_price: 10000, budget_total_amount: 2000000, actual_date: today, actual_quantity: 220, actual_unit_price: 10500, actual_total_amount: 2310000, cost_per_bird: 154, }, ], total: { budget_quantity: 710, budget_total_amount: 23300000, actual_quantity: 250, actual_total_amount: 24530000, cost_per_bird: 1568, }, }; // ====================== // 🔧 Dummy API Response Functions // ====================== /** * Dummy implementation for getAllFetcher * Returns all closing records */ export const dummyGetAllFetcher = async (): Promise<{ code: number; status: 'success'; message: string; data: Closing[]; }> => { await new Promise((resolve) => setTimeout(resolve, 500)); return { code: 200, status: 'success', message: 'Data closing berhasil diambil', data: dummyClosings, }; }; /** * Dummy implementation for getSingle * Returns a single closing by ID */ export const dummyGetSingle = async ( id: number ): Promise | undefined> => { await new Promise((resolve) => setTimeout(resolve, 300)); const closing = dummyClosings.find((c) => c.id === id); if (!closing) { return { code: 404, status: 'error', message: `Closing dengan ID ${id} tidak ditemukan`, }; } return { code: 200, status: 'success', message: 'Data closing berhasil diambil', data: closing, }; }; /** * Dummy implementation for getAllIncomingSapronakFetcher * Returns all incoming sapronak records */ export const dummyGetAllIncomingSapronakFetcher = async (): Promise<{ code: number; status: 'success'; message: string; data: ClosingIncomingSapronak[]; }> => { await new Promise((resolve) => setTimeout(resolve, 400)); return { code: 200, status: 'success', message: 'Data sapronak masuk berhasil diambil', data: dummyIncomingSapronaks, }; }; /** * Dummy implementation for getAllOutgoingSapronakFetcher * Returns all outgoing sapronak records */ export const dummyGetAllOutgoingSapronakFetcher = async (): Promise<{ code: number; status: 'success'; message: string; data: ClosingOutgoingSapronak[]; }> => { await new Promise((resolve) => setTimeout(resolve, 400)); return { code: 200, status: 'success', message: 'Data sapronak keluar berhasil diambil', data: dummyOutgoingSapronaks, }; }; /** * Dummy implementation for getGeneralInfo * Returns closing general information by ID */ export const dummyGetGeneralInfo = async ( id: number ): Promise | undefined> => { await new Promise((resolve) => setTimeout(resolve, 300)); const closingInfo = dummyClosingGeneralInformations.find((c) => c.id == id); if (!closingInfo) { return { code: 404, status: 'error', message: `Closing general information dengan ID ${id} tidak ditemukan`, }; } return { code: 200, status: 'success', message: 'Data closing general information berhasil diambil', data: closingInfo, }; }; /** * Dummy implementation for getPerhitunganSapronak * Returns sapronak calculation data */ export const dummyGetPerhitunganSapronak = async ( id: number ): Promise< | { code: number; status: 'success'; message: string; data: ClosingSapronakCalculation; } | undefined > => { await new Promise((resolve) => setTimeout(resolve, 400)); return { code: 200, status: 'success', message: 'Data perhitungan sapronak berhasil diambil', data: dummySapronakCalculation, }; }; /** * Dummy implementation for getOverhead * Returns overhead data */ export const dummyGetOverhead = async ( id: number ): Promise | undefined> => { await new Promise((resolve) => setTimeout(resolve, 400)); return { code: 200, status: 'success', message: 'Data overhead berhasil diambil', data: dummyOverhead, }; };