PSA/server/seeds/dev/14_tickets.cjs
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

173 lines
7.7 KiB
JavaScript

exports.seed = async function (knex) {
// Fetch the tenant first
const tenantRow = await knex('tenants').select('tenant').first();
if (!tenantRow) {
console.warn('No tenant found, skipping ticket seeding.');
return;
}
const tenant = tenantRow.tenant;
// Helper function to fetch IDs to reduce repetition
const getId = async (table, filters, idColumn) => {
const result = await knex(table).where({ tenant, ...filters }).select(idColumn).first();
if (!result) {
console.warn(`Warning: Could not find ID in table '${table}' for filters:`, filters);
return null; // Or throw an error if required
}
return result[idColumn];
};
const getTicketStatusId = async (name, boardId) => {
if (!boardId) return null;
return getId('statuses', { name, board_id: boardId }, 'status_id');
};
const getContactId = async (namePattern) => {
const result = await knex('contacts')
.where({ tenant })
.whereRaw(`full_name ILIKE ?`, [`%${namePattern}%`])
.select('contact_name_id')
.first();
if (!result) {
console.warn(`Warning: Could not find contact ID for pattern: ${namePattern}`);
return null;
}
return result.contact_name_id;
}
// Fetch all required IDs concurrently for efficiency
const [
clientEmeraldCityId, clientWonderlandId,
contactAliceId, contactDorothyId,
boardUrgentId, boardProjectsId,
categoryMagicalArtifactsId, categoryCharacterAssistId, categoryRealmMaintenanceId,
subCategoryEnchantedAccId, subCategoryQuestGuidanceId, subCategoryMagicalInfraId,
priorityEnchantedId, priorityCuriousId,
severitySeriousId, severityModerateId,
urgencyHareId, urgencyTickTockId,
impactRealmId, impactLocalId,
userGlindaId, userTinmanId, userMadhatterId, userScarecrowId
] = await Promise.all([
getId('clients', { client_name: 'Emerald City' }, 'client_id'),
getId('clients', { client_name: 'Wonderland' }, 'client_id'),
getContactId('alice'),
getContactId('dorothy'),
getId('boards', { board_name: 'Urgent Matters' }, 'board_id'),
getId('boards', { board_name: 'Projects' }, 'board_id'),
getId('categories', { category_name: 'Magical Artifacts' }, 'category_id'),
getId('categories', { category_name: 'Character Assistance' }, 'category_id'),
getId('categories', { category_name: 'Realm Maintenance' }, 'category_id'),
// Assuming subcategories are also in the 'categories' table, identified by name
getId('categories', { category_name: 'Enchanted Accessories' }, 'category_id'),
getId('categories', { category_name: 'Quest Guidance' }, 'category_id'),
getId('categories', { category_name: 'Magical Infrastructure' }, 'category_id'),
getId('priorities', { priority_name: 'Enchanted Emergency' }, 'priority_id'),
getId('priorities', { priority_name: 'Curious Conundrum' }, 'priority_id'),
getId('severities', { severity_name: 'Serious Snarl' }, 'severity_id'),
getId('severities', { severity_name: 'Moderate Muddle' }, 'severity_id'),
getId('urgencies', { urgency_name: 'Hare-Paced Hustle' }, 'urgency_id'),
getId('urgencies', { urgency_name: 'Tick-Tock Task' }, 'urgency_id'),
getId('impacts', { impact_name: 'Realm-Wide Repercussions' }, 'impact_id'),
getId('impacts', { impact_name: 'Local Disruption' }, 'impact_id'),
getId('users', { username: 'glinda' }, 'user_id'),
getId('users', { username: 'tinman' }, 'user_id'),
getId('users', { username: 'madhatter' }, 'user_id'),
getId('users', { username: 'scarecrow' }, 'user_id')
]);
const [statusCuriousId, statusAwaitingId, statusUnfoldingId] = await Promise.all([
getTicketStatusId('Curious Beginning', boardUrgentId),
getTicketStatusId('Awaiting Wisdom', boardUrgentId),
getTicketStatusId('Unfolding Adventure', boardProjectsId)
]);
// Prepare ticket data with resolved IDs
const ticketsToInsert = [
{
tenant: tenant,
title: 'Missing White Rabbit',
ticket_number: 'TIC1001', // Explicitly included
client_id: clientEmeraldCityId,
contact_name_id: contactAliceId,
status_id: statusCuriousId,
board_id: boardUrgentId,
category_id: categoryMagicalArtifactsId,
subcategory_id: subCategoryEnchantedAccId,
priority_id: priorityEnchantedId,
severity_id: severitySeriousId,
urgency_id: urgencyHareId,
impact_id: impactRealmId,
entered_by: userGlindaId,
assigned_to: userTinmanId,
entered_at: knex.fn.now()
},
{
tenant: tenant,
title: 'Survey Uncharted Areas in Wonderland',
ticket_number: 'TIC1002', // Explicitly included
client_id: clientWonderlandId,
contact_name_id: contactAliceId,
status_id: statusAwaitingId,
board_id: boardUrgentId,
category_id: categoryCharacterAssistId,
subcategory_id: subCategoryQuestGuidanceId,
priority_id: priorityEnchantedId,
severity_id: severityModerateId,
urgency_id: urgencyTickTockId,
impact_id: impactLocalId,
entered_by: userGlindaId,
assigned_to: userMadhatterId,
entered_at: knex.raw("CURRENT_TIMESTAMP - INTERVAL '2 months'")
},
{
tenant: tenant,
title: 'Enhance Emerald City Gardens',
ticket_number: 'TIC1003', // Explicitly included
client_id: clientEmeraldCityId,
contact_name_id: contactDorothyId,
status_id: statusUnfoldingId,
board_id: boardProjectsId,
category_id: categoryRealmMaintenanceId,
subcategory_id: subCategoryMagicalInfraId,
priority_id: priorityCuriousId,
severity_id: severityModerateId,
urgency_id: urgencyTickTockId,
impact_id: impactLocalId,
entered_by: userGlindaId,
assigned_to: userScarecrowId,
entered_at: knex.raw("CURRENT_TIMESTAMP - INTERVAL '1 month'")
}
];
// Filter out any tickets where essential IDs might be missing (if lookups failed)
const validTickets = ticketsToInsert.filter(ticket =>
ticket.client_id && ticket.contact_name_id && ticket.status_id &&
ticket.board_id && ticket.category_id && ticket.subcategory_id &&
ticket.priority_id && ticket.severity_id && ticket.urgency_id &&
ticket.impact_id && ticket.entered_by && ticket.assigned_to
);
if (validTickets.length !== ticketsToInsert.length) {
console.warn(`Warning: Some tickets were skipped due to missing foreign key IDs.`);
}
if (validTickets.length > 0) {
// Perform the insert one by one to potentially avoid batch insert issues
console.log(`Attempting to insert ${validTickets.length} tickets individually...`);
for (const ticket of validTickets) {
try {
await knex('tickets').insert(ticket);
} catch (error) {
console.error(`Error inserting ticket ${ticket.ticket_number}:`, error);
console.error('Ticket data:', ticket);
// Decide if you want to stop on error or continue
// throw error; // Uncomment to stop on the first error
}
}
console.log(`Finished attempting ticket insertion.`);
} else {
console.warn('No valid tickets to insert.');
}
};