Improve the frontend and repository layer

This commit is contained in:
Urtzi Alfaro
2025-10-23 07:44:54 +02:00
parent 8d30172483
commit 07c33fa578
112 changed files with 14726 additions and 2733 deletions

View File

@@ -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);
}

View 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;

View 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
);
}