You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
11 KiB

const fastify = require("fastify")({
logger: true,
});
const boom = require("boom");
const customJwtAuth = require("../customAuthJwt");
const bcrypt = require("bcrypt");
const saltRounds = 10;
//Get the data models
const { RequestedBooking,Supplier , generateSupplierId, DeliveryBoy} = require('../models/supplier');
const { Tankerbooking} = require("../models/tankers")
// Get Data Models
const { User,Counter, generateBookingId,resetCounter,generateCustomerId,ProfilePicture, AddTeamMembers,Cart} = require('../models/User')
async function bcryptPassword(password) {
encryptedPwd = bcrypt.hash(password, saltRounds);
return encryptedPwd;
}
async function bcryptComparePassword(pwd, encpassword) {
isSame = bcrypt.compare(pwd, encpassword);
return isSame;
}
//Supplier Login Controller
exports.loginSupplier = async (req) => {
try {
const phone = req.body.phone;
const password = req.body.password;
const supplier = await Supplier.findOne({ phone: phone });
// compare supplier password with what is supplied
if (supplier) {
isSame = await bcryptComparePassword(
password,
supplier.services.password.bcrypt
);
// if password supplied matches return object
if (isSame) {
return { same: true, supplier: supplier };
} else {
return { same: false };
}
} else {
return { same: false };
}
} catch (err) {
throw boom.boomify(err);
}
};
//DeliveryBoy Login Controller
exports.loginDeliveryBoy = async (req) => {
try {
const phone = req.body.phone;
const delivery = await DeliveryBoy.findOne({ phone: phone });
if (delivery) {
return { same: true, delivery: delivery };
} else {
return { same: false };
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.addSupplier = async (req, reply) => {
try {
// await resetCounter();//to set customer id back to 0
var s_id = await generateSupplierId()
var building= ((req.body.suppliername).slice(0, 3)).toUpperCase();
var supplier_id = `AWSS${building}${s_id}`
// console.log("This is the reply in the handler after the validations", reply);
s_data = {
supplierId: supplier_id,
suppliername: req.body.suppliername,
emails: req.body.emails,
password: req.body.password,
phone: req.body.phone,
description: req.body.description,
profile: {
firstName: req.body.firstName,
lastName: req.body.lastName,
contactNumber: req.body.phone,
alternativeContactNumber: req.body.alternativeContactNumber,
office_address: req.body.office_address,
country: req.body.country,
state: req.body.state,
city: req.body.city,
office_adress: req.body.office_adress,
zip: req.body.zip,
},
latitude: req.body.latitude,
2 years ago
longitude: req.body.longitude,
fcmId : req.body.fcmId
};
var supplier = new Supplier(s_data);
//password is not at the top level in the collection.
supplierpass = req.body.password;
// If fields are sent via form encoding , capture the fields and assign them to the supplier Object.
checkFormEncoding = isSupplierFormUrlEncoded(req);
if (checkFormEncoding.isSupplierFormUrlEncoded) {
suppliertobeInserted = checkFormEncoding.supplier;
console.log("thsi true url string");
supplier.suppliername = suppliertobeInserted.suppliername;
supplier.firstName = suppliertobeInserted.firstName;
supplier.lastName = suppliertobeInserted.lastName;
supplier.phone = suppliertobeInserted.phone;
supplier.emails = suppliertobeInserted.emails;
supplier.passsword = suppliertobeInserted.password;
supplier.supplierId = suppliertobeInserted.supplier_id;
supplier.office_adress = suppliertobeInserted.office_adress;
supplier.alternativeContactNumber = suppliertobeInserted.alternativeContactNumber;
supplier.latitude = suppliertobeInserted.latitude;
supplier.longitude = suppliertobeInserted.longitude;
2 years ago
supplier.fcmId = suppliertobeInserted.fcmId
supplier.description = suppliertobeInserted.description
}
console.log("---------checkurl ecnoded string-----------------------");
// Store hash in your password DB.
hash = await bcryptPassword(supplierpass);
if (hash) {
supplier.services.password.bcrypt = hash;
if (req.body.role) {
supplier.profile.role = req.body.role;
console.log("******************************************************");
console.log(supplier);
} else {
role = ["supplier"];
supplier.profile.role = role;
}
insertedSupplier = await supplier.save();
console.log(insertedSupplier);
if (insertedSupplier) {
// Prepare supplier object and wrap it inside the armintatankdata
var retSupplier = {
armintatankdata: {
suppliername: insertedSupplier.suppliername,
phone: insertedSupplier.phone,
supplierId: insertedSupplier.supplierId,
office_adress: insertedSupplier.office_adress,
emails: [
{
email: insertedSupplier.emails[0].email,
},
],
profile: insertedSupplier.profile,
latitude: insertedSupplier.latitude,
2 years ago
longitude: insertedSupplier.longitude,
fcmId : insertedSupplier.fcmId,
description : insertedSupplier.description
},
status_code: 200,
};
return retSupplier;
}
}
} catch (err) {
throw boom.boomify(err);
}
};
exports.editCuurentSupplierInfo = async (req, reply) => {
try {
const { supplierId } = req.params;
const supplierInfo = await Supplier.findOne({ supplierId: supplierId.toString() });
const updateData = req.body;
if (updateData.firstName) supplierInfo.profile.firstName = updateData.firstName;
if (updateData.lastName) supplierInfo.profile.lastName = updateData.lastName;
if (updateData.suppliername) supplierInfo.suppliername = updateData.suppliername;
if (updateData.phone) supplierInfo.profile.contactNumber = updateData.phone;
if (updateData.office_address) supplierInfo.profile.office_address = updateData.office_address;
if (updateData.alternativeContactNumber) supplierInfo.profile.alternativeContactNumber = updateData.alternativeContactNumber;
if (updateData.city) supplierInfo.profile.city = updateData.city;
if (updateData.state) supplierInfo.profile.state = updateData.state;
if (updateData.country) supplierInfo.profile.country = updateData.country;
if (updateData.zip) supplierInfo.profile.zip = updateData.zip;
if (updateData.phone) supplierInfo.phone = updateData.phone;
if (updateData.description) supplierInfo.description = updateData.description;
if (updateData.startingPrice) supplierInfo.startingPrice = updateData.startingPrice;
2 years ago
if (updateData.status) supplierInfo.status = updateData.status;
if (updateData.emails) supplierInfo.emails = updateData.emails;
console.log(supplierInfo.emails[0].email)
if (updateData.role) supplierInfo.profile.role = updateData.role;
if (updateData.phone) {
const phoneNumber = updateData.phone //libphonenumberjs.parsePhoneNumber(updateData.phone);
if (phoneNumber) {
// access returned collection
if (!phoneNumber) { //if (!phoneNumber.isValid()) {
error = {
armintatankdata: {
error: true,
code: 10002,
message:
"10002 - Phone # " +
updateData.phone +
" is not a valid phone number",
},
};
req.body.regError = error;
reply.status(406).send(error);
}
}
}
if (supplierInfo.phone == updateData.phone) {
console.log("IF++++++++++++++=");
supplierInfo.phone = updateData.phone;
supplierInfo.phoneVerified = true;
} else {
console.log("Ilse++++++++++++++=");
supplierInfo.phone = updateData.phone;
supplierInfo.phoneVerified = false;
}
const supplier = await supplierInfo.save();
return supplier;
} catch (err) {
throw boom.boomify(err);
}
};
exports.acceptRequestedBooking = async (req, reply) => {
const { supplierId } = req.params;
const { action, _id } = req.body;
if (action !== 'accept') {
return reply.code(400).send({ message: "Invalid action. Only 'accept' is allowed." });
}
try {
const requestedBooking = await RequestedBooking.findOne({
_id,
'requested_suppliers.supplierId': supplierId,
status: 'pending'
});
if (!requestedBooking) {
return reply.code(404).send({ message: "No matching pending request for given ID and supplier" });
}
requestedBooking.status = 'accepted';
await requestedBooking.save();
const customer = await User.findOne({ customerId: requestedBooking.customerId }).lean();
if (!customer) return reply.code(404).send({ message: "Customer not found" });
const supplier = await Supplier.findOne({ supplierId }).lean();
if (!supplier) return reply.code(404).send({ message: "Supplier not found" });
const matchedSupplier = requestedBooking.requested_suppliers.find(s => s.supplierId === supplierId);
if (!matchedSupplier || !matchedSupplier.quoted_amount) {
return reply.code(400).send({ message: "Quoted amount missing for this supplier" });
}
const newBooking = new Tankerbooking({
customerId: customer.customerId,
customerName: customer.profile.firstName,
customerPhone: customer.phone,
address: customer.address1,
latitude: customer.latitude,
longitude: customer.longitude,
supplierId: supplier.supplierId,
supplierName: supplier.suppliername,
supplierPhone: supplier.phone,
supplierAddress: customer.address,
type_of_water: requestedBooking.type_of_water,
capacity: requestedBooking.capacity,
quantity: requestedBooking.quantity,
total_required_capacity: requestedBooking.total_required_capacity,
expectedDateOfDelivery: requestedBooking.date,
time: requestedBooking.time,
price: matchedSupplier.quoted_amount,
status: 'pending'
});
await newBooking.save();
reply.code(200).send({
status_code: 200,
message: "Booking accepted and moved to tanker bookings",
data: newBooking
});
} catch (err) {
console.error(err);
throw boom.internal("Failed to accept booking", err);
}
};