139 lines
4.4 KiB
JavaScript
139 lines
4.4 KiB
JavaScript
const { PrismaClient } = require('@prisma/client');
|
|
const prisma = new PrismaClient();
|
|
|
|
async function main() {
|
|
console.log('🌱 Seeding METRC demo data...');
|
|
|
|
// 1. Get existing Batches
|
|
const batches = await prisma.batch.findMany({
|
|
take: 5
|
|
});
|
|
|
|
if (batches.length === 0) {
|
|
console.error('No Batches found. Please run main seed first.');
|
|
return;
|
|
}
|
|
|
|
// 2. Get existing FacilityPositions for Floor 1
|
|
const floor = await prisma.facilityFloor.findFirst({
|
|
where: { number: 1 },
|
|
include: { rooms: { include: { sections: { include: { positions: true } } } } }
|
|
});
|
|
|
|
if (!floor) {
|
|
console.error('Floor 1 not found');
|
|
return;
|
|
}
|
|
|
|
// Flatten positions
|
|
const positions = [];
|
|
for (const room of floor.rooms) {
|
|
for (const section of room.sections) {
|
|
for (const pos of section.positions) {
|
|
// Add room/section info manually since we flattened
|
|
pos.section = { room: room, code: section.code };
|
|
positions.push(pos);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Take 50
|
|
const targetPositions = positions.slice(0, 50);
|
|
|
|
if (targetPositions.length === 0) {
|
|
console.error('No FacilityPositions found on Floor 1.');
|
|
return;
|
|
}
|
|
|
|
console.log(`Found ${batches.length} batches and ${targetPositions.length} positions on Floor 1.`);
|
|
|
|
// 3. Clear existing demo plants
|
|
const deleted = await prisma.facilityPlant.deleteMany({
|
|
where: {
|
|
tagNumber: { startsWith: '1A40603000' }
|
|
}
|
|
});
|
|
|
|
// Also reset position status for those cleaned up?
|
|
// Too complex, just overwrite status for new ones.
|
|
|
|
console.log(`Cleared ${deleted.count} existing demo plants.`);
|
|
|
|
// 4. Create Plants
|
|
let createdCount = 0;
|
|
|
|
for (const [index, pos] of targetPositions.entries()) {
|
|
const batch = batches[index % batches.length];
|
|
|
|
// METRC Tag format: 1A40603000 + 7 digits
|
|
const tagSuffix = (1000000 + index).toString();
|
|
const tag = `1A40603000${tagSuffix}`;
|
|
|
|
try {
|
|
// Delete any existing plant in this position to avoid collision if not caught by tag delete
|
|
await prisma.facilityPlant.deleteMany({ where: { positionId: pos.id } });
|
|
|
|
const plant = await prisma.facilityPlant.create({
|
|
data: {
|
|
tagNumber: tag,
|
|
// valid fields from schema:
|
|
batchId: batch.id,
|
|
positionId: pos.id,
|
|
address: `${pos.section.room.code}-${pos.section.code}-R${pos.row}C${pos.column}`,
|
|
status: 'ACTIVE'
|
|
}
|
|
});
|
|
|
|
// UPDATE POSITION STATUS
|
|
await prisma.facilityPosition.update({
|
|
where: { id: pos.id },
|
|
data: { status: 'OCCUPIED' }
|
|
});
|
|
|
|
// 5. Create Location History (Audit)
|
|
await prisma.plantLocationHistory.create({
|
|
data: {
|
|
plantId: plant.id,
|
|
fromAddress: null,
|
|
toAddress: plant.address,
|
|
movedAt: new Date(),
|
|
reason: 'Initial planting',
|
|
movedById: 'system'
|
|
}
|
|
});
|
|
|
|
// Maybe a move for some plants
|
|
if (index % 3 === 0) {
|
|
const oldAddress = `NUR-1-R1C1`;
|
|
await prisma.plantLocationHistory.create({
|
|
data: {
|
|
plantId: plant.id,
|
|
fromAddress: oldAddress,
|
|
toAddress: plant.address,
|
|
movedAt: new Date(Date.now() - Math.random() * 5 * 24 * 60 * 60 * 1000),
|
|
reason: 'Moved to flower',
|
|
movedById: 'system'
|
|
}
|
|
});
|
|
}
|
|
|
|
createdCount++;
|
|
} catch (error) {
|
|
// Ignore unique constraint errors if position already taken (though we cleared matches)
|
|
if (!error.message.includes('Unique constraint')) {
|
|
console.error(`Failed to create plant ${tag}:`, error.message);
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(`✨ Successfully created ${createdCount} METRC demo plants linked to batches.`);
|
|
}
|
|
|
|
main()
|
|
.catch((e) => {
|
|
console.error(e);
|
|
process.exit(1);
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|