Sindbad~EG File Manager

Current Path : /home/infinitibizsol/.trash/controllers.2/
Upload File :
Current File : /home/infinitibizsol/.trash/controllers.2/vehicleController.js

const { Op } = require("sequelize");
const db = require("../models");
const { col, literal, fn, transaction } = require("sequelize");

function calculateDateRange(timeRange) {
  const currentDate = new Date();

  switch (timeRange) {
    case "currentweek":
      const currentWeekStartDate = new Date(currentDate);
      currentWeekStartDate.setDate(
        currentDate.getDate() - currentDate.getDay()
      );
      currentWeekStartDate.setHours(0, 0, 0, 0);

      const currentWeekEndDate = new Date(currentDate);
      currentWeekEndDate.setDate(
        currentWeekEndDate.getDate() + (6 - currentWeekEndDate.getDay())
      );
      currentWeekEndDate.setHours(23, 59, 59, 999);

      return { startDate: currentWeekStartDate, endDate: currentWeekEndDate };

    case "lastweek":
      const lastWeekStartDate = new Date(currentDate);
      lastWeekStartDate.setDate(
        lastWeekStartDate.getDate() - lastWeekStartDate.getDay() - 7
      );
      lastWeekStartDate.setHours(0, 0, 0, 0);

      const lastWeekEndDate = new Date(currentDate);
      lastWeekEndDate.setDate(
        lastWeekEndDate.getDate() - lastWeekEndDate.getDay() - 1
      );
      lastWeekEndDate.setHours(23, 59, 59, 999);

      return { startDate: lastWeekStartDate, endDate: lastWeekEndDate };

    case "last4weeks":
      const last4WeeksStartDate = new Date(currentDate);
      last4WeeksStartDate.setDate(last4WeeksStartDate.getDate() - 28);
      last4WeeksStartDate.setHours(0, 0, 0, 0);

      const last4WeeksEndDate = new Date(currentDate);
      last4WeeksEndDate.setDate(last4WeeksEndDate.getDate());
      last4WeeksEndDate.setHours(23, 59, 59, 999);

      return { startDate: last4WeeksStartDate, endDate: last4WeeksEndDate };
    case "last12weeks":
      const last12WeeksStartDate = new Date(currentDate);
      last12WeeksStartDate.setDate(last12WeeksStartDate.getDate() - 84);
      last12WeeksStartDate.setHours(0, 0, 0, 0);

      const last12WeeksEndDate = new Date(currentDate);
      last12WeeksEndDate.setDate(last12WeeksEndDate.getDate());
      last12WeeksEndDate.setHours(23, 59, 59, 999);

      return { startDate: last12WeeksStartDate, endDate: last12WeeksEndDate };

    default:
      // Handle other cases or return an error
      return null;
  }
}
const getAllUserVehicles = async (req, res) => {
  try {
    const user_id = req.params.id;

    let timeRange;
    if (!req.body.timeRange) {
      timeRange = "currentweek";
    } else {
      timeRange = req.body.timeRange;
    }
    timeRange = timeRange.replace(/\s/g, "");
    timeRange = timeRange.toLowerCase();
    const weekRange = calculateDateRange(timeRange);

    let { sortBy, orderDirection } = req.body;

    const result = await db.tblVehicle.findAll({
        attributes: {
        exclude: [
          "color",
          "color_name",
          "details",
          "createdAt",
          "updatedAt",
          "user_id",
        ],
      },
      where: {
        user_id: user_id,
        createdAt: {
          [Op.between]: [weekRange.startDate, weekRange.endDate],
        },
      },
      order: [[sortBy || "vehicle_id", orderDirection || "ASC"]],
    });
    
    
    return res.json({
      status: 200,
      message: "Success",
      data: result,
    });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const sortVehicles = async (req, res) => {
  try {
    const user_id = req.params.id;
    let { sortBy, orderDirection } = req.body;
    // Define the base where clause
    let whereClause = {
      user_id: user_id,
    };

    // Adjust the where clause based on sortBy
    if (sortBy == "sold_price") {
      sortBy = "vehicle_id";
      /*  whereClause.sold_price = {
        [Op.not]: null,
      }; */
    }

    let result = await db.tblVehicle.findAll({
      where: whereClause,
      order: [[sortBy || "vehicle_id", orderDirection || "ASC"]],
    });

    return res.json({ status: 200, message: "Success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const sortByYear = async (req, res) => {
  try {
    const user_id = req.params.id;
    let { orderDirection } = req.body;
    /*  sortOrder = sortOrder.replace(/\s/g, "");
    sortOrder = sortOrder.toLowerCase();
    const orderDirection = sortOrder === "lowest" ? "ASC" : "DESC";
 */
    let result = await db.tblVehicle.findAll({
      where: {
        user_id: user_id,
      },
      order: [["year", orderDirection]],
    });

    return res.json({ status: 200, message: "Success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};
const sortByMileage = async (req, res) => {
  try {
    const user_id = req.params.id;
    let { orderDirection } = req.body;
    let result = await db.tblVehicle.findAll({
      where: {
        user_id: user_id,
        mileage: {
          [Op.not]: null, // Exclude records with null sold_price
        },
      },
      order: [["mileage", orderDirection]],
    });
    return res.json({ status: 200, message: "Success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const filterByConditionLight = async (req, res) => {
  try {
    const { user_id, week_id } = req.body;
    let results;
    results = await db.sequelize.query(
      "CALL uFilterByConditionLight(:user_id,:week_id)",
      {
        replacements: { user_id, week_id },
        type: db.Sequelize.QueryTypes.SELECT,
      }
    );

    const data = results[0];
    const formattedData = Object.values(data)
      .flat()
      .filter(
        (item) => typeof item === "object" && !item.hasOwnProperty("fieldCount")
      );

    // return res.json(formattedData);
    const conditionLightValues = [0, 1, 2, 3, 4];
    // Check for missing condition_light values
    const missingValues = conditionLightValues.filter((value) => {
      return !formattedData.some((item) => item.condition_light === value);
    });

    // Add missing values to the existing data
    const newData = formattedData.concat(
      missingValues.map((value) => ({
        condition_light: value,
        units: 0,
      }))
    );
    const filteredData = newData.filter((item) => item.condition_light != 0);
    // # Sorting the list in-place in ascending order of 'condition_light'
    filteredData.sort((a, b) => a.condition_light - b.condition_light);

    return res.json({
      status: 200,
      Message: "Success",
      filter_type: "condition_light",
      data: filteredData,
    });
  } catch (error) {
    return res.status(500).json({
      status: 500,
      message: "Internal Server Error",
      error: error.message,
    });
  }
};


const getConditionLightVehicles = async (req, res) => {
  try {
    const {
      condition_light,
      opportunity_id,
      sortBy = "vehicle_id",
      orderDirection = "ASC",
    } = req.body;

    const results = await db.tblVehicleRun.findAll({
      where: {
        opportunity_id: opportunity_id,
        condition_light: condition_light,
      },
      include: [
        {
          model: db.tblVehicle,
          raw: true,
        },
        {
          model: db.tblAuctionLane,
          attributes: ["name"],
          raw: true,
          // required: true,
          include: [
            {
              model: db.tblAuction,
              attributes: ["auction_id", "name"],
              raw: true,
              required: false,
            },
          ],
        },
      ],
      order: [[db.tblVehicle, sortBy, orderDirection]],
    });
    // return res.json({ status: 200, data: results });
    const outputArray = results.map((vehicleRun) => {
      const vehicle = vehicleRun.tblVehicle || {};
      const auctionLane = vehicleRun.tblAuctionLane || {};
      const auction = auctionLane.tblAuction || {};

      return {
        vehicle_id: vehicle.vehicle_id,
        year: vehicle.year,
        make: vehicle.make,
        model: vehicle.model,
        vin: vehicle.vin,
        mileage: vehicle.mileage,
        imageUrl: vehicle.imageUrl,
        color: vehicle.color,
        color_name: vehicle.color_name,
        vehicle_run_id: vehicleRun.vehicle_run_id,
        condition_light: vehicleRun.condition_light || 0,
        announcements: vehicleRun.announcements,
        reserve: vehicleRun.reserve || 0,
        sale_price: vehicleRun.sale_price || 0,
        auction_fee: vehicleRun.auction_fee || 300,
        net_proceed: vehicleRun.net_proceed || 0,
        vehicle_total_fee: vehicleRun.vehicle_total_fee || 0,
        sale_status: vehicleRun.sale_status || false,
        run_no: vehicleRun.run_no || null,
        lane_id: vehicleRun.lane_id || null,
        lane_name: auctionLane.name || null,
        auction_id: auction.auction_id || null,
        auction_name: auction.name || null,
      };
    });
    return res.json({ status: 200, message: "Success", data: outputArray });
  } catch (error) {
    return res.status(500).json({ error: error.message });
  }
};

const filterBySaleStatus = async (req, res) => {
  try {
    const { user_id, week_id } = req.body;
    // Call the stored procedure and destructure the result.
    let results = await db.sequelize.query(
      "CALL uFilterBySaleStatus(:user_id, :week_id)",
      {
        replacements: { user_id, week_id },
        type: db.Sequelize.QueryTypes.SELECT,
      }
    );
    const data = results[0];
    /* // return res.json(data);
    /*  // Check if data received from the stored procedure is in an unexpected format.
    if (!Array.isArray(data) || data.length === 0) {
      return res.json({ status: 200, message: "No data found", data: [] });
    } */
    // Transform the data to the required flat array format. */
    const formattedData = Object.values(data)
      .flat()
      .filter(
        (item) => typeof item === "object" && !item.hasOwnProperty("fieldCount")
      );
    const saleStatusValues = ["true", "false"];
    // Check for missing sale_status values
    const missingValues = saleStatusValues.filter((value) => {
      return !formattedData.some((item) => item.sale_status === value);
    });
    // Add missing values to the existing data
    const newData = formattedData.concat(
      missingValues.map((value) => ({
        opportunity_id: 0,
        auctioneer_id: 0,
        sale_status: value,
        units: 0,
      }))
    );
    return res.json({ status: 200, message: "Success", data: newData });
  } catch (error) {
    // Send back a structured error response with proper status code.
    return res.status(500).json({ status: 500, message: error.message });
  }
};

const getSaleStatusVehicles = async (req, res) => {
  try {
    const { sale_status, opportunity_id, sortBy, orderDirection } = req.body;

    const results = await db.tblVehicleRun.findAll({
      where: { sale_status: sale_status, opportunity_id: opportunity_id },

      include: [
        {
          model: db.tblVehicle,
          raw: true,
        },
        {
          model: db.tblAuctionLane,
          attributes: ["name"],
          raw: true,
          // required: true,
          include: [
            {
              model: db.tblAuction,
              attributes: ["auction_id", "name"],
              raw: true,
              required: false,
            },
          ],
        },
      ],
      order: [[db.tblVehicle, sortBy || "vehicle_id", orderDirection || "ASC"]],
    });
    // return res.json({ status: 200, message: results });
    const outputArray = results.map((vehicleRun) => {
      const vehicle = vehicleRun.tblVehicle || {};
      const auctionLane = vehicleRun.tblAuctionLane || {};
      const auction = auctionLane.tblAuction || {};

      return {
        vehicle_id: vehicle.vehicle_id,
        year: vehicle.year,
        make: vehicle.make,
        model: vehicle.model,
        vin: vehicle.vin,
        mileage: vehicle.mileage,
        imageUrl: vehicle.imageUrl,
        color: vehicle.color,
        color_name: vehicle.color_name,
        vehicle_run_id: vehicleRun.vehicle_run_id,
        condition_light: vehicleRun.condition_light || 0,
        announcements: vehicleRun.announcements,
        reserve: vehicleRun.reserve || 0,
        sale_price: vehicleRun.sale_price || 0,
        auction_fee: vehicleRun.auction_fee || 300,
        net_proceed: vehicleRun.net_proceed || 0,
        vehicle_total_fee: vehicleRun.vehicle_total_fee || 0,
        sale_status: vehicleRun.sale_status || false,
        run_no: vehicleRun.run_no || null,
        lane_id: vehicleRun.lane_id || null,
        lane_name: auctionLane.name || null,
        auction_id: auction.auction_id || null,
        auction_name: auction.name || null,
      };
    });
    return res.json({ status: 200, message: "Success", data: outputArray });
  } catch (error) {
    return res.status(500).json({ error: error.message });
  }
};

const totalSalePrice = async (req, res) => {
  try {
    let days = 1;
    if (req.body.days) {
      days = req.body.days;
    }
    console.log(`days are ${days}`);
    const currentDate = new Date();
    const last24Hours = new Date(currentDate - days * 24 * 60 * 60 * 1000);
    const user_id = req.params.id;
    const result = await db.tblVehicle.findAll({
      attributes: ["sold_price"],
      where: {
        user_id: user_id,
        createdAt: {
          [Op.between]: [last24Hours, currentDate],
        },
      },
      order: [["createdAt", "ASC"]],
    });

    const total_price = result
      .filter((item) => item.sold_price !== null)
      .reduce((sum, item) => sum + item.sold_price, 0);

    console.log("Total Price:", total_price);

    return res.json({ status: 200, message: "Success", data: total_price });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

//testingsale
const totalSaleAndNetProfit = async (req, res) => {
  try {
    let { user_id } = req.body;

    let timeRange;
    if (!req.body.timeRange) {
      timeRange = "currentweek";
    } else {
      timeRange = req.body.timeRange;
    }
    timeRange = timeRange.replace(/\s/g, "");
    timeRange = timeRange.toLowerCase();

    /*  const currentDate = new Date();
    let startDate;
    let endDate;

    switch (timeRange) {
      case "currentweek":
        startDate = new Date(currentDate);
        startDate.setHours(0, 0, 0, 0 - currentDate.getDay());
        startDate.setDate(startDate.getDate());

        endDate = new Date(currentDate);
        endDate.setHours(23, 59, 59, 999 - currentDate.getDay());

        break;
      case "lastweek":
        startDate = new Date(currentDate);
        startDate.setHours(0, 0, 0, 0 - currentDate.getDay());
        startDate.setDate(startDate.getDate() - 7);

        endDate = new Date(currentDate);
        endDate.setDate(endDate.getDate() - endDate.getDay());
        endDate.setHours(23, 59, 59, 999);
        break;
      case "last4weeks":
        startDate = new Date(currentDate);
        startDate.setDate(currentDate.getDate() - 28);
        endDate = new Date(currentDate);
        endDate.setDate(endDate.getDate() - endDate.getDay());
        endDate.setHours(23, 59, 59, 999);
        break;
      default:
        startDate = new Date(currentDate);
        startDate.setHours(0, 0, 0, 0 - currentDate.getDay());
        startDate.setDate(startDate.getDate() - 3);

        endDate = new Date(currentDate);
        endDate.setHours(23, 59, 59, 999 - endDate.getDay());
    } */

    const weekRange = calculateDateRange(timeRange);
    const results = await db.tblVehicle.findAll({
      attributes: [
        "vehicle_id",
        "user_id",
        /* [
          db.sequelize.literal("SUM(`tblVehicleRuns`.`sale_price`)"),
          "total_sale",
        ],
        [
          db.sequelize.literal("SUM(`tblVehicleRuns`.`net_profit`)"),
          "total_net_profit",
        ], */
      ],
      include: [
        {
          model: db.tblVehicleRun,
          attributes: [
            "vehicle_run_id",
            "sale_price",
            "auction_fee",
            "net_profit",
            "sale_status",
          ],
          raw: true,
          where: {
            sale_price: { [Op.ne]: null },
          },
        },
      ],
      where: {
        user_id: user_id,
        createdAt: {
          [Op.between]: [weekRange.startDate, weekRange.endDate],
        },
      },
      // order: [["createdAt", "ASC"]],
    });
    if (results.length === 0) {
      return res.json({
        status: 200,
        message: "Success",
        net_profit: 0,
        total_profit: 0,
        unit_sold: 0,
      });
    }
    const transformedData = results.reduce((result, vehicle) => {
      const existingUser = result.find(
        (user) => user.user_id === vehicle.user_id
      );

      if (existingUser) {
        // If user exists, update totals
        existingUser.total_profit += vehicle.tblVehicleRuns.reduce(
          (sum, run) => sum + run.sale_price,
          0
        );
        existingUser.net_profit += vehicle.tblVehicleRuns.reduce(
          (sum, run) => sum + run.net_profit,
          0
        );
        existingUser.sold_units += vehicle.tblVehicleRuns.length;
      } else {
        // If user doesn't exist, add a new user entry
        const newUser = {
          user_id: vehicle.user_id,
          total_profit: vehicle.tblVehicleRuns.reduce(
            (sum, run) => sum + run.sale_price,
            0
          ),
          net_profit: vehicle.tblVehicleRuns.reduce(
            (sum, run) => sum + run.net_profit,
            0
          ),
          sold_units: vehicle.tblVehicleRuns.length,
        };
        result.push(newUser);
      }

      return result;
    }, []);

    return res.json({
      status: 200,
      message: "Success",
      net_profit: transformedData[0]?.net_profit || 0,
      total_profit: transformedData[0]?.total_profit || 0,
      unit_sold: transformedData[0]?.sold_units || 0,
    });
  } catch (error) {
    return res.status(500).json({ status: 500, error: error.message });
  }
};

/* const assignVehicleToAuctioneerCtrl = async (req, res) => {
  try {
    const { car_ids, auctioneerId, userId, weekId } = req.body;
    const week_id = parseInt(weekId);

    const [opportunity_id] = await db.tblOpportunity.findAll({
      where: {
        [Op.and]: [
          {
            week_id: week_id,
          },
          {
            auctioneer_id: auctioneerId,
          },
          {
            user_id: userId,
          },
        ],
      },
      attributes: ["opportunity_id"],
    });
    const data = {
      opportunity_id: opportunity_id.opportunity_id,
    };
  
    let isExisted;
    const promises = car_ids.map(async (item) => {
      // Assuming db.tblVehicleRun.findAll returns an array
      isExisted = await db.tblVehicleRun.findAll({
        where: { vehicle_id: item },
      });

      if (isExisted.length <= 0) {
        // No vehicles found with the given id, so create a new record
        await db.tblVehicleRun.create({
          opportunity_id: data.opportunity_id,
          vehicle_id: item,
        });
      } else {
        // Vehicle exists, perform an update
        await db.tblVehicleRun.update(data, {
          where: {
            vehicle_id: item,
          },
        });
      }
    });

    await Promise.all(promises);

    return res.json({ status: 200, message: "assigned vehicles successfully" });
  } catch (error) {
    console.log(error);
    return res.json(error.message);
  }
}; */

const assignVehicleToAuctioneerCtrl = async (req, res) => {
  try {
    const { car_ids, auctioneerId, userId, weekId } = req.body;

    // Find the opportunity_id just once outside of the loop
    const opportunity = await db.tblOpportunity.findOne({
      where: {
        week_id: parseInt(weekId),
        auctioneer_id: auctioneerId,
        user_id: userId,
      },
      attributes: ["opportunity_id"],
    });

    if (!opportunity) {
      return res
        .status(404)
        .json({ status: 404, message: "Opportunity not found." });
    }

    const data = {
      opportunity_id: opportunity.opportunity_id,
    };

    // Create or update vehicles in parallel
    const promises = car_ids.map((item) => {
      return db.tblVehicleRun
        .findOrCreate({
          where: { vehicle_id: item },
          defaults: {
            // Used only if a new instance is created
            vehicle_id: item,
            ...data,
          },
        })
        .then(([vehicleRun, created]) => {
          if (!created) {
            // Update the record only if it's necessary.
            // You might want to add logic to check if an update is required
            return db.tblVehicleRun.update(data, {
              where: {
                vehicle_id: item,
              },
            });
          }
        });
    });

    await Promise.all(promises);

    return res
      .status(200)
      .json({ status: 200, message: "Assigned vehicles successfully" });
  } catch (error) {
    console.error(error);
    return res.status(500).json({ message: error.message });
  }
};

const createVehicleController = async (req, res) => {
  try {
      
    //   return res.json({data:req.body});
    const { user_id } = req.body;
    const userId = parseInt(user_id);
    let imageFiles;
    req.body.user_id = userId;

    if (req.files.length > 0) {
      console.log(req.files);
      imageFiles = req.files;
      const mainImageUrl = imageFiles[0].filename;
      req.body.imageUrl = mainImageUrl;
    }
    let result = await db.tblVehicle.create(req.body);

    const car_id = result.vehicle_id;
    if (req.files.length > 0) {
      console.log("Images Files Existed");

      await Promise.all(
        imageFiles.map(async (item) =>
          db.tblVehicleImage.create({
            vehicle_id: car_id,
            imageUrl: item.filename,
          })
        )
      );
    }

    if (!result) {
      return res.status(500).json({ status: 500, message: "Operation Failed" });
    }

    return res
      .status(200)
      .json({ status: 200, message: "data created successfully" });
  } catch (error) {
    console.log(error.message);
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const createVehicleControllerWithoutImages = async (req, res) => {
  try {
    const body = req.body;
    
    return res.json({status:200,message:"success",data:req.body});
    const result = await db.tblVehicle.create(body);
if(result.length<=0){
    return res.json({ status: 200, message: "Failure" ,data:result});
  
}
    return res.json({ status: 200, message: "Success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const getVehicleDetailsById = async (req, res) => {
  try {
    const vehicle_id = req.params.id;

    let result = await db.tblVehicle.findAll({
        attributes:[
          "vehicle_id",
          "vin",
          "year",
          "make",
          "model",
          "mileage",
          "trim",
          "color",
          "color_name",
          "details",
          "imageUrl",
        ],
      where: {
        vehicle_id: vehicle_id,
      },
    });

    return res
      .status(200)
      .json({ status: 200, message: "success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const getUserCarsData = async (req, res) => {
  try {
    const userId = req.params.id;
    const result = await db.tblVehicle.findAll({
      where: {
        user_id: userId,
      },
    });
    return res
      .status(200)
      .json({ status: 200, message: "success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};
const getVehicleImagesByCarId = async (req, res) => {
  try {
    const vehicle_id = req.params.id;
    let result = await db.tblVehicleImage.findAll({
      where: {
        vehicle_id: vehicle_id,
      },
    });
    return res
      .status(200)
      .json({ status: 200, message: "success", data: result });
  } catch (error) {
    return res.status(500).json({ status: 500, message: `${error.message}` });
  }
};

const updateVehicleDetails = async (req, res) => {
  try {
    const vehicle_id = req.params.id;
    console.log(req.body);
    const { imagesListIds } = req.body;
    let result = await db.tblVehicle.update(req.body, {
      where: {
        vehicle_id: vehicle_id,
      },
    });

    const promises = imagesListIds.map(async (id) => {
      try {
        result = await db.tblVehicleImage.destroy({
          where: { image_id: id },
        });
      } catch (error) {
        console.error(error);
        return res
          .status(500)
          .json({ status: 500, message: "Internal Server Error" });
      }
    });

    await Promise.all(promises);
    console.log(result);

    return res.json({ status: 200, message: "succes", data: result });
  } catch (error) {
    return res.json(error.message);
  }
};

const removeCarFromAuctioneer = async (req, res) => {
  
  try {
    const { carIds } = req.body;
    const results = await Promise.all(
      carIds.map(async (vehicle_id) => {
        let result;
        await db.sequelize.transaction(async (t) => {
          // Update tblVehicleRunFee
          const vehicle_run_id = await db.tblVehicleRun.findOne({
            where: { vehicle_id: vehicle_id },
            transaction: t,
          });
          await db.tblVehicleRunFee.destroy({
            where: {
              vehicle_run_id: vehicle_run_id.vehicle_run_id,
            },
            transaction: t,
          });
          // Update tblVehicleRun
          result = await db.tblVehicleRun.destroy({
            where: {
              vehicle_id: vehicle_id,
            },
            transaction: t,
          });
          // Update tblVehicle
          await db.tblVehicle.update(
            {
              opportunity_id: null,
            },
            {
              where: {
                vehicle_id: vehicle_id,
              },
              transaction: t,
            }
          );
        });

        return result;
      })
    );

    return res.json({ status: 200, message: "Success", data: results });
  } catch (error) {
    return res.status(500).json({
      status: 500,
      message: "Internal Server Error",
      error: error.message,
    });
  }

  
};

const updateCarStatus = async (req, res) => {
  try {
    // const { vehicle_id, anoucements, reserve } = req.body;
    // console.log(req.body);
    let result;
    const vehicle_id = req.body.vehicle_id;
    [result] = await db.tblVehicleRun.findAll({
      where: {
        vehicle_id: vehicle_id,
      },
    });

    if (!result) {
      await db.tblVehicleRun.create(req.body);
    } else {
      await db.tblVehicleRun.update(req.body, {
        where: {
          vehicle_id: vehicle_id,
        },
      });
    }
    return res.json({ status: 200, message: "Success" });
  } catch (error) {
    console.log(error);
    return res.json(error.message);
  }
};



const deleteInventoryVehicle = async (req, res) => {
    
//   const vehicle_id = parseInt(req.params.id);

//   // Validate if vehicle ID is a number
//   if (isNaN(vehicle_id)) {
//     return res.status(400).json({
//       status: 400,
//       message: "Invalid vehicle ID",
//     });
//   }

//   // Start a transaction
//   const transaction = await db.sequelize.transaction();

//   try {
//     // Get vehicle_run_id using the transaction
//     const vehicle_run = await db.tblVehicleRun.findOne({
//       attributes: ["vehicle_run_id"],
//       where: { vehicle_id },
//       transaction,
//     });
//     if (vehicle_run) {
//       const { vehicle_run_id } = vehicle_run;

//       // Perform all destroy operations within the transaction
//       const [vehicleRunFeeRmvdCount, vehicleRunRmvdCount] = await Promise.all([
//         db.tblVehicleRunFee.destroy({
//           where: { vehicle_run_id },
//           transaction,
//         }),
//         db.tblVehicleRun.destroy({
//           where: { vehicle_run_id },
//           transaction,
//         }),
//       ]);

//       const vehicleRmvdCount = await db.tblVehicle.destroy({
//         where: { vehicle_id },
//         transaction,
//       });

//       // Commit the transaction
//       await transaction.commit();

//       // Respond with the results of the destructions
//       return res.json({
//         status: 200,
//         message: "Success"
//         // vehicleRmvdCount: vehicleRmvdCount || 0,
//         // vehicleRunRmvdCount: vehicleRunRmvdCount || 0,
//         // vehicleRunFeeRmvdCount: vehicleRunFeeRmvdCount || 0,
//       });
//     } else {
//       // If no associated vehicle run exists, nothing further to do
//       await transaction.commit();
//       return res.json({
//         status: 200,
//         message: "No associated vehicle runs found.No action taken.",
//       });
//     }
//   } catch (error) {
//     // Rollback the transaction in case of error
//     await transaction.rollback();
//     return res.status(500).json({
//       status: 500,
//       message: "Internal Server Error",
//       error: error.message,
//     });
//   }
  
  
};


const insertYears = async (req, res) => {
  try {
    const startingYear = 1990;
    const currentYear = new Date().getFullYear();
    let result;
    for (let year = startingYear; year <= currentYear; year++) {
      result = await db.tblYear.create({ vehicle_year: year });
    }

    console.log("Years added successfully.");

    return res.json({ status: 200, message: "Success", data: result });
  } catch (error) {
    console.error("Error adding years:", error);
  }
};
const getYears = async (req, res) => {
  try {
    let result;
    result = await db.tblYear.findAll();
    const convertedData = result.map((entry) => parseInt(entry.vehicle_year));

    return res.json({ status: 200, message: "Success", data: convertedData });
  } catch (error) {
    console.error("Error adding years:", error);
    return res.json({ status: 502, errorMessage: error });
  }
};

module.exports = {
  getAllUserVehicles,
  createVehicleControllerWithoutImages,
  createVehicleController,
  getVehicleImagesByCarId,
  getVehicleDetailsById,
  updateVehicleDetails,
  assignVehicleToAuctioneerCtrl,
  getUserCarsData,
  removeCarFromAuctioneer,
  updateCarStatus,
  totalSalePrice,
  totalSaleAndNetProfit,
  sortByYear,
  sortVehicles,
  sortByMileage,
  filterByConditionLight,
  filterBySaleStatus,
  deleteInventoryVehicle,
  getConditionLightVehicles,
  getSaleStatusVehicles,
  insertYears,
  getYears,
};

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists