---
title: "مدل‌ها"
author: "تیم توسعه"
date: "2025-08-17"
format: html
lang: fa
---

# فیلدهای موجود در دیتابیس

مدل *درخواست* کاربر که شامل رویه‌های واردات، صادرات، ترانزیت، تدارکات، تجهیزات، سوخت‌رسانی، آب‌رسانی، عودت تجهیزات (ورود و خروج) می‌شود.

```js
const mongoose = require('mongoose');

const REQUEST_STATUSES = {
	OPEN: 0, // باز
	IN_PROGRESS: 1, // در حال بررسی
	CLOSE: 2, // بسته شده
	END: 3, // پایان عملیات
};

const REQUEST_PERMISSIONS_STATUSES = {
	NOT_HAS: 0, // ندارد
	HAS: 1, // دارد
	CANCEL: 2, // لغو شده
	IN_PROGRESS: 3, //  در حال بررسی
};

// ['صادرات', 'واردات', 'ترانزیت', 'آب رسانی', 'سوخت رسانی', 'تجهیزات', 'تدارکات'],
const OPERATION_TYPES = {
	EXPORT: 0,
	IMPORT: 1,
	TRANSIT: 2,
	WATER: 3,
	FUEL: 4,
	EQUIPMENT: 5,
	PROVISION: 6,
};

// یک تردد، چند تردد، شهری
const TRAFFIC_TYPES = {
	ONE_DIRECTION: 0,
	MULTIPLE_DIRECTION: 1,
	CITY: 2,
	ENTRANCE_PERMISSION: 3,
	EXIT_PERMISSION: 4,
};

// کانتینری، نفتی، عمومی
const TERMINAL_OPTIONS = {
	CONTAINER: 0,
	OIL: 1,
	GENERAL: 2,
	SERVICE: 3,
};

// تخلیه، بارگیری، تشریفات گمرکی
const ENTRANCE_TRAFFIC_TYPES = {
	LOAD: 0,
	UNLOAD: 1,
	CUSTOM: 2,
	SERVICE: 3,
};

const requestSchema = new mongoose.Schema(
	{
        کسی که درخواست ثبت میکنه - واردات صادرات و ...
		requestBy: {
			type: mongoose.Types.ObjectId,
			ref: 'User',
		},

        به نمایندگی از ... درخواست‌ها ثبت میشه. نماینده در واقع
		requestFor: [
			{
				type: mongoose.Types.ObjectId,
				ref: 'User',
			},
		],

        // نوع عملیات درخواست مثل واردات صادرات و ...
		operationType: {
			type: Number,
			required: [true, 'نوع عملیات الزامی می باشد.'],
			enum: Object.values(OPERATION_TYPES),
		},

        // فیلدی حمل یکسره و عملیاتی در آن ذخیره میشود
		options: {
			type: String,
		},

        // فیلدی که جهت در آن ذخیره میشود. جهت تخلیه، بارگیری و تشریفات گمرکی و ...
		entranceTrafficType: {
			type: Number,
			enum: Object.values(ENTRANCE_TRAFFIC_TYPES),
		},

        // حساسیت کالا در این فیلد ذخیره میشود
		danger: [
			{
				type: mongoose.Types.ObjectId,
				ref: 'dangerType',
				required: false,
			},
		],

        // تاییده نهایی نوع تردد که توسط ادمین وارد میشود
		traffic: {
			// تردد تایید شده توسط مجوز دهنده
			type: Number,
			enum: Object.values(TRAFFIC_TYPES),
		},

        // اظهار نوع تردد که توسط کاربر ثبت میشود و نهایی نیست
		trafficType: {
			// اظهار تردد
			type: Number,
			enum: Object.values(TRAFFIC_TYPES),
		},

        // پایانه‌ای که کالا برای آن ثبت می‌شود
		terminalOption: {
			type: Number,
			enum: Object.values(TERMINAL_OPTIONS),
		},

        // آدرس فایل حواله سوخت و ...
		filename: {
			type: String,
		},

        // نام محصول یا کالایی که کاربر وارد میکند
		name: {
			// نام بار
			type: String,
			trim: true,
		},

        // شماره سفر
		voyageNumber: {
			type: String,
		},

        // کد قبض انبار اگر کالا عمومی و یا کانتینری باشد
		receiptNumber: [
			{
				type: String,
				trim: true,
			},
		],

        // تناژ کالا
		tonaj: {
			type: String,
		},

        // عددی که برای تناژ استفاده میشود
		tonajNumber: {
			type: String,
		},

        // واحد تناژ کالا
		tonajType: {
			type: String,
		},

        // تعداد محصول یا بار
		packageNumber: {
			type: String,
		},

        // شماره پلاک‌های ثبت شده برای درخواست کاربر
		plates: [
			{
				type: mongoose.Types.ObjectId,
				ref: 'plates',
				required: false,
			},
		],

        // بدون استفاده
		truckNumber: {
			type: String,
		},

        // اسم شناور
		vesselName: String,

        // اسم کشتی رانی صاحب شناور
		shipping: {
			type: String,
		},

        // منطقه عملیاتی
		storeRoom: {
			type: mongoose.Types.ObjectId,
			ref: 'storeRoom',
			required: false,
		},
        // نوع منطقه عملیاتی - که استفاده نمیشود
		storeRoomType: {
			type: String,
		},

        // دستگاه نظارت درخواست
		supervisionDepartment: {
			type: mongoose.Types.ObjectId,
			ref: 'supervisionDepartment',
			required: false,
		},

        // کاربری که برای درخواست مشاور است
		consultingUser: {
			type: String,
		},
		consultingUsername: {
			type: String,
		},
		consultingStatus: {
			type: String,
		},
		supervisionStatus: {
			type: String,
		},
		propertyBossStatus: {
			type: String,
		},
		HSEStatus: {
			type: String,
		},
		portBossStatus: {
			type: String,
		},
		customsStatus: {
			type: String,
		},
		selectedStores: {
			type: Array,
		},

        // مقصد کالا
		destination: {
			type: mongoose.SchemaTypes.ObjectId,
			trim: true,
			ref: 'city',
		},

        // مجوز یگان حفاظت 
		permissionGuard: {
			// مجوز یگان حفاظت
			type: Number,
			enum: Object.values(REQUEST_PERMISSIONS_STATUSES),
			default: REQUEST_PERMISSIONS_STATUSES.IN_PROGRESS,
		},

        // مجوز پایانه اسکله برای حرکت کردن ناوگان حمل از پایانه کامیونی
		permissionPier: {
			// مجوز اسکله
			type: Number,
			enum: Object.values(REQUEST_PERMISSIONS_STATUSES),
			default: REQUEST_PERMISSIONS_STATUSES.IN_PROGRESS,
		},

        // اظهارات کوتاژ کاربر
		userCottages: [
			//اظهار کوتاژ
			{
				type: String,
				trim: true,
			},
		],
		date: {
			type: Date,
		},
		dateString: {
			type: String,
		},

        // کامنت اسکله - بروز میشود
		pierComment: {
			type: String,
		},

        // پایانه حمل
		terminalTruckName: {
			type: mongoose.Types.ObjectId,
			ref: 'terminals',
			required: false,
		},

        // شماره حواله سوخت
		gasolineRequestNumber: {
			type: String,
		},

        // شماره سفارش
		orderNumber: {
			type: String,
		},

        // دروازه‌ای که درخواست برای 
		gateName: {
			type: mongoose.Types.ObjectId,
			ref: 'gate',
			required: [true, 'نام دروازه الزامی می باشد.'],
		},

        // کد رهگیری تولید شده
		requestNumber: {
			type: String,
		},
		supervisionUser: {
			type: String,
		},
		supervisionUsername: {
			type: String,
		},
		propertyBossUser: {
			type: String,
		},
		propertyBossUsername: {
			type: String,
		},
		HSEUser: {
			type: String,
		},
		HSEUsername: {
			type: String,
		},
		portBossUser: {
			type: String,
		},
		portBossUsername: {
			type: String,
		},
		terminalUser: {
			type: String,
		},
		terminalUsername: {
			type: String,
		},
		permissionPierDate: {
			type: Date,
		},
		permissionPierDateString: {
			type: String,
		},

        // وضعیت درخواست کاربر
		status: {
			type: Number,
			enum: Object.values(REQUEST_STATUSES),
			default: REQUEST_STATUSES.IN_PROGRESS,
		},

        // اظهارات کوتاژ کاربر تایید شده است یا نه
		cottageVerified: {
			type: Boolean,
			default: false,
		},
		verfiedAt: {
			type: Date,
			required: false,
		},
		cottages: [
			// کوتاژهای تایید شده توسط سرویس استعلام گمرک
			{
				type: mongoose.Types.ObjectId,
				ref: 'cottage',
				required: false,
			},
		],

        // فیلدی برای کانتینر خالی
		emptyContainer: {
			type: Boolean,
		},

        // اگر کالا خطرناک باشد 
		unNumber: {
			type: String,
		},

        // اگر کالا خطرناک باشد
		casNumber: {
			type: String,
		},
		process: {
			// شروع فرآیند
			type: mongoose.SchemaTypes.ObjectId,
			ref: 'process',
		},
		commodityList: [
			// لیست اقلام
			{
				type: mongoose.SchemaTypes.ObjectId,
				ref: 'equipements',
				required: false,
			},
		],
	},
	{ timestamps: true }
);

const Request = mongoose.model('request', requestSchema);

module.exports = {
	Request,
	REQUEST_STATUSES,
	REQUEST_PERMISSIONS_STATUSES,
	TERMINAL_OPTIONS,
	TRAFFIC_TYPES,
	OPERATION_TYPES,
};

```


---
مدل مربوط به شماره پلاک درخواست‌ها که کاربر اطلاعات راننده را وارد می‌کند. 

```js
const mongoose = require('mongoose');
const { TRAFFIC_TYPES } = require('./request.model');

// وضعیت فعلی پلاک که در چه مرحله‌ای است
const PLATE_STATES = {
	OUT_PORT: 0,
	IN_PORT: 1,
	CLOSED: 2,
};

// پلاک مجوز حرکت دارد یا ندارد
const PLATE_PERMISSIONS = {
	NOT_HAS: 0,
	HAS: 1,
	PENDING: 2,
};

// یگان حفاظت مجوز ورود و خروج پلاک را بصورت اتوماتیک توسط دوربین پلاکخوان ثبت کرده یا بصورت دستی
const GUARD_REGISTRATION_TYPES = {
	AUTO: 0,
	MANUAL: 1,
};

// مدل پلاک
const platesSchema = new mongoose.Schema(
	{
        // شماره پلاک
		plate: {
			type: String,
			trim: true,
		},
		//مجوز ورود به بندر که هم یگان حفاظت برای چند ترددی و شهری صادر می کند و هم پایانه کامیونی
		permission: {
			type: Number,
			enum: Object.values(PLATE_PERMISSIONS),
		},

        // مجوز یگان حفاظت
		permissionGuard: {
			type: Number,
		},
		permissionGuardDate: {
			type: Date,
		},
		status: {
			type: Number,
		},

        // نوع ترددی که توسط ادمین ثبت شده است
		traffic: {
			type: Number,
			enum: Object.values(TRAFFIC_TYPES),
		},

        // زمان ورود ناوگان حمل به درون بندر
		entranceTime: [
			{
				type: Date,
			},
		],
		entranceTimeString: [
			{
				type: String,
			},
		],

        // زمان خروج ناوگان حمل از بندر
		exitTime: [
			{
				type: Date,
			},
		],
		exitTimeString: [
			{
				type: String,
			},
		],

        // مجوز پایانه راهداری
		delfardTerminalTime: {
			type: Date,
		},
		delfardTerminalTimeString: {
			type: String,
		},

        // زمان مجوز گرفتن از پایانه کامیونی
		truckTerminalTime: {
			type: Date,
		},
		truckTerminalTimeString: {
			type: String,
		},

        // تخلف
		violationType: {
			type: String,
		},
		violationComment: {
			type: String,
		},

        // حساسیت کالایی که حمل میکند
		dangers: [
			{
				type: mongoose.SchemaTypes.ObjectId,
				ref: 'dangerType',
			},
		],
		date: {
			type: Date,
		},
		dateString: {
			type: String,
		},

        // اگر درخواست از نوع کانتینری باشد شماره‌های کانتینر هم باید وارد شود
		containerNumbers: [
			{
				type: String,
			},
		],

		closeDate: {
			type: Date,
		},

        // اسم راننده
		driverName: {
			type: String,
		},

        // شماره پاسپورت برای خارجی‌ها و کد ملی برای داخلی‌ها
		driverPersonalCode: {
			type: String,
		},

        // شماره موبایل راننده
		driverMobile: {
			type: String,
		},

        // ملیت راننده
		driverNationality: {
			type: String,
		},

        // نوع ناوگان حمل
		truckType: {
			type: mongoose.SchemaTypes.ObjectId,
			ref: 'trucks',
		},

        // کدی که اگر نوع ناوگان از نوع چادری یا یخچالی باشد
		TYnumber: {
			type: String,
		},

        // درخواست کنسل شده است یا نه
		isCancel: {
			type: Boolean,
		},
		bijakType: {
			type: String,
		},
		bijakNumber: {
			type: Number,
		},
		bijakTruckScaleNumber: {
			type: String,
		},
		bijakUser: {
			type: String,
		},
		bijakGCOMS: {
			type: Array,
		},

        // درخواست برای بستن 
		requestForClose: {
			type: Boolean,
		},
		requestForCloseFullName: {
			type: String,
		},

        // نوع پلاک که ایرانی خارجی و منطقه آزاد باشد
		plateOption: {
			type: String,
		},
		plateState: {
			type: Number,
			enum: Object.values(PLATE_STATES),
			default: PLATE_STATES.OUT_PORT,
		},

        // نوع ورود پلاک به بندر
		entranceGuardRegistrationType: {
			type: Number,
			enum: Object.values(GUARD_REGISTRATION_TYPES),
		},

        // نوع خروج پلاک از بندر
		exitGuardRegistrationType: {
			type: Number,
			enum: Object.values(GUARD_REGISTRATION_TYPES),
		},
		// transportation

        // شرکت حمل اگر درخواست شهری ثبت شود
		transportationCompany: {
			type: mongoose.SchemaTypes.ObjectId,
			ref: 'terminals',
			required: false,
		},
	},
	{ timestamps: true }
);

const Plate = mongoose.model('plates', platesSchema);

module.exports = { Plate, PLATE_STATES, PLATE_PERMISSIONS };
```