Skip to content

Commit 3df8035

Browse files
committed
Merge branches 'mongoose' and 'mongoose' of github.com:austenstone/github-value into mongoose
2 parents e5f1c52 + 8c164df commit 3df8035

File tree

7 files changed

+92
-78
lines changed

7 files changed

+92
-78
lines changed

backend/src/__tests__/services/calendarClockServiceTests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import SurveyService from '../../services/survey.service.js';
33
import SeatService from '../../services/copilot.seats.service.js';
44
import metricsService from '../../services/metrics.service.js';
5-
import TeamsService from '../../services/teams.service.js';
5+
import TeamsService from '../../services/teams.service.js';
66
import { runSurveysForDate } from '../__mock__/survey-gen/runSurveyGenerator.js';
77
import { MockSeatsGenerator } from '../__mock__/seats-gen/mockSeatsGenerator.js';
88
import { MockMetricsGenerator } from '../__mock__/metrics-gen/mockGenerator.js';

backend/src/controllers/survey.controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ class SurveyController {
122122
try {
123123
const Survey = mongoose.model('Survey');
124124
const { id } = req.params;
125-
const updated = await Survey.findByIdAndUpdate(id, req.body);
125+
const updated = await Survey.findOneAndUpdate({
126+
id: Number(id) // Cast `id` to Number
127+
}, req.body);
126128
if (updated) {
127129
res.status(200).json({ _id: id, ...req.body });
128130
} else {

backend/src/database.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -311,25 +311,27 @@ class Database {
311311
usedCopilot: Boolean,
312312
percentTimeSaved: Number,
313313
reason: String,
314-
timeUsedFor: String
314+
timeUsedFor: String,
315+
kudos: Number
315316
}, {
316317
timestamps: true
317318
}));
318319

319320
const TargetsDetailSchema = new mongoose.Schema({
320-
seats: String,
321-
adoptedDevs: String,
322-
monthlyDevsReportingTimeSavings: String,
323-
percentSeatsReportingTimeSavings: String,
324-
percentSeatsAdopted: String,
325-
percentMaxAdopted: String,
326-
dailySuggestions: String,
327-
dailyChatTurns: String,
328-
weeklyPRSummaries: String,
329-
weeklyTimeSaved: String,
330-
monthlyTimeSavings: String,
331-
annualTimeSavingsDollars: String,
332-
productivityBoost: String
321+
seats: Number,
322+
adoptedDevs: Number,
323+
monthlyDevsReportingTimeSavings: Number,
324+
percentSeatsReportingTimeSavings: Number,
325+
percentSeatsAdopted: Number,
326+
percentMaxAdopted: Number,
327+
dailySuggestions: Number,
328+
dailyChatTurns: Number,
329+
weeklyPRSummaries: Number,
330+
weeklyTimeSaved: Number,
331+
monthlyTimeSavings: Number,
332+
annualTimeSavingsDollars: Number,
333+
productivityBoost: Number,
334+
asOfDate: Number
333335
});
334336

335337
const TargetsSchema = new mongoose.Schema({

backend/src/services/metrics.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MetricsService {
2727

2828
const types = type ? type.split(/[ ,]+/) : [];
2929

30-
const metrics = await mongoose.model('Metrics').find(query).lean();
30+
const metrics = await mongoose.model('Metrics').find(query).sort({date:1}).lean();
3131

3232
if (editor || language || model) {
3333
metrics.forEach(metric => {

backend/src/services/target-values.service.ts

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,52 @@ class TargetValuesService {
1010
throw new Error(`Error fetching target values: ${error}`);
1111
}
1212
}
13-
13+
1414
async updateTargetValues(data: {
1515
current: {
16-
seats: string;
17-
adoptedDevs: string;
18-
monthlyDevsReportingTimeSavings: string;
19-
percentSeatsReportingTimeSavings: string;
20-
percentSeatsAdopted: string;
21-
percentMaxAdopted: string;
22-
dailySuggestions: string;
23-
dailyChatTurns: string;
24-
weeklyPRSummaries: string;
25-
weeklyTimeSaved: string;
26-
monthlyTimeSavings: string;
27-
annualTimeSavingsDollars: string;
28-
productivityBoost: string;
16+
seats: number;
17+
adoptedDevs: number;
18+
monthlyDevsReportingTimeSavings: number;
19+
percentSeatsReportingTimeSavings: number;
20+
percentSeatsAdopted: number;
21+
percentMaxAdopted: number;
22+
dailySuggestions: number;
23+
dailyChatTurns: number;
24+
weeklyPRSummaries: number;
25+
weeklyTimeSaved: number;
26+
monthlyTimeSavings: number;
27+
annualTimeSavingsDollars: number;
28+
productivityBoost: number;
2929
};
3030
target: {
31-
seats: string;
32-
adoptedDevs: string;
33-
monthlyDevsReportingTimeSavings: string;
34-
percentSeatsReportingTimeSavings: string;
35-
percentSeatsAdopted: string;
36-
percentMaxAdopted: string;
37-
dailySuggestions: string;
38-
dailyChatTurns: string;
39-
weeklyPRSummaries: string;
40-
weeklyTimeSaved: string;
41-
monthlyTimeSavings: string;
42-
annualTimeSavingsDollars: string;
43-
productivityBoost: string;
31+
seats: number;
32+
adoptedDevs: number;
33+
monthlyDevsReportingTimeSavings: number;
34+
percentSeatsReportingTimeSavings: number;
35+
percentSeatsAdopted: number;
36+
percentMaxAdopted: number;
37+
dailySuggestions: number;
38+
dailyChatTurns: number;
39+
weeklyPRSummaries: number;
40+
weeklyTimeSaved: number;
41+
monthlyTimeSavings: number;
42+
annualTimeSavingsDollars: number;
43+
productivityBoost: number;
4444
};
4545
max: {
46-
seats: string;
47-
adoptedDevs: string;
48-
monthlyDevsReportingTimeSavings: string;
49-
percentSeatsReportingTimeSavings: string;
50-
percentSeatsAdopted: string;
51-
percentMaxAdopted: string;
52-
dailySuggestions: string;
53-
dailyChatTurns: string;
54-
weeklyPRSummaries: string;
55-
weeklyTimeSaved: string;
56-
monthlyTimeSavings: string;
57-
annualTimeSavingsDollars: string;
58-
productivityBoost: string;
46+
seats: number;
47+
adoptedDevs: number;
48+
monthlyDevsReportingTimeSavings: number;
49+
percentSeatsReportingTimeSavings: number;
50+
percentSeatsAdopted: number;
51+
percentMaxAdopted: number;
52+
dailySuggestions: number;
53+
dailyChatTurns: number;
54+
weeklyPRSummaries: number;
55+
weeklyTimeSaved: number;
56+
monthlyTimeSavings: number;
57+
annualTimeSavingsDollars: number;
58+
productivityBoost: number;
5959
};
6060
}) {
6161
try {

frontend/src/app/main/copilot/value-modeling/value-modeling.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,21 +350,21 @@ <h1>Value Modeling and Targeting</h1>
350350
<td>Annual Time Savings as Dollars ($)</td>
351351
<td>
352352
<mat-form-field [formGroupName]="'current'">
353-
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('current.annualTimeSavingsDollars')?.invalid && form.get('current.annualTimeSavingsDollars')?.touched}" [value]="form.get('current.annualTimeSavingsDollars')?.value || '' | matCurrencyPipe" (blur)="onBlur($event, 'current', 'annualTimeSavingsDollars')" [attr.disabled]="disableInputs ? true : null">
353+
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('current.annualTimeSavingsDollars')?.invalid && form.get('current.annualTimeSavingsDollars')?.touched}" [value]="form.get('current.annualTimeSavingsDollars')?.value " (blur)="onBlur($event, 'current', 'annualTimeSavingsDollars')" [attr.disabled]="disableInputs ? true : null">
354354
<span matTextPrefix>$&nbsp;</span>
355355
<mat-error *ngIf="form.get('current.annualTimeSavingsDollars')?.invalid">Invalid value</mat-error>
356356
</mat-form-field>
357357
</td>
358358
<td>
359359
<mat-form-field [formGroupName]="'target'">
360-
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('target.annualTimeSavingsDollars')?.invalid && form.get('target.annualTimeSavingsDollars')?.touched}" [value]="form.get('target.annualTimeSavingsDollars')?.value || '' | matCurrencyPipe" (blur)="onBlur($event, 'target', 'annualTimeSavingsDollars')">
360+
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('target.annualTimeSavingsDollars')?.invalid && form.get('target.annualTimeSavingsDollars')?.touched}" [value]="form.get('target.annualTimeSavingsDollars')?.value " (blur)="onBlur($event, 'target', 'annualTimeSavingsDollars')">
361361
<span matTextPrefix>$&nbsp;</span>
362362
<mat-error *ngIf="form.get('target.annualTimeSavingsDollars')?.invalid">Invalid value</mat-error>
363363
</mat-form-field>
364364
</td>
365365
<td>
366366
<mat-form-field [formGroupName]="'max'">
367-
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('max.annualTimeSavingsDollars')?.invalid && form.get('max.annualTimeSavingsDollars')?.touched}" [value]="form.get('max.annualTimeSavingsDollars')?.value || '' | matCurrencyPipe" (blur)="onBlur($event, 'max', 'annualTimeSavingsDollars')" [attr.disabled]="disableInputs ? true : null">
367+
<input matInput type="text" formControlName="annualTimeSavingsDollars" class="example-right-align" [ngClass]="{'invalid': form.get('max.annualTimeSavingsDollars')?.invalid && form.get('max.annualTimeSavingsDollars')?.touched}" [value]="form.get('max.annualTimeSavingsDollars')?.value " (blur)="onBlur($event, 'max', 'annualTimeSavingsDollars')" [attr.disabled]="disableInputs ? true : null">
368368
<span matTextPrefix>$&nbsp;</span>
369369
<mat-error *ngIf="form.get('max.annualTimeSavingsDollars')?.invalid">Invalid value</mat-error>
370370
</mat-form-field>

frontend/src/app/main/copilot/value-modeling/value-modeling.component.ts

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,11 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
230230
// const currentAsStrings = this.convertMetricStateToString(this.gridObject.current);
231231
//console.log('AsOfDate as string:', currentAsStrings.asOfDate);
232232

233-
this.loadGridObject();
233+
// Add a 2-second timer and call a method
234+
setTimeout(() => {
235+
this.loadGridObject();
236+
}, 1000);
237+
234238
console.log('0. Update Current gridObject:', this.gridObject);
235239
} catch (error) {
236240
console.error('Error during initialization:', error);
@@ -249,14 +253,16 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
249253
// Step 2: Perform calculations on the updated gridObject
250254
this.modelCalc();
251255

256+
await this.queryCurrentAndMaxValues();
257+
252258
// Step 3: Synchronize the form with gridObject
253259
this.updateFormFromGridObject();
254260

255261
// Step 4: refresh the chart
256262
Highcharts.charts.forEach(chart => {
257263
chart?.update({});
258264
}
259-
265+
260266
);
261267
console.log('execGridLifecycle: Lifecycle completed successfully');
262268
}
@@ -293,10 +299,11 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
293299

294300
loadGridObject() {
295301
// Stub: Load the gridObject from a data source
296-
console.log('loadGridObject: Loading saved gridObject', this.gridObjectSaved);
302+
297303
this.targetService.getTargets().subscribe((targetGrid) => {
298304
if (targetGrid) {
299305
this.gridObject = targetGrid;
306+
console.log('Loaded gridObject:', this.gridObject);
300307
}
301308
this.execGridLifecycle();
302309
});
@@ -342,13 +349,16 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
342349
try {
343350
for (const key in metricState) {
344351
if (metricState.hasOwnProperty(key) && key !== '_id') {
345-
if (key === 'asOfDate') {
352+
if (key === 'asOfDate') {
346353
result[key] = metricState.asOfDate ? new Date(metricState.asOfDate).toDateString() : '';
347-
} else if (key === 'productivityBoost') {
354+
} else if (key === 'productivityBoost') {
348355
result[key] = this.decimalPipe.transform(metricState[key as keyof TargetsDetailType], '1.0-2') || '0.00';
349-
} else {
356+
} else if (key === 'annualTimeSavingsDollars') {
357+
console.log(' Raw Value >',metricState[key as keyof TargetsDetailType]);
358+
result[key] = this.decimalPipe.transform(metricState[key as keyof TargetsDetailType], '1.0-0') || '0';
359+
} else {
350360
result[key] = this.decimalPipe.transform(metricState[key as keyof TargetsDetailType], '1.0-0') || '0';
351-
}
361+
}
352362
}
353363
}
354364
} catch (error) {
@@ -428,22 +438,22 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
428438
}
429439

430440
private calculateAnnualTimeSavingsDollars(weeklyTimeSaved: number, adoptedDevs: number): number {
431-
const weeksInYear = 50;
432-
const hourlyRate = this.devCostPerYear / (this.hoursPerYear || 1);
441+
const weeksInYear = 50;
442+
const hourlyRate = this.devCostPerYear / (this.hoursPerYear || 1);
433443
return weeklyTimeSaved * weeksInYear * hourlyRate * adoptedDevs;
434444
}
435445

436446
private calculateProductivityBoost(weeklyTimeSaved: number, adoptedDevs: number, maxDevs: number): number {
437-
console.log('weeklyTimeSaved:', weeklyTimeSaved);
438-
console.log('adoptedDevs:', adoptedDevs);
439-
console.log('maxDevs:', maxDevs);
440-
console.log('this.hoursPerYear:', this.hoursPerYear);
441-
return weeklyTimeSaved * adoptedDevs * 50 / (this.hoursPerYear * maxDevs ) || 1;
442-
}
447+
console.log('weeklyTimeSaved:', weeklyTimeSaved);
448+
console.log('adoptedDevs:', adoptedDevs);
449+
console.log('maxDevs:', maxDevs);
450+
console.log('this.hoursPerYear:', this.hoursPerYear);
451+
return weeklyTimeSaved * adoptedDevs * 50 / (this.hoursPerYear * maxDevs) || 1;
452+
}
443453

444454
private calculateMonthlyTimeSavings(adoptedDevs: number, weeklyTimeSaved: number): number {
445455
const weeksInMonth = 4;
446-
return weeklyTimeSaved * weeksInMonth * adoptedDevs ;
456+
return weeklyTimeSaved * weeksInMonth * adoptedDevs;
447457
}
448458

449459
toggleInputs(disable: boolean) {
@@ -457,7 +467,7 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
457467

458468

459469
async queryCurrentAndMaxValues(): Promise<void> {
460-
470+
461471
const now = new Date();
462472
const utcNow = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0, 0);
463473
const xDaysAgoUTC = new Date(utcNow - this.clickCounter * 24 * 60 * 60 * 1000);
@@ -569,7 +579,7 @@ export class ValueModelingComponent implements OnInit, AfterViewInit {
569579

570580
if (weekAtaTimeSurveys?.length) {
571581
weekAtaTimeSurveys.forEach(survey => {
572-
console.log('Survey data:', survey);
582+
//console.log('Survey pcts:', survey.percentTimeSaved);
573583
});
574584
const avgWeeklyTimeSaved = weekAtaTimeSurveys.reduce((acc, survey) =>
575585
acc + (survey.percentTimeSaved || 0), 0) * 12 * 0.01 / (weekAtaTimeSurveys.length * distinctUsers.length);

0 commit comments

Comments
 (0)