مدل‌ها

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