Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions apps/web-app/server/api/kitchen/revenue/iiko-daily.post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,22 @@ async function parseFileAndUpdateData(file: MultiPartData) {
kitchen.commonTotal = commonTotal
}

// Create or update metrics
const metrics = await repository.network.listMetrics()
const existingMetrics = metrics.find((metric) => metric.date === dateOnly)
if (!existingMetrics) {
await repository.network.createMetrics({
date: dateOnly,
averageCheck: commonAverageCheck,
total: commonTotal,
})
} else {
await repository.network.updateMetrics(existingMetrics.id, {
averageCheck: commonAverageCheck,
total: commonTotal,
})
}

// Every kitchen: find in DB and add amount for this day
const kitchens = await repository.kitchen.list()
let rowsUpdated = 0
Expand Down
25 changes: 19 additions & 6 deletions apps/web-app/server/tasks/kitchen/average-update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,27 @@ export default defineTask({
},
async run() {
try {
const revenuesToUpdate = await repository.kitchen.listRevenuesToUpdate()
for (const revenue of revenuesToUpdate) {
// common
const revenues = await repository.kitchen.listRevenuesToUpdate()
let metrics = await repository.network.listMetrics()

for (const revenue of revenues) {
// If have metric for this date
if (metrics.find((metric) => metric.date === revenue.date)) {
continue
}

const allRevenuesThisPeriod = await repository.kitchen.listRevenuesForDate(revenue.date)
const commonAverageCheck = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.averageCheck, 0) / allRevenuesThisPeriod.length)
await repository.kitchen.updateRevenue(revenue.id, {
commonAverageCheck,
const averageCheck = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.averageCheck, 0) / allRevenuesThisPeriod.length)
const total = Math.round(allRevenuesThisPeriod.reduce((acc, curr) => acc + curr.total, 0) / allRevenuesThisPeriod.length)

await repository.network.createMetrics({
date: revenue.date,
averageCheck,
total,
})

// Update
metrics = await repository.network.listMetrics()
}
} catch (error) {
errorResolver(error)
Expand Down
2 changes: 2 additions & 0 deletions packages/database/src/repository/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { File } from './file'
import { Kitchen } from './kitchen'
import { Media } from './media'
import { Menu } from './menu'
import { Network } from './network'
import { Notification } from './notification'
import { Partner } from './partner'
import { Payment } from './payment'
Expand All @@ -30,6 +31,7 @@ class Repository {
readonly kitchen = Kitchen
readonly media = Media
readonly menu = Menu
readonly network = Network
readonly notification = Notification
readonly partner = Partner
readonly payment = Payment
Expand Down
7 changes: 1 addition & 6 deletions packages/database/src/repository/kitchen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,7 @@ export class Kitchen {
}

static async listRevenuesToUpdate() {
return useDatabase().query.kitchenRevenues.findMany({
where: (revenues, { eq, or }) => or(
eq(revenues.commonAverageCheck, 0),
),
limit: 50,
})
return useDatabase().query.kitchenRevenues.findMany()
}

static async create(data: KitchenDraft) {
Expand Down
41 changes: 41 additions & 0 deletions packages/database/src/repository/network.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import type { NetworkMetricsDraft } from '../types'
import { eq, sql } from 'drizzle-orm'
import { useDatabase } from '../database'
import { networkMetrics } from '../tables'

export class Network {
static async findMetrics(id: string) {
return useDatabase().query.networkMetrics.findFirst({
where: (metrics, { eq }) => eq(metrics.id, id),
})
}

static async listMetrics() {
return useDatabase().query.networkMetrics.findMany({
orderBy: (metrics, { desc }) => desc(metrics.date),
})
}

static async listMetricsForDate(date: string) {
return useDatabase().query.networkMetrics.findMany({
where: (metrics, { and }) => and(
sql`date(${metrics.date}) >= date(${date})`,
sql`date(${metrics.date}) <= date(${date})`,
),
})
}

static async createMetrics(data: NetworkMetricsDraft) {
const [metrics] = await useDatabase().insert(networkMetrics).values(data).returning()
return metrics
}

static async updateMetrics(id: string, data: Partial<NetworkMetricsDraft>) {
const [metrics] = await useDatabase()
.update(networkMetrics)
.set(data)
.where(eq(networkMetrics.id, id))
.returning()
return metrics
}
}
9 changes: 9 additions & 0 deletions packages/database/src/tables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,15 @@ export const clientReviews = pgTable('client_reviews', {
feedbackPointId: cuid2('feedback_point_id').references(() => feedbackPoints.id),
})

export const networkMetrics = pgTable('network_metrics', {
id: cuid2('id').defaultRandom().primaryKey(),
createdAt: timestamp('created_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
updatedAt: timestamp('updated_at', { precision: 3, withTimezone: true, mode: 'string' }).notNull().defaultNow(),
date: date('date', { mode: 'string' }).notNull(),
total: numeric('total', { mode: 'number' }).notNull().default(0),
averageCheck: numeric('average_check', { mode: 'number' }).notNull().default(0),
})

export const userRelations = relations(users, ({ many, one }) => ({
chatMessages: many(chatMessages),
chatMembers: many(chatMembers),
Expand Down
3 changes: 3 additions & 0 deletions packages/database/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,6 @@ export type FeedbackPointDraft = InferInsertModel<typeof tables.feedbackPoints>

export type ClientReview = InferSelectModel<typeof tables.clientReviews>
export type ClientReviewDraft = InferInsertModel<typeof tables.clientReviews>

export type NetworkMetrics = InferSelectModel<typeof tables.networkMetrics>
export type NetworkMetricsDraft = InferInsertModel<typeof tables.networkMetrics>