Introduces per-class payout configuration (percentage or hourly rate, plus an optional per-session expense allowance), pure calculation utilities for professor payout/net profit/receivables, and a new financial-reports API surface with per-class, per-session, and date-range/monthly reports. Also adds full CRUD for institutional expenses used in the range report, and wires up the new permissions and roles. Fixes a pre-existing ReferenceError (missing parseImportDate import) in paymentService that blocked creating payments with dated transactions.
198 lines
6.6 KiB
JSON
198 lines
6.6 KiB
JSON
{
|
|
"USER_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "User not found.",
|
|
"fa": "کاربر یافت نشد."
|
|
},
|
|
"USER_ALREADY_EXISTS": {
|
|
"statusCode": 409,
|
|
"en": "User with this national ID, phone number, or email already exists.",
|
|
"fa": "کاربری با این کدملی، شماره تلفن یا ایمیل از قبل وجود دارد."
|
|
},
|
|
"PROFESSOR_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Professor not found.",
|
|
"fa": "استاد یافت نشد."
|
|
},
|
|
"PROFESSOR_ALREADY_EXISTS": {
|
|
"statusCode": 409,
|
|
"en": "Professor with this national ID, phone number, or email already exists.",
|
|
"fa": "استادی با این کدملی، شماره تلفن یا ایمیل از قبل وجود دارد."
|
|
},
|
|
"COURSE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Course not found.",
|
|
"fa": "دوره یافت نشد."
|
|
},
|
|
"COURSE_CAPACITY_FULL": {
|
|
"statusCode": 400,
|
|
"en": "Course capacity is full.",
|
|
"fa": "ظرفیت دوره تکمیل است."
|
|
},
|
|
"ALREADY_ENROLLED": {
|
|
"statusCode": 400,
|
|
"en": "User is already enrolled in this course.",
|
|
"fa": "کاربر قبلاً در این دوره ثبتنام کرده است."
|
|
},
|
|
"SESSION_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Session not found.",
|
|
"fa": "جلسه یافت نشد."
|
|
},
|
|
"ATTENDANCE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Attendance record not found.",
|
|
"fa": "سابقه حضور و غیاب یافت نشد."
|
|
},
|
|
"ATTENDANCE_ALREADY_EXISTS": {
|
|
"statusCode": 409,
|
|
"en": "Attendance record already exists for this student in this session.",
|
|
"fa": "سابقه حضور و غیاب برای این دانشجو در این جلسه قبلاً ثبت شده است."
|
|
},
|
|
"PAYMENT_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Payment record not found.",
|
|
"fa": "سابقه پرداخت یافت نشد."
|
|
},
|
|
"TRANSACTION_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Transaction not found.",
|
|
"fa": "تراکنش یافت نشد."
|
|
},
|
|
"ROLE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Role not found.",
|
|
"fa": "نقش یافت نشد."
|
|
},
|
|
"ROLE_ALREADY_EXISTS": {
|
|
"statusCode": 409,
|
|
"en": "Role with this name already exists.",
|
|
"fa": "نقشی با این نام از قبل وجود دارد."
|
|
},
|
|
"SYSTEM_ROLE_PROTECTED": {
|
|
"statusCode": 403,
|
|
"en": "System roles cannot be modified or deleted.",
|
|
"fa": "نقشهای سیستمی قابل تغییر یا حذف نیستند."
|
|
},
|
|
"NOTIFICATION_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Notification record not found.",
|
|
"fa": "اعلان یافت نشد."
|
|
},
|
|
"CERTIFICATE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Certificate not found.",
|
|
"fa": "مدرک یافت نشد."
|
|
},
|
|
"DOCUMENT_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Document not found.",
|
|
"fa": "سند یافت نشد."
|
|
},
|
|
"CLASS_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Class not found.",
|
|
"fa": "کلاس یافت نشد."
|
|
},
|
|
"EXPENSE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Expense record not found.",
|
|
"fa": "هزینه یافت نشد."
|
|
},
|
|
"DEFAULT_ROLE_NOT_FOUND": {
|
|
"statusCode": 500,
|
|
"en": "Default user role was not found. Please seed the database.",
|
|
"fa": "نقش پیشفرض کاربر یافت نشد. لطفاً دیتابیس را seed کنید."
|
|
},
|
|
"VALIDATION_FAILED": {
|
|
"statusCode": 400,
|
|
"en": "Validation failed.",
|
|
"fa": "اعتبارسنجی ناموفق بود."
|
|
},
|
|
"UNAUTHORIZED": {
|
|
"statusCode": 401,
|
|
"en": "Authentication required. Invalid or missing token.",
|
|
"fa": "احراز هویت لازم است. توکن نامعتبر یا یافت نشد."
|
|
},
|
|
"FORBIDDEN": {
|
|
"statusCode": 403,
|
|
"en": "Access denied. Insufficient permissions.",
|
|
"fa": "دسترسی رد شد. مجوز کافی ندارید."
|
|
},
|
|
"INVALID_CREDENTIALS": {
|
|
"statusCode": 401,
|
|
"en": "Invalid username or password.",
|
|
"fa": "نام کاربری یا رمز عبور اشتباه است."
|
|
},
|
|
"INVALID_CURRENT_PASSWORD": {
|
|
"statusCode": 401,
|
|
"en": "Current password is incorrect.",
|
|
"fa": "رمز عبور فعلی اشتباه است."
|
|
},
|
|
"WEAK_PASSWORD": {
|
|
"statusCode": 400,
|
|
"en": "Password must be at least 6 characters.",
|
|
"fa": "رمز عبور باید حداقل ۶ نویسه باشد."
|
|
},
|
|
"PHONE_NUMBER_REQUIRED": {
|
|
"statusCode": 400,
|
|
"en": "A phone number is required to send login credentials by SMS.",
|
|
"fa": "برای ارسال اطلاعات ورود با پیامک، شماره همراه الزامی است."
|
|
},
|
|
"TOKEN_EXPIRED": {
|
|
"statusCode": 401,
|
|
"en": "Token has expired. Please login again.",
|
|
"fa": "توکن منقضی شده است. لطفا مجددا وارد شوید."
|
|
},
|
|
"INVALID_REFRESH_TOKEN": {
|
|
"statusCode": 401,
|
|
"en": "Invalid or revoked refresh token.",
|
|
"fa": "توکن بازنشانی نامعتبر یا باطل شده است."
|
|
},
|
|
"DUPLICATE_KEY": {
|
|
"statusCode": 409,
|
|
"en": "Duplicate key error. A unique field already exists.",
|
|
"fa": "خطای کلید تکراری. مقداری یکتا از قبل وجود دارد."
|
|
},
|
|
"NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "Requested route or resource not found.",
|
|
"fa": "مسیر یا منبع درخواستی یافت نشد."
|
|
},
|
|
"INTERNAL_SERVER_ERROR": {
|
|
"statusCode": 500,
|
|
"en": "An internal server error occurred.",
|
|
"fa": "خطای داخلی سرور رخ داده است."
|
|
},
|
|
"FILE_REQUIRED": {
|
|
"statusCode": 400,
|
|
"en": "File is required.",
|
|
"fa": "ارسال فایل الزامی است."
|
|
},
|
|
"FILE_NOT_FOUND": {
|
|
"statusCode": 404,
|
|
"en": "The requested file was not found.",
|
|
"fa": "فایل مورد نظر یافت نشد."
|
|
},
|
|
"UNSUPPORTED_FILE_TYPE": {
|
|
"statusCode": 400,
|
|
"en": "This file type is not allowed. Use JPEG, PNG, WebP, GIF, or PDF.",
|
|
"fa": "این نوع فایل مجاز نیست. از JPEG، PNG، WebP، GIF یا PDF استفاده کنید."
|
|
},
|
|
"FILE_COMMIT_FAILED": {
|
|
"statusCode": 502,
|
|
"en": "Failed to store the uploaded file. Please try again.",
|
|
"fa": "ذخیره فایل آپلودشده ناموفق بود. لطفا دوباره تلاش کنید."
|
|
},
|
|
"SEED_LOCKED": {
|
|
"statusCode": 409,
|
|
"en": "Database seeding has already been completed and is locked.",
|
|
"fa": "راهاندازی پایگاه داده قبلاً انجام شده و قفل است."
|
|
},
|
|
"SEED_FAILED": {
|
|
"statusCode": 500,
|
|
"en": "Database seeding failed.",
|
|
"fa": "راهاندازی پایگاه داده با خطا مواجه شد."
|
|
}
|
|
}
|