Skip to content

Commit 8bbc39a

Browse files
authored
feat: update revenues task (#21)
* feat: update revenues task * fix: utc
1 parent 9db2919 commit 8bbc39a

4 files changed

Lines changed: 77 additions & 0 deletions

File tree

apps/web-app/nuxt.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export default defineNuxtConfig({
3838
},
3939
scheduledTasks: {
4040
'* * * * *': ['task:auto-create'], // Every minute
41+
'0 * * * *': ['kitchen:revenue-update'], // Every hour
4142
'0 0 * * *': ['kitchen:rating-update'], // Every day
4243
},
4344
},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { repository } from '@roll-stack/database'
2+
3+
export default defineEventHandler(async (event) => {
4+
const kitchenId = getRouterParam(event, 'kitchenId')
5+
if (!kitchenId) {
6+
throw createError({
7+
statusCode: 400,
8+
message: 'Id is required',
9+
})
10+
}
11+
12+
const query = getQuery(event)
13+
const start = query.start ? new Date(query.start.toString()) : null
14+
const end = query.end ? new Date(query.end.toString()) : null
15+
if (!start || !end || Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {
16+
throw createError({
17+
statusCode: 400,
18+
message: 'Valid start and end dates are required',
19+
})
20+
}
21+
22+
return repository.kitchen.listRevenuesByKitchenForPeriod(kitchenId, start, end)
23+
})
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { repository } from '@roll-stack/database'
2+
import { endOfWeek, startOfWeek } from 'date-fns'
3+
4+
const logger = useLogger('kitchen:revenue-update')
5+
6+
export default defineTask({
7+
meta: {
8+
name: 'kitchen:revenue-update',
9+
description: 'Update weekly revenue of kitchens',
10+
},
11+
async run() {
12+
try {
13+
const kitchens = await repository.kitchen.list()
14+
15+
// From this monday to sunday (use UTC+0 time zone)
16+
const now = new Date()
17+
const utcNow = new Date(now.getTime() + now.getTimezoneOffset() * 60000)
18+
19+
const thisMonday = startOfWeek(utcNow, { weekStartsOn: 1 })
20+
const thisSunday = endOfWeek(utcNow, { weekStartsOn: 1 })
21+
22+
logger.log(thisMonday, thisSunday)
23+
24+
for (const kitchen of kitchens) {
25+
const revenues = await repository.kitchen.listRevenuesByKitchenForPeriod(kitchen.id, thisMonday, thisSunday)
26+
27+
const revenueForThisWeek = revenues.reduce((acc, curr) => acc + curr.total, 0)
28+
29+
await repository.kitchen.update(kitchen.id, {
30+
revenueForThisWeek,
31+
})
32+
33+
// logger.log(`Kitchen ${kitchen.id}: Revenue updated from ${kitchen.revenueForThisWeek} to ${revenueForThisWeek}`)
34+
}
35+
} catch (error) {
36+
errorResolver(error)
37+
}
38+
39+
return { result: true }
40+
},
41+
})

packages/database/src/repository/kitchen.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ export class Kitchen {
4242
})
4343
}
4444

45+
static async listRevenuesByKitchenForPeriod(kitchenId: string, start: Date, end: Date) {
46+
return useDatabase().query.kitchenRevenues.findMany({
47+
where: (revenues, { eq, and }) => and(
48+
eq(revenues.kitchenId, kitchenId),
49+
sql`date(${revenues.date}) >= date(${start})`,
50+
sql`date(${revenues.date}) <= date(${end})`,
51+
),
52+
orderBy: (revenues, { desc }) => desc(revenues.date),
53+
limit: 1000,
54+
})
55+
}
56+
4557
static async create(data: KitchenDraft) {
4658
const [kitchen] = await useDatabase().insert(kitchens).values(data).returning()
4759
return kitchen

0 commit comments

Comments
 (0)