refactor(frontend): migrate Customer domain to centralized API services

- Replaced all direct axios imports with service layer calls across 8 customer files
- Migrated core pages: home.vue, create.vue, edit.vue
- Migrated profile pages: profile.vue (1100+ lines), TankEstimation.vue
- Migrated supporting pages: ServicePlanEdit.vue, tank/edit.vue, list.vue

Services integrated:
- customerService: CRUD, descriptions, tank info, automatic status
- authService: authentication and Authorize.net account management
- paymentService: credit cards, transactions, payment authorization
- deliveryService: delivery records and automatic delivery data
- serviceService: service calls, parts, and service plans
- adminService: statistics, social comments, and reports
- queryService: dropdown data (customer types, states)

Type safety improvements:
- Updated paymentService.ts with accurate AxiosResponse types
- Fixed response unwrapping to match api.ts interceptor behavior
- Resolved all TypeScript errors in customer domain (0 errors)

Benefits:
- Consistent authentication via centralized interceptors
- Standardized error handling across all API calls
- Improved type safety with proper TypeScript interfaces
- Single source of truth for API endpoints
- Better testability through mockable services

Verified with vue-tsc --noEmit - all customer domain files pass type checking
This commit is contained in:
2026-02-01 13:00:21 -05:00
parent 5060ca8d9b
commit 72d8e35e06
59 changed files with 850 additions and 6220 deletions

View File

@@ -1,85 +1,88 @@
import api, { autoApi } from './api';
import {
Delivery,
DeliveryNote,
AutoDelivery,
DeliveryListResponse,
CreateDeliveryRequest,
UpdateDeliveryRequest,
ApiResponse
DeliveriesResponse,
DeliveryResponse,
AxiosResponse
} from '../types/models';
// API Response wrappers for this service
interface DeliveryTotalResponse { ok: boolean; total: number; priceprime?: number; pricesameday?: number; priceemergency?: number; total_amount?: number; discount?: number; total_amount_after_discount?: number; }
interface CashResponse { ok: boolean; amount: number; }
export const deliveryService = {
// CRUD operations
create: (customerId: number, data: CreateDeliveryRequest): Promise<ApiResponse<Delivery>> =>
create: (customerId: number, data: CreateDeliveryRequest): Promise<AxiosResponse<DeliveryResponse>> =>
api.post(`/delivery/create/${customerId}`, data),
getById: (id: number): Promise<ApiResponse<Delivery>> =>
getById: (id: number): Promise<AxiosResponse<DeliveryResponse>> =>
api.get(`/delivery/${id}`),
getOrder: (id: number): Promise<ApiResponse<Delivery>> =>
getOrder: (id: number): Promise<AxiosResponse<DeliveryResponse>> =>
api.get(`/delivery/order/${id}`),
update: (id: number, data: UpdateDeliveryRequest): Promise<ApiResponse<Delivery>> =>
update: (id: number, data: UpdateDeliveryRequest): Promise<AxiosResponse<DeliveryResponse>> =>
api.put(`/delivery/edit/${id}`, data),
delete: (id: number): Promise<ApiResponse<void>> =>
delete: (id: number): Promise<AxiosResponse<{ ok: boolean }>> =>
api.delete(`/delivery/delete/${id}`),
cancel: (id: number): Promise<ApiResponse<void>> =>
cancel: (id: number): Promise<AxiosResponse<{ ok: boolean }>> =>
api.put(`/delivery/cancel/${id}`),
markCancelled: (id: number): Promise<ApiResponse<void>> =>
markCancelled: (id: number): Promise<AxiosResponse<{ ok: boolean }>> =>
api.put(`/delivery/cancelled/${id}`),
// List operations
getAll: (page: number = 1): Promise<DeliveryListResponse> =>
getAll: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/all/${page}`),
getByCustomer: (customerId: number, page: number = 1): Promise<DeliveryListResponse> =>
getByCustomer: (customerId: number, page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/customer/${customerId}/${page}`),
getPast1: (customerId: number): Promise<ApiResponse<Delivery[]>> =>
getPast1: (customerId: number): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/past1/${customerId}`),
getPast2: (customerId: number): Promise<ApiResponse<Delivery[]>> =>
getPast2: (customerId: number): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/past2/${customerId}`),
// Status-based lists
getWaiting: (page: number = 1): Promise<DeliveryListResponse> =>
getWaiting: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/waiting/${page}`),
getTomorrow: (page: number = 1): Promise<DeliveryListResponse> =>
getTomorrow: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/tommorrow/${page}`),
getOutForDelivery: (page: number = 1): Promise<DeliveryListResponse> =>
getOutForDelivery: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/outfordelivery/${page}`),
getDelivered: (page: number = 1): Promise<DeliveryListResponse> =>
getDelivered: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/delivered/${page}`),
getFinalized: (page: number = 1): Promise<DeliveryListResponse> =>
getFinalized: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/finalized/${page}`),
getPending: (page: number = 1): Promise<DeliveryListResponse> =>
getPending: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/pending/${page}`),
getIssues: (page: number = 1): Promise<DeliveryListResponse> =>
getIssues: (page: number = 1): Promise<AxiosResponse<DeliveriesResponse>> =>
api.get(`/delivery/issue/${page}`),
// Status & totals
updateStatus: (data: { id: number; status: number }): Promise<ApiResponse<void>> =>
updateStatus: (data: { id: number; status: number }): Promise<AxiosResponse<{ ok: boolean }>> =>
api.put('/delivery/updatestatus', data),
getTotal: (id: number): Promise<ApiResponse<{ total: number }>> =>
getTotal: (id: number): Promise<AxiosResponse<DeliveryTotalResponse>> =>
api.get(`/delivery/total/${id}`),
// Cash handling
handleCash: (id: number, type: string): Promise<ApiResponse<{ amount: number }>> =>
handleCash: (id: number, type: string): Promise<AxiosResponse<CashResponse>> =>
api.get(`/delivery/cash/${id}/${type}`),
// Finalize
finalize: (id: number, data?: { final_price: number }): Promise<ApiResponse<void>> =>
finalize: (id: number, data?: { final_price: number }): Promise<AxiosResponse<{ ok: boolean }>> =>
api.put(`/deliverydata/finalize/${id}`, data),
// Auto system endpoints (VITE_AUTO_URL)