101 lines
3.1 KiB
TypeScript
101 lines
3.1 KiB
TypeScript
|
|
/**
|
||
|
|
* Test script for syncing time entries from Autotask
|
||
|
|
* Run with: npx tsx dev/test-time-entries-sync.ts
|
||
|
|
*/
|
||
|
|
|
||
|
|
import dotenv from 'dotenv';
|
||
|
|
import path from 'path';
|
||
|
|
import { AutotaskClient } from '@/lib/services/autotask-client';
|
||
|
|
import { EntitySyncService } from '@/lib/services/entity-sync';
|
||
|
|
import { EntityType } from '@/lib/types/sync';
|
||
|
|
|
||
|
|
// Load environment variables
|
||
|
|
dotenv.config({ path: path.resolve(__dirname, '../.env.local') });
|
||
|
|
|
||
|
|
async function testTimeEntriesSync() {
|
||
|
|
console.log('🔍 Testing Time Entries Sync\n');
|
||
|
|
|
||
|
|
// Validate environment variables
|
||
|
|
const requiredEnvVars = [
|
||
|
|
'AUTOTASK_API_URL',
|
||
|
|
'AUTOTASK_USERNAME',
|
||
|
|
'AUTOTASK_SECRET',
|
||
|
|
'AUTOTASK_API_INTEGRATION_CODE',
|
||
|
|
];
|
||
|
|
|
||
|
|
const missingVars = requiredEnvVars.filter(v => !process.env[v]);
|
||
|
|
if (missingVars.length > 0) {
|
||
|
|
console.error('❌ Missing required environment variables:', missingVars.join(', '));
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Initialize Autotask client
|
||
|
|
console.log('Initializing Autotask client...');
|
||
|
|
const autotaskClient = new AutotaskClient({
|
||
|
|
apiUrl: process.env.AUTOTASK_API_URL!,
|
||
|
|
username: process.env.AUTOTASK_USERNAME!,
|
||
|
|
password: process.env.AUTOTASK_SECRET!,
|
||
|
|
apiIntegrationCode: process.env.AUTOTASK_API_INTEGRATION_CODE!,
|
||
|
|
});
|
||
|
|
console.log('✅ Autotask client initialized\n');
|
||
|
|
|
||
|
|
// Initialize entity sync service
|
||
|
|
console.log('Initializing entity sync service...');
|
||
|
|
const syncService = new EntitySyncService(autotaskClient);
|
||
|
|
console.log('✅ Entity sync service initialized\n');
|
||
|
|
|
||
|
|
// Test sync with a small date range (last 7 days)
|
||
|
|
console.log('Starting time entries sync (last 7 days)...');
|
||
|
|
console.log('This will sync time entries from the last 7 days only.\n');
|
||
|
|
|
||
|
|
const startTime = Date.now();
|
||
|
|
|
||
|
|
try {
|
||
|
|
const result = await syncService.syncEntity(
|
||
|
|
EntityType.TIME_ENTRIES,
|
||
|
|
false, // Full sync (not incremental)
|
||
|
|
0.019 // 7 days in years
|
||
|
|
);
|
||
|
|
|
||
|
|
const duration = Date.now() - startTime;
|
||
|
|
|
||
|
|
console.log('\n✅ Sync completed successfully!');
|
||
|
|
console.log(`Duration: ${(duration / 1000).toFixed(2)}s`);
|
||
|
|
console.log('\nResults:');
|
||
|
|
console.log(` Records added: ${result.recordsAdded}`);
|
||
|
|
console.log(` Records updated: ${result.recordsUpdated}`);
|
||
|
|
console.log(` Records deleted: ${result.recordsDeleted}`);
|
||
|
|
console.log(` Total processed: ${result.recordsAdded + result.recordsUpdated}`);
|
||
|
|
|
||
|
|
} catch (syncError) {
|
||
|
|
console.error('\n❌ Sync failed with error:');
|
||
|
|
console.error(syncError);
|
||
|
|
|
||
|
|
// Try to provide more details
|
||
|
|
if (syncError instanceof Error) {
|
||
|
|
console.error('\nError details:');
|
||
|
|
console.error(' Message:', syncError.message);
|
||
|
|
console.error(' Stack:', syncError.stack);
|
||
|
|
}
|
||
|
|
|
||
|
|
throw syncError;
|
||
|
|
}
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.error('\n❌ Test failed:', error);
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Run the test
|
||
|
|
testTimeEntriesSync()
|
||
|
|
.then(() => {
|
||
|
|
console.log('\n✅ Test completed successfully');
|
||
|
|
process.exit(0);
|
||
|
|
})
|
||
|
|
.catch((error) => {
|
||
|
|
console.error('\n❌ Test failed:', error);
|
||
|
|
process.exit(1);
|
||
|
|
});
|