|
|
|
const mongoose = require('mongoose')
|
|
|
|
const Schema = mongoose.Schema;
|
|
|
|
const ObjectId = Schema.Types.ObjectId;
|
|
|
|
const { Counter} = require('../models/User')
|
|
|
|
const code = Math.floor(100000 + Math.random() * 900000);
|
|
|
|
|
|
|
|
|
|
|
|
const generateinstallationId = async () => {
|
|
|
|
var result = await Counter.findOneAndUpdate(
|
|
|
|
{ _id: 'installation_id' },
|
|
|
|
{ $inc: { seq: 1 } },
|
|
|
|
{ upsert: true, new: true }
|
|
|
|
);
|
|
|
|
|
|
|
|
return result.seq;
|
|
|
|
};
|
|
|
|
|
|
|
|
const generatequatationId = async () => {
|
|
|
|
var result = await Counter.findOneAndUpdate(
|
|
|
|
{ _id: 'installation_id' },
|
|
|
|
{ $inc: { seq: 1 } },
|
|
|
|
{ upsert: true, new: true }
|
|
|
|
);
|
|
|
|
|
|
|
|
return result.seq;
|
|
|
|
};
|
|
|
|
|
|
|
|
const installationschema = new mongoose.Schema({
|
|
|
|
// name: { type: String },
|
|
|
|
phone: { type: String, unique: true, trim: true },
|
|
|
|
address: String,
|
|
|
|
installationId: { type: String },
|
|
|
|
phoneVerified: { type: Boolean, default: false },
|
|
|
|
phoneVerificationCode: { type: Number, default: 11111 },
|
|
|
|
passwordResetCode: { type: Number},
|
|
|
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
|
|
|
emails: [{ email: String, verified: { type: Boolean, default: false } }],
|
|
|
|
services: { password: { bcrypt: String } },
|
|
|
|
alternativeNumber: { type: String, default: null },
|
|
|
|
firstName: { type: String, default: null },
|
|
|
|
lastName: { type: String, default: null },
|
|
|
|
address1: { type: String, default: null },
|
|
|
|
address2: { type: String, default: null },
|
|
|
|
city: { type: String, default: null },
|
|
|
|
designation: { type: String, default: null },
|
|
|
|
reportingManager: { type: String, default: null },
|
|
|
|
departmentName: { type: String, default: null },
|
|
|
|
zone: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
|
|
|
|
profile: {
|
|
|
|
|
|
|
|
state: { type: String, default: null },
|
|
|
|
country: { type: String, default: null },
|
|
|
|
},
|
|
|
|
team : { type: String, default: null},
|
|
|
|
manager : { type: String, default: null},
|
|
|
|
team_member: {
|
|
|
|
|
|
|
|
team_member: [
|
|
|
|
{
|
|
|
|
teamMemberId: { type: String },
|
|
|
|
firstName: { type: String },
|
|
|
|
phone: { type: String },
|
|
|
|
installationTeamMemId: { type: String },
|
|
|
|
password: { type: String, default: null },
|
|
|
|
status: { type: String, default: "active" },
|
|
|
|
email: { type: String },
|
|
|
|
alternativePhone: { type: String },
|
|
|
|
|
|
|
|
}
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
longitude: { type : Number,default: 0.0},
|
|
|
|
latitude: {type: Number,default: 0.0},
|
|
|
|
|
|
|
|
fcmId: { type: String, default: null },
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
createdBy: ObjectId,
|
|
|
|
updatedAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
updatedBy: ObjectId,
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const surveyschema = new mongoose.Schema({
|
|
|
|
// name: { type: String },
|
|
|
|
phone: { type: String, unique: true, trim: true },
|
|
|
|
address: String,
|
|
|
|
surveyId: { type: String },
|
|
|
|
phoneVerified: { type: Boolean, default: false },
|
|
|
|
phoneVerificationCode: { type: Number, default: 11111 },
|
|
|
|
passwordResetCode: { type: Number},
|
|
|
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
|
|
|
emails: [{ email: String, verified: { type: Boolean, default: false } }],
|
|
|
|
services: { password: { bcrypt: String } },
|
|
|
|
alternativeNumber: { type: String, default: null },
|
|
|
|
firstName: { type: String, default: null },
|
|
|
|
lastName: { type: String, default: null },
|
|
|
|
address1: { type: String, default: null },
|
|
|
|
address2: { type: String, default: null },
|
|
|
|
city: { type: String, default: null },
|
|
|
|
designation: { type: String, default: null },
|
|
|
|
reportingManager: { type: String, default: null },
|
|
|
|
departmentName: { type: String, default: null },
|
|
|
|
zone: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
|
|
|
|
profile: {
|
|
|
|
|
|
|
|
state: { type: String, default: null },
|
|
|
|
country: { type: String, default: null },
|
|
|
|
},
|
|
|
|
team : { type: String, default: null},
|
|
|
|
manager : { type: String, default: null},
|
|
|
|
team_member: {
|
|
|
|
|
|
|
|
team_member: [
|
|
|
|
{
|
|
|
|
survey_teamMemberId: { type: String },
|
|
|
|
name: { type: String },
|
|
|
|
phone: { type: String },
|
|
|
|
installationTeamMemId: { type: String },
|
|
|
|
password: { type: String, default: null },
|
|
|
|
status: { type: String, default: "active" },
|
|
|
|
email: { type: String },
|
|
|
|
alternativePhone: { type: String },
|
|
|
|
|
|
|
|
}
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
longitude: { type : Number,default: 0.0},
|
|
|
|
latitude: {type: Number,default: 0.0},
|
|
|
|
|
|
|
|
fcmId: { type: String, default: null },
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
createdBy: ObjectId,
|
|
|
|
updatedAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
updatedBy: ObjectId,
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const profilePictureInstallSchema = new Schema({
|
|
|
|
installationId: {
|
|
|
|
type: String,
|
|
|
|
unique: true,
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
picture: {
|
|
|
|
type: String, // Change the type to String
|
|
|
|
required: true,
|
|
|
|
validate: {
|
|
|
|
validator: function (value) {
|
|
|
|
const supportedFormats = ['jpg', 'jpeg', 'png'];
|
|
|
|
const fileExtension = value.split('.').pop().toLowerCase();
|
|
|
|
return supportedFormats.includes(fileExtension);
|
|
|
|
},
|
|
|
|
message: 'Picture must be a JPEG, PNG, or JPG image'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const profilePictureStoreSchema = new Schema({
|
|
|
|
storeId: {
|
|
|
|
type: String,
|
|
|
|
unique: true,
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
picture: {
|
|
|
|
type: String, // Change the type to String
|
|
|
|
required: true,
|
|
|
|
validate: {
|
|
|
|
validator: function (value) {
|
|
|
|
const supportedFormats = ['jpg', 'jpeg', 'png'];
|
|
|
|
const fileExtension = value.split('.').pop().toLowerCase();
|
|
|
|
return supportedFormats.includes(fileExtension);
|
|
|
|
},
|
|
|
|
message: 'Picture must be a JPEG, PNG, or JPG image'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const supportschema = new mongoose.Schema({
|
|
|
|
// name: { type: String },
|
|
|
|
phone: { type: String, unique: true, trim: true },
|
|
|
|
address: String,
|
|
|
|
supportId: { type: String },
|
|
|
|
phoneVerified: { type: Boolean, default: false },
|
|
|
|
phoneVerificationCode: { type: Number, default: 11111 },
|
|
|
|
passwordResetCode: { type: Number},
|
|
|
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
|
|
|
emails: [{ email: String, verified: { type: Boolean, default: false } }],
|
|
|
|
services: { password: { bcrypt: String } },
|
|
|
|
alternativeNumber: { type: String, default: null },
|
|
|
|
firstName: { type: String, default: null },
|
|
|
|
lastName: { type: String, default: null },
|
|
|
|
address1: { type: String, default: null },
|
|
|
|
address2: { type: String, default: null },
|
|
|
|
city: { type: String, default: null },
|
|
|
|
designation: { type: String, default: null },
|
|
|
|
reportingManager: { type: String, default: null },
|
|
|
|
departmentName: { type: String, default: null },
|
|
|
|
zone: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
lastTicketRaisedAt: {type : String},
|
|
|
|
issues: [{ type: Object }], // existing issues array
|
|
|
|
masterDisconnected: [{ // new field for master disconnected details
|
|
|
|
hardwareId: String,
|
|
|
|
masterName: String,
|
|
|
|
disconnectedAt: String,
|
|
|
|
}],
|
|
|
|
disconnectedSlaves: [{ // new field for disconnected slaves details
|
|
|
|
slaveHardwareId: String,
|
|
|
|
slaveName: String,
|
|
|
|
}],
|
|
|
|
categorizedIssues: [
|
|
|
|
{
|
|
|
|
type: {
|
|
|
|
type: String,
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
hardwareId: {
|
|
|
|
type: String,
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
masterHardwareId: {
|
|
|
|
type: String,
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
slaveName: {
|
|
|
|
type: String,
|
|
|
|
},
|
|
|
|
category: {
|
|
|
|
type: String,
|
|
|
|
enum: ["Power Outage", "Level1", "Pending", "Onsite Issues"],
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
movedAt: {
|
|
|
|
type: String, // or Date, depending on your preference
|
|
|
|
required: true
|
|
|
|
},
|
|
|
|
assignedTo: {
|
|
|
|
name: String,
|
|
|
|
support_teamMemberId: String,
|
|
|
|
phone: String,
|
|
|
|
email: String,
|
|
|
|
startDate: String,
|
|
|
|
endDate: String
|
|
|
|
}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
profile: {
|
|
|
|
|
|
|
|
state: { type: String, default: null },
|
|
|
|
country: { type: String, default: null },
|
|
|
|
},
|
|
|
|
team : { type: String, default: null},
|
|
|
|
manager : { type: String, default: null},
|
|
|
|
team_member: {
|
|
|
|
|
|
|
|
team_member: [
|
|
|
|
{
|
|
|
|
support_teamMemberId: { type: String },
|
|
|
|
name: { type: String },
|
|
|
|
phone: { type: String },
|
|
|
|
installationTeamMemId: { type: String },
|
|
|
|
password: { type: String, default: null },
|
|
|
|
status: { type: String, default: "active" },
|
|
|
|
email: { type: String },
|
|
|
|
alternativePhone: { type: String },
|
|
|
|
|
|
|
|
}
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
longitude: { type : Number,default: 0.0},
|
|
|
|
latitude: {type: Number,default: 0.0},
|
|
|
|
|
|
|
|
fcmId: { type: String, default: null },
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
createdBy: ObjectId,
|
|
|
|
updatedAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
updatedBy: ObjectId,
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const storeSchema = new mongoose.Schema({
|
|
|
|
storename: { type: String },
|
|
|
|
phone: { type: String, unique: true, trim: true },
|
|
|
|
contactPersonName: {type: String},
|
|
|
|
contactPersonPhone: { type: String, unique: true, trim: true },
|
|
|
|
storeId: { type: String, default: null },
|
|
|
|
phoneVerified: { type: Boolean, default: false },
|
|
|
|
phoneVerificationCode: { type: Number, default: 11111 },
|
|
|
|
passwordResetCode: { type: Number, default: 11111 },
|
|
|
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
|
|
|
emails: {type: String},
|
|
|
|
designation: { type: String, default: null },
|
|
|
|
reportingManager: { type: String, default: null },
|
|
|
|
departmentName: { type: String, default: null },
|
|
|
|
zone: { type: String, default: null },
|
|
|
|
services: { password: { bcrypt: String } },
|
|
|
|
description: { type: String, default: null },
|
|
|
|
startingPrice: { type: String, default: 0.0 },
|
|
|
|
profile: {
|
|
|
|
role: [{ type: String, default: "store" }],
|
|
|
|
firstName: { type: String, default: null },
|
|
|
|
lastName: { type: String, default: null },
|
|
|
|
contactNumber: { type: String, default: null },
|
|
|
|
alternativeContactNumber: { type: String, default: null },
|
|
|
|
store_address: { type: String, default: null },
|
|
|
|
address1: { type: String, default: null },
|
|
|
|
address2: { type: String, default: null },
|
|
|
|
city: { type: String, default: null },
|
|
|
|
state: { type: String, default: null },
|
|
|
|
country: { type: String, default: null },
|
|
|
|
zip: { type: String, default: null },
|
|
|
|
},
|
|
|
|
status: {
|
|
|
|
type: String,
|
|
|
|
enum: ['inactive', 'active'],
|
|
|
|
default: 'active'
|
|
|
|
},
|
|
|
|
longitude: { type: Number, default: 0.0 },
|
|
|
|
latitude: { type: Number, default: 0.0 },
|
|
|
|
isActive: Boolean,
|
|
|
|
tenantId: ObjectId,
|
|
|
|
fcmId: { type: String, default: null },
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
createdBy: ObjectId,
|
|
|
|
updatedAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
updatedBy: ObjectId,
|
|
|
|
}, { versionKey: false });
|
|
|
|
|
|
|
|
|
|
|
|
const waterLeverSensorInSchema = new mongoose.Schema({
|
|
|
|
storeId:{ type: String },
|
|
|
|
hardwareId: { type: String },
|
|
|
|
masterId: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
indate: { type: String },
|
|
|
|
hardwareId_company: { type: String },
|
|
|
|
qccheck: { type: String, default: null },
|
|
|
|
qccheckdate: { type: String, default: null },
|
|
|
|
qcby: { type: String, default: null },
|
|
|
|
comment: { type: String, default: "0" },
|
|
|
|
outforrepairdate: { type: String, default: "0" },
|
|
|
|
sendto: { type: String, default: null },
|
|
|
|
repairfeedback:{ type: String, default: "0" },
|
|
|
|
dateofinstallation: { type: String, default: null },
|
|
|
|
installedby: { type: String, default: "0" },
|
|
|
|
customerId:{ type: String,default:"0" },
|
|
|
|
comments:{ type: String,default:"0" },
|
|
|
|
|
|
|
|
|
|
|
|
slaves: {
|
|
|
|
source: { type: String },
|
|
|
|
tankhardware: [
|
|
|
|
{
|
|
|
|
tankhardwareId: { type: String },
|
|
|
|
slaveId: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
indate: { type: String },
|
|
|
|
hardwareId_company: { type: String },
|
|
|
|
qccheck: { type: String, default: null },
|
|
|
|
qccheckdate: { type: String, default: null },
|
|
|
|
qcby: { type: String, default: null },
|
|
|
|
comment: { type: String, default: "0" },
|
|
|
|
outforrepairdate: { type: String, default: "0" },
|
|
|
|
sendto: { type: String, default: null },
|
|
|
|
repairfeedback:{ type: String, default: "0" },
|
|
|
|
dateofinstallation: { type: String, default: null },
|
|
|
|
installedby: { type: String, default: "0" },
|
|
|
|
customerId:{ type: String,default:"0" },
|
|
|
|
comments:{ type: String,default:"0" },
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const motorSwitchSensorInSchema = new mongoose.Schema({
|
|
|
|
storeId:{ type: String },
|
|
|
|
motorId: { type: String },
|
|
|
|
masterId: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
indate: { type: String },
|
|
|
|
qccheck: { type: String, default: null },
|
|
|
|
qccheckdate: { type: String, default: null },
|
|
|
|
qcby: { type: String, default: null },
|
|
|
|
comment: { type: String, default: "0" },
|
|
|
|
outforrepairdate: { type: String, default: "0" },
|
|
|
|
sendto: { type: String, default: null },
|
|
|
|
repairfeedback:{ type: String, default: "0" },
|
|
|
|
dateofinstallation: { type: String, default: null },
|
|
|
|
installedby: { type: String, default: "0" },
|
|
|
|
customerId:{ type: String,default:"0" },
|
|
|
|
comments:{ type: String,default:"0" },
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const insensorsSchema = new mongoose.Schema({
|
|
|
|
storeId: { type: String },
|
|
|
|
hardwareId: { type: String, default: null },
|
|
|
|
masterId: { type: String, default: null },
|
|
|
|
type: { type: String },
|
|
|
|
model: { type: String },
|
|
|
|
indate: { type: String },
|
|
|
|
hardwareId_company: { type: String, default: null },
|
|
|
|
qccheck: { type: String, default: null },
|
|
|
|
qccheckdate: { type: String, default: null },
|
|
|
|
qcby: { type: String, default: null },
|
|
|
|
comment: { type: String, default: "0" },
|
|
|
|
outforrepairdate: { type: String, default: "0" },
|
|
|
|
sendto: { type: String, default: null },
|
|
|
|
repairfeedback: { type: String, default: "0" },
|
|
|
|
dateofinstallation: { type: String, default: null },
|
|
|
|
installedby: { type: String, default: "0" },
|
|
|
|
customerId: { type: String, default: "0" },
|
|
|
|
comments: { type: String, default: "0" },
|
|
|
|
quantity: { type: Number, default: 0 },
|
|
|
|
batchno: { type: String, default: null },
|
|
|
|
sensor_type: { type: String }, // adding sensor_type field
|
|
|
|
status: { type: String, default: "pending" },
|
|
|
|
connected_to: { type: String, default: "0" },
|
|
|
|
tankName: { type: String, default: "0" },
|
|
|
|
tankLocation: { type: String, default: "0" },
|
|
|
|
connected_slave: { type: String, default: null },
|
|
|
|
connected_status: { type: String, enum: ["connected", "Not connected", "unknown"], default: "unknown" },
|
|
|
|
masterName: { type: String, default: null },
|
|
|
|
location: { type: String, default: null },
|
|
|
|
tankhardwareId: { type: String, default: null },
|
|
|
|
motor_switches: [
|
|
|
|
{
|
|
|
|
from_tank: { type: String, default: null },
|
|
|
|
from_location: { type: String, default: null },
|
|
|
|
to_tank: { type: String, default: null },
|
|
|
|
to_location: { type: String, default: null },
|
|
|
|
},
|
|
|
|
],
|
|
|
|
connected_gsm_time: { type: String, default: null },
|
|
|
|
connected_gsm_date: { type: String, default: null },
|
|
|
|
connected_lora_date: { type: String, default: null },
|
|
|
|
connected_lora_time: { type: String, default: null },
|
|
|
|
typeOfWater:{ type: String, default: null },
|
|
|
|
gsm_last_check_time : { type: String, default: null },
|
|
|
|
support_gsm_last_check_time : { type: String, default: null },
|
|
|
|
support_lora_last_check_time : { type: String, default: null },
|
|
|
|
lora_last_check_time : { type: String, default: null },
|
|
|
|
gsm_last_disconnect_time : { type: String, default: null },
|
|
|
|
lora_last_disconnect_time : { type: String, default: null },
|
|
|
|
quality_check_details: [{
|
|
|
|
damage_check: { result: String },
|
|
|
|
stickering_check: { result: String },
|
|
|
|
power_check: { result: String },
|
|
|
|
master_connecting_gsm: { result: String },
|
|
|
|
slave_connecting: { result: String },
|
|
|
|
motor_start: { result: String },
|
|
|
|
motor_stop: { result: String },
|
|
|
|
|
|
|
|
motor_starting: {
|
|
|
|
result: String,
|
|
|
|
steps: [
|
|
|
|
{ step: Number, result: String }
|
|
|
|
]
|
|
|
|
},
|
|
|
|
connecting_to_sensor: { result: String },
|
|
|
|
connecting_to_slave: { result: String },
|
|
|
|
data_sending: { result: String },
|
|
|
|
connected_slave_count: {type : String},
|
|
|
|
lastTicketRaisedAt: { type: String },
|
|
|
|
distance_check: {
|
|
|
|
result: String,
|
|
|
|
steps: [
|
|
|
|
{ step: Number, result: String }
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const iotpriceSchema = new mongoose.Schema({
|
|
|
|
name: { type: String },
|
|
|
|
type: { type: String ,default:null},
|
|
|
|
cost: { type: Number, default: null },
|
|
|
|
});
|
|
|
|
|
|
|
|
const estimationorderSchema = new mongoose.Schema({
|
|
|
|
orderId: { type: String, unique: true, required: true },
|
|
|
|
customerId: { type: String, required: true },
|
|
|
|
items: { type: Array, required: true },
|
|
|
|
estimatedTotal: { type: String, required: true },
|
|
|
|
status: { type: String, default: "pending" },
|
|
|
|
}, { timestamps: true });
|
|
|
|
|
|
|
|
|
|
|
|
const sensorquotationSchema = new mongoose.Schema({
|
|
|
|
customerId: { type: String },
|
|
|
|
surveyId: { type: String, default: null },
|
|
|
|
storeId: { type: String, default: null },
|
|
|
|
installationId: { type: String, default: null },
|
|
|
|
quatationId: { type: String, default: null },
|
|
|
|
masters: { type: String },
|
|
|
|
masters_quantity_price: { type: String },
|
|
|
|
masters_total_price: { type: String },
|
|
|
|
slaves: { type: String },
|
|
|
|
sensors: { type: String },
|
|
|
|
slaves_quantity_price: { type: String },
|
|
|
|
slaves_total_price: { type: String },
|
|
|
|
motor_switches: { type: String },
|
|
|
|
motor_switches_quantity_price: { type: String },
|
|
|
|
motor_switches_total_price: { type: String },
|
|
|
|
quote_status: { type: String, default: null },
|
|
|
|
quoted_amount: { type: String, default: null },
|
|
|
|
comments: { type: String, default: null },
|
|
|
|
datetime: { type: String, default: null },
|
|
|
|
updated_at: { type: String, default: null },
|
|
|
|
|
|
|
|
master_connections: [
|
|
|
|
{
|
|
|
|
master_name: { type: String, default: null },
|
|
|
|
slaves: { type: String, default: null },
|
|
|
|
location: { type: String, default: null },
|
|
|
|
googleLocation: { type: String, default: null },
|
|
|
|
longitude: { type : Number,default: 0.0},
|
|
|
|
latitude: {type: Number,default: 0.0},
|
|
|
|
tanks: [
|
|
|
|
{
|
|
|
|
tankName: { type: String, default: null },
|
|
|
|
tankLocation: { type: String, default: null },
|
|
|
|
|
|
|
|
},
|
|
|
|
],
|
|
|
|
motor_switches: [
|
|
|
|
{
|
|
|
|
from_tank: { type: String, default: null },
|
|
|
|
from_location: { type: String, default: null },
|
|
|
|
to_tank: { type: String, default: null },
|
|
|
|
to_location: { type: String, default: null },
|
|
|
|
},
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
],
|
|
|
|
electricals: [
|
|
|
|
{
|
|
|
|
type: { type: String, default: null },
|
|
|
|
wire: { type: String, default: null },
|
|
|
|
switch: { type: String, default: null },
|
|
|
|
text: { type: String, default: null },
|
|
|
|
available_quantity: { type: String, default: null },
|
|
|
|
},
|
|
|
|
],
|
|
|
|
master_type_quantity_price: { type: String, default: null },
|
|
|
|
master_available_quantity: { type: String, default: null },
|
|
|
|
slave_available_quantity: { type: String, default: null },
|
|
|
|
sensor_available_quantity: { type: String, default: null },
|
|
|
|
master_type_total_price: { type: String, default: null },
|
|
|
|
sensor_type_quantity_price: { type: String , default: null},
|
|
|
|
sensor_type_total_price: { type: String , default: null},
|
|
|
|
switch_type_quantity_price: { type: String, default: null },
|
|
|
|
switch_type_total_price: { type: String, default: null },
|
|
|
|
qutation_total_price: { type: String, default: null },
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const orderSchema = new mongoose.Schema({
|
|
|
|
customerId: { type: String },
|
|
|
|
surveyId: { type: String, default: null },
|
|
|
|
storeId: { type: String, default: null },
|
|
|
|
installationId: { type: String, default: null },
|
|
|
|
quatationId: { type: String, default: null },
|
|
|
|
masters: { type: String },
|
|
|
|
masters_quantity_price: { type: String },
|
|
|
|
masters_total_price: { type: String },
|
|
|
|
slaves: { type: String },
|
|
|
|
sensors: { type: String },
|
|
|
|
slaves_quantity_price: { type: String },
|
|
|
|
slaves_total_price: { type: String },
|
|
|
|
motor_switches: { type: String },
|
|
|
|
motor_switches_quantity_price: { type: String },
|
|
|
|
motor_switches_total_price: { type: String },
|
|
|
|
quote_status: { type: String, default: null },
|
|
|
|
quoted_amount: { type: String, default: null },
|
|
|
|
comments: { type: String, default: null },
|
|
|
|
datetime: { type: String, default: null },
|
|
|
|
updated_at: { type: String, default: null },
|
|
|
|
assignedTeamMembers: [{ type: String }],
|
|
|
|
tankhardwareId: [{ type: String,default: null }],
|
|
|
|
master_connections: [
|
|
|
|
{
|
|
|
|
master_name: { type: String, default: null },
|
|
|
|
hardwareId: { type: String, default: null },
|
|
|
|
slaves: { type: String, default: null },
|
|
|
|
location: { type: String, default: null },
|
|
|
|
googleLocation: { type: String, default: null },
|
|
|
|
longitude: { type : Number,default: 0.0},
|
|
|
|
latitude: {type: Number,default: 0.0},
|
|
|
|
tanks: [
|
|
|
|
{
|
|
|
|
tankName: { type: String, default: null },
|
|
|
|
tankLocation: { type: String, default: null },
|
|
|
|
|
|
|
|
},
|
|
|
|
],
|
|
|
|
motor_switches: [
|
|
|
|
{
|
|
|
|
from_tank: { type: String, default: null },
|
|
|
|
from_location: { type: String, default: null },
|
|
|
|
to_tank: { type: String, default: null },
|
|
|
|
to_location: { type: String, default: null },
|
|
|
|
},
|
|
|
|
],
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
],
|
|
|
|
|
|
|
|
electricals: [
|
|
|
|
{
|
|
|
|
type: { type: String, default: null },
|
|
|
|
wire: { type: String, default: null },
|
|
|
|
switch: { type: String, default: null },
|
|
|
|
text: { type: String, default: null },
|
|
|
|
available_quantity: { type: String, default: null },
|
|
|
|
},
|
|
|
|
],
|
|
|
|
master_type_quantity_price: { type: String, default: null },
|
|
|
|
master_available_quantity: { type: String, default: null },
|
|
|
|
slave_available_quantity: { type: String, default: null },
|
|
|
|
sensor_available_quantity: { type: String, default: null },
|
|
|
|
master_type_total_price: { type: String, default: null },
|
|
|
|
sensor_type_quantity_price: { type: String, default: null },
|
|
|
|
sensor_type_total_price: { type: String, default: null },
|
|
|
|
switch_type_quantity_price: { type: String, default: null },
|
|
|
|
switch_type_total_price: { type: String, default: null },
|
|
|
|
qutation_total_price: { type: String, default: null },
|
|
|
|
status: { type: String, default: "pending" },
|
|
|
|
quatation_status: { type: String, default: "pending" },
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const SensorStockSchema = new mongoose.Schema({
|
|
|
|
storeId: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
ref: "Store",
|
|
|
|
},
|
|
|
|
type: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
|
|
|
enum: ["master", "slave", "sensor"], // Ensures only valid types
|
|
|
|
},
|
|
|
|
total_count: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
total_available: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
total_count_before_qc: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
total_blocked: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
total_repair: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
excess_needed: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
total_installed: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
|
|
|
default: 0,
|
|
|
|
},
|
|
|
|
}, { timestamps: true });
|
|
|
|
|
|
|
|
|
|
|
|
const hardwareCartSchema = new mongoose.Schema({
|
|
|
|
productId: { type: String},
|
|
|
|
productName: { type: String },
|
|
|
|
description: { type: String, default: null },
|
|
|
|
GST: { type: Number, min: 0 },
|
|
|
|
unitPrice: { type: Number, min: 0 },
|
|
|
|
quantity: { type: Number, min: 1 },
|
|
|
|
grandTotal: { type: Number, min: 0 },
|
|
|
|
totalAmount: { type: Number, min: 0 }, // Amount before GST
|
|
|
|
serialId: { type: String, default: null },
|
|
|
|
category: { type: String, enum: ['slaves', 'master', 'switches'], default: 'slaves' },
|
|
|
|
discount: { type: Number, default: 0, min: 0 },
|
|
|
|
}, {
|
|
|
|
timestamps: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
const serviceCartSchema = new mongoose.Schema({
|
|
|
|
installationId: {type: String},
|
|
|
|
productId: { type: String},
|
|
|
|
productName: { type: String },
|
|
|
|
description: { type: String, default: null },
|
|
|
|
GST: { type: Number, min: 0 },
|
|
|
|
unitPrice: { type: Number, min: 0 },
|
|
|
|
quantity: { type: Number, min: 1 },
|
|
|
|
grandTotal: { type: Number, min: 0 },
|
|
|
|
totalAmount: { type: Number, min: 0 }, // Amount before GST
|
|
|
|
serialId: { type: String, default: null },
|
|
|
|
category: { type: String, enum: ['slaves', 'master', 'switches'], default: 'slaves' },
|
|
|
|
discount: { type: Number, default: 0, min: 0 },
|
|
|
|
}, {
|
|
|
|
timestamps: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
const salesSchema = new mongoose.Schema({
|
|
|
|
username: { type: String },
|
|
|
|
phone: { type: String, unique: true, trim: true },
|
|
|
|
salesId: { type: String, default: null },
|
|
|
|
phoneVerified: { type: Boolean, default: false },
|
|
|
|
phoneVerificationCode: { type: Number, default: 11111 },
|
|
|
|
passwordResetCode: { type: Number, default: 11111 },
|
|
|
|
oneTimePasswordSetFlag: { type: Boolean, default: false },
|
|
|
|
emails: {type: String},
|
|
|
|
services: {
|
|
|
|
password: {
|
|
|
|
bcrypt: { type: String, required: true }
|
|
|
|
}
|
|
|
|
},
|
|
|
|
description: { type: String, default: null },
|
|
|
|
designation: { type: String, default: null },
|
|
|
|
reportingManager: { type: String, default: null },
|
|
|
|
departmentName: { type: String, default: null },
|
|
|
|
zone: { type: String, default: null },
|
|
|
|
profile: {
|
|
|
|
role: [{ type: String, default: "sales" }],
|
|
|
|
firstName: { type: String, default: null },
|
|
|
|
lastName: { type: String, default: null },
|
|
|
|
contactNumber: { type: String, default: null },
|
|
|
|
alternativeContactNumber: { type: String, default: null },
|
|
|
|
address1: { type: String, default: null },
|
|
|
|
address2: { type: String, default: null },
|
|
|
|
city: { type: String, default: null },
|
|
|
|
state: { type: String, default: null },
|
|
|
|
country: { type: String, default: null },
|
|
|
|
zip: { type: String, default: null },
|
|
|
|
},
|
|
|
|
status: {
|
|
|
|
type: String,
|
|
|
|
enum: ['inactive', 'active'],
|
|
|
|
default: 'active'
|
|
|
|
},
|
|
|
|
longitude: { type: Number, default: 0.0 },
|
|
|
|
latitude: { type: Number, default: 0.0 },
|
|
|
|
isActive: Boolean,
|
|
|
|
tenantId: ObjectId,
|
|
|
|
fcmId: { type: String, default: null },
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
createdBy: ObjectId,
|
|
|
|
updatedAt: {
|
|
|
|
type: Date,
|
|
|
|
default: function () {
|
|
|
|
return Date.now();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
updatedBy: ObjectId,
|
|
|
|
}, { versionKey: false });
|
|
|
|
|
|
|
|
|
|
|
|
const masterSlaveDataSchema = new mongoose.Schema({
|
|
|
|
installationId: {type: String},
|
|
|
|
customerId: {type: String},
|
|
|
|
type: { type: String},
|
|
|
|
hardwareId: { type: String },
|
|
|
|
batchno: { type: String, default: null },
|
|
|
|
masterId: { type: String },
|
|
|
|
tankName: { type: String },
|
|
|
|
tankLocation: { type: String },
|
|
|
|
materialRecived: { type: String },
|
|
|
|
electricityWork: { type: String },
|
|
|
|
plumbingWork: { type: String },
|
|
|
|
electricityWorkPictures: [
|
|
|
|
{
|
|
|
|
url: { type: String },
|
|
|
|
uploadedAt: { type: Date, default: Date.now }
|
|
|
|
}
|
|
|
|
],
|
|
|
|
plumbingWorkPictures: [
|
|
|
|
{
|
|
|
|
url: { type: String },
|
|
|
|
uploadedAt: { type: Date, default: Date.now }
|
|
|
|
}
|
|
|
|
],
|
|
|
|
materialRecievedPictures: [
|
|
|
|
{
|
|
|
|
url: { type: String },
|
|
|
|
uploadedAt: { type: Date, default: Date.now }
|
|
|
|
}
|
|
|
|
],
|
|
|
|
loraCheck: { type: String },
|
|
|
|
|
|
|
|
}, {
|
|
|
|
timestamps: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
const electrictyWorkPicturesSchema = new Schema({
|
|
|
|
installationId: {
|
|
|
|
type: String,
|
|
|
|
//required: true,
|
|
|
|
//unique: true
|
|
|
|
},
|
|
|
|
customerId: {
|
|
|
|
type: String,
|
|
|
|
//required: true
|
|
|
|
},
|
|
|
|
pictureUrl: [{
|
|
|
|
url: {
|
|
|
|
type: String,
|
|
|
|
},
|
|
|
|
}],
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const plumbingWorkPicturesSchema = new Schema({
|
|
|
|
installationId: {
|
|
|
|
type: String,
|
|
|
|
//required: true,
|
|
|
|
//unique: true
|
|
|
|
},
|
|
|
|
customerId: {
|
|
|
|
type: String,
|
|
|
|
//required: true
|
|
|
|
},
|
|
|
|
pictureUrl: [{
|
|
|
|
url: {
|
|
|
|
type: String,
|
|
|
|
},
|
|
|
|
}],
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const materialRecievedPicturesSchema = new Schema({
|
|
|
|
installationId: {
|
|
|
|
type: String,
|
|
|
|
//required: true,
|
|
|
|
//unique: true
|
|
|
|
},
|
|
|
|
customerId: {
|
|
|
|
type: String,
|
|
|
|
//required: true
|
|
|
|
},
|
|
|
|
pictureUrl: [{
|
|
|
|
url: {
|
|
|
|
type: String,
|
|
|
|
},
|
|
|
|
}],
|
|
|
|
createdAt: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const Iotprice = mongoose.model('Iotprice', iotpriceSchema);
|
|
|
|
const Insensors = mongoose.model('Insensors', insensorsSchema);
|
|
|
|
const MasterSlaveData = mongoose.model('MasterSlaveData', masterSlaveDataSchema);
|
|
|
|
const ElectrictyWorkPictures = mongoose.model('ElectrictyWorkPictures', electrictyWorkPicturesSchema);
|
|
|
|
const PlumbingWorkPictures = mongoose.model('PlumbingWorkPictures', plumbingWorkPicturesSchema);
|
|
|
|
const MaterialRecievedPictures = mongoose.model('MaterialRecievedPictures', materialRecievedPicturesSchema);
|
|
|
|
|
|
|
|
|
|
|
|
const Order = mongoose.model('Order', orderSchema);
|
|
|
|
const EstimationOrder = mongoose.model('EstimationOrder', estimationorderSchema);
|
|
|
|
|
|
|
|
const Store = mongoose.model("Store", storeSchema);
|
|
|
|
const WaterLeverSensor = mongoose.model('WaterLeverSensor', waterLeverSensorInSchema);
|
|
|
|
const ProfilePictureStore = mongoose.model('ProfilePictureStore', profilePictureStoreSchema);
|
|
|
|
const ProfilePictureInstall = mongoose.model('ProfilePictureInstall', profilePictureInstallSchema);
|
|
|
|
const MotorSwitchSensor = mongoose.model('MotorSwitchSensor', motorSwitchSensorInSchema);
|
|
|
|
const SensorQuotation = mongoose.model('SensorQuotationSchema', sensorquotationSchema);
|
|
|
|
|
|
|
|
const SensorStock = mongoose.model("SensorStock", SensorStockSchema);
|
|
|
|
const Install = mongoose.model("Install", installationschema);
|
|
|
|
const Survey = mongoose.model("Survey", surveyschema);
|
|
|
|
const Support = mongoose.model("Support", supportschema);
|
|
|
|
|
|
|
|
const HardwareCart = mongoose.model("HardwareCart", hardwareCartSchema);
|
|
|
|
const ServiceCart = mongoose.model("ServiceCart", serviceCartSchema);
|
|
|
|
const Sales = mongoose.model("Sales", salesSchema);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = {Support,MaterialRecievedPictures,PlumbingWorkPictures,ElectrictyWorkPictures,MasterSlaveData,SensorStock,Order,EstimationOrder,Iotprice,Sales, Install,Survey, ProfilePictureInstall, SensorQuotation,generateinstallationId,Store,ProfilePictureStore,WaterLeverSensor,MotorSwitchSensor,Insensors,generatequatationId, HardwareCart, ServiceCart};
|