import api from '../../../services/api'; import type { UsefulLifeCatalogOption, FiscalDepreciationRateOption, UsefulLifeCalculationResult } from '../types/fixedAsset'; export interface Asset { id: number; sku: string; asset_tag: string | null; status: { id: number; name: string }; estimated_useful_life: number | null; depreciation_method: string; residual_value: string; accumulated_depreciation: string; book_value: string; warranty_days: number | null; warranty_end_date: string | null; fiscal_depreciation_rate_id: number | null; useful_life_catalog_id: number | null; fiscal_depreciation_rate: { id: number; name: string; depreciation_rate: string } | null; useful_life_catalog: { id: number; name: string; min_years: number; max_years: number } | null; inventory_warehouse: { id: number; product: { id: number; name: string; serial_number?: string; category?: string; }; } | null; active_assignment: { id: number; employee: { id: number; name: string; department: { id: number; name: string; } | null; }; } | null; } export interface AssetsPaginatedResponse { status: string; data: { current_page: number; data: Asset[]; last_page: number; per_page: number; total: number; }; } export interface AssetsListResponse { status: string; data: { data: Asset[]; }; } export interface AssetDetailResponse { status: string; data: { data: Asset; }; } export interface StatusOption { id: number; name: string; } export interface StatusOptionsResponse { status: string; data: { data: StatusOption[]; }; } interface AssetFilters { q?: string; status?: number; page?: number; paginate?: boolean; } export interface AssetAssignment { id: number; asset_id: number; employee_id: number; assigned_at: string; returned_at: string | null; receipt_folio: string | null; notes: string | null; status: { id: number; name: string }; asset: Asset | null; employee: { id: number; name: string; paternal: string; maternal: string; department: { id: number; name: string } | null; } | null; } export interface AssetAssignmentResponse { status: string; data: { data: AssetAssignment }; } export interface AssetAssignmentsPaginatedResponse { status: string; data: { data: { current_page: number; data: AssetAssignment[]; last_page: number; per_page: number; total: number; }; }; } export interface UserOption { id: number; name: string; paternal: string; maternal: string; full_name: string; } export interface UsersResponse { data: UserOption[]; } interface AssignAssetData { employee_id: number; assigned_at?: string; receipt_folio?: string; authorized_by?: number; delivered_by?: number; notes?: string; } interface ReturnAssetData { returned_at?: string; notes?: string; } class FixedAssetsService { async getAssets(filters: AssetFilters = {}): Promise { const params: Record = {}; if (filters.q) params.q = filters.q; if (filters.status) params.status = filters.status; if (filters.page) params.page = filters.page; if (filters.paginate !== undefined) params.paginate = filters.paginate; const response = await api.get('/api/assets', { params }); return response.data; } async getAsset(id: number): Promise { const response = await api.get(`/api/assets/${id}`); return response.data; } async createAsset(data: Record): Promise { const response = await api.post('/api/assets', data); return response.data; } async updateAsset(id: number, data: Record): Promise { const response = await api.put(`/api/assets/${id}`, data); return response.data; } async deleteAsset(id: number): Promise { await api.delete(`/api/assets/${id}`); } async getStatusOptions(): Promise { const response = await api.get('/api/assets/options/status'); return response.data.data.data; } async getAssignments(filters: { q?: string; status?: number; page?: number; paginate?: boolean } = {}): Promise { const params: Record = {}; if (filters.q) params.q = filters.q; if (filters.status !== undefined) params.status = filters.status; if (filters.page) params.page = filters.page; if (filters.paginate !== undefined) params.paginate = filters.paginate; const response = await api.get('/api/assets/assignments', { params }); return response.data; } async assignAsset(assetId: number, data: AssignAssetData): Promise { const response = await api.post(`/api/assets/${assetId}/assignments`, data); return response.data; } async returnAsset(assetId: number, assignmentId: number, data: ReturnAssetData): Promise { const response = await api.put(`/api/assets/${assetId}/assignments/${assignmentId}/return`, data); return response.data; } async getUsers(): Promise { const response = await api.get('/api/rh/employees', { params: { paginate: false } }); return response.data.data.map((e: any) => ({ ...e, full_name: `${e.name} ${e.paternal} ${e.maternal ?? ''}`.trim(), })); } async getUsefulLifeCatalog(): Promise { const response = await api.get('/api/catalogs/useful-life-catalog', { params: { paginate: false } }); return response.data.data.data; } async getFiscalDepreciationRates(): Promise { const response = await api.get('/api/catalogs/fiscal-depreciation-rates', { params: { paginate: false } }); return response.data.data.data; } async calculateUsefulLife(params: { useful_life_catalog_id?: number }): Promise { const response = await api.get('/api/assets/options/calculate-useful-life', { params }); return response.data.data; } async downloadResguardo(assetId: number, assignmentId: number): Promise { const response = await api.get( `/api/assets/${assetId}/assignments/${assignmentId}/resguardo`, { responseType: 'blob' } ); const blobUrl = URL.createObjectURL(new Blob([response.data], { type: 'application/pdf' })); const link = document.createElement('a'); link.href = blobUrl; link.target = '_blank'; link.click(); URL.revokeObjectURL(blobUrl); } } export const fixedAssetsService = new FixedAssetsService(); export default fixedAssetsService;