Untitled

 avatar
unknown
javascript
5 days ago
5.8 kB
5
Indexable
router.post("/daily_report", permissionCheck("ADMIN_RAPOR"), async (req, res) => {
    try {
        let { start_date, end_date } = req.body;

        // Default dates if not provided: 2 months ago to today
        if (!start_date) {
            start_date = moment().subtract(1, 'months').startOf('day').toDate();
        }
        if (!end_date) {
            end_date = moment().endOf('day').toDate();
        }

        // Get all earnings grouped by day and type
        const earnings = await AdminSalaryModel.aggregate([
            {
                $match: {
                    dayDate: {
                        $gte: new Date(start_date),
                        $lte: new Date(end_date)
                    }
                }
            },
            {
                $group: {
                    _id: {
                        date: { $dateToString: { format: "%Y-%m-%d", date: "$dayDate" } },
                        type: "$Type"
                    },
                    total: { $sum: "$Salary" }
                }
            }
        ]);

        // Get all payouts grouped by day
        const payouts = await AdminFinanceModel.aggregate([
            {
                $match: {
                    Status: "success",
                    verifyDate: {
                        $gte: new Date(start_date),
                        $lte: new Date(end_date)
                    }
                }
            },
            {
                $group: {
                    _id: {
                        date: { $dateToString: { format: "%Y-%m-%d", date: "$verifyDate" } }
                    },
                    total: { $sum: "$AmountTL" }
                }
            }
        ]);

        // Get revenue grouped by day and platform
        const revenue = await PurchaseModel.aggregate([
            {
                $match: {
                    purchasedAt: {
                        $gte: new Date(start_date),
                        $lte: new Date(end_date)
                    }
                }
            },
            {
                $group: {
                    _id: {
                        date: { $dateToString: { format: "%Y-%m-%d", date: "$purchasedAt" } },
                        platform: {
                            $switch: {
                                branches: [
                                    { case: { $eq: ["$store", "PLAY_STORE"] }, then: "android" },
                                    { case: { $eq: ["$store", "APP_STORE"] }, then: "ios" }
                                ],
                                default: "other"
                            }
                        }
                    },
                    total: { $sum: "$price" }
                }
            }
        ]);

        // Combine all data
        const dailyStats = new Map();

        // Process earnings
        earnings.forEach(earning => {
            const date = earning._id.date;
            if (!dailyStats.has(date)) {
                dailyStats.set(date, {
                    date,
                    adminHour: 0,
                    adminPrim: 0,
                    adminTotal: 0,
                    adminPayouts: 0,
                    revenue: 0,
                    revenueAndroid: 0,
                    revenueIos: 0
                });
            }

            const dayData = dailyStats.get(date);
            if (earning._id.type === 'hour') {
                dayData.adminHour = earning.total;
            } else if (earning._id.type === 'prim') {
                dayData.adminPrim = earning.total;
            }
            dayData.adminTotal = dayData.adminHour + dayData.adminPrim;
        });

        // Process payouts
        payouts.forEach(payout => {
            const date = payout._id.date;
            if (dailyStats.has(date)) {
                dailyStats.get(date).adminPayouts = payout.total;
            } else {
                dailyStats.set(date, {
                    date,
                    adminHour: 0,
                    adminPrim: 0,
                    adminTotal: 0,
                    adminPayouts: payout.total,
                    revenue: 0,
                    revenueAndroid: 0,
                    revenueIos: 0
                });
            }
        });

        // Process revenue
        revenue.forEach(rev => {
            const date = rev._id.date;
            if (!dailyStats.has(date)) {
                dailyStats.set(date, {
                    date,
                    adminHour: 0,
                    adminPrim: 0,
                    adminTotal: 0,
                    adminPayouts: 0,
                    revenue: 0,
                    revenueAndroid: 0,
                    revenueIos: 0
                });
            }

            const dayData = dailyStats.get(date);
            if (rev._id.platform === 'android') {
                dayData.revenueAndroid = rev.total;
            } else if (rev._id.platform === 'ios') {
                dayData.revenueIos = rev.total;
            }
            dayData.revenue = dayData.revenueAndroid + dayData.revenueIos;
        });

        const dailyData = Array.from(dailyStats.values());
        dailyData.sort((a, b) => b.date.localeCompare(a.date)); // Sort by date descending

        res.send({
            status: true,
            data: dailyData,
            date_range: {
                start_date: moment(start_date).format('YYYY-MM-DD'),
                end_date: moment(end_date).format('YYYY-MM-DD')
            }
        });

    } catch (e) {
        console.log("Daily salary error:", e);
        res.send({ status: false, msg: e.toString() });
    }
});
Editor is loading...
Leave a Comment