get('entityManager'); $log = $container->get('log'); // The JSON file lives inside the installed module resources at runtime. $resourceFile = 'custom/Espo/Modules/SmartAssistant/Resources/data/default-prompts.json'; if (!is_file($resourceFile)) { $log->warning("[SmartAssistant] AfterInstall: $resourceFile not found, skipping seed"); return; } $json = file_get_contents($resourceFile); $defaults = json_decode($json, true); if (!is_array($defaults)) { $log->warning("[SmartAssistant] AfterInstall: invalid JSON in $resourceFile"); return; } $created = 0; $skipped = 0; foreach ($defaults as $row) { $key = $row['key'] ?? null; if (!$key) { continue; } $existing = $entityManager->getRDBRepository('AssistantPrompt') ->where(['key' => $key, 'deleted' => false]) ->findOne(); if ($existing) { $skipped++; continue; } $entity = $entityManager->getNewEntity('AssistantPrompt'); $entity->set([ 'key' => $key, 'name' => $row['name'] ?? $key, 'description' => $row['description'] ?? null, 'mode' => $row['mode'] ?? 'both', 'displayOrder' => $row['displayOrder'] ?? 100, 'content' => $row['content'] ?? '', 'isActive' => true, ]); // skipAll bypasses beforeSave hooks that require a logged-in user // service (installer runs without an HTTP session) and ACL checks // (we're seeding firm-wide defaults; no user is implicated). $entityManager->saveEntity($entity, ['skipAll' => true]); $created++; } $log->info("[SmartAssistant] AfterInstall: seeded $created AssistantPrompt rows, $skipped already existed"); } }