chore: build
This commit is contained in:
@@ -537,7 +537,7 @@ func GetMyDeliveryStats(c *gin.Context) {
|
|||||||
gdb.Raw(`
|
gdb.Raw(`
|
||||||
SELECT DATE(updated_at) AS day,
|
SELECT DATE(updated_at) AS day,
|
||||||
COUNT(*) AS count,
|
COUNT(*) AS count,
|
||||||
COALESCE(SUM(total_prix), 0) AS revenue
|
COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) AS revenue
|
||||||
FROM commandes
|
FROM commandes
|
||||||
WHERE livreur_assign = ?
|
WHERE livreur_assign = ?
|
||||||
AND status IN ('livre', 'approved')
|
AND status IN ('livre', 'approved')
|
||||||
@@ -551,7 +551,7 @@ func GetMyDeliveryStats(c *gin.Context) {
|
|||||||
SELECT EXTRACT(WEEK FROM updated_at)::int AS week_num,
|
SELECT EXTRACT(WEEK FROM updated_at)::int AS week_num,
|
||||||
EXTRACT(YEAR FROM updated_at)::int AS year,
|
EXTRACT(YEAR FROM updated_at)::int AS year,
|
||||||
COUNT(*) AS count,
|
COUNT(*) AS count,
|
||||||
COALESCE(SUM(total_prix), 0) AS revenue
|
COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) AS revenue
|
||||||
FROM commandes
|
FROM commandes
|
||||||
WHERE livreur_assign = ?
|
WHERE livreur_assign = ?
|
||||||
AND status IN ('livre', 'approved')
|
AND status IN ('livre', 'approved')
|
||||||
@@ -565,7 +565,7 @@ func GetMyDeliveryStats(c *gin.Context) {
|
|||||||
SELECT EXTRACT(MONTH FROM updated_at)::int AS month_num,
|
SELECT EXTRACT(MONTH FROM updated_at)::int AS month_num,
|
||||||
EXTRACT(YEAR FROM updated_at)::int AS year,
|
EXTRACT(YEAR FROM updated_at)::int AS year,
|
||||||
COUNT(*) AS count,
|
COUNT(*) AS count,
|
||||||
COALESCE(SUM(total_prix), 0) AS revenue
|
COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) AS revenue
|
||||||
FROM commandes
|
FROM commandes
|
||||||
WHERE livreur_assign = ?
|
WHERE livreur_assign = ?
|
||||||
AND status IN ('livre', 'approved')
|
AND status IN ('livre', 'approved')
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ func GetAdminStats(c *gin.Context) {
|
|||||||
// ── Revenus par jour sur 30 jours (commandes approuvées) ─────────────────
|
// ── Revenus par jour sur 30 jours (commandes approuvées) ─────────────────
|
||||||
var dayRevRows []models.DayRevenueRow
|
var dayRevRows []models.DayRevenueRow
|
||||||
gdb.Raw(`
|
gdb.Raw(`
|
||||||
SELECT DATE(created_at) AS day, COALESCE(SUM(total_prix), 0) AS revenue
|
SELECT DATE(created_at) AS day, COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) AS revenue
|
||||||
FROM commandes
|
FROM commandes
|
||||||
WHERE created_at >= NOW() - INTERVAL '30 days'
|
WHERE created_at >= NOW() - INTERVAL '30 days'
|
||||||
AND status = 'approved'
|
AND status = 'approved'
|
||||||
@@ -87,7 +87,7 @@ func GetAdminStats(c *gin.Context) {
|
|||||||
SELECT
|
SELECT
|
||||||
EXTRACT(HOUR FROM created_at)::int AS hour,
|
EXTRACT(HOUR FROM created_at)::int AS hour,
|
||||||
COUNT(*) AS count,
|
COUNT(*) AS count,
|
||||||
COALESCE(SUM(total_prix), 0) AS revenue
|
COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) AS revenue
|
||||||
FROM commandes
|
FROM commandes
|
||||||
WHERE status != 'cancelled'
|
WHERE status != 'cancelled'
|
||||||
GROUP BY hour
|
GROUP BY hour
|
||||||
@@ -221,7 +221,7 @@ func GetAdminStats(c *gin.Context) {
|
|||||||
var totalOrders int64
|
var totalOrders int64
|
||||||
var totalRevenue float64
|
var totalRevenue float64
|
||||||
gdb.Raw(`SELECT COUNT(*) FROM commandes WHERE status != 'cancelled'`).Scan(&totalOrders)
|
gdb.Raw(`SELECT COUNT(*) FROM commandes WHERE status != 'cancelled'`).Scan(&totalOrders)
|
||||||
gdb.Raw(`SELECT COALESCE(SUM(total_prix), 0) FROM commandes WHERE status = 'approved'`).Scan(&totalRevenue)
|
gdb.Raw(`SELECT COALESCE(SUM(total_prix - COALESCE(referral_used, 0)), 0) FROM commandes WHERE status = 'approved'`).Scan(&totalRevenue)
|
||||||
|
|
||||||
avgPerDay := 0.0
|
avgPerDay := 0.0
|
||||||
if totalOrders > 0 {
|
if totalOrders > 0 {
|
||||||
|
|||||||
@@ -678,12 +678,17 @@ export default function OrderDetailScreen() {
|
|||||||
<Text style={styles.info}>Client: {command.username}</Text>
|
<Text style={styles.info}>Client: {command.username}</Text>
|
||||||
<Text style={styles.info}>Adresse: {command.adresse}</Text>
|
<Text style={styles.info}>Adresse: {command.adresse}</Text>
|
||||||
<Text style={styles.info}>
|
<Text style={styles.info}>
|
||||||
Total: {command.total_prix?.toFixed(2)} €
|
Total brut: {command.total_prix?.toFixed(2)} €
|
||||||
</Text>
|
</Text>
|
||||||
{command.referral_used > 0 && (
|
{command.referral_used > 0 && (
|
||||||
<Text style={[styles.info, { color: colors.success }]}>
|
<>
|
||||||
Parrainage utilisé: -{command.referral_used?.toFixed(2)} €
|
<Text style={[styles.info, { color: colors.success }]}>
|
||||||
</Text>
|
Parrainage utilisé: -{command.referral_used?.toFixed(2)} €
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.info, { fontWeight: "700", color: colors.textPrimary }]}>
|
||||||
|
Net: {(command.total_prix - command.referral_used).toFixed(2)} €
|
||||||
|
</Text>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
{command.livreur_assign && (
|
{command.livreur_assign && (
|
||||||
<Text style={styles.info}>
|
<Text style={styles.info}>
|
||||||
|
|||||||
@@ -487,8 +487,18 @@ export default function OrdersScreen() {
|
|||||||
<Text style={styles.info}>Client: {item.username}</Text>
|
<Text style={styles.info}>Client: {item.username}</Text>
|
||||||
<Text style={styles.info}>Adresse: {item.adresse}</Text>
|
<Text style={styles.info}>Adresse: {item.adresse}</Text>
|
||||||
<Text style={styles.info}>
|
<Text style={styles.info}>
|
||||||
Total: {item.total_prix.toFixed(2)} €
|
Total{(item.referral_used ?? 0) > 0 ? " brut" : ""}: {item.total_prix.toFixed(2)} €
|
||||||
</Text>
|
</Text>
|
||||||
|
{(item.referral_used ?? 0) > 0 && (
|
||||||
|
<>
|
||||||
|
<Text style={[styles.info, { color: colors.success }]}>
|
||||||
|
Parrainage: -{(item.referral_used ?? 0).toFixed(2)} €
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.info, { fontWeight: "700" }]}>
|
||||||
|
Net: {(item.total_prix - (item.referral_used ?? 0)).toFixed(2)} €
|
||||||
|
</Text>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<TouchableOpacity
|
<TouchableOpacity
|
||||||
style={styles.selectBtn}
|
style={styles.selectBtn}
|
||||||
|
|||||||
@@ -721,24 +721,34 @@ export default function DashboardScreen() {
|
|||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
{(item.referral_used ?? 0) > 0 && (
|
{(item.referral_used ?? 0) > 0 && (
|
||||||
<View style={[styles.totalRow, { marginTop: 2 }]}>
|
<>
|
||||||
<Text
|
<View style={[styles.totalRow, { marginTop: 2 }]}>
|
||||||
style={[
|
<Text
|
||||||
styles.totalLabel,
|
style={[
|
||||||
{ color: colors.success },
|
styles.totalLabel,
|
||||||
]}
|
{ color: colors.success },
|
||||||
>
|
]}
|
||||||
Parrainage client
|
>
|
||||||
</Text>
|
Parrainage client
|
||||||
<Text
|
</Text>
|
||||||
style={[
|
<Text
|
||||||
styles.totalValue,
|
style={[
|
||||||
{ color: colors.success },
|
styles.totalValue,
|
||||||
]}
|
{ color: colors.success },
|
||||||
>
|
]}
|
||||||
-{(item.referral_used ?? 0).toFixed(2)}€
|
>
|
||||||
</Text>
|
-{(item.referral_used ?? 0).toFixed(2)}€
|
||||||
</View>
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={[styles.totalRow, { marginTop: 2 }]}>
|
||||||
|
<Text style={[styles.totalLabel, { fontWeight: "700" }]}>
|
||||||
|
Net à encaisser
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.totalValue, { fontWeight: "700" }]}>
|
||||||
|
{((item.total_prix ?? 0) - (item.referral_used ?? 0)).toFixed(2)}€
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</View>
|
</View>
|
||||||
)}
|
)}
|
||||||
@@ -1994,24 +2004,34 @@ export default function DashboardScreen() {
|
|||||||
</Text>
|
</Text>
|
||||||
</View>
|
</View>
|
||||||
{(detailsDelivery?.referral_used ?? 0) > 0 && (
|
{(detailsDelivery?.referral_used ?? 0) > 0 && (
|
||||||
<View style={[styles.detailTotalRow, { marginTop: 4 }]}>
|
<>
|
||||||
<Text
|
<View style={[styles.detailTotalRow, { marginTop: 4 }]}>
|
||||||
style={[
|
<Text
|
||||||
styles.detailTotalLabel,
|
style={[
|
||||||
{ color: colors.success },
|
styles.detailTotalLabel,
|
||||||
]}
|
{ color: colors.success },
|
||||||
>
|
]}
|
||||||
Parrainage client
|
>
|
||||||
</Text>
|
Parrainage client
|
||||||
<Text
|
</Text>
|
||||||
style={[
|
<Text
|
||||||
styles.detailTotalValue,
|
style={[
|
||||||
{ color: colors.success },
|
styles.detailTotalValue,
|
||||||
]}
|
{ color: colors.success },
|
||||||
>
|
]}
|
||||||
-{detailsDelivery?.referral_used?.toFixed(2)}€
|
>
|
||||||
</Text>
|
-{detailsDelivery?.referral_used?.toFixed(2)}€
|
||||||
</View>
|
</Text>
|
||||||
|
</View>
|
||||||
|
<View style={[styles.detailTotalRow, { marginTop: 4 }]}>
|
||||||
|
<Text style={[styles.detailTotalLabel, { fontWeight: "700" }]}>
|
||||||
|
Net à encaisser
|
||||||
|
</Text>
|
||||||
|
<Text style={[styles.detailTotalValue, { fontWeight: "700" }]}>
|
||||||
|
{((detailsDelivery?.total_prix ?? 0) - (detailsDelivery?.referral_used ?? 0)).toFixed(2)}€
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
</DetailsModal>
|
</DetailsModal>
|
||||||
|
|||||||
@@ -409,6 +409,13 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.order-card-referral {
|
||||||
|
font-size: 0.72rem;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #10b981;
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
.order-card-chevron {
|
.order-card-chevron {
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
|
|||||||
@@ -480,6 +480,11 @@ function ConsultationHistorique() {
|
|||||||
<div className="order-card-footer">
|
<div className="order-card-footer">
|
||||||
<span className="order-card-total">
|
<span className="order-card-total">
|
||||||
{formatPrice((order.total_prix || 0) - (order.referral_used || 0))}
|
{formatPrice((order.total_prix || 0) - (order.referral_used || 0))}
|
||||||
|
{(order.referral_used || 0) > 0 && (
|
||||||
|
<span className="order-card-referral">
|
||||||
|
{" "}— dont {formatPrice(order.referral_used)} parrainage
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
<FontAwesomeIcon
|
<FontAwesomeIcon
|
||||||
icon={faChevronRight}
|
icon={faChevronRight}
|
||||||
|
|||||||
+8
-11
@@ -980,17 +980,14 @@ export const claimMyReward = async (poolKey: string): Promise<{
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const calculateOrderTotal = (order: any): number => {
|
export const calculateOrderTotal = (order: any): number => {
|
||||||
if (typeof order.total === "number" && order.total > 0) return order.total;
|
let gross = 0;
|
||||||
if (typeof order.total_prix === "number" && order.total_prix > 0)
|
if (typeof order.total === "number" && order.total > 0) gross = order.total;
|
||||||
return order.total_prix;
|
else if (typeof order.total_prix === "number" && order.total_prix > 0) gross = order.total_prix;
|
||||||
if (Array.isArray(order.items) && order.items.length > 0) {
|
else if (Array.isArray(order.items) && order.items.length > 0) {
|
||||||
return order.items.reduce((sum: number, item: any) => {
|
gross = order.items.reduce((sum: number, item: any) => {
|
||||||
return (
|
return sum + (item.prix || item.price || 0) * (item.quantite || item.quantity || 1);
|
||||||
sum +
|
|
||||||
(item.prix || item.price || 0) *
|
|
||||||
(item.quantite || item.quantity || 1)
|
|
||||||
);
|
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
return 0;
|
const referralUsed = typeof order.referral_used === "number" ? order.referral_used : 0;
|
||||||
|
return Math.max(0, gross - referralUsed);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user