Improve the frontend and repository layer
This commit is contained in:
@@ -250,12 +250,38 @@ export class POSService {
|
||||
async getPOSTransaction(params: {
|
||||
tenant_id: string;
|
||||
transaction_id: string;
|
||||
}): Promise<{
|
||||
transaction: POSTransaction;
|
||||
}> {
|
||||
}): Promise<POSTransaction> {
|
||||
const { tenant_id, transaction_id } = params;
|
||||
const url = `/tenants/${tenant_id}${this.basePath}/transactions/${transaction_id}`;
|
||||
|
||||
|
||||
return apiClient.get(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get POS transactions dashboard summary
|
||||
*/
|
||||
async getPOSTransactionsDashboard(params: {
|
||||
tenant_id: string;
|
||||
}): Promise<{
|
||||
total_transactions_today: number;
|
||||
total_transactions_this_week: number;
|
||||
total_transactions_this_month: number;
|
||||
revenue_today: number;
|
||||
revenue_this_week: number;
|
||||
revenue_this_month: number;
|
||||
average_transaction_value: number;
|
||||
status_breakdown: Record<string, number>;
|
||||
payment_method_breakdown: Record<string, number>;
|
||||
sync_status: {
|
||||
synced: number;
|
||||
pending: number;
|
||||
failed: number;
|
||||
last_sync_at?: string;
|
||||
};
|
||||
}> {
|
||||
const { tenant_id } = params;
|
||||
const url = `/tenants/${tenant_id}${this.basePath}/operations/transactions-dashboard`;
|
||||
|
||||
return apiClient.get(url);
|
||||
}
|
||||
|
||||
|
||||
152
frontend/src/api/services/settings.ts
Normal file
152
frontend/src/api/services/settings.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
// frontend/src/api/services/settings.ts
|
||||
/**
|
||||
* API service for Tenant Settings
|
||||
* Handles all HTTP requests for tenant operational configuration
|
||||
*/
|
||||
|
||||
import { apiClient } from '../client/apiClient';
|
||||
import type {
|
||||
TenantSettings,
|
||||
TenantSettingsUpdate,
|
||||
SettingsCategory,
|
||||
CategoryResetResponse,
|
||||
} from '../types/settings';
|
||||
|
||||
export const settingsApi = {
|
||||
/**
|
||||
* Get all settings for a tenant
|
||||
*/
|
||||
getSettings: async (tenantId: string): Promise<TenantSettings> => {
|
||||
try {
|
||||
console.log('🔍 Fetching settings for tenant:', tenantId);
|
||||
const response = await apiClient.get<TenantSettings>(`/tenants/${tenantId}/settings`);
|
||||
console.log('📊 Settings API response data:', response);
|
||||
|
||||
// Validate the response data structure
|
||||
if (!response) {
|
||||
throw new Error('Settings response data is null or undefined');
|
||||
}
|
||||
|
||||
if (!response.tenant_id) {
|
||||
throw new Error('Settings response missing tenant_id');
|
||||
}
|
||||
|
||||
if (!response.procurement_settings) {
|
||||
throw new Error('Settings response missing procurement_settings');
|
||||
}
|
||||
|
||||
console.log('✅ Settings data validation passed');
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ Error fetching settings:', error);
|
||||
console.error('Error details:', {
|
||||
message: (error as Error).message,
|
||||
stack: (error as Error).stack,
|
||||
tenantId
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Update tenant settings (partial update supported)
|
||||
*/
|
||||
updateSettings: async (
|
||||
tenantId: string,
|
||||
updates: TenantSettingsUpdate
|
||||
): Promise<TenantSettings> => {
|
||||
try {
|
||||
console.log('🔍 Updating settings for tenant:', tenantId, 'with updates:', updates);
|
||||
const response = await apiClient.put<TenantSettings>(`/tenants/${tenantId}/settings`, updates);
|
||||
console.log('📊 Settings update response:', response);
|
||||
|
||||
if (!response) {
|
||||
throw new Error('Settings update response data is null or undefined');
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ Error updating settings:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get settings for a specific category
|
||||
*/
|
||||
getCategorySettings: async (
|
||||
tenantId: string,
|
||||
category: SettingsCategory
|
||||
): Promise<Record<string, any>> => {
|
||||
try {
|
||||
console.log('🔍 Fetching category settings for tenant:', tenantId, 'category:', category);
|
||||
const response = await apiClient.get<{ tenant_id: string; category: string; settings: Record<string, any> }>(
|
||||
`/tenants/${tenantId}/settings/${category}`
|
||||
);
|
||||
console.log('📊 Category settings response:', response);
|
||||
|
||||
if (!response || !response.settings) {
|
||||
throw new Error('Category settings response data is null or undefined');
|
||||
}
|
||||
|
||||
return response.settings;
|
||||
} catch (error) {
|
||||
console.error('❌ Error fetching category settings:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Update settings for a specific category
|
||||
*/
|
||||
updateCategorySettings: async (
|
||||
tenantId: string,
|
||||
category: SettingsCategory,
|
||||
settings: Record<string, any>
|
||||
): Promise<TenantSettings> => {
|
||||
try {
|
||||
console.log('🔍 Updating category settings for tenant:', tenantId, 'category:', category, 'settings:', settings);
|
||||
const response = await apiClient.put<TenantSettings>(
|
||||
`/tenants/${tenantId}/settings/${category}`,
|
||||
{ settings }
|
||||
);
|
||||
console.log('📊 Category settings update response:', response);
|
||||
|
||||
if (!response) {
|
||||
throw new Error('Category settings update response data is null or undefined');
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ Error updating category settings:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset a category to default values
|
||||
*/
|
||||
resetCategory: async (
|
||||
tenantId: string,
|
||||
category: SettingsCategory
|
||||
): Promise<CategoryResetResponse> => {
|
||||
try {
|
||||
console.log('🔍 Resetting category for tenant:', tenantId, 'category:', category);
|
||||
const response = await apiClient.post<CategoryResetResponse>(
|
||||
`/tenants/${tenantId}/settings/${category}/reset`
|
||||
);
|
||||
console.log('📊 Category reset response:', response);
|
||||
|
||||
if (!response) {
|
||||
throw new Error('Category reset response data is null or undefined');
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ Error resetting category:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default settingsApi;
|
||||
85
frontend/src/api/services/sustainability.ts
Normal file
85
frontend/src/api/services/sustainability.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Sustainability API Service
|
||||
* Environmental impact, SDG compliance, and grant reporting
|
||||
*/
|
||||
|
||||
import apiClient from '../client/apiClient';
|
||||
import type {
|
||||
SustainabilityMetrics,
|
||||
SustainabilityWidgetData,
|
||||
SDGCompliance,
|
||||
EnvironmentalImpact,
|
||||
GrantReport
|
||||
} from '../types/sustainability';
|
||||
|
||||
const BASE_PATH = '/sustainability';
|
||||
|
||||
/**
|
||||
* Get comprehensive sustainability metrics
|
||||
*/
|
||||
export async function getSustainabilityMetrics(
|
||||
tenantId: string,
|
||||
startDate?: string,
|
||||
endDate?: string
|
||||
): Promise<SustainabilityMetrics> {
|
||||
const params = new URLSearchParams();
|
||||
if (startDate) params.append('start_date', startDate);
|
||||
if (endDate) params.append('end_date', endDate);
|
||||
|
||||
const queryString = params.toString();
|
||||
const url = `/tenants/${tenantId}${BASE_PATH}/metrics${queryString ? `?${queryString}` : ''}`;
|
||||
|
||||
return await apiClient.get<SustainabilityMetrics>(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get simplified sustainability widget data
|
||||
*/
|
||||
export async function getSustainabilityWidgetData(
|
||||
tenantId: string,
|
||||
days: number = 30
|
||||
): Promise<SustainabilityWidgetData> {
|
||||
return await apiClient.get<SustainabilityWidgetData>(
|
||||
`/tenants/${tenantId}${BASE_PATH}/widget?days=${days}`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get SDG 12.3 compliance status
|
||||
*/
|
||||
export async function getSDGCompliance(tenantId: string): Promise<SDGCompliance> {
|
||||
return await apiClient.get<SDGCompliance>(
|
||||
`/tenants/${tenantId}${BASE_PATH}/sdg-compliance`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get environmental impact metrics
|
||||
*/
|
||||
export async function getEnvironmentalImpact(
|
||||
tenantId: string,
|
||||
days: number = 30
|
||||
): Promise<EnvironmentalImpact> {
|
||||
return await apiClient.get<EnvironmentalImpact>(
|
||||
`/tenants/${tenantId}${BASE_PATH}/environmental-impact?days=${days}`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Export grant application report
|
||||
*/
|
||||
export async function exportGrantReport(
|
||||
tenantId: string,
|
||||
grantType: string = 'general',
|
||||
startDate?: string,
|
||||
endDate?: string
|
||||
): Promise<GrantReport> {
|
||||
const payload: any = { grant_type: grantType, format: 'json' };
|
||||
if (startDate) payload.start_date = startDate;
|
||||
if (endDate) payload.end_date = endDate;
|
||||
|
||||
return await apiClient.post<GrantReport>(
|
||||
`/tenants/${tenantId}${BASE_PATH}/export/grant-report`,
|
||||
payload
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user