/
home
/
infinitibizsol
/
.trash
/
controllers.3
/
File Upload :
llllll
Current File: /home/infinitibizsol/.trash/controllers.3/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: "Internal Server Error", error: 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, user_id, week_id, sortBy = "vehicle_id", orderDirection = "ASC", } = req.body; let result; result = await db.tblOpportunity.findAll({ attributes: ["opportunity_id","auctioneer_id"], where: { user_id, week_id }, include: [ { model: db.tblVehicleRun, required: true, // Use this instead of raw to ensure an INNER JOIN where: { condition_light: condition_light, }, include: [ { model: db.tblVehicle, required: true, // Use this instead of raw to ensure an INNER JOIN }, { model: db.tblAuctionLane, attributes: ["lane_id", "name"], // required: true, // Use this instead of raw to ensure an INNER JOIN include: [ { model: db.tblAuction, attributes: ["auction_id", "name"], required: true, // Use this instead of raw to ensure an INNER JOIN }, ], }, ], }, ], order: [ // Include the nested order here instead [db.tblVehicleRun, db.tblVehicle, sortBy, orderDirection], ], }); // return res.json(result); if (!result.length) { return res.json({ status: 200, message: "Success", data: [] }); } // // Format the result as per the required format const formattedResult = result.flatMap((item) => item.tblVehicleRuns.map((vehicleRun) => { const vehicle = vehicleRun.tblVehicle || {}; const auctionLane = vehicleRun.tblAuctionLane || {}; const auction = auctionLane.tblAuction || {}; return { auctioneer_id: item?.auctioneer_id || null, 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, details: vehicle.details, condition_light: vehicleRun?.condition_light || 0, sale_price: vehicleRun?.sale_price || 0, run_no: vehicleRun?.run_no || null, sale_status: vehicleRun?.sale_status || false, lane_id: vehicleRun?.lane_id || null, auction_fee: vehicleRun?.auction_fee || 300, net_proceed: vehicleRun?.net_proceed || 0, vehicle_total_fee: vehicleRun?.vehicle_total_fee || 0, reserve: vehicleRun?.reserve || 0, lane_name: auctionLane?.name || null, lane_id: auctionLane?.lane_id || null, auction_id: auction?.auction_id || null, auction_name: auction?.name || null, }; }) ); return res.json({ status: 200, message: "Success", data: formattedResult }); } catch (error) { return res.status(500).json({ status: 500, message: "Internal Server Error", 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]; 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) => ({ sale_status: value, units: 0, })) ); return res.json({ status: 200, message: "Success", filter_type: "sale_status", data: newData, }); } catch (error) { // Send back a structured error response with proper status code. return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; const getSaleStatusVehicles = async (req, res) => { try { const { sale_status, user_id, week_id, sortBy, orderDirection } = req.body; let result; result = await db.tblOpportunity.findAll({ attributes: ["opportunity_id","auctioneer_id"], where: { user_id, week_id }, include: [ { model: db.tblVehicleRun, required: true, // Use this instead of raw to ensure an INNER JOIN where: { sale_status: sale_status, }, include: [ { model: db.tblVehicle, required: true, // Use this instead of raw to ensure an INNER JOIN }, { model: db.tblAuctionLane, attributes: ["lane_id", "name"], // required: true, // Use this instead of raw to ensure an INNER JOIN include: [ { model: db.tblAuction, attributes: ["auction_id", "name"], required: true, // Use this instead of raw to ensure an INNER JOIN }, ], }, ], }, ], order: [ // Include the nested order here instead [db.tblVehicleRun, db.tblVehicle, sortBy, orderDirection], ], }); // return res.json(result); if (!result.length) { return res.json({ status: 200, message: "Success", data: [] }); } // // Format the result as per the required format const formattedResult = result.flatMap((item) => item.tblVehicleRuns.map((vehicleRun) => { const vehicle = vehicleRun.tblVehicle || {}; const auctionLane = vehicleRun.tblAuctionLane || {}; const auction = auctionLane.tblAuction || {}; return { auctioneer_id: item?.auctioneer_id || null, 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, details: vehicle.details, condition_light: vehicleRun?.condition_light || 0, sale_price: vehicleRun?.sale_price || 0, run_no: vehicleRun?.run_no || null, sale_status: vehicleRun?.sale_status || false, lane_id: vehicleRun?.lane_id || null, auction_fee: vehicleRun?.auction_fee || 300, net_proceed: vehicleRun?.net_proceed || 0, vehicle_total_fee: vehicleRun?.vehicle_total_fee || 0, reserve: vehicleRun?.reserve || 0, lane_name: auctionLane?.name || null, lane_id: auctionLane?.lane_id || null, auction_id: auction?.auction_id || null, auction_name: auction?.name || null, }; }) ); return res.json({ status: 200, message: "Success", data: formattedResult }); } catch (error) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: 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({ status: 500, message: "Internal Server Error", error: error.message, }); } }; const createVehicleController = async (req, res) => { try { console.log("Creating..."); const { user_id } = req.body; const userId = parseInt(user_id); let imageFiles; req.body.user_id = userId; if (req.files.length > 0) { imageFiles = req.files; const mainImageUrl = imageFiles[0].filename; req.body.imageUrl = mainImageUrl; } // return res.json(req.body); let result = await db.tblVehicle.create(req.body); const car_id = result.vehicle_id; if (req.files.length > 0) { 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: "Success" }); } catch (error) { console.log(error); return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; const createVehicleControllerWithoutImages = async (req, res) => { try { const body = req.body; const result = await db.tblVehicle.create(body); return res.json({ status: 200, message: "Success", data: result }); } catch (error) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: 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: "Internal Server Error", error: error.message, }); } }; const getUserVehicleData = 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: "Internal Server Error", error: 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; let { rmvImagesListIds } = req.body; let result = await db.tblVehicle.update(req.body, { where: { vehicle_id: vehicle_id, }, }); let imageFiles; if (req.files.length > 0) { imageFiles = req.files; const mainImageUrl = imageFiles[0].filename; req.body.imageUrl = mainImageUrl; } if (req.files.length > 0) { await Promise.all( imageFiles.map(async (item) => db.tblVehicleImage.create({ vehicle_id: car_id, imageUrl: item.filename, }) ) ); } rmvImagesListIds = JSON.parse(imagesListIds); if (rmvImagesListIds?.length > 0) { const promises = rmvImagesListIds?.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); } return res.json({ status: 200, message: "Success", data: result }); } catch (error) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; */ const updateVehicleDetails = async (req, res) => { try { const vehicleId = req.params.id; const { imageUrl, rmvImagesListIds: rmvImagesListIdsStr } = req.body; // Update vehicle details except images await updateVehicle(vehicleId, req.body); // Handle new image files upload if (req.files && req.files.length > 0) { await uploadVehicleImages(vehicleId, req.files); } // Remove images based on provided IDs const rmvImagesListIds = JSON.parse(rmvImagesListIdsStr); if (Array.isArray(rmvImagesListIds) && rmvImagesListIds.length > 0) { await removeVehicleImages(rmvImagesListIds, res); } return res.json({ status: 200, message: "Success" }); } catch (error) { console.error(error); return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; async function updateVehicle(vehicleId, vehicleData) { return db.tblVehicle.update(vehicleData, { where: { vehicle_id: vehicleId }, }); } async function uploadVehicleImages(vehicleId, imageFiles) { const mainImageUrl = imageFiles[0].filename; const promises = imageFiles.map((item) => db.tblVehicleImage.create({ vehicle_id: vehicleId, imageUrl: item.filename, }) ); await Promise.all(promises); // Assuming you need to update the main image URL as well await updateVehicle(vehicleId, { imageUrl: mainImageUrl }); } async function removeVehicleImages(imageIds, res) { try { const destroyPromises = imageIds.map((id) => db.tblVehicleImage.destroy({ where: { image_id: id } }) ); await Promise.all(destroyPromises); } catch (error) { throw error; // Rethrow to be caught in the main try...catch } } const removeVehicleFromAuctioneer = 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 updateVehicleStatus = async (req, res) => { try { 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) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; const deleteInventoryVehicle = async (req, res) => { const vehicle_id = parseInt(req.params.id, 10); // 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 }); } return res.json({ status: 200, message: "Success", data: result }); } catch (error) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; 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) { return res.status(500).json({ status: 500, message: "Internal Server Error", error: error.message, }); } }; module.exports = { getAllUserVehicles, createVehicleControllerWithoutImages, createVehicleController, getVehicleImagesByCarId, getVehicleDetailsById, updateVehicleDetails, assignVehicleToAuctioneerCtrl, getUserVehicleData, removeVehicleFromAuctioneer, updateVehicleStatus, filterByConditionLight, filterBySaleStatus, deleteInventoryVehicle, getConditionLightVehicles, getSaleStatusVehicles, insertYears, getYears, };
Copyright ©2k19 -
Hexid
|
Tex7ure