chore: build
Frontend Admin - EAS Build / build (push) Canceled after 0s
Frontend Client - EAS Build / build (push) Canceled after 0s
Backend - Build & Lint / build (push) Failing after 25m18s
Frontend Web - Build & Lint / build (push) Failing after 9m58s

This commit is contained in:
Xor290
2026-08-06 12:06:05 +02:00
parent c034088bee
commit 22a8d5026c
174 changed files with 30315 additions and 16120 deletions
+209 -6
View File
@@ -104,6 +104,36 @@ export interface ProductQuantityBreakdown {
quantities: QuantityStat[];
}
export interface DailyProductItem {
product_id: number;
name: string;
quantity: number;
order_count: number;
revenue: number;
}
export interface DailyCategoryDetail {
category: string;
category_color: string;
total_quantity: number;
total_revenue: number;
products: DailyProductItem[];
}
export interface DailyDetail {
date: string;
total_orders: number;
total_quantity: number;
total_revenue: number;
categories: DailyCategoryDetail[];
}
export type StatSection =
| "commandes"
| "revenus"
| "produits"
| "heures"
| "jours"
| "doses";
export interface AdminStats {
summary: StatsSummary;
by_weekday: WeekdayStat[];
@@ -112,6 +142,13 @@ export interface AdminStats {
by_hour: HourStat[];
top_products: ProductStat[];
by_quantity: ProductQuantityBreakdown[];
daily_detail?: DailyDetail;
reset_at_commandes?: string;
reset_at_revenus?: string;
reset_at_produits?: string;
reset_at_heures?: string;
reset_at_jours?: string;
reset_at_doses?: string;
}
export const getAdminStats = async (): Promise<AdminStats> => {
@@ -119,6 +156,55 @@ export const getAdminStats = async (): Promise<AdminStats> => {
return data;
};
export const getAdminDailyDetail = async (
date: string,
): Promise<DailyDetail> => {
const { data } = await apiClient.get(`${V2}/admin/protected/stats/daily`, {
params: { date },
});
return data;
};
export const resetAdminStats = async (
section: StatSection,
): Promise<{ success: boolean; reset_at: string }> => {
const { data } = await apiClient.post(
`${V2}/admin/protected/stats/reset/${section}`,
);
return data;
};
// ============================================
// STATISTIQUES MENSUELLES (jour par jour)
// ============================================
export interface MonthlyDayStat {
day: string; // "2026-06-05"
label: string; // "05/06"
count: number;
revenue: number;
quantity: number;
}
export interface MonthlyStatsSummary {
total_orders: number;
total_revenue: number;
total_quantity: number;
}
export interface MonthlyStats {
month: string; // "2026-06"
summary: MonthlyStatsSummary;
by_day: MonthlyDayStat[];
}
export const getAdminStatsByMonth = async (
month?: string,
): Promise<MonthlyStats> => {
const { data } = await apiClient.get(
`${V2}/admin/protected/stats/monthly`,
{
params: month ? { month } : undefined,
},
);
return data;
};
export const getAllClients = async (): Promise<ClientResponse[]> => {
const { data } = await apiClient.get(`${V2}/admin/protected/all/clients`);
return data.clients || [];
@@ -237,9 +323,17 @@ export const validateCommand = async (commandId: number) => {
`${V2}/admin/protected/orders/${commandId}/force-validate`,
{ command_id: commandId },
);
const validated = (data.validated ?? []) as { command_id: number; points_awarded: number }[];
const points = validated.find((v) => v.command_id === commandId)?.points_awarded ?? 0;
return { success: true, points_awarded: points, validated_count: data.validated_count ?? 0 };
const validated = (data.validated ?? []) as {
command_id: number;
points_awarded: number;
}[];
const points =
validated.find((v) => v.command_id === commandId)?.points_awarded ?? 0;
return {
success: true,
points_awarded: points,
validated_count: data.validated_count ?? 0,
};
};
export const proposeAddressChangeAdmin = async (
@@ -264,7 +358,6 @@ export const notifyClientToDescend = async (commandId: number) => {
};
};
// ============================================
export const getAvailableDeliveryPersons = async () => {
@@ -299,6 +392,74 @@ export const getDeliveryPersonDetails = async (username: string) => {
return data.deliveryman || data;
};
export const getLivreurRatings = async (
username: string,
): Promise<{
ratings: {
id: number;
order_id: number;
client_username: string;
rating: number;
comment: string;
created_at: string;
}[];
average: number;
count: number;
}> => {
try {
const { data } = await apiClient.get(
`${V2}/admin/protected/delivery-persons/${username}/ratings`,
);
return data;
} catch {
return { ratings: [], average: 0, count: 0 };
}
};
export interface LoginHistoryEntry {
id: number;
username: string;
created_at: string;
}
export interface LoginHistoryWeek {
week: number;
entries: LoginHistoryEntry[];
}
export const getLivreurLoginHistory = async (
username: string,
year?: number,
month?: number,
): Promise<{
success: boolean;
year: number;
month: number;
weeks: LoginHistoryWeek[];
count: number;
}> => {
try {
const { data } = await apiClient.get(
`${V2}/admin/protected/delivery-persons/${username}/login-history`,
{ params: { year, month } },
);
return {
success: true,
year: data.year,
month: data.month,
weeks: data.weeks || [],
count: data.count || 0,
};
} catch {
return {
success: false,
year: year ?? new Date().getFullYear(),
month: month ?? new Date().getMonth() + 1,
weeks: [],
count: 0,
};
}
};
const parseStatus = (status: any): "available" | "busy" | "offline" => {
if (!status) return "offline";
if (status === "available" || status === "busy" || status === "offline")
@@ -446,10 +607,11 @@ export const createProductAdmin = async (formData: FormData) => {
`${V2}/admin/protected/products`,
formData,
{
headers: { "Content-Type": "multipart/form-data" },
timeout: 120000,
},
);
return { success: true, data: data.product, message: data.message };
return { success: true, data: data.data, message: data.message };
};
export const updateProductAdmin = async (
@@ -544,6 +706,18 @@ export const setClientParrain = async (
return { success: false, error: e.response?.data?.error || "Erreur" };
}
};
export const getClientParrain = async (
username: string,
): Promise<{ success: boolean; parrain?: string | null; error?: string }> => {
try {
const { data } = await apiClient.get(
`${V2}/admin/protected/client/${username}/parrain`,
);
return { success: true, parrain: data.parrain ?? null };
} catch (e: any) {
return { success: false, error: e.response?.data?.error || "Erreur" };
}
};
export const creditClientReferral = async (
username: string,
@@ -748,7 +922,7 @@ export const uploadProductMediaAdmin = async (
const { data } = await apiClient.post(
`${V2}/admin/protected/products/${productId}/media`,
fd,
{ timeout: 120000 },
{ headers: { "Content-Type": "multipart/form-data" }, timeout: 120000 },
);
return { success: true, media: data.media, message: data.message };
};
@@ -841,6 +1015,7 @@ export interface Category {
name: string;
color: string;
is_coming_soon: boolean;
position: number;
created_at: string;
}
@@ -906,6 +1081,22 @@ export const deleteCategoryAdmin = async (
}
};
export const reorderCategoriesAdmin = async (
ids: number[],
): Promise<{ success: boolean; error?: string }> => {
try {
await apiClient.put(`${V2}/admin/protected/categories/reorder`, {
ids,
});
return { success: true };
} catch (error: any) {
return {
success: false,
error: error.response?.data?.error || "Erreur",
};
}
};
// ============================================
// PARAMÈTRES GLOBAUX
// ============================================
@@ -1050,6 +1241,18 @@ export interface AppSettings {
delivery_mode: DeliveryModeConfig;
shop_name: string;
contact_telegram: string;
admin_color_primary: string;
admin_color_secondary: string;
admin_color_success: string;
admin_color_danger: string;
admin_color_warning: string;
client_color_primary: string;
client_color_secondary: string;
client_color_success: string;
client_color_danger: string;
client_color_warning: string;
client_title_gradient_from: string;
client_title_gradient_to: string;
}
export const getSettings = async (): Promise<{