import { AffiliateModel } from "../Affiliate/AffiliateModel.js"; //Note AffiliteModel is binded with coupons //GET ALL Coupons export const listAllCoupon = async (req, res) => { try { const coupon = await AffiliateModel.find( {}, { name: 1, _id: 1, coupon_code: 1, discount_amount: 1, affiliate_discount_amount: 1, is_coupon_active: 1, } ).sort({ createdAt: -1 }); const filteredCoupons = coupon.filter( (data) => !(data.coupon_code == null) ); // console.log(filteredCoupons); // console.log(coupon); res.status(200).json({ success: true, message: filteredCoupons, }); } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : "Something went wrong!", }); } }; //CREATE Coupon (AKA Need to update Affiliate ) export const createCoupon = async (req, res) => { //creation of date const date = new Date(); const daysOfWeek = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; const monthsOfYear = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]; const dayOfWeek = daysOfWeek[date.getUTCDay()]; const dateOfMonth = date.getUTCDate(); const month = monthsOfYear[date.getUTCMonth()]; const year = date.getUTCFullYear(); const formattedDate = `${dayOfWeek} ${dateOfMonth}-${month}-${year}`; const { coupon_code, discount_amount, valid_till, is_coupon_active, affiliate_discount_amount, } = req.body; try { const { id } = req.body; const update = { coupon_code, discount_amount, valid_till, affiliate_discount_amount, createdAt: formattedDate, is_coupon_active, }; const options = { new: true }; const saveData = await AffiliateModel.findByIdAndUpdate( id, update, options ); if (saveData) { res.json("done"); } else { res.status(404).json("Affiliate not found"); } } catch (error) { res.status(400).json({ success: true, message: "Coupon Already Exists", }); console.log(error); } }; //GET AFFILIATE FOR COUPON LIST export const listAffiliateCoupon = async (req, res) => { try { let resArr = []; const coupon = await AffiliateModel.find( {}, { name: 1, _id: 1, is_coupon_active: 1, mobile: 1, } ); for (let i = 0; i < coupon.length; i++) { if (coupon[i].is_coupon_active == false) { resArr.push(coupon[i]); } } // console.log(resArr); res.status(200).json({ success: true, message: resArr, }); } catch (error) { res.status(500).json({ success: false, message: error.message ? error.message : "Something went wrong!", }); } }; //EDIT COUPON export const editCoupon = async (req, res) => { const { coupon_code, discount_amount, valid_till, affiliate_discount_amount, } = req.body; const updateFields = {}; // Add only the fields that are present in the request body to the updateFields object if (coupon_code) updateFields.coupon_code = coupon_code; if (discount_amount) updateFields.discount_amount = discount_amount; if (valid_till) updateFields.valid_till = valid_till; if (affiliate_discount_amount) updateFields.affiliate_discount_amount = affiliate_discount_amount; try { const saveData = await AffiliateModel.findByIdAndUpdate( { _id: req.params.id }, { $set: updateFields }, { new: true } ); res.json({ success: true, message: "Coupon Edited Succesfully", }); } catch (error) { res.status(400).json({ success: false, message: error.message ? error.message .split(":") .splice(1) .join(":") .trim() .split(":") .splice(1) .join(":") .trim() : "Error in Editing Coupon", }); } }; //SUSPEND COUPON export const suspendCoupon = async (req, res) => { const { id, is_coupon_active } = req.body; try { const saveData = await AffiliateModel.findByIdAndUpdate(id, { is_coupon_active: is_coupon_active, }); res.status(200).json({ success: true, message: "Success", }); } catch (error) { res.status(400).json({ success: false, message: "Coupon Doesn't Exists", }); } }; //GET ONE COUPON export const getOneCoupon = async (req, res) => { if (req.params?.id) { try { const saveData = await AffiliateModel.findById(req.params.id); const resObj = { name: saveData.name, mobile: saveData.mobile, coupon_code: saveData.coupon_code, discount_amount: saveData.discount_amount, valid_till: saveData.valid_till, affiliate_discount_amount: saveData.affiliate_discount_amount, }; res.status(200).json({ success: true, message: resObj, }); } catch (error) { res.status(400).json({ success: false, message: "Error in getting Coupons", }); } } }; //Validate Coupon----------------------- export const validateCoupon = async (req, res) => { const { coupon } = req.params; if (!coupon) { return res.status(400).json({ success: false, message: "Coupon code is required", }); } try { // Find the coupon data in the database const couponData = await AffiliateModel.findOne({ coupon_code: coupon }); if (!couponData) { return res.status(404).json({ success: false, message: "Coupon not found", }); } const { valid_till, discount_amount, is_coupon_active } = couponData; //Check whether Coupon is Active or not if (!is_coupon_active) { return res.status(404).json({ success: false, message: "Coupon Code Expired", }); } // Check if the coupon is expired const currentDate = new Date(); const expirationDate = new Date(valid_till); if (currentDate > expirationDate) { return res.status(400).json({ success: false, message: "Coupon has expired", }); } // If coupon is valid, return success response res.status(200).json({ success: true, message: "Coupon is valid", discount_amount: discount_amount, }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Internal server error", }); } }; //PAY & HISTORY--------------------- export const usedCoupon = async (req, res) => { // Retrieve orderId and coupon_code from request body or query parameters const { orderId, coupon_code, userId } = req.body; if (!orderId || !coupon_code || !userId) { return res.status(400).json({ success: false, message: "Error in getting OrderId or Coupon", }); } // Validating Coupon try { const couponData = await AffiliateModel.findOne({ coupon_code: coupon_code, }); //order exists or not if (!couponData) { // Check if the coupon exists return res.status(404).json({ success: false, message: "Coupon not found", }); } // Check if orderId is unique try { const isOrderIdUnique = await AffiliateModel.find( {}, { coupon_used_history: 1, } ); let orderIdFound = false; isOrderIdUnique.forEach((data) => { data.coupon_used_history.forEach((subItem) => { if (subItem.orderId == orderId) { orderIdFound = true; } }); }); if (orderIdFound) { return res.status(400).json({ success: false, message: "Error: OrderId already used", }); } } catch (error) { console.error(error); return res.status(500).json({ success: false, message: "Internal server error", }); } //If not unique then create const { valid_till, is_coupon_active, is_affiliate_active, affiliate_discount_amount, _id, } = couponData; // console.log(couponData); if (!is_coupon_active || !is_affiliate_active) { return res.status(404).json({ success: false, message: "Coupon Code Expired", }); } const currentDate = new Date(); const expirationDate = new Date(valid_till); if (currentDate > expirationDate) { return res.status(400).json({ success: false, message: "Coupon has expired", }); } AffiliateModel.findByIdAndUpdate( _id, { $inc: { total_earning: affiliate_discount_amount, coupon_claimed: 1 }, $push: { coupon_used_history: { orderId: orderId, userId: userId, date: currentDate, couponCode: coupon_code, }, }, }, { new: true } ) .then(() => { res.status(200).json({ success: true, message: "Coupon add success", }); }) .catch((error) => { console.error(error); res.status(500).json({ success: false, message: "Internal server error", }); }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: "Internal server error", }); } }; //Get Coupon data for History export const couponPayHistory = async (req, res) => { if (req.params?.id) { try { const saveData = await AffiliateModel.findById(req.params.id).sort({ updatedAt: -1, }); // console.log(saveData.coupon_used_history); const resObj = { coupon_used_history: saveData.coupon_used_history, coupon_code: saveData.coupon_code, }; res.status(200).json({ success: true, message: resObj, }); } catch (error) { res.status(400).json({ success: false, message: "Error in getting History", }); } } };