2155 lines
67 KiB
JavaScript
2155 lines
67 KiB
JavaScript
const cors = require("cors");
|
||
const bcrypt = require("bcrypt");
|
||
const path = require("path");
|
||
const jwt = require("jsonwebtoken");
|
||
const fs = require("fs");
|
||
const sql = require("mssql");
|
||
const multer = require("multer");
|
||
const { DateTime } = require("luxon");
|
||
|
||
const express = require("express");
|
||
const app = express();
|
||
require("dotenv").config();
|
||
|
||
app.use((req, res, next) => {
|
||
res.header("Access-Control-Allow-Origin", "*");
|
||
res.header(
|
||
"Access-Control-Allow-Headers",
|
||
"Origin, X-Requested-With, Content-Type, Accept"
|
||
);
|
||
res.header("Access-Control-Allow-Headers", "Authorization");
|
||
res.header("Access-Control-Allow-Methods", "POST");
|
||
next();
|
||
});
|
||
|
||
app.use(express.json());
|
||
app.use(express.urlencoded({ extended: false }));
|
||
app.use(cors());
|
||
|
||
const dbConfig = {
|
||
user: process.env.DB_USER,
|
||
password: process.env.DB_PASSWORD,
|
||
server: process.env.DB_HOST,
|
||
database: process.env.DB_NAME,
|
||
port: parseInt(process.env.DB_PORT),
|
||
options: {
|
||
trustServerCertificate: true, // Разрешить доверять самоподписанным сертификатам
|
||
},
|
||
};
|
||
|
||
const storage = multer.memoryStorage();
|
||
const upload = multer({ storage: storage });
|
||
|
||
async function executeQuery(query, params) {
|
||
console.log(params);
|
||
try {
|
||
// Create a connection pool
|
||
const pool = await new sql.ConnectionPool(dbConfig).connect();
|
||
// Create a new request
|
||
const request = pool.request();
|
||
|
||
// Add parameters to the request
|
||
for (const key in params) {
|
||
if (params.hasOwnProperty(key)) {
|
||
request.input(key, params[key]);
|
||
}
|
||
}
|
||
|
||
// Execute the query
|
||
const result = await request.query(query);
|
||
|
||
// Close the connection pool
|
||
pool.close();
|
||
|
||
return result.recordset;
|
||
} catch (err) {
|
||
throw err;
|
||
}
|
||
}
|
||
|
||
(async () => {
|
||
try {
|
||
const sqlQuery = await fs.readFileSync("create_tables.sql", "utf-8");
|
||
|
||
const result = await executeQuery(sqlQuery);
|
||
|
||
console.log("Tables created successfully");
|
||
} catch (err) {
|
||
console.error("Ошибка MSSQL", err);
|
||
}
|
||
})();
|
||
|
||
function generateToken(userId, role) {
|
||
return jwt.sign({ userId, role }, process.env.SECRET, {
|
||
expiresIn: "12h",
|
||
});
|
||
}
|
||
|
||
// Функция middleware для проверки токена
|
||
async function checkToken(req, res, next) {
|
||
const token = req.headers.authorization;
|
||
|
||
// const admins = await pool.query("SELECT * FROM users WHERE isadmin = true");
|
||
// if (admins.rows.length === 0) {
|
||
// return res.status(400).json({ message: "Необходима установка" });
|
||
// }
|
||
|
||
if (!token) {
|
||
console.log("Токен отсутствует");
|
||
return res.status(401).json({ message: "Токен отсутствует" });
|
||
}
|
||
|
||
try {
|
||
console.log(token, process.env.SECRET);
|
||
const decoded = jwt.verify(token, process.env.SECRET);
|
||
req.user = decoded;
|
||
res.set("Authorization", generateToken(decoded.userId, decoded.role));
|
||
next();
|
||
} catch (error) {
|
||
console.log("Неверный токен");
|
||
return res.status(401).json({ message: "Неверный токен" });
|
||
}
|
||
}
|
||
|
||
const saltRounds = 10;
|
||
|
||
// Обработка POST на регистрацию
|
||
app.post("/signup", upload.single("file"), async (req, res) => {
|
||
try {
|
||
const {
|
||
firstname,
|
||
surname,
|
||
secondname,
|
||
born,
|
||
name,
|
||
inn,
|
||
ogrn,
|
||
legaladdress,
|
||
address,
|
||
phone,
|
||
email,
|
||
contact,
|
||
password,
|
||
formrole,
|
||
} = req.body;
|
||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||
|
||
const checkLegal = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE Email = @email",
|
||
{
|
||
email: email,
|
||
}
|
||
);
|
||
|
||
const checkPersons = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE Email = @email",
|
||
{
|
||
email: email,
|
||
}
|
||
);
|
||
|
||
if (checkPersons.length > 0 || checkLegal.length > 0) {
|
||
res.status(400).json({
|
||
message: "Такой Email уже зарегистрирован",
|
||
});
|
||
return;
|
||
}
|
||
|
||
if (formrole === "legal") {
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Юридические лица] (Наименование, ИНН, ОГРН, Юридический_адрес, Фактический_адрес, Телефон, Email, Контактное_лицо, Пароль)
|
||
OUTPUT inserted.*
|
||
VALUES (@name, @inn, @ogrn, @legaladdress, @address, @phone, @email, @contact, @hashedPassword)
|
||
`,
|
||
{
|
||
name: name,
|
||
inn: inn,
|
||
ogrn: ogrn,
|
||
legaladdress: legaladdress,
|
||
address: address,
|
||
phone: phone,
|
||
email: email,
|
||
contact: contact,
|
||
hashedPassword: hashedPassword,
|
||
}
|
||
);
|
||
|
||
const userId = addResult[0].id;
|
||
const role = "legal";
|
||
|
||
const token = jwt.sign({ userId, role }, process.env.SECRET, {
|
||
expiresIn: "12h",
|
||
});
|
||
|
||
res.status(201).json({
|
||
message: "Юридическое лицо успешно добавлено",
|
||
token: token,
|
||
});
|
||
} else {
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Физические лица] (Имя, Фамилия, Отчество, Дата_рождения, Телефон, Email, Пароль)
|
||
OUTPUT inserted.*
|
||
VALUES (@firstname, @surname, @secondname, @born, @phone, @email, @hashedPassword)
|
||
`,
|
||
{
|
||
firstname: firstname,
|
||
surname: surname,
|
||
secondname: secondname,
|
||
born: born,
|
||
phone: phone,
|
||
email: email,
|
||
hashedPassword: hashedPassword,
|
||
}
|
||
);
|
||
|
||
const userId = addResult[0].id;
|
||
const role = "guest";
|
||
|
||
const token = jwt.sign({ userId, role }, process.env.SECRET, {
|
||
expiresIn: "12h",
|
||
});
|
||
|
||
res.status(201).json({
|
||
message: "Физическое лицо успешно добавлено",
|
||
token: token,
|
||
});
|
||
}
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка DELETE запроса для удаления строки с определенным ID из таблицы "Юридические лица"
|
||
app.delete("/legal/delete", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const result = await executeQuery(
|
||
"DELETE FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
res.status(200).json({ message: "Строка успешно удалена" });
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке DELETE запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка DELETE запроса для удаления строки с определенным ID из таблицы "Юридические лица"
|
||
app.delete("/user/delete", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const result = await executeQuery(
|
||
"SELECT id FROM [Трудоустройство] WHERE Работник = @id",
|
||
{
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
if (result.length > 0) {
|
||
const secondDelete = await executeQuery(
|
||
"DELETE FROM [Трудоустройство] WHERE id = @id",
|
||
{
|
||
id: result[0].id,
|
||
}
|
||
);
|
||
}
|
||
|
||
const firstDelete = await executeQuery(
|
||
"DELETE FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
res.status(200).json({ message: "Строка успешно удалена" });
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке DELETE запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка запроса на авторизацию и генерация JWT токена при успешной аутентификации
|
||
app.post("/login", upload.single("file"), async (req, res) => {
|
||
const { email, password } = req.body;
|
||
|
||
const checkResult = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE Email = @email",
|
||
{
|
||
email: email,
|
||
}
|
||
);
|
||
|
||
if (checkResult.length > 0) {
|
||
console.log(checkResult[0].Пароль);
|
||
|
||
const checkUser = await executeQuery(
|
||
"SELECT * FROM [Трудоустройство] WHERE Работник = @id",
|
||
{
|
||
id: checkResult[0].id,
|
||
}
|
||
);
|
||
|
||
const storedHashedPassword = checkResult[0].Пароль;
|
||
const userId = checkResult[0].id;
|
||
var role;
|
||
if (!checkUser[0]) {
|
||
role = "guest";
|
||
} else {
|
||
role = checkUser[0].Должность;
|
||
}
|
||
|
||
const passwordMatch = await bcrypt.compare(password, storedHashedPassword);
|
||
if (!passwordMatch) {
|
||
return res.status(401).json({ message: "Неверные учетные данные" });
|
||
}
|
||
|
||
const token = jwt.sign({ userId, role }, process.env.SECRET, {
|
||
expiresIn: "12h",
|
||
});
|
||
console.log("LOGIN", token);
|
||
res.json({ token });
|
||
} else {
|
||
const checkLegals = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE Email = @email",
|
||
{
|
||
email: email,
|
||
}
|
||
);
|
||
|
||
if (checkLegals.length > 0) {
|
||
const storedHashedPassword = checkLegals[0].Пароль;
|
||
const userId = checkLegals[0].id;
|
||
const role = "legal";
|
||
|
||
const passwordMatch = await bcrypt.compare(
|
||
password,
|
||
storedHashedPassword
|
||
);
|
||
if (!passwordMatch) {
|
||
return res.status(401).json({ message: "Неверные учетные данные" });
|
||
}
|
||
|
||
const token = jwt.sign({ userId, role }, process.env.SECRET, {
|
||
expiresIn: "12h",
|
||
});
|
||
console.log("LOGIN", token);
|
||
res.set("Token", token).json({ token });
|
||
res.json({ token });
|
||
} else {
|
||
return res.status(401).json({ message: "Пользователь не найден" });
|
||
}
|
||
}
|
||
});
|
||
|
||
// Обработка запроса на получение данных для личного кабинета
|
||
app.get("/account", checkToken, async (req, res) => {
|
||
try {
|
||
const userId = req.user.userId;
|
||
const userRole = req.user.role;
|
||
|
||
console.log(userId, userRole);
|
||
|
||
if (userRole === "legal") {
|
||
const result = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: userId,
|
||
}
|
||
);
|
||
|
||
res.status(200).json({
|
||
data: result[0],
|
||
role: userRole,
|
||
});
|
||
} else {
|
||
const result = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: userId,
|
||
}
|
||
);
|
||
|
||
res.status(200).json({
|
||
data: result[0],
|
||
role: userRole,
|
||
});
|
||
}
|
||
} catch (error) {
|
||
console.error("Ошибка при получении данных пользователя:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка POST на новую заявку
|
||
app.post(
|
||
"/passes/newform",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
const {
|
||
formrole,
|
||
passtext,
|
||
type,
|
||
fullnames,
|
||
legalname,
|
||
date,
|
||
carnumber,
|
||
carbrand,
|
||
carmodel,
|
||
carcolor,
|
||
tmcname,
|
||
tmcunit,
|
||
tmcquantity,
|
||
} = req.body;
|
||
|
||
var who;
|
||
|
||
if (req.user.role === "legal") {
|
||
const result = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
|
||
who = result[0].Наименование;
|
||
} else {
|
||
const result = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
|
||
who =
|
||
result[0].Фамилия + " " + result[0].Имя + " " + result[0].Отчество;
|
||
}
|
||
|
||
const currentDate = new Date();
|
||
const formattedDate = currentDate.toISOString();
|
||
|
||
for (const name of fullnames) {
|
||
if (name && name.trim().length > 0) {
|
||
await executeQuery(
|
||
`INSERT INTO [Заявки] (Статус, Вид_заявки, Работник, Дата_заявки, Дополнение, Организация, Авто_модель, Авто_марка, Авто_цвет, Авто_гос_номер, Наименование, Единица_измерения, Количество, Автор)
|
||
OUTPUT inserted.*
|
||
VALUES (@status, @type, @fullname, @added, @passtext, @legalname, @carmodel, @carbrand, @carcolor, @carnumber, @tmcname, @tmcunit, @tmcquantity, @who)
|
||
`,
|
||
{
|
||
status: "Новая",
|
||
type: type,
|
||
fullname: name,
|
||
added: formattedDate,
|
||
passtext: passtext,
|
||
legalname: legalname,
|
||
carmodel: JSON.stringify(carmodel),
|
||
carbrand: JSON.stringify(carbrand),
|
||
carcolor: JSON.stringify(carcolor),
|
||
carnumber: JSON.stringify(carnumber),
|
||
tmcname: JSON.stringify(tmcname),
|
||
tmcunit: JSON.stringify(tmcunit),
|
||
tmcquantity: JSON.stringify(tmcquantity),
|
||
who: who,
|
||
}
|
||
);
|
||
}
|
||
}
|
||
|
||
res.status(201).json({
|
||
message: "Заявка успешно отправлена",
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на регистрацию
|
||
app.post(
|
||
"/passes/newtso",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
const { type, object, fabula, fullname } = req.body;
|
||
|
||
if (req.user.role === "guest") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
const id = req.user.id;
|
||
|
||
const currentDate = new Date();
|
||
const formattedDate = currentDate.toISOString();
|
||
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Заявки_ТСО] (Вид_неисправности, Объект, Фабула, Дата_подачи, Состояние, Кто_подал, Дата_изменения)
|
||
OUTPUT inserted.*
|
||
VALUES (@type, @object, @fabula, @formattedDate, @status, @fullname, @formattedDate)
|
||
`,
|
||
{
|
||
status: "Новая",
|
||
type: type,
|
||
object: object,
|
||
fabula: fabula,
|
||
formattedDate: formattedDate,
|
||
id: id,
|
||
fullname: fullname,
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
message: "Заявка успешно отправлена",
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка PUT запроса с новыми данными пользователя
|
||
app.put(
|
||
"/account/update",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const {
|
||
firstname,
|
||
surname,
|
||
secondname,
|
||
born,
|
||
name,
|
||
inn,
|
||
ogrn,
|
||
legaladdress,
|
||
address,
|
||
phone,
|
||
contactphone,
|
||
email,
|
||
contact,
|
||
password,
|
||
formrole,
|
||
bornplace,
|
||
passport,
|
||
citizenship,
|
||
regaddress,
|
||
realaddress,
|
||
dms,
|
||
} = req.body;
|
||
|
||
const id = req.user.userId;
|
||
const role = req.user.role;
|
||
|
||
try {
|
||
if (role === "legal") {
|
||
const params = {};
|
||
let query = `UPDATE [Юридические лица] SET`;
|
||
|
||
if (password) {
|
||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||
query += ` Пароль = @password,`;
|
||
params.password = hashedPassword;
|
||
}
|
||
if (inn) {
|
||
query += ` ИНН = @inn,`;
|
||
params.inn = inn;
|
||
}
|
||
if (ogrn) {
|
||
query += ` ОГРН = @ogrn,`;
|
||
params.ogrn = ogrn;
|
||
}
|
||
if (legaladdress) {
|
||
query += ` Юридический_адрес = @legaladdress,`;
|
||
params.legaladdress = legaladdress;
|
||
}
|
||
if (address) {
|
||
query += ` Фактический_адрес = @address,`;
|
||
params.address = address;
|
||
}
|
||
if (contact) {
|
||
query += ` Контактное_лицо = @contact,`;
|
||
params.contact = contact;
|
||
}
|
||
if (contactphone) {
|
||
query += ` Телефон = @contactphone,`;
|
||
params.contactphone = contactphone;
|
||
}
|
||
if (name) {
|
||
query += ` Наименование = @name`;
|
||
params.name = name;
|
||
}
|
||
|
||
query += ` OUTPUT inserted.*`;
|
||
|
||
query += ` WHERE id = @id`;
|
||
|
||
console.log(query);
|
||
|
||
const result = await executeQuery(query, {
|
||
...params,
|
||
id,
|
||
});
|
||
|
||
res.status(201).json({
|
||
message: "Данные пользователя успешно обновлены",
|
||
data: result,
|
||
});
|
||
} else {
|
||
const params = {};
|
||
let query = `UPDATE [Физические лица] SET`;
|
||
|
||
if (password) {
|
||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||
query += ` Пароль = @password,`;
|
||
params.password = hashedPassword;
|
||
}
|
||
if (surname) {
|
||
query += ` Фамилия = @surname,`;
|
||
params.surname = surname;
|
||
}
|
||
if (secondname) {
|
||
query += ` Отчество = @secondname,`;
|
||
params.secondname = secondname;
|
||
}
|
||
if (born) {
|
||
query += ` Дата_рождения = @born,`;
|
||
params.born = born;
|
||
}
|
||
if (bornplace) {
|
||
query += ` Место_рождения = @bornplace,`;
|
||
params.bornplace = bornplace;
|
||
}
|
||
if (passport) {
|
||
query += ` Паспорт = @passport,`;
|
||
params.passport = passport;
|
||
}
|
||
if (citizenship) {
|
||
query += ` Гражданство = @citizenship,`;
|
||
params.citizenship = citizenship;
|
||
}
|
||
if (regaddress) {
|
||
query += ` Место_регистрации = @regaddress,`;
|
||
params.regaddress = regaddress;
|
||
}
|
||
if (realaddress) {
|
||
query += ` Место_жительства = @realaddress,`;
|
||
params.realaddress = realaddress;
|
||
}
|
||
if (dms) {
|
||
query += ` Полис_ДМС = @dms,`;
|
||
params.dms = dms;
|
||
}
|
||
if (phone) {
|
||
query += ` Телефон = @phone,`;
|
||
params.phone = phone;
|
||
}
|
||
if (firstname) {
|
||
query += ` Имя = @firstname`;
|
||
params.firstname = firstname;
|
||
}
|
||
|
||
query += ` OUTPUT inserted.*`;
|
||
|
||
query += ` WHERE id = @id`;
|
||
|
||
console.log(query);
|
||
|
||
const result = await executeQuery(query, {
|
||
...params,
|
||
id,
|
||
});
|
||
|
||
res.status(201).json({
|
||
message: "Данные пользователя успешно обновлены",
|
||
data: result,
|
||
});
|
||
}
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке PUT запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на добавление работника из аккаунта гостя
|
||
app.post("/users/makeworker", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Трудоустройство] (Работник, Должность)
|
||
OUTPUT inserted.*
|
||
VALUES (@id, @position)
|
||
`,
|
||
{
|
||
id: id,
|
||
position: "Работник",
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
message: "Работник успешно добавлен",
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка PUT запроса с новыми данными другого пользователя
|
||
app.put(
|
||
"/users/update",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const {
|
||
firstname,
|
||
surname,
|
||
secondname,
|
||
oldsurname,
|
||
born,
|
||
name,
|
||
inn,
|
||
ogrn,
|
||
legaladdress,
|
||
address,
|
||
phone,
|
||
contactphone,
|
||
contact,
|
||
password,
|
||
formrole,
|
||
bornplace,
|
||
passport,
|
||
citizenship,
|
||
regaddress,
|
||
realaddress,
|
||
tabel,
|
||
dms,
|
||
block,
|
||
organization,
|
||
sub,
|
||
department,
|
||
migration,
|
||
permit,
|
||
contract,
|
||
contractdate,
|
||
lastjob,
|
||
fire,
|
||
reason,
|
||
role,
|
||
id,
|
||
additional,
|
||
} = req.body;
|
||
|
||
try {
|
||
if (formrole === "legal") {
|
||
const params = {};
|
||
let query = `UPDATE [Юридические лица] SET`;
|
||
|
||
if (password) {
|
||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||
query += ` Пароль = @password,`;
|
||
params.password = hashedPassword;
|
||
}
|
||
if (inn) {
|
||
query += ` ИНН = @inn,`;
|
||
params.inn = inn;
|
||
}
|
||
if (ogrn) {
|
||
query += ` ОГРН = @ogrn,`;
|
||
params.ogrn = ogrn;
|
||
}
|
||
if (legaladdress) {
|
||
query += ` Юридический_адрес = @legaladdress,`;
|
||
params.legaladdress = legaladdress;
|
||
}
|
||
if (address) {
|
||
query += ` Фактический_адрес = @address,`;
|
||
params.address = address;
|
||
}
|
||
if (contact) {
|
||
query += ` Контактное_лицо = @contact,`;
|
||
params.contact = contact;
|
||
}
|
||
if (contactphone) {
|
||
query += ` Телефон = @contactphone,`;
|
||
params.contactphone = contactphone;
|
||
}
|
||
if (additional) {
|
||
query += ` Дополнительно = @additional,`;
|
||
params.additional = additional;
|
||
}
|
||
if (name) {
|
||
query += ` Наименование = @name`;
|
||
params.name = name;
|
||
}
|
||
|
||
query += ` OUTPUT inserted.*`;
|
||
|
||
query += ` WHERE id = @id`;
|
||
|
||
console.log(query);
|
||
|
||
const result = await executeQuery(query, {
|
||
...params,
|
||
id,
|
||
});
|
||
|
||
res.status(201).json({
|
||
message: "Данные пользователя успешно обновлены",
|
||
data: result,
|
||
});
|
||
} else {
|
||
const params = {};
|
||
let query = `UPDATE [Физические лица] SET`;
|
||
|
||
if (password) {
|
||
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||
query += ` Пароль = @password,`;
|
||
params.password = hashedPassword;
|
||
}
|
||
if (surname) {
|
||
query += ` Фамилия = @surname,`;
|
||
params.surname = surname;
|
||
}
|
||
if (secondname) {
|
||
query += ` Отчество = @secondname,`;
|
||
params.secondname = secondname;
|
||
}
|
||
if (oldsurname) {
|
||
query += ` Фамилия_старая = @oldsurname,`;
|
||
params.oldsurname = oldsurname;
|
||
}
|
||
if (born) {
|
||
query += ` Дата_рождения = @born,`;
|
||
params.born = born;
|
||
}
|
||
if (bornplace) {
|
||
query += ` Место_рождения = @bornplace,`;
|
||
params.bornplace = bornplace;
|
||
}
|
||
if (passport) {
|
||
query += ` Паспорт = @passport,`;
|
||
params.passport = passport;
|
||
}
|
||
if (citizenship) {
|
||
query += ` Гражданство = @citizenship,`;
|
||
params.citizenship = citizenship;
|
||
}
|
||
if (regaddress) {
|
||
query += ` Место_регистрации = @regaddress,`;
|
||
params.regaddress = regaddress;
|
||
}
|
||
if (realaddress) {
|
||
query += ` Место_жительства = @realaddress,`;
|
||
params.realaddress = realaddress;
|
||
}
|
||
if (tabel) {
|
||
query += ` Табельный_номер = @tabel,`;
|
||
params.tabel = tabel;
|
||
}
|
||
if (dms) {
|
||
query += ` Полис_ДМС = @dms,`;
|
||
params.dms = dms;
|
||
}
|
||
if (block) {
|
||
query += ` Черный_список = @block,`;
|
||
params.block = block;
|
||
}
|
||
if (phone) {
|
||
query += ` Телефон = @phone,`;
|
||
params.phone = phone;
|
||
}
|
||
if (firstname) {
|
||
query += ` Имя = @firstname`;
|
||
params.firstname = firstname;
|
||
}
|
||
|
||
query += ` OUTPUT inserted.*`;
|
||
|
||
query += ` WHERE id = @id`;
|
||
|
||
var result = await executeQuery(query, {
|
||
...params,
|
||
id,
|
||
});
|
||
|
||
var workresult;
|
||
|
||
if (role) {
|
||
const workparams = {};
|
||
let workquery = `UPDATE [Трудоустройство] SET`;
|
||
|
||
if (organization) {
|
||
workquery += ` Организация = @organization,`;
|
||
workparams.organization = organization;
|
||
}
|
||
if (sub) {
|
||
workquery += ` Субподряд = @sub,`;
|
||
workparams.sub = sub;
|
||
}
|
||
if (department) {
|
||
workquery += ` Цех = @department,`;
|
||
workparams.department = department;
|
||
}
|
||
if (migration) {
|
||
workquery += ` Миграционная_карта = @migration,`;
|
||
workparams.migration = migration;
|
||
}
|
||
if (permit) {
|
||
workquery += ` Разрешение_на_работу_до = @permit,`;
|
||
workparams.permit = permit;
|
||
}
|
||
if (contract) {
|
||
workquery += ` Трудовой_договор = @contract,`;
|
||
workparams.contract = contract;
|
||
}
|
||
if (contractdate) {
|
||
workquery += ` Дата_договора = @contractdate,`;
|
||
workparams.contractdate = contractdate;
|
||
}
|
||
if (lastjob) {
|
||
workquery += ` Последнее_место_работы = @lastjob,`;
|
||
workparams.lastjob = lastjob;
|
||
}
|
||
if (fire) {
|
||
workquery += ` Увольнение = @fire,`;
|
||
workparams.fire = fire;
|
||
}
|
||
if (reason) {
|
||
workquery += ` Причина_увольнения = @reason,`;
|
||
workparams.reason = reason;
|
||
}
|
||
if (role) {
|
||
workquery += ` Должность = @role`;
|
||
workparams.role = role;
|
||
}
|
||
|
||
workquery += ` OUTPUT inserted.*`;
|
||
|
||
workquery += ` WHERE Работник = @id`;
|
||
|
||
workresult = await executeQuery(workquery, {
|
||
...workparams,
|
||
id,
|
||
});
|
||
}
|
||
|
||
res.status(201).json({
|
||
message: "Данные пользователя успешно обновлены",
|
||
});
|
||
}
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке PUT запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на получение списка пользователей
|
||
app.post(
|
||
"/users/getusers",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
var { page, searchText } = req.body;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "КПП") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
if (!page) {
|
||
page = 1;
|
||
}
|
||
|
||
const pageSize = 15;
|
||
const offset = (page - 1) * pageSize;
|
||
|
||
let physicalPersonsQuery = `
|
||
SELECT pp.*, emp.id AS emp_id, emp.[Организация], emp.[Субподряд], emp.[Цех], emp.[Должность], emp.[Миграционная_карта], emp.[Разрешение_на_работу_до], emp.[Трудовой_договор], emp.[Дата_договора], emp.[Последнее_место_работы], emp.[Увольнение], emp.[Причина_увольнения]
|
||
FROM [Физические лица] pp
|
||
LEFT JOIN [Трудоустройство] emp ON pp.id = emp.Работник
|
||
`;
|
||
|
||
let legalPersonsQuery = `
|
||
SELECT *
|
||
FROM [Юридические лица]
|
||
`;
|
||
|
||
var totalCountQuery;
|
||
|
||
if (searchText) {
|
||
totalCountQuery = `
|
||
SELECT
|
||
(SELECT COUNT(*)
|
||
FROM [Физические лица] pp
|
||
LEFT JOIN [Трудоустройство] emp ON pp.id = emp.Работник
|
||
WHERE CONCAT(
|
||
pp.[Фамилия] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Имя] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Отчество] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_рождения] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Паспорт], ' ',
|
||
pp.[Табельный_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Гражданство] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_регистрации] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_жительства] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Полис_ДМС] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Табельный_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Телефон], ' ',
|
||
pp.[Email] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
) AS PhysicalCount,
|
||
(SELECT COUNT(*)
|
||
FROM [Юридические лица]
|
||
WHERE CONCAT(
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[ИНН] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[ОГРН] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Юридический_адрес] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Фактический_адрес] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Телефон], ' ',
|
||
[Email] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Контактное_лицо] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
) AS LegalCount
|
||
`;
|
||
|
||
physicalPersonsQuery += `
|
||
WHERE CONCAT(
|
||
pp.[Фамилия] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Имя] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Отчество] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_рождения] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Паспорт], ' ',
|
||
pp.[Табельный_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Гражданство] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_регистрации] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Место_жительства] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Полис_ДМС] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Табельный_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
pp.[Телефон], ' ',
|
||
pp.[Email] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
|
||
legalPersonsQuery += `
|
||
WHERE CONCAT(
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[ИНН] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[ОГРН] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Юридический_адрес] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Фактический_адрес] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Телефон], ' ',
|
||
[Email] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Контактное_лицо] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
} else {
|
||
totalCountQuery = `
|
||
SELECT
|
||
(SELECT COUNT(*)
|
||
FROM [Физические лица] pp
|
||
LEFT JOIN [Трудоустройство] emp ON pp.id = emp.Работник
|
||
) AS PhysicalCount,
|
||
(SELECT COUNT(*)
|
||
FROM [Юридические лица]
|
||
) AS LegalCount
|
||
`;
|
||
}
|
||
|
||
physicalPersonsQuery += `
|
||
ORDER BY pp.id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
legalPersonsQuery += `
|
||
ORDER BY id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
const people = await executeQuery(physicalPersonsQuery);
|
||
const legals = await executeQuery(legalPersonsQuery);
|
||
const totalCounts = await executeQuery(totalCountQuery);
|
||
|
||
const totalCount =
|
||
totalCounts[0].PhysicalCount + totalCounts[0].LegalCount;
|
||
const totalCountPeople = totalCounts[0].PhysicalCount;
|
||
const totalCountLegal = totalCounts[0].LegalCount;
|
||
|
||
var userData;
|
||
|
||
if (req.user.role === "legal") {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
} else {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
}
|
||
|
||
res.status(201).json({
|
||
people: people,
|
||
legals: legals,
|
||
totalCountPeople: totalCountPeople,
|
||
totalCountLegal: totalCountLegal,
|
||
totalCount: totalCount,
|
||
userData: userData[0],
|
||
role: req.user.role,
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на получение списка Заявок ТСО
|
||
app.post(
|
||
"/passes/gettso",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
var { page } = req.body;
|
||
|
||
if (req.user.role === "guest") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
if (!page) {
|
||
page = 1;
|
||
}
|
||
|
||
const pageSize = 15;
|
||
const offset = (page - 1) * pageSize;
|
||
|
||
let tsoQuery = `
|
||
SELECT *
|
||
FROM [Заявки_ТСО]
|
||
`;
|
||
|
||
tsoQuery += `
|
||
ORDER BY id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
totalCountQuery = `
|
||
SELECT
|
||
(SELECT COUNT(*)
|
||
FROM [Заявки_ТСО]
|
||
) AS TotalCount
|
||
`;
|
||
|
||
const tso = await executeQuery(tsoQuery);
|
||
const totalCounts = await executeQuery(totalCountQuery);
|
||
|
||
console.log(tso);
|
||
|
||
const totalCount = totalCounts[0].TotalCount;
|
||
|
||
console.log(totalCount);
|
||
|
||
var userData;
|
||
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
passes: tso,
|
||
totalCount: totalCount,
|
||
userData: userData[0],
|
||
role: req.user.role,
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка GET запроса на получение данных конкретного физ лица
|
||
app.get("/users/getuser", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "КПП") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
let physicalPersonsQuery = `
|
||
SELECT pp.*, emp.id AS emp_id, emp.[Организация], emp.[Субподряд], emp.[Цех], emp.[Должность], emp.[Миграционная_карта], emp.[Разрешение_на_работу_до], emp.[Трудовой_договор], emp.[Дата_договора], emp.[Последнее_место_работы], emp.[Увольнение], emp.[Причина_увольнения]
|
||
FROM [Физические лица] pp
|
||
LEFT JOIN [Трудоустройство] emp ON pp.id = emp.Работник
|
||
WHERE pp.id = @id
|
||
`;
|
||
|
||
const result = await executeQuery(physicalPersonsQuery, { id });
|
||
|
||
res.status(201).json({
|
||
data: result[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка GET запроса на получение данных конкретного юр лица
|
||
app.get("/legals/getlegal", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "КПП") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
let legalsQuery = `
|
||
SELECT * FROM [Юридические лица] WHERE id = @id
|
||
`;
|
||
|
||
const result = await executeQuery(legalsQuery, { id });
|
||
|
||
res.status(201).json({
|
||
data: result[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка POST на получение списка заявок
|
||
app.post(
|
||
"/forms/getapplications",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
var { page, searchText } = req.body;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
if (!page) {
|
||
page = 1;
|
||
}
|
||
|
||
const pageSize = 15;
|
||
const offset = (page - 1) * pageSize;
|
||
|
||
let applicationsQuery = `
|
||
SELECT *
|
||
FROM [Заявки]
|
||
`;
|
||
|
||
var totalCountQuery;
|
||
|
||
if (searchText) {
|
||
totalCountQuery = `
|
||
SELECT COUNT(*) AS total
|
||
FROM [Заявки]
|
||
WHERE CONCAT(
|
||
[Статус] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Вид_заявки] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_заявки], ' ',
|
||
[Дата_принятия], ' ',
|
||
[Решение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_решения], ' ',
|
||
[Дополнение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
|
||
applicationsQuery += `
|
||
WHERE CONCAT(
|
||
[Статус] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Вид_заявки] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_заявки], ' ',
|
||
[Дата_принятия], ' ',
|
||
[Решение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_решения], ' ',
|
||
[Дополнение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
} else {
|
||
totalCountQuery = `
|
||
SELECT COUNT(*) AS total FROM [Заявки]
|
||
`;
|
||
}
|
||
|
||
applicationsQuery += `
|
||
ORDER BY id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
const applications = await executeQuery(applicationsQuery);
|
||
const totalCount = await executeQuery(totalCountQuery);
|
||
|
||
var userData;
|
||
|
||
if (req.user.role === "legal") {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
} else {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
}
|
||
|
||
res.status(201).json({
|
||
applications: applications,
|
||
totalCount: totalCount[0].total,
|
||
userData: userData[0],
|
||
role: req.user.role,
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на получение списка заявок
|
||
app.post(
|
||
"/forms/getmyapplications",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
var { page, searchText } = req.body;
|
||
|
||
if (!page) {
|
||
page = 1;
|
||
}
|
||
|
||
const pageSize = 15;
|
||
const offset = (page - 1) * pageSize;
|
||
|
||
var userData;
|
||
var fullname;
|
||
|
||
if (req.user.role === "legal") {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
fullname = userData[0].Наименование;
|
||
} else {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
fullname = `${userData[0].Фамилия} ${userData[0].Имя} ${userData[0].Отчество}`;
|
||
}
|
||
|
||
let applicationsQuery = `
|
||
SELECT *
|
||
FROM [Заявки]
|
||
WHERE [Автор] = N'${fullname}' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
|
||
let totalCountQuery = `
|
||
SELECT COUNT(*) AS total
|
||
FROM [Заявки]
|
||
WHERE [Автор] = N'${fullname}' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
|
||
if (searchText) {
|
||
totalCountQuery += ` AND CONCAT(
|
||
[Статус] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Вид_заявки] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_заявки], ' ',
|
||
[Дата_принятия], ' ',
|
||
[Решение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_решения], ' ',
|
||
[Дополнение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS`;
|
||
|
||
applicationsQuery += ` AND CONCAT(
|
||
[Статус] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Вид_заявки] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_заявки], ' ',
|
||
[Дата_принятия], ' ',
|
||
[Решение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_решения], ' ',
|
||
[Дополнение] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS`;
|
||
}
|
||
|
||
applicationsQuery += `
|
||
ORDER BY id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
const applications = await executeQuery(applicationsQuery);
|
||
const totalCount = await executeQuery(totalCountQuery);
|
||
|
||
res.status(201).json({
|
||
applications: applications,
|
||
totalCount: totalCount[0].total,
|
||
userData: userData[0],
|
||
role: req.user.role,
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка GET запроса на получение данных конкретной заявки
|
||
app.get("/forms/application", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
let legalsQuery = `
|
||
SELECT * FROM [Заявки] WHERE id = @id
|
||
`;
|
||
|
||
const result = await executeQuery(legalsQuery, { id });
|
||
|
||
res.status(201).json({
|
||
data: result[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка DELETE запроса для удаления строки с определенным ID из таблицы "Заявки"
|
||
app.delete("/forms/delete", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const result = await executeQuery("DELETE FROM [Заявки] WHERE id = @id", {
|
||
id: id,
|
||
});
|
||
|
||
res.status(200).json({ message: "Строка успешно удалена" });
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке DELETE запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка PUT запроса с новыми данными заявки
|
||
app.put(
|
||
"/forms/update",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const {
|
||
id,
|
||
name,
|
||
legal,
|
||
status,
|
||
decision,
|
||
carnumber,
|
||
carbrand,
|
||
carmodel,
|
||
carcolor,
|
||
tmcname,
|
||
tmcunit,
|
||
tmcquantity,
|
||
date,
|
||
todate,
|
||
finaldate,
|
||
additional,
|
||
} = req.body;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const updateResult = await executeQuery(
|
||
`UPDATE [Заявки] SET Статус = @status, Работник = @name, Дата_заявки = @date, Действие_до = @todate, Дата_решения = @finaldate, Организация = @legal, Решение = @decision, Дополнение = @additional, Авто_модель = @carmodel, Авто_марка = @carbrand, Авто_цвет = @carcolor, Авто_гос_номер = @carnumber, Наименование = @tmcname, Единица_измерения = @tmcunit, Количество = @tmcquantity
|
||
OUTPUT inserted.*
|
||
WHERE id = @id
|
||
`,
|
||
{
|
||
status: status,
|
||
name: name,
|
||
date: date,
|
||
todate: todate,
|
||
finaldate: finaldate,
|
||
legal: legal,
|
||
decision: decision,
|
||
additional: additional,
|
||
carmodel: carmodel,
|
||
carbrand: carbrand,
|
||
carcolor: carcolor,
|
||
carnumber: carnumber,
|
||
tmcname: tmcname,
|
||
tmcunit: tmcunit,
|
||
tmcquantity: tmcquantity,
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
message: "Данные заявки успешно обновлены",
|
||
data: updateResult[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке PUT запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на добавление работника из аккаунта гостя
|
||
app.post(
|
||
"/forms/makepass",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const {
|
||
id,
|
||
name,
|
||
legal,
|
||
status,
|
||
decision,
|
||
carnumber,
|
||
carbrand,
|
||
carmodel,
|
||
carcolor,
|
||
tmcname,
|
||
tmcunit,
|
||
tmcquantity,
|
||
date,
|
||
todate,
|
||
finaldate,
|
||
additional,
|
||
type,
|
||
} = req.body;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const updateResult = await executeQuery(
|
||
`UPDATE [Заявки] SET Статус = @status, Работник = @name, Дата_заявки = @date, Дата_решения = @finaldate, Организация = @legal, Решение = @decision, Дополнение = @additional, Авто_модель = @carmodel, Авто_марка = @carbrand, Авто_цвет = @carcolor, Авто_гос_номер = @carnumber, Наименование = @tmcname, Единица_измерения = @tmcunit, Количество = @tmcquantity
|
||
OUTPUT inserted.*
|
||
WHERE id = @id
|
||
`,
|
||
{
|
||
status: "Утверждено",
|
||
name: name,
|
||
date: date,
|
||
finaldate: finaldate,
|
||
legal: legal,
|
||
decision: decision,
|
||
additional: additional,
|
||
carmodel: carmodel,
|
||
carbrand: carbrand,
|
||
carcolor: carcolor,
|
||
carnumber: carnumber,
|
||
tmcname: tmcname,
|
||
tmcunit: tmcunit,
|
||
tmcquantity: tmcquantity,
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Пропуска] (Состояние, Работник, Заявка, Дата_выдачи, Действие_до, Авто_модель, Авто_марка, Авто_цвет, Авто_гос_номер, Организация, Наименование, Единица_измерения, Количество, Дополнительно, Вид_пропуска)
|
||
OUTPUT inserted.*
|
||
VALUES (@status, @name, @id, @date, @todate, @carmodel, @carbrand, @carcolor, @carnumber, @legal, @tmcname, @tmcunit, @tmcquantity, @additional, @type)
|
||
`,
|
||
{
|
||
status: "Заказан",
|
||
name: name,
|
||
date: date,
|
||
todate: todate,
|
||
finaldate: finaldate,
|
||
legal: legal,
|
||
decision: decision,
|
||
additional: additional,
|
||
carmodel: carmodel,
|
||
carbrand: carbrand,
|
||
carcolor: carcolor,
|
||
carnumber: carnumber,
|
||
tmcname: tmcname,
|
||
tmcunit: tmcunit,
|
||
tmcquantity: tmcquantity,
|
||
id: id,
|
||
type: type,
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
message: "Данные пользователя успешно обновлены",
|
||
data: addResult[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке PUT запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на получение списка заявок
|
||
app.post(
|
||
"/passes/getpasses",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
try {
|
||
var { page, searchText } = req.body;
|
||
|
||
if (
|
||
req.user.role !== "Дирекция" &&
|
||
req.user.role !== "Пропуска" &&
|
||
req.user.role !== "КПП"
|
||
) {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
if (!page) {
|
||
page = 1;
|
||
}
|
||
|
||
const pageSize = 15;
|
||
const offset = (page - 1) * pageSize;
|
||
|
||
let passesQuery = `
|
||
SELECT *
|
||
FROM [Пропуска]
|
||
`;
|
||
|
||
var totalCountQuery;
|
||
|
||
if (searchText) {
|
||
totalCountQuery = `
|
||
SELECT COUNT(*) AS total
|
||
FROM [Пропуска]
|
||
WHERE CONCAT(
|
||
[Состояние] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_выдачи], ' ',
|
||
[Действие_до], ' ',
|
||
[Вид_пропуска] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель], ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дополнительно] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Зона_доступа] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Согласование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Цель_выдачи] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
|
||
passesQuery += `
|
||
WHERE CONCAT(
|
||
[Состояние] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Работник] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Организация] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дата_выдачи], ' ',
|
||
[Действие_до], ' ',
|
||
[Вид_пропуска] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_модель], ' ',
|
||
[Авто_марка] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_гос_номер] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Авто_цвет] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Дополнительно] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Зона_доступа] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Наименование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Согласование] COLLATE Cyrillic_General_CI_AS, ' ',
|
||
[Цель_выдачи] COLLATE Cyrillic_General_CI_AS
|
||
) LIKE N'%${searchText}%' COLLATE Cyrillic_General_CI_AS
|
||
`;
|
||
} else {
|
||
totalCountQuery = `
|
||
SELECT COUNT(*) AS total FROM [Пропуска]
|
||
`;
|
||
}
|
||
|
||
passesQuery += `
|
||
ORDER BY id DESC
|
||
OFFSET ${offset} ROWS
|
||
FETCH NEXT ${pageSize} ROWS ONLY
|
||
`;
|
||
|
||
const passes = await executeQuery(passesQuery);
|
||
const totalCount = await executeQuery(totalCountQuery);
|
||
|
||
var userData;
|
||
|
||
if (req.user.role === "legal") {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Юридические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
} else {
|
||
userData = await executeQuery(
|
||
"SELECT * FROM [Физические лица] WHERE id = @id",
|
||
{
|
||
id: req.user.userId,
|
||
}
|
||
);
|
||
}
|
||
|
||
res.status(201).json({
|
||
passes: passes,
|
||
totalCount: totalCount[0].total,
|
||
userData: userData[0],
|
||
role: req.user.role,
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка POST на добавление нового пропуска
|
||
app.post(
|
||
"/passes/newpass",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const {
|
||
type,
|
||
status,
|
||
name,
|
||
date,
|
||
todate,
|
||
phone,
|
||
email,
|
||
legal,
|
||
purpose,
|
||
address,
|
||
additional,
|
||
carnumber,
|
||
carbrand,
|
||
carmodel,
|
||
carcolor,
|
||
tmcname,
|
||
tmcunit,
|
||
tmcquantity,
|
||
} = req.body;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const addResult = await executeQuery(
|
||
`INSERT INTO [Пропуска] (Состояние, Работник, Дата_выдачи, Действие_до, Авто_модель, Авто_марка, Авто_цвет, Авто_гос_номер, Организация, Наименование, Единица_измерения, Количество, Дополнительно, Вид_пропуска, Email, Телефон, Цель_выдачи, Зона_доступа)
|
||
OUTPUT inserted.*
|
||
VALUES (@status, @name, @date, @todate, @carmodel, @carbrand, @carcolor, @carnumber, @legal, @tmcname, @tmcunit, @tmcquantity, @additional, @type, @email, @phone, @purpose, @address)
|
||
`,
|
||
{
|
||
status: status,
|
||
name: name,
|
||
date: date,
|
||
todate: todate,
|
||
legal: legal,
|
||
additional: additional,
|
||
carmodel: JSON.stringify(carmodel),
|
||
carbrand: JSON.stringify(carbrand),
|
||
carcolor: JSON.stringify(carcolor),
|
||
carnumber: JSON.stringify(carnumber),
|
||
tmcname: JSON.stringify(tmcname),
|
||
tmcunit: JSON.stringify(tmcunit),
|
||
tmcquantity: JSON.stringify(tmcquantity),
|
||
type: type,
|
||
email: email,
|
||
phone: phone,
|
||
purpose: purpose,
|
||
address: address,
|
||
}
|
||
);
|
||
|
||
res.status(201).json({
|
||
message: "Данные на пропуск успешно добавлены",
|
||
data: addResult[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке PUT запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка GET запроса на получение данных конкретной заявки
|
||
app.get("/passes/pass", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
let passQuery = `
|
||
SELECT * FROM [Пропуска] WHERE id = @id
|
||
`;
|
||
|
||
const result = await executeQuery(passQuery, { id });
|
||
|
||
res.status(201).json({
|
||
data: result[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка POST на обновление данных пропуска
|
||
app.put(
|
||
"/passes/update",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const {
|
||
type,
|
||
status,
|
||
name,
|
||
date,
|
||
todate,
|
||
phone,
|
||
email,
|
||
legal,
|
||
purpose,
|
||
address,
|
||
additional,
|
||
carnumber,
|
||
carbrand,
|
||
carmodel,
|
||
carcolor,
|
||
tmcname,
|
||
tmcunit,
|
||
tmcquantity,
|
||
factsValues,
|
||
id,
|
||
} = req.body;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
try {
|
||
const updateResult = await executeQuery(
|
||
`UPDATE [Пропуска]
|
||
SET Состояние = @status,
|
||
Работник = @name,
|
||
Дата_выдачи = @date,
|
||
Действие_до = @todate,
|
||
Авто_модель = @carmodel,
|
||
Авто_марка = @carbrand,
|
||
Авто_цвет = @carcolor,
|
||
Авто_гос_номер = @carnumber,
|
||
Организация = @legal,
|
||
Наименование = @tmcname,
|
||
Единица_измерения = @tmcunit,
|
||
Количество = @tmcquantity,
|
||
Дополнительно = @additional,
|
||
Вид_пропуска = @type,
|
||
Email = @email,
|
||
Телефон = @phone,
|
||
Цель_выдачи = @purpose,
|
||
Отметка = @fact,
|
||
Зона_доступа = @address
|
||
OUTPUT inserted.*
|
||
WHERE id = @id
|
||
`,
|
||
{
|
||
status: status,
|
||
name: name,
|
||
date: date,
|
||
todate: todate,
|
||
legal: legal,
|
||
additional: additional,
|
||
carmodel: carmodel,
|
||
carbrand: carbrand,
|
||
carcolor: carcolor,
|
||
carnumber: carnumber,
|
||
tmcname: tmcname,
|
||
tmcunit: tmcunit,
|
||
tmcquantity: tmcquantity,
|
||
type: type,
|
||
email: email,
|
||
phone: phone,
|
||
purpose: purpose,
|
||
fact: JSON.stringify(factsValues),
|
||
address: address,
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
if (updateResult.length === 0) {
|
||
res.status(404).json({ message: "Пропуск не найден" });
|
||
return;
|
||
}
|
||
|
||
res.status(200).json({
|
||
message: "Данные пропуска успешно обновлены",
|
||
data: updateResult[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обновлении данных пропуска:", error);
|
||
res
|
||
.status(500)
|
||
.json({ message: "Произошла ошибка при обновлении данных" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка DELETE запроса для удаления строки с определенным ID из таблицы "Заявки"
|
||
app.delete("/passes/delete", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция" && req.user.role !== "Пропуска") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const result = await executeQuery("DELETE FROM [Пропуска] WHERE id = @id", {
|
||
id: id,
|
||
});
|
||
|
||
res.status(200).json({ message: "Строка успешно удалена" });
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке DELETE запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка GET запроса на получение данных конкретной заявки ТСО
|
||
app.get("/passes/tso", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
let passQuery = `
|
||
SELECT * FROM [Заявки_ТСО] WHERE id = @id
|
||
`;
|
||
|
||
const result = await executeQuery(passQuery, { id });
|
||
|
||
res.status(201).json({
|
||
data: result[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке POST запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
// Обработка POST на обновление данных заявки ТСО
|
||
app.put(
|
||
"/passes/tso/update",
|
||
upload.single("file"),
|
||
checkToken,
|
||
async (req, res) => {
|
||
const { type, status, object, fabula, executor, events, id } = req.body;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const currentDate = new Date();
|
||
const formattedDate = currentDate.toISOString();
|
||
|
||
try {
|
||
const updateResult = await executeQuery(
|
||
`UPDATE [Заявки_ТСО]
|
||
SET Состояние = @status,
|
||
Вид_неисправности = @type,
|
||
Объект = @object,
|
||
Фабула = @fabula,
|
||
Дата_изменения = @editdate,
|
||
Исполнитель = @executor,
|
||
Мероприятия = @events
|
||
OUTPUT inserted.*
|
||
WHERE id = @id
|
||
`,
|
||
{
|
||
status: status,
|
||
type: type,
|
||
object: object,
|
||
fabula: fabula,
|
||
editdate: formattedDate,
|
||
executor: executor,
|
||
events: events,
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
if (updateResult.length === 0) {
|
||
res.status(404).json({ message: "Заявка не найдена" });
|
||
return;
|
||
}
|
||
|
||
res.status(200).json({
|
||
message: "Данные заявки успешно обновлены",
|
||
data: updateResult[0],
|
||
});
|
||
} catch (error) {
|
||
console.error("Ошибка при обновлении данных пропуска:", error);
|
||
res
|
||
.status(500)
|
||
.json({ message: "Произошла ошибка при обновлении данных" });
|
||
}
|
||
}
|
||
);
|
||
|
||
// Обработка DELETE запроса для удаления строки с определенным ID из таблицы "Заявки_ТСО"
|
||
app.delete("/passes/tso/delete", checkToken, async (req, res) => {
|
||
try {
|
||
const id = req.query.id;
|
||
|
||
if (req.user.role !== "Дирекция") {
|
||
res.status(403).json({ message: "Недостаточно прав" });
|
||
return;
|
||
}
|
||
|
||
const result = await executeQuery(
|
||
"DELETE FROM [Заявки_ТСО] WHERE id = @id",
|
||
{
|
||
id: id,
|
||
}
|
||
);
|
||
|
||
res.status(200).json({ message: "Строка успешно удалена" });
|
||
} catch (error) {
|
||
console.error("Ошибка при обработке DELETE запроса:", error);
|
||
res.status(500).json({ message: "Произошла ошибка" });
|
||
}
|
||
});
|
||
|
||
app.get("/secure", upload.single("file"), checkToken, (req, res) => {
|
||
res.json({
|
||
message: "Защищенный ресурс",
|
||
user: req.user.userId,
|
||
role: req.user.role,
|
||
});
|
||
});
|
||
|
||
const port = 8080;
|
||
app.listen(port, () => {
|
||
console.log(`Server is running on port ${port}`);
|
||
});
|