138 lines
4.4 KiB
JavaScript
138 lines
4.4 KiB
JavaScript
'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 };
|