ca-grow-ops-manager/backend/prisma/seed-metrc-demo.js
fullsizemalt 04b926ea65
Some checks are pending
Deploy to Production / deploy (push) Waiting to run
Test / backend-test (push) Waiting to run
Test / frontend-test (push) Waiting to run
fix(seed): ensure metrc demo plants are created on Floor 1 and position status is updated to OCCUPIED
2025-12-17 07:40:56 -08:00

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