import axios from "axios"; import { AffiliateModel } from "./AffiliateModel.js"; import Razorpay from "razorpay"; import UserModel from "../../user/userModel.js"; const razorpay = new Razorpay({ key_id: process.env.RAZERPAY_KEY_ID, key_secret: process.env.RAZERPAY_SECRET_KEY, }); import password from "secure-random-password"; import sendEmail from "../../../Utils/sendEmail.js"; // -----------------------------AFFILIATE & COUPONS ARE HARDLY BINDED DATA-------------------------------------------------------- //Create Affiliate export const createAffiliate = async (req, res) => { try { const result = req.body; let findAffiliate = await AffiliateModel.findOne({ email: result?.email }); if (findAffiliate) { return res.status(400).json({ success: false, message: "This Email Id Affiliate Already exists", }); } // Check if email already exists in User collection let findUser = await UserModel.findOne({ email: result?.email }); if (!findUser) { const passwords = password.randomPassword({ length: 10, characters: [ { characters: password.upper, exactly: 1 }, { characters: password.symbols, exactly: 1 }, password.lower, password.digits, ], }); // req.body.password = passwords; const user = await UserModel.create({ password: passwords, phone: result?.mobile, ...result, }); // console.log("user", user); await sendEmail({ to: `${result?.email}`, // Change to your recipient from: `${process.env.SEND_EMAIL_FROM}`, // Change to your verified sender subject: `Welcome to Smellika Affiliate!`, html: `

Welcome to Smellika Affiliate!

Hey ${ result?.name },

You can login into :${`https://smellika.com`}


Below are your Affiliate login credentials:

Email: ${result?.email}

Password: ${passwords}

Happy shopping,
`, }); } const affiliate = new AffiliateModel(result); const savedData = await affiliate.save(); if (savedData) { return res .status(201) .json({ success: true, message: "Affiliate Added" }); } } catch (error) { res.status(500).json({ success: false, message: error.message .split(":") .splice(1) .join(":") .trim() .split(":") .splice(1) .join(":") .trim(), }); } }; //EDIT export const editAffiliate = async (req, res) => { const updateFields = {}; const { name, mobile, email, country, state, city, address, pincode, nameAsBank, accountNo, ifsc, bankName, branchName, } = req.body; // Add only the fields that are present in the request body to the updateFields object if (name) updateFields.name = name; if (mobile) updateFields.mobile = mobile; if (email) updateFields.email = email; if (country) updateFields.country = country; if (state) { updateFields.state = state; } else { updateFields.state = ""; } if (city) { updateFields.city = city; } else { updateFields.city = ""; } if (address) updateFields.address = address; if (pincode) updateFields.pincode = pincode; if (nameAsBank) updateFields.nameAsBank = nameAsBank; if (accountNo) updateFields.accountNo = accountNo; if (ifsc) updateFields.ifsc = ifsc; if (bankName) updateFields.bankName = bankName; if (branchName) updateFields.branchName = branchName; try { const saveData = await AffiliateModel.findByIdAndUpdate( { _id: req.params.id }, { $set: updateFields }, { new: true } ); res.json({ success: true, message: "Affiliate Updated Succesfully", }); } catch (error) { res.status(400).json({ success: false, message: "Error in Updation", }); } }; //DELETE export const deleteAffiliate = async (req, res) => {}; //PAY AFFILIATE TODO export const payAffiliate = async (req, res) => { // console.log(req.body); const { noOfCoupons, amountToPay, amount, transecId, date, time } = req.body; if ( !req.params.id || !noOfCoupons || !amountToPay || !amount || !transecId || !date || !time ) { return res.status(400).json({ success: false, message: "Error in Payment", }); } try { const affiliate = await AffiliateModel.findById(req.params.id); //Checking if it's valid data from the client if ( amountToPay != affiliate.total_earning - affiliate.paid_amount || noOfCoupons != affiliate.coupon_claimed - affiliate.no_of_paid_coupon ) { return res.status(400).json({ success: false, message: "Data invalid", }); } // Construct the update operation const updateOperation = { $push: { affiliate_pay_history: { amount: amountToPay, transecId: transecId, date: date, time: time, }, }, $inc: { paid_amount: amountToPay, no_of_paid_coupon: noOfCoupons, }, }; // Execute the update operation const updatedAffiliate = await AffiliateModel.findByIdAndUpdate( req.params.id, updateOperation, { new: true } ); return res.json({ success: true, message: "Payment Done Successfully", updatedAffiliate: { updatedAffiliate }, }); } catch (error) { console.error(error); return res.status(400).json({ success: false, message: "Error in Payment", }); } }; //GET ONE AFFLILIATE export const getOneAffiliate = async (req, res) => { if (req.params?.id) { try { const saveData = await AffiliateModel.findById(req.params.id); const resObj = { name: saveData.name, mobile: saveData.mobile, email: saveData.email, country: saveData.country, state: saveData.state, city: saveData.city, address: saveData.address, pincode: saveData.pincode, nameAsBank: saveData.nameAsBank, accountNo: saveData.accountNo, ifsc: saveData.ifsc, bankName: saveData.bankName, branchName: saveData.branchName, }; res.status(200).json({ success: true, message: resObj, }); } catch (error) { res.status(400).json({ success: false, message: "Error in getting Affiliates", }); } } }; //LIST ALL AFFILIATE export const listAllAffiliate = async (req, res) => { try { const affiliate = await AffiliateModel.find( {}, { name: 1, _id: 1, coupon_claimed: 1, coupon_code: 1, total_earning: 1, paid_amount: 1, is_affiliate_active: 1, } ).sort({ createdAt: -1 }); res.status(200).json({ success: true, message: affiliate, }); } catch (error) { res.status(500).json({ success: false, messgae: error.message ? error.message : "Something went wrong!", }); } }; //Activate & Deactivate Affiliates export const suspendAffiliate = async (req, res) => { const { id, is_affiliate_active } = req.body; try { const saveData = await AffiliateModel.findByIdAndUpdate(id, { is_affiliate_active: is_affiliate_active, }); res.status(200).json({ success: true, message: "Success", }); } catch (error) { res.status(400).json({ success: false, message: "Affiliate Doesn't Exists", }); } }; //Get Affiliate data for payment export const getOneAffiliateForPay = async (req, res) => { if (req.params?.id) { try { const saveData = await AffiliateModel.findById(req.params.id); const resObj = { name: saveData.name, coupon_claimed: saveData.coupon_claimed, total_earning: saveData.total_earning, paid_amount: saveData.paid_amount, no_of_paid_coupon: saveData.no_of_paid_coupon, affiliate_discount_amount: saveData.affiliate_discount_amount, coupon_code: saveData.coupon_code, nameAsBank: saveData.nameAsBank, accountNo: saveData.accountNo, ifsc: saveData.ifsc, bankName: saveData.bankName, branchName: saveData.branchName, }; res.status(200).json({ success: true, message: resObj, }); } catch (error) { res.status(400).json({ success: false, message: "Error in getting Affiliates", }); } } }; //Get Affiliate data for History export const affiliatePayHistory = async (req, res) => { if (req.params?.id) { try { const saveData = await AffiliateModel.findById(req.params.id).sort({ updatedAt: -1, }); const resObj = { affiliate_pay_history: saveData.affiliate_pay_history, name: saveData.name, }; res.status(200).json({ success: true, message: resObj, }); } catch (error) { res.status(400).json({ success: false, message: "Error in getting History", }); } } }; // Affiliate PayOut export const affiliatPayOut = async (req, res) => { const { amountToPay, nameAsBank, accountNo, ifsc, bankName, branchName, affiliateDiscountAmt, } = req.body; if (!amountToPay) return res.status(400).json({ message: "amountToPay is not empty!" }); if (!nameAsBank) return res .status(404) .json({ message: "please Enter Your name As Bank PassBook!" }); if (!accountNo) return res.status(404).json({ message: "please Enter accountNo!" }); if (!nameAsBank) return res.status(404).json({ message: "please Enter nameAsBank!" }); if (!ifsc) return res.status(404).json({ message: "please provide Bank ifsc!" }); if (!bankName) return res.status(404).json({ message: "please provide Bank Name!" }); if (!branchName) return res .status(404) .json({ message: "please provide Bank branch Name!" }); const amount = 50000; // Amount in paise (50000 paise = Rs 500) const currency = "INR"; const accountNumber = "XXXXXXXXXXXX"; const accountHolderName = "John Doe"; const IFSCCode = "XXXXXXX"; // 068105500883 // ICIC0000681 // const options = { // // account_number: Number(accountNo), // // fund_account_id: "fund_account_id", // Get this from Razorpay Dashboard // // amount, // // currency: "INR", // // mode: "IMPS", // // purpose: "payout", // // recipient_contact: "+91XXXXXXXXXX", // Recipient contact number // // recipient_email: "recipient@example.com", // Recipient email address // // description: "Payout to Bank Account", // account_number: "7878780080316316", // fund_account_id: "fa_00000000000001", // amount: 100, // currency: "INR", // mode: "IMPS", // purpose: "refund", // queue_if_low_balance: true, // // reference_id: "Acme Transaction ID 12345", // // narration: "Acme Corp Fund Transfer", // notes: { // account_holder_name: accountHolderName, // ifsc_code: IFSCCode, // }, // }; const options = { method: "post", url: "https://api.razorpay.com/v1/payouts", auth: { username: process.env.RAZERPAY_KEY_ID, password: process.env.RAZERPAY_SECRET_KEY, }, data: { account_number: accountNumber, amount, currency: "INR", mode: "IMPS", // Specify the mode of transfer (IMPS/NEFT/RTGS) purpose: "payout", // Purpose of the payout recipient_contact: "+91XXXXXXXXXX", // Recipient's contact number recipient_email: "recipient@example.com", // Recipient's email address notes: { account_holder_name: "pawan", ifsc_code: IFSCCode, }, }, }; try { // const saveData = await AffiliateModel.findById(req.params.id).sort({ // updatedAt: -1, // }); // const resObj = { // affiliate_pay_history: saveData.affiliate_pay_history, // name: saveData.name, const response = await axios(options); // res.json(response.data); // console.log(razorpay.payouts); // razorpay.payouts.create(options, function (err, payout) { // if (err) { // console.error(err); // res.status(500).send("Server Error"); // } else { // res.json(payout); // } // }); // const payout = await razorpay.payouts.create(options); // console.log("payout", payout); res.status(200).json({ success: true, response, message: "lllllll", }); } catch (error) { res.status(400).json({ success: false, message: error?.response?.data?.message ? error?.response?.data?.message : "Error Payout", }); } }; //LIST ALL AFFILIATE export const MyAllAffiliate = async (req, res) => { try { const user = await UserModel.findById(req.params.id); if (user?.email) { const affiliate = await AffiliateModel.find( { email: user?.email }, { name: 1, _id: 1, email: 1, coupon_claimed: 1, coupon_code: 1, total_earning: 1, paid_amount: 1, // is_affiliate_active: 1, } ).sort({ createdAt: -1 }); // console.log("affiliate", affiliate); return res.status(200).json({ success: true, message: affiliate, }); } } catch (error) { res.status(500).json({ success: false, messgae: error.message ? error.message : "Something went wrong!", }); } };