Skip to content

Commit

Permalink
Merge pull request #8318 from ever-co/fix/#8311-prevent-negative-values
Browse files Browse the repository at this point in the history
[Fix] #8311 Prevent Negative Values in Timer and Display Accurate Worked Time
  • Loading branch information
rahul-rocket authored Oct 2, 2024
2 parents e184c9e + 97c83ac commit 4fd1585
Show file tree
Hide file tree
Showing 5 changed files with 471 additions and 257 deletions.
13 changes: 13 additions & 0 deletions packages/contracts/src/timesheet-statistics.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,19 @@ export interface ICountsStatistics {
todayDuration: number;
}

/**
* Weekly Statistics Activities
*/
export interface IWeeklyStatisticsActivities {
overall: number;
duration: number;
}

/**
* Today Statistics Activities
*/
export interface ITodayStatisticsActivities extends IWeeklyStatisticsActivities {}

export interface ISelectedDateRange {
startDate: Date;
endDate: Date;
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/core/context/request-context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { isNotEmpty } from '@gauzy/common';
import { SerializedRequestContext } from './types';

export class RequestContext {
private static logging: boolean = true;
private static logging: boolean = false;
protected readonly _id: string;
protected readonly _res: Response;
private readonly _req: Request;
Expand Down
79 changes: 70 additions & 9 deletions packages/core/src/time-tracking/statistic/statistic.helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,43 @@ export const getDurationQueryString = (dbType: string, logQueryAlias: string, sl
switch (dbType) {
case DatabaseTypeEnum.sqlite:
case DatabaseTypeEnum.betterSqlite3:
return `COALESCE(ROUND(SUM((julianday(COALESCE("${logQueryAlias}"."stoppedAt", datetime('now'))) - julianday("${logQueryAlias}"."startedAt")) * 86400) / COUNT("${slotQueryAlias}"."id")), 0)`;
return `COALESCE(
ROUND(
SUM(
CASE
WHEN (julianday(COALESCE("${logQueryAlias}"."stoppedAt", datetime('now'))) -
julianday("${logQueryAlias}"."startedAt")) * 86400 >= 0
THEN (julianday(COALESCE("${logQueryAlias}"."stoppedAt", datetime('now'))) -
julianday("${logQueryAlias}"."startedAt")) * 86400
ELSE 0
END
) / COUNT("${slotQueryAlias}"."id")
), 0
)`;
case DatabaseTypeEnum.postgres:
return `COALESCE(ROUND(SUM(extract(epoch from (COALESCE("${logQueryAlias}"."stoppedAt", NOW()) - "${logQueryAlias}"."startedAt"))) / COUNT("${slotQueryAlias}"."id")), 0)`;
return `COALESCE(
ROUND(
SUM(
CASE
WHEN extract(epoch from (COALESCE("${logQueryAlias}"."stoppedAt", NOW()) - "${logQueryAlias}"."startedAt")) >= 0
THEN extract(epoch from (COALESCE("${logQueryAlias}"."stoppedAt", NOW()) - "${logQueryAlias}"."startedAt"))
ELSE 0
END
) / COUNT("${slotQueryAlias}"."id")
), 0
)`;
case DatabaseTypeEnum.mysql:
// Directly return the SQL string for MySQL, as MikroORM allows raw SQL.
return p(
`COALESCE(ROUND(SUM(TIMESTAMPDIFF(SECOND, \`${logQueryAlias}\`.\`startedAt\`, COALESCE(\`${logQueryAlias}\`.\`stoppedAt\`, NOW()))) / COUNT(\`${slotQueryAlias}\`.\`id\`)), 0)`
);
return p(`COALESCE(
ROUND(
SUM(
CASE
WHEN TIMESTAMPDIFF(SECOND, \`${logQueryAlias}\`.\`startedAt\`, COALESCE(\`${logQueryAlias}\`.\`stoppedAt\`, NOW())) >= 0
THEN TIMESTAMPDIFF(SECOND, \`${logQueryAlias}\`.\`startedAt\`, COALESCE(\`${logQueryAlias}\`.\`stoppedAt\`, NOW()))
ELSE 0
END
) / COUNT(\`${slotQueryAlias}\`.\`id\`)
), 0
)`);
default:
throw new Error(`Unsupported database type: ${dbType}`);
}
Expand All @@ -63,11 +92,43 @@ export const getTotalDurationQueryString = (dbType: string, queryAlias: string):
switch (dbType) {
case DatabaseTypeEnum.sqlite:
case DatabaseTypeEnum.betterSqlite3:
return `COALESCE(ROUND(SUM((julianday(COALESCE("${queryAlias}"."stoppedAt", datetime('now'))) - julianday("${queryAlias}"."startedAt")) * 86400)), 0)`;
return `COALESCE(
ROUND(
SUM(
CASE
WHEN (julianday(COALESCE("${queryAlias}"."stoppedAt", datetime('now'))) -
julianday("${queryAlias}"."startedAt")) * 86400 >= 0
THEN (julianday(COALESCE("${queryAlias}"."stoppedAt", datetime('now'))) -
julianday("${queryAlias}"."startedAt")) * 86400
ELSE 0
END
)
), 0
)`;
case DatabaseTypeEnum.postgres:
return `COALESCE(ROUND(SUM(extract(epoch from (COALESCE("${queryAlias}"."stoppedAt", NOW()) - "${queryAlias}"."startedAt")))), 0)`;
return `COALESCE(
ROUND(
SUM(
CASE
WHEN extract(epoch from (COALESCE("${queryAlias}"."stoppedAt", NOW()) - "${queryAlias}"."startedAt")) >= 0
THEN extract(epoch from (COALESCE("${queryAlias}"."stoppedAt", NOW()) - "${queryAlias}"."startedAt"))
ELSE 0
END
)
), 0
)`;
case DatabaseTypeEnum.mysql:
return `COALESCE(ROUND(SUM(TIMESTAMPDIFF(SECOND, \`${queryAlias}\`.\`startedAt\`, COALESCE(\`${queryAlias}\`.\`stoppedAt\`, NOW())))), 0)`;
return p(`COALESCE(
ROUND(
SUM(
CASE
WHEN TIMESTAMPDIFF(SECOND, \`${queryAlias}\`.\`startedAt\`, COALESCE(\`${queryAlias}\`.\`stoppedAt\`, NOW())) >= 0
THEN TIMESTAMPDIFF(SECOND, \`${queryAlias}\`.\`startedAt\`, COALESCE(\`${queryAlias}\`.\`stoppedAt\`, NOW()))
ELSE 0
END
)
), 0
)`);
default:
throw Error(`Unsupported database type: ${dbType}`);
}
Expand Down
Loading

0 comments on commit 4fd1585

Please sign in to comment.