'user strict'; const { getModel } = require( '../../../Models' ); const onAcceptedEvents = require('./onAccepted'); const branchesModel = getModel('branches') const vehiclesModel = getModel('vehicles'); const proposalsModel = getModel('proposals'); const loadsModel = getModel('loads'); const usersModel = getModel('users'); const companiesModel = getModel('companies'); const notificationsModel = getModel('notifications'); const productsModel = getModel('products'); /** * When the proposal is created then the load owner should be notified. * @param {*} userId -> Responsible of the change * @param {*} proposalId -> Proposal Affected */ async function onProposalCreate( userId, proposalId ){ const proposal = await proposalsModel.findById( proposalId ); const load = await loadsModel.findById( proposal.load ); const user = await usersModel.findById( load.posted_by ); const notification = new notificationsModel({ "owner": user.id, "title": "New proposal", "description": `${load.shipment_code}`, "tag":"new_proposal", "deleted":false }); await notification.save(); } /** * When a proposal is removed from the load, it is considered as rejected. * @param {*} userId -> Responsible of the change * @param {*} proposalId -> Proposal Affected */ async function onProposalRejected( userId, proposalId ){ const proposal = await proposalsModel.findById( proposalId ); /// Update Proposal: /// Remove shipper await proposalsModel.findByIdAndUpdate( proposalId , { shipper : null, accepted_by : null, accepted_date : null } ); /// Update Load: /// Remove carrier, driver and vehicle await loadsModel.findByIdAndUpdate( proposal.load, { carrier : null, driver : null, vehicle : null, bidder : null } ); } /** * When a proposal is accepted by the shipper. * @param {*} userId -> Responsible of the change * @param {*} proposalId -> Proposal Affected */ async function onProposalAccepted( userId, proposalId ){ const shipper_user = await usersModel.findById( userId ); const shipper = await companiesModel.findById( shipper_user.company ); /// Update Proposal: /// Adding shipper to proposal await proposalsModel.findByIdAndUpdate( proposalId , { shipper : shipper.id, accepted_by : userId, accepted_date : new Date().toISOString() } ); const proposal = await proposalsModel.findById( proposalId ); const vehicle = await vehiclesModel.findById( proposal.vehicle ); /// Update Load: /// Add carrier, driver and vehicle await loadsModel.findByIdAndUpdate( proposal.load, { carrier : proposal.carrier, driver : vehicle.driver, vehicle : proposal.vehicle, bidder : proposal.bidder // Who created the proposal (carrier user) } ); const load = await loadsModel.findById( proposal.load ); await onAcceptedEvents.sendNotification( proposal, load ); const warehouse = await branchesModel.findById( load.shipper_warehouse ); if( warehouse ){ const carrier = await companiesModel.findById( load.carrier ) || {}; const product = await productsModel.findById( load.product ) || {}; const driver = await usersModel.findById( load.driver ) || {}; await onAcceptedEvents.sendWarehouseEmail( warehouse, load, carrier, product, vehicle, driver ); } } /** * When a vehicle changes from the original proposal * @param {*} userId -> Responsible of the change * @param {*} proposalId -> Proposal Affected */ async function onProposalVehicleChanged( userId, proposalId ){ const proposal = await proposalsModel.findById( proposalId ); const vehicle = await vehiclesModel.findById( proposal.vehicle ); const vehicle_list = await vehiclesModel.find({ active_load: proposal.load }); /// Update Load: /// Add driver and vehicle await loadsModel.findByIdAndUpdate( proposal.load, { driver : vehicle.driver, vehicle : proposal.vehicle } ); /// Update vehicles related to this load. Ideally, just one. for( const item of vehicle_list ){ await vehiclesModel.findByIdAndUpdate( item.id, { active_load: null, load_shipper: null, status: "Free" } ); } } module.exports = { onProposalCreate, onProposalRejected, onProposalAccepted, onProposalVehicleChanged };