ca-grow-ops-manager/backend/prisma/seed-metrc-demo.js
fullsizemalt dd647538c5
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
feat: complete METRC integration and 3D Facility Viewer
- Added METRC status badge to BatchesPage
- Implemented real 3D Facility Viewer using React Three Fiber
- Visualizes plants, rooms, sections from live data
- Added seed-metrc-demo.js for populating realistic METRC plant data
2025-12-17 03:27:25 -08:00

112 lines
3.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 with Room info
const positions = await prisma.facilityPosition.findMany({
take: 50,
include: {
section: {
include: {
room: true
}
}
}
});
if (positions.length === 0) {
console.error('No FacilityPositions found. Please run main seed first.');
return;
}
console.log(`Found ${batches.length} batches and ${positions.length} positions.`);
// 3. Clear existing demo plants
const deleted = await prisma.facilityPlant.deleteMany({
where: {
tagNumber: { startsWith: '1A40603000' }
}
});
console.log(`Cleared ${deleted.count} existing demo plants.`);
// 4. Create Plants
let createdCount = 0;
for (const [index, pos] of positions.entries()) {
const batch = batches[index % batches.length];
// METRC Tag format: 1A40603000 + 7 digits
const tagSuffix = (1000000 + index).toString();
const tag = `1A40603000${tagSuffix}`;
try {
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'
}
});
// 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();
});