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.
		
		
		
		
		
			
		
			
				
					
					
						
							928 lines
						
					
					
						
							29 KiB
						
					
					
				
			
		
		
	
	
							928 lines
						
					
					
						
							29 KiB
						
					
					
				| 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,
 | |
|      }],
 | |
|  
 | |
|      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 },
 | |
|   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_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 }], 
 | |
|   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};
 |