# مدل‌ها

Author

تیم توسعه

Published

۲۶ مرداد ۱۴۰۴

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

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

    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,
    };

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

    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 };