Files
geo/backend/prisma/seed.js
2026-02-04 00:11:19 +05:00

248 lines
12 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
const client_1 = require("@prisma/client");
const bcrypt = __importStar(require("bcrypt"));
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const prisma = new client_1.PrismaClient();
async function main() {
console.log('Starting database seed...');
// Clear existing data (order: children first)
await prisma.chatMessage.deleteMany();
await prisma.chatSession.deleteMany();
await prisma.estimateShare.deleteMany();
await prisma.estimateTotal.deleteMany();
await prisma.estimateItem.deleteMany();
await prisma.estimate.deleteMany();
await prisma.user.deleteMany();
await prisma.priceItem.deleteMany();
await prisma.priceTable.deleteMany();
await prisma.priceBook.deleteMany();
await prisma.coefficient.deleteMany();
await prisma.inflationIndex.deleteMany();
await prisma.surveyDirection.deleteMany();
await prisma.setting.deleteMany();
console.log('Cleared existing data');
// Admin user (логин: its@info.ru, пароль: Nemo348ax@)
const adminPasswordHash = await bcrypt.hash('Nemo348ax@', 10);
await prisma.user.create({
data: {
email: 'its@info.ru',
passwordHash: adminPasswordHash,
name: 'Админ',
},
});
console.log('Created admin user (its@info.ru / Nemo348ax@)');
// Demo user for development (email: demo@example.com, password: demo)
const demoPasswordHash = await bcrypt.hash('demo', 10);
await prisma.user.create({
data: {
email: 'demo@example.com',
passwordHash: demoPasswordHash,
name: 'Демо',
},
});
console.log('Created demo user (demo@example.com / demo)');
// Seed Survey Directions
const directions = await Promise.all([
prisma.surveyDirection.create({
data: {
code: 'geodesy',
name: 'Инженерно-геодезические изыскания',
shortName: 'Геодезия',
},
}),
prisma.surveyDirection.create({
data: {
code: 'geology',
name: 'Инженерно-геологические изыскания',
shortName: 'Геология',
},
}),
prisma.surveyDirection.create({
data: {
code: 'ecology',
name: 'Инженерно-экологические изыскания',
shortName: 'Экология',
},
}),
prisma.surveyDirection.create({
data: {
code: 'hydrology',
name: 'Инженерно-гидрометеорологические изыскания',
shortName: 'Гидрометеорология',
},
}),
]);
console.log(`Created ${directions.length} survey directions`);
// Seed Inflation Indices
const inflationIndices = await Promise.all([
prisma.inflationIndex.create({
data: {
baseDate: new Date('1991-01-01'),
effectiveFrom: new Date('2015-08-13'),
indexValue: new client_1.Prisma.Decimal(76.24),
documentRef: 'Письмо Минстроя и ЖКХ России № 25760-ЮР/08 от 13.08.2015г.',
isActive: true,
},
}),
prisma.inflationIndex.create({
data: {
baseDate: new Date('2001-01-01'),
effectiveFrom: new Date('2015-08-13'),
indexValue: new client_1.Prisma.Decimal(6.70),
documentRef: 'Письмо Минстроя и ЖКХ России № 25760-ЮР/08 от 13.08.2015г.',
isActive: true,
},
}),
]);
console.log(`Created ${inflationIndices.length} inflation indices`);
// Seed Coefficients
const coefficients = [
// Regional coefficients
{ type: 'regional', code: 'reg-1.08', name: 'Районный коэффициент 1.08', value: 1.08, description: 'К заработной плате 1.15' },
{ type: 'regional', code: 'reg-1.10', name: 'Районный коэффициент 1.10', value: 1.10, description: 'К заработной плате 1.20' },
{ type: 'regional', code: 'reg-1.15', name: 'Районный коэффициент 1.15', value: 1.15, description: 'К заработной плате 1.30' },
// Company coefficients
{ type: 'company', code: 'gazprom-544', name: 'Коэффициент ОАО «Газпром»', value: 1.00, description: '№544 от 26.12.2013 г.' },
{ type: 'company', code: 'geovector', name: 'Коэффициент ООО «ГеоВектор»', value: 0.2092, description: 'Коэффициент компании' },
// Special coefficients
{ type: 'special', code: 'computer-tech', name: 'Компьютерные технологии', value: 1.20, description: 'При выполнении камеральных работ с применением компьютерных технологий' },
{ type: 'special', code: 'night-work', name: 'Ночные работы', value: 1.35, description: 'При работе в ночное время (22:00-06:00)' },
{ type: 'special', code: 'special-regime', name: 'Специальный режим', value: 1.25, description: 'Территории со специальным режимом' },
];
for (const coef of coefficients) {
await prisma.coefficient.create({
data: {
type: coef.type,
code: coef.code,
name: coef.name,
value: new client_1.Prisma.Decimal(coef.value),
description: coef.description,
},
});
}
console.log(`Created ${coefficients.length} coefficients`);
// Seed Settings
const settings = [
{ key: 'default_executor', value: 'ООО "ГеоВектор"', type: 'string', category: 'company', label: 'Исполнитель по умолчанию' },
{ key: 'default_vat_rate', value: '20', type: 'number', category: 'company', label: 'Ставка НДС по умолчанию (%)' },
{ key: 'company_coefficient', value: '0.2092', type: 'number', category: 'company', label: 'Коэффициент компании' },
{ key: 'ai_provider', value: 'iieasy', type: 'string', category: 'ai', label: 'AI провайдер' },
{ key: 'iieasy_model', value: 'google/gemma-3n-e4b', type: 'string', category: 'ai', label: 'Модель iieasy' },
{ key: 'lmstudio_url', value: 'http://localhost:1234/v1', type: 'string', category: 'ai', label: 'URL LM Studio' },
];
for (const setting of settings) {
await prisma.setting.create({ data: setting });
}
console.log(`Created ${settings.length} settings`);
// Load and seed price books from JSON files
const dataDir = path.join(__dirname, '../../data/price-books');
// Load Geodesy price book
const geodesyPath = path.join(dataDir, 'geodesy-2004.json');
if (fs.existsSync(geodesyPath)) {
const geodesyData = JSON.parse(fs.readFileSync(geodesyPath, 'utf-8'));
await seedPriceBook(geodesyData);
console.log('Loaded geodesy-2004 price book');
}
// Load Geology price book
const geologyPath = path.join(dataDir, 'geology-ecology-1999.json');
if (fs.existsSync(geologyPath)) {
const geologyData = JSON.parse(fs.readFileSync(geologyPath, 'utf-8'));
await seedPriceBook(geologyData);
console.log('Loaded geology-ecology-1999 price book');
}
console.log('Database seeding completed!');
}
async function seedPriceBook(data) {
const priceBook = await prisma.priceBook.create({
data: {
code: data.priceBook.code,
name: data.priceBook.name,
baseDate: new Date(data.priceBook.baseDate),
approvedBy: data.priceBook.approvedBy,
effectiveDate: data.priceBook.effectiveDate ? new Date(data.priceBook.effectiveDate) : null,
},
});
for (const table of data.tables) {
const priceTable = await prisma.priceTable.create({
data: {
priceBookId: priceBook.id,
tableNumber: table.tableNumber,
name: table.name,
unit: table.unit,
notes: table.notes || null,
},
});
for (const item of table.items) {
await prisma.priceItem.create({
data: {
priceBookId: priceBook.id,
priceTableId: priceTable.id,
paragraph: item.paragraph,
workType: item.workType || item.networkType || item.type || `Таблица ${table.tableNumber}`,
description: item.description || null,
priceField1: item.category1Field ?? item.cat1 ?? item.undevelopedField ?? null,
priceOffice1: item.category1Office ?? item.undevelopedOffice ?? null,
priceField2: item.category2Field ?? item.cat2 ?? item.builtUpField ?? null,
priceOffice2: item.category2Office ?? item.builtUpOffice ?? null,
priceField3: item.category3Field ?? item.cat3 ?? item.industrialField ?? null,
priceOffice3: item.category3Office ?? item.industrialOffice ?? null,
priceSimple: item.price ?? item.fieldPrice ?? null,
attributes: {
scale: item.scale,
category: item.category,
reliefHeight: item.reliefHeight,
depth: item.depth,
diameter: item.diameter,
accuracy: item.accuracy,
passability: item.passability,
...item,
},
},
});
}
}
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
//# sourceMappingURL=seed.js.map